diff --git a/releasenotes.md b/releasenotes.md index 872d9a7f3..4bf6df708 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -60,6 +60,7 @@ - Fix not freeing a zero length String - Macros with trailing bodys aren't allowed as the single statement after a while loop with no body #1772. - Deref subscripts as needed for macro ref method arguments. #1789 +- Change ordering to simplify adding methods to type in conditional modules. ### Stdlib changes - Increase BitWriter.write_bits limit up to 32 bits. diff --git a/src/compiler/enums.h b/src/compiler/enums.h index 900ed11df..6f1746eb6 100644 --- a/src/compiler/enums.h +++ b/src/compiler/enums.h @@ -46,13 +46,13 @@ typedef enum ANALYSIS_MODULE_TOP, ANALYSIS_IMPORTS, ANALYSIS_REGISTER_GLOBAL_DECLARATIONS, - ANALYSIS_METHODS_REGISTER, - ANALYSIS_METHODS_REGISTER_GENERIC, ANALYSIS_INCLUDES, - ANALYSIS_METHODS_INCLUDES, - ANALYSIS_METHODS_INCLUDES_GENERIC, ANALYSIS_REGISTER_CONDITIONAL_UNITS, ANALYSIS_REGISTER_CONDITIONAL_DECLARATIONS, + ANALYSIS_METHODS_REGISTER, + ANALYSIS_METHODS_REGISTER_GENERIC, + ANALYSIS_METHODS_INCLUDES, + ANALYSIS_METHODS_INCLUDES_GENERIC, ANALYSIS_METHODS_CONDITIONAL, ANALYSIS_METHODS_CONDITIONAL_GENERIC, ANALYSIS_POST_REGISTER, diff --git a/src/compiler/sema_types.c b/src/compiler/sema_types.c index 42666414e..19ba2cabb 100644 --- a/src/compiler/sema_types.c +++ b/src/compiler/sema_types.c @@ -374,7 +374,8 @@ bool sema_unresolved_type_is_generic(SemaContext *context, TypeInfo *type_info) if (type_info->resolve_status == RESOLVE_DONE) return false; if (type_info->kind != TYPE_INFO_IDENTIFIER) return false; if (type_info->subtype != TYPE_COMPRESSED_NONE) return false; - Decl *decl = sema_resolve_symbol(context, type_info->unresolved.name, type_info->unresolved.path, type_info->span); + Decl *decl = sema_find_path_symbol(context, type_info->unresolved.name, type_info->unresolved.path); + if (!decl) return false; if (decl->decl_kind != DECL_TYPEDEF) return false; if (decl->resolve_status == RESOLVE_DONE) return false; if (decl->typedef_decl.is_func) return false; diff --git a/src/compiler/semantic_analyser.c b/src/compiler/semantic_analyser.c index 229bdc6f1..5d17c5f70 100644 --- a/src/compiler/semantic_analyser.c +++ b/src/compiler/semantic_analyser.c @@ -158,27 +158,27 @@ void sema_analyze_stage(Module *module, AnalysisStage stage) case ANALYSIS_REGISTER_GLOBAL_DECLARATIONS: sema_analysis_pass_register_global_declarations(module); break; - case ANALYSIS_METHODS_REGISTER: - sema_analysis_pass_process_methods(module, false); - break; - case ANALYSIS_METHODS_REGISTER_GENERIC: - sema_analysis_pass_process_methods(module, true); - break; case ANALYSIS_INCLUDES: sema_analysis_pass_process_includes(module); break; - case ANALYSIS_METHODS_INCLUDES: - sema_analysis_pass_process_methods(module, false); - break; - case ANALYSIS_METHODS_INCLUDES_GENERIC: - sema_analysis_pass_process_methods(module, true); - break; case ANALYSIS_REGISTER_CONDITIONAL_UNITS: sema_analysis_pass_register_conditional_units(module); break; case ANALYSIS_REGISTER_CONDITIONAL_DECLARATIONS: sema_analysis_pass_register_conditional_declarations(module); break; + case ANALYSIS_METHODS_REGISTER: + sema_analysis_pass_process_methods(module, false); + break; + case ANALYSIS_METHODS_REGISTER_GENERIC: + sema_analysis_pass_process_methods(module, true); + break; + case ANALYSIS_METHODS_INCLUDES: + sema_analysis_pass_process_methods(module, false); + break; + case ANALYSIS_METHODS_INCLUDES_GENERIC: + sema_analysis_pass_process_methods(module, true); + break; case ANALYSIS_METHODS_CONDITIONAL: sema_analysis_pass_process_methods(module, false); break; diff --git a/test/test_suite/methods/method_extension_in_conditional_module.c3 b/test/test_suite/methods/method_extension_in_conditional_module.c3 new file mode 100644 index 000000000..eeb28d603 --- /dev/null +++ b/test/test_suite/methods/method_extension_in_conditional_module.c3 @@ -0,0 +1,15 @@ +module std::core::env; +const bool FOO = true; + +module foo @if(env::FOO); +struct Foo { int a; } + +module bar; +import std, foo; + +fn void Foo.baz(self) {} + +fn int main() +{ + return 0; +}