Commit fceedada5c

hryx <codroid@gmail.com>
2019-05-27 00:43:13
WIP translate var decl
1 parent 21ed939
Changed files (4)
src/zig_clang.cpp
@@ -1331,6 +1331,12 @@ static ZigClangCompoundStmt_const_body_iterator bitcast(clang::CompoundStmt::con
     return dest;
 }
 
+static_assert(sizeof(ZigClangDeclStmt_const_decl_iterator) == sizeof(clang::DeclStmt::const_decl_iterator), "");
+static ZigClangDeclStmt_const_decl_iterator bitcast(clang::DeclStmt::const_decl_iterator src) {
+    ZigClangDeclStmt_const_decl_iterator dest;
+    memcpy(&dest, static_cast<void *>(&src), sizeof(ZigClangDeclStmt_const_decl_iterator));
+    return dest;
+}
 
 ZigClangSourceLocation ZigClangSourceManager_getSpellingLoc(const ZigClangSourceManager *self,
         ZigClangSourceLocation Loc)
@@ -1381,7 +1387,7 @@ ZigClangSourceManager *ZigClangASTUnit_getSourceManager(ZigClangASTUnit *self) {
     return reinterpret_cast<ZigClangSourceManager *>(result);
 }
 
-bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *context, 
+bool ZigClangASTUnit_visitLocalTopLevelDecls(ZigClangASTUnit *self, void *context,
     bool (*Fn)(void *context, const ZigClangDecl *decl))
 {
     return reinterpret_cast<clang::ASTUnit *>(self)->visitLocalTopLevelDecls(context,
@@ -1862,6 +1868,16 @@ ZigClangCompoundStmt_const_body_iterator ZigClangCompoundStmt_body_end(const str
     return bitcast(casted->body_end());
 }
 
+ZigClangDeclStmt_const_decl_iterator ZigClangDeclStmt_decl_begin(const struct ZigClangDeclStmt *self) {
+    auto casted = reinterpret_cast<const clang::DeclStmt *>(self);
+    return bitcast(casted->decl_begin());
+}
+
+ZigClangDeclStmt_const_decl_iterator ZigClangDeclStmt_decl_end(const struct ZigClangDeclStmt *self) {
+    auto casted = reinterpret_cast<const clang::DeclStmt *>(self);
+    return bitcast(casted->decl_end());
+}
+
 unsigned ZigClangAPFloat_convertToHexString(const ZigClangAPFloat *self, char *DST,
         unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM)
 {
src/zig_clang.h
@@ -105,6 +105,7 @@ struct ZigClangFunctionType;
 struct ZigClangPredefinedExpr;
 
 typedef struct ZigClangStmt *const * ZigClangCompoundStmt_const_body_iterator;
+typedef struct ZigClangDecl *const * ZigClangDeclStmt_const_decl_iterator;
 
 enum ZigClangBO {
     ZigClangBO_PtrMemD,
@@ -754,7 +755,7 @@ ZIG_EXTERN_C void ZigClangErrorMsg_delete(struct Stage2ErrorMsg *ptr, size_t len
 
 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, 
+ZIG_EXTERN_C bool ZigClangASTUnit_visitLocalTopLevelDecls(struct ZigClangASTUnit *, void *context,
     bool (*Fn)(void *context, const struct ZigClangDecl *decl));
 
 ZIG_EXTERN_C const struct ZigClangRecordDecl *ZigClangRecordType_getDecl(const struct ZigClangRecordType *record_ty);
@@ -846,6 +847,9 @@ ZIG_EXTERN_C struct ZigClangQualType ZigClangFunctionProtoType_getParamType(cons
 ZIG_EXTERN_C ZigClangCompoundStmt_const_body_iterator ZigClangCompoundStmt_body_begin(const struct ZigClangCompoundStmt *self);
 ZIG_EXTERN_C ZigClangCompoundStmt_const_body_iterator ZigClangCompoundStmt_body_end(const struct ZigClangCompoundStmt *self);
 
+ZIG_EXTERN_C ZigClangDeclStmt_const_decl_iterator ZigClangDeclStmt_decl_begin(const struct ZigClangDeclStmt *self);
+ZIG_EXTERN_C ZigClangDeclStmt_const_decl_iterator ZigClangDeclStmt_decl_end(const struct ZigClangDeclStmt *self);
+
 ZIG_EXTERN_C unsigned ZigClangAPFloat_convertToHexString(const struct ZigClangAPFloat *self, char *DST,
         unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM);
 
src-self-hosted/clang.zig
@@ -864,3 +864,8 @@ pub const ZigClangCompoundStmt_const_body_iterator = [*c]const *struct_ZigClangS
 
 pub extern fn ZigClangCompoundStmt_body_begin(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
 pub extern fn ZigClangCompoundStmt_body_end(self: *const ZigClangCompoundStmt) ZigClangCompoundStmt_const_body_iterator;
+
+pub const ZigClangDeclStmt_const_decl_iterator = [*c]const *struct_ZigClangDecl;
+
+pub extern fn ZigClangDeclStmt_decl_begin(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
+pub extern fn ZigClangDeclStmt_decl_end(self: *const ZigClangDeclStmt) ZigClangDeclStmt_const_decl_iterator;
src-self-hosted/translate_c.zig
@@ -323,6 +323,7 @@ fn transStmt(
     const sc = ZigClangStmt_getStmtClass(stmt);
     switch (sc) {
         .CompoundStmtClass => return transCompoundStmt(rp, scope, @ptrCast(*const ZigClangCompoundStmt, stmt)),
+        .DeclStmtClass => return transDeclStmt(rp, scope, @ptrCast(*const ZigClangDeclStmt, stmt)),
         else => {
             return revertAndWarn(
                 rp,
@@ -368,6 +369,84 @@ fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompo
     };
 }
 
+fn transDeclStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangDeclStmt) !TransResult {
+    const c = rp.c;
+    const block_scope = findBlockScope(scope);
+    var it = ZigClangDeclStmt_decl_begin(stmt);
+    const end_it = ZigClangDeclStmt_decl_end(stmt);
+    while (it != end_it) : (it += 1) {
+        switch (ZigClangDecl_getKind(it.*)) {
+            .Var => {
+                const var_decl = @ptrCast(*const ZigClangVarDecl, it.*);
+
+                // TODO:
+                // const thread_local_token = if (ZigClangVarDecl_getTLSKind() == .None)
+                //     null
+                // 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 eq_token = try appendToken(c, .Equal, "=");
+                // TODO: init_node
+                const init_node: ?*ast.Node = null;
+                const semicolon_token = try appendToken(c, .Semicolon, ";");
+
+                const node = try rp.c.a().create(ast.Node.VarDecl);
+                node.* = ast.Node.VarDecl{
+                    .base = ast.Node{ .id = .VarDecl },
+                    .doc_comments = null,
+                    .visib_token = null,
+                    .thread_local_token = thread_local_token,
+                    .name_token = name_token,
+                    .eq_token = eq_token,
+                    .mut_token = mut_token,
+                    .comptime_token = null, // TODO IsConstexpr ?
+                    .extern_export_token = null, // TODO ?TokenIndex,
+                    .lib_name = null, // TODO ?*Node,
+                    .type_node = null, // TODO ?*Node,
+                    .align_node = null, // TODO ?*Node,
+                    .section_node = null, // TODO ?*Node,
+                    .init_node = init_node,
+                    .semicolon_token = semicolon_token,
+                };
+                try block_scope.block_node.statements.push(&node.base);
+            },
+
+            else => |kind| return revertAndWarn(
+                rp,
+                error.UnsupportedTranslation,
+                ZigClangStmt_getBeginLoc(@ptrCast(*const ZigClangStmt, stmt)),
+                "TODO implement translation of DeclStmt kind {}",
+                @tagName(kind),
+            ),
+        }
+    }
+
+    return TransResult{
+        .node = &block_scope.block_node.base,
+        .node_scope = scope,
+        .child_scope = scope,
+    };
+}
+
+fn findBlockScope(inner: *Scope) *Scope.Block {
+    var scope = inner;
+    while (true) : (scope = scope.parent orelse unreachable) {
+        if (scope.id == .Block) return @fieldParentPtr(Scope.Block, "base", scope);
+    }
+}
+
 fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
     try c.tree.root_node.decls.push(decl_node);
 }