authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 09:55:37+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-12-16 10:39:31+02:00
loga37caaa5285ed6c040675a94dbd639e881ad72b6
tree815bd1979e12a714b8911821ecfa3e4c165ae027
parent620bf695e8d595c67acbf1457a8a14a7013a8522
signature Commit is signed but in an unrecognized format.

translate-c-2 parameter name aliasing


4 files changed, 235 insertions(+), 140 deletions(-)

src-self-hosted/clang.zig+8-8
...@@ -764,14 +764,14 @@ pub extern fn ZigClangEnumDecl_enumerator_end(*const ZigClangEnumDecl) ZigClangE...@@ -764,14 +764,14 @@ pub extern fn ZigClangEnumDecl_enumerator_end(*const ZigClangEnumDecl) ZigClangE
764pub extern fn ZigClangEnumDecl_enumerator_iterator_next(ZigClangEnumDecl_enumerator_iterator) ZigClangEnumDecl_enumerator_iterator;764pub extern fn ZigClangEnumDecl_enumerator_iterator_next(ZigClangEnumDecl_enumerator_iterator) ZigClangEnumDecl_enumerator_iterator;
765pub extern fn ZigClangEnumDecl_enumerator_iterator_deref(ZigClangEnumDecl_enumerator_iterator) *const ZigClangEnumConstantDecl;765pub extern fn ZigClangEnumDecl_enumerator_iterator_deref(ZigClangEnumDecl_enumerator_iterator) *const ZigClangEnumConstantDecl;
766pub extern fn ZigClangEnumDecl_enumerator_iterator_neq(ZigClangEnumDecl_enumerator_iterator, ZigClangEnumDecl_enumerator_iterator) bool;766pub extern fn ZigClangEnumDecl_enumerator_iterator_neq(ZigClangEnumDecl_enumerator_iterator, ZigClangEnumDecl_enumerator_iterator) bool;
767pub extern fn ZigClangDecl_getName_bytes_begin(decl: ?*const struct_ZigClangDecl) [*c]const u8;767pub extern fn ZigClangDecl_getName_bytes_begin(decl: ?*const struct_ZigClangDecl) [*:0]const u8;
768pub extern fn ZigClangSourceLocation_eq(a: struct_ZigClangSourceLocation, b: struct_ZigClangSourceLocation) bool;768pub extern fn ZigClangSourceLocation_eq(a: struct_ZigClangSourceLocation, b: struct_ZigClangSourceLocation) bool;
769pub extern fn ZigClangTypedefType_getDecl(self: ?*const struct_ZigClangTypedefType) *const struct_ZigClangTypedefNameDecl;769pub extern fn ZigClangTypedefType_getDecl(self: ?*const struct_ZigClangTypedefType) *const struct_ZigClangTypedefNameDecl;
770pub extern fn ZigClangTypedefNameDecl_getUnderlyingType(self: ?*const struct_ZigClangTypedefNameDecl) struct_ZigClangQualType;770pub extern fn ZigClangTypedefNameDecl_getUnderlyingType(self: ?*const struct_ZigClangTypedefNameDecl) struct_ZigClangQualType;
771pub extern fn ZigClangQualType_getCanonicalType(self: struct_ZigClangQualType) struct_ZigClangQualType;771pub extern fn ZigClangQualType_getCanonicalType(self: struct_ZigClangQualType) struct_ZigClangQualType;
772pub extern fn ZigClangQualType_getTypeClass(self: struct_ZigClangQualType) ZigClangTypeClass;772pub extern fn ZigClangQualType_getTypeClass(self: struct_ZigClangQualType) ZigClangTypeClass;
773pub extern fn ZigClangQualType_getTypePtr(self: struct_ZigClangQualType) *const struct_ZigClangType;773pub extern fn ZigClangQualType_getTypePtr(self: struct_ZigClangQualType) *const struct_ZigClangType;
774pub extern fn ZigClangQualType_addConst(self: [*c]struct_ZigClangQualType) void;774pub extern fn ZigClangQualType_addConst(self: *struct_ZigClangQualType) void;
775pub extern fn ZigClangQualType_eq(self: struct_ZigClangQualType, arg1: struct_ZigClangQualType) bool;775pub extern fn ZigClangQualType_eq(self: struct_ZigClangQualType, arg1: struct_ZigClangQualType) bool;
776pub extern fn ZigClangQualType_isConstQualified(self: struct_ZigClangQualType) bool;776pub extern fn ZigClangQualType_isConstQualified(self: struct_ZigClangQualType) bool;
777pub extern fn ZigClangQualType_isVolatileQualified(self: struct_ZigClangQualType) bool;777pub extern fn ZigClangQualType_isVolatileQualified(self: struct_ZigClangQualType) bool;
...@@ -799,7 +799,7 @@ pub extern fn ZigClangAPSInt_isSigned(self: ?*const struct_ZigClangAPSInt) bool;...@@ -799,7 +799,7 @@ pub extern fn ZigClangAPSInt_isSigned(self: ?*const struct_ZigClangAPSInt) bool;
799pub extern fn ZigClangAPSInt_isNegative(self: ?*const struct_ZigClangAPSInt) bool;799pub extern fn ZigClangAPSInt_isNegative(self: ?*const struct_ZigClangAPSInt) bool;
800pub extern fn ZigClangAPSInt_negate(self: ?*const struct_ZigClangAPSInt) ?*const struct_ZigClangAPSInt;800pub extern fn ZigClangAPSInt_negate(self: ?*const struct_ZigClangAPSInt) ?*const struct_ZigClangAPSInt;
801pub extern fn ZigClangAPSInt_free(self: ?*const struct_ZigClangAPSInt) void;801pub extern fn ZigClangAPSInt_free(self: ?*const struct_ZigClangAPSInt) void;
802pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*c]const u64;802pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*:0]const u64;
803pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint;803pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint;
804804
805pub extern fn ZigClangAPInt_getLimitedValue(self: *const struct_ZigClangAPInt, limit: u64) u64;805pub extern fn ZigClangAPInt_getLimitedValue(self: *const struct_ZigClangAPInt, limit: u64) u64;
...@@ -931,25 +931,25 @@ pub const struct_ZigClangAPValueLValueBase = extern struct {...@@ -931,25 +931,25 @@ pub const struct_ZigClangAPValueLValueBase = extern struct {
931 Version: c_uint,931 Version: c_uint,
932};932};
933933
934pub extern fn ZigClangErrorMsg_delete(ptr: [*c]Stage2ErrorMsg, len: usize) void;934pub extern fn ZigClangErrorMsg_delete(ptr: [*]Stage2ErrorMsg, len: usize) void;
935935
936pub extern fn ZigClangLoadFromCommandLine(936pub extern fn ZigClangLoadFromCommandLine(
937 args_begin: [*]?[*]const u8,937 args_begin: [*]?[*]const u8,
938 args_end: [*]?[*]const u8,938 args_end: [*]?[*]const u8,
939 errors_ptr: *[*]Stage2ErrorMsg,939 errors_ptr: *[*]Stage2ErrorMsg,
940 errors_len: *usize,940 errors_len: *usize,
941 resources_path: [*c]const u8,941 resources_path: [*:0]const u8,
942) ?*ZigClangASTUnit;942) ?*ZigClangASTUnit;
943943
944pub extern fn ZigClangDecl_getKind(decl: *const ZigClangDecl) ZigClangDeclKind;944pub extern fn ZigClangDecl_getKind(decl: *const ZigClangDecl) ZigClangDeclKind;
945pub extern fn ZigClangDecl_getDeclKindName(decl: *const struct_ZigClangDecl) [*:0]const u8;945pub extern fn ZigClangDecl_getDeclKindName(decl: *const struct_ZigClangDecl) [*:0]const u8;
946946
947pub const ZigClangCompoundStmt_const_body_iterator = [*c]const *struct_ZigClangStmt;947pub const ZigClangCompoundStmt_const_body_iterator = [*]const *struct_ZigClangStmt;
948948
949pub extern fn ZigClangCompoundStmt_body_begin(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;949pub extern fn ZigClangCompoundStmt_body_begin(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
950pub extern fn ZigClangCompoundStmt_body_end(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;950pub extern fn ZigClangCompoundStmt_body_end(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
951951
952pub const ZigClangDeclStmt_const_decl_iterator = [*c]const *struct_ZigClangDecl;952pub const ZigClangDeclStmt_const_decl_iterator = [*]const *struct_ZigClangDecl;
953953
954pub extern fn ZigClangDeclStmt_decl_begin(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;954pub extern fn ZigClangDeclStmt_decl_begin(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
955pub extern fn ZigClangDeclStmt_decl_end(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;955pub extern fn ZigClangDeclStmt_decl_end(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
...@@ -1017,7 +1017,7 @@ pub extern fn ZigClangBinaryOperator_getType(*const ZigClangBinaryOperator) ZigC...@@ -1017,7 +1017,7 @@ pub extern fn ZigClangBinaryOperator_getType(*const ZigClangBinaryOperator) ZigC
1017pub extern fn ZigClangDecayedType_getDecayedType(*const ZigClangDecayedType) ZigClangQualType;1017pub extern fn ZigClangDecayedType_getDecayedType(*const ZigClangDecayedType) ZigClangQualType;
10181018
1019pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind;1019pub extern fn ZigClangStringLiteral_getKind(*const ZigClangStringLiteral) ZigClangStringLiteral_StringKind;
1020pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*c]const u8;1020pub extern fn ZigClangStringLiteral_getString_bytes_begin_size(*const ZigClangStringLiteral, *usize) [*]const u8;
10211021
1022pub extern fn ZigClangParenExpr_getSubExpr(*const ZigClangParenExpr) *const ZigClangExpr;1022pub extern fn ZigClangParenExpr_getSubExpr(*const ZigClangParenExpr) *const ZigClangExpr;
10231023
src-self-hosted/stage1.zig+1-1
...@@ -93,7 +93,7 @@ export fn stage2_translate_c(...@@ -93,7 +93,7 @@ export fn stage2_translate_c(
93 out_errors_len: *usize,93 out_errors_len: *usize,
94 args_begin: [*]?[*]const u8,94 args_begin: [*]?[*]const u8,
95 args_end: [*]?[*]const u8,95 args_end: [*]?[*]const u8,
96 resources_path: [*]const u8,96 resources_path: [*:0]const u8,
97) Error {97) Error {
98 var errors: []translate_c.ClangErrMsg = undefined;98 var errors: []translate_c.ClangErrMsg = undefined;
99 out_ast.* = translate_c.translate(std.heap.c_allocator, args_begin, args_end, &errors, resources_path) catch |err| switch (err) {99 out_ast.* = translate_c.translate(std.heap.c_allocator, args_begin, args_end, &errors, resources_path) catch |err| switch (err) {
src-self-hosted/translate_c.zig+221-129
...@@ -49,7 +49,9 @@ const Scope = struct {...@@ -49,7 +49,9 @@ const Scope = struct {
49 Block,49 Block,
50 Root,50 Root,
51 While,51 While,
52 FnDef,
52 };53 };
54
53 const Switch = struct {55 const Switch = struct {
54 base: Scope,56 base: Scope,
55 };57 };
...@@ -65,21 +67,14 @@ const Scope = struct {...@@ -65,21 +67,14 @@ const Scope = struct {
65 block_node: *ast.Node.Block,67 block_node: *ast.Node.Block,
6668
67 /// Don't forget to set rbrace token later69 /// Don't forget to set rbrace token later
68 fn create(c: *Context, parent: *Scope, lbrace_tok: ast.TokenIndex) !*Block {70 fn init(c: *Context, parent: *Scope, block_node: *ast.Node.Block) !*Block {
69 const block = try c.a().create(Block);71 const block = try c.a().create(Block);
70 block.* = Block{72 block.* = .{
71 .base = Scope{73 .base = .{
72 .id = Id.Block,74 .id = .Block,
73 .parent = parent,75 .parent = parent,
74 },76 },
75 .block_node = try c.a().create(ast.Node.Block),77 .block_node = block_node,
76 };
77 block.block_node.* = ast.Node.Block{
78 .base = ast.Node{ .id = ast.Node.Id.Block },
79 .label = null,
80 .lbrace = lbrace_tok,
81 .statements = ast.Node.Block.StatementList.init(c.a()),
82 .rbrace = undefined,
83 };78 };
84 return block;79 return block;
85 }80 }
...@@ -87,11 +82,91 @@ const Scope = struct {...@@ -87,11 +82,91 @@ const Scope = struct {
8782
88 const Root = struct {83 const Root = struct {
89 base: Scope,84 base: Scope,
85 sym_table: SymbolTable,
86 macro_table: SymbolTable,
87
88 fn init(c: *Context) Root {
89 return .{
90 .base = .{
91 .id = .Root,
92 .parent = null,
93 },
94 .sym_table = SymbolTable.init(c.a()),
95 .macro_table = SymbolTable.init(c.a()),
96 };
97 }
98
99 fn contains(scope: *Root, name: []const u8) bool {
100 return scope.sym_table.contains(name) or scope.macro_table.contains(name);
101 }
90 };102 };
91103
92 const While = struct {104 const While = struct {
93 base: Scope,105 base: Scope,
94 };106 };
107
108 const FnDef = struct {
109 base: Scope,
110 params: AliasList,
111
112 fn init(c: *Context) FnDef {
113 return .{
114 .base = .{
115 .id = .FnDef,
116 .parent = &c.global_scope.base,
117 },
118 .params = AliasList.init(c.a()),
119 };
120 }
121
122 fn getAlias(scope: *FnDef, name: []const u8) ?[]const u8 {
123 var it = scope.params.iterator(0);
124 while (it.next()) |p| {
125 if (std.mem.eql(u8, p.name, name))
126 return p.alias;
127 }
128 return scope.base.parent.?.getAlias(name);
129 }
130
131 fn contains(scope: *FnDef, name: []const u8) bool {
132 var it = scope.params.iterator(0);
133 while (it.next()) |p| {
134 if (std.mem.eql(u8, p.name, name))
135 return true;
136 }
137 return scope.base.parent.?.contains(name);
138 }
139 };
140
141 fn findBlockScope(inner: *Scope) *Scope.Block {
142 var scope = inner;
143 while (true) : (scope = scope.parent orelse unreachable) {
144 if (scope.id == .Block) return @fieldParentPtr(Scope.Block, "base", scope);
145 }
146 }
147
148 fn createAlias(scope: *Scope, c: *Context, name: []const u8) !?[]const u8 {
149 if (scope.contains(name)) {
150 return try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, c.getMangle() });
151 }
152 return null;
153 }
154
155 fn getAlias(scope: *Scope, name: []const u8) ?[]const u8 {
156 return switch (scope.id) {
157 .Root => null,
158 .FnDef => @fieldParentPtr(FnDef, "base", scope).getAlias(name),
159 else => @panic("TODO Scope.getAlias"),
160 };
161 }
162
163 fn contains(scope: *Scope, name: []const u8) bool {
164 return switch (scope.id) {
165 .Root => @fieldParentPtr(Root, "base", scope).contains(name),
166 .FnDef => @fieldParentPtr(FnDef, "base", scope).contains(name),
167 else => @panic("TODO Scope.contains"),
168 };
169 }
95};170};
96171
97const TransResult = struct {172const TransResult = struct {
...@@ -107,8 +182,6 @@ const Context = struct {...@@ -107,8 +182,6 @@ const Context = struct {
107 source_manager: *ZigClangSourceManager,182 source_manager: *ZigClangSourceManager,
108 decl_table: DeclTable,183 decl_table: DeclTable,
109 alias_list: AliasList,184 alias_list: AliasList,
110 sym_table: SymbolTable,
111 macro_table: SymbolTable,
112 global_scope: *Scope.Root,185 global_scope: *Scope.Root,
113 ptr_params: std.BufSet,186 ptr_params: std.BufSet,
114 clang_context: *ZigClangASTContext,187 clang_context: *ZigClangASTContext,
...@@ -145,7 +218,7 @@ pub fn translate(...@@ -145,7 +218,7 @@ pub fn translate(
145 args_begin: [*]?[*]const u8,218 args_begin: [*]?[*]const u8,
146 args_end: [*]?[*]const u8,219 args_end: [*]?[*]const u8,
147 errors: *[]ClangErrMsg,220 errors: *[]ClangErrMsg,
148 resources_path: [*]const u8,221 resources_path: [*:0]const u8,
149) !*ast.Tree {222) !*ast.Tree {
150 const ast_unit = ZigClangLoadFromCommandLine(223 const ast_unit = ZigClangLoadFromCommandLine(
151 args_begin,224 args_begin,
...@@ -195,18 +268,11 @@ pub fn translate(...@@ -195,18 +268,11 @@ pub fn translate(
195 .err = undefined,268 .err = undefined,
196 .decl_table = DeclTable.init(arena),269 .decl_table = DeclTable.init(arena),
197 .alias_list = AliasList.init(arena),270 .alias_list = AliasList.init(arena),
198 .sym_table = SymbolTable.init(arena),
199 .macro_table = SymbolTable.init(arena),
200 .global_scope = try arena.create(Scope.Root),271 .global_scope = try arena.create(Scope.Root),
201 .ptr_params = std.BufSet.init(arena),272 .ptr_params = std.BufSet.init(arena),
202 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,273 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,
203 };274 };
204 context.global_scope.* = Scope.Root{275 context.global_scope.* = Scope.Root.init(&context);
205 .base = Scope{
206 .id = Scope.Id.Root,
207 .parent = null,
208 },
209 };
210276
211 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {277 if (!ZigClangASTUnit_visitLocalTopLevelDecls(ast_unit, &context, declVisitorC)) {
212 return context.err;278 return context.err;
...@@ -217,7 +283,7 @@ pub fn translate(...@@ -217,7 +283,7 @@ pub fn translate(
217 try addMacros(&context);283 try addMacros(&context);
218 var it = context.alias_list.iterator(0);284 var it = context.alias_list.iterator(0);
219 while (it.next()) |alias| {285 while (it.next()) |alias| {
220 if (!context.sym_table.contains(alias.alias)) {286 if (!context.global_scope.sym_table.contains(alias.alias)) {
221 try createAlias(&context, alias);287 try createAlias(&context, alias);
222 }288 }
223 }289 }
...@@ -276,7 +342,8 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -276,7 +342,8 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
276 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);342 const fn_decl_loc = ZigClangFunctionDecl_getLocation(fn_decl);
277 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);343 const fn_qt = ZigClangFunctionDecl_getType(fn_decl);
278 const fn_type = ZigClangQualType_getTypePtr(fn_qt);344 const fn_type = ZigClangQualType_getTypePtr(fn_qt);
279 var scope = &c.global_scope.base;345 var fndef_scope = Scope.FnDef.init(c);
346 var scope = &fndef_scope.base;
280 const has_body = ZigClangFunctionDecl_hasBody(fn_decl);347 const has_body = ZigClangFunctionDecl_hasBody(fn_decl);
281 const storage_class = ZigClangFunctionDecl_getStorageClass(fn_decl);348 const storage_class = ZigClangFunctionDecl_getStorageClass(fn_decl);
282 const decl_ctx = FnDeclContext{349 const decl_ctx = FnDeclContext{
...@@ -343,7 +410,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -343,7 +410,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
343 else410 else
344 try appendToken(c, .Keyword_threadlocal, "threadlocal");411 try appendToken(c, .Keyword_threadlocal, "threadlocal");
345412
346 var scope = &c.global_scope.base;413 const scope = &c.global_scope.base;
347 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));414 const var_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, var_decl)));
348 _ = try c.decl_table.put(@ptrToInt(var_decl), var_name);415 _ = try c.decl_table.put(@ptrToInt(var_decl), var_name);
349 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);416 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);
...@@ -364,7 +431,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -364,7 +431,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
364 else431 else
365 try appendToken(c, .Keyword_var, "var");432 try appendToken(c, .Keyword_var, "var");
366433
367 const name_tok = try appendIdentifier(c, var_name);434 const name_tok = try appendIdentifier(c, var_name, null);
368435
369 _ = try appendToken(c, .Colon, ":");436 _ = try appendToken(c, .Colon, ":");
370 const type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {437 const type_node = transQualType(rp, qual_type, var_decl_loc) catch |err| switch (err) {
...@@ -425,7 +492,7 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err...@@ -425,7 +492,7 @@ fn resolveTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl) Err
425492
426 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));493 const typedef_name = try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
427 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);494 _ = try c.decl_table.put(@ptrToInt(ZigClangTypedefNameDecl_getCanonicalDecl(typedef_decl)), typedef_name);
428 const name_tok = try appendIdentifier(c, typedef_name);495 const name_tok = try appendIdentifier(c, typedef_name, null);
429 const eq_tok = try appendToken(c, .Equal, "=");496 const eq_tok = try appendToken(c, .Equal, "=");
430497
431 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);498 const child_qt = ZigClangTypedefNameDecl_getUnderlyingType(typedef_decl);
...@@ -478,7 +545,7 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!...@@ -478,7 +545,7 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
478545
479 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });546 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });
480 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);547 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
481 const name_tok = try appendIdentifier(c, name);548 const name_tok = try appendIdentifier(c, name, null);
482549
483 const eq_tok = try appendToken(c, .Equal, "=");550 const eq_tok = try appendToken(c, .Equal, "=");
484 const init_node = transRecordDecl(c, record_decl) catch |err| switch (err) {551 const init_node = transRecordDecl(c, record_decl) catch |err| switch (err) {
...@@ -514,10 +581,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!...@@ -514,10 +581,10 @@ fn resolveRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!
514fn createAlias(c: *Context, alias: var) !void {581fn createAlias(c: *Context, alias: var) !void {
515 const visib_tok = try appendToken(c, .Keyword_pub, "pub");582 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
516 const mut_tok = try appendToken(c, .Keyword_const, "const");583 const mut_tok = try appendToken(c, .Keyword_const, "const");
517 const name_tok = try appendIdentifier(c, alias.alias);584 const name_tok = try appendIdentifier(c, alias.alias, null);
518585
519 const eq_tok = try appendToken(c, .Equal, "=");586 const eq_tok = try appendToken(c, .Equal, "=");
520 const init_node = try transCreateNodeIdentifier(c, alias.name);587 const init_node = try transCreateNodeIdentifier(c, alias.name, null);
521588
522 const node = try c.a().create(ast.Node.VarDecl);589 const node = try c.a().create(ast.Node.VarDecl);
523 node.* = ast.Node.VarDecl{590 node.* = ast.Node.VarDecl{
...@@ -731,7 +798,7 @@ fn transCompoundStmtInline(...@@ -731,7 +798,7 @@ fn transCompoundStmtInline(
731 const end_it = ZigClangCompoundStmt_body_end(stmt);798 const end_it = ZigClangCompoundStmt_body_end(stmt);
732 var scope = parent_scope;799 var scope = parent_scope;
733 while (it != end_it) : (it += 1) {800 while (it != end_it) : (it += 1) {
734 const result = try transStmt(rp, parent_scope, it.*, .unused, .r_value);801 const result = try transStmt(rp, parent_scope, it[0], .unused, .r_value);
735 scope = result.child_scope;802 scope = result.child_scope;
736 if (result.node != &block_node.base)803 if (result.node != &block_node.base)
737 try block_node.statements.push(result.node);804 try block_node.statements.push(result.node);
...@@ -743,13 +810,13 @@ fn transCompoundStmtInline(...@@ -743,13 +810,13 @@ fn transCompoundStmtInline(
743 };810 };
744}811}
745812
746fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) !TransResult {813fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!TransResult {
747 const lbrace_tok = try appendToken(rp.c, .LBrace, "{");814 const block_node = try transCreateNodeBlock(rp.c, null, null);
748 const block_scope = try Scope.Block.create(rp.c, scope, lbrace_tok);815 const block_scope = try Scope.Block.init(rp.c, scope, block_node);
749 const inline_result = try transCompoundStmtInline(rp, &block_scope.base, stmt, block_scope.block_node);816 const inline_result = try transCompoundStmtInline(rp, &block_scope.base, stmt, block_node);
750 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");817 block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
751 return TransResult{818 return TransResult{
752 .node = &block_scope.block_node.base,819 .node = &block_node.base,
753 .node_scope = inline_result.node_scope,820 .node_scope = inline_result.node_scope,
754 .child_scope = inline_result.child_scope,821 .child_scope = inline_result.child_scope,
755 };822 };
...@@ -779,17 +846,17 @@ fn transCStyleCastExprClass(...@@ -779,17 +846,17 @@ fn transCStyleCastExprClass(
779 return maybeSuppressResult(rp, scope, result_used, cast_res);846 return maybeSuppressResult(rp, scope, result_used, cast_res);
780}847}
781848
782fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) !TransResult {849fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) TransError!TransResult {
783 const c = rp.c;850 const c = rp.c;
784 const block_scope = findBlockScope(parent_scope);851 const block_scope = parent_scope.findBlockScope();
785 var scope = parent_scope;852 var scope = parent_scope;
786853
787 var it = ZigClangDeclStmt_decl_begin(stmt);854 var it = ZigClangDeclStmt_decl_begin(stmt);
788 const end_it = ZigClangDeclStmt_decl_end(stmt);855 const end_it = ZigClangDeclStmt_decl_end(stmt);
789 while (it != end_it) : (it += 1) {856 while (it != end_it) : (it += 1) {
790 switch (ZigClangDecl_getKind(it.*)) {857 switch (ZigClangDecl_getKind(it[0])) {
791 .Var => {858 .Var => {
792 const var_decl = @ptrCast(*const ZigClangVarDecl, it.*);859 const var_decl = @ptrCast(*const ZigClangVarDecl, it[0]);
793860
794 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)861 const thread_local_token = if (ZigClangVarDecl_getTLSKind(var_decl) == .None)
795 null862 null
...@@ -803,7 +870,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe...@@ -803,7 +870,7 @@ fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDe
803 const c_name = try c.str(ZigClangDecl_getName_bytes_begin(870 const c_name = try c.str(ZigClangDecl_getName_bytes_begin(
804 @ptrCast(*const ZigClangDecl, var_decl),871 @ptrCast(*const ZigClangDecl, var_decl),
805 ));872 ));
806 const name_token = try appendIdentifier(c, c_name);873 const name_token = try appendIdentifier(c, c_name, null); // TODO parent_scope);
807874
808 const var_scope = try c.a().create(Scope.Var);875 const var_scope = try c.a().create(Scope.Var);
809 var_scope.* = Scope.Var{876 var_scope.* = Scope.Var{
...@@ -871,7 +938,7 @@ fn transDeclRefExpr(...@@ -871,7 +938,7 @@ fn transDeclRefExpr(
871 const c_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));938 const c_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, value_decl)));
872 const zig_name = transLookupZigIdentifier(scope, c_name);939 const zig_name = transLookupZigIdentifier(scope, c_name);
873 if (lrvalue == .l_value) try rp.c.ptr_params.put(zig_name);940 if (lrvalue == .l_value) try rp.c.ptr_params.put(zig_name);
874 const node = try transCreateNodeIdentifier(rp.c, zig_name);941 const node = try transCreateNodeIdentifier(rp.c, zig_name, null); // TODO scope);
875 return TransResult{942 return TransResult{
876 .node = node,943 .node = node,
877 .node_scope = scope,944 .node_scope = scope,
...@@ -1240,13 +1307,6 @@ fn transImplicitValueInitExpr(...@@ -1240,13 +1307,6 @@ fn transImplicitValueInitExpr(
1240 };1307 };
1241}1308}
12421309
1243fn findBlockScope(inner: *Scope) *Scope.Block {
1244 var scope = inner;
1245 while (true) : (scope = scope.parent orelse unreachable) {
1246 if (scope.id == .Block) return @fieldParentPtr(Scope.Block, "base", scope);
1247 }
1248}
1249
1250fn transLookupZigIdentifier(inner: *Scope, c_name: []const u8) []const u8 {1310fn transLookupZigIdentifier(inner: *Scope, c_name: []const u8) []const u8 {
1251 var scope = inner;1311 var scope = inner;
1252 while (true) : (scope = scope.parent orelse return c_name) {1312 while (true) : (scope = scope.parent orelse return c_name) {
...@@ -1303,7 +1363,7 @@ fn maybeSuppressResult(...@@ -1303,7 +1363,7 @@ fn maybeSuppressResult(
1303 if (used == .used) return result;1363 if (used == .used) return result;
1304 // NOTE: This is backwards, but the semicolon must immediately follow the node.1364 // NOTE: This is backwards, but the semicolon must immediately follow the node.
1305 _ = try appendToken(rp.c, .Semicolon, ";");1365 _ = try appendToken(rp.c, .Semicolon, ";");
1306 const lhs = try transCreateNodeIdentifier(rp.c, "_");1366 const lhs = try transCreateNodeIdentifier(rp.c, "_", null);
1307 const op_token = try appendToken(rp.c, .Equal, "=");1367 const op_token = try appendToken(rp.c, .Equal, "=");
1308 const op_node = try rp.c.a().create(ast.Node.InfixOp);1368 const op_node = try rp.c.a().create(ast.Node.InfixOp);
1309 op_node.* = ast.Node.InfixOp{1369 op_node.* = ast.Node.InfixOp{
...@@ -1321,7 +1381,7 @@ fn maybeSuppressResult(...@@ -1321,7 +1381,7 @@ fn maybeSuppressResult(
13211381
1322fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {1382fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
1323 try c.tree.root_node.decls.push(decl_node);1383 try c.tree.root_node.decls.push(decl_node);
1324 _ = try c.sym_table.put(name, decl_node);1384 _ = try c.global_scope.sym_table.put(name, decl_node);
1325}1385}
13261386
1327fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {1387fn transQualType(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigClangSourceLocation) TypeError!*ast.Node {
...@@ -1383,7 +1443,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro...@@ -1383,7 +1443,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
1383 return node;1443 return node;
1384 }1444 }
13851445
1386 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))));1446 const field_name = try appendIdentifier(c, try c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, field_decl))), null);
1387 _ = try appendToken(c, .Colon, ":");1447 _ = try appendToken(c, .Colon, ":");
1388 const field_type = try transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc);1448 const field_type = try transQualType(rp, ZigClangFieldDecl_getType(field_decl), field_loc);
13891449
...@@ -1407,7 +1467,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro...@@ -1407,7 +1467,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) TypeErro
14071467
1408fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.Node {1468fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.Node {
1409 if (c.decl_table.get(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)))) |name|1469 if (c.decl_table.get(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)))) |name|
1410 return try transCreateNodeIdentifier(c, name.value); // Avoid processing this decl twice1470 return try transCreateNodeIdentifier(c, name.value, null); // Avoid processing this decl twice
1411 const rp = makeRestorePoint(c);1471 const rp = makeRestorePoint(c);
1412 const enum_loc = ZigClangEnumDecl_getLocation(enum_decl);1472 const enum_loc = ZigClangEnumDecl_getLocation(enum_decl);
14131473
...@@ -1423,7 +1483,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1423,7 +1483,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
14231483
1424 const name = try std.fmt.allocPrint(c.a(), "enum_{}", .{bare_name});1484 const name = try std.fmt.allocPrint(c.a(), "enum_{}", .{bare_name});
1425 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);1485 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);
1426 const name_tok = try appendIdentifier(c, name);1486 const name_tok = try appendIdentifier(c, name, null);
1427 const eq_tok = try appendToken(c, .Equal, "=");1487 const eq_tok = try appendToken(c, .Equal, "=");
14281488
1429 const init_node = if (ZigClangEnumDecl_getDefinition(enum_decl)) |enum_def| blk: {1489 const init_node = if (ZigClangEnumDecl_getDefinition(enum_decl)) |enum_def| blk: {
...@@ -1490,7 +1550,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1490,7 +1550,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
1490 else1550 else
1491 enum_val_name;1551 enum_val_name;
14921552
1493 const field_name_tok = try appendIdentifier(c, field_name);1553 const field_name_tok = try appendIdentifier(c, field_name, null);
14941554
1495 const int_node = if (!pure_enum) blk: {1555 const int_node = if (!pure_enum) blk: {
1496 _ = try appendToken(c, .Colon, "=");1556 _ = try appendToken(c, .Colon, "=");
...@@ -1543,18 +1603,18 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1543,18 +1603,18 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
1543 try addTopLevelDecl(c, name, &node.base);1603 try addTopLevelDecl(c, name, &node.base);
1544 if (!is_unnamed)1604 if (!is_unnamed)
1545 try c.alias_list.push(.{ .alias = bare_name, .name = name });1605 try c.alias_list.push(.{ .alias = bare_name, .name = name });
1546 return transCreateNodeIdentifier(c, name);1606 return transCreateNodeIdentifier(c, name, null);
1547}1607}
15481608
1549fn addEnumTopLevel(c: *Context, enum_name: []const u8, field_name: []const u8, enum_val_name: []const u8) !void {1609fn addEnumTopLevel(c: *Context, enum_name: []const u8, field_name: []const u8, enum_val_name: []const u8) !void {
1550 const visib_tok = try appendToken(c, .Keyword_pub, "pub");1610 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
1551 const const_tok = try appendToken(c, .Keyword_const, "const");1611 const const_tok = try appendToken(c, .Keyword_const, "const");
1552 const name_tok = try appendIdentifier(c, enum_val_name);1612 const name_tok = try appendIdentifier(c, enum_val_name, null);
1553 const eq_tok = try appendToken(c, .Equal, "=");1613 const eq_tok = try appendToken(c, .Equal, "=");
15541614
1555 const enum_ident = try transCreateNodeIdentifier(c, enum_name);1615 const enum_ident = try transCreateNodeIdentifier(c, enum_name, null);
1556 const period_tok = try appendToken(c, .Period, ".");1616 const period_tok = try appendToken(c, .Period, ".");
1557 const field_ident = try transCreateNodeIdentifier(c, field_name);1617 const field_ident = try transCreateNodeIdentifier(c, field_name, null);
15581618
1559 const field_access_node = try c.a().create(ast.Node.InfixOp);1619 const field_access_node = try c.a().create(ast.Node.InfixOp);
1560 field_access_node.* = .{1620 field_access_node.* = .{
...@@ -1836,7 +1896,7 @@ fn transCreateNodePtrType(...@@ -1836,7 +1896,7 @@ fn transCreateNodePtrType(
1836 .Identifier => blk: {1896 .Identifier => blk: {
1837 const lbracket = try appendToken(c, .LBracket, "["); // Rendering checks if this token + 2 == .Identifier, so needs to return this token1897 const lbracket = try appendToken(c, .LBracket, "["); // Rendering checks if this token + 2 == .Identifier, so needs to return this token
1838 _ = try appendToken(c, .Asterisk, "*");1898 _ = try appendToken(c, .Asterisk, "*");
1839 _ = try appendIdentifier(c, "c");1899 _ = try appendIdentifier(c, "c", null); // not really an identifier
1840 _ = try appendToken(c, .RBracket, "]");1900 _ = try appendToken(c, .RBracket, "]");
1841 break :blk lbracket;1901 break :blk lbracket;
1842 },1902 },
...@@ -1954,10 +2014,12 @@ fn transCreateNodeOpaqueType(c: *Context) !*ast.Node {...@@ -1954,10 +2014,12 @@ fn transCreateNodeOpaqueType(c: *Context) !*ast.Node {
1954}2014}
19552015
1956fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_alias_node: *ast.Node) !*ast.Node {2016fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_alias_node: *ast.Node) !*ast.Node {
2017 const scope = &c.global_scope.base;
2018
1957 const pub_tok = try appendToken(c, .Keyword_pub, "pub");2019 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
1958 const inline_tok = try appendToken(c, .Keyword_inline, "inline");2020 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
1959 const fn_tok = try appendToken(c, .Keyword_fn, "fn");2021 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
1960 const name_tok = try appendIdentifier(c, name);2022 const name_tok = try appendIdentifier(c, name, null);
1961 _ = try appendToken(c, .LParen, "(");2023 _ = try appendToken(c, .LParen, "(");
19622024
1963 const proto_alias = proto_alias_node.cast(ast.Node.FnProto).?;2025 const proto_alias = proto_alias_node.cast(ast.Node.FnProto).?;
...@@ -2006,13 +2068,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -2006,13 +2068,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
2006 .section_expr = null,2068 .section_expr = null,
2007 };2069 };
20082070
2009 const block = try c.a().create(ast.Node.Block);2071 const block = try transCreateNodeBlock(c, null, null);
2010 block.* = .{
2011 .label = null,
2012 .lbrace = try appendToken(c, .LBrace, "{"),
2013 .statements = ast.Node.Block.StatementList.init(c.a()),
2014 .rbrace = undefined,
2015 };
20162072
2017 const return_expr = try transCreateNodeReturnExpr(c);2073 const return_expr = try transCreateNodeReturnExpr(c);
2018 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);2074 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);
...@@ -2023,7 +2079,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -2023,7 +2079,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
2023 _ = try appendToken(c, .Comma, ",");2079 _ = try appendToken(c, .Comma, ",");
2024 }2080 }
2025 const param = pn.*.cast(ast.Node.ParamDecl).?;2081 const param = pn.*.cast(ast.Node.ParamDecl).?;
2026 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)));2082 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?), null));
2027 }2083 }
2028 call_expr.rtoken = try appendToken(c, .RParen, ")");2084 call_expr.rtoken = try appendToken(c, .RParen, ")");
2029 return_expr.rhs = &call_expr.base;2085 return_expr.rhs = &call_expr.base;
...@@ -2051,7 +2107,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {...@@ -2051,7 +2107,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {
2051 const node = try c.a().create(ast.Node.EnumLiteral);2107 const node = try c.a().create(ast.Node.EnumLiteral);
2052 node.* = .{2108 node.* = .{
2053 .dot = try appendToken(c, .Period, "."),2109 .dot = try appendToken(c, .Period, "."),
2054 .name = try appendIdentifier(c, name),2110 .name = try appendIdentifier(c, name, null), // scoped to an enum
2055 };2111 };
2056 return &node.base;2112 return &node.base;
2057}2113}
...@@ -2080,6 +2136,22 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {...@@ -2080,6 +2136,22 @@ fn transCreateNodeElse(c: *Context) !*ast.Node.Else {
2080 return node;2136 return node;
2081}2137}
20822138
2139fn transCreateNodeBlock(c: *Context, label: ?[]const u8, scope: ?*Scope) !*ast.Node.Block {
2140 const label_node = if (label) |l| blk: {
2141 const ll = try appendIdentifier(c, l, scope);
2142 _ = try appendToken(c, .Colon, ":");
2143 break :blk ll;
2144 } else null;
2145 const block_node = try c.a().create(ast.Node.Block);
2146 block_node.* = .{
2147 .label = label_node,
2148 .lbrace = try appendToken(c, .LBrace, "{"),
2149 .statements = ast.Node.Block.StatementList.init(c.a()),
2150 .rbrace = undefined,
2151 };
2152 return block_node;
2153}
2154
2083const RestorePoint = struct {2155const RestorePoint = struct {
2084 c: *Context,2156 c: *Context,
2085 token_index: ast.TokenIndex,2157 token_index: ast.TokenIndex,
...@@ -2124,7 +2196,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -2124,7 +2196,7 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
2124 .Float16 => "f16",2196 .Float16 => "f16",
2125 .LongDouble => "c_longdouble",2197 .LongDouble => "c_longdouble",
2126 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}),2198 else => return revertAndWarn(rp, error.UnsupportedType, source_loc, "unsupported builtin type", .{}),
2127 });2199 }, null);
2128 },2200 },
2129 .FunctionProto => {2201 .FunctionProto => {
2130 const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty);2202 const fn_proto_ty = @ptrCast(*const ZigClangFunctionProtoType, ty);
...@@ -2202,14 +2274,21 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour...@@ -2202,14 +2274,21 @@ fn transType(rp: RestorePoint, ty: *const ZigClangType, source_loc: ZigClangSour
22022274
2203 const typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);2275 const typedef_decl = ZigClangTypedefType_getDecl(typedef_ty);
2204 const typedef_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));2276 const typedef_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, typedef_decl)));
2205 return transCreateNodeIdentifier(rp.c, typedef_name);2277 return transCreateNodeIdentifier(rp.c, typedef_name, null);
2206 },2278 },
2207 .Record => {2279 .Record => {
2208 const record_ty = @ptrCast(*const ZigClangRecordType, ty);2280 const record_ty = @ptrCast(*const ZigClangRecordType, ty);
22092281
2282 // TODO this sould get the name from decl_table
2283 // struct Foo {
2284 // struct Bar{
2285 // int b;
2286 // };
2287 // struct Bar c;
2288 // };
2210 const record_decl = ZigClangRecordType_getDecl(record_ty);2289 const record_decl = ZigClangRecordType_getDecl(record_ty);
2211 if (try getContainerName(rp, record_decl)) |name|2290 if (try getContainerName(rp, record_decl)) |name|
2212 return transCreateNodeIdentifier(rp.c, name)2291 return transCreateNodeIdentifier(rp.c, name, null)
2213 else2292 else
2214 return transRecordDecl(rp.c, record_decl);2293 return transRecordDecl(rp.c, record_decl);
2215 },2294 },
...@@ -2334,6 +2413,9 @@ fn finishTransFnProto(...@@ -2334,6 +2413,9 @@ fn finishTransFnProto(
2334 // TODO check for always_inline attribute2413 // TODO check for always_inline attribute
2335 // TODO check for align attribute2414 // TODO check for align attribute
23362415
2416 var fndef_scope = Scope.FnDef.init(rp.c);
2417 const scope = &fndef_scope.base;
2418
2337 // pub extern fn name(...) T2419 // pub extern fn name(...) T
2338 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;2420 const pub_tok = if (is_pub) try appendToken(rp.c, .Keyword_pub, "pub") else null;
2339 const cc_tok = if (cc == .Stdcall) try appendToken(rp.c, .Keyword_stdcallcc, "stdcallcc") else null;2421 const cc_tok = if (cc == .Stdcall) try appendToken(rp.c, .Keyword_stdcallcc, "stdcallcc") else null;
...@@ -2344,7 +2426,7 @@ fn finishTransFnProto(...@@ -2344,7 +2426,7 @@ fn finishTransFnProto(
2344 else2426 else
2345 null;2427 null;
2346 const fn_tok = try appendToken(rp.c, .Keyword_fn, "fn");2428 const fn_tok = try appendToken(rp.c, .Keyword_fn, "fn");
2347 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;2429 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name, null) else null;
2348 const lparen_tok = try appendToken(rp.c, .LParen, "(");2430 const lparen_tok = try appendToken(rp.c, .LParen, "(");
23492431
2350 var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a());2432 var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a());
...@@ -2359,13 +2441,17 @@ fn finishTransFnProto(...@@ -2359,13 +2441,17 @@ fn finishTransFnProto(
2359 const param_name_tok: ?ast.TokenIndex = blk: {2441 const param_name_tok: ?ast.TokenIndex = blk: {
2360 if (fn_decl != null) {2442 if (fn_decl != null) {
2361 const param = ZigClangFunctionDecl_getParamDecl(fn_decl.?, @intCast(c_uint, i));2443 const param = ZigClangFunctionDecl_getParamDecl(fn_decl.?, @intCast(c_uint, i));
2362 const param_name = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, param)));2444 var param_name: []const u8 = try rp.c.str(ZigClangDecl_getName_bytes_begin(@ptrCast(*const ZigClangDecl, param)));
2363 if (param_name.len > 0) {2445 if (param_name.len < 1)
2364 // TODO: If len == 0, auto-generate arg1, arg2, etc? Or leave the name blank?2446 param_name = "arg"[0..];
2365 const result = try appendIdentifier(rp.c, param_name);2447 const checked_param_name = if (try scope.createAlias(rp.c, param_name)) |a| blk: {
2366 _ = try appendToken(rp.c, .Colon, ":");2448 try fndef_scope.params.push(.{ .name = param_name, .alias = a });
2367 break :blk result;2449 break :blk a;
2368 }2450 } else param_name;
2451
2452 const result = try appendIdentifier(rp.c, checked_param_name, null);
2453 _ = try appendToken(rp.c, .Colon, ":");
2454 break :blk result;
2369 }2455 }
2370 break :blk null;2456 break :blk null;
2371 };2457 };
...@@ -2411,12 +2497,12 @@ fn finishTransFnProto(...@@ -2411,12 +2497,12 @@ fn finishTransFnProto(
24112497
2412 const return_type_node = blk: {2498 const return_type_node = blk: {
2413 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {2499 if (ZigClangFunctionType_getNoReturnAttr(fn_ty)) {
2414 break :blk try transCreateNodeIdentifier(rp.c, "noreturn");2500 break :blk try transCreateNodeIdentifier(rp.c, "noreturn", null);
2415 } else {2501 } else {
2416 const return_qt = ZigClangFunctionType_getReturnType(fn_ty);2502 const return_qt = ZigClangFunctionType_getReturnType(fn_ty);
2417 if (isCVoid(return_qt)) {2503 if (isCVoid(return_qt)) {
2418 // convert primitive c_void to actual void (only for return type)2504 // convert primitive c_void to actual void (only for return type)
2419 break :blk try transCreateNodeIdentifier(rp.c, "void");2505 break :blk try transCreateNodeIdentifier(rp.c, "void", null);
2420 } else {2506 } else {
2421 break :blk transQualType(rp, return_qt, source_loc) catch |err| switch (err) {2507 break :blk transQualType(rp, return_qt, source_loc) catch |err| switch (err) {
2422 error.UnsupportedType => {2508 error.UnsupportedType => {
...@@ -2469,7 +2555,7 @@ fn emitWarning(c: *Context, loc: ZigClangSourceLocation, comptime format: []cons...@@ -2469,7 +2555,7 @@ fn emitWarning(c: *Context, loc: ZigClangSourceLocation, comptime format: []cons
2469fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime format: []const u8, args: var) !void {2555fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comptime format: []const u8, args: var) !void {
2470 // const name = @compileError(msg);2556 // const name = @compileError(msg);
2471 const const_tok = try appendToken(c, .Keyword_const, "const");2557 const const_tok = try appendToken(c, .Keyword_const, "const");
2472 const name_tok = try appendIdentifier(c, name);2558 const name_tok = try appendIdentifier(c, name, null);
2473 const eq_tok = try appendToken(c, .Equal, "=");2559 const eq_tok = try appendToken(c, .Equal, "=");
2474 const builtin_tok = try appendToken(c, .Builtin, "@compileError");2560 const builtin_tok = try appendToken(c, .Builtin, "@compileError");
2475 const lparen_tok = try appendToken(c, .LParen, "(");2561 const lparen_tok = try appendToken(c, .LParen, "(");
...@@ -2554,7 +2640,11 @@ fn isValidZigIdentifier(name: []const u8) bool {...@@ -2554,7 +2640,11 @@ fn isValidZigIdentifier(name: []const u8) bool {
2554 return true;2640 return true;
2555}2641}
25562642
2557fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {2643fn appendIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !ast.TokenIndex {
2644 if (scope) |s|
2645 if (s.getAlias(name)) |alias| {
2646 return appendTokenFmt(c, .Identifier, "{}", .{alias});
2647 };
2558 if (!isValidZigIdentifier(name) or std.zig.Token.getKeyword(name) != null) {2648 if (!isValidZigIdentifier(name) or std.zig.Token.getKeyword(name) != null) {
2559 return appendTokenFmt(c, .Identifier, "@\"{}\"", .{name});2649 return appendTokenFmt(c, .Identifier, "@\"{}\"", .{name});
2560 } else {2650 } else {
...@@ -2562,8 +2652,8 @@ fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {...@@ -2562,8 +2652,8 @@ fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {
2562 }2652 }
2563}2653}
25642654
2565fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {2655fn transCreateNodeIdentifier(c: *Context, name: []const u8, scope: ?*Scope) !*ast.Node {
2566 const token_index = try appendIdentifier(c, name);2656 const token_index = try appendIdentifier(c, name, scope);
2567 const identifier = try c.a().create(ast.Node.Identifier);2657 const identifier = try c.a().create(ast.Node.Identifier);
2568 identifier.* = ast.Node.Identifier{2658 identifier.* = ast.Node.Identifier{
2569 .base = ast.Node{ .id = ast.Node.Id.Identifier },2659 .base = ast.Node{ .id = ast.Node.Id.Identifier },
...@@ -2581,6 +2671,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {...@@ -2581,6 +2671,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
2581 var it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit);2671 var it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit);
2582 const it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit);2672 const it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit);
2583 var tok_list = ctok.TokenList.init(c.a());2673 var tok_list = ctok.TokenList.init(c.a());
2674 const scope = &c.global_scope.base;
25842675
2585 while (it.I != it_end.I) : (it.I += 1) {2676 while (it.I != it_end.I) : (it.I += 1) {
2586 const entity = ZigClangPreprocessingRecord_iterator_deref(it);2677 const entity = ZigClangPreprocessingRecord_iterator_deref(it);
...@@ -2592,9 +2683,9 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {...@@ -2592,9 +2683,9 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
2592 const begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);2683 const begin_loc = ZigClangMacroDefinitionRecord_getSourceRange_getBegin(macro);
25932684
2594 const name = try c.str(raw_name);2685 const name = try c.str(raw_name);
2595 // if (name_exists_global(c, name)) { // TODO2686 if (scope.contains(name)) {
2596 // continue;2687 continue;
2597 // }2688 }
2598 const begin_c = ZigClangSourceManager_getCharacterData(c.source_manager, begin_loc);2689 const begin_c = ZigClangSourceManager_getCharacterData(c.source_manager, begin_loc);
2599 ctok.tokenizeCMacro(&tok_list, begin_c) catch |err| switch (err) {2690 ctok.tokenizeCMacro(&tok_list, begin_c) catch |err| switch (err) {
2600 error.OutOfMemory => |e| return e,2691 error.OutOfMemory => |e| return e,
...@@ -2645,14 +2736,14 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {...@@ -2645,14 +2736,14 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
26452736
2646fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {2737fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {
2647 const rp = makeRestorePoint(c);2738 const rp = makeRestorePoint(c);
2739 const scope = &c.global_scope.base;
26482740
2649 const visib_tok = try appendToken(c, .Keyword_pub, "pub");2741 const visib_tok = try appendToken(c, .Keyword_pub, "pub");
2650 const mut_tok = try appendToken(c, .Keyword_const, "const");2742 const mut_tok = try appendToken(c, .Keyword_const, "const");
2651 const name_tok = try appendIdentifier(c, name);2743 const name_tok = try appendIdentifier(c, name, null);
2652
2653 const eq_tok = try appendToken(c, .Equal, "=");2744 const eq_tok = try appendToken(c, .Equal, "=");
26542745
2655 const init_node = try parseCExpr(rp, it, source_loc);2746 const init_node = try parseCExpr(rp, it, source_loc, scope);
26562747
2657 const node = try c.a().create(ast.Node.VarDecl);2748 const node = try c.a().create(ast.Node.VarDecl);
2658 node.* = ast.Node.VarDecl{2749 node.* = ast.Node.VarDecl{
...@@ -2671,15 +2762,18 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8,...@@ -2671,15 +2762,18 @@ fn transMacroDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8,
2671 .init_node = init_node,2762 .init_node = init_node,
2672 .semicolon_token = try appendToken(c, .Semicolon, ";"),2763 .semicolon_token = try appendToken(c, .Semicolon, ";"),
2673 };2764 };
2674 _ = try c.macro_table.put(name, &node.base);2765 _ = try c.global_scope.macro_table.put(name, &node.base);
2675}2766}
26762767
2677fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {2768fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u8, source_loc: ZigClangSourceLocation) ParseError!void {
2678 const rp = makeRestorePoint(c);2769 const rp = makeRestorePoint(c);
2770 var fndef_scope = Scope.FnDef.init(c);
2771 const scope = &fndef_scope.base;
2772
2679 const pub_tok = try appendToken(c, .Keyword_pub, "pub");2773 const pub_tok = try appendToken(c, .Keyword_pub, "pub");
2680 const inline_tok = try appendToken(c, .Keyword_inline, "inline");2774 const inline_tok = try appendToken(c, .Keyword_inline, "inline");
2681 const fn_tok = try appendToken(c, .Keyword_fn, "fn");2775 const fn_tok = try appendToken(c, .Keyword_fn, "fn");
2682 const name_tok = try appendIdentifier(c, name);2776 const name_tok = try appendIdentifier(c, name, null);
2683 _ = try appendToken(c, .LParen, "(");2777 _ = try appendToken(c, .LParen, "(");
26842778
2685 if (it.next().?.id != .LParen) {2779 if (it.next().?.id != .LParen) {
...@@ -2691,8 +2785,12 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u...@@ -2691,8 +2785,12 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
2691 if (param_tok.id != .Identifier)2785 if (param_tok.id != .Identifier)
2692 return error.ParseError;2786 return error.ParseError;
26932787
2694 // TODO avoid name collisions2788 const checked_name = if (try scope.createAlias(c, param_tok.bytes)) |alias| blk: {
2695 const param_name_tok = try appendIdentifier(c, param_tok.bytes);2789 try fndef_scope.params.push(.{ .name = param_tok.bytes, .alias = alias });
2790 break :blk alias;
2791 } else param_tok.bytes;
2792
2793 const param_name_tok = try appendIdentifier(c, checked_name, null);
2696 _ = try appendToken(c, .Colon, ":");2794 _ = try appendToken(c, .Colon, ":");
26972795
2698 const token_index = try appendToken(c, .Keyword_var, "var");2796 const token_index = try appendToken(c, .Keyword_var, "var");
...@@ -2745,16 +2843,10 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u...@@ -2745,16 +2843,10 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
2745 .section_expr = null,2843 .section_expr = null,
2746 };2844 };
27472845
2748 const block = try c.a().create(ast.Node.Block);2846 const block = try transCreateNodeBlock(c, null, null);
2749 block.* = .{
2750 .label = null,
2751 .lbrace = try appendToken(c, .LBrace, "{"),
2752 .statements = ast.Node.Block.StatementList.init(c.a()),
2753 .rbrace = undefined,
2754 };
27552847
2756 const return_expr = try transCreateNodeReturnExpr(c);2848 const return_expr = try transCreateNodeReturnExpr(c);
2757 const expr = try parseCExpr(rp, it, source_loc);2849 const expr = try parseCExpr(rp, it, source_loc, scope);
2758 _ = try appendToken(c, .Semicolon, ";");2850 _ = try appendToken(c, .Semicolon, ";");
2759 try type_of.params.push(expr);2851 try type_of.params.push(expr);
2760 return_expr.rhs = expr;2852 return_expr.rhs = expr;
...@@ -2762,7 +2854,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u...@@ -2762,7 +2854,7 @@ fn transMacroFnDefine(c: *Context, it: *ctok.TokenList.Iterator, name: []const u
2762 block.rbrace = try appendToken(c, .RBrace, "}");2854 block.rbrace = try appendToken(c, .RBrace, "}");
2763 try block.statements.push(&return_expr.base);2855 try block.statements.push(&return_expr.base);
2764 fn_proto.body_node = &block.base;2856 fn_proto.body_node = &block.base;
2765 _ = try c.macro_table.put(name, &fn_proto.base);2857 _ = try c.global_scope.macro_table.put(name, &fn_proto.base);
2766}2858}
27672859
2768const ParseError = Error || error{2860const ParseError = Error || error{
...@@ -2770,8 +2862,8 @@ const ParseError = Error || error{...@@ -2770,8 +2862,8 @@ const ParseError = Error || error{
2770 UnsupportedTranslation,2862 UnsupportedTranslation,
2771};2863};
27722864
2773fn parseCExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {2865fn parseCExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
2774 return parseCPrefixOpExpr(rp, it, source_loc);2866 return parseCPrefixOpExpr(rp, it, source_loc, scope);
2775}2867}
27762868
2777fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {2869fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {
...@@ -2796,7 +2888,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati...@@ -2796,7 +2888,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
2796 .LL => "c_longlong",2888 .LL => "c_longlong",
2797 .LLU => "c_ulonglong",2889 .LLU => "c_ulonglong",
2798 else => unreachable,2890 else => unreachable,
2799 }));2891 }, null));
2800 _ = try appendToken(rp.c, .Comma, ",");2892 _ = try appendToken(rp.c, .Comma, ",");
2801 try cast_node.params.push(try transCreateNodeInt(rp.c, tok.bytes));2893 try cast_node.params.push(try transCreateNodeInt(rp.c, tok.bytes));
2802 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");2894 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
...@@ -2810,7 +2902,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati...@@ -2810,7 +2902,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
2810 .F => "f32",2902 .F => "f32",
2811 .L => "f64",2903 .L => "f64",
2812 else => unreachable,2904 else => unreachable,
2813 }));2905 }, null));
2814 _ = try appendToken(rp.c, .Comma, ",");2906 _ = try appendToken(rp.c, .Comma, ",");
2815 try cast_node.params.push(try transCreateNodeFloat(rp.c, tok.bytes));2907 try cast_node.params.push(try transCreateNodeFloat(rp.c, tok.bytes));
2816 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");2908 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
...@@ -2825,7 +2917,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati...@@ -2825,7 +2917,7 @@ fn parseCNumLit(rp: RestorePoint, tok: *CToken, source_loc: ZigClangSourceLocati
2825 );2917 );
2826}2918}
28272919
2828fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {2920fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
2829 const tok = it.next().?;2921 const tok = it.next().?;
2830 switch (tok.id) {2922 switch (tok.id) {
2831 .CharLit => {2923 .CharLit => {
...@@ -2847,9 +2939,9 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:...@@ -2847,9 +2939,9 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
2847 .NumLitInt, .NumLitFloat => {2939 .NumLitInt, .NumLitFloat => {
2848 return parseCNumLit(rp, tok, source_loc);2940 return parseCNumLit(rp, tok, source_loc);
2849 },2941 },
2850 .Identifier => return transCreateNodeIdentifier(rp.c, tok.bytes),2942 .Identifier => return transCreateNodeIdentifier(rp.c, tok.bytes, scope),
2851 .LParen => {2943 .LParen => {
2852 const inner_node = try parseCExpr(rp, it, source_loc);2944 const inner_node = try parseCExpr(rp, it, source_loc, scope);
28532945
2854 if (it.peek().?.id == .RParen) {2946 if (it.peek().?.id == .RParen) {
2855 _ = it.next();2947 _ = it.next();
...@@ -2859,7 +2951,7 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:...@@ -2859,7 +2951,7 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
2859 // hack to get zig fmt to render a comma in builtin calls2951 // hack to get zig fmt to render a comma in builtin calls
2860 _ = try appendToken(rp.c, .Comma, ",");2952 _ = try appendToken(rp.c, .Comma, ",");
28612953
2862 const node_to_cast = try parseCExpr(rp, it, source_loc);2954 const node_to_cast = try parseCExpr(rp, it, source_loc, scope);
28632955
2864 if (it.next().?.id != .RParen) {2956 if (it.next().?.id != .RParen) {
2865 return revertAndWarn(2957 return revertAndWarn(
...@@ -2951,8 +3043,8 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:...@@ -2951,8 +3043,8 @@ fn parseCPrimaryExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc:
2951 }3043 }
2952}3044}
29533045
2954fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {3046fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
2955 var node = try parseCPrimaryExpr(rp, it, source_loc);3047 var node = try parseCPrimaryExpr(rp, it, source_loc, scope);
2956 while (true) {3048 while (true) {
2957 const tok = it.next().?;3049 const tok = it.next().?;
2958 switch (tok.id) {3050 switch (tok.id) {
...@@ -2968,7 +3060,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -2968,7 +3060,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
2968 );3060 );
29693061
2970 const op_token = try appendToken(rp.c, .Period, ".");3062 const op_token = try appendToken(rp.c, .Period, ".");
2971 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes);3063 const rhs = try transCreateNodeIdentifier(rp.c, name_tok.bytes, null); // TODO scope);
2972 const access_node = try rp.c.a().create(ast.Node.InfixOp);3064 const access_node = try rp.c.a().create(ast.Node.InfixOp);
2973 access_node.* = .{3065 access_node.* = .{
2974 .op_token = op_token,3066 .op_token = op_token,
...@@ -2991,7 +3083,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -2991,7 +3083,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
2991 } else {3083 } else {
2992 // expr * expr3084 // expr * expr
2993 const op_token = try appendToken(rp.c, .Asterisk, "*");3085 const op_token = try appendToken(rp.c, .Asterisk, "*");
2994 const rhs = try parseCPrimaryExpr(rp, it, source_loc);3086 const rhs = try parseCPrimaryExpr(rp, it, source_loc, scope);
2995 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);3087 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);
2996 bitshift_node.* = .{3088 bitshift_node.* = .{
2997 .op_token = op_token,3089 .op_token = op_token,
...@@ -3004,7 +3096,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -3004,7 +3096,7 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
3004 },3096 },
3005 .Shl => {3097 .Shl => {
3006 const op_token = try appendToken(rp.c, .AngleBracketAngleBracketLeft, "<<");3098 const op_token = try appendToken(rp.c, .AngleBracketAngleBracketLeft, "<<");
3007 const rhs = try parseCPrimaryExpr(rp, it, source_loc);3099 const rhs = try parseCPrimaryExpr(rp, it, source_loc, scope);
3008 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);3100 const bitshift_node = try rp.c.a().create(ast.Node.InfixOp);
3009 bitshift_node.* = .{3101 bitshift_node.* = .{
3010 .op_token = op_token,3102 .op_token = op_token,
...@@ -3022,27 +3114,27 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -3022,27 +3114,27 @@ fn parseCSuffixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
3022 }3114 }
3023}3115}
30243116
3025fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation) ParseError!*ast.Node {3117fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc: ZigClangSourceLocation, scope: *Scope) ParseError!*ast.Node {
3026 const op_tok = it.next().?;3118 const op_tok = it.next().?;
30273119
3028 switch (op_tok.id) {3120 switch (op_tok.id) {
3029 .Bang => {3121 .Bang => {
3030 const node = try transCreateNodePrefixOp(rp.c, .BoolNot, .Bang, "!");3122 const node = try transCreateNodePrefixOp(rp.c, .BoolNot, .Bang, "!");
3031 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);3123 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
3032 return &node.base;3124 return &node.base;
3033 },3125 },
3034 .Minus => {3126 .Minus => {
3035 const node = try transCreateNodePrefixOp(rp.c, .Negation, .Minus, "-");3127 const node = try transCreateNodePrefixOp(rp.c, .Negation, .Minus, "-");
3036 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);3128 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
3037 return &node.base;3129 return &node.base;
3038 },3130 },
3039 .Tilde => {3131 .Tilde => {
3040 const node = try transCreateNodePrefixOp(rp.c, .BitNot, .Tilde, "~");3132 const node = try transCreateNodePrefixOp(rp.c, .BitNot, .Tilde, "~");
3041 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc);3133 node.rhs = try parseCPrefixOpExpr(rp, it, source_loc, scope);
3042 return &node.base;3134 return &node.base;
3043 },3135 },
3044 .Asterisk => {3136 .Asterisk => {
3045 const prefix_op_expr = try parseCPrefixOpExpr(rp, it, source_loc);3137 const prefix_op_expr = try parseCPrefixOpExpr(rp, it, source_loc, scope);
3046 const node = try rp.c.a().create(ast.Node.SuffixOp);3138 const node = try rp.c.a().create(ast.Node.SuffixOp);
3047 node.* = .{3139 node.* = .{
3048 .lhs = .{ .node = prefix_op_expr },3140 .lhs = .{ .node = prefix_op_expr },
...@@ -3053,7 +3145,7 @@ fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc...@@ -3053,7 +3145,7 @@ fn parseCPrefixOpExpr(rp: RestorePoint, it: *ctok.TokenList.Iterator, source_loc
3053 },3145 },
3054 else => {3146 else => {
3055 _ = it.prev();3147 _ = it.prev();
3056 return try parseCSuffixOpExpr(rp, it, source_loc);3148 return try parseCSuffixOpExpr(rp, it, source_loc, scope);
3057 },3149 },
3058 }3150 }
3059}3151}
...@@ -3070,7 +3162,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {...@@ -3070,7 +3162,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {
3070 else3162 else
3071 return null;3163 return null;
3072 // TODO a.b.c3164 // TODO a.b.c
3073 if (c.sym_table.get(name)) |kv| {3165 if (c.global_scope.sym_table.get(name)) |kv| {
3074 if (kv.value.cast(ast.Node.VarDecl)) |val| {3166 if (kv.value.cast(ast.Node.VarDecl)) |val| {
3075 if (val.type_node) |type_node| {3167 if (val.type_node) |type_node| {
3076 if (type_node.cast(ast.Node.PrefixOp)) |casted| {3168 if (type_node.cast(ast.Node.PrefixOp)) |casted| {
...@@ -3085,7 +3177,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {...@@ -3085,7 +3177,7 @@ fn getFnDecl(c: *Context, ref: *ast.Node) ?*ast.Node {
3085}3177}
30863178
3087fn addMacros(c: *Context) !void {3179fn addMacros(c: *Context) !void {
3088 var macro_it = c.macro_table.iterator();3180 var macro_it = c.global_scope.macro_table.iterator();
3089 while (macro_it.next()) |kv| {3181 while (macro_it.next()) |kv| {
3090 if (getFnDecl(c, kv.value)) |proto_node| {3182 if (getFnDecl(c, kv.value)) |proto_node| {
3091 // If a macro aliases a global variable which is a function pointer, we conclude that3183 // If a macro aliases a global variable which is a function pointer, we conclude that
test/translate_c.zig+5-2
...@@ -652,10 +652,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -652,10 +652,13 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
652 });652 });
653653
654 cases.add_2("basic macro function",654 cases.add_2("basic macro function",
655 \\extern int c;
655 \\#define BASIC(c) (c*2)656 \\#define BASIC(c) (c*2)
656 , &[_][]const u8{657 , &[_][]const u8{
657 \\pub inline fn BASIC(c: var) @TypeOf(c * 2) {658 \\pub extern var c: c_int;
658 \\ return c * 2;659 ,
660 \\pub inline fn BASIC(c_1: var) @TypeOf(c_1 * 2) {
661 \\ return c_1 * 2;
659 \\}662 \\}
660 });663 });
661664