From 99f0b28d3946a1110df235bb8d3b1918afc08df8 Mon Sep 17 00:00:00 2001 From: hryx Date: Sun, 26 May 2019 16:51:25 -0700 Subject: [PATCH] var decl: mut_token, create child scope --- src-self-hosted/clang.zig | 1 + src-self-hosted/translate_c.zig | 40 +++++++++++++++++++++------------ src/zig_clang.cpp | 5 +++++ src/zig_clang.h | 2 ++ 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index bb87589c01..c44f047f40 100644 --- a/src-self-hosted/clang.zig +++ b/src-self-hosted/clang.zig @@ -509,6 +509,7 @@ pub extern fn ZigClangAPSInt_getRawData(self: ?*const struct_ZigClangAPSInt) [*c pub extern fn ZigClangAPSInt_getNumWords(self: ?*const struct_ZigClangAPSInt) c_uint; pub extern fn ZigClangAPValueLValueBase_dyn_cast_Expr(self: struct_ZigClangAPValueLValueBase) ?*const struct_ZigClangExpr; pub extern fn ZigClangASTUnit_delete(arg0: ?*struct_ZigClangASTUnit) void; +pub extern fn ZigClangVarDecl_getType(self: ?*const struct_ZigClangVarDecl) struct_ZigClangQualType; pub extern fn ZigClangFunctionDecl_getType(self: *const ZigClangFunctionDecl) struct_ZigClangQualType; pub extern fn ZigClangFunctionDecl_getLocation(self: *const ZigClangFunctionDecl) struct_ZigClangSourceLocation; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 6b70dfacf3..a3552cd188 100644 --- a/src-self-hosted/translate_c.zig +++ b/src-self-hosted/translate_c.zig @@ -369,9 +369,11 @@ fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompo }; } -fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) !TransResult { +fn transDeclStmt(rp: RestorePoint, parent_scope: *Scope, stmt: *const ZigClangDeclStmt) !TransResult { const c = rp.c; - const block_scope = findBlockScope(scope); + const block_scope = findBlockScope(parent_scope); + var scope = parent_scope; + var it = ZigClangDeclStmt_decl_begin(stmt); const end_it = ZigClangDeclStmt_decl_end(stmt); while (it != end_it) : (it += 1) { @@ -385,23 +387,33 @@ fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) // else // try appendToken(c, .Keyword_threadlocal, "threadlocal"); const thread_local_token: ?ast.TokenIndex = null; - // TODO: - // const mut_token = if (ZigClangQualType_isConstQualified(qual_type)) - // try appendToken(c, .Keyword_const, "const") - // else - // try appendToken(c, .Keyword_var, "var"); - const mut_token = try appendToken(c, .Keyword_var, "var"); - const name_token = blk: { - const name = try c.str(ZigClangDecl_getName_bytes_begin( - @ptrCast(*const ZigClangDecl, var_decl), - )); - break :blk try appendToken(c, .Identifier, name); + const qual_type = ZigClangVarDecl_getType(var_decl); + const mut_token = if (ZigClangQualType_isConstQualified(qual_type)) + try appendToken(c, .Keyword_const, "const") + else + try appendToken(c, .Keyword_var, "var"); + const name_type = struct { + str: []const u8, + token: ast.TokenIndex, }; + const c_name = try c.str(ZigClangDecl_getName_bytes_begin( + @ptrCast(*const ZigClangDecl, var_decl), + )); + const name_token = try appendToken(c, .Identifier, c_name); const eq_token = try appendToken(c, .Equal, "="); - // TODO: init_node + // TODO: + // const init_node = ZigClangVarDecl_getInit(); const init_node: ?*ast.Node = null; const semicolon_token = try appendToken(c, .Semicolon, ";"); + const var_scope = try c.a().create(Scope.Var); + var_scope.* = Scope.Var{ + .base = Scope{ .id = .Var, .parent = parent_scope }, + .c_name = c_name, + .zig_name = c_name, // TODO: getWantedName + }; + scope = &var_scope.base; + const node = try rp.c.a().create(ast.Node.VarDecl); node.* = ast.Node.VarDecl{ .base = ast.Node{ .id = .VarDecl }, diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 9fca49e777..1933725b16 100644 --- a/src/zig_clang.cpp +++ b/src/zig_clang.cpp @@ -1821,6 +1821,11 @@ void ZigClangASTUnit_delete(struct ZigClangASTUnit *self) { delete reinterpret_cast(self); } +struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->getType()); +} + enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) { auto casted = reinterpret_cast(self); return (ZigClangBuiltinTypeKind)casted->getKind(); diff --git a/src/zig_clang.h b/src/zig_clang.h index 7698de5aae..2312c975d7 100644 --- a/src/zig_clang.h +++ b/src/zig_clang.h @@ -753,6 +753,8 @@ ZIG_EXTERN_C struct ZigClangASTUnit *ZigClangLoadFromCommandLine(const char **ar ZIG_EXTERN_C void ZigClangASTUnit_delete(struct ZigClangASTUnit *); ZIG_EXTERN_C void ZigClangErrorMsg_delete(struct Stage2ErrorMsg *ptr, size_t len); +ZIG_EXTERN_C struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *); + ZIG_EXTERN_C struct ZigClangASTContext *ZigClangASTUnit_getASTContext(struct ZigClangASTUnit *); ZIG_EXTERN_C struct ZigClangSourceManager *ZigClangASTUnit_getSourceManager(struct ZigClangASTUnit *); ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,