Commit 99f0b28d39

hryx <codroid@gmail.com>
2019-05-27 01:51:25
var decl: mut_token, create child scope
1 parent fceedad
Changed files (4)
src/zig_clang.cpp
@@ -1821,6 +1821,11 @@ void ZigClangASTUnit_delete(struct ZigClangASTUnit *self) {
     delete reinterpret_cast<clang::ASTUnit *>(self);
 }
 
+struct ZigClangQualType ZigClangVarDecl_getType(const struct ZigClangVarDecl *self) {
+    auto casted = reinterpret_cast<const clang::VarDecl *>(self);
+    return bitcast(casted->getType());
+}
+
 enum ZigClangBuiltinTypeKind ZigClangBuiltinType_getKind(const struct ZigClangBuiltinType *self) {
     auto casted = reinterpret_cast<const clang::BuiltinType *>(self);
     return (ZigClangBuiltinTypeKind)casted->getKind();
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,
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;
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 },