| ... | @@ -5062,12 +5062,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast | ... | @@ -5062,12 +5062,20 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 5062 | case NodeTypeFnProto: | 5062 | case NodeTypeFnProto: |
| 5063 | { | 5063 | { |
| 5064 | // if the name is missing, we immediately announce an error | 5064 | // if the name is missing, we immediately announce an error |
| 5065 | Buf *name = &node->data.fn_proto.name; | 5065 | Buf *fn_name = &node->data.fn_proto.name; |
| 5066 | if (buf_len(name) == 0) { | 5066 | if (buf_len(fn_name) == 0) { |
| 5067 | node->data.fn_proto.skip = true; | 5067 | node->data.fn_proto.skip = true; |
| 5068 | add_node_error(g, node, buf_sprintf("missing function name")); | 5068 | add_node_error(g, node, buf_sprintf("missing function name")); |
| 5069 | break; | 5069 | break; |
| 5070 | } | 5070 | } |
| | 5071 | Buf *qualified_name; |
| | 5072 | AstNode *struct_node = node->data.fn_proto.struct_node; |
| | 5073 | if (struct_node) { |
| | 5074 | Buf *struct_name = &struct_node->data.struct_decl.name; |
| | 5075 | qualified_name = buf_sprintf("%s.%s", buf_ptr(struct_name), buf_ptr(fn_name)); |
| | 5076 | } else { |
| | 5077 | qualified_name = fn_name; |
| | 5078 | } |
| 5071 | | 5079 | |
| 5072 | | 5080 | |
| 5073 | // determine which other top level declarations this function prototype depends on. | 5081 | // determine which other top level declarations this function prototype depends on. |
| ... | @@ -5076,14 +5084,14 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast | ... | @@ -5076,14 +5084,14 @@ static void detect_top_level_decl_deps(CodeGen *g, ImportTableEntry *import, Ast |
| 5076 | | 5084 | |
| 5077 | collect_expr_decl_deps(g, import, node, decl_node); | 5085 | collect_expr_decl_deps(g, import, node, decl_node); |
| 5078 | | 5086 | |
| 5079 | decl_node->name = name; | 5087 | decl_node->name = qualified_name; |
| 5080 | decl_node->import = import; | 5088 | decl_node->import = import; |
| 5081 | if (decl_node->deps.size() > 0) { | 5089 | if (decl_node->deps.size() > 0) { |
| 5082 | if (g->unresolved_top_level_decls.maybe_get(name)) { | 5090 | if (g->unresolved_top_level_decls.maybe_get(qualified_name)) { |
| 5083 | node->data.fn_proto.skip = true; | 5091 | node->data.fn_proto.skip = true; |
| 5084 | add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(name))); | 5092 | add_node_error(g, node, buf_sprintf("redefinition of '%s'", buf_ptr(fn_name))); |
| 5085 | } else { | 5093 | } else { |
| 5086 | g->unresolved_top_level_decls.put(name, node); | 5094 | g->unresolved_top_level_decls.put(qualified_name, node); |
| 5087 | } | 5095 | } |
| 5088 | } else { | 5096 | } else { |
| 5089 | resolve_top_level_decl(g, import, node); | 5097 | resolve_top_level_decl(g, import, node); |