Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/lib.rs')
-rw-r--r--crates/hir-def/src/lib.rs63
1 files changed, 60 insertions, 3 deletions
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index a562f2d0af..bdf8b453e2 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -87,9 +87,12 @@ use crate::{
attr::Attrs,
builtin_type::BuiltinType,
db::DefDatabase,
+ expr_store::ExpressionStoreSourceMap,
hir::generics::{LocalLifetimeParamId, LocalTypeOrConstParamId},
nameres::{
- LocalDefMap, assoc::ImplItems, block_def_map, crate_def_map, crate_local_def_map,
+ LocalDefMap,
+ assoc::{ImplItems, TraitItems},
+ block_def_map, crate_def_map, crate_local_def_map,
diagnostics::DefDiagnostics,
},
signatures::{EnumVariants, InactiveEnumVariantCode, VariantFields},
@@ -252,9 +255,35 @@ impl_intern!(FunctionId, FunctionLoc, intern_function, lookup_intern_function);
type StructLoc = ItemLoc<ast::Struct>;
impl_intern!(StructId, StructLoc, intern_struct, lookup_intern_struct);
+impl StructId {
+ pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
+ VariantFields::firewall(db, self.into())
+ }
+
+ pub fn fields_with_source_map(
+ self,
+ db: &dyn DefDatabase,
+ ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) {
+ VariantFields::query(db, self.into())
+ }
+}
+
pub type UnionLoc = ItemLoc<ast::Union>;
impl_intern!(UnionId, UnionLoc, intern_union, lookup_intern_union);
+impl UnionId {
+ pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
+ VariantFields::firewall(db, self.into())
+ }
+
+ pub fn fields_with_source_map(
+ self,
+ db: &dyn DefDatabase,
+ ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) {
+ VariantFields::query(db, self.into())
+ }
+}
+
pub type EnumLoc = ItemLoc<ast::Enum>;
impl_intern!(EnumId, EnumLoc, intern_enum, lookup_intern_enum);
@@ -282,6 +311,13 @@ impl_intern!(StaticId, StaticLoc, intern_static, lookup_intern_static);
pub type TraitLoc = ItemLoc<ast::Trait>;
impl_intern!(TraitId, TraitLoc, intern_trait, lookup_intern_trait);
+impl TraitId {
+ #[inline]
+ pub fn trait_items(self, db: &dyn DefDatabase) -> &TraitItems {
+ TraitItems::query(db, self)
+ }
+}
+
pub type TraitAliasLoc = ItemLoc<ast::TraitAlias>;
impl_intern!(TraitAliasId, TraitAliasLoc, intern_trait_alias, lookup_intern_trait_alias);
@@ -328,6 +364,20 @@ pub struct EnumVariantLoc {
}
impl_intern!(EnumVariantId, EnumVariantLoc, intern_enum_variant, lookup_intern_enum_variant);
impl_loc!(EnumVariantLoc, id: Variant, parent: EnumId);
+
+impl EnumVariantId {
+ pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
+ VariantFields::firewall(db, self.into())
+ }
+
+ pub fn fields_with_source_map(
+ self,
+ db: &dyn DefDatabase,
+ ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) {
+ VariantFields::query(db, self.into())
+ }
+}
+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Macro2Loc {
pub container: ModuleId,
@@ -1015,8 +1065,15 @@ pub enum VariantId {
impl_from!(EnumVariantId, StructId, UnionId for VariantId);
impl VariantId {
- pub fn variant_data(self, db: &dyn DefDatabase) -> Arc<VariantFields> {
- db.variant_fields(self)
+ pub fn fields(self, db: &dyn DefDatabase) -> &VariantFields {
+ VariantFields::firewall(db, self)
+ }
+
+ pub fn fields_with_source_map(
+ self,
+ db: &dyn DefDatabase,
+ ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>) {
+ VariantFields::query(db, self)
}
pub fn file_id(self, db: &dyn DefDatabase) -> HirFileId {