authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-28 15:54:09-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-02-28 15:54:09-05:00
logfaf76032f136c33e951b2c2ad85bcd4536e7dd75
tree9e0e4f4592de36fda0b934ba2ad75535a87b64c6
parent02f3a834b014da10e487cb3150120c0dc0a4c119
signature Commit is signed but in an unrecognized format.

fix "use" decls


2 files changed, 21 insertions(+), 27 deletions(-)

src/all_types.hpp+1-1
...@@ -698,7 +698,7 @@ struct AstNodeUse {...@@ -698,7 +698,7 @@ struct AstNodeUse {
698 AstNode *expr;698 AstNode *expr;
699699
700 TldResolution resolution;700 TldResolution resolution;
701 ConstExprValue *value;701 ConstExprValue *using_namespace_value;
702};702};
703703
704struct AstNodeIfBoolExpr {704struct AstNodeIfBoolExpr {
src/analyze.cpp+20-26
...@@ -3575,8 +3575,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {...@@ -3575,8 +3575,7 @@ void scan_decls(CodeGen *g, ScopeDecls *decls_scope, AstNode *node) {
3575 case NodeTypeUse:3575 case NodeTypeUse:
3576 {3576 {
3577 g->use_queue.append(node);3577 g->use_queue.append(node);
3578 ZigType *import = get_scope_import(&decls_scope->base);3578 decls_scope->use_decls.append(node);
3579 get_container_scope(import)->use_decls.append(node);
3580 break;3579 break;
3581 }3580 }
3582 case NodeTypeTestDecl:3581 case NodeTypeTestDecl:
...@@ -3900,19 +3899,19 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node) {...@@ -3900,19 +3899,19 @@ void resolve_top_level_decl(CodeGen *g, Tld *tld, AstNode *source_node) {
3900}3899}
39013900
3902Tld *find_decl(CodeGen *g, Scope *scope, Buf *name) {3901Tld *find_decl(CodeGen *g, Scope *scope, Buf *name) {
3903 // we must resolve all the use decls
3904 ZigType *import = get_scope_import(scope);
3905 for (size_t i = 0; i < get_container_scope(import)->use_decls.length; i += 1) {
3906 AstNode *use_decl_node = get_container_scope(import)->use_decls.at(i);
3907 if (use_decl_node->data.use.resolution == TldResolutionUnresolved) {
3908 preview_use_decl(g, use_decl_node);
3909 resolve_use_decl(g, use_decl_node);
3910 }
3911 }
3912
3913 while (scope) {3902 while (scope) {
3914 if (scope->id == ScopeIdDecls) {3903 if (scope->id == ScopeIdDecls) {
3915 ScopeDecls *decls_scope = (ScopeDecls *)scope;3904 ScopeDecls *decls_scope = (ScopeDecls *)scope;
3905
3906 // resolve all the use decls
3907 for (size_t i = 0; i < decls_scope->use_decls.length; i += 1) {
3908 AstNode *use_decl_node = decls_scope->use_decls.at(i);
3909 if (use_decl_node->data.use.resolution == TldResolutionUnresolved) {
3910 preview_use_decl(g, use_decl_node);
3911 resolve_use_decl(g, use_decl_node);
3912 }
3913 }
3914
3916 auto entry = decls_scope->decl_table.maybe_get(name);3915 auto entry = decls_scope->decl_table.maybe_get(name);
3917 if (entry)3916 if (entry)
3918 return entry->value;3917 return entry->value;
...@@ -4353,7 +4352,7 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *...@@ -4353,7 +4352,7 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *
4353 preview_use_decl(g, src_use_node);4352 preview_use_decl(g, src_use_node);
4354 }4353 }
43554354
4356 ConstExprValue *use_target_value = src_use_node->data.use.value;4355 ConstExprValue *use_target_value = src_use_node->data.use.using_namespace_value;
4357 if (type_is_invalid(use_target_value->type)) {4356 if (type_is_invalid(use_target_value->type)) {
4358 get_container_scope(dst_use_node->owner)->any_imports_failed = true;4357 get_container_scope(dst_use_node->owner)->any_imports_failed = true;
4359 return;4358 return;
...@@ -4365,7 +4364,6 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *...@@ -4365,7 +4364,6 @@ static void add_symbols_from_import(CodeGen *g, AstNode *src_use_node, AstNode *
43654364
4366 ZigType *target_import = use_target_value->data.x_type;4365 ZigType *target_import = use_target_value->data.x_type;
4367 assert(target_import);4366 assert(target_import);
4368 assert(target_import->id == ZigTypeIdStruct);
43694367
4370 if (get_container_scope(target_import)->any_imports_failed) {4368 if (get_container_scope(target_import)->any_imports_failed) {
4371 get_container_scope(dst_use_node->owner)->any_imports_failed = true;4369 get_container_scope(dst_use_node->owner)->any_imports_failed = true;
...@@ -4433,7 +4431,7 @@ void preview_use_decl(CodeGen *g, AstNode *node) {...@@ -4433,7 +4431,7 @@ void preview_use_decl(CodeGen *g, AstNode *node) {
4433 if (type_is_invalid(result->type))4431 if (type_is_invalid(result->type))
4434 get_container_scope(node->owner)->any_imports_failed = true;4432 get_container_scope(node->owner)->any_imports_failed = true;
44354433
4436 node->data.use.value = result;4434 node->data.use.using_namespace_value = result;
4437}4435}
44384436
4439ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Buf *source_code,4437ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Buf *source_code,
...@@ -4542,19 +4540,15 @@ ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Bu...@@ -4542,19 +4540,15 @@ ZigType *add_source_file(CodeGen *g, ZigPackage *package, Buf *resolved_path, Bu
4542}4540}
45434541
4544void semantic_analyze(CodeGen *g) {4542void semantic_analyze(CodeGen *g) {
4545 for (; g->use_queue_index < g->use_queue.length; g->use_queue_index += 1) {
4546 AstNode *use_decl_node = g->use_queue.at(g->use_queue_index);
4547 preview_use_decl(g, use_decl_node);
4548 }
4549
4550 for (size_t i = 0; i < g->use_queue.length; i += 1) {
4551 AstNode *use_decl_node = g->use_queue.at(i);
4552 resolve_use_decl(g, use_decl_node);
4553 }
4554
4555 while (g->resolve_queue_index < g->resolve_queue.length ||4543 while (g->resolve_queue_index < g->resolve_queue.length ||
4556 g->fn_defs_index < g->fn_defs.length)4544 g->fn_defs_index < g->fn_defs.length ||
4545 g->use_queue_index < g->use_queue.length)
4557 {4546 {
4547 for (; g->use_queue_index < g->use_queue.length; g->use_queue_index += 1) {
4548 AstNode *use_decl_node = g->use_queue.at(g->use_queue_index);
4549 preview_use_decl(g, use_decl_node);
4550 resolve_use_decl(g, use_decl_node);
4551 }
4558 for (; g->resolve_queue_index < g->resolve_queue.length; g->resolve_queue_index += 1) {4552 for (; g->resolve_queue_index < g->resolve_queue.length; g->resolve_queue_index += 1) {
4559 Tld *tld = g->resolve_queue.at(g->resolve_queue_index);4553 Tld *tld = g->resolve_queue.at(g->resolve_queue_index);
4560 AstNode *source_node = nullptr;4554 AstNode *source_node = nullptr;