diff --git a/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs b/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs index 29002902bd0..afa13f5e792 100644 --- a/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs +++ b/compiler/noirc_evaluator/src/ssa/opt/flatten_cfg.rs @@ -1008,7 +1008,7 @@ impl<'f> Context<'f> { #[cfg(test)] mod test { - use acvm::{FieldElement, acir::AcirField}; + use acvm::acir::AcirField; use crate::{ assert_ssa_snapshot, @@ -1019,7 +1019,6 @@ mod test { instruction::{Instruction, TerminatorInstruction}, value::{Value, ValueId}, }, - opt::flatten_cfg::Context, }, }; @@ -1754,6 +1753,9 @@ mod test { #[test] #[cfg(feature = "bn254")] fn test_grumpkin_points() { + use crate::ssa::opt::flatten_cfg::Context; + use acvm::acir::FieldElement; + let generators = Context::grumpkin_generators(); let len = generators.len(); for i in (0..len).step_by(2) { diff --git a/compiler/noirc_frontend/src/elaborator/enums.rs b/compiler/noirc_frontend/src/elaborator/enums.rs index 27a647920ae..b299463ddf1 100644 --- a/compiler/noirc_frontend/src/elaborator/enums.rs +++ b/compiler/noirc_frontend/src/elaborator/enums.rs @@ -168,6 +168,7 @@ impl Elaborator<'_> { Vec::new(), false, false, + ItemVisibility::Public, ); let mut typ = self_type.clone(); diff --git a/compiler/noirc_frontend/src/hir/comptime/interpreter/builtin/builtin_helpers.rs b/compiler/noirc_frontend/src/hir/comptime/interpreter/builtin/builtin_helpers.rs index ca5c597a238..85625135ed5 100644 --- a/compiler/noirc_frontend/src/hir/comptime/interpreter/builtin/builtin_helpers.rs +++ b/compiler/noirc_frontend/src/hir/comptime/interpreter/builtin/builtin_helpers.rs @@ -117,6 +117,7 @@ pub(crate) fn get_struct_fields( Ident::new(name.to_string(), location), location, Vec::new(), + ItemVisibility::Public, ); let expected = Type::DataType(Shared::new(expected), Vec::new()); type_mismatch(value, expected, location) diff --git a/compiler/noirc_frontend/src/hir/def_collector/dc_mod.rs b/compiler/noirc_frontend/src/hir/def_collector/dc_mod.rs index 4a2081dc423..0535da60f6d 100644 --- a/compiler/noirc_frontend/src/hir/def_collector/dc_mod.rs +++ b/compiler/noirc_frontend/src/hir/def_collector/dc_mod.rs @@ -609,6 +609,7 @@ impl ModCollector<'_> { vec![], false, false, + ItemVisibility::Public, ); if let Err((first_def, second_def)) = self.def_collector.def_map @@ -1131,7 +1132,17 @@ pub fn collect_struct( let span = unresolved.struct_def.location.span; let attributes = unresolved.struct_def.attributes.clone(); let local_id = module_id.local_id; - interner.new_type(name, span, attributes, resolved_generics, krate, local_id, file_id) + let visibility = unresolved.struct_def.visibility; + interner.new_type( + name, + span, + attributes, + resolved_generics, + visibility, + krate, + local_id, + file_id, + ) } Err(error) => { definition_errors.push(error.into()); @@ -1225,7 +1236,17 @@ pub fn collect_enum( let span = unresolved.enum_def.location.span; let attributes = unresolved.enum_def.attributes.clone(); let local_id = module_id.local_id; - interner.new_type(name, span, attributes, resolved_generics, krate, local_id, file_id) + let visibility = unresolved.enum_def.visibility; + interner.new_type( + name, + span, + attributes, + resolved_generics, + visibility, + krate, + local_id, + file_id, + ) } Err(error) => { definition_errors.push(error.into()); @@ -1475,6 +1496,7 @@ pub(crate) fn collect_global( global.attributes.clone(), matches!(global.pattern, Pattern::Mutable { .. }), global.comptime, + visibility, ); // Add the statement to the scope so its path can be looked up later diff --git a/compiler/noirc_frontend/src/hir_def/types.rs b/compiler/noirc_frontend/src/hir_def/types.rs index 74999f3708c..aa3264e307d 100644 --- a/compiler/noirc_frontend/src/hir_def/types.rs +++ b/compiler/noirc_frontend/src/hir_def/types.rs @@ -344,6 +344,7 @@ pub struct DataType { pub id: TypeId, pub name: Ident, + pub visibility: ItemVisibility, /// A type's body is private to force struct fields or enum variants to only be /// accessed through get_field(), get_fields(), instantiate(), or similar functions @@ -451,8 +452,14 @@ impl Ord for DataType { } impl DataType { - pub fn new(id: TypeId, name: Ident, location: Location, generics: Generics) -> DataType { - DataType { id, name, location, generics, body: TypeBody::None } + pub fn new( + id: TypeId, + name: Ident, + location: Location, + generics: Generics, + visibility: ItemVisibility, + ) -> DataType { + DataType { id, name, location, generics, body: TypeBody::None, visibility } } /// To account for cyclic references between structs, a struct's @@ -693,6 +700,7 @@ pub struct TypeAlias { pub id: TypeAliasId, pub typ: Type, pub generics: Generics, + pub visibility: ItemVisibility, pub location: Location, } @@ -733,8 +741,9 @@ impl TypeAlias { location: Location, typ: Type, generics: Generics, + visibility: ItemVisibility, ) -> TypeAlias { - TypeAlias { id, typ, name, location, generics } + TypeAlias { id, typ, name, location, generics, visibility } } pub fn set_type_and_generics(&mut self, new_typ: Type, new_generics: Generics) { diff --git a/compiler/noirc_frontend/src/modules.rs b/compiler/noirc_frontend/src/modules.rs index b5b76714b00..483446897a0 100644 --- a/compiler/noirc_frontend/src/modules.rs +++ b/compiler/noirc_frontend/src/modules.rs @@ -1,7 +1,12 @@ +use std::collections::BTreeMap; + use crate::{ - ast::Ident, + ast::{Ident, ItemVisibility}, graph::{CrateId, Dependency}, - hir::def_map::{ModuleDefId, ModuleId}, + hir::{ + def_map::{CrateDefMap, ModuleDefId, ModuleId}, + resolution::visibility::item_in_module_is_visible, + }, node_interner::{NodeInterner, ReferenceId}, }; @@ -209,3 +214,55 @@ pub fn module_def_id_relative_path( Some(path) } + +/// Returns true if the given ModuleDefId is visible from the current module, given its visibility. +/// +/// This will in turn check if the ModuleDefId parent modules are visible from the current module. +/// If `defining_module` is Some, it will be considered as the parent of the item to check +/// (this is the case when the item is re-exported with `pub use` or similar). +pub fn module_def_id_is_visible( + module_def_id: ModuleDefId, + current_module_id: ModuleId, + mut visibility: ItemVisibility, + mut defining_module: Option, + interner: &NodeInterner, + def_maps: &BTreeMap, + dependencies: &[Dependency], +) -> bool { + // First find out which module we need to check. + // If a module is trying to be referenced, it's that module. Otherwise it's the module that contains the item. + let mut target_module_id = if let ModuleDefId::ModuleId(module_id) = module_def_id { + Some(module_id) + } else { + std::mem::take(&mut defining_module).or_else(|| get_parent_module(interner, module_def_id)) + }; + + // Then check if it's visible, and upwards + while let Some(module_id) = target_module_id { + if !item_in_module_is_visible(def_maps, current_module_id, module_id, visibility) { + return false; + } + + // If the target module isn't in the same crate as `module_id` or isn't in one of its + // dependencies, then it's not visible. + if module_id.krate != current_module_id.krate + && dependencies.iter().all(|dep| dep.crate_id != module_id.krate) + { + return false; + } + + target_module_id = std::mem::take(&mut defining_module).or_else(|| { + let module_data = &def_maps[&module_id.krate][module_id.local_id]; + let parent_local_id = module_data.parent; + parent_local_id.map(|local_id| ModuleId { krate: module_id.krate, local_id }) + }); + + // This is a bit strange, but the visibility is always that of the item inside another module, + // so the visibility we update here is for the next loop check. + visibility = interner + .try_module_attributes(&module_id) + .map_or(ItemVisibility::Public, |attributes| attributes.visibility); + } + + true +} diff --git a/compiler/noirc_frontend/src/node_interner.rs b/compiler/noirc_frontend/src/node_interner.rs index b90431400fb..bd0debae8f9 100644 --- a/compiler/noirc_frontend/src/node_interner.rs +++ b/compiler/noirc_frontend/src/node_interner.rs @@ -277,7 +277,7 @@ pub struct NodeInterner { /// Only for LSP: a map of ModuleDefId to each module that pub or pub(crate) exports it. /// In LSP this is used to offer importing the item via one of these exports if /// the item is not visible where it's defined. - reexports: HashMap>, + pub reexports: HashMap>, } /// A dependency in the dependency graph may be a type or a definition. @@ -621,6 +621,7 @@ pub struct GlobalInfo { pub id: GlobalId, pub definition_id: DefinitionId, pub ident: Ident, + pub visibility: ItemVisibility, pub local_id: LocalModuleId, pub crate_id: CrateId, pub location: Location, @@ -799,6 +800,7 @@ impl NodeInterner { span: Span, attributes: Vec, generics: Generics, + visibility: ItemVisibility, krate: CrateId, local_id: LocalModuleId, file_id: FileId, @@ -806,7 +808,7 @@ impl NodeInterner { let type_id = TypeId(ModuleId { krate, local_id }); let location = Location::new(span, file_id); - let new_type = DataType::new(type_id, name, location, generics); + let new_type = DataType::new(type_id, name, location, generics, visibility); self.data_types.insert(type_id, Shared::new(new_type)); self.type_attributes.insert(type_id, attributes); type_id @@ -825,6 +827,7 @@ impl NodeInterner { typ.type_alias_def.location, Type::Error, generics, + typ.type_alias_def.visibility, ))); type_id @@ -900,6 +903,7 @@ impl NodeInterner { attributes: Vec, mutable: bool, comptime: bool, + visibility: ItemVisibility, ) -> GlobalId { let id = GlobalId(self.globals.len()); let location = Location::new(ident.span(), file); @@ -916,6 +920,7 @@ impl NodeInterner { crate_id, let_statement, location, + visibility, value: GlobalValue::Unresolved, }); self.global_attributes.insert(id, attributes); @@ -937,12 +942,14 @@ impl NodeInterner { attributes: Vec, mutable: bool, comptime: bool, + visibility: ItemVisibility, ) -> GlobalId { let statement = self.push_stmt(HirStatement::Error); let location = name.location(); - let id = self - .push_global(name, local_id, crate_id, statement, file, attributes, mutable, comptime); + let id = self.push_global( + name, local_id, crate_id, statement, file, attributes, mutable, comptime, visibility, + ); self.push_stmt_location(statement, location); id } diff --git a/tooling/lsp/src/lib.rs b/tooling/lsp/src/lib.rs index 598b8543491..f2faf55a087 100644 --- a/tooling/lsp/src/lib.rs +++ b/tooling/lsp/src/lib.rs @@ -73,7 +73,6 @@ mod trait_impl_method_stub_generator; mod types; mod use_segment_positions; mod utils; -mod visibility; mod with_file; #[cfg(test)] diff --git a/tooling/lsp/src/modules.rs b/tooling/lsp/src/modules.rs index 81d8d3f8eb1..c872fe40342 100644 --- a/tooling/lsp/src/modules.rs +++ b/tooling/lsp/src/modules.rs @@ -4,12 +4,10 @@ use noirc_frontend::{ ast::{Ident, ItemVisibility}, graph::{CrateId, Dependency}, hir::def_map::{CrateDefMap, ModuleDefId, ModuleId}, - modules::get_parent_module, + modules::{get_parent_module, module_def_id_is_visible}, node_interner::{NodeInterner, Reexport}, }; -use crate::visibility::module_def_id_is_visible; - /// Finds a visible reexport for any ancestor module of the given ModuleDefId, pub(crate) fn get_ancestor_module_reexport( module_def_id: ModuleDefId, diff --git a/tooling/lsp/src/requests/code_action.rs b/tooling/lsp/src/requests/code_action.rs index 7f1335e8743..2276f6a3bf2 100644 --- a/tooling/lsp/src/requests/code_action.rs +++ b/tooling/lsp/src/requests/code_action.rs @@ -13,6 +13,7 @@ use fm::{FileId, FileMap, PathString}; use noirc_errors::Span; use noirc_frontend::{ ParsedModule, + modules::module_def_id_is_visible, parser::{Item, ItemKind, ParsedSubModule}, }; use noirc_frontend::{ @@ -28,7 +29,7 @@ use noirc_frontend::{ use crate::{ LspState, modules::get_ancestor_module_reexport, use_segment_positions::UseSegmentPositions, - utils, visibility::module_def_id_is_visible, + utils, }; use super::{process_request, to_lsp_location}; diff --git a/tooling/lsp/src/requests/completion.rs b/tooling/lsp/src/requests/completion.rs index f6b3ecbfbdd..be484609a3d 100644 --- a/tooling/lsp/src/requests/completion.rs +++ b/tooling/lsp/src/requests/completion.rs @@ -35,6 +35,7 @@ use noirc_frontend::{ }, }, hir_def::traits::Trait, + modules::module_def_id_is_visible, node_interner::{FuncId, NodeInterner, ReferenceId, TypeId}, parser::{Item, ItemKind, ParsedSubModule}, token::{MetaAttribute, MetaAttributeName, Token, Tokens}, @@ -44,7 +45,7 @@ use sort_text::underscore_sort_text; use crate::{ LspState, requests::to_lsp_location, trait_impl_method_stub_generator::TraitImplMethodStubGenerator, - use_segment_positions::UseSegmentPositions, utils, visibility::module_def_id_is_visible, + use_segment_positions::UseSegmentPositions, utils, }; use super::{TraitReexport, process_request}; diff --git a/tooling/lsp/src/visibility.rs b/tooling/lsp/src/visibility.rs deleted file mode 100644 index e09d7d95e8f..00000000000 --- a/tooling/lsp/src/visibility.rs +++ /dev/null @@ -1,63 +0,0 @@ -use std::collections::BTreeMap; - -use noirc_frontend::{ - ast::ItemVisibility, - graph::{CrateId, Dependency}, - hir::{ - def_map::{CrateDefMap, ModuleDefId, ModuleId}, - resolution::visibility::item_in_module_is_visible, - }, - modules::get_parent_module, - node_interner::NodeInterner, -}; - -/// Returns true if the given ModuleDefId is visible from the current module, given its visibility. -/// This will in turn check if the ModuleDefId parent modules are visible from the current module. -/// If `defining_module` is Some, it will be considered as the parent of the item to check -/// (this is the case when the item is re-exported with `pub use` or similar). -pub(super) fn module_def_id_is_visible( - module_def_id: ModuleDefId, - current_module_id: ModuleId, - mut visibility: ItemVisibility, - mut defining_module: Option, - interner: &NodeInterner, - def_maps: &BTreeMap, - dependencies: &[Dependency], -) -> bool { - // First find out which module we need to check. - // If a module is trying to be referenced, it's that module. Otherwise it's the module that contains the item. - let mut target_module_id = if let ModuleDefId::ModuleId(module_id) = module_def_id { - Some(module_id) - } else { - std::mem::take(&mut defining_module).or_else(|| get_parent_module(interner, module_def_id)) - }; - - // Then check if it's visible, and upwards - while let Some(module_id) = target_module_id { - if !item_in_module_is_visible(def_maps, current_module_id, module_id, visibility) { - return false; - } - - // If the target module isn't in the same crate as `module_id` or isn't in one of its - // dependencies, then it's not visible. - if module_id.krate != current_module_id.krate - && dependencies.iter().all(|dep| dep.crate_id != module_id.krate) - { - return false; - } - - target_module_id = std::mem::take(&mut defining_module).or_else(|| { - let module_data = &def_maps[&module_id.krate][module_id.local_id]; - let parent_local_id = module_data.parent; - parent_local_id.map(|local_id| ModuleId { krate: module_id.krate, local_id }) - }); - - // This is a bit strange, but the visibility is always that of the item inside another module, - // so the visibility we update here is for the next loop check. - visibility = interner - .try_module_attributes(&module_id) - .map_or(ItemVisibility::Public, |attributes| attributes.visibility); - } - - true -} diff --git a/tooling/nargo_cli/src/cli/expand_cmd.rs b/tooling/nargo_cli/src/cli/expand_cmd.rs index e16d07b2df9..69c01641120 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd.rs @@ -85,9 +85,16 @@ fn get_expanded_package( let mut builder = ItemBuilder::new(crate_id, &context.def_interner, &context.def_maps); let item = builder.build_module(module_id); + let dependencies = &context.crate_graph[context.root_crate_id()].dependencies; + let mut string = String::new(); - let mut printer = - ItemPrinter::new(crate_id, &context.def_interner, &context.def_maps, &mut string); + let mut printer = ItemPrinter::new( + crate_id, + &context.def_interner, + &context.def_maps, + dependencies, + &mut string, + ); printer.show_item(item); let (parsed_module, errors) = parse_program_with_dummy_file(&string); diff --git a/tooling/nargo_cli/src/cli/expand_cmd/items.rs b/tooling/nargo_cli/src/cli/expand_cmd/items.rs index a55a6bd60e4..6fd12b21a26 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd/items.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd/items.rs @@ -83,10 +83,10 @@ pub(super) struct Import { pub(super) is_prelude: bool, } -pub(super) struct ItemBuilder<'interner, 'def_map> { +pub(super) struct ItemBuilder<'context> { crate_id: CrateId, - interner: &'interner NodeInterner, - def_maps: &'def_map DefMaps, + interner: &'context NodeInterner, + def_maps: &'context DefMaps, /// This set is initially created with all the trait impls in the crate. /// As we traverse traits, will gather trait impls associated to those traits /// that aren't associated to types in the current crate. @@ -96,11 +96,11 @@ pub(super) struct ItemBuilder<'interner, 'def_map> { trait_impls: HashSet, } -impl<'interner, 'def_map> ItemBuilder<'interner, 'def_map> { +impl<'context> ItemBuilder<'context> { pub(super) fn new( crate_id: CrateId, - interner: &'interner NodeInterner, - def_maps: &'def_map DefMaps, + interner: &'context NodeInterner, + def_maps: &'context DefMaps, ) -> Self { let trait_impls = interner.get_trait_implementations_in_crate(crate_id); Self { crate_id, interner, def_maps, trait_impls } diff --git a/tooling/nargo_cli/src/cli/expand_cmd/printer.rs b/tooling/nargo_cli/src/cli/expand_cmd/printer.rs index 9e63af16732..5a7721f6ae1 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd/printer.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd/printer.rs @@ -4,6 +4,7 @@ use noirc_driver::CrateId; use noirc_frontend::{ DataType, Generics, Kind, NamedGeneric, Type, ast::{Ident, ItemVisibility}, + graph::Dependency, hir::{ comptime::{Value, tokens_to_string_with_indent}, def_map::{DefMaps, ModuleDefId, ModuleId}, @@ -14,7 +15,7 @@ use noirc_frontend::{ stmt::{HirLetStatement, HirPattern}, traits::{ResolvedTraitBound, TraitConstraint}, }, - modules::{module_def_id_to_reference_id, relative_module_full_path}, + modules::{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}, @@ -25,10 +26,11 @@ use super::items::{Impl, Import, Item, Module, TraitImpl}; mod hir; mod types; -pub(super) struct ItemPrinter<'interner, 'def_map, 'string> { +pub(super) struct ItemPrinter<'context, 'string> { crate_id: CrateId, - interner: &'interner NodeInterner, - def_maps: &'def_map DefMaps, + interner: &'context NodeInterner, + def_maps: &'context DefMaps, + dependencies: &'context Vec, string: &'string mut String, indent: usize, module_id: ModuleId, @@ -36,11 +38,12 @@ pub(super) struct ItemPrinter<'interner, 'def_map, 'string> { self_type: Option, } -impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { +impl<'context, 'string> ItemPrinter<'context, 'string> { pub(super) fn new( crate_id: CrateId, - interner: &'interner NodeInterner, - def_maps: &'def_map DefMaps, + interner: &'context NodeInterner, + def_maps: &'context DefMaps, + dependencies: &'context Vec, string: &'string mut String, ) -> Self { let root_id = def_maps[&crate_id].root(); @@ -50,6 +53,7 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { crate_id, interner, def_maps, + dependencies, string, indent: 0, module_id, @@ -401,7 +405,11 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { self.push(' '); let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::TraitId(trait_.id), use_import); + self.show_reference_to_module_def_id( + ModuleDefId::TraitId(trait_.id), + trait_.visibility, + use_import, + ); let use_colons = false; self.show_generic_types(&trait_impl.trait_generics, use_colons); @@ -784,7 +792,12 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { } Value::Function(func_id, ..) => { let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::FunctionId(*func_id), use_import); + let visibility = self.interner.function_modifiers(func_id).visibility; + self.show_reference_to_module_def_id( + ModuleDefId::FunctionId(*func_id), + visibility, + use_import, + ); } Value::Tuple(values) => { self.push('('); @@ -906,7 +919,11 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { let data_type = data_type.borrow(); let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::TypeId(data_type.id), use_import); + self.show_reference_to_module_def_id( + ModuleDefId::TypeId(data_type.id), + data_type.visibility, + use_import, + ); let use_colons = true; self.show_generic_types(&generics, use_colons); @@ -928,7 +945,8 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, '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, use_import); + let name = + self.show_reference_to_module_def_id(import.id, import.visibility, use_import); if name != import.name.as_str() { self.push_str(" as "); @@ -942,6 +960,7 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { fn show_reference_to_module_def_id( &mut self, module_def_id: ModuleDefId, + visibility: ItemVisibility, use_import: bool, ) -> String { if let ModuleDefId::FunctionId(func_id) = module_def_id { @@ -950,8 +969,10 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { if let Some(trait_impl_id) = func_meta.trait_impl { let trait_impl = self.interner.get_trait_implementation(trait_impl_id); let trait_impl = trait_impl.borrow(); + let trait_ = self.interner.get_trait(trait_impl.trait_id); self.show_reference_to_module_def_id( ModuleDefId::TraitId(trait_impl.trait_id), + trait_.visibility, use_import, ); @@ -966,7 +987,12 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { } if let Some(trait_id) = func_meta.trait_id { - self.show_reference_to_module_def_id(ModuleDefId::TraitId(trait_id), use_import); + let trait_ = self.interner.get_trait(trait_id); + self.show_reference_to_module_def_id( + ModuleDefId::TraitId(trait_id), + trait_.visibility, + use_import, + ); self.push_str("::"); let name = self.interner.function_name(&func_id).to_string(); @@ -975,7 +1001,13 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { } if let Some(type_id) = func_meta.type_id { - self.show_reference_to_module_def_id(ModuleDefId::TypeId(type_id), use_import); + let typ = self.interner.get_type(type_id); + let typ = typ.borrow(); + self.show_reference_to_module_def_id( + ModuleDefId::TypeId(type_id), + typ.visibility, + use_import, + ); self.push_str("::"); let name = self.interner.function_name(&func_id).to_string(); @@ -1005,6 +1037,32 @@ impl<'interner, 'def_map, 'string> ItemPrinter<'interner, 'def_map, 'string> { } let current_module_parent_id = self.module_id.parent(self.def_maps); + let mut reexport = None; + + let is_visible = module_def_id_is_visible( + module_def_id, + self.module_id, + visibility, + None, + self.interner, + self.def_maps, + self.dependencies, + ); + if !is_visible { + reexport = self.interner.get_reexports(module_def_id).first(); + } + + if let Some(reexport) = reexport { + self.show_reference_to_module_def_id( + ModuleDefId::ModuleId(reexport.module_id), + reexport.visibility, + true, + ); + self.push_str("::"); + self.push_str(reexport.name.as_str()); + return reexport.name.to_string(); + } + if let Some(full_path) = relative_module_full_path( module_def_id, self.module_id, diff --git a/tooling/nargo_cli/src/cli/expand_cmd/printer/hir.rs b/tooling/nargo_cli/src/cli/expand_cmd/printer/hir.rs index 205f0dccada..57f0c10848e 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd/printer/hir.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd/printer/hir.rs @@ -15,7 +15,7 @@ use noirc_frontend::{ use super::ItemPrinter; -impl ItemPrinter<'_, '_, '_> { +impl ItemPrinter<'_, '_> { fn show_hir_expression_id(&mut self, expr_id: ExprId) { let hir_expr = self.interner.expression(&expr_id); self.show_hir_expression(hir_expr); @@ -129,6 +129,7 @@ impl ItemPrinter<'_, '_, '_> { let use_import = true; self.show_reference_to_module_def_id( ModuleDefId::TypeId(data_type.id), + data_type.visibility, use_import, ); @@ -153,7 +154,11 @@ impl ItemPrinter<'_, '_, '_> { HirExpression::EnumConstructor(constructor) => { let data_type = constructor.r#type.borrow(); let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::TypeId(data_type.id), use_import); + self.show_reference_to_module_def_id( + ModuleDefId::TypeId(data_type.id), + data_type.visibility, + use_import, + ); let variant = data_type.variant_at(constructor.variant_index); self.push_str("::"); @@ -694,8 +699,10 @@ impl ItemPrinter<'_, '_, '_> { self.push_str(name); } else { let use_import = true; + let visibility = self.interner.function_visibility(func_id); self.show_reference_to_module_def_id( ModuleDefId::FunctionId(func_id), + visibility, use_import, ); } @@ -714,7 +721,11 @@ impl ItemPrinter<'_, '_, '_> { } } let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::GlobalId(global_id), use_import); + self.show_reference_to_module_def_id( + ModuleDefId::GlobalId(global_id), + global_info.visibility, + use_import, + ); } DefinitionKind::Local(..) | DefinitionKind::NumericGeneric(..) => { let name = self.interner.definition_name(ident.id); diff --git a/tooling/nargo_cli/src/cli/expand_cmd/printer/types.rs b/tooling/nargo_cli/src/cli/expand_cmd/printer/types.rs index db966895f93..9a5eebff5e3 100644 --- a/tooling/nargo_cli/src/cli/expand_cmd/printer/types.rs +++ b/tooling/nargo_cli/src/cli/expand_cmd/printer/types.rs @@ -2,7 +2,7 @@ use noirc_frontend::{NamedGeneric, Type, TypeBinding, hir::def_map::ModuleDefId} use super::ItemPrinter; -impl ItemPrinter<'_, '_, '_> { +impl ItemPrinter<'_, '_> { pub(super) fn show_types_separated_by_comma(&mut self, types: &[Type]) { self.show_separated_by_comma(types, |this, typ| { this.show_type(typ); @@ -47,7 +47,11 @@ impl ItemPrinter<'_, '_, '_> { Type::DataType(data_type, generics) => { let data_type = data_type.borrow(); let use_import = true; - self.show_reference_to_module_def_id(ModuleDefId::TypeId(data_type.id), use_import); + self.show_reference_to_module_def_id( + ModuleDefId::TypeId(data_type.id), + data_type.visibility, + use_import, + ); if !generics.is_empty() { self.push_str("<"); self.show_types_separated_by_comma(generics); @@ -59,6 +63,7 @@ impl ItemPrinter<'_, '_, '_> { let use_import = true; self.show_reference_to_module_def_id( ModuleDefId::TypeAliasId(type_alias.id), + type_alias.visibility, use_import, ); if !generics.is_empty() { diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/comptime_traits/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/comptime_traits/execute__tests__expanded.snap index d64230f3a9e..a47e86317c9 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/comptime_traits/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/comptime_traits/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::Neg; +use std::ops::Neg; fn main() { () 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 055897068d6..caf25a1efbe 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::collections::vec::Vec; +use std::prelude::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_can_use_pub_use_item/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_can_use_pub_use_item/execute__tests__expanded.snap index ba5de006e8a..5ba0e2f78b8 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_can_use_pub_use_item/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_no_bug/noirc_frontend_tests_imports_can_use_pub_use_item/execute__tests__expanded.snap @@ -11,5 +11,5 @@ mod foo { } fn main() { - foo::bar::baz(); + foo::baz(); } diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/4_sub/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/4_sub/execute__tests__expanded.snap index bf5571a8dc2..696094b5e03 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/4_sub/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/4_sub/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::WrappingSub; +use std::ops::WrappingSub; fn main(mut x: u32, y: u32, z: u32) { x = x.wrapping_sub(y); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/5_over/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/5_over/execute__tests__expanded.snap index 37e0d75d88e..385b8c1839b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/5_over/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/5_over/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::WrappingMul; +use std::ops::WrappingMul; fn main(mut x: u32, y: u32) { x = x.wrapping_mul(x); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__expanded.snap index f7511462e48..7981834c033 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::{WrappingAdd, WrappingMul, WrappingSub}; +use std::ops::{WrappingAdd, WrappingMul, WrappingSub}; fn main(x: [u32; 5], y: [u32; 5], mut z: u32, t: u32) { let mut c: u32 = 2301; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/binary_operator_overloading/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/binary_operator_overloading/execute__tests__expanded.snap index 6333c1e579b..fd4d15f8fc0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/binary_operator_overloading/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/binary_operator_overloading/execute__tests__expanded.snap @@ -2,10 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::{ - cmp::Ordering, - ops::{arith::{Add, Div, Mul, Rem, Sub}, bit::{BitAnd, BitOr, BitXor, Shl, Shr}}, -}; +use std::{cmp::Ordering, ops::{Add, BitAnd, BitOr, BitXor, Div, Mul, Rem, Shl, Shr, Sub}}; fn main(x: u32, y: u32) { let wx: Wrapper = Wrapper::new(x); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__expanded.snap index 364e30b50dc..089a163de05 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/embedded_curve_ops/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::Add; +use std::ops::Add; fn main(priv_key: Field, pub_x: pub Field, pub_y: pub Field) { let g1: std::embedded_curve_ops::EmbeddedCurvePoint = diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/inline_decompose_hint_brillig_call/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/inline_decompose_hint_brillig_call/execute__tests__expanded.snap index caa253b25fb..fa36b6a27fa 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/inline_decompose_hint_brillig_call/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/inline_decompose_hint_brillig_call/execute__tests__expanded.snap @@ -4,7 +4,7 @@ expression: expanded_code --- use std::{ embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, fixed_base_scalar_mul}, - ops::arith::Add, + ops::Add, }; fn main() -> pub Field { 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 8434682df60..3b02c4f9eff 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::{collections::vec::Vec, option::Option}; + use std::prelude::{Option, Vec}; 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 2ee5a2f52a2..0a5d407cf84 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::option::Option; +use std::prelude::Option; trait MyDeserialize { fn deserialize(fields: [Field; N]) -> Self; diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/signed_division/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/signed_division/execute__tests__expanded.snap index ecd11f512c6..d59ddd5adeb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/signed_division/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/signed_division/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::WrappingSub; +use std::ops::WrappingSub; fn main(mut x: i32, mut y: i32, mut z: i32) { assert((x / y) == z); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/unary_operator_overloading/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/unary_operator_overloading/execute__tests__expanded.snap index aeb331b23bf..0ba3b1f107b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/unary_operator_overloading/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/unary_operator_overloading/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::{arith::Neg, bit::Not}; +use std::ops::{Neg, Not}; fn main(x: u32) { let wx: Wrapper = Wrapper::new(x as i32); diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/wrapping_operations/execute__tests__expanded.snap b/tooling/nargo_cli/tests/snapshots/execution_success/wrapping_operations/execute__tests__expanded.snap index 55967b68798..e7f00f16d73 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/wrapping_operations/execute__tests__expanded.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/wrapping_operations/execute__tests__expanded.snap @@ -2,7 +2,7 @@ source: tooling/nargo_cli/tests/execute.rs expression: expanded_code --- -use std::ops::arith::{WrappingAdd, WrappingMul, WrappingSub}; +use std::ops::{WrappingAdd, WrappingMul, WrappingSub}; fn main(x: u8, y: u8) { assert(x.wrapping_sub(1) == y);