From fceedada5c18ca5e9fa3ca14e74f6722eda85600 Mon Sep 17 00:00:00 2001 From: hryx Date: Sun, 26 May 2019 15:43:13 -0700 Subject: [PATCH] WIP translate var decl --- src-self-hosted/clang.zig | 5 +++ src-self-hosted/translate_c.zig | 79 +++++++++++++++++++++++++++++++++ src/zig_clang.cpp | 18 +++++++- src/zig_clang.h | 6 ++- 4 files changed, 106 insertions(+), 2 deletions(-) diff --git a/src-self-hosted/clang.zig b/src-self-hosted/clang.zig index 92fe7b7cd3..bb87589c01 100644 --- a/src-self-hosted/clang.zig +++ b/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; diff --git a/src-self-hosted/translate_c.zig b/src-self-hosted/translate_c.zig index 9f42f198b2..6b70dfacf3 100644 --- a/src-self-hosted/translate_c.zig +++ b/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); } diff --git a/src/zig_clang.cpp b/src/zig_clang.cpp index 28062ea69f..9fca49e777 100644 --- a/src/zig_clang.cpp +++ b/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(&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(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(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(self); + return bitcast(casted->decl_begin()); +} + +ZigClangDeclStmt_const_decl_iterator ZigClangDeclStmt_decl_end(const struct ZigClangDeclStmt *self) { + auto casted = reinterpret_cast(self); + return bitcast(casted->decl_end()); +} + unsigned ZigClangAPFloat_convertToHexString(const ZigClangAPFloat *self, char *DST, unsigned HexDigits, bool UpperCase, enum ZigClangAPFloat_roundingMode RM) { diff --git a/src/zig_clang.h b/src/zig_clang.h index 1bdf34fc2f..7698de5aae 100644 --- a/src/zig_clang.h +++ b/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);