From 413877b59de9a424de33d03d3b9bd1a2cb13f6e6 Mon Sep 17 00:00:00 2001 From: Christoffer Lerno Date: Wed, 25 Sep 2024 15:23:21 +0200 Subject: [PATCH] Allow `^` suffix for non-recursive imports #1480. --- releasenotes.md | 1 + src/compiler/compiler_internal.h | 3 ++- src/compiler/context.c | 4 ++-- src/compiler/parse_global.c | 3 ++- src/compiler/sema_name_resolution.c | 1 + test/test_suite/import/import_nonrecurse.c3 | 5 +++++ 6 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 test/test_suite/import/import_nonrecurse.c3 diff --git a/releasenotes.md b/releasenotes.md index 2668bad3a..52e88fa05 100644 --- a/releasenotes.md +++ b/releasenotes.md @@ -25,6 +25,7 @@ - Allow specifying an import module using `@wasm` #1305. - Deprecated inline generic types outside of struct definitions and macros unless marked `@adhoc`. - Improved method detection in earlier stages of checking. +- Allow `^` suffix for non-recursive imports #1480. ### Fixes - Issue where a lambda wasn't correctly registered as external. #1408 diff --git a/src/compiler/compiler_internal.h b/src/compiler/compiler_internal.h index 46d123eeb..34bcd5bba 100644 --- a/src/compiler/compiler_internal.h +++ b/src/compiler/compiler_internal.h @@ -353,6 +353,7 @@ typedef struct { Path *path; bool import_private_as_public; + bool is_non_recurse; Module *module; } ImportDecl; @@ -2133,7 +2134,7 @@ CompilationUnit * unit_create(File *file); void unit_register_global_decl(CompilationUnit *unit, Decl *decl); void unit_register_external_symbol(SemaContext *context, Decl *decl); -bool unit_add_import(CompilationUnit *unit, Path *path, bool private_import); +bool unit_add_import(CompilationUnit *unit, Path *path, bool private_import, bool is_non_recursive); bool context_set_module_from_filename(ParseContext *context); bool context_set_module(ParseContext *context, Path *path, const char **generic_parameters); bool context_is_macro(SemaContext *context); diff --git a/src/compiler/context.c b/src/compiler/context.c index 8c39765b7..22e289da1 100644 --- a/src/compiler/context.c +++ b/src/compiler/context.c @@ -270,7 +270,7 @@ void unit_register_global_decl(CompilationUnit *unit, Decl *decl) } -bool unit_add_import(CompilationUnit *unit, Path *path, bool private_import) +bool unit_add_import(CompilationUnit *unit, Path *path, bool private_import, bool is_non_recursive) { DEBUG_LOG("SEMA: Add import of '%s'.", path->module); @@ -281,7 +281,7 @@ bool unit_add_import(CompilationUnit *unit, Path *path, bool private_import) import->decl_kind = DECL_IMPORT; import->import.path = path; import->import.import_private_as_public = private_import; - + import->import.is_non_recurse = is_non_recursive; vec_add(unit->imports, import); DEBUG_LOG("Added import %s", path->module); return true; diff --git a/src/compiler/parse_global.c b/src/compiler/parse_global.c index 811944652..bdfb18ca5 100644 --- a/src/compiler/parse_global.c +++ b/src/compiler/parse_global.c @@ -2388,6 +2388,7 @@ static inline bool parse_import(ParseContext *c) is_not_first = true; Path *path = parse_module_path(c); if (!path) return false; + bool is_nonrecurse = try_consume(c, TOKEN_BIT_XOR); bool private = false; if (tok_is(c, TOKEN_AT_IDENT)) { @@ -2399,7 +2400,7 @@ static inline bool parse_import(ParseContext *c) private = true; advance_and_verify(c, TOKEN_AT_IDENT); } - unit_add_import(c->unit, path, private); + unit_add_import(c->unit, path, private, is_nonrecurse); if (tok_is(c, TOKEN_COLON) && peek(c) == TOKEN_IDENT) { PRINT_ERROR_HERE("'::' was expected here, did you make a mistake?"); diff --git a/src/compiler/sema_name_resolution.c b/src/compiler/sema_name_resolution.c index a2d23c3ad..7c24da00d 100644 --- a/src/compiler/sema_name_resolution.c +++ b/src/compiler/sema_name_resolution.c @@ -235,6 +235,7 @@ static bool decl_is_visible(CompilationUnit *unit, Decl *decl) { Module *import_module = import->import.module; if (import_module == module) return true; + if (import->import.is_non_recurse) continue; if (module_inclusion_match(import_module, module)) return true; } return false; diff --git a/test/test_suite/import/import_nonrecurse.c3 b/test/test_suite/import/import_nonrecurse.c3 new file mode 100644 index 000000000..b373d7553 --- /dev/null +++ b/test/test_suite/import/import_nonrecurse.c3 @@ -0,0 +1,5 @@ +import std::io^; +fn void main() +{ + (void)file::open("test", "r"); // #error: std::io::file::open +} \ No newline at end of file