diff --git a/test_programs/compile_success_empty/nargo_expand_references/Nargo.toml b/test_programs/compile_success_empty/nargo_expand_references/Nargo.toml new file mode 100644 index 00000000000..87c0d0d61d7 --- /dev/null +++ b/test_programs/compile_success_empty/nargo_expand_references/Nargo.toml @@ -0,0 +1,6 @@ +[package] +name = "nargo_expand_references" +type = "bin" +authors = [""] + +[dependencies] diff --git a/test_programs/compile_success_empty/nargo_expand_references/src/main.nr b/test_programs/compile_success_empty/nargo_expand_references/src/main.nr new file mode 100644 index 00000000000..17938cd668c --- /dev/null +++ b/test_programs/compile_success_empty/nargo_expand_references/src/main.nr @@ -0,0 +1,41 @@ +mod foo { + mod bar { + pub mod baz { + pub fn func() {} + + pub mod qux { + pub fn func() {} + } + + mod one { + pub mod two { + pub fn func() {} + } + } + + pub use one::two; + } + } + + pub use bar::baz; +} + +mod test { + mod nested { + use super::utils; + + pub fn use_utils() { + utils::func() + } + } + + mod utils { + pub fn func() {} + } +} + +fn main() { + foo::baz::func(); + foo::baz::qux::func(); + foo::baz::two::func(); +} diff --git a/tooling/nargo_cli/src/cli/expand_cmd/printer.rs b/tooling/nargo_cli/src/cli/expand_cmd/printer.rs index 5a7721f6ae1..7e9b49d7654 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd/printer.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd/printer.rs @@ -15,7 +15,10 @@ use noirc_frontend::{ stmt::{HirLetStatement, HirPattern}, traits::{ResolvedTraitBound, TraitConstraint}, }, - modules::{module_def_id_is_visible, module_def_id_to_reference_id, relative_module_full_path}, + modules::{ + get_parent_module, module_def_id_is_visible, module_def_id_to_reference_id, + relative_module_full_path, + }, node_interner::{FuncId, GlobalId, GlobalValue, NodeInterner, ReferenceId, TypeAliasId}, shared::Visibility, token::{FunctionAttributeKind, LocatedToken, SecondaryAttribute, SecondaryAttributeKind}, @@ -945,8 +948,8 @@ impl<'context, 'string> ItemPrinter<'context, 'string> { self.show_item_visibility(import.visibility); self.push_str("use "); let use_import = false; - let name = - self.show_reference_to_module_def_id(import.id, import.visibility, use_import); + let visibility = self.module_def_id_visibility(import.id); + let name = self.show_reference_to_module_def_id(import.id, visibility, use_import); if name != import.name.as_str() { self.push_str(" as "); @@ -1037,6 +1040,15 @@ impl<'context, 'string> ItemPrinter<'context, 'string> { } let current_module_parent_id = self.module_id.parent(self.def_maps); + + // Check if module_def_id is the current module's parent + if let ModuleDefId::ModuleId(module_id) = module_def_id { + if current_module_parent_id == Some(module_id) { + self.push_str("super"); + return "super".to_string(); + } + } + let mut reexport = None; let is_visible = module_def_id_is_visible( @@ -1050,6 +1062,26 @@ impl<'context, 'string> ItemPrinter<'context, 'string> { ); if !is_visible { reexport = self.interner.get_reexports(module_def_id).first(); + + // If we can't find a reexport for the main item, check if the parent module + // has a reexport, then use the item through that reexported module + if reexport.is_none() { + if let Some(module_def_id_parent_module) = + get_parent_module(self.interner, module_def_id) + { + let module_def_id_parent = ModuleDefId::ModuleId(module_def_id_parent_module); + let visibility = self.module_def_id_visibility(module_def_id_parent); + self.show_reference_to_module_def_id( + module_def_id_parent, + visibility, + use_import, + ); + self.push_str("::"); + let name = self.module_def_id_name(module_def_id); + self.push_str(&name); + return name; + } + } } if let Some(reexport) = reexport { @@ -1127,7 +1159,8 @@ impl<'context, 'string> ItemPrinter<'context, 'string> { ModuleDefId::ModuleId(module_id) => { let attributes = self.interner.try_module_attributes(&module_id); let name = attributes.map(|attributes| &attributes.name); - name.cloned().expect("All modules should have a name") + // A module might not have a name if it's the root module of a crate + name.cloned().unwrap_or_else(|| "crate".to_string()) } ModuleDefId::FunctionId(func_id) => self.interner.function_name(&func_id).to_string(), ModuleDefId::TypeId(type_id) => { @@ -1151,6 +1184,34 @@ impl<'context, 'string> ItemPrinter<'context, 'string> { } } + fn module_def_id_visibility(&self, module_def_id: ModuleDefId) -> ItemVisibility { + match module_def_id { + ModuleDefId::ModuleId(module_id) => { + let attributes = self.interner.try_module_attributes(&module_id); + attributes.map_or(ItemVisibility::Private, |a| a.visibility) + } + ModuleDefId::FunctionId(func_id) => { + self.interner.function_modifiers(&func_id).visibility + } + ModuleDefId::TypeId(type_id) => { + let data_type = self.interner.get_type(type_id); + data_type.borrow().visibility + } + ModuleDefId::TypeAliasId(type_alias_id) => { + let type_alias = self.interner.get_type_alias(type_alias_id); + type_alias.borrow().visibility + } + ModuleDefId::TraitId(trait_id) => { + let trait_ = self.interner.get_trait(trait_id); + trait_.visibility + } + ModuleDefId::GlobalId(global_id) => { + let global_info = self.interner.get_global(global_id); + global_info.visibility + } + } + } + fn show_separated_by_comma(&mut self, items: &[Item], f: F) where F: Fn(&mut Self, &Item), diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__expanded.snap new file mode 100644 index 00000000000..6031c7f92a3 --- /dev/null +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__expanded.snap @@ -0,0 +1,45 @@ +--- +source: tooling/nargo_cli/tests/execute.rs +expression: expanded_code +--- +mod foo { + pub use bar::baz; + + mod bar { + pub mod baz { + pub use one::two; + + pub fn func() {} + + pub mod qux { + pub fn func() {} + } + + mod one { + pub mod two { + pub fn func() {} + } + } + } + } +} + +mod test { + mod nested { + use super::utils; + + pub fn use_utils() { + super::utils::func() + } + } + + mod utils { + pub fn func() {} + } +} + +fn main() { + foo::baz::func(); + foo::baz::qux::func(); + foo::baz::two::func(); +} diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__force_brillig_false_inliner_0.snap new file mode 100644 index 00000000000..7de940827c8 --- /dev/null +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/nargo_expand_references/execute__tests__force_brillig_false_inliner_0.snap @@ -0,0 +1,26 @@ +--- +source: tooling/nargo_cli/tests/execute.rs +expression: artifact +--- +{ + "noir_version": "[noir_version]", + "hash": "[hash]", + "abi": { + "parameters": [], + "return_type": null, + "error_types": {} + }, + "bytecode": [ + "func 0", + "current witness index : _0", + "private parameters indices : []", + "public parameters indices : []", + "return value indices : []" + ], + "debug_symbols": "XY5BCsQwCEXv4rqLWfcqw1BsaosgJtikMITefWyYQOlK/3/6tcJCc9km1jXuML4rzMYivE0SA2aO6m49B+hyykbkFty4byU00gyjFpEBDpTShvaE2mpGc/oagHTx6oErC13d+XGBge158UBjnIX+ci0abjR/Uyf942Qx0FKMrqTGPPsH", + "file_map": {}, + "names": [ + "main" + ], + "brillig_names": [] +} diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/vectors/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/vectors/execute__tests__expanded.snap index caf25a1efbe..055897068d6 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/vectors/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/vectors/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::prelude::Vec; +use std::collections::vec::Vec; fn main(x: Field, y: pub Field) { let mut vector: Vec = Vec::new(); diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_warns_on_use_of_private_exported_item/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_warns_on_use_of_private_exported_item/execute__tests__expanded.snap index e30ea5dc4b1..40e11768a16 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_warns_on_use_of_private_exported_item/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_warns_on_use_of_private_exported_item/execute__tests__expanded.snap @@ -15,5 +15,5 @@ mod foo { } fn main() { - foo::bar::baz(); + crate::foo::bar::baz(); } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_if_trying_to_access_public_function_inside_private_module/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_if_trying_to_access_public_function_inside_private_module/execute__tests__expanded.snap index 32df97549ef..09ec72e180b 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_if_trying_to_access_public_function_inside_private_module/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_if_trying_to_access_public_function_inside_private_module/execute__tests__expanded.snap @@ -9,5 +9,5 @@ mod foo { } fn main() { - foo::bar::baz() + crate::foo::bar::baz() } diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_once_on_unused_import_that_is_not_accessible/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_once_on_unused_import_that_is_not_accessible/execute__tests__expanded.snap index 59191070003..a5ab91d1ef8 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_once_on_unused_import_that_is_not_accessible/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_visibility_errors_once_on_unused_import_that_is_not_accessible/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use moo::Foo; +use crate::moo::Foo; mod moo { struct Foo {} diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/prelude/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/prelude/execute__tests__expanded.snap index 3b02c4f9eff..8434682df60 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/prelude/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/prelude/execute__tests__expanded.snap @@ -10,7 +10,7 @@ fn main() { } mod a { - use std::prelude::{Option, Vec}; + use std::{collections::vec::Vec, option::Option}; fn main() { let _xs: Vec<_> = Vec::new(); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4124/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4124/execute__tests__expanded.snap index 0a5d407cf84..2ee5a2f52a2 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4124/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4124/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::prelude::Option; +use std::option::Option; trait MyDeserialize { fn deserialize(fields: [Field; N]) -> Self;