Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/db.rs12
-rw-r--r--crates/hir-def/src/lib.rs8
-rw-r--r--crates/hir-def/src/signatures.rs2
-rw-r--r--crates/hir-def/src/visibility.rs39
-rw-r--r--crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs4
-rw-r--r--crates/hir-ty/src/infer/expr.rs7
-rw-r--r--crates/hir-ty/src/infer/pat.rs5
-rw-r--r--crates/hir-ty/src/inhabitedness.rs10
8 files changed, 48 insertions, 39 deletions
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs
index 2f2889ec66..5d5d435398 100644
--- a/crates/hir-def/src/db.rs
+++ b/crates/hir-def/src/db.rs
@@ -4,16 +4,15 @@ use hir_expand::{
EditionedFileId, HirFileId, InFile, Lookup, MacroCallId, MacroDefId, MacroDefKind,
db::ExpandDatabase,
};
-use la_arena::ArenaMap;
use triomphe::Arc;
use crate::{
AnonConstId, AnonConstLoc, AssocItemId, AttrDefId, BlockId, BlockLoc, ConstId, ConstLoc,
EnumId, EnumLoc, EnumVariantId, EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId,
- ExternCrateLoc, FunctionId, FunctionLoc, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc,
- MacroExpander, MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId,
- ProcMacroLoc, StaticId, StaticLoc, StructId, StructLoc, TraitId, TraitLoc, TypeAliasId,
- TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
+ ExternCrateLoc, FunctionId, FunctionLoc, ImplId, ImplLoc, Macro2Id, Macro2Loc, MacroExpander,
+ MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
+ StaticLoc, StructId, StructLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc, UnionId,
+ UnionLoc, UseId, UseLoc,
attrs::AttrFlags,
item_tree::{ItemTree, file_item_tree_query},
nameres::crate_def_map,
@@ -98,9 +97,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
// region:visibilities
- #[salsa::invoke(visibility::field_visibilities_query)]
- fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
-
#[salsa::invoke(visibility::assoc_visibility_query)]
fn assoc_visibility(&self, def: AssocItemId) -> Visibility;
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index 4387ef055f..800c08aa2c 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -259,7 +259,7 @@ impl_intern!(StructId, StructLoc, intern_struct, lookup_intern_struct);
impl StructId {
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
- VariantFields::firewall(db, self.into())
+ VariantFields::of(db, self.into())
}
pub fn fields_with_source_map(
@@ -276,7 +276,7 @@ impl_intern!(UnionId, UnionLoc, intern_union, lookup_intern_union);
impl UnionId {
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
- VariantFields::firewall(db, self.into())
+ VariantFields::of(db, self.into())
}
pub fn fields_with_source_map(
@@ -396,7 +396,7 @@ impl_loc!(EnumVariantLoc, id: Variant, parent: EnumId);
impl EnumVariantId {
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
- VariantFields::firewall(db, self.into())
+ VariantFields::of(db, self.into())
}
pub fn fields_with_source_map(
@@ -1027,7 +1027,7 @@ impl_from!(EnumVariantId, StructId, UnionId for VariantId);
impl VariantId {
pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
- VariantFields::firewall(db, self)
+ VariantFields::of(db, self)
}
pub fn fields_with_source_map(
diff --git a/crates/hir-def/src/signatures.rs b/crates/hir-def/src/signatures.rs
index c16ca6d0b4..9d988c821a 100644
--- a/crates/hir-def/src/signatures.rs
+++ b/crates/hir-def/src/signatures.rs
@@ -906,7 +906,7 @@ impl VariantFields {
}
#[salsa::tracked(returns(deref))]
- pub(crate) fn firewall(db: &dyn DefDatabase, id: VariantId) -> Arc<Self> {
+ pub(crate) fn of(db: &dyn DefDatabase, id: VariantId) -> Arc<Self> {
Self::with_source_map(db, id).0.clone()
}
}
diff --git a/crates/hir-def/src/visibility.rs b/crates/hir-def/src/visibility.rs
index cb5eed1b8b..81a61ec20f 100644
--- a/crates/hir-def/src/visibility.rs
+++ b/crates/hir-def/src/visibility.rs
@@ -6,11 +6,11 @@ use base_db::Crate;
use hir_expand::{InFile, Lookup};
use la_arena::ArenaMap;
use syntax::ast::{self, HasVisibility};
-use triomphe::Arc;
use crate::{
AssocItemId, HasModule, ItemContainerId, LocalFieldId, ModuleId, TraitId, VariantId,
- db::DefDatabase, nameres::DefMap, resolver::HasResolver, src::HasSource,
+ db::DefDatabase, nameres::DefMap, resolver::HasResolver, signatures::VariantFields,
+ src::HasSource,
};
pub use crate::item_tree::{RawVisibility, VisibilityExplicitness};
@@ -277,23 +277,26 @@ impl Visibility {
}
}
-/// Resolve visibility of all specific fields of a struct or union variant.
-pub(crate) fn field_visibilities_query(
- db: &dyn DefDatabase,
- variant_id: VariantId,
-) -> Arc<ArenaMap<LocalFieldId, Visibility>> {
- let variant_fields = variant_id.fields(db);
- let fields = variant_fields.fields();
- if fields.is_empty() {
- return Arc::default();
- }
- let resolver = variant_id.module(db).resolver(db);
- let mut res = ArenaMap::default();
- for (field_id, field_data) in fields.iter() {
- res.insert(field_id, Visibility::resolve(db, &resolver, &field_data.visibility));
+#[salsa::tracked]
+impl VariantFields {
+ /// Resolve visibility of all specific fields of a struct or union variant.
+ #[salsa::tracked(returns(ref))]
+ pub fn field_visibilities(
+ db: &dyn DefDatabase,
+ variant_id: VariantId,
+ ) -> ArenaMap<LocalFieldId, Visibility> {
+ let variant_fields = variant_id.fields(db);
+ let fields = variant_fields.fields();
+ if fields.is_empty() {
+ return ArenaMap::default();
+ }
+ let resolver = variant_id.module(db).resolver(db);
+ let mut res = ArenaMap::with_capacity(fields.len());
+ for (field_id, field_data) in fields.iter() {
+ res.insert(field_id, Visibility::resolve(db, &resolver, &field_data.visibility));
+ }
+ res
}
- res.shrink_to_fit();
- Arc::new(res)
}
pub fn visibility_from_ast(
diff --git a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
index eda7e7e249..bc3d9bbec6 100644
--- a/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
+++ b/crates/hir-ty/src/diagnostics/match_check/pat_analysis.rs
@@ -4,6 +4,7 @@ use std::{cell::LazyCell, fmt};
use hir_def::{
EnumId, EnumVariantId, HasModule, LocalFieldId, ModuleId, VariantId, attrs::AttrFlags,
+ signatures::VariantFields,
};
use intern::sym;
use rustc_pattern_analysis::{
@@ -363,7 +364,8 @@ impl<'a, 'db> PatCx for MatchCheckCtx<'a, 'db> {
let adt = adt_def.def_id().0;
let variant = Self::variant_id_for_adt(self.db, ctor, adt).unwrap();
- let visibilities = LazyCell::new(|| self.db.field_visibilities(variant));
+ let visibilities =
+ LazyCell::new(|| VariantFields::field_visibilities(self.db, variant));
self.list_variant_fields(*ty, variant)
.map(move |(fid, ty)| {
diff --git a/crates/hir-ty/src/infer/expr.rs b/crates/hir-ty/src/infer/expr.rs
index c4c217b010..dc57b1d1c2 100644
--- a/crates/hir-ty/src/infer/expr.rs
+++ b/crates/hir-ty/src/infer/expr.rs
@@ -11,7 +11,7 @@ use hir_def::{
InlineAsmKind, LabelId, Literal, Pat, PatId, RecordSpread, Statement, UnaryOp,
},
resolver::ValueNs,
- signatures::FunctionSignature,
+ signatures::{FunctionSignature, VariantFields},
};
use hir_def::{FunctionId, hir::ClosureKind};
use hir_expand::name::Name;
@@ -609,7 +609,7 @@ impl<'db> InferenceContext<'_, 'db> {
Some(def) => {
let field_types = self.db.field_types(def);
let variant_data = def.fields(self.db);
- let visibilities = self.db.field_visibilities(def);
+ let visibilities = VariantFields::field_visibilities(self.db, def);
for field in fields.iter() {
let field_def = {
match variant_data.field(&field.name) {
@@ -1625,7 +1625,8 @@ impl<'db> InferenceContext<'_, 'db> {
},
_ => return None,
};
- let is_visible = self.db.field_visibilities(field_id.parent)[field_id.local_id]
+ let is_visible = VariantFields::field_visibilities(self.db, field_id.parent)
+ [field_id.local_id]
.is_visible_from(self.db, self.resolver.module());
if !is_visible {
if private_field.is_none() {
diff --git a/crates/hir-ty/src/infer/pat.rs b/crates/hir-ty/src/infer/pat.rs
index 0b6c9977f0..8033680dcc 100644
--- a/crates/hir-ty/src/infer/pat.rs
+++ b/crates/hir-ty/src/infer/pat.rs
@@ -6,6 +6,7 @@ use hir_def::{
HasModule as _,
expr_store::{ExpressionStore, path::Path},
hir::{Binding, BindingAnnotation, BindingId, Expr, ExprId, Literal, Pat, PatId},
+ signatures::VariantFields,
};
use hir_expand::name::Name;
use rustc_ast_ir::Mutability;
@@ -60,7 +61,7 @@ impl<'db> InferenceContext<'_, 'db> {
Some(def) => {
let field_types = self.db.field_types(def);
let variant_data = def.fields(self.db);
- let visibilities = self.db.field_visibilities(def);
+ let visibilities = VariantFields::field_visibilities(self.db, def);
let (pre, post) = match ellipsis {
Some(idx) => subs.split_at(idx as usize),
@@ -129,7 +130,7 @@ impl<'db> InferenceContext<'_, 'db> {
Some(def) => {
let field_types = self.db.field_types(def);
let variant_data = def.fields(self.db);
- let visibilities = self.db.field_visibilities(def);
+ let visibilities = VariantFields::field_visibilities(self.db, def);
let substs = ty.as_adt().map(TupleExt::tail);
diff --git a/crates/hir-ty/src/inhabitedness.rs b/crates/hir-ty/src/inhabitedness.rs
index 402e9ce969..74d66123ea 100644
--- a/crates/hir-ty/src/inhabitedness.rs
+++ b/crates/hir-ty/src/inhabitedness.rs
@@ -1,7 +1,9 @@
//! Type inhabitedness logic.
use std::ops::ControlFlow::{self, Break, Continue};
-use hir_def::{AdtId, EnumVariantId, ModuleId, VariantId, visibility::Visibility};
+use hir_def::{
+ AdtId, EnumVariantId, ModuleId, VariantId, signatures::VariantFields, visibility::Visibility,
+};
use rustc_hash::FxHashSet;
use rustc_type_ir::{
TypeSuperVisitable, TypeVisitable, TypeVisitor,
@@ -151,7 +153,11 @@ impl<'a, 'db> UninhabitedFrom<'a, 'db> {
let is_enum = matches!(variant, VariantId::EnumVariantId(..));
let field_tys = self.db().field_types(variant);
- let field_vis = if is_enum { None } else { Some(self.db().field_visibilities(variant)) };
+ let field_vis = if is_enum {
+ None
+ } else {
+ Some(VariantFields::field_visibilities(self.db(), variant))
+ };
for (fid, _) in fields.iter() {
self.visit_field(field_vis.as_ref().map(|it| it[fid]), &field_tys[fid].get(), subst)?;