Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/db.rs')
-rw-r--r--crates/hir-def/src/db.rs111
1 files changed, 24 insertions, 87 deletions
diff --git a/crates/hir-def/src/db.rs b/crates/hir-def/src/db.rs
index 4a9a3b12cf..c67bb2422a 100644
--- a/crates/hir-def/src/db.rs
+++ b/crates/hir-def/src/db.rs
@@ -1,37 +1,34 @@
//! Defines database & queries for name resolution.
use base_db::{Crate, RootQueryDb, SourceDatabase};
use either::Either;
-use hir_expand::{EditionedFileId, HirFileId, MacroCallId, MacroDefId, db::ExpandDatabase};
+use hir_expand::{
+ EditionedFileId, HirFileId, InFile, Lookup, MacroCallId, MacroDefId, MacroDefKind,
+ db::ExpandDatabase,
+};
use intern::sym;
use la_arena::ArenaMap;
use syntax::{AstPtr, ast};
-use thin_vec::ThinVec;
use triomphe::Arc;
use crate::{
- AttrDefId, BlockId, BlockLoc, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc, EnumVariantId,
- EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId,
- FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc, MacroId,
- MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId, ProcMacroLoc, StaticId,
- StaticLoc, StructId, StructLoc, TraitAliasId, TraitAliasLoc, TraitId, TraitLoc, TypeAliasId,
- TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
+ AssocItemId, AttrDefId, BlockId, BlockLoc, ConstId, ConstLoc, DefWithBodyId, EnumId, EnumLoc,
+ EnumVariantId, EnumVariantLoc, ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc,
+ FunctionId, FunctionLoc, GenericDefId, ImplId, ImplLoc, LocalFieldId, Macro2Id, Macro2Loc,
+ MacroExpander, MacroId, MacroRulesId, MacroRulesLoc, MacroRulesLocFlags, ProcMacroId,
+ ProcMacroLoc, StaticId, StaticLoc, StructId, StructLoc, TraitAliasId, TraitAliasLoc, TraitId,
+ TraitLoc, TypeAliasId, TypeAliasLoc, UnionId, UnionLoc, UseId, UseLoc, VariantId,
attr::{Attrs, AttrsWithOwner},
expr_store::{
Body, BodySourceMap, ExpressionStore, ExpressionStoreSourceMap, scope::ExprScopes,
},
hir::generics::GenericParams,
import_map::ImportMap,
- item_tree::{AttrOwner, ItemTree},
+ item_tree::{ItemTree, file_item_tree_query},
lang_item::{self, LangItem},
- nameres::{
- assoc::{ImplItems, TraitItems},
- crate_def_map,
- diagnostics::DefDiagnostics,
- },
+ nameres::crate_def_map,
signatures::{
- ConstSignature, EnumSignature, EnumVariants, FunctionSignature, ImplSignature,
- InactiveEnumVariantCode, StaticSignature, StructSignature, TraitAliasSignature,
- TraitSignature, TypeAliasSignature, UnionSignature, VariantFields,
+ ConstSignature, EnumSignature, FunctionSignature, ImplSignature, StaticSignature,
+ StructSignature, TraitAliasSignature, TraitSignature, TypeAliasSignature, UnionSignature,
},
tt,
visibility::{self, Visibility},
@@ -92,7 +89,7 @@ pub trait InternDatabase: RootQueryDb {
#[salsa::interned]
fn intern_macro_rules(&self, loc: MacroRulesLoc) -> MacroRulesId;
- // // endregion: items
+ // endregion: items
#[salsa::interned]
fn intern_block(&self, loc: BlockLoc) -> BlockId;
@@ -105,11 +102,9 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
fn expand_proc_attr_macros(&self) -> bool;
/// Computes an [`ItemTree`] for the given file or macro expansion.
- #[salsa::invoke(ItemTree::file_item_tree_query)]
- fn file_item_tree(&self, file_id: HirFileId) -> Arc<ItemTree>;
-
- #[salsa::invoke(ItemTree::block_item_tree_query)]
- fn block_item_tree(&self, block_id: BlockId) -> Arc<ItemTree>;
+ #[salsa::invoke(file_item_tree_query)]
+ #[salsa::transparent]
+ fn file_item_tree(&self, file_id: HirFileId) -> &ItemTree;
/// Turns a MacroId into a MacroDefId, describing the macro's definition post name resolution.
#[salsa::invoke(macro_def)]
@@ -117,42 +112,6 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
// region:data
- #[salsa::invoke(VariantFields::query)]
- fn variant_fields_with_source_map(
- &self,
- id: VariantId,
- ) -> (Arc<VariantFields>, Arc<ExpressionStoreSourceMap>);
-
- #[salsa::tracked]
- fn enum_variants(&self, id: EnumId) -> Arc<EnumVariants> {
- self.enum_variants_with_diagnostics(id).0
- }
-
- #[salsa::invoke(EnumVariants::enum_variants_query)]
- fn enum_variants_with_diagnostics(
- &self,
- id: EnumId,
- ) -> (Arc<EnumVariants>, Option<Arc<ThinVec<InactiveEnumVariantCode>>>);
-
- #[salsa::transparent]
- #[salsa::invoke(ImplItems::impl_items_query)]
- fn impl_items(&self, e: ImplId) -> Arc<ImplItems>;
-
- #[salsa::invoke(ImplItems::impl_items_with_diagnostics_query)]
- fn impl_items_with_diagnostics(&self, e: ImplId) -> (Arc<ImplItems>, DefDiagnostics);
-
- #[salsa::transparent]
- #[salsa::invoke(TraitItems::trait_items_query)]
- fn trait_items(&self, e: TraitId) -> Arc<TraitItems>;
-
- #[salsa::invoke(TraitItems::trait_items_with_diagnostics_query)]
- fn trait_items_with_diagnostics(&self, tr: TraitId) -> (Arc<TraitItems>, DefDiagnostics);
-
- #[salsa::tracked]
- fn variant_fields(&self, id: VariantId) -> Arc<VariantFields> {
- self.variant_fields_with_source_map(id).0
- }
-
#[salsa::tracked]
fn trait_signature(&self, trait_: TraitId) -> Arc<TraitSignature> {
self.trait_signature_with_source_map(trait_).0
@@ -323,16 +282,8 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + SourceDatabase {
#[salsa::invoke(visibility::field_visibilities_query)]
fn field_visibilities(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Visibility>>;
- // FIXME: unify function_visibility and const_visibility?
-
- #[salsa::invoke(visibility::function_visibility_query)]
- fn function_visibility(&self, def: FunctionId) -> Visibility;
-
- #[salsa::invoke(visibility::const_visibility_query)]
- fn const_visibility(&self, def: ConstId) -> Visibility;
-
- #[salsa::invoke(visibility::type_alias_visibility_query)]
- fn type_alias_visibility(&self, def: TypeAliasId) -> Visibility;
+ #[salsa::invoke(visibility::assoc_visibility_query)]
+ fn assoc_visibility(&self, def: AssocItemId) -> Visibility;
// endregion:visibilities
@@ -368,7 +319,7 @@ fn include_macro_invoc(
fn crate_supports_no_std(db: &dyn DefDatabase, crate_id: Crate) -> bool {
let file = crate_id.data(db).root_file_id(db);
let item_tree = db.file_item_tree(file.into());
- let attrs = item_tree.raw_attrs(AttrOwner::TopLevel);
+ let attrs = item_tree.top_level_raw_attrs();
for attr in &**attrs {
match attr.path().as_ident() {
Some(ident) if *ident == sym::no_std => return true,
@@ -399,10 +350,6 @@ fn crate_supports_no_std(db: &dyn DefDatabase, crate_id: Crate) -> bool {
}
fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
- use hir_expand::InFile;
-
- use crate::{Lookup, MacroDefKind, MacroExpander};
-
let kind = |expander, file_id, m| {
let in_file = InFile::new(file_id, m);
match expander {
@@ -418,11 +365,9 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
MacroId::Macro2Id(it) => {
let loc: Macro2Loc = it.lookup(db);
- let item_tree = loc.id.item_tree(db);
- let makro = &item_tree[loc.id.value];
MacroDefId {
krate: loc.container.krate,
- kind: kind(loc.expander, loc.id.file_id(), makro.ast_id.upcast()),
+ kind: kind(loc.expander, loc.id.file_id, loc.id.value.upcast()),
local_inner: false,
allow_internal_unsafe: loc.allow_internal_unsafe,
edition: loc.edition,
@@ -431,11 +376,9 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
MacroId::MacroRulesId(it) => {
let loc: MacroRulesLoc = it.lookup(db);
- let item_tree = loc.id.item_tree(db);
- let makro = &item_tree[loc.id.value];
MacroDefId {
krate: loc.container.krate,
- kind: kind(loc.expander, loc.id.file_id(), makro.ast_id.upcast()),
+ kind: kind(loc.expander, loc.id.file_id, loc.id.value.upcast()),
local_inner: loc.flags.contains(MacroRulesLocFlags::LOCAL_INNER),
allow_internal_unsafe: loc
.flags
@@ -446,15 +389,9 @@ fn macro_def(db: &dyn DefDatabase, id: MacroId) -> MacroDefId {
MacroId::ProcMacroId(it) => {
let loc = it.lookup(db);
- let item_tree = loc.id.item_tree(db);
- let makro = &item_tree[loc.id.value];
MacroDefId {
krate: loc.container.krate,
- kind: MacroDefKind::ProcMacro(
- InFile::new(loc.id.file_id(), makro.ast_id),
- loc.expander,
- loc.kind,
- ),
+ kind: MacroDefKind::ProcMacro(loc.id, loc.expander, loc.kind),
local_inner: false,
allow_internal_unsafe: false,
edition: loc.edition,