| ... | @@ -668,17 +668,7 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe | ... | @@ -668,17 +668,7 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe |
| 668 | return transCreateNodeIdentifier(c, builtin_name); | 668 | return transCreateNodeIdentifier(c, builtin_name); |
| 669 | } | 669 | } |
| 670 | | 670 | |
| 671 | fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node { | 671 | fn checkForBuiltinTypedef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, checked_name: []const u8) !?*ast.Node { |
| 672 | if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv| | | |
| 673 | return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice | | |
| 674 | const rp = makeRestorePoint(c); | | |
| 675 | | | |
| 676 | const typedef_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, typedef_decl))); | | |
| 677 | | | |
| 678 | // TODO https://github.com/ziglang/zig/issues/3756 | | |
| 679 | // TODO https://github.com/ziglang/zig/issues/1802 | | |
| 680 | const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name; | | |
| 681 | | | |
| 682 | if (mem.eql(u8, checked_name, "uint8_t")) | 672 | if (mem.eql(u8, checked_name, "uint8_t")) |
| 683 | return transTypeDefAsBuiltin(c, typedef_decl, "u8") | 673 | return transTypeDefAsBuiltin(c, typedef_decl, "u8") |
| 684 | else if (mem.eql(u8, checked_name, "int8_t")) | 674 | else if (mem.eql(u8, checked_name, "int8_t")) |
| ... | @@ -704,28 +694,49 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l | ... | @@ -704,28 +694,49 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l |
| 704 | else if (mem.eql(u8, checked_name, "size_t")) | 694 | else if (mem.eql(u8, checked_name, "size_t")) |
| 705 | return transTypeDefAsBuiltin(c, typedef_decl, "usize"); | 695 | return transTypeDefAsBuiltin(c, typedef_decl, "usize"); |
| 706 | | 696 | |
| | 697 | return null; |
| | 698 | } |
| | 699 | |
| | 700 | fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node { |
| | 701 | if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv| |
| | 702 | return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice |
| | 703 | const rp = makeRestorePoint(c); |
| | 704 | |
| | 705 | const typedef_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, typedef_decl))); |
| | 706 | |
| | 707 | // TODO https://github.com/ziglang/zig/issues/3756 |
| | 708 | // TODO https://github.com/ziglang/zig/issues/1802 |
| | 709 | const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name; |
| | 710 | if (try checkForBuiltinTypedef(c, typedef_decl, checked_name)) |node| { |
| | 711 | return node; |
| | 712 | } |
| | 713 | |
| 707 | if (!top_level_visit) { | 714 | if (!top_level_visit) { |
| 708 | return transCreateNodeIdentifier(c, checked_name); | 715 | return transCreateNodeIdentifier(c, checked_name); |
| 709 | } | 716 | } |
| 710 | | 717 | |
| 711 | _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name); | 718 | _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name); |
| 712 | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); | 719 | const node = (try transZigTypedef(rp, typedef_decl, true, checked_name)) orelse return null; |
| 713 | const const_tok = try appendToken(c, .Keyword_const, "const"); | 720 | try addTopLevelDecl(c, checked_name, &node.base); |
| 714 | const node = try transCreateNodeVarDecl(c, true, true, checked_name); | 721 | return transCreateNodeIdentifier(c, checked_name); |
| 715 | node.eq_token = try appendToken(c, .Equal, "="); | 722 | } |
| | 723 | |
| | 724 | fn transZigTypedef(rp: RestorePoint, typedef_decl: *const ZigClangTypedefNameDecl, toplevel: bool, checked_name: []const u8) Error!?*ast.Node.VarDecl { |
| | 725 | const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name); |
| | 726 | node.eq_token = try appendToken(rp.c, .Equal, "="); |
| 716 | | 727 | |
| 717 | const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); | 728 | const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); |
| 718 | const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl); | 729 | const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl); |
| 719 | node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) { | 730 | node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) { |
| 720 | error.UnsupportedType => { | 731 | error.UnsupportedType => { |
| 721 | try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{}); | 732 | try failDecl(rp.c, typedef_loc, checked_name, "unable to resolve typedef child type", .{}); |
| 722 | return null; | 733 | return null; |
| 723 | }, | 734 | }, |
| 724 | error.OutOfMemory => |e| return e, | 735 | error.OutOfMemory => |e| return e, |
| 725 | }; | 736 | }; |
| 726 | node.semicolon_token = try appendToken(c, .Semicolon, ";"); | 737 | |
| 727 | try addTopLevelDecl(c, checked_name, &node.base); | 738 | node.semicolon_token = try appendToken(rp.c, .Semicolon, ";"); |
| 728 | return transCreateNodeIdentifier(c, checked_name); | 739 | return node; |
| 729 | } | 740 | } |
| 730 | | 741 | |
| 731 | fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node { | 742 | fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node { |
| ... | @@ -1395,21 +1406,18 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) | ... | @@ -1395,21 +1406,18 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) |
| 1395 | try block_scope.block_node.statements.push(&node.base); | 1406 | try block_scope.block_node.statements.push(&node.base); |
| 1396 | }, | 1407 | }, |
| 1397 | .Typedef => { | 1408 | .Typedef => { |
| 1398 | const type_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]); | 1409 | const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]); |
| 1399 | const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( | 1410 | const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( |
| 1400 | @ptrCast(*const ZigClangNamedDecl, type_decl), | 1411 | @ptrCast(*const ZigClangNamedDecl, typedef_decl), |
| 1401 | )); | 1412 | )); |
| 1402 | | 1413 | |
| 1403 | const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(type_decl); | | |
| 1404 | const underlying_type = ZigClangQualType_getTypePtr(underlying_qual); | | |
| 1405 | | | |
| 1406 | const mangled_name = try block_scope.makeMangledName(c, name); | 1414 | const mangled_name = try block_scope.makeMangledName(c, name); |
| 1407 | const node = try transCreateNodeVarDecl(c, false, true, mangled_name); | 1415 | if (try checkForBuiltinTypedef(c, typedef_decl, mangled_name)) |ast_node| { |
| 1408 | node.eq_token = try appendToken(c, .Equal, "="); | 1416 | return ast_node; |
| | 1417 | } |
| 1409 | | 1418 | |
| 1410 | const loc = ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)); | 1419 | const node = (try transZigTypedef(rp, typedef_decl, false, mangled_name)) |
| 1411 | node.init_node = try transType(rp, underlying_type, loc); | 1420 | orelse return error.UnsupportedTranslation; |
| 1412 | node.semicolon_token = try appendToken(c, .Semicolon, ";"); | | |
| 1413 | try block_scope.block_node.statements.push(&node.base); | 1421 | try block_scope.block_node.statements.push(&node.base); |
| 1414 | }, | 1422 | }, |
| 1415 | else => |kind| return revertAndWarn( | 1423 | else => |kind| return revertAndWarn( |