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.rs94
1 files changed, 71 insertions, 23 deletions
diff --git a/crates/hir-def/src/lib.rs b/crates/hir-def/src/lib.rs
index c3c9fc7525..e5c213ca93 100644
--- a/crates/hir-def/src/lib.rs
+++ b/crates/hir-def/src/lib.rs
@@ -19,7 +19,7 @@ extern crate ra_ap_rustc_abi as rustc_abi;
pub mod db;
-pub mod attrs;
+pub mod attr;
pub mod builtin_type;
pub mod item_scope;
pub mod per_ns;
@@ -45,7 +45,7 @@ pub mod find_path;
pub mod import_map;
pub mod visibility;
-use intern::{Interned, Symbol};
+use intern::{Interned, Symbol, sym};
pub use rustc_abi as layout;
use thin_vec::ThinVec;
use triomphe::Arc;
@@ -80,7 +80,7 @@ use syntax::{AstNode, ast};
pub use hir_expand::{Intern, Lookup, tt};
use crate::{
- attrs::AttrFlags,
+ attr::Attrs,
builtin_type::BuiltinType,
db::DefDatabase,
expr_store::ExpressionStoreSourceMap,
@@ -956,16 +956,10 @@ impl CallableDefId {
}
}
-// FIXME: We probably should use this in more places.
-/// This is used to avoid interning the whole `AttrDefId`, so we intern just modules and not everything.
-#[salsa_macros::interned(debug, no_lifetime)]
-pub struct InternedModuleId {
- pub loc: ModuleId,
-}
-
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, salsa_macros::Supertype)]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub enum AttrDefId {
- ModuleId(InternedModuleId),
+ ModuleId(ModuleId),
+ FieldId(FieldId),
AdtId(AdtId),
FunctionId(FunctionId),
EnumVariantId(EnumVariantId),
@@ -975,12 +969,15 @@ pub enum AttrDefId {
TypeAliasId(TypeAliasId),
MacroId(MacroId),
ImplId(ImplId),
+ GenericParamId(GenericParamId),
ExternBlockId(ExternBlockId),
ExternCrateId(ExternCrateId),
UseId(UseId),
}
impl_from!(
+ ModuleId,
+ FieldId,
AdtId(StructId, EnumId, UnionId),
EnumVariantId,
StaticId,
@@ -990,11 +987,41 @@ impl_from!(
TypeAliasId,
MacroId(Macro2Id, MacroRulesId, ProcMacroId),
ImplId,
+ GenericParamId,
ExternCrateId,
UseId
for AttrDefId
);
+impl TryFrom<ModuleDefId> for AttrDefId {
+ type Error = ();
+
+ fn try_from(value: ModuleDefId) -> Result<Self, Self::Error> {
+ match value {
+ ModuleDefId::ModuleId(it) => Ok(it.into()),
+ ModuleDefId::FunctionId(it) => Ok(it.into()),
+ ModuleDefId::AdtId(it) => Ok(it.into()),
+ ModuleDefId::EnumVariantId(it) => Ok(it.into()),
+ ModuleDefId::ConstId(it) => Ok(it.into()),
+ ModuleDefId::StaticId(it) => Ok(it.into()),
+ ModuleDefId::TraitId(it) => Ok(it.into()),
+ ModuleDefId::TypeAliasId(it) => Ok(it.into()),
+ ModuleDefId::MacroId(id) => Ok(id.into()),
+ ModuleDefId::BuiltinType(_) => Err(()),
+ }
+ }
+}
+
+impl From<ItemContainerId> for AttrDefId {
+ fn from(acid: ItemContainerId) -> Self {
+ match acid {
+ ItemContainerId::ModuleId(mid) => AttrDefId::ModuleId(mid),
+ ItemContainerId::ImplId(iid) => AttrDefId::ImplId(iid),
+ ItemContainerId::TraitId(tid) => AttrDefId::TraitId(tid),
+ ItemContainerId::ExternBlockId(id) => AttrDefId::ExternBlockId(id),
+ }
+ }
+}
impl From<AssocItemId> for AttrDefId {
fn from(assoc: AssocItemId) -> Self {
match assoc {
@@ -1235,7 +1262,8 @@ impl HasModule for GenericDefId {
impl HasModule for AttrDefId {
fn module(&self, db: &dyn DefDatabase) -> ModuleId {
match self {
- AttrDefId::ModuleId(it) => it.loc(db),
+ AttrDefId::ModuleId(it) => *it,
+ AttrDefId::FieldId(it) => it.parent.module(db),
AttrDefId::AdtId(it) => it.module(db),
AttrDefId::FunctionId(it) => it.module(db),
AttrDefId::EnumVariantId(it) => it.module(db),
@@ -1245,6 +1273,12 @@ impl HasModule for AttrDefId {
AttrDefId::TypeAliasId(it) => it.module(db),
AttrDefId::ImplId(it) => it.module(db),
AttrDefId::ExternBlockId(it) => it.module(db),
+ AttrDefId::GenericParamId(it) => match it {
+ GenericParamId::TypeParamId(it) => it.parent(),
+ GenericParamId::ConstParamId(it) => it.parent(),
+ GenericParamId::LifetimeParamId(it) => it.parent,
+ }
+ .module(db),
AttrDefId::MacroId(it) => it.module(db),
AttrDefId::ExternCrateId(it) => it.module(db),
AttrDefId::UseId(it) => it.module(db),
@@ -1368,18 +1402,32 @@ pub enum Complete {
}
impl Complete {
- #[inline]
- pub fn extract(is_trait: bool, attrs: AttrFlags) -> Complete {
- if attrs.contains(AttrFlags::COMPLETE_IGNORE_FLYIMPORT) {
- return Complete::IgnoreFlyimport;
- } else if is_trait {
- if attrs.contains(AttrFlags::COMPLETE_IGNORE_METHODS) {
- return Complete::IgnoreMethods;
- } else if attrs.contains(AttrFlags::COMPLETE_IGNORE_FLYIMPORT_METHODS) {
- return Complete::IgnoreFlyimportMethods;
+ pub fn extract(is_trait: bool, attrs: &Attrs) -> Complete {
+ let mut do_not_complete = Complete::Yes;
+ for ra_attr in attrs.rust_analyzer_tool() {
+ let segments = ra_attr.path.segments();
+ if segments.len() != 2 {
+ continue;
+ }
+ let action = segments[1].symbol();
+ if *action == sym::completions {
+ match ra_attr.token_tree_value().map(|tt| tt.token_trees().flat_tokens()) {
+ Some([tt::TokenTree::Leaf(tt::Leaf::Ident(ident))]) => {
+ if ident.sym == sym::ignore_flyimport {
+ do_not_complete = Complete::IgnoreFlyimport;
+ } else if is_trait {
+ if ident.sym == sym::ignore_methods {
+ do_not_complete = Complete::IgnoreMethods;
+ } else if ident.sym == sym::ignore_flyimport_methods {
+ do_not_complete = Complete::IgnoreFlyimportMethods;
+ }
+ }
+ }
+ _ => {}
+ }
}
}
- Complete::Yes
+ do_not_complete
}
#[inline]