| ... | ... | @@ -348,7 +348,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void { |
| 348 | 348 | else |
| 349 | 349 | try appendToken(c, .Keyword_var, "var"); |
| 350 | 350 | |
| 351 | | const name_tok = try appendToken(c, .Identifier, var_name); |
| 351 | const name_tok = try appendIdentifier(c, var_name); |
| 352 | 352 | |
| 353 | 353 | _ = try appendToken(c, .Colon, ":"); |
| 354 | 354 | const type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) { |
| ... | ... | @@ -407,7 +407,7 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err |
| 407 | 407 | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 408 | 408 | |
| 409 | 409 | const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl))); |
| 410 | | const name_tok = try appendToken(c, .Identifier, typedef_name); |
| 410 | const name_tok = try appendIdentifier(c, typedef_name); |
| 411 | 411 | const eq_tok = try appendToken(c, .Equal, "="); |
| 412 | 412 | |
| 413 | 413 | const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl); |
| ... | ... | @@ -460,7 +460,7 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error! |
| 460 | 460 | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 461 | 461 | |
| 462 | 462 | const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name }); |
| 463 | | const name_tok = try appendToken(c, .Identifier, name); |
| 463 | const name_tok = try appendIdentifier(c, name); |
| 464 | 464 | |
| 465 | 465 | const eq_tok = try appendToken(c, .Equal, "="); |
| 466 | 466 | const init_node = transRecordDecl(c, record_decl) catch |err| switch (err) { |
| ... | ... | @@ -497,10 +497,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error! |
| 497 | 497 | fn createAlias(c: *Context, alias: var) !void { |
| 498 | 498 | const visib_tok = try appendToken(c, .Keyword_pub, "pub"); |
| 499 | 499 | const mut_tok = try appendToken(c, .Keyword_const, "const"); |
| 500 | | const name_tok = try appendToken(c, .Identifier, alias.alias); |
| 500 | const name_tok = try appendIdentifier(c, alias.alias); |
| 501 | 501 | |
| 502 | 502 | const eq_tok = try appendToken(c, .Equal, "="); |
| 503 | | const init_node = try appendIdentifier(c, alias.name); |
| 503 | const init_node = try transCreateNodeIdentifier(c, alias.name); |
| 504 | 504 | |
| 505 | 505 | const node = try c.a().create(ast.Node.VarDecl); |
| 506 | 506 | node.* = ast.Node.VarDecl{ |
| ... | ... | @@ -787,7 +787,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe |
| 787 | 787 | const c_name = try c.str(ZigClangDecl_getName_bytes_begin( |
| 788 | 788 | @ptrCast(*const ZigClangDecl, var_decl), |
| 789 | 789 | )); |
| 790 | | const name_token = try appendToken(c, .Identifier, c_name); |
| 790 | const name_token = try appendIdentifier(c, c_name); |
| 791 | 791 | |
| 792 | 792 | const var_scope = try c.a().create(Scope.Var); |
| 793 | 793 | var_scope.* = Scope.Var{ |
| ... | ... | @@ -856,7 +856,7 @@ fn transDeclRefExpr( |
| 856 | 856 | const c_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl))); |
| 857 | 857 | const zig_name = transLookupZigIdentifier(scope, c_name); |
| 858 | 858 | if (lrvalue == .l_value) try rp.c.ptr_params.put(zig_name); |
| 859 | | const node = try appendIdentifier(rp.c, zig_name); |
| 859 | const node = try transCreateNodeIdentifier(rp.c, zig_name); |
| 860 | 860 | return TransResult{ |
| 861 | 861 | .node = node, |
| 862 | 862 | .node_scope = scope, |
| ... | ... | @@ -1292,7 +1292,7 @@ fn maybeSuppressResult( |
| 1292 | 1292 | if (used == .used) return result; |
| 1293 | 1293 | // NOTE: This is backwards, but the semicolon must immediately follow the node. |
| 1294 | 1294 | _ = try appendToken(rp.c, .Semicolon, ";"); |
| 1295 | | const lhs = try appendIdentifier(rp.c, "_"); |
| 1295 | const lhs = try transCreateNodeIdentifier(rp.c, "_"); |
| 1296 | 1296 | const op_token = try appendToken(rp.c, .Equal, "="); |
| 1297 | 1297 | const op_node = try rp.c.a().create(ast.Node.InfixOp); |
| 1298 | 1298 | op_node.* = ast.Node.InfixOp{ |
| ... | ... | @@ -1374,7 +1374,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro |
| 1374 | 1374 | return node; |
| 1375 | 1375 | } |
| 1376 | 1376 | |
| 1377 | | const field_name = try appendToken(c, .Identifier, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl)))); |
| 1377 | const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl)))); |
| 1378 | 1378 | _ = try appendToken(c, .Colon, ":"); |
| 1379 | 1379 | const field_type = try transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc); |
| 1380 | 1380 | |
| ... | ... | @@ -1644,7 +1644,7 @@ fn transCreateNodePtrType( |
| 1644 | 1644 | .Identifier => blk: { |
| 1645 | 1645 | const lbracket = try appendToken(c, .LBracket, "["); // Rendering checks if this token + 2 == .Identifier, so needs to return this token |
| 1646 | 1646 | _ = try appendToken(c, .Asterisk, "*"); |
| 1647 | | _ = try appendToken(c, .Identifier, "c"); |
| 1647 | _ = try appendIdentifier(c, "c"); |
| 1648 | 1648 | _ = try appendToken(c, .RBracket, "]"); |
| 1649 | 1649 | break :blk lbracket; |
| 1650 | 1650 | }, |
| ... | ... | @@ -1793,25 +1793,25 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour |
| 1793 | 1793 | .Builtin => { |
| 1794 | 1794 | const builtin_ty = @ptrCast(*const ZigClangBuiltinType, ty); |
| 1795 | 1795 | switch (ZigClangBuiltinType_getKind(builtin_ty)) { |
| 1796 | | .Void => return appendIdentifier(rp.c, "c_void"), |
| 1797 | | .Bool => return appendIdentifier(rp.c, "bool"), |
| 1798 | | .Char_U, .UChar, .Char_S, .Char8 => return appendIdentifier(rp.c, "u8"), |
| 1799 | | .SChar => return appendIdentifier(rp.c, "i8"), |
| 1800 | | .UShort => return appendIdentifier(rp.c, "c_ushort"), |
| 1801 | | .UInt => return appendIdentifier(rp.c, "c_uint"), |
| 1802 | | .ULong => return appendIdentifier(rp.c, "c_ulong"), |
| 1803 | | .ULongLong => return appendIdentifier(rp.c, "c_ulonglong"), |
| 1804 | | .Short => return appendIdentifier(rp.c, "c_short"), |
| 1805 | | .Int => return appendIdentifier(rp.c, "c_int"), |
| 1806 | | .Long => return appendIdentifier(rp.c, "c_long"), |
| 1807 | | .LongLong => return appendIdentifier(rp.c, "c_longlong"), |
| 1808 | | .UInt128 => return appendIdentifier(rp.c, "u128"), |
| 1809 | | .Int128 => return appendIdentifier(rp.c, "i128"), |
| 1810 | | .Float => return appendIdentifier(rp.c, "f32"), |
| 1811 | | .Double => return appendIdentifier(rp.c, "f64"), |
| 1812 | | .Float128 => return appendIdentifier(rp.c, "f128"), |
| 1813 | | .Float16 => return appendIdentifier(rp.c, "f16"), |
| 1814 | | .LongDouble => return appendIdentifier(rp.c, "c_longdouble"), |
| 1796 | .Void => return transCreateNodeIdentifier(rp.c, "c_void"), |
| 1797 | .Bool => return transCreateNodeIdentifier(rp.c, "bool"), |
| 1798 | .Char_U, .UChar, .Char_S, .Char8 => return transCreateNodeIdentifier(rp.c, "u8"), |
| 1799 | .SChar => return transCreateNodeIdentifier(rp.c, "i8"), |
| 1800 | .UShort => return transCreateNodeIdentifier(rp.c, "c_ushort"), |
| 1801 | .UInt => return transCreateNodeIdentifier(rp.c, "c_uint"), |
| 1802 | .ULong => return transCreateNodeIdentifier(rp.c, "c_ulong"), |
| 1803 | .ULongLong => return transCreateNodeIdentifier(rp.c, "c_ulonglong"), |
| 1804 | .Short => return transCreateNodeIdentifier(rp.c, "c_short"), |
| 1805 | .Int => return transCreateNodeIdentifier(rp.c, "c_int"), |
| 1806 | .Long => return transCreateNodeIdentifier(rp.c, "c_long"), |
| 1807 | .LongLong => return transCreateNodeIdentifier(rp.c, "c_longlong"), |
| 1808 | .UInt128 => return transCreateNodeIdentifier(rp.c, "u128"), |
| 1809 | .Int128 => return transCreateNodeIdentifier(rp.c, "i128"), |
| 1810 | .Float => return transCreateNodeIdentifier(rp.c, "f32"), |
| 1811 | .Double => return transCreateNodeIdentifier(rp.c, "f64"), |
| 1812 | .Float128 => return transCreateNodeIdentifier(rp.c, "f128"), |
| 1813 | .Float16 => return transCreateNodeIdentifier(rp.c, "f16"), |
| 1814 | .LongDouble => return transCreateNodeIdentifier(rp.c, "c_longdouble"), |
| 1815 | 1815 | else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}), |
| 1816 | 1816 | } |
| 1817 | 1817 | }, |
| ... | ... | @@ -1891,14 +1891,14 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour |
| 1891 | 1891 | |
| 1892 | 1892 | const typedef_decl = ZigClangTypedefType_getDecl(typedef_ty); |
| 1893 | 1893 | const typedef_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl))); |
| 1894 | | return appendIdentifier(rp.c, typedef_name); |
| 1894 | return transCreateNodeIdentifier(rp.c, typedef_name); |
| 1895 | 1895 | }, |
| 1896 | 1896 | .Record => { |
| 1897 | 1897 | const record_ty = @ptrCast(*const ZigClangRecordType, ty); |
| 1898 | 1898 | |
| 1899 | 1899 | const record_decl = ZigClangRecordType_getDecl(record_ty); |
| 1900 | | if (try getContainerName(rp.c, record_decl)) |name| |
| 1901 | | return appendIdentifier(rp.c, name) |
| 1900 | if (try getContainerName(rp, record_decl)) |name| |
| 1901 | return transCreateNodeIdentifier(rp.c, name) |
| 1902 | 1902 | else |
| 1903 | 1903 | return transRecordDecl(rp.c, record_decl); |
| 1904 | 1904 | }, |
| ... | ... | @@ -1913,22 +1913,20 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour |
| 1913 | 1913 | } |
| 1914 | 1914 | } |
| 1915 | 1915 | |
| 1916 | | fn getContainerName(c: *Context, record_decl: *const ZigClangRecordDecl) !?[]const u8 { |
| 1917 | | const bare_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl))); |
| 1916 | fn getContainerName(rp: RestorePoint, record_decl: *const ZigClangRecordDecl) !?[]const u8 { |
| 1917 | const bare_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, record_decl))); |
| 1918 | 1918 | |
| 1919 | 1919 | const container_kind_name = if (ZigClangRecordDecl_isUnion(record_decl)) |
| 1920 | 1920 | "union" |
| 1921 | 1921 | else if (ZigClangRecordDecl_isStruct(record_decl)) |
| 1922 | 1922 | "struct" |
| 1923 | | else { |
| 1924 | | try emitWarning(c, ZigClangRecordDecl_getLocation(record_decl), "record {} is not a struct or union", .{bare_name}); |
| 1925 | | return null; |
| 1926 | | }; |
| 1923 | else |
| 1924 | return revertAndWarn(rp, error.UnsupportedType, ZigClangRecordDecl_getLocation(record_decl), "record {} is not a struct or union", .{bare_name}); |
| 1927 | 1925 | |
| 1928 | 1926 | if (ZigClangRecordDecl_isAnonymousStructOrUnion(record_decl) or bare_name.len == 0) |
| 1929 | 1927 | return null; |
| 1930 | 1928 | |
| 1931 | | return try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name }); |
| 1929 | return try std.fmt.allocPrint(rp.c.a(), "{}_{}", .{ container_kind_name, bare_name }); |
| 1932 | 1930 | } |
| 1933 | 1931 | |
| 1934 | 1932 | fn isCVoid(qt: ZigClangQualType) bool { |
| ... | ... | @@ -2020,7 +2018,7 @@ fn finishTransFnProto( |
| 2020 | 2018 | else |
| 2021 | 2019 | null; |
| 2022 | 2020 | const fn_tok = try appendToken(rp.c, .Keyword_fn, "fn"); |
| 2023 | | const name_tok = if (fn_decl_context) |ctx| try appendToken(rp.c, .Identifier, ctx.fn_name) else null; |
| 2021 | const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null; |
| 2024 | 2022 | const lparen_tok = try appendToken(rp.c, .LParen, "("); |
| 2025 | 2023 | |
| 2026 | 2024 | var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a()); |
| ... | ... | @@ -2038,7 +2036,7 @@ fn finishTransFnProto( |
| 2038 | 2036 | const param_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, param))); |
| 2039 | 2037 | if (param_name.len > 0) { |
| 2040 | 2038 | // TODO: If len == 0, auto-generate arg1, arg2, etc? Or leave the name blank? |
| 2041 | | const result = try appendToken(rp.c, .Identifier, param_name); |
| 2039 | const result = try appendIdentifier(rp.c, param_name); |
| 2042 | 2040 | _ = try appendToken(rp.c, .Colon, ":"); |
| 2043 | 2041 | break :blk result; |
| 2044 | 2042 | } |
| ... | ... | @@ -2087,12 +2085,12 @@ fn finishTransFnProto( |
| 2087 | 2085 | |
| 2088 | 2086 | const return_type_node = blk: { |
| 2089 | 2087 | if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) { |
| 2090 | | break :blk try appendIdentifier(rp.c, "noreturn"); |
| 2088 | break :blk try transCreateNodeIdentifier(rp.c, "noreturn"); |
| 2091 | 2089 | } else { |
| 2092 | 2090 | const return_qt = ZigClangFunctionType_getReturnType(fn_ty); |
| 2093 | 2091 | if (isCVoid(return_qt)) { |
| 2094 | 2092 | // convert primitive c_void to actual void (only for return type) |
| 2095 | | break :blk try appendIdentifier(rp.c, "void"); |
| 2093 | break :blk try transCreateNodeIdentifier(rp.c, "void"); |
| 2096 | 2094 | } else { |
| 2097 | 2095 | break :blk transQualType(rp, return_qt, source_loc) catch |err| switch (err) { |
| 2098 | 2096 | error.UnsupportedType => { |
| ... | ... | @@ -2145,7 +2143,7 @@ fn emitWarning(c: *Context, loc: ZigClangSourceLocation, comptime format: []cons |
| 2145 | 2143 | fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime format: []const u8, args: var) !void { |
| 2146 | 2144 | // const name = @compileError(msg); |
| 2147 | 2145 | const const_tok = try appendToken(c, .Keyword_const, "const"); |
| 2148 | | const name_tok = try appendToken(c, .Identifier, name); |
| 2146 | const name_tok = try appendIdentifier(c, name); |
| 2149 | 2147 | const eq_tok = try appendToken(c, .Equal, "="); |
| 2150 | 2148 | const builtin_tok = try appendToken(c, .Builtin, "@compileError"); |
| 2151 | 2149 | const lparen_tok = try appendToken(c, .LParen, "("); |
| ... | ... | @@ -2190,6 +2188,7 @@ fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime |
| 2190 | 2188 | } |
| 2191 | 2189 | |
| 2192 | 2190 | fn appendToken(c: *Context, token_id: Token.Id, bytes: []const u8) !ast.TokenIndex { |
| 2191 | std.debug.assert(token_id != .Identifier); // use appendIdentifier |
| 2193 | 2192 | return appendTokenFmt(c, token_id, "{}", .{bytes}); |
| 2194 | 2193 | } |
| 2195 | 2194 | |
| ... | ... | @@ -2218,8 +2217,16 @@ fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8, |
| 2218 | 2217 | return token_index; |
| 2219 | 2218 | } |
| 2220 | 2219 | |
| 2221 | | fn appendIdentifier(c: *Context, name: []const u8) !*ast.Node { |
| 2222 | | const token_index = try appendToken(c, .Identifier, name); |
| 2220 | fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex { |
| 2221 | if (std.zig.Token.getKeyword(name)) |_| { |
| 2222 | return appendTokenFmt(c, .Identifier, "@\"{}\"", .{name}); |
| 2223 | } else { |
| 2224 | return appendTokenFmt(c, .Identifier, "{}", .{name}); |
| 2225 | } |
| 2226 | } |
| 2227 | |
| 2228 | fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node { |
| 2229 | const token_index = try appendIdentifier(c, name); |
| 2223 | 2230 | const identifier = try c.a().create(ast.Node.Identifier); |
| 2224 | 2231 | identifier.* = ast.Node.Identifier{ |
| 2225 | 2232 | .base = ast.Node{ .id = ast.Node.Id.Identifier }, |