Skip to content

Commit 8c9c8ad

Browse files
committed
Unify assoc item visibility queries
1 parent 2da8d58 commit 8c9c8ad

File tree

5 files changed

+58
-77
lines changed

5 files changed

+58
-77
lines changed

src/tools/rust-analyzer/crates/hir-def/src/db.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ use syntax::{AstPtr, ast};
1111
use triomphe::Arc;
1212

1313
use crate::{
14-
AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, EnumVariantId, EnumVariantLoc,
15-
ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId, FunctionLoc,
16-
GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroExpander, MacroId,
17-
MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
14+
AssocItemId, AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, EnumVariantId,
15+
EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId,
16+
FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroExpander,
17+
MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
1818
StaticLoc, StructId, StructLoc, TraitAliasId, TraitAliasLoc, TraitId, TraitLoc, TypeAliasId,
1919
TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
2020
attr::{Attrs, AttrsWithOwner},
@@ -298,16 +298,8 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
298298
#[salsa::invoke(visibility::field_visibilities_query)]
299299
fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
300300

301-
// FIXME: unify function_visibility and const_visibility?
302-
303-
#[salsa::invoke(visibility::function_visibility_query)]
304-
fn function_visibility(&self, def: FunctionId) -> Visibility;
305-
306-
#[salsa::invoke(visibility::const_visibility_query)]
307-
fn const_visibility(&self, def: ConstId) -> Visibility;
308-
309-
#[salsa::invoke(visibility::type_alias_visibility_query)]
310-
fn type_alias_visibility(&self, def: TypeAliasId) -> Visibility;
301+
#[salsa::invoke(visibility::assoc_visibility_query)]
302+
fn assoc_visibility(&self, def: AssocItemId) -> Visibility;
311303

312304
// endregion:visibilities
313305

src/tools/rust-analyzer/crates/hir-def/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ impl DefWithBodyId {
793793
}
794794
}
795795

