| ... | ... | @@ -668,6 +668,31 @@ fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDe |
| 668 | 668 | return transCreateNodeIdentifier(c, builtin_name); |
| 669 | 669 | } |
| 670 | 670 | |
| 671 | fn checkForBuiltinTypedef(checked_name: []const u8) !?[]const u8 { |
| 672 | const table = [_][2][]const u8{ |
| 673 | .{ "uint8_t", "u8" }, |
| 674 | .{ "int8_t", "i8" }, |
| 675 | .{ "uint16_t", "u16" }, |
| 676 | .{ "int16_t", "i16" }, |
| 677 | .{ "uint32_t", "u32" }, |
| 678 | .{ "int32_t", "i32" }, |
| 679 | .{ "uint64_t", "u64" }, |
| 680 | .{ "int64_t", "i64" }, |
| 681 | .{ "intptr_t", "isize" }, |
| 682 | .{ "uintptr_t", "usize" }, |
| 683 | .{ "ssize_t", "isize" }, |
| 684 | .{ "size_t", "usize" }, |
| 685 | }; |
| 686 | |
| 687 | for (table) |entry| { |
| 688 | if (mem.eql(u8, checked_name, entry[0])) { |
| 689 | return entry[1]; |
| 690 | } |
| 691 | } |
| 692 | |
| 693 | return null; |
| 694 | } |
| 695 | |
| 671 | 696 | fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_level_visit: bool) Error!?*ast.Node { |
| 672 | 697 | if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv| |
| 673 | 698 | return transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice |
| ... | ... | @@ -678,54 +703,36 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l |
| 678 | 703 | // TODO https://github.com/ziglang/zig/issues/3756 |
| 679 | 704 | // TODO https://github.com/ziglang/zig/issues/1802 |
| 680 | 705 | 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")) |
| 683 | | return transTypeDefAsBuiltin(c, typedef_decl, "u8") |
| 684 | | else if (mem.eql(u8, checked_name, "int8_t")) |
| 685 | | return transTypeDefAsBuiltin(c, typedef_decl, "i8") |
| 686 | | else if (mem.eql(u8, checked_name, "uint16_t")) |
| 687 | | return transTypeDefAsBuiltin(c, typedef_decl, "u16") |
| 688 | | else if (mem.eql(u8, checked_name, "int16_t")) |
| 689 | | return transTypeDefAsBuiltin(c, typedef_decl, "i16") |
| 690 | | else if (mem.eql(u8, checked_name, "uint32_t")) |
| 691 | | return transTypeDefAsBuiltin(c, typedef_decl, "u32") |
| 692 | | else if (mem.eql(u8, checked_name, "int32_t")) |
| 693 | | return transTypeDefAsBuiltin(c, typedef_decl, "i32") |
| 694 | | else if (mem.eql(u8, checked_name, "uint64_t")) |
| 695 | | return transTypeDefAsBuiltin(c, typedef_decl, "u64") |
| 696 | | else if (mem.eql(u8, checked_name, "int64_t")) |
| 697 | | return transTypeDefAsBuiltin(c, typedef_decl, "i64") |
| 698 | | else if (mem.eql(u8, checked_name, "intptr_t")) |
| 699 | | return transTypeDefAsBuiltin(c, typedef_decl, "isize") |
| 700 | | else if (mem.eql(u8, checked_name, "uintptr_t")) |
| 701 | | return transTypeDefAsBuiltin(c, typedef_decl, "usize") |
| 702 | | else if (mem.eql(u8, checked_name, "ssize_t")) |
| 703 | | return transTypeDefAsBuiltin(c, typedef_decl, "isize") |
| 704 | | else if (mem.eql(u8, checked_name, "size_t")) |
| 705 | | return transTypeDefAsBuiltin(c, typedef_decl, "usize"); |
| 706 | if (try checkForBuiltinTypedef(checked_name)) |builtin| { |
| 707 | return transTypeDefAsBuiltin(c, typedef_decl, builtin); |
| 708 | } |
| 706 | 709 | |
| 707 | 710 | if (!top_level_visit) { |
| 708 | 711 | return transCreateNodeIdentifier(c, checked_name); |
| 709 | 712 | } |
| 710 | 713 | |
| 711 | 714 | _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), checked_name); |
| 712 | | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); |
| 713 | | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 714 | | const node = try transCreateNodeVarDecl(c, true, true, checked_name); |
| 715 | | node.eq_token = try appendToken(c, .Equal, "="); |
| 715 | const node = (try transCreateNodeTypedef(rp, typedef_decl, true, checked_name)) orelse return null; |
| 716 | try addTopLevelDecl(c, checked_name, &node.base); |
| 717 | return transCreateNodeIdentifier(c, checked_name); |
| 718 | } |
| 719 | |
| 720 | fn transCreateNodeTypedef(rp: RestorePoint, typedef_decl: *const ZigClangTypedefNameDecl, toplevel: bool, checked_name: []const u8) Error!?*ast.Node.VarDecl { |
| 721 | const node = try transCreateNodeVarDecl(rp.c, toplevel, true, checked_name); |
| 722 | node.eq_token = try appendToken(rp.c, .Equal, "="); |
| 716 | 723 | |
| 717 | 724 | const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); |
| 718 | 725 | const typedef_loc = ZigClangTypedefNameDecl_getLocation(typedef_decl); |
| 719 | 726 | node.init_node = transQualType(rp, child_qt, typedef_loc) catch |err| switch (err) { |
| 720 | 727 | error.UnsupportedType => { |
| 721 | | try failDecl(c, typedef_loc, checked_name, "unable to resolve typedef child type", .{}); |
| 728 | try failDecl(rp.c, typedef_loc, checked_name, "unable to resolve typedef child type", .{}); |
| 722 | 729 | return null; |
| 723 | 730 | }, |
| 724 | 731 | error.OutOfMemory => |e| return e, |
| 725 | 732 | }; |
| 726 | | node.semicolon_token = try appendToken(c, .Semicolon, ";"); |
| 727 | | try addTopLevelDecl(c, checked_name, &node.base); |
| 728 | | return transCreateNodeIdentifier(c, checked_name); |
| 733 | |
| 734 | node.semicolon_token = try appendToken(rp.c, .Semicolon, ";"); |
| 735 | return node; |
| 729 | 736 | } |
| 730 | 737 | |
| 731 | 738 | fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*ast.Node { |
| ... | ... | @@ -1394,6 +1401,26 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) |
| 1394 | 1401 | node.semicolon_token = try appendToken(c, .Semicolon, ";"); |
| 1395 | 1402 | try block_scope.block_node.statements.push(&node.base); |
| 1396 | 1403 | }, |
| 1404 | .Typedef => { |
| 1405 | const typedef_decl = @ptrCast(*const ZigClangTypedefNameDecl, it[0]); |
| 1406 | const name = try c.str(ZigClangNamedDecl_getName_bytes_begin( |
| 1407 | @ptrCast(*const ZigClangNamedDecl, typedef_decl), |
| 1408 | )); |
| 1409 | |
| 1410 | const underlying_qual = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); |
| 1411 | const underlying_type = ZigClangQualType_getTypePtr(underlying_qual); |
| 1412 | |
| 1413 | const mangled_name = try block_scope.makeMangledName(c, name); |
| 1414 | if (try checkForBuiltinTypedef(name)) |builtin| { |
| 1415 | try block_scope.variables.push(.{ |
| 1416 | .alias = builtin, |
| 1417 | .name = mangled_name, |
| 1418 | }); |
| 1419 | } else { |
| 1420 | const node = (try transCreateNodeTypedef(rp, typedef_decl, false, mangled_name)) orelse return error.UnsupportedTranslation; |
| 1421 | try block_scope.block_node.statements.push(&node.base); |
| 1422 | } |
| 1423 | }, |
| 1397 | 1424 | else => |kind| return revertAndWarn( |
| 1398 | 1425 | rp, |
| 1399 | 1426 | error.UnsupportedTranslation, |