| ... | ... | @@ -375,7 +375,7 @@ fn declVisitor(c: *Context, decl: *const ZigClangDecl) Error!void { |
| 375 | 375 | } |
| 376 | 376 | |
| 377 | 377 | fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { |
| 378 | | if (c.decl_table.contains(@ptrToInt(ZigClangFunctionDecl_getCanonicalDecl(fn_decl)))) |
| 378 | if (c.decl_table.contains(@ptrToInt(ZigClangFunctionDecl_getCanonicalDecl(fn_decl)))) |
| 379 | 379 | return; // Avoid processing this decl twice |
| 380 | 380 | const rp = makeRestorePoint(c); |
| 381 | 381 | const fn_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, fn_decl))); |
| ... | ... | @@ -443,7 +443,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void { |
| 443 | 443 | } |
| 444 | 444 | |
| 445 | 445 | fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { |
| 446 | | if (c.decl_table.contains(@ptrToInt(ZigClangVarDecl_getCanonicalDecl(var_decl)))) |
| 446 | if (c.decl_table.contains(@ptrToInt(ZigClangVarDecl_getCanonicalDecl(var_decl)))) |
| 447 | 447 | return; // Avoid processing this decl twice |
| 448 | 448 | const rp = makeRestorePoint(c); |
| 449 | 449 | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); |
| ... | ... | @@ -528,15 +528,46 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { |
| 528 | 528 | return addTopLevelDecl(c, checked_name, &node.base); |
| 529 | 529 | } |
| 530 | 530 | |
| 531 | fn transTypeDefAsBuiltin(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, builtin_name: []const u8) !*ast.Node { |
| 532 | _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), builtin_name); |
| 533 | return transCreateNodeIdentifier(c, builtin_name); |
| 534 | } |
| 535 | |
| 531 | 536 | fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Error!?*ast.Node { |
| 532 | 537 | if (c.decl_table.get(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)))) |kv| |
| 533 | 538 | return try transCreateNodeIdentifier(c, kv.value); // Avoid processing this decl twice |
| 534 | 539 | const rp = makeRestorePoint(c); |
| 535 | | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); |
| 536 | | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 537 | 540 | |
| 538 | 541 | const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl))); |
| 542 | |
| 543 | if (std.mem.eql(u8, typedef_name, "uint8_t")) |
| 544 | return transTypeDefAsBuiltin(c, typedef_decl, "u8") |
| 545 | else if (std.mem.eql(u8, typedef_name, "int8_t")) |
| 546 | return transTypeDefAsBuiltin(c, typedef_decl, "i8") |
| 547 | else if (std.mem.eql(u8, typedef_name, "uint16_t")) |
| 548 | return transTypeDefAsBuiltin(c, typedef_decl, "u16") |
| 549 | else if (std.mem.eql(u8, typedef_name, "int16_t")) |
| 550 | return transTypeDefAsBuiltin(c, typedef_decl, "i16") |
| 551 | else if (std.mem.eql(u8, typedef_name, "uint32_t")) |
| 552 | return transTypeDefAsBuiltin(c, typedef_decl, "u32") |
| 553 | else if (std.mem.eql(u8, typedef_name, "int32_t")) |
| 554 | return transTypeDefAsBuiltin(c, typedef_decl, "i32") |
| 555 | else if (std.mem.eql(u8, typedef_name, "uint64_t")) |
| 556 | return transTypeDefAsBuiltin(c, typedef_decl, "u64") |
| 557 | else if (std.mem.eql(u8, typedef_name, "int64_t")) |
| 558 | return transTypeDefAsBuiltin(c, typedef_decl, "i64") |
| 559 | else if (std.mem.eql(u8, typedef_name, "intptr_t")) |
| 560 | return transTypeDefAsBuiltin(c, typedef_decl, "isize") |
| 561 | else if (std.mem.eql(u8, typedef_name, "uintptr_t")) |
| 562 | return transTypeDefAsBuiltin(c, typedef_decl, "usize") |
| 563 | else if (std.mem.eql(u8, typedef_name, "ssize_t")) |
| 564 | return transTypeDefAsBuiltin(c, typedef_decl, "isize") |
| 565 | else if (std.mem.eql(u8, typedef_name, "size_t")) |
| 566 | return transTypeDefAsBuiltin(c, typedef_decl, "usize"); |
| 567 | |
| 539 | 568 | _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name); |
| 569 | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); |
| 570 | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 540 | 571 | const node = try transCreateNodeVarDecl(c, true, true, typedef_name); |
| 541 | 572 | node.eq_token = try appendToken(c, .Equal, "="); |
| 542 | 573 | |
| ... | ... | @@ -621,8 +652,9 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?* |
| 621 | 652 | try emitWarning(c, field_loc, "{} demoted to opaque type - has bitfield", .{container_kind_name}); |
| 622 | 653 | break :blk opaque; |
| 623 | 654 | } |
| 624 | | |
| 625 | | const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl)))); |
| 655 | const raw_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))); |
| 656 | if (raw_name.len < 1) continue; // fix weird windows bug? |
| 657 | const field_name = try appendIdentifier(c, raw_name); |
| 626 | 658 | _ = try appendToken(c, .Colon, ":"); |
| 627 | 659 | const field_type = transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc) catch |err| switch (err) { |
| 628 | 660 | error.UnsupportedType => { |
| ... | ... | @@ -828,7 +860,17 @@ fn transStmt( |
| 828 | 860 | .IntegerLiteralClass => return transIntegerLiteral(rp, scope, @ptrCast(*const ZigClangIntegerLiteral, stmt), result_used), |
| 829 | 861 | .ReturnStmtClass => return transReturnStmt(rp, scope, @ptrCast(*const ZigClangReturnStmt, stmt)), |
| 830 | 862 | .StringLiteralClass => return transStringLiteral(rp, scope, @ptrCast(*const ZigClangStringLiteral, stmt), result_used), |
| 831 | | .ParenExprClass => return transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue), |
| 863 | .ParenExprClass => { |
| 864 | const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), result_used, lrvalue); |
| 865 | if (expr.id == .GroupedExpression) return expr; |
| 866 | const node = try rp.c.a().create(ast.Node.GroupedExpression); |
| 867 | node.* = .{ |
| 868 | .lparen = try appendToken(rp.c, .LParen, "("), |
| 869 | .expr = expr, |
| 870 | .rparen = try appendToken(rp.c, .RParen, ")"), |
| 871 | }; |
| 872 | return &node.base; |
| 873 | }, |
| 832 | 874 | .InitListExprClass => return transInitListExpr(rp, scope, @ptrCast(*const ZigClangInitListExpr, stmt), result_used), |
| 833 | 875 | .ImplicitValueInitExprClass => return transImplicitValueInitExpr(rp, scope, @ptrCast(*const ZigClangExpr, stmt), result_used), |
| 834 | 876 | .IfStmtClass => return transIfStmt(rp, scope, @ptrCast(*const ZigClangIfStmt, stmt)), |
| ... | ... | @@ -854,6 +896,7 @@ fn transStmt( |
| 854 | 896 | .MemberExprClass => return transMemberExpr(rp, scope, @ptrCast(*const ZigClangMemberExpr, stmt), result_used), |
| 855 | 897 | .ArraySubscriptExprClass => return transArrayAccess(rp, scope, @ptrCast(*const ZigClangArraySubscriptExpr, stmt), result_used), |
| 856 | 898 | .CallExprClass => return transCallExpr(rp, scope, @ptrCast(*const ZigClangCallExpr, stmt), result_used), |
| 899 | .UnaryExprOrTypeTraitExprClass => return transUnaryExprOrTypeTraitExpr(rp, scope, @ptrCast(*const ZigClangUnaryExprOrTypeTraitExpr, stmt), result_used), |
| 857 | 900 | else => { |
| 858 | 901 | return revertAndWarn( |
| 859 | 902 | rp, |
| ... | ... | @@ -1485,7 +1528,8 @@ fn transCCast( |
| 1485 | 1528 | return transCCast(rp, scope, loc, ZigClangElaboratedType_getNamedType(elaborated_ty), src_type, expr); |
| 1486 | 1529 | } |
| 1487 | 1530 | if (ZigClangQualType_getTypeClass(src_type) == .Enum and |
| 1488 | | ZigClangQualType_getTypeClass(dst_type) != .Enum) { |
| 1531 | ZigClangQualType_getTypeClass(dst_type) != .Enum) |
| 1532 | { |
| 1489 | 1533 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@enumToInt"); |
| 1490 | 1534 | try builtin_node.params.push(expr); |
| 1491 | 1535 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| ... | ... | @@ -2064,7 +2108,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, |
| 2064 | 2108 | const num_args = ZigClangCallExpr_getNumArgs(stmt); |
| 2065 | 2109 | const args = ZigClangCallExpr_getArgs(stmt); |
| 2066 | 2110 | var i: usize = 0; |
| 2067 | | while (i < num_args) : (i+=1) { |
| 2111 | while (i < num_args) : (i += 1) { |
| 2068 | 2112 | if (i != 0) { |
| 2069 | 2113 | _ = try appendToken(rp.c, .Comma, ","); |
| 2070 | 2114 | } |
| ... | ... | @@ -2081,7 +2125,7 @@ fn transCallExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCallExpr, |
| 2081 | 2125 | return &node.base; |
| 2082 | 2126 | } |
| 2083 | 2127 | } |
| 2084 | | |
| 2128 | |
| 2085 | 2129 | return maybeSuppressResult(rp, scope, result_used, &node.base); |
| 2086 | 2130 | } |
| 2087 | 2131 | |
| ... | ... | @@ -2101,6 +2145,24 @@ fn qualTypeGetFnProto(qt: ZigClangQualType, is_ptr: *bool) ?*const ZigClangFunct |
| 2101 | 2145 | return null; |
| 2102 | 2146 | } |
| 2103 | 2147 | |
| 2148 | fn transUnaryExprOrTypeTraitExpr( |
| 2149 | rp: RestorePoint, |
| 2150 | scope: *Scope, |
| 2151 | stmt: *const ZigClangUnaryExprOrTypeTraitExpr, |
| 2152 | result_used: ResultUsed, |
| 2153 | ) TransError!*ast.Node { |
| 2154 | const type_node = try transQualType( |
| 2155 | rp, |
| 2156 | ZigClangUnaryExprOrTypeTraitExpr_getTypeOfArgument(stmt), |
| 2157 | ZigClangUnaryExprOrTypeTraitExpr_getBeginLoc(stmt), |
| 2158 | ); |
| 2159 | |
| 2160 | const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, "@sizeOf"); |
| 2161 | try builtin_node.params.push(type_node); |
| 2162 | builtin_node.rparen_token = try appendToken(rp.c, .RParen, ")"); |
| 2163 | return maybeSuppressResult(rp, scope, result_used, &builtin_node.base); |
| 2164 | } |
| 2165 | |
| 2104 | 2166 | fn transCPtrCast( |
| 2105 | 2167 | rp: RestorePoint, |
| 2106 | 2168 | loc: ZigClangSourceLocation, |
| ... | ... | @@ -3092,7 +3154,7 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node { |
| 3092 | 3154 | } |
| 3093 | 3155 | |
| 3094 | 3156 | fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp { |
| 3095 | | _ = try appendToken(c, .LBrace, "["); |
| 3157 | _ = try appendToken(c, .LBrace, "["); |
| 3096 | 3158 | const node = try c.a().create(ast.Node.SuffixOp); |
| 3097 | 3159 | node.* = .{ |
| 3098 | 3160 | .lhs = .{ .node = lhs }, |