796-
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
796+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, salsa_macros::Supertype)]
797797
pub enum AssocItemId {
798798
FunctionId(FunctionId),
799799
ConstId(ConstId),

src/tools/rust-analyzer/crates/hir-def/src/visibility.rs

Lines changed: 38 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,8 @@ use syntax::ast::{self, HasVisibility};
88
use triomphe::Arc;
99

1010
use crate::{
11-
ConstId, FunctionId, HasModule, ItemContainerId, LocalFieldId, LocalModuleId, ModuleId,
12-
TraitId, TypeAliasId, VariantId,
13-
db::DefDatabase,
14-
nameres::DefMap,
15-
resolver::{HasResolver, Resolver},
16-
src::HasSource,
11+
AssocItemId, HasModule, ItemContainerId, LocalFieldId, LocalModuleId, ModuleId, TraitId,
12+
VariantId, db::DefDatabase, nameres::DefMap, resolver::HasResolver, src::HasSource,
1713
};
1814

1915
pub use crate::item_tree::{RawVisibility, VisibilityExplicitness};
@@ -225,63 +221,56 @@ pub(crate) fn field_visibilities_query(
225221

226222
pub fn visibility_from_ast(
227223
db: &dyn DefDatabase,
228-
resolver: &Resolver<'_>,
224+
has_resolver: impl HasResolver,
229225
ast_vis: InFile<Option<ast::Visibility>>,
230226
) -> Visibility {
231227
let mut span_map = None;
232228
let raw_vis = crate::item_tree::visibility_from_ast(db, ast_vis.value, &mut |range| {
233229
span_map.get_or_insert_with(|| db.span_map(ast_vis.file_id)).span_for_range(range).ctx
234230
});
235-
Visibility::resolve(db, resolver, &raw_vis)
236-
}
237-
238-
fn trait_item_visibility(
239-
db: &dyn DefDatabase,
240-
resolver: &Resolver<'_>,
241-
container: ItemContainerId,
242-
) -> Option<Visibility> {
243-
match container {
244-
ItemContainerId::TraitId(trait_) => Some(trait_visibility(db, resolver, trait_)),
245-
_ => None,
231+
if raw_vis == RawVisibility::Public {
232+
return Visibility::Public;
246233
}
247-
}
248234

249-
/// Resolve visibility of a function.
250-
pub(crate) fn function_visibility_query(db: &dyn DefDatabase, def: FunctionId) -> Visibility {
251-
let loc = def.lookup(db);
252-
let resolver = def.resolver(db);
253-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
254-
let source = loc.source(db);
255-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
256-
})
235+
Visibility::resolve(db, &has_resolver.resolver(db), &raw_vis)
257236
}
258237

259-
/// Resolve visibility of a const.
260-
pub(crate) fn const_visibility_query(db: &dyn DefDatabase, def: ConstId) -> Visibility {
261-
let loc = def.lookup(db);
262-
let resolver = def.resolver(db);
263-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
264-
let source = loc.source(db);
265-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
266-
})
238+
/// Resolve visibility of a type alias.
239+
pub(crate) fn assoc_visibility_query(db: &dyn DefDatabase, def: AssocItemId) -> Visibility {
240+
match def {
241+
AssocItemId::FunctionId(function_id) => {
242+
let loc = function_id.lookup(db);
243+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
244+
let source = loc.source(db);
245+
visibility_from_ast(db, function_id, source.map(|src| src.visibility()))
246+
})
247+
}
248+
AssocItemId::ConstId(const_id) => {
249+
let loc = const_id.lookup(db);
250+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
251+
let source = loc.source(db);
252+
visibility_from_ast(db, const_id, source.map(|src| src.visibility()))
253+
})
254+
}
255+
AssocItemId::TypeAliasId(type_alias_id) => {
256+
let loc = type_alias_id.lookup(db);
257+
trait_item_visibility(db, loc.container).unwrap_or_else(|| {
258+
let source = loc.source(db);
259+
visibility_from_ast(db, type_alias_id, source.map(|src| src.visibility()))
260+
})
261+
}
262+
}
267263
}
268264

