mirror of
https://github.com/ziglang/zig.git
synced 2026-02-21 16:54:52 +00:00
WIP translate var decl
This commit is contained in:
parent
21ed939117
commit
fceedada5c
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user