var decl: mut_token, create child scope

This commit is contained in:
hryx 2019-05-26 16:51:25 -07:00
parent fceedada5c
commit 99f0b28d39
No known key found for this signature in database
GPG Key ID: 6A2784E15D7D95D6
4 changed files with 34 additions and 14 deletions

View File

@ -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;

View File

@ -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 },

View File

@ -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();

View File

@ -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,