269-
/// Resolve visibility of a type alias.
270-
pub(crate) fn type_alias_visibility_query(db: &dyn DefDatabase, def: TypeAliasId) -> Visibility {
271-
let loc = def.lookup(db);
272-
let resolver = def.resolver(db);
273-
trait_item_visibility(db, &resolver, loc.container).unwrap_or_else(|| {
274-
let source = loc.source(db);
275-
visibility_from_ast(db, &resolver, source.map(|src| src.visibility()))
276-
})
265+
fn trait_item_visibility(db: &dyn DefDatabase, container: ItemContainerId) -> Option<Visibility> {
266+
match container {
267+
ItemContainerId::TraitId(trait_) => Some(trait_visibility(db, trait_)),
268+
_ => None,
269+
}
277270
}
278271

279-
pub(crate) fn trait_visibility(
280-
db: &dyn DefDatabase,
281-
resolver: &Resolver<'_>,
282-
def: TraitId,
283-
) -> Visibility {
272+
fn trait_visibility(db: &dyn DefDatabase, def: TraitId) -> Visibility {
284273
let loc = def.lookup(db);
285274
let source = loc.source(db);
286-
visibility_from_ast(db, resolver, source.map(|src| src.visibility()))
275+
visibility_from_ast(db, def, source.map(|src| src.visibility()))
287276
}

src/tools/rust-analyzer/crates/hir-ty/src/method_resolution.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,7 +1550,7 @@ fn is_valid_impl_method_candidate(
15501550
check_that!(name.is_none_or(|n| n == item_name));
15511551

15521552
if let Some(from_module) = visible_from_module {
1553-
if !db.const_visibility(c).is_visible_from(db, from_module) {
1553+
if !db.assoc_visibility(c.into()).is_visible_from(db, from_module) {
15541554
cov_mark::hit!(const_candidate_not_visible);
15551555
return IsValidCandidate::NotVisible;
15561556
}
@@ -1639,7 +1639,7 @@ fn is_valid_impl_fn_candidate(
16391639
let data = db.function_signature(fn_id);
16401640

16411641
if let Some(from_module) = visible_from_module {
1642-
if !db.function_visibility(fn_id).is_visible_from(db, from_module) {
1642+
if !db.assoc_visibility(fn_id.into()).is_visible_from(db, from_module) {
16431643
cov_mark::hit!(autoderef_candidate_not_visible);
16441644
return IsValidCandidate::NotVisible;
16451645
}

src/tools/rust-analyzer/crates/hir/src/lib.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1431,7 +1431,7 @@ impl HasVisibility for Struct {
14311431
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
14321432
let loc = self.id.lookup(db);
14331433
let source = loc.source(db);
1434-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
1434+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
14351435
}
14361436
}
14371437

@@ -1485,7 +1485,7 @@ impl HasVisibility for Union {
14851485
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
14861486
let loc = self.id.lookup(db);
14871487
let source = loc.source(db);
1488-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
1488+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
14891489
}
14901490
}
14911491

@@ -1574,7 +1574,7 @@ impl HasVisibility for Enum {
15741574
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
15751575
let loc = self.id.lookup(db);
15761576
let source = loc.source(db);
1577-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
1577+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
15781578
}
15791579
}
15801580

@@ -2632,7 +2632,7 @@ impl SelfParam {
26322632

26332633
impl HasVisibility for Function {
26342634
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
2635-
db.function_visibility(self.id)
2635+
db.assoc_visibility(self.id.into())
26362636
}
26372637
}
26382638

@@ -2692,7 +2692,7 @@ impl HasVisibility for ExternCrateDecl {
26922692
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
26932693
let loc = self.id.lookup(db);
26942694
let source = loc.source(db);
2695-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
2695+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
26962696
}
26972697
}
26982698

@@ -2727,7 +2727,7 @@ impl Const {
27272727

27282728
impl HasVisibility for Const {
27292729
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
2730-
db.const_visibility(self.id)
2730+
db.assoc_visibility(self.id.into())
27312731
}
27322732
}
27332733

@@ -2813,7 +2813,7 @@ impl HasVisibility for Static {
28132813
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
28142814
let loc = self.id.lookup(db);
28152815
let source = loc.source(db);
2816-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
2816+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
28172817
}
28182818
}
28192819

@@ -2915,7 +2915,7 @@ impl HasVisibility for Trait {
29152915
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
29162916
let loc = self.id.lookup(db);
29172917
let source = loc.source(db);
2918-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
2918+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
29192919
}
29202920
}
29212921

@@ -2938,7 +2938,7 @@ impl HasVisibility for TraitAlias {
29382938
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
29392939
let loc = self.id.lookup(db);
29402940
let source = loc.source(db);
2941-
visibility_from_ast(db, &self.id.resolver(db), source.map(|src| src.visibility()))
2941+
visibility_from_ast(db, self.id, source.map(|src| src.visibility()))
29422942
}
29432943
}
29442944

@@ -2976,7 +2976,7 @@ impl TypeAlias {
29762976

29772977
impl HasVisibility for TypeAlias {
29782978
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
2979-
db.type_alias_visibility(self.id)
2979+
db.assoc_visibility(self.id.into())
29802980
}
29812981
}
29822982

@@ -3200,7 +3200,7 @@ impl HasVisibility for Macro {
32003200
MacroId::Macro2Id(id) => {
32013201
let loc = id.lookup(db);
32023202
let source = loc.source(db);
3203-
visibility_from_ast(db, &id.resolver(db), source.map(|src| src.visibility()))
3203+
visibility_from_ast(db, id, source.map(|src| src.visibility()))
32043204
}
32053205
MacroId::MacroRulesId(_) => Visibility::Public,
32063206
MacroId::ProcMacroId(_) => Visibility::Public,

0 commit comments

Comments
 (0)