Skip to content

Commit

Permalink
Set trait impl methods visibility before elaborating functions
Browse files Browse the repository at this point in the history
  • Loading branch information
asterite committed Jan 10, 2025
1 parent c65b63a commit 6202c67
Showing 1 changed file with 22 additions and 9 deletions.
31 changes: 22 additions & 9 deletions compiler/noirc_frontend/src/elaborator/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,11 @@ impl<'context> Elaborator<'context> {
&items.module_attributes,
);

// Make sure trait impl functions have the same visibility as their traits
for trait_impl in &items.trait_impls {
self.set_trait_impl_functions_visibility(trait_impl);
}

for functions in items.functions {
self.elaborate_functions(functions);
}
Expand Down Expand Up @@ -1098,6 +1103,23 @@ impl<'context> Elaborator<'context> {
}
}

fn set_trait_impl_functions_visibility(&mut self, trait_impl: &UnresolvedTraitImpl) {
let trait_visibility = if let Some(trait_id) = trait_impl.trait_id {
let trait_ = self.interner.get_trait(trait_id);
Some(trait_.visibility)
} else {
None
};

for (_, function, _) in &trait_impl.methods.functions {
// A trait impl method has the same visibility as its trait
if let Some(trait_visibility) = trait_visibility {
let modifiers = self.interner.function_modifiers_mut(function);
modifiers.visibility = trait_visibility;
}
}
}

fn elaborate_trait_impl(&mut self, trait_impl: UnresolvedTraitImpl) {
self.file = trait_impl.file_id;
self.local_module = trait_impl.module_id;
Expand All @@ -1110,19 +1132,10 @@ impl<'context> Elaborator<'context> {
self.check_parent_traits_are_implemented(&trait_impl);
self.remove_trait_impl_assumed_trait_implementations(trait_impl.impl_id);

let trait_id =
trait_impl.trait_id.expect("Trait impl trait ID should have been set at this point");
let trait_ = self.interner.get_trait(trait_id);
let trait_visibility = trait_.visibility;

for (module, function, _) in &trait_impl.methods.functions {
self.local_module = *module;
let errors = check_trait_impl_method_matches_declaration(self.interner, *function);
self.errors.extend(errors.into_iter().map(|error| (error.into(), self.file)));

// A trait impl method has the same visibility as its trait
let modifiers = self.interner.function_modifiers_mut(function);
modifiers.visibility = trait_visibility;
}

self.elaborate_functions(trait_impl.methods);
Expand Down

0 comments on commit 6202c67

Please sign in to comment.