hir_ty: add field_visibilities and fn_visibility queries
This commit is contained in:
parent
edfd741c5b
commit
30980396af
@ -4,8 +4,8 @@ use std::sync::Arc;
|
||||
|
||||
use base_db::{impl_intern_key, salsa, CrateId, Upcast};
|
||||
use hir_def::{
|
||||
db::DefDatabase, expr::ExprId, ConstParamId, DefWithBodyId, FunctionId, GenericDefId, ImplId,
|
||||
LocalFieldId, TypeParamId, VariantId,
|
||||
db::DefDatabase, expr::ExprId, visibility::Visibility, ConstParamId, DefWithBodyId, FunctionId,
|
||||
GenericDefId, ImplId, LocalFieldId, TypeParamId, VariantId,
|
||||
};
|
||||
use la_arena::ArenaMap;
|
||||
|
||||
@ -128,6 +128,12 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
|
||||
krate: CrateId,
|
||||
env: chalk_ir::Environment<chalk::Interner>,
|
||||
) -> chalk_ir::ProgramClauses<chalk::Interner>;
|
||||
|
||||
#[salsa::invoke(crate::lower::field_visibilities_query)]
|
||||
fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
|
||||
|
||||
#[salsa::invoke(crate::lower::fn_visibility_query)]
|
||||
fn fn_visibility(&self, def: FunctionId) -> Visibility;
|
||||
}
|
||||
|
||||
fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
|
||||
|
@ -16,9 +16,10 @@ use hir_def::{
|
||||
path::{GenericArg, Path, PathSegment, PathSegments},
|
||||
resolver::{HasResolver, Resolver, TypeNs},
|
||||
type_ref::{TypeBound, TypeRef},
|
||||
visibility::Visibility,
|
||||
AdtId, AssocContainerId, AssocItemId, ConstId, ConstParamId, EnumId, EnumVariantId, FunctionId,
|
||||
GenericDefId, HasModule, ImplId, LocalFieldId, Lookup, StaticId, StructId, TraitId,
|
||||
TypeAliasId, TypeParamId, UnionId, VariantId,
|
||||
GenericDefId, HasModule, ImplId, LocalFieldId, Lookup, ModuleDefId, StaticId, StructId,
|
||||
TraitId, TypeAliasId, TypeParamId, UnionId, VariantId,
|
||||
};
|
||||
use hir_expand::name::Name;
|
||||
use la_arena::ArenaMap;
|
||||
@ -867,6 +868,28 @@ pub(crate) fn field_types_query(
|
||||
Arc::new(res)
|
||||
}
|
||||
|
||||
/// Resolve visibility of all specific fields of a struct or union variant.
|
||||
pub(crate) fn field_visibilities_query(
|
||||
db: &dyn HirDatabase,
|
||||
variant_id: VariantId,
|
||||
) -> Arc<ArenaMap<LocalFieldId, Visibility>> {
|
||||
let def_db = db.upcast();
|
||||
let var_data = variant_data(def_db, variant_id);
|
||||
let resolver = variant_id.module(def_db).resolver(def_db);
|
||||
let mut res = ArenaMap::default();
|
||||
for (field_id, field_data) in var_data.fields().iter() {
|
||||
res.insert(field_id, field_data.visibility.resolve(def_db, &resolver))
|
||||
}
|
||||
Arc::new(res)
|
||||
}
|
||||
|
||||
/// Resolve visibility of a function.
|
||||
pub(crate) fn fn_visibility_query(db: &dyn HirDatabase, def: FunctionId) -> Visibility {
|
||||
let def_db = db.upcast();
|
||||
let resolver = ModuleDefId::from(def).module(def_db).unwrap().resolver(def_db);
|
||||
db.function_data(def).visibility.resolve(def_db, &resolver)
|
||||
}
|
||||
|
||||
/// This query exists only to be used when resolving short-hand associated types
|
||||
/// like `T::Item`.
|
||||
///
|
||||
|
Loading…
x
Reference in New Issue
Block a user