Skip to content

Commit 73d9c77

Browse files
scip: Populate SymbolInformation::kind
SymbolInformation::kind is finer-grained than the SCIP symbol suffix. This also fixes a bug where all type aliases where treated like type parameters. ``` trait SomeTrait { type AssociatedType; // ← this is SomeTrait#[AssociatedType] } type MyTypeAlias = u8; // ← this used to be [MyTypeAlias] // and now is MyTypeAlias# ```
1 parent 566bb77 commit 73d9c77

File tree

5 files changed

+248
-75
lines changed

5 files changed

+248
-75
lines changed

crates/ide-db/src/defs.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use hir::{
1010
Adt, AsAssocItem, AssocItem, AttributeTemplate, BuiltinAttr, BuiltinType, Const, Crate,
1111
DefWithBody, DeriveHelper, DocLinkDef, ExternCrateDecl, Field, Function, GenericParam,
1212
HasVisibility, HirDisplay, Impl, Label, Local, Macro, Module, ModuleDef, Name, PathResolution,
13-
Semantics, Static, ToolModule, Trait, TraitAlias, TypeAlias, Variant, Visibility,
13+
Semantics, Static, ToolModule, Trait, TraitAlias, TypeAlias, Variant, VariantDef, Visibility,
1414
};
1515
use stdx::{format_to, impl_from};
1616
use syntax::{
@@ -791,6 +791,12 @@ impl From<DocLinkDef> for Definition {
791791
}
792792
}
793793

794+
impl From<VariantDef> for Definition {
795+
fn from(def: VariantDef) -> Self {
796+
ModuleDef::from(def).into()
797+
}
798+
}
799+
794800
impl TryFrom<DefWithBody> for Definition {
795801
type Error = ();
796802
fn try_from(def: DefWithBody) -> Result<Self, Self::Error> {

crates/ide/src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ pub use crate::{
9999
},
100100
join_lines::JoinLinesConfig,
101101
markup::Markup,
102-
moniker::{MonikerDescriptorKind, MonikerKind, MonikerResult, PackageInformation},
102+
moniker::{
103+
MonikerDescriptorKind, MonikerKind, MonikerResult, PackageInformation,
104+
SymbolInformationKind,
105+
},
103106
move_item::Direction,
104107
navigation_target::{NavigationTarget, UpmappingResult},
105108
prime_caches::ParallelPrimeCachesProgress,

crates/ide/src/moniker.rs

Lines changed: 177 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! This module generates [moniker](https://microsoft.github.io/language-server-protocol/specifications/lsif/0.6.0/specification/#exportsImports)
22
//! for LSIF and LSP.
33
4-
use hir::{AsAssocItem, AssocItemContainer, Crate, DescendPreference, Semantics};
4+
use hir::{Adt, AsAssocItem, AssocItemContainer, Crate, DescendPreference, MacroKind, Semantics};
55
use ide_db::{
66
base_db::{CrateOrigin, FilePosition, LangCrateOrigin},
77
defs::{Definition, IdentClass},
@@ -25,6 +25,62 @@ pub enum MonikerDescriptorKind {
2525
Meta,
2626
}
2727

28+
// Subset of scip_types::SymbolInformation::Kind
29+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
30+
pub enum SymbolInformationKind {
31+
AssociatedType,
32+
Attribute,
33+
Constant,
34+
Enum,
35+
EnumMember,
36+
Field,
37+
Function,
38+
Macro,
39+
Method,
40+
Module,
41+
Parameter,
42+
SelfParameter,
43+
StaticMethod,
44+
StaticVariable,
45+
Struct,
46+
Trait,
47+
TraitMethod,
48+
Type,
49+
TypeAlias,
50+
TypeParameter,
51+
Union,
52+
Variable,
53+
}
54+
55+
impl From<SymbolInformationKind> for MonikerDescriptorKind {
56+
fn from(value: SymbolInformationKind) -> Self {
57+
match value {
58+
SymbolInformationKind::AssociatedType => Self::TypeParameter,
59+
SymbolInformationKind::Attribute => Self::Macro,
60+
SymbolInformationKind::Constant => Self::Term,
61+
SymbolInformationKind::Enum => Self::Type,
62+
SymbolInformationKind::EnumMember => Self::Type,
63+
SymbolInformationKind::Field => Self::Term,
64+
SymbolInformationKind::Function => Self::Method,
65+
SymbolInformationKind::Macro => Self::Macro,
66+
SymbolInformationKind::Method => Self::Method,
67+
SymbolInformationKind::Module => Self::Namespace,
68+
SymbolInformationKind::Parameter => Self::Parameter,
69+
SymbolInformationKind::SelfParameter => Self::Parameter,
70+
SymbolInformationKind::StaticMethod => Self::Method,
71+
SymbolInformationKind::StaticVariable => Self::Meta,
72+
SymbolInformationKind::Struct => Self::Type,
73+
SymbolInformationKind::Trait => Self::Type,
74+
SymbolInformationKind::TraitMethod => Self::Method,
75+
SymbolInformationKind::Type => Self::Type,
76+
SymbolInformationKind::TypeAlias => Self::Type,
77+
SymbolInformationKind::TypeParameter => Self::TypeParameter,
78+
SymbolInformationKind::Union => Self::Type,
79+
SymbolInformationKind::Variable => Self::Term,
80+
}
81+
}
82+
}
83+
2884
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
2985
pub struct MonikerDescriptor {
3086
pub name: String,
@@ -112,6 +168,69 @@ pub(crate) fn moniker(
112168
Some(RangeInfo::new(original_token.text_range(), navs))
113169
}
114170

171+
pub(crate) fn def_to_kind(db: &RootDatabase, def: Definition) -> SymbolInformationKind {
172+
use SymbolInformationKind::*;
173+
174+
match def {
175+
Definition::Macro(it) => match it.kind(db) {
176+
MacroKind::Declarative => Macro,
177+
MacroKind::Derive => Attribute,
178+
MacroKind::BuiltIn => Macro,
179+
MacroKind::Attr => Attribute,
180+
MacroKind::ProcMacro => Macro,
181+
},
182+
Definition::Field(..) => Field,
183+
Definition::Module(..) => Module,
184+
Definition::Function(it) => {
185+
if it.as_assoc_item(db).is_some() {
186+
if it.has_self_param(db) {
187+
if it.has_body(db) {
188+
Method
189+
} else {
190+
TraitMethod
191+
}
192+
} else {
193+
StaticMethod
194+
}
195+
} else {
196+
Function
197+
}
198+
}
199+
Definition::Adt(Adt::Struct(..)) => Struct,
200+
Definition::Adt(Adt::Union(..)) => Union,
201+
Definition::Adt(Adt::Enum(..)) => Enum,
202+
Definition::Variant(..) => EnumMember,
203+
Definition::Const(..) => Constant,
204+
Definition::Static(..) => StaticVariable,
205+
Definition::Trait(..) => Trait,
206+
Definition::TraitAlias(..) => Trait,
207+
Definition::TypeAlias(it) => {
208+
if it.as_assoc_item(db).is_some() {
209+
AssociatedType
210+
} else {
211+
TypeAlias
212+
}
213+
}
214+
Definition::BuiltinType(..) => Type,
215+
Definition::SelfType(..) => TypeAlias,
216+
Definition::GenericParam(..) => TypeParameter,
217+
Definition::Local(it) => {
218+
if it.is_self(db) {
219+
SelfParameter
220+
} else if it.is_param(db) {
221+
Parameter
222+
} else {
223+
Variable
224+
}
225+
}
226+
Definition::Label(..) => Variable, // For lack of a better variant
227+
Definition::DeriveHelper(..) => Attribute,
228+
Definition::BuiltinAttr(..) => Attribute,
229+
Definition::ToolModule(..) => Module,
230+
Definition::ExternCrateDecl(..) => Module,
231+
}
232+
}
233+
115234
pub(crate) fn def_to_moniker(
116235
db: &RootDatabase,
117236
def: Definition,
@@ -134,7 +253,7 @@ pub(crate) fn def_to_moniker(
134253
description.extend(module.path_to_root(db).into_iter().filter_map(|x| {
135254
Some(MonikerDescriptor {
136255
name: x.name(db)?.display(db).to_string(),
137-
desc: MonikerDescriptorKind::Namespace,
256+
desc: def_to_kind(db, x.into()).into(),
138257
})
139258
}));
140259

@@ -147,7 +266,7 @@ pub(crate) fn def_to_moniker(
147266
// we have to include the trait name as part of the moniker for uniqueness.
148267
description.push(MonikerDescriptor {
149268
name: trait_.name(db).display(db).to_string(),
150-
desc: MonikerDescriptorKind::Type,
269+
desc: def_to_kind(db, trait_.into()).into(),
151270
});
152271
}
153272
AssocItemContainer::Impl(impl_) => {
@@ -156,14 +275,14 @@ pub(crate) fn def_to_moniker(
156275
if let Some(adt) = impl_.self_ty(db).as_adt() {
157276
description.push(MonikerDescriptor {
158277
name: adt.name(db).display(db).to_string(),
159-
desc: MonikerDescriptorKind::Type,
278+
desc: def_to_kind(db, adt.into()).into(),
160279
});
161280
}
162281

163282
if let Some(trait_) = impl_.trait_(db) {
164283
description.push(MonikerDescriptor {
165284
name: trait_.name(db).display(db).to_string(),
166-
desc: MonikerDescriptorKind::Type,
285+
desc: def_to_kind(db, trait_.into()).into(),
167286
});
168287
}
169288
}
@@ -173,21 +292,26 @@ pub(crate) fn def_to_moniker(
173292
if let Definition::Field(it) = def {
174293
description.push(MonikerDescriptor {
175294
name: it.parent_def(db).name(db).display(db).to_string(),
176-
desc: MonikerDescriptorKind::Type,
295+
desc: def_to_kind(db, it.parent_def(db).into()).into(),
177296
});
178297
}
179298

180299
// Qualify locals/parameters by their parent definition name.
181300
if let Definition::Local(it) = def {
182-
let parent_name = it.parent(db).name(db);
183-
if let Some(name) = parent_name {
184-
description.push(MonikerDescriptor {
185-
name: name.display(db).to_string(),
186-
desc: MonikerDescriptorKind::Method,
187-
});
301+
let parent = Definition::try_from(it.parent(db)).ok();
302+
if let Some(parent) = parent {
303+
let parent_name = parent.name(db);
304+
if let Some(name) = parent_name {
305+
description.push(MonikerDescriptor {
306+
name: name.display(db).to_string(),
307+
desc: def_to_kind(db, parent).into(),
308+
});
309+
}
188310
}
189311
}
190312

313+
let desc = def_to_kind(db, def).into();
314+
191315
let name_desc = match def {
192316
// These are handled by top-level guard (for performance).
193317
Definition::GenericParam(_)
@@ -201,67 +325,51 @@ pub(crate) fn def_to_moniker(
201325
return None;
202326
}
203327

204-
MonikerDescriptor {
205-
name: local.name(db).display(db).to_string(),
206-
desc: MonikerDescriptorKind::Parameter,
207-
}
328+
MonikerDescriptor { name: local.name(db).display(db).to_string(), desc }
329+
}
330+
Definition::Macro(m) => {
331+
MonikerDescriptor { name: m.name(db).display(db).to_string(), desc }
332+
}
333+
Definition::Function(f) => {
334+
MonikerDescriptor { name: f.name(db).display(db).to_string(), desc }
335+
}
336+
Definition::Variant(v) => {
337+
MonikerDescriptor { name: v.name(db).display(db).to_string(), desc }
338+
}
339+
Definition::Const(c) => {
340+
MonikerDescriptor { name: c.name(db)?.display(db).to_string(), desc }
341+
}
342+
Definition::Trait(trait_) => {
343+
MonikerDescriptor { name: trait_.name(db).display(db).to_string(), desc }
344+
}
345+
Definition::TraitAlias(ta) => {
346+
MonikerDescriptor { name: ta.name(db).display(db).to_string(), desc }
347+
}
348+
Definition::TypeAlias(ta) => {
349+
MonikerDescriptor { name: ta.name(db).display(db).to_string(), desc }
350+
}
351+
Definition::Module(m) => {
352+
MonikerDescriptor { name: m.name(db)?.display(db).to_string(), desc }
353+
}
354+
Definition::BuiltinType(b) => {
355+
MonikerDescriptor { name: b.name().display(db).to_string(), desc }
208356
}
209-
Definition::Macro(m) => MonikerDescriptor {
210-
name: m.name(db).display(db).to_string(),
211-
desc: MonikerDescriptorKind::Macro,
212-
},
213-
Definition::Function(f) => MonikerDescriptor {
214-
name: f.name(db).display(db).to_string(),
215-
desc: MonikerDescriptorKind::Method,
216-
},
217-
Definition::Variant(v) => MonikerDescriptor {
218-
name: v.name(db).display(db).to_string(),
219-
desc: MonikerDescriptorKind::Type,
220-
},
221-
Definition::Const(c) => MonikerDescriptor {
222-
name: c.name(db)?.display(db).to_string(),
223-
desc: MonikerDescriptorKind::Term,
224-
},
225-
Definition::Trait(trait_) => MonikerDescriptor {
226-
name: trait_.name(db).display(db).to_string(),
227-
desc: MonikerDescriptorKind::Type,
228-
},
229-
Definition::TraitAlias(ta) => MonikerDescriptor {
230-
name: ta.name(db).display(db).to_string(),
231-
desc: MonikerDescriptorKind::Type,
232-
},
233-
Definition::TypeAlias(ta) => MonikerDescriptor {
234-
name: ta.name(db).display(db).to_string(),
235-
desc: MonikerDescriptorKind::TypeParameter,
236-
},
237-
Definition::Module(m) => MonikerDescriptor {
238-
name: m.name(db)?.display(db).to_string(),
239-
desc: MonikerDescriptorKind::Namespace,
240-
},
241-
Definition::BuiltinType(b) => MonikerDescriptor {
242-
name: b.name().display(db).to_string(),
243-
desc: MonikerDescriptorKind::Type,
244-
},
245357
Definition::SelfType(imp) => MonikerDescriptor {
246358
name: imp.self_ty(db).as_adt()?.name(db).display(db).to_string(),
247-
desc: MonikerDescriptorKind::Type,
248-
},
249-
Definition::Field(it) => MonikerDescriptor {
250-
name: it.name(db).display(db).to_string(),
251-
desc: MonikerDescriptorKind::Term,
252-
},
253-
Definition::Adt(adt) => MonikerDescriptor {
254-
name: adt.name(db).display(db).to_string(),
255-
desc: MonikerDescriptorKind::Type,
256-
},
257-
Definition::Static(s) => MonikerDescriptor {
258-
name: s.name(db).display(db).to_string(),
259-
desc: MonikerDescriptorKind::Meta,
260-
},
261-
Definition::ExternCrateDecl(m) => MonikerDescriptor {
262-
name: m.name(db).display(db).to_string(),
263-
desc: MonikerDescriptorKind::Namespace,
359+
desc,
264360
},
361+
Definition::Field(it) => {
362+
MonikerDescriptor { name: it.name(db).display(db).to_string(), desc }
363+
}
364+
Definition::Adt(adt) => {
365+
MonikerDescriptor { name: adt.name(db).display(db).to_string(), desc }
366+
}
367+
Definition::Static(s) => {
368+
MonikerDescriptor { name: s.name(db).display(db).to_string(), desc }
369+
}
370+
Definition::ExternCrateDecl(m) => {
371+
MonikerDescriptor { name: m.name(db).display(db).to_string(), desc }
372+
}
265373
};
266374

267375
description.push(name_desc);

crates/ide/src/static_index.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use crate::navigation_target::UpmappingResult;
1717
use crate::{
1818
hover::hover_for_definition,
1919
inlay_hints::AdjustmentHintsMode,
20-
moniker::{def_to_moniker, MonikerResult},
20+
moniker::{def_to_kind, def_to_moniker, MonikerResult, SymbolInformationKind},
2121
parent_module::crates_for,
2222
Analysis, Fold, HoverConfig, HoverResult, InlayHint, InlayHintsConfig, TryToNav,
2323
};
@@ -49,6 +49,7 @@ pub struct TokenStaticData {
4949
pub display_name: Option<String>,
5050
pub enclosing_moniker: Option<MonikerResult>,
5151
pub signature: Option<String>,
52+
pub kind: SymbolInformationKind,
5253
}
5354

5455
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -180,6 +181,7 @@ impl StaticIndex<'_> {
180181
.zip(def.enclosing_definition(self.db))
181182
.and_then(|(cc, enclosing_def)| def_to_moniker(self.db, enclosing_def, cc)),
182183
signature: def.label(self.db),
184+
kind: def_to_kind(self.db, def),
183185
});
184186
self.def_map.insert(def, it);
185187
it

0 commit comments

Comments
 (0)