aboutsummaryrefslogtreecommitdiff
path: root/crates
diff options
context:
space:
mode:
Diffstat (limited to 'crates')
-rw-r--r--crates/assists/src/handlers/generate_function.rs2
-rw-r--r--crates/ide/src/call_hierarchy.rs52
-rw-r--r--crates/ide/src/display.rs3
-rw-r--r--crates/ide/src/display/navigation_target.rs186
-rw-r--r--crates/ide/src/file_structure.rs80
-rw-r--r--crates/ide/src/goto_definition.rs4
-rw-r--r--crates/ide/src/hover.rs438
-rw-r--r--crates/ide/src/lib.rs16
-rw-r--r--crates/ide/src/parent_module.rs6
-rw-r--r--crates/ide/src/references.rs72
-rw-r--r--crates/ide/src/runnables.rs179
-rw-r--r--crates/ide_db/src/symbol_index.rs48
-rw-r--r--crates/rust-analyzer/src/handlers.rs19
-rw-r--r--crates/rust-analyzer/src/to_proto.rs46
-rw-r--r--crates/syntax/src/ast/make.rs3
15 files changed, 471 insertions, 683 deletions
diff --git a/crates/assists/src/handlers/generate_function.rs b/crates/assists/src/handlers/generate_function.rs
index 758188a42..f4cf155b6 100644
--- a/crates/assists/src/handlers/generate_function.rs
+++ b/crates/assists/src/handlers/generate_function.rs
@@ -145,7 +145,7 @@ impl FunctionBuilder {
145 self.type_params, 145 self.type_params,
146 self.params, 146 self.params,
147 fn_body, 147 fn_body,
148 Some(make::ret_type(make::ty("()"))), 148 Some(make::ret_type(make::ty_unit())),
149 ); 149 );
150 let leading_ws; 150 let leading_ws;
151 let trailing_ws; 151 let trailing_ws;
diff --git a/crates/ide/src/call_hierarchy.rs b/crates/ide/src/call_hierarchy.rs
index 8ad50a2ee..60e0cd4ad 100644
--- a/crates/ide/src/call_hierarchy.rs
+++ b/crates/ide/src/call_hierarchy.rs
@@ -181,8 +181,8 @@ fn caller() {
181 call<|>ee(); 181 call<|>ee();
182} 182}
183"#, 183"#,
184 "callee FN FileId(0) 0..14 3..9", 184 "callee Function FileId(0) 0..14 3..9",
185 &["caller FN FileId(0) 15..44 18..24 : [33..39]"], 185 &["caller Function FileId(0) 15..44 18..24 : [33..39]"],
186 &[], 186 &[],
187 ); 187 );
188 } 188 }
@@ -197,8 +197,8 @@ fn caller() {
197 callee(); 197 callee();
198} 198}
199"#, 199"#,
200 "callee FN FileId(0) 0..14 3..9", 200 "callee Function FileId(0) 0..14 3..9",
201 &["caller FN FileId(0) 15..44 18..24 : [33..39]"], 201 &["caller Function FileId(0) 15..44 18..24 : [33..39]"],
202 &[], 202 &[],
203 ); 203 );
204 } 204 }
@@ -214,8 +214,8 @@ fn caller() {
214 callee(); 214 callee();
215} 215}
216"#, 216"#,
217 "callee FN FileId(0) 0..14 3..9", 217 "callee Function FileId(0) 0..14 3..9",
218 &["caller FN FileId(0) 15..58 18..24 : [33..39, 47..53]"], 218 &["caller Function FileId(0) 15..58 18..24 : [33..39, 47..53]"],
219 &[], 219 &[],
220 ); 220 );
221 } 221 }
@@ -234,10 +234,10 @@ fn caller2() {
234 callee(); 234 callee();
235} 235}
236"#, 236"#,
237 "callee FN FileId(0) 0..14 3..9", 237 "callee Function FileId(0) 0..14 3..9",
238 &[ 238 &[
239 "caller1 FN FileId(0) 15..45 18..25 : [34..40]", 239 "caller1 Function FileId(0) 15..45 18..25 : [34..40]",
240 "caller2 FN FileId(0) 47..77 50..57 : [66..72]", 240 "caller2 Function FileId(0) 47..77 50..57 : [66..72]",
241 ], 241 ],
242 &[], 242 &[],
243 ); 243 );
@@ -263,10 +263,10 @@ mod tests {
263 } 263 }
264} 264}
265"#, 265"#,
266 "callee FN FileId(0) 0..14 3..9", 266 "callee Function FileId(0) 0..14 3..9",
267 &[ 267 &[
268 "caller1 FN FileId(0) 15..45 18..25 : [34..40]", 268 "caller1 Function FileId(0) 15..45 18..25 : [34..40]",
269 "test_caller FN FileId(0) 95..149 110..121 : [134..140]", 269 "test_caller Function FileId(0) 95..149 110..121 : [134..140]",
270 ], 270 ],
271 &[], 271 &[],
272 ); 272 );
@@ -287,8 +287,8 @@ fn caller() {
287//- /foo/mod.rs 287//- /foo/mod.rs
288pub fn callee() {} 288pub fn callee() {}
289"#, 289"#,
290 "callee FN FileId(1) 0..18 7..13", 290 "callee Function FileId(1) 0..18 7..13",
291 &["caller FN FileId(0) 27..56 30..36 : [45..51]"], 291 &["caller Function FileId(0) 27..56 30..36 : [45..51]"],
292 &[], 292 &[],
293 ); 293 );
294 } 294 }
@@ -304,9 +304,9 @@ fn call<|>er() {
304 callee(); 304 callee();
305} 305}
306"#, 306"#,
307 "caller FN FileId(0) 15..58 18..24", 307 "caller Function FileId(0) 15..58 18..24",
308 &[], 308 &[],
309 &["callee FN FileId(0) 0..14 3..9 : [33..39, 47..53]"], 309 &["callee Function FileId(0) 0..14 3..9 : [33..39, 47..53]"],
310 ); 310 );
311 } 311 }
312 312
@@ -325,9 +325,9 @@ fn call<|>er() {
325//- /foo/mod.rs 325//- /foo/mod.rs
326pub fn callee() {} 326pub fn callee() {}
327"#, 327"#,
328 "caller FN FileId(0) 27..56 30..36", 328 "caller Function FileId(0) 27..56 30..36",
329 &[], 329 &[],
330 &["callee FN FileId(1) 0..18 7..13 : [45..51]"], 330 &["callee Function FileId(1) 0..18 7..13 : [45..51]"],
331 ); 331 );
332 } 332 }
333 333
@@ -348,9 +348,9 @@ fn caller3() {
348 348
349} 349}
350"#, 350"#,
351 "caller2 FN FileId(0) 33..64 36..43", 351 "caller2 Function FileId(0) 33..64 36..43",
352 &["caller1 FN FileId(0) 0..31 3..10 : [19..26]"], 352 &["caller1 Function FileId(0) 0..31 3..10 : [19..26]"],
353 &["caller3 FN FileId(0) 66..83 69..76 : [52..59]"], 353 &["caller3 Function FileId(0) 66..83 69..76 : [52..59]"],
354 ); 354 );
355 } 355 }
356 356
@@ -368,9 +368,9 @@ fn main() {
368 a<|>() 368 a<|>()
369} 369}
370"#, 370"#,
371 "a FN FileId(0) 0..18 3..4", 371 "a Function FileId(0) 0..18 3..4",
372 &["main FN FileId(0) 31..52 34..38 : [47..48]"], 372 &["main Function FileId(0) 31..52 34..38 : [47..48]"],
373 &["b FN FileId(0) 20..29 23..24 : [13..14]"], 373 &["b Function FileId(0) 20..29 23..24 : [13..14]"],
374 ); 374 );
375 375
376 check_hierarchy( 376 check_hierarchy(
@@ -385,8 +385,8 @@ fn main() {
385 a() 385 a()
386} 386}
387"#, 387"#,
388 "b FN FileId(0) 20..29 23..24", 388 "b Function FileId(0) 20..29 23..24",
389 &["a FN FileId(0) 0..18 3..4 : [13..14]"], 389 &["a Function FileId(0) 0..18 3..4 : [13..14]"],
390 &[], 390 &[],
391 ); 391 );
392 } 392 }
diff --git a/crates/ide/src/display.rs b/crates/ide/src/display.rs
index 0650915c5..bae9e40df 100644
--- a/crates/ide/src/display.rs
+++ b/crates/ide/src/display.rs
@@ -1,10 +1,9 @@
1//! This module contains utilities for turning SyntaxNodes and HIR types 1//! This module contains utilities for turning SyntaxNodes and HIR types
2//! into types that may be used to render in a UI. 2//! into types that may be used to render in a UI.
3 3
4mod navigation_target; 4pub(crate) mod navigation_target;
5mod short_label; 5mod short_label;
6 6
7pub use navigation_target::NavigationTarget;
8pub(crate) use navigation_target::{ToNav, TryToNav}; 7pub(crate) use navigation_target::{ToNav, TryToNav};
9pub(crate) use short_label::ShortLabel; 8pub(crate) use short_label::ShortLabel;
10 9
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs
index 48acb8c93..cbdd4ecc2 100644
--- a/crates/ide/src/display/navigation_target.rs
+++ b/crates/ide/src/display/navigation_target.rs
@@ -1,26 +1,50 @@
1//! FIXME: write short doc here 1//! FIXME: write short doc here
2 2
3use std::fmt;
4
3use either::Either; 5use either::Either;
4use hir::{AssocItem, Documentation, FieldSource, HasAttrs, HasSource, InFile, ModuleSource}; 6use hir::{AssocItem, Documentation, FieldSource, HasAttrs, HasSource, InFile, ModuleSource};
5use ide_db::base_db::{FileId, SourceDatabase}; 7use ide_db::{
8 base_db::{FileId, SourceDatabase},
9 symbol_index::FileSymbolKind,
10};
6use ide_db::{defs::Definition, RootDatabase}; 11use ide_db::{defs::Definition, RootDatabase};
7use syntax::{ 12use syntax::{
8 ast::{self, NameOwner}, 13 ast::{self, NameOwner},
9 match_ast, AstNode, SmolStr, 14 match_ast, AstNode, SmolStr, TextRange,
10 SyntaxKind::{self, IDENT_PAT, LIFETIME_PARAM, TYPE_PARAM},
11 TextRange,
12}; 15};
13 16
14use crate::FileSymbol; 17use crate::FileSymbol;
15 18
16use super::short_label::ShortLabel; 19use super::short_label::ShortLabel;
17 20
21#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
22pub enum SymbolKind {
23 Module,
24 Impl,
25 Field,
26 TypeParam,
27 LifetimeParam,
28 SelfParam,
29 Local,
30 Function,
31 Const,
32 Static,
33 Struct,
34 Enum,
35 Variant,
36 Union,
37 TypeAlias,
38 Trait,
39 Macro,
40}
41
18/// `NavigationTarget` represents and element in the editor's UI which you can 42/// `NavigationTarget` represents and element in the editor's UI which you can
19/// click on to navigate to a particular piece of code. 43/// click on to navigate to a particular piece of code.
20/// 44///
21/// Typically, a `NavigationTarget` corresponds to some element in the source 45/// Typically, a `NavigationTarget` corresponds to some element in the source
22/// code, like a function or a struct, but this is not strictly required. 46/// code, like a function or a struct, but this is not strictly required.
23#[derive(Debug, Clone, PartialEq, Eq, Hash)] 47#[derive(Clone, PartialEq, Eq, Hash)]
24pub struct NavigationTarget { 48pub struct NavigationTarget {
25 pub file_id: FileId, 49 pub file_id: FileId,
26 /// Range which encompasses the whole element. 50 /// Range which encompasses the whole element.
@@ -40,12 +64,30 @@ pub struct NavigationTarget {
40 /// Clients should place the cursor on this range when navigating to this target. 64 /// Clients should place the cursor on this range when navigating to this target.
41 pub focus_range: Option<TextRange>, 65 pub focus_range: Option<TextRange>,
42 pub name: SmolStr, 66 pub name: SmolStr,
43 pub kind: SyntaxKind, 67 pub kind: Option<SymbolKind>,
44 pub container_name: Option<SmolStr>, 68 pub container_name: Option<SmolStr>,
45 pub description: Option<String>, 69 pub description: Option<String>,
46 pub docs: Option<Documentation>, 70 pub docs: Option<Documentation>,
47} 71}
48 72
73impl fmt::Debug for NavigationTarget {
74 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
75 let mut f = f.debug_struct("NavigationTarget");
76 macro_rules! opt {
77 ($($name:ident)*) => {$(
78 if let Some(it) = &self.$name {
79 f.field(stringify!($name), it);
80 }
81 )*}
82 }
83 f.field("file_id", &self.file_id).field("full_range", &self.full_range);
84 opt!(focus_range);
85 f.field("name", &self.name);
86 opt!(kind container_name description docs);
87 f.finish()
88 }
89}
90
49pub(crate) trait ToNav { 91pub(crate) trait ToNav {
50 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget; 92 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget;
51} 93}
@@ -69,7 +111,7 @@ impl NavigationTarget {
69 name, 111 name,
70 None, 112 None,
71 frange.range, 113 frange.range,
72 src.value.syntax().kind(), 114 SymbolKind::Module,
73 ); 115 );
74 res.docs = module.attrs(db).docs(); 116 res.docs = module.attrs(db).docs();
75 res.description = src.value.short_label(); 117 res.description = src.value.short_label();
@@ -86,8 +128,13 @@ impl NavigationTarget {
86 128
87 #[cfg(test)] 129 #[cfg(test)]
88 pub(crate) fn debug_render(&self) -> String { 130 pub(crate) fn debug_render(&self) -> String {
89 let mut buf = 131 let mut buf = format!(
90 format!("{} {:?} {:?} {:?}", self.name, self.kind, self.file_id, self.full_range); 132 "{} {:?} {:?} {:?}",
133 self.name,
134 self.kind.unwrap(),
135 self.file_id,
136 self.full_range
137 );
91 if let Some(focus_range) = self.focus_range { 138 if let Some(focus_range) = self.focus_range {
92 buf.push_str(&format!(" {:?}", focus_range)) 139 buf.push_str(&format!(" {:?}", focus_range))
93 } 140 }
@@ -101,6 +148,7 @@ impl NavigationTarget {
101 pub(crate) fn from_named( 148 pub(crate) fn from_named(
102 db: &RootDatabase, 149 db: &RootDatabase,
103 node: InFile<&dyn ast::NameOwner>, 150 node: InFile<&dyn ast::NameOwner>,
151 kind: SymbolKind,
104 ) -> NavigationTarget { 152 ) -> NavigationTarget {
105 let name = 153 let name =
106 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_")); 154 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
@@ -108,13 +156,7 @@ impl NavigationTarget {
108 node.value.name().map(|it| node.with_value(it.syntax()).original_file_range(db).range); 156 node.value.name().map(|it| node.with_value(it.syntax()).original_file_range(db).range);
109 let frange = node.map(|it| it.syntax()).original_file_range(db); 157 let frange = node.map(|it| it.syntax()).original_file_range(db);
110 158
111 NavigationTarget::from_syntax( 159 NavigationTarget::from_syntax(frange.file_id, name, focus_range, frange.range, kind)
112 frange.file_id,
113 name,
114 focus_range,
115 frange.range,
116 node.value.syntax().kind(),
117 )
118 } 160 }
119 161
120 fn from_syntax( 162 fn from_syntax(
@@ -122,12 +164,12 @@ impl NavigationTarget {
122 name: SmolStr, 164 name: SmolStr,
123 focus_range: Option<TextRange>, 165 focus_range: Option<TextRange>,
124 full_range: TextRange, 166 full_range: TextRange,
125 kind: SyntaxKind, 167 kind: SymbolKind,
126 ) -> NavigationTarget { 168 ) -> NavigationTarget {
127 NavigationTarget { 169 NavigationTarget {
128 file_id, 170 file_id,
129 name, 171 name,
130 kind, 172 kind: Some(kind),
131 full_range, 173 full_range,
132 focus_range, 174 focus_range,
133 container_name: None, 175 container_name: None,
@@ -142,7 +184,17 @@ impl ToNav for FileSymbol {
142 NavigationTarget { 184 NavigationTarget {
143 file_id: self.file_id, 185 file_id: self.file_id,
144 name: self.name.clone(), 186 name: self.name.clone(),
145 kind: self.kind, 187 kind: Some(match self.kind {
188 FileSymbolKind::Function => SymbolKind::Function,
189 FileSymbolKind::Struct => SymbolKind::Struct,
190 FileSymbolKind::Enum => SymbolKind::Enum,
191 FileSymbolKind::Trait => SymbolKind::Trait,
192 FileSymbolKind::Module => SymbolKind::Module,
193 FileSymbolKind::TypeAlias => SymbolKind::TypeAlias,
194 FileSymbolKind::Const => SymbolKind::Const,
195 FileSymbolKind::Static => SymbolKind::Static,
196 FileSymbolKind::Macro => SymbolKind::Macro,
197 }),
146 full_range: self.range, 198 full_range: self.range,
147 focus_range: self.name_range, 199 focus_range: self.name_range,
148 container_name: self.container_name.clone(), 200 container_name: self.container_name.clone(),
@@ -191,16 +243,36 @@ impl TryToNav for hir::ModuleDef {
191 } 243 }
192} 244}
193 245
194pub(crate) trait ToNavFromAst {} 246pub(crate) trait ToNavFromAst {
195impl ToNavFromAst for hir::Function {} 247 const KIND: SymbolKind;
196impl ToNavFromAst for hir::Const {} 248}
197impl ToNavFromAst for hir::Static {} 249impl ToNavFromAst for hir::Function {
198impl ToNavFromAst for hir::Struct {} 250 const KIND: SymbolKind = SymbolKind::Function;
199impl ToNavFromAst for hir::Enum {} 251}
200impl ToNavFromAst for hir::EnumVariant {} 252impl ToNavFromAst for hir::Const {
201impl ToNavFromAst for hir::Union {} 253 const KIND: SymbolKind = SymbolKind::Const;
202impl ToNavFromAst for hir::TypeAlias {} 254}
203impl ToNavFromAst for hir::Trait {} 255impl ToNavFromAst for hir::Static {
256 const KIND: SymbolKind = SymbolKind::Static;
257}
258impl ToNavFromAst for hir::Struct {
259 const KIND: SymbolKind = SymbolKind::Struct;
260}
261impl ToNavFromAst for hir::Enum {
262 const KIND: SymbolKind = SymbolKind::Enum;
263}
264impl ToNavFromAst for hir::EnumVariant {
265 const KIND: SymbolKind = SymbolKind::Variant;
266}
267impl ToNavFromAst for hir::Union {
268 const KIND: SymbolKind = SymbolKind::Union;
269}
270impl ToNavFromAst for hir::TypeAlias {
271 const KIND: SymbolKind = SymbolKind::TypeAlias;
272}
273impl ToNavFromAst for hir::Trait {
274 const KIND: SymbolKind = SymbolKind::Trait;
275}
204 276
205impl<D> ToNav for D 277impl<D> ToNav for D
206where 278where
@@ -209,8 +281,11 @@ where
209{ 281{
210 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 282 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
211 let src = self.source(db); 283 let src = self.source(db);
212 let mut res = 284 let mut res = NavigationTarget::from_named(
213 NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); 285 db,
286 src.as_ref().map(|it| it as &dyn ast::NameOwner),
287 D::KIND,
288 );
214 res.docs = self.docs(db); 289 res.docs = self.docs(db);
215 res.description = src.value.short_label(); 290 res.description = src.value.short_label();
216 res 291 res
@@ -228,7 +303,7 @@ impl ToNav for hir::Module {
228 } 303 }
229 }; 304 };
230 let frange = src.with_value(syntax).original_file_range(db); 305 let frange = src.with_value(syntax).original_file_range(db);
231 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, syntax.kind()) 306 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, SymbolKind::Module)
232 } 307 }
233} 308}
234 309
@@ -252,7 +327,7 @@ impl ToNav for hir::Impl {
252 "impl".into(), 327 "impl".into(),
253 focus_range, 328 focus_range,
254 frange.range, 329 frange.range,
255 src.value.syntax().kind(), 330 SymbolKind::Impl,
256 ) 331 )
257 } 332 }
258} 333}
@@ -263,7 +338,8 @@ impl ToNav for hir::Field {
263 338
264 match &src.value { 339 match &src.value {
265 FieldSource::Named(it) => { 340 FieldSource::Named(it) => {
266 let mut res = NavigationTarget::from_named(db, src.with_value(it)); 341 let mut res =
342 NavigationTarget::from_named(db, src.with_value(it), SymbolKind::Field);
267 res.docs = self.docs(db); 343 res.docs = self.docs(db);
268 res.description = it.short_label(); 344 res.description = it.short_label();
269 res 345 res
@@ -275,7 +351,7 @@ impl ToNav for hir::Field {
275 "".into(), 351 "".into(),
276 None, 352 None,
277 frange.range, 353 frange.range,
278 it.syntax().kind(), 354 SymbolKind::Field,
279 ) 355 )
280 } 356 }
281 } 357 }
@@ -286,8 +362,11 @@ impl ToNav for hir::MacroDef {
286 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 362 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
287 let src = self.source(db); 363 let src = self.source(db);
288 log::debug!("nav target {:#?}", src.value.syntax()); 364 log::debug!("nav target {:#?}", src.value.syntax());
289 let mut res = 365 let mut res = NavigationTarget::from_named(
290 NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); 366 db,
367 src.as_ref().map(|it| it as &dyn ast::NameOwner),
368 SymbolKind::Macro,
369 );
291 res.docs = self.docs(db); 370 res.docs = self.docs(db);
292 res 371 res
293 } 372 }
@@ -330,7 +409,7 @@ impl ToNav for hir::Local {
330 NavigationTarget { 409 NavigationTarget {
331 file_id: full_range.file_id, 410 file_id: full_range.file_id,
332 name, 411 name,
333 kind: IDENT_PAT, 412 kind: Some(SymbolKind::Local),
334 full_range: full_range.range, 413 full_range: full_range.range,
335 focus_range: None, 414 focus_range: None,
336 container_name: None, 415 container_name: None,
@@ -354,7 +433,7 @@ impl ToNav for hir::TypeParam {
354 NavigationTarget { 433 NavigationTarget {
355 file_id: src.file_id.original_file(db), 434 file_id: src.file_id.original_file(db),
356 name: self.name(db).to_string().into(), 435 name: self.name(db).to_string().into(),
357 kind: TYPE_PARAM, 436 kind: Some(SymbolKind::TypeParam),
358 full_range, 437 full_range,
359 focus_range, 438 focus_range,
360 container_name: None, 439 container_name: None,
@@ -371,7 +450,7 @@ impl ToNav for hir::LifetimeParam {
371 NavigationTarget { 450 NavigationTarget {
372 file_id: src.file_id.original_file(db), 451 file_id: src.file_id.original_file(db),
373 name: self.name(db).to_string().into(), 452 name: self.name(db).to_string().into(),
374 kind: LIFETIME_PARAM, 453 kind: Some(SymbolKind::LifetimeParam),
375 full_range, 454 full_range,
376 focus_range: Some(full_range), 455 focus_range: Some(full_range),
377 container_name: None, 456 container_name: None,
@@ -428,34 +507,21 @@ fn foo() { enum FooInner { } }
428 0, 507 0,
429 ), 508 ),
430 full_range: 0..17, 509 full_range: 0..17,
431 focus_range: Some( 510 focus_range: 5..13,
432 5..13,
433 ),
434 name: "FooInner", 511 name: "FooInner",
435 kind: ENUM, 512 kind: Enum,
436 container_name: None, 513 description: "enum FooInner",
437 description: Some(
438 "enum FooInner",
439 ),
440 docs: None,
441 }, 514 },
442 NavigationTarget { 515 NavigationTarget {
443 file_id: FileId( 516 file_id: FileId(
444 0, 517 0,
445 ), 518 ),
446 full_range: 29..46, 519 full_range: 29..46,
447 focus_range: Some( 520 focus_range: 34..42,
448 34..42,
449 ),
450 name: "FooInner", 521 name: "FooInner",
451 kind: ENUM, 522 kind: Enum,
452 container_name: Some( 523 container_name: "foo",
453 "foo", 524 description: "enum FooInner",
454 ),
455 description: Some(
456 "enum FooInner",
457 ),
458 docs: None,
459 }, 525 },
460 ] 526 ]
461 "#]] 527 "#]]
diff --git a/crates/ide/src/file_structure.rs b/crates/ide/src/file_structure.rs
index c51531391..32556dad3 100644
--- a/crates/ide/src/file_structure.rs
+++ b/crates/ide/src/file_structure.rs
@@ -1,15 +1,17 @@
1use syntax::{ 1use syntax::{
2 ast::{self, AttrsOwner, GenericParamsOwner, NameOwner}, 2 ast::{self, AttrsOwner, GenericParamsOwner, NameOwner},
3 match_ast, AstNode, SourceFile, SyntaxKind, SyntaxNode, TextRange, WalkEvent, 3 match_ast, AstNode, SourceFile, SyntaxNode, TextRange, WalkEvent,
4}; 4};
5 5
6use crate::SymbolKind;
7
6#[derive(Debug, Clone)] 8#[derive(Debug, Clone)]
7pub struct StructureNode { 9pub struct StructureNode {
8 pub parent: Option<usize>, 10 pub parent: Option<usize>,
9 pub label: String, 11 pub label: String,
10 pub navigation_range: TextRange, 12 pub navigation_range: TextRange,
11 pub node_range: TextRange, 13 pub node_range: TextRange,
12 pub kind: SyntaxKind, 14 pub kind: SymbolKind,
13 pub detail: Option<String>, 15 pub detail: Option<String>,
14 pub deprecated: bool, 16 pub deprecated: bool,
15} 17}
@@ -51,25 +53,27 @@ pub(crate) fn file_structure(file: &SourceFile) -> Vec<StructureNode> {
51} 53}
52 54
53fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { 55fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
54 fn decl<N: NameOwner + AttrsOwner>(node: N) -> Option<StructureNode> { 56 fn decl<N: NameOwner + AttrsOwner>(node: N, kind: SymbolKind) -> Option<StructureNode> {
55 decl_with_detail(&node, None) 57 decl_with_detail(&node, None, kind)
56 } 58 }
57 59
58 fn decl_with_type_ref<N: NameOwner + AttrsOwner>( 60 fn decl_with_type_ref<N: NameOwner + AttrsOwner>(
59 node: &N, 61 node: &N,
60 type_ref: Option<ast::Type>, 62 type_ref: Option<ast::Type>,
63 kind: SymbolKind,
61 ) -> Option<StructureNode> { 64 ) -> Option<StructureNode> {
62 let detail = type_ref.map(|type_ref| { 65 let detail = type_ref.map(|type_ref| {
63 let mut detail = String::new(); 66 let mut detail = String::new();
64 collapse_ws(type_ref.syntax(), &mut detail); 67 collapse_ws(type_ref.syntax(), &mut detail);
65 detail 68 detail
66 }); 69 });
67 decl_with_detail(node, detail) 70 decl_with_detail(node, detail, kind)
68 } 71 }
69 72
70 fn decl_with_detail<N: NameOwner + AttrsOwner>( 73 fn decl_with_detail<N: NameOwner + AttrsOwner>(
71 node: &N, 74 node: &N,
72 detail: Option<String>, 75 detail: Option<String>,
76 kind: SymbolKind,
73 ) -> Option<StructureNode> { 77 ) -> Option<StructureNode> {
74 let name = node.name()?; 78 let name = node.name()?;
75 79
@@ -78,7 +82,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
78 label: name.text().to_string(), 82 label: name.text().to_string(),
79 navigation_range: name.syntax().text_range(), 83 navigation_range: name.syntax().text_range(),
80 node_range: node.syntax().text_range(), 84 node_range: node.syntax().text_range(),
81 kind: node.syntax().kind(), 85 kind,
82 detail, 86 detail,
83 deprecated: node.attrs().filter_map(|x| x.simple_name()).any(|x| x == "deprecated"), 87 deprecated: node.attrs().filter_map(|x| x.simple_name()).any(|x| x == "deprecated"),
84 }) 88 })
@@ -117,18 +121,18 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
117 collapse_ws(ret_type.syntax(), &mut detail); 121 collapse_ws(ret_type.syntax(), &mut detail);
118 } 122 }
119 123
120 decl_with_detail(&it, Some(detail)) 124 decl_with_detail(&it, Some(detail), SymbolKind::Function)
121 }, 125 },
122 ast::Struct(it) => decl(it), 126 ast::Struct(it) => decl(it, SymbolKind::Struct),
123 ast::Union(it) => decl(it), 127 ast::Union(it) => decl(it, SymbolKind::Union),
124 ast::Enum(it) => decl(it), 128 ast::Enum(it) => decl(it, SymbolKind::Enum),
125 ast::Variant(it) => decl(it), 129 ast::Variant(it) => decl(it, SymbolKind::Variant),
126 ast::Trait(it) => decl(it), 130 ast::Trait(it) => decl(it, SymbolKind::Trait),
127 ast::Module(it) => decl(it), 131 ast::Module(it) => decl(it, SymbolKind::Module),
128 ast::TypeAlias(it) => decl_with_type_ref(&it, it.ty()), 132 ast::TypeAlias(it) => decl_with_type_ref(&it, it.ty(), SymbolKind::TypeAlias),
129 ast::RecordField(it) => decl_with_type_ref(&it, it.ty()), 133 ast::RecordField(it) => decl_with_type_ref(&it, it.ty(), SymbolKind::Field),
130 ast::Const(it) => decl_with_type_ref(&it, it.ty()), 134 ast::Const(it) => decl_with_type_ref(&it, it.ty(), SymbolKind::Const),
131 ast::Static(it) => decl_with_type_ref(&it, it.ty()), 135 ast::Static(it) => decl_with_type_ref(&it, it.ty(), SymbolKind::Static),
132 ast::Impl(it) => { 136 ast::Impl(it) => {
133 let target_type = it.self_ty()?; 137 let target_type = it.self_ty()?;
134 let target_trait = it.trait_(); 138 let target_trait = it.trait_();
@@ -144,13 +148,13 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
144 label, 148 label,
145 navigation_range: target_type.syntax().text_range(), 149 navigation_range: target_type.syntax().text_range(),
146 node_range: it.syntax().text_range(), 150 node_range: it.syntax().text_range(),
147 kind: it.syntax().kind(), 151 kind: SymbolKind::Impl,
148 detail: None, 152 detail: None,
149 deprecated: false, 153 deprecated: false,
150 }; 154 };
151 Some(node) 155 Some(node)
152 }, 156 },
153 ast::MacroRules(it) => decl(it), 157 ast::MacroRules(it) => decl(it, SymbolKind::Macro),
154 _ => None, 158 _ => None,
155 } 159 }
156 } 160 }
@@ -222,7 +226,7 @@ fn very_obsolete() {}
222 label: "Foo", 226 label: "Foo",
223 navigation_range: 8..11, 227 navigation_range: 8..11,
224 node_range: 1..26, 228 node_range: 1..26,
225 kind: STRUCT, 229 kind: Struct,
226 detail: None, 230 detail: None,
227 deprecated: false, 231 deprecated: false,
228 }, 232 },
@@ -233,7 +237,7 @@ fn very_obsolete() {}
233 label: "x", 237 label: "x",
234 navigation_range: 18..19, 238 navigation_range: 18..19,
235 node_range: 18..24, 239 node_range: 18..24,
236 kind: RECORD_FIELD, 240 kind: Field,
237 detail: Some( 241 detail: Some(
238 "i32", 242 "i32",
239 ), 243 ),
@@ -244,7 +248,7 @@ fn very_obsolete() {}
244 label: "m", 248 label: "m",
245 navigation_range: 32..33, 249 navigation_range: 32..33,
246 node_range: 28..158, 250 node_range: 28..158,
247 kind: MODULE, 251 kind: Module,
248 detail: None, 252 detail: None,
249 deprecated: false, 253 deprecated: false,
250 }, 254 },
@@ -255,7 +259,7 @@ fn very_obsolete() {}
255 label: "bar1", 259 label: "bar1",
256 navigation_range: 43..47, 260 navigation_range: 43..47,
257 node_range: 40..52, 261 node_range: 40..52,
258 kind: FN, 262 kind: Function,
259 detail: Some( 263 detail: Some(
260 "fn()", 264 "fn()",
261 ), 265 ),
@@ -268,7 +272,7 @@ fn very_obsolete() {}
268 label: "bar2", 272 label: "bar2",
269 navigation_range: 60..64, 273 navigation_range: 60..64,
270 node_range: 57..81, 274 node_range: 57..81,
271 kind: FN, 275 kind: Function,
272 detail: Some( 276 detail: Some(
273 "fn<T>(t: T) -> T", 277 "fn<T>(t: T) -> T",
274 ), 278 ),
@@ -281,7 +285,7 @@ fn very_obsolete() {}
281 label: "bar3", 285 label: "bar3",
282 navigation_range: 89..93, 286 navigation_range: 89..93,
283 node_range: 86..156, 287 node_range: 86..156,
284 kind: FN, 288 kind: Function,
285 detail: Some( 289 detail: Some(
286 "fn<A, B>(a: A, b: B) -> Vec< u32 >", 290 "fn<A, B>(a: A, b: B) -> Vec< u32 >",
287 ), 291 ),
@@ -292,7 +296,7 @@ fn very_obsolete() {}
292 label: "E", 296 label: "E",
293 navigation_range: 165..166, 297 navigation_range: 165..166,
294 node_range: 160..180, 298 node_range: 160..180,
295 kind: ENUM, 299 kind: Enum,
296 detail: None, 300 detail: None,
297 deprecated: false, 301 deprecated: false,
298 }, 302 },
@@ -303,7 +307,7 @@ fn very_obsolete() {}
303 label: "X", 307 label: "X",
304 navigation_range: 169..170, 308 navigation_range: 169..170,
305 node_range: 169..170, 309 node_range: 169..170,
306 kind: VARIANT, 310 kind: Variant,
307 detail: None, 311 detail: None,
308 deprecated: false, 312 deprecated: false,
309 }, 313 },
@@ -314,7 +318,7 @@ fn very_obsolete() {}
314 label: "Y", 318 label: "Y",
315 navigation_range: 172..173, 319 navigation_range: 172..173,
316 node_range: 172..178, 320 node_range: 172..178,
317 kind: VARIANT, 321 kind: Variant,
318 detail: None, 322 detail: None,
319 deprecated: false, 323 deprecated: false,
320 }, 324 },
@@ -323,7 +327,7 @@ fn very_obsolete() {}
323 label: "T", 327 label: "T",
324 navigation_range: 186..187, 328 navigation_range: 186..187,
325 node_range: 181..193, 329 node_range: 181..193,
326 kind: TYPE_ALIAS, 330 kind: TypeAlias,
327 detail: Some( 331 detail: Some(
328 "()", 332 "()",
329 ), 333 ),
@@ -334,7 +338,7 @@ fn very_obsolete() {}
334 label: "S", 338 label: "S",
335 navigation_range: 201..202, 339 navigation_range: 201..202,
336 node_range: 194..213, 340 node_range: 194..213,
337 kind: STATIC, 341 kind: Static,
338 detail: Some( 342 detail: Some(
339 "i32", 343 "i32",
340 ), 344 ),
@@ -345,7 +349,7 @@ fn very_obsolete() {}
345 label: "C", 349 label: "C",
346 navigation_range: 220..221, 350 navigation_range: 220..221,
347 node_range: 214..232, 351 node_range: 214..232,
348 kind: CONST, 352 kind: Const,
349 detail: Some( 353 detail: Some(
350 "i32", 354 "i32",
351 ), 355 ),
@@ -356,7 +360,7 @@ fn very_obsolete() {}
356 label: "impl E", 360 label: "impl E",
357 navigation_range: 239..240, 361 navigation_range: 239..240,
358 node_range: 234..243, 362 node_range: 234..243,
359 kind: IMPL, 363 kind: Impl,
360 detail: None, 364 detail: None,
361 deprecated: false, 365 deprecated: false,
362 }, 366 },
@@ -365,7 +369,7 @@ fn very_obsolete() {}
365 label: "impl fmt::Debug for E", 369 label: "impl fmt::Debug for E",
366 navigation_range: 265..266, 370 navigation_range: 265..266,
367 node_range: 245..269, 371 node_range: 245..269,
368 kind: IMPL, 372 kind: Impl,
369 detail: None, 373 detail: None,
370 deprecated: false, 374 deprecated: false,
371 }, 375 },
@@ -374,7 +378,7 @@ fn very_obsolete() {}
374 label: "mc", 378 label: "mc",
375 navigation_range: 284..286, 379 navigation_range: 284..286,
376 node_range: 271..303, 380 node_range: 271..303,
377 kind: MACRO_RULES, 381 kind: Macro,
378 detail: None, 382 detail: None,
379 deprecated: false, 383 deprecated: false,
380 }, 384 },
@@ -383,7 +387,7 @@ fn very_obsolete() {}
383 label: "mcexp", 387 label: "mcexp",
384 navigation_range: 334..339, 388 navigation_range: 334..339,
385 node_range: 305..356, 389 node_range: 305..356,
386 kind: MACRO_RULES, 390 kind: Macro,
387 detail: None, 391 detail: None,
388 deprecated: false, 392 deprecated: false,
389 }, 393 },
@@ -392,7 +396,7 @@ fn very_obsolete() {}
392 label: "mcexp", 396 label: "mcexp",
393 navigation_range: 387..392, 397 navigation_range: 387..392,
394 node_range: 358..409, 398 node_range: 358..409,
395 kind: MACRO_RULES, 399 kind: Macro,
396 detail: None, 400 detail: None,
397 deprecated: false, 401 deprecated: false,
398 }, 402 },
@@ -401,7 +405,7 @@ fn very_obsolete() {}
401 label: "obsolete", 405 label: "obsolete",
402 navigation_range: 428..436, 406 navigation_range: 428..436,
403 node_range: 411..441, 407 node_range: 411..441,
404 kind: FN, 408 kind: Function,
405 detail: Some( 409 detail: Some(
406 "fn()", 410 "fn()",
407 ), 411 ),
@@ -412,7 +416,7 @@ fn very_obsolete() {}
412 label: "very_obsolete", 416 label: "very_obsolete",
413 navigation_range: 481..494, 417 navigation_range: 481..494,
414 node_range: 443..499, 418 node_range: 443..499,
415 kind: FN, 419 kind: Function,
416 detail: Some( 420 detail: Some(
417 "fn()", 421 "fn()",
418 ), 422 ),
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs
index 173509b08..7a12e9965 100644
--- a/crates/ide/src/goto_definition.rs
+++ b/crates/ide/src/goto_definition.rs
@@ -9,7 +9,7 @@ use syntax::{ast, match_ast, AstNode, SyntaxKind::*, SyntaxToken, TokenAtOffset,
9 9
10use crate::{ 10use crate::{
11 display::{ToNav, TryToNav}, 11 display::{ToNav, TryToNav},
12 FilePosition, NavigationTarget, RangeInfo, 12 FilePosition, NavigationTarget, RangeInfo, SymbolKind,
13}; 13};
14 14
15// Feature: Go to Definition 15// Feature: Go to Definition
@@ -86,7 +86,7 @@ fn self_to_nav_target(self_param: ast::SelfParam, file_id: FileId) -> Option<Nav
86 full_range: self_param.syntax().text_range(), 86 full_range: self_param.syntax().text_range(),
87 focus_range: Some(self_token.text_range()), 87 focus_range: Some(self_token.text_range()),
88 name: self_token.text().clone(), 88 name: self_token.text().clone(),
89 kind: self_token.kind(), 89 kind: Some(SymbolKind::SelfParam),
90 container_name: None, 90 container_name: None,
91 description: None, 91 description: None,
92 docs: None, 92 docs: None,
diff --git a/crates/ide/src/hover.rs b/crates/ide/src/hover.rs
index da6bb726a..b06fa5f15 100644
--- a/crates/ide/src/hover.rs
+++ b/crates/ide/src/hover.rs
@@ -2187,14 +2187,9 @@ fn foo_<|>test() {}
2187 0, 2187 0,
2188 ), 2188 ),
2189 full_range: 0..24, 2189 full_range: 0..24,
2190 focus_range: Some( 2190 focus_range: 11..19,
2191 11..19,
2192 ),
2193 name: "foo_test", 2191 name: "foo_test",
2194 kind: FN, 2192 kind: Function,
2195 container_name: None,
2196 description: None,
2197 docs: None,
2198 }, 2193 },
2199 kind: Test { 2194 kind: Test {
2200 test_id: Path( 2195 test_id: Path(
@@ -2230,14 +2225,9 @@ mod tests<|> {
2230 0, 2225 0,
2231 ), 2226 ),
2232 full_range: 0..46, 2227 full_range: 0..46,
2233 focus_range: Some( 2228 focus_range: 4..9,
2234 4..9,
2235 ),
2236 name: "tests", 2229 name: "tests",
2237 kind: MODULE, 2230 kind: Module,
2238 container_name: None,
2239 description: None,
2240 docs: None,
2241 }, 2231 },
2242 kind: TestMod { 2232 kind: TestMod {
2243 path: "tests", 2233 path: "tests",
@@ -2269,16 +2259,10 @@ fn main() { let s<|>t = S{ f1:0 }; }
2269 0, 2259 0,
2270 ), 2260 ),
2271 full_range: 0..19, 2261 full_range: 0..19,
2272 focus_range: Some( 2262 focus_range: 7..8,
2273 7..8,
2274 ),
2275 name: "S", 2263 name: "S",
2276 kind: STRUCT, 2264 kind: Struct,
2277 container_name: None, 2265 description: "struct S",
2278 description: Some(
2279 "struct S",
2280 ),
2281 docs: None,
2282 }, 2266 },
2283 }, 2267 },
2284 ], 2268 ],
@@ -2308,16 +2292,10 @@ fn main() { let s<|>t = S{ f1:Arg(0) }; }
2308 0, 2292 0,
2309 ), 2293 ),
2310 full_range: 17..37, 2294 full_range: 17..37,
2311 focus_range: Some( 2295 focus_range: 24..25,
2312 24..25,
2313 ),
2314 name: "S", 2296 name: "S",
2315 kind: STRUCT, 2297 kind: Struct,
2316 container_name: None, 2298 description: "struct S",
2317 description: Some(
2318 "struct S",
2319 ),
2320 docs: None,
2321 }, 2299 },
2322 }, 2300 },
2323 HoverGotoTypeData { 2301 HoverGotoTypeData {
@@ -2327,16 +2305,10 @@ fn main() { let s<|>t = S{ f1:Arg(0) }; }
2327 0, 2305 0,
2328 ), 2306 ),
2329 full_range: 0..16, 2307 full_range: 0..16,
2330 focus_range: Some( 2308 focus_range: 7..10,
2331 7..10,
2332 ),
2333 name: "Arg", 2309 name: "Arg",
2334 kind: STRUCT, 2310 kind: Struct,
2335 container_name: None, 2311 description: "struct Arg",
2336 description: Some(
2337 "struct Arg",
2338 ),
2339 docs: None,
2340 }, 2312 },
2341 }, 2313 },
2342 ], 2314 ],
@@ -2366,16 +2338,10 @@ fn main() { let s<|>t = S{ f1: S{ f1: Arg(0) } }; }
2366 0, 2338 0,
2367 ), 2339 ),
2368 full_range: 17..37, 2340 full_range: 17..37,
2369 focus_range: Some( 2341 focus_range: 24..25,
2370 24..25,
2371 ),
2372 name: "S", 2342 name: "S",
2373 kind: STRUCT, 2343 kind: Struct,
2374 container_name: None, 2344 description: "struct S",
2375 description: Some(
2376 "struct S",
2377 ),
2378 docs: None,
2379 }, 2345 },
2380 }, 2346 },
2381 HoverGotoTypeData { 2347 HoverGotoTypeData {
@@ -2385,16 +2351,10 @@ fn main() { let s<|>t = S{ f1: S{ f1: Arg(0) } }; }
2385 0, 2351 0,
2386 ), 2352 ),
2387 full_range: 0..16, 2353 full_range: 0..16,
2388 focus_range: Some( 2354 focus_range: 7..10,
2389 7..10,
2390 ),
2391 name: "Arg", 2355 name: "Arg",
2392 kind: STRUCT, 2356 kind: Struct,
2393 container_name: None, 2357 description: "struct Arg",
2394 description: Some(
2395 "struct Arg",
2396 ),
2397 docs: None,
2398 }, 2358 },
2399 }, 2359 },
2400 ], 2360 ],
@@ -2427,16 +2387,10 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
2427 0, 2387 0,
2428 ), 2388 ),
2429 full_range: 0..14, 2389 full_range: 0..14,
2430 focus_range: Some( 2390 focus_range: 7..8,
2431 7..8,
2432 ),
2433 name: "A", 2391 name: "A",
2434 kind: STRUCT, 2392 kind: Struct,
2435 container_name: None, 2393 description: "struct A",
2436 description: Some(
2437 "struct A",
2438 ),
2439 docs: None,
2440 }, 2394 },
2441 }, 2395 },
2442 HoverGotoTypeData { 2396 HoverGotoTypeData {
@@ -2446,16 +2400,10 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
2446 0, 2400 0,
2447 ), 2401 ),
2448 full_range: 15..29, 2402 full_range: 15..29,
2449 focus_range: Some( 2403 focus_range: 22..23,
2450 22..23,
2451 ),
2452 name: "B", 2404 name: "B",
2453 kind: STRUCT, 2405 kind: Struct,
2454 container_name: None, 2406 description: "struct B",
2455 description: Some(
2456 "struct B",
2457 ),
2458 docs: None,
2459 }, 2407 },
2460 }, 2408 },
2461 HoverGotoTypeData { 2409 HoverGotoTypeData {
@@ -2465,16 +2413,10 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
2465 0, 2413 0,
2466 ), 2414 ),
2467 full_range: 42..60, 2415 full_range: 42..60,
2468 focus_range: Some( 2416 focus_range: 53..54,
2469 53..54,
2470 ),
2471 name: "C", 2417 name: "C",
2472 kind: STRUCT, 2418 kind: Struct,
2473 container_name: None, 2419 description: "pub struct C",
2474 description: Some(
2475 "pub struct C",
2476 ),
2477 docs: None,
2478 }, 2420 },
2479 }, 2421 },
2480 ], 2422 ],
@@ -2504,16 +2446,10 @@ fn main() { let s<|>t = foo(); }
2504 0, 2446 0,
2505 ), 2447 ),
2506 full_range: 0..12, 2448 full_range: 0..12,
2507 focus_range: Some( 2449 focus_range: 6..9,
2508 6..9,
2509 ),
2510 name: "Foo", 2450 name: "Foo",
2511 kind: TRAIT, 2451 kind: Trait,
2512 container_name: None, 2452 description: "trait Foo",
2513 description: Some(
2514 "trait Foo",
2515 ),
2516 docs: None,
2517 }, 2453 },
2518 }, 2454 },
2519 ], 2455 ],
@@ -2544,16 +2480,10 @@ fn main() { let s<|>t = foo(); }
2544 0, 2480 0,
2545 ), 2481 ),
2546 full_range: 0..15, 2482 full_range: 0..15,
2547 focus_range: Some( 2483 focus_range: 6..9,
2548 6..9,
2549 ),
2550 name: "Foo", 2484 name: "Foo",
2551 kind: TRAIT, 2485 kind: Trait,
2552 container_name: None, 2486 description: "trait Foo",
2553 description: Some(
2554 "trait Foo",
2555 ),
2556 docs: None,
2557 }, 2487 },
2558 }, 2488 },
2559 HoverGotoTypeData { 2489 HoverGotoTypeData {
@@ -2563,16 +2493,10 @@ fn main() { let s<|>t = foo(); }
2563 0, 2493 0,
2564 ), 2494 ),
2565 full_range: 16..25, 2495 full_range: 16..25,
2566 focus_range: Some( 2496 focus_range: 23..24,
2567 23..24,
2568 ),
2569 name: "S", 2497 name: "S",
2570 kind: STRUCT, 2498 kind: Struct,
2571 container_name: None, 2499 description: "struct S",
2572 description: Some(
2573 "struct S",
2574 ),
2575 docs: None,
2576 }, 2500 },
2577 }, 2501 },
2578 ], 2502 ],
@@ -2603,16 +2527,10 @@ fn main() { let s<|>t = foo(); }
2603 0, 2527 0,
2604 ), 2528 ),
2605 full_range: 0..12, 2529 full_range: 0..12,
2606 focus_range: Some( 2530 focus_range: 6..9,
2607 6..9,
2608 ),
2609 name: "Foo", 2531 name: "Foo",
2610 kind: TRAIT, 2532 kind: Trait,
2611 container_name: None, 2533 description: "trait Foo",
2612 description: Some(
2613 "trait Foo",
2614 ),
2615 docs: None,
2616 }, 2534 },
2617 }, 2535 },
2618 HoverGotoTypeData { 2536 HoverGotoTypeData {
@@ -2622,16 +2540,10 @@ fn main() { let s<|>t = foo(); }
2622 0, 2540 0,
2623 ), 2541 ),
2624 full_range: 13..25, 2542 full_range: 13..25,
2625 focus_range: Some( 2543 focus_range: 19..22,
2626 19..22,
2627 ),
2628 name: "Bar", 2544 name: "Bar",
2629 kind: TRAIT, 2545 kind: Trait,
2630 container_name: None, 2546 description: "trait Bar",
2631 description: Some(
2632 "trait Bar",
2633 ),
2634 docs: None,
2635 }, 2547 },
2636 }, 2548 },
2637 ], 2549 ],
@@ -2665,16 +2577,10 @@ fn main() { let s<|>t = foo(); }
2665 0, 2577 0,
2666 ), 2578 ),
2667 full_range: 0..15, 2579 full_range: 0..15,
2668 focus_range: Some( 2580 focus_range: 6..9,
2669 6..9,
2670 ),
2671 name: "Foo", 2581 name: "Foo",
2672 kind: TRAIT, 2582 kind: Trait,
2673 container_name: None, 2583 description: "trait Foo",
2674 description: Some(
2675 "trait Foo",
2676 ),
2677 docs: None,
2678 }, 2584 },
2679 }, 2585 },
2680 HoverGotoTypeData { 2586 HoverGotoTypeData {
@@ -2684,16 +2590,10 @@ fn main() { let s<|>t = foo(); }
2684 0, 2590 0,
2685 ), 2591 ),
2686 full_range: 16..31, 2592 full_range: 16..31,
2687 focus_range: Some( 2593 focus_range: 22..25,
2688 22..25,
2689 ),
2690 name: "Bar", 2594 name: "Bar",
2691 kind: TRAIT, 2595 kind: Trait,
2692 container_name: None, 2596 description: "trait Bar",
2693 description: Some(
2694 "trait Bar",
2695 ),
2696 docs: None,
2697 }, 2597 },
2698 }, 2598 },
2699 HoverGotoTypeData { 2599 HoverGotoTypeData {
@@ -2703,16 +2603,10 @@ fn main() { let s<|>t = foo(); }
2703 0, 2603 0,
2704 ), 2604 ),
2705 full_range: 32..44, 2605 full_range: 32..44,
2706 focus_range: Some( 2606 focus_range: 39..41,
2707 39..41,
2708 ),
2709 name: "S1", 2607 name: "S1",
2710 kind: STRUCT, 2608 kind: Struct,
2711 container_name: None, 2609 description: "struct S1",
2712 description: Some(
2713 "struct S1",
2714 ),
2715 docs: None,
2716 }, 2610 },
2717 }, 2611 },
2718 HoverGotoTypeData { 2612 HoverGotoTypeData {
@@ -2722,16 +2616,10 @@ fn main() { let s<|>t = foo(); }
2722 0, 2616 0,
2723 ), 2617 ),
2724 full_range: 45..57, 2618 full_range: 45..57,
2725 focus_range: Some( 2619 focus_range: 52..54,
2726 52..54,
2727 ),
2728 name: "S2", 2620 name: "S2",
2729 kind: STRUCT, 2621 kind: Struct,
2730 container_name: None, 2622 description: "struct S2",
2731 description: Some(
2732 "struct S2",
2733 ),
2734 docs: None,
2735 }, 2623 },
2736 }, 2624 },
2737 ], 2625 ],
@@ -2759,16 +2647,10 @@ fn foo(ar<|>g: &impl Foo) {}
2759 0, 2647 0,
2760 ), 2648 ),
2761 full_range: 0..12, 2649 full_range: 0..12,
2762 focus_range: Some( 2650 focus_range: 6..9,
2763 6..9,
2764 ),
2765 name: "Foo", 2651 name: "Foo",
2766 kind: TRAIT, 2652 kind: Trait,
2767 container_name: None, 2653 description: "trait Foo",
2768 description: Some(
2769 "trait Foo",
2770 ),
2771 docs: None,
2772 }, 2654 },
2773 }, 2655 },
2774 ], 2656 ],
@@ -2799,16 +2681,10 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
2799 0, 2681 0,
2800 ), 2682 ),
2801 full_range: 0..12, 2683 full_range: 0..12,
2802 focus_range: Some( 2684 focus_range: 6..9,
2803 6..9,
2804 ),
2805 name: "Foo", 2685 name: "Foo",
2806 kind: TRAIT, 2686 kind: Trait,
2807 container_name: None, 2687 description: "trait Foo",
2808 description: Some(
2809 "trait Foo",
2810 ),
2811 docs: None,
2812 }, 2688 },
2813 }, 2689 },
2814 HoverGotoTypeData { 2690 HoverGotoTypeData {
@@ -2818,16 +2694,10 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
2818 0, 2694 0,
2819 ), 2695 ),
2820 full_range: 13..28, 2696 full_range: 13..28,
2821 focus_range: Some( 2697 focus_range: 19..22,
2822 19..22,
2823 ),
2824 name: "Bar", 2698 name: "Bar",
2825 kind: TRAIT, 2699 kind: Trait,
2826 container_name: None, 2700 description: "trait Bar",
2827 description: Some(
2828 "trait Bar",
2829 ),
2830 docs: None,
2831 }, 2701 },
2832 }, 2702 },
2833 HoverGotoTypeData { 2703 HoverGotoTypeData {
@@ -2837,16 +2707,10 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
2837 0, 2707 0,
2838 ), 2708 ),
2839 full_range: 29..39, 2709 full_range: 29..39,
2840 focus_range: Some( 2710 focus_range: 36..37,
2841 36..37,
2842 ),
2843 name: "S", 2711 name: "S",
2844 kind: STRUCT, 2712 kind: Struct,
2845 container_name: None, 2713 description: "struct S",
2846 description: Some(
2847 "struct S",
2848 ),
2849 docs: None,
2850 }, 2714 },
2851 }, 2715 },
2852 ], 2716 ],
@@ -2882,16 +2746,10 @@ mod future {
2882 0, 2746 0,
2883 ), 2747 ),
2884 full_range: 101..163, 2748 full_range: 101..163,
2885 focus_range: Some( 2749 focus_range: 140..146,
2886 140..146,
2887 ),
2888 name: "Future", 2750 name: "Future",
2889 kind: TRAIT, 2751 kind: Trait,
2890 container_name: None, 2752 description: "pub trait Future",
2891 description: Some(
2892 "pub trait Future",
2893 ),
2894 docs: None,
2895 }, 2753 },
2896 }, 2754 },
2897 HoverGotoTypeData { 2755 HoverGotoTypeData {
@@ -2901,16 +2759,10 @@ mod future {
2901 0, 2759 0,
2902 ), 2760 ),
2903 full_range: 0..9, 2761 full_range: 0..9,
2904 focus_range: Some( 2762 focus_range: 7..8,
2905 7..8,
2906 ),
2907 name: "S", 2763 name: "S",
2908 kind: STRUCT, 2764 kind: Struct,
2909 container_name: None, 2765 description: "struct S",
2910 description: Some(
2911 "struct S",
2912 ),
2913 docs: None,
2914 }, 2766 },
2915 }, 2767 },
2916 ], 2768 ],
@@ -2939,16 +2791,10 @@ fn foo(ar<|>g: &impl Foo<S>) {}
2939 0, 2791 0,
2940 ), 2792 ),
2941 full_range: 0..15, 2793 full_range: 0..15,
2942 focus_range: Some( 2794 focus_range: 6..9,
2943 6..9,
2944 ),
2945 name: "Foo", 2795 name: "Foo",
2946 kind: TRAIT, 2796 kind: Trait,
2947 container_name: None, 2797 description: "trait Foo",
2948 description: Some(
2949 "trait Foo",
2950 ),
2951 docs: None,
2952 }, 2798 },
2953 }, 2799 },
2954 HoverGotoTypeData { 2800 HoverGotoTypeData {
@@ -2958,16 +2804,10 @@ fn foo(ar<|>g: &impl Foo<S>) {}
2958 0, 2804 0,
2959 ), 2805 ),
2960 full_range: 16..27, 2806 full_range: 16..27,
2961 focus_range: Some( 2807 focus_range: 23..24,
2962 23..24,
2963 ),
2964 name: "S", 2808 name: "S",
2965 kind: STRUCT, 2809 kind: Struct,
2966 container_name: None, 2810 description: "struct S",
2967 description: Some(
2968 "struct S",
2969 ),
2970 docs: None,
2971 }, 2811 },
2972 }, 2812 },
2973 ], 2813 ],
@@ -3001,16 +2841,10 @@ fn main() { let s<|>t = foo(); }
3001 0, 2841 0,
3002 ), 2842 ),
3003 full_range: 42..55, 2843 full_range: 42..55,
3004 focus_range: Some( 2844 focus_range: 49..50,
3005 49..50,
3006 ),
3007 name: "B", 2845 name: "B",
3008 kind: STRUCT, 2846 kind: Struct,
3009 container_name: None, 2847 description: "struct B",
3010 description: Some(
3011 "struct B",
3012 ),
3013 docs: None,
3014 }, 2848 },
3015 }, 2849 },
3016 HoverGotoTypeData { 2850 HoverGotoTypeData {
@@ -3020,16 +2854,10 @@ fn main() { let s<|>t = foo(); }
3020 0, 2854 0,
3021 ), 2855 ),
3022 full_range: 0..12, 2856 full_range: 0..12,
3023 focus_range: Some( 2857 focus_range: 6..9,
3024 6..9,
3025 ),
3026 name: "Foo", 2858 name: "Foo",
3027 kind: TRAIT, 2859 kind: Trait,
3028 container_name: None, 2860 description: "trait Foo",
3029 description: Some(
3030 "trait Foo",
3031 ),
3032 docs: None,
3033 }, 2861 },
3034 }, 2862 },
3035 ], 2863 ],
@@ -3057,16 +2885,10 @@ fn foo(ar<|>g: &dyn Foo) {}
3057 0, 2885 0,
3058 ), 2886 ),
3059 full_range: 0..12, 2887 full_range: 0..12,
3060 focus_range: Some( 2888 focus_range: 6..9,
3061 6..9,
3062 ),
3063 name: "Foo", 2889 name: "Foo",
3064 kind: TRAIT, 2890 kind: Trait,
3065 container_name: None, 2891 description: "trait Foo",
3066 description: Some(
3067 "trait Foo",
3068 ),
3069 docs: None,
3070 }, 2892 },
3071 }, 2893 },
3072 ], 2894 ],
@@ -3095,16 +2917,10 @@ fn foo(ar<|>g: &dyn Foo<S>) {}
3095 0, 2917 0,
3096 ), 2918 ),
3097 full_range: 0..15, 2919 full_range: 0..15,
3098 focus_range: Some( 2920 focus_range: 6..9,
3099 6..9,
3100 ),
3101 name: "Foo", 2921 name: "Foo",
3102 kind: TRAIT, 2922 kind: Trait,
3103 container_name: None, 2923 description: "trait Foo",
3104 description: Some(
3105 "trait Foo",
3106 ),
3107 docs: None,
3108 }, 2924 },
3109 }, 2925 },
3110 HoverGotoTypeData { 2926 HoverGotoTypeData {
@@ -3114,16 +2930,10 @@ fn foo(ar<|>g: &dyn Foo<S>) {}
3114 0, 2930 0,
3115 ), 2931 ),
3116 full_range: 16..27, 2932 full_range: 16..27,
3117 focus_range: Some( 2933 focus_range: 23..24,
3118 23..24,
3119 ),
3120 name: "S", 2934 name: "S",
3121 kind: STRUCT, 2935 kind: Struct,
3122 container_name: None, 2936 description: "struct S",
3123 description: Some(
3124 "struct S",
3125 ),
3126 docs: None,
3127 }, 2937 },
3128 }, 2938 },
3129 ], 2939 ],
@@ -3155,16 +2965,10 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
3155 0, 2965 0,
3156 ), 2966 ),
3157 full_range: 0..21, 2967 full_range: 0..21,
3158 focus_range: Some( 2968 focus_range: 6..15,
3159 6..15,
3160 ),
3161 name: "ImplTrait", 2969 name: "ImplTrait",
3162 kind: TRAIT, 2970 kind: Trait,
3163 container_name: None, 2971 description: "trait ImplTrait",
3164 description: Some(
3165 "trait ImplTrait",
3166 ),
3167 docs: None,
3168 }, 2972 },
3169 }, 2973 },
3170 HoverGotoTypeData { 2974 HoverGotoTypeData {
@@ -3174,16 +2978,10 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
3174 0, 2978 0,
3175 ), 2979 ),
3176 full_range: 43..57, 2980 full_range: 43..57,
3177 focus_range: Some( 2981 focus_range: 50..51,
3178 50..51,
3179 ),
3180 name: "B", 2982 name: "B",
3181 kind: STRUCT, 2983 kind: Struct,
3182 container_name: None, 2984 description: "struct B",
3183 description: Some(
3184 "struct B",
3185 ),
3186 docs: None,
3187 }, 2985 },
3188 }, 2986 },
3189 HoverGotoTypeData { 2987 HoverGotoTypeData {
@@ -3193,16 +2991,10 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
3193 0, 2991 0,
3194 ), 2992 ),
3195 full_range: 22..42, 2993 full_range: 22..42,
3196 focus_range: Some( 2994 focus_range: 28..36,
3197 28..36,
3198 ),
3199 name: "DynTrait", 2995 name: "DynTrait",
3200 kind: TRAIT, 2996 kind: Trait,
3201 container_name: None, 2997 description: "trait DynTrait",
3202 description: Some(
3203 "trait DynTrait",
3204 ),
3205 docs: None,
3206 }, 2998 },
3207 }, 2999 },
3208 HoverGotoTypeData { 3000 HoverGotoTypeData {
@@ -3212,16 +3004,10 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
3212 0, 3004 0,
3213 ), 3005 ),
3214 full_range: 58..69, 3006 full_range: 58..69,
3215 focus_range: Some( 3007 focus_range: 65..66,
3216 65..66,
3217 ),
3218 name: "S", 3008 name: "S",
3219 kind: STRUCT, 3009 kind: Struct,
3220 container_name: None, 3010 description: "struct S",
3221 description: Some(
3222 "struct S",
3223 ),
3224 docs: None,
3225 }, 3011 },
3226 }, 3012 },
3227 ], 3013 ],
@@ -3260,16 +3046,10 @@ fn main() { let s<|>t = test().get(); }
3260 0, 3046 0,
3261 ), 3047 ),
3262 full_range: 0..62, 3048 full_range: 0..62,
3263 focus_range: Some( 3049 focus_range: 6..9,
3264 6..9,
3265 ),
3266 name: "Foo", 3050 name: "Foo",
3267 kind: TRAIT, 3051 kind: Trait,
3268 container_name: None, 3052 description: "trait Foo",
3269 description: Some(
3270 "trait Foo",
3271 ),
3272 docs: None,
3273 }, 3053 },
3274 }, 3054 },
3275 ], 3055 ],
diff --git a/crates/ide/src/lib.rs b/crates/ide/src/lib.rs
index c5c652cda..dbad9a84f 100644
--- a/crates/ide/src/lib.rs
+++ b/crates/ide/src/lib.rs
@@ -57,14 +57,14 @@ use ide_db::{
57 symbol_index::{self, FileSymbol}, 57 symbol_index::{self, FileSymbol},
58 LineIndexDatabase, 58 LineIndexDatabase,
59}; 59};
60use syntax::{SourceFile, TextRange, TextSize}; 60use syntax::SourceFile;
61 61
62use crate::display::ToNav; 62use crate::display::ToNav;
63 63
64pub use crate::{ 64pub use crate::{
65 call_hierarchy::CallItem, 65 call_hierarchy::CallItem,
66 diagnostics::{Diagnostic, DiagnosticsConfig, Fix, Severity}, 66 diagnostics::{Diagnostic, DiagnosticsConfig, Fix, Severity},
67 display::NavigationTarget, 67 display::navigation_target::{NavigationTarget, SymbolKind},
68 expand_macro::ExpandedMacro, 68 expand_macro::ExpandedMacro,
69 file_structure::StructureNode, 69 file_structure::StructureNode,
70 folding_ranges::{Fold, FoldKind}, 70 folding_ranges::{Fold, FoldKind},
@@ -79,22 +79,21 @@ pub use crate::{
79 HighlightedRange, 79 HighlightedRange,
80 }, 80 },
81}; 81};
82pub use assists::{Assist, AssistConfig, AssistId, AssistKind, ResolvedAssist};
82pub use completion::{ 83pub use completion::{
83 CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability, 84 CompletionConfig, CompletionItem, CompletionItemKind, CompletionResolveCapability,
84 CompletionScore, ImportEdit, InsertTextFormat, 85 CompletionScore, ImportEdit, InsertTextFormat,
85}; 86};
86pub use ide_db::{
87 call_info::CallInfo,
88 search::{Reference, ReferenceAccess, ReferenceKind},
89};
90
91pub use assists::{Assist, AssistConfig, AssistId, AssistKind, ResolvedAssist};
92pub use hir::{Documentation, Semantics}; 87pub use hir::{Documentation, Semantics};
93pub use ide_db::base_db::{ 88pub use ide_db::base_db::{
94 Canceled, Change, CrateGraph, CrateId, Edition, FileId, FilePosition, FileRange, SourceRoot, 89 Canceled, Change, CrateGraph, CrateId, Edition, FileId, FilePosition, FileRange, SourceRoot,
95 SourceRootId, 90 SourceRootId,
96}; 91};
97pub use ide_db::{ 92pub use ide_db::{
93 call_info::CallInfo,
94 search::{Reference, ReferenceAccess, ReferenceKind},
95};
96pub use ide_db::{
98 label::Label, 97 label::Label,
99 line_index::{LineCol, LineIndex}, 98 line_index::{LineCol, LineIndex},
100 search::SearchScope, 99 search::SearchScope,
@@ -103,6 +102,7 @@ pub use ide_db::{
103 RootDatabase, 102 RootDatabase,
104}; 103};
105pub use ssr::SsrError; 104pub use ssr::SsrError;
105pub use syntax::{TextRange, TextSize};
106pub use text_edit::{Indel, TextEdit}; 106pub use text_edit::{Indel, TextEdit};
107 107
108pub type Cancelable<T> = Result<T, Canceled>; 108pub type Cancelable<T> = Result<T, Canceled>;
diff --git a/crates/ide/src/parent_module.rs b/crates/ide/src/parent_module.rs
index 6cc3b2991..be344a09b 100644
--- a/crates/ide/src/parent_module.rs
+++ b/crates/ide/src/parent_module.rs
@@ -78,7 +78,7 @@ mod tests {
78 ", 78 ",
79 ); 79 );
80 let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); 80 let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
81 nav.assert_match("foo MODULE FileId(0) 0..8"); 81 nav.assert_match("foo Module FileId(0) 0..8");
82 } 82 }
83 83
84 #[test] 84 #[test]
@@ -97,7 +97,7 @@ mod tests {
97 ", 97 ",
98 ); 98 );
99 let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); 99 let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
100 nav.assert_match("foo MODULE FileId(0) 0..8"); 100 nav.assert_match("foo Module FileId(0) 0..8");
101 } 101 }
102 102
103 #[test] 103 #[test]
@@ -113,7 +113,7 @@ mod tests {
113 ", 113 ",
114 ); 114 );
115 let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); 115 let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
116 nav.assert_match("baz MODULE FileId(0) 32..44"); 116 nav.assert_match("baz Module FileId(0) 32..44");
117 } 117 }
118 118
119 #[test] 119 #[test]
diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs
index 98190a86b..8c00a7105 100644
--- a/crates/ide/src/references.rs
+++ b/crates/ide/src/references.rs
@@ -24,7 +24,7 @@ use syntax::{
24 match_ast, AstNode, SyntaxKind, SyntaxNode, TextRange, TokenAtOffset, 24 match_ast, AstNode, SyntaxKind, SyntaxNode, TextRange, TokenAtOffset,
25}; 25};
26 26
27use crate::{display::TryToNav, FilePosition, FileRange, NavigationTarget, RangeInfo}; 27use crate::{display::TryToNav, FilePosition, FileRange, NavigationTarget, RangeInfo, SymbolKind};
28 28
29#[derive(Debug, Clone)] 29#[derive(Debug, Clone)]
30pub struct ReferenceSearchResult { 30pub struct ReferenceSearchResult {
@@ -278,7 +278,7 @@ fn try_find_self_references(
278 full_range: self_param.syntax().text_range(), 278 full_range: self_param.syntax().text_range(),
279 focus_range: Some(param_self_token.text_range()), 279 focus_range: Some(param_self_token.text_range()),
280 name: param_self_token.text().clone(), 280 name: param_self_token.text().clone(),
281 kind: param_self_token.kind(), 281 kind: Some(SymbolKind::SelfParam),
282 container_name: None, 282 container_name: None,
283 description: None, 283 description: None,
284 docs: None, 284 docs: None,
@@ -343,7 +343,7 @@ fn main() {
343} 343}
344"#, 344"#,
345 expect![[r#" 345 expect![[r#"
346 Foo STRUCT FileId(0) 0..26 7..10 Other 346 Foo Struct FileId(0) 0..26 7..10 Other
347 347
348 FileId(0) 101..104 StructLiteral 348 FileId(0) 101..104 StructLiteral
349 "#]], 349 "#]],
@@ -361,7 +361,7 @@ struct Foo<|> {}
361} 361}
362"#, 362"#,
363 expect![[r#" 363 expect![[r#"
364 Foo STRUCT FileId(0) 0..13 7..10 Other 364 Foo Struct FileId(0) 0..13 7..10 Other
365 365
366 FileId(0) 41..44 Other 366 FileId(0) 41..44 Other
367 FileId(0) 54..57 StructLiteral 367 FileId(0) 54..57 StructLiteral
@@ -380,7 +380,7 @@ struct Foo<T> <|>{}
380} 380}
381"#, 381"#,
382 expect![[r#" 382 expect![[r#"
383 Foo STRUCT FileId(0) 0..16 7..10 Other 383 Foo Struct FileId(0) 0..16 7..10 Other
384 384
385 FileId(0) 64..67 StructLiteral 385 FileId(0) 64..67 StructLiteral
386 "#]], 386 "#]],
@@ -399,7 +399,7 @@ fn main() {
399} 399}
400"#, 400"#,
401 expect![[r#" 401 expect![[r#"
402 Foo STRUCT FileId(0) 0..16 7..10 Other 402 Foo Struct FileId(0) 0..16 7..10 Other
403 403
404 FileId(0) 54..57 StructLiteral 404 FileId(0) 54..57 StructLiteral
405 "#]], 405 "#]],
@@ -420,7 +420,7 @@ fn main() {
420} 420}
421"#, 421"#,
422 expect![[r#" 422 expect![[r#"
423 Foo ENUM FileId(0) 0..26 5..8 Other 423 Foo Enum FileId(0) 0..26 5..8 Other
424 424
425 FileId(0) 63..66 EnumLiteral 425 FileId(0) 63..66 EnumLiteral
426 "#]], 426 "#]],
@@ -441,7 +441,7 @@ fn main() {
441} 441}
442"#, 442"#,
443 expect![[r#" 443 expect![[r#"
444 Foo ENUM FileId(0) 0..26 5..8 Other 444 Foo Enum FileId(0) 0..26 5..8 Other
445 445
446 FileId(0) 50..53 Other 446 FileId(0) 50..53 Other
447 FileId(0) 63..66 EnumLiteral 447 FileId(0) 63..66 EnumLiteral
@@ -463,7 +463,7 @@ fn main() {
463} 463}
464"#, 464"#,
465 expect![[r#" 465 expect![[r#"
466 Foo ENUM FileId(0) 0..32 5..8 Other 466 Foo Enum FileId(0) 0..32 5..8 Other
467 467
468 FileId(0) 73..76 EnumLiteral 468 FileId(0) 73..76 EnumLiteral
469 "#]], 469 "#]],
@@ -484,7 +484,7 @@ fn main() {
484} 484}
485"#, 485"#,
486 expect![[r#" 486 expect![[r#"
487 Foo ENUM FileId(0) 0..33 5..8 Other 487 Foo Enum FileId(0) 0..33 5..8 Other
488 488
489 FileId(0) 70..73 EnumLiteral 489 FileId(0) 70..73 EnumLiteral
490 "#]], 490 "#]],
@@ -507,7 +507,7 @@ fn main() {
507 i = 5; 507 i = 5;
508}"#, 508}"#,
509 expect![[r#" 509 expect![[r#"
510 i IDENT_PAT FileId(0) 24..25 Other Write 510 i Local FileId(0) 24..25 Other Write
511 511
512 FileId(0) 50..51 Other Write 512 FileId(0) 50..51 Other Write
513 FileId(0) 54..55 Other Read 513 FileId(0) 54..55 Other Read
@@ -531,7 +531,7 @@ fn bar() {
531} 531}
532"#, 532"#,
533 expect![[r#" 533 expect![[r#"
534 spam IDENT_PAT FileId(0) 19..23 Other 534 spam Local FileId(0) 19..23 Other
535 535
536 FileId(0) 34..38 Other Read 536 FileId(0) 34..38 Other Read
537 FileId(0) 41..45 Other Read 537 FileId(0) 41..45 Other Read
@@ -546,7 +546,7 @@ fn bar() {
546fn foo(i : u32) -> u32 { i<|> } 546fn foo(i : u32) -> u32 { i<|> }
547"#, 547"#,
548 expect![[r#" 548 expect![[r#"
549 i IDENT_PAT FileId(0) 7..8 Other 549 i Local FileId(0) 7..8 Other
550 550
551 FileId(0) 25..26 Other Read 551 FileId(0) 25..26 Other Read
552 "#]], 552 "#]],
@@ -560,7 +560,7 @@ fn foo(i : u32) -> u32 { i<|> }
560fn foo(i<|> : u32) -> u32 { i } 560fn foo(i<|> : u32) -> u32 { i }
561"#, 561"#,
562 expect![[r#" 562 expect![[r#"
563 i IDENT_PAT FileId(0) 7..8 Other 563 i Local FileId(0) 7..8 Other
564 564
565 FileId(0) 25..26 Other Read 565 FileId(0) 25..26 Other Read
566 "#]], 566 "#]],
@@ -581,7 +581,7 @@ fn main(s: Foo) {
581} 581}
582"#, 582"#,
583 expect![[r#" 583 expect![[r#"
584 spam RECORD_FIELD FileId(0) 17..30 21..25 Other 584 spam Field FileId(0) 17..30 21..25 Other
585 585
586 FileId(0) 67..71 Other Read 586 FileId(0) 67..71 Other Read
587 "#]], 587 "#]],
@@ -598,7 +598,7 @@ impl Foo {
598} 598}
599"#, 599"#,
600 expect![[r#" 600 expect![[r#"
601 f FN FileId(0) 27..43 30..31 Other 601 f Function FileId(0) 27..43 30..31 Other
602 602
603 "#]], 603 "#]],
604 ); 604 );
@@ -615,7 +615,7 @@ enum Foo {
615} 615}
616"#, 616"#,
617 expect![[r#" 617 expect![[r#"
618 B VARIANT FileId(0) 22..23 22..23 Other 618 B Variant FileId(0) 22..23 22..23 Other
619 619
620 "#]], 620 "#]],
621 ); 621 );
@@ -632,7 +632,7 @@ enum Foo {
632} 632}
633"#, 633"#,
634 expect![[r#" 634 expect![[r#"
635 field RECORD_FIELD FileId(0) 26..35 26..31 Other 635 field Field FileId(0) 26..35 26..31 Other
636 636
637 "#]], 637 "#]],
638 ); 638 );
@@ -673,7 +673,7 @@ fn f() {
673} 673}
674"#, 674"#,
675 expect![[r#" 675 expect![[r#"
676 Foo STRUCT FileId(1) 17..51 28..31 Other 676 Foo Struct FileId(1) 17..51 28..31 Other
677 677
678 FileId(0) 53..56 StructLiteral 678 FileId(0) 53..56 StructLiteral
679 FileId(2) 79..82 StructLiteral 679 FileId(2) 79..82 StructLiteral
@@ -703,7 +703,7 @@ pub struct Foo {
703} 703}
704"#, 704"#,
705 expect![[r#" 705 expect![[r#"
706 foo SOURCE_FILE FileId(1) 0..35 Other 706 foo Module FileId(1) 0..35 Other
707 707
708 FileId(0) 14..17 Other 708 FileId(0) 14..17 Other
709 "#]], 709 "#]],
@@ -731,7 +731,7 @@ pub(super) struct Foo<|> {
731} 731}
732"#, 732"#,
733 expect![[r#" 733 expect![[r#"
734 Foo STRUCT FileId(2) 0..41 18..21 Other 734 Foo Struct FileId(2) 0..41 18..21 Other
735 735
736 FileId(1) 20..23 Other 736 FileId(1) 20..23 Other
737 FileId(1) 47..50 StructLiteral 737 FileId(1) 47..50 StructLiteral
@@ -759,7 +759,7 @@ pub(super) struct Foo<|> {
759 code, 759 code,
760 None, 760 None,
761 expect![[r#" 761 expect![[r#"
762 quux FN FileId(0) 19..35 26..30 Other 762 quux Function FileId(0) 19..35 26..30 Other
763 763
764 FileId(1) 16..20 StructLiteral 764 FileId(1) 16..20 StructLiteral
765 FileId(2) 16..20 StructLiteral 765 FileId(2) 16..20 StructLiteral
@@ -770,7 +770,7 @@ pub(super) struct Foo<|> {
770 code, 770 code,
771 Some(SearchScope::single_file(FileId(2))), 771 Some(SearchScope::single_file(FileId(2))),
772 expect![[r#" 772 expect![[r#"
773 quux FN FileId(0) 19..35 26..30 Other 773 quux Function FileId(0) 19..35 26..30 Other
774 774
775 FileId(2) 16..20 StructLiteral 775 FileId(2) 16..20 StructLiteral
776 "#]], 776 "#]],
@@ -790,7 +790,7 @@ fn foo() {
790} 790}
791"#, 791"#,
792 expect![[r#" 792 expect![[r#"
793 m1 MACRO_RULES FileId(0) 0..46 29..31 Other 793 m1 Macro FileId(0) 0..46 29..31 Other
794 794
795 FileId(0) 63..65 StructLiteral 795 FileId(0) 63..65 StructLiteral
796 FileId(0) 73..75 StructLiteral 796 FileId(0) 73..75 StructLiteral
@@ -808,7 +808,7 @@ fn foo() {
808} 808}
809"#, 809"#,
810 expect![[r#" 810 expect![[r#"
811 i IDENT_PAT FileId(0) 23..24 Other Write 811 i Local FileId(0) 23..24 Other Write
812 812
813 FileId(0) 34..35 Other Write 813 FileId(0) 34..35 Other Write
814 FileId(0) 38..39 Other Read 814 FileId(0) 38..39 Other Read
@@ -830,7 +830,7 @@ fn foo() {
830} 830}
831"#, 831"#,
832 expect![[r#" 832 expect![[r#"
833 f RECORD_FIELD FileId(0) 15..21 15..16 Other 833 f Field FileId(0) 15..21 15..16 Other
834 834
835 FileId(0) 55..56 RecordFieldExprOrPat Read 835 FileId(0) 55..56 RecordFieldExprOrPat Read
836 FileId(0) 68..69 Other Write 836 FileId(0) 68..69 Other Write
@@ -848,7 +848,7 @@ fn foo() {
848} 848}
849"#, 849"#,
850 expect![[r#" 850 expect![[r#"
851 i IDENT_PAT FileId(0) 19..20 Other 851 i Local FileId(0) 19..20 Other
852 852
853 FileId(0) 26..27 Other Write 853 FileId(0) 26..27 Other Write
854 "#]], 854 "#]],
@@ -872,7 +872,7 @@ fn main() {
872} 872}
873"#, 873"#,
874 expect![[r#" 874 expect![[r#"
875 new FN FileId(0) 54..81 61..64 Other 875 new Function FileId(0) 54..81 61..64 Other
876 876
877 FileId(0) 126..129 StructLiteral 877 FileId(0) 126..129 StructLiteral
878 "#]], 878 "#]],
@@ -894,7 +894,7 @@ use crate::f;
894fn g() { f(); } 894fn g() { f(); }
895"#, 895"#,
896 expect![[r#" 896 expect![[r#"
897 f FN FileId(0) 22..31 25..26 Other 897 f Function FileId(0) 22..31 25..26 Other
898 898
899 FileId(1) 11..12 Other 899 FileId(1) 11..12 Other
900 FileId(1) 24..25 StructLiteral 900 FileId(1) 24..25 StructLiteral
@@ -917,7 +917,7 @@ fn f(s: S) {
917} 917}
918"#, 918"#,
919 expect![[r#" 919 expect![[r#"
920 field RECORD_FIELD FileId(0) 15..24 15..20 Other 920 field Field FileId(0) 15..24 15..20 Other
921 921
922 FileId(0) 68..73 FieldShorthandForField Read 922 FileId(0) 68..73 FieldShorthandForField Read
923 "#]], 923 "#]],
@@ -941,7 +941,7 @@ fn f(e: En) {
941} 941}
942"#, 942"#,
943 expect![[r#" 943 expect![[r#"
944 field RECORD_FIELD FileId(0) 32..41 32..37 Other 944 field Field FileId(0) 32..41 32..37 Other
945 945
946 FileId(0) 102..107 FieldShorthandForField Read 946 FileId(0) 102..107 FieldShorthandForField Read
947 "#]], 947 "#]],
@@ -965,7 +965,7 @@ fn f() -> m::En {
965} 965}
966"#, 966"#,
967 expect![[r#" 967 expect![[r#"
968 field RECORD_FIELD FileId(0) 56..65 56..61 Other 968 field Field FileId(0) 56..65 56..61 Other
969 969
970 FileId(0) 125..130 RecordFieldExprOrPat Read 970 FileId(0) 125..130 RecordFieldExprOrPat Read
971 "#]], 971 "#]],
@@ -990,7 +990,7 @@ impl Foo {
990} 990}
991"#, 991"#,
992 expect![[r#" 992 expect![[r#"
993 self SELF_KW FileId(0) 47..51 47..51 SelfKw Read 993 self SelfParam FileId(0) 47..51 47..51 SelfKw Read
994 994
995 FileId(0) 71..75 SelfKw Read 995 FileId(0) 71..75 SelfKw Read
996 FileId(0) 152..156 SelfKw Read 996 FileId(0) 152..156 SelfKw Read
@@ -1038,7 +1038,7 @@ fn foo<'a, 'b: 'a>(x: &'a<|> ()) -> &'a () where &'a (): Foo<'a> {
1038} 1038}
1039"#, 1039"#,
1040 expect![[r#" 1040 expect![[r#"
1041 'a LIFETIME_PARAM FileId(0) 55..57 55..57 Lifetime 1041 'a LifetimeParam FileId(0) 55..57 55..57 Lifetime
1042 1042
1043 FileId(0) 63..65 Lifetime 1043 FileId(0) 63..65 Lifetime
1044 FileId(0) 71..73 Lifetime 1044 FileId(0) 71..73 Lifetime
@@ -1056,7 +1056,7 @@ fn foo<'a, 'b: 'a>(x: &'a<|> ()) -> &'a () where &'a (): Foo<'a> {
1056type Foo<'a, T> where T: 'a<|> = &'a T; 1056type Foo<'a, T> where T: 'a<|> = &'a T;
1057"#, 1057"#,
1058 expect![[r#" 1058 expect![[r#"
1059 'a LIFETIME_PARAM FileId(0) 9..11 9..11 Lifetime 1059 'a LifetimeParam FileId(0) 9..11 9..11 Lifetime
1060 1060
1061 FileId(0) 25..27 Lifetime 1061 FileId(0) 25..27 Lifetime
1062 FileId(0) 31..33 Lifetime 1062 FileId(0) 31..33 Lifetime
@@ -1078,7 +1078,7 @@ impl<'a> Foo<'a> for &'a () {
1078} 1078}
1079"#, 1079"#,
1080 expect![[r#" 1080 expect![[r#"
1081 'a LIFETIME_PARAM FileId(0) 47..49 47..49 Lifetime 1081 'a LifetimeParam FileId(0) 47..49 47..49 Lifetime
1082 1082
1083 FileId(0) 55..57 Lifetime 1083 FileId(0) 55..57 Lifetime
1084 FileId(0) 64..66 Lifetime 1084 FileId(0) 64..66 Lifetime
diff --git a/crates/ide/src/runnables.rs b/crates/ide/src/runnables.rs
index 2f465c195..ff386be80 100644
--- a/crates/ide/src/runnables.rs
+++ b/crates/ide/src/runnables.rs
@@ -12,7 +12,7 @@ use syntax::{
12 12
13use crate::{ 13use crate::{
14 display::{ToNav, TryToNav}, 14 display::{ToNav, TryToNav},
15 FileId, NavigationTarget, 15 FileId, NavigationTarget, SymbolKind,
16}; 16};
17 17
18#[derive(Debug, Clone)] 18#[derive(Debug, Clone)]
@@ -137,7 +137,11 @@ fn runnable_fn(sema: &Semantics<RootDatabase>, func: ast::Fn, file_id: FileId) -
137 } 137 }
138 }; 138 };
139 139
140 let nav = NavigationTarget::from_named(sema.db, InFile::new(file_id.into(), &func)); 140 let nav = NavigationTarget::from_named(
141 sema.db,
142 InFile::new(file_id.into(), &func),
143 SymbolKind::Function,
144 );
141 let cfg = def.attrs(sema.db).cfg(); 145 let cfg = def.attrs(sema.db).cfg();
142 Some(Runnable { nav, kind, cfg }) 146 Some(Runnable { nav, kind, cfg })
143} 147}
@@ -204,7 +208,7 @@ fn module_def_doctest(sema: &Semantics<RootDatabase>, def: hir::ModuleDef) -> Op
204 nav.focus_range = None; 208 nav.focus_range = None;
205 nav.description = None; 209 nav.description = None;
206 nav.docs = None; 210 nav.docs = None;
207 nav.kind = syntax::SyntaxKind::COMMENT; 211 nav.kind = None;
208 let res = Runnable { nav, kind: RunnableKind::DocTest { test_id }, cfg: attrs.cfg() }; 212 let res = Runnable { nav, kind: RunnableKind::DocTest { test_id }, cfg: attrs.cfg() };
209 Some(res) 213 Some(res)
210} 214}
@@ -348,14 +352,9 @@ fn bench() {}
348 0, 352 0,
349 ), 353 ),
350 full_range: 1..13, 354 full_range: 1..13,
351 focus_range: Some( 355 focus_range: 4..8,
352 4..8,
353 ),
354 name: "main", 356 name: "main",
355 kind: FN, 357 kind: Function,
356 container_name: None,
357 description: None,
358 docs: None,
359 }, 358 },
360 kind: Bin, 359 kind: Bin,
361 cfg: None, 360 cfg: None,
@@ -366,14 +365,9 @@ fn bench() {}
366 0, 365 0,
367 ), 366 ),
368 full_range: 15..39, 367 full_range: 15..39,
369 focus_range: Some( 368 focus_range: 26..34,
370 26..34,
371 ),
372 name: "test_foo", 369 name: "test_foo",
373 kind: FN, 370 kind: Function,
374 container_name: None,
375 description: None,
376 docs: None,
377 }, 371 },
378 kind: Test { 372 kind: Test {
379 test_id: Path( 373 test_id: Path(
@@ -391,14 +385,9 @@ fn bench() {}
391 0, 385 0,
392 ), 386 ),
393 full_range: 41..75, 387 full_range: 41..75,
394 focus_range: Some( 388 focus_range: 62..70,
395 62..70,
396 ),
397 name: "test_foo", 389 name: "test_foo",
398 kind: FN, 390 kind: Function,
399 container_name: None,
400 description: None,
401 docs: None,
402 }, 391 },
403 kind: Test { 392 kind: Test {
404 test_id: Path( 393 test_id: Path(
@@ -416,14 +405,9 @@ fn bench() {}
416 0, 405 0,
417 ), 406 ),
418 full_range: 77..99, 407 full_range: 77..99,
419 focus_range: Some( 408 focus_range: 89..94,
420 89..94,
421 ),
422 name: "bench", 409 name: "bench",
423 kind: FN, 410 kind: Function,
424 container_name: None,
425 description: None,
426 docs: None,
427 }, 411 },
428 kind: Bench { 412 kind: Bench {
429 test_id: Path( 413 test_id: Path(
@@ -513,14 +497,9 @@ struct StructWithRunnable(String);
513 0, 497 0,
514 ), 498 ),
515 full_range: 1..13, 499 full_range: 1..13,
516 focus_range: Some( 500 focus_range: 4..8,
517 4..8,
518 ),
519 name: "main", 501 name: "main",
520 kind: FN, 502 kind: Function,
521 container_name: None,
522 description: None,
523 docs: None,
524 }, 503 },
525 kind: Bin, 504 kind: Bin,
526 cfg: None, 505 cfg: None,
@@ -531,12 +510,7 @@ struct StructWithRunnable(String);
531 0, 510 0,
532 ), 511 ),
533 full_range: 15..74, 512 full_range: 15..74,
534 focus_range: None,
535 name: "should_have_runnable", 513 name: "should_have_runnable",
536 kind: COMMENT,
537 container_name: None,
538 description: None,
539 docs: None,
540 }, 514 },
541 kind: DocTest { 515 kind: DocTest {
542 test_id: Path( 516 test_id: Path(
@@ -551,12 +525,7 @@ struct StructWithRunnable(String);
551 0, 525 0,
552 ), 526 ),
553 full_range: 76..148, 527 full_range: 76..148,
554 focus_range: None,
555 name: "should_have_runnable_1", 528 name: "should_have_runnable_1",
556 kind: COMMENT,
557 container_name: None,
558 description: None,
559 docs: None,
560 }, 529 },
561 kind: DocTest { 530 kind: DocTest {
562 test_id: Path( 531 test_id: Path(
@@ -571,12 +540,7 @@ struct StructWithRunnable(String);
571 0, 540 0,
572 ), 541 ),
573 full_range: 150..254, 542 full_range: 150..254,
574 focus_range: None,
575 name: "should_have_runnable_2", 543 name: "should_have_runnable_2",
576 kind: COMMENT,
577 container_name: None,
578 description: None,
579 docs: None,
580 }, 544 },
581 kind: DocTest { 545 kind: DocTest {
582 test_id: Path( 546 test_id: Path(
@@ -591,12 +555,7 @@ struct StructWithRunnable(String);
591 0, 555 0,
592 ), 556 ),
593 full_range: 756..821, 557 full_range: 756..821,
594 focus_range: None,
595 name: "StructWithRunnable", 558 name: "StructWithRunnable",
596 kind: COMMENT,
597 container_name: None,
598 description: None,
599 docs: None,
600 }, 559 },
601 kind: DocTest { 560 kind: DocTest {
602 test_id: Path( 561 test_id: Path(
@@ -635,14 +594,9 @@ impl Data {
635 0, 594 0,
636 ), 595 ),
637 full_range: 1..13, 596 full_range: 1..13,
638 focus_range: Some( 597 focus_range: 4..8,
639 4..8,
640 ),
641 name: "main", 598 name: "main",
642 kind: FN, 599 kind: Function,
643 container_name: None,
644 description: None,
645 docs: None,
646 }, 600 },
647 kind: Bin, 601 kind: Bin,
648 cfg: None, 602 cfg: None,
@@ -653,12 +607,7 @@ impl Data {
653 0, 607 0,
654 ), 608 ),
655 full_range: 44..98, 609 full_range: 44..98,
656 focus_range: None,
657 name: "foo", 610 name: "foo",
658 kind: COMMENT,
659 container_name: None,
660 description: None,
661 docs: None,
662 }, 611 },
663 kind: DocTest { 612 kind: DocTest {
664 test_id: Path( 613 test_id: Path(
@@ -692,14 +641,9 @@ mod test_mod {
692 0, 641 0,
693 ), 642 ),
694 full_range: 1..51, 643 full_range: 1..51,
695 focus_range: Some( 644 focus_range: 5..13,
696 5..13,
697 ),
698 name: "test_mod", 645 name: "test_mod",
699 kind: MODULE, 646 kind: Module,
700 container_name: None,
701 description: None,
702 docs: None,
703 }, 647 },
704 kind: TestMod { 648 kind: TestMod {
705 path: "test_mod", 649 path: "test_mod",
@@ -712,14 +656,9 @@ mod test_mod {
712 0, 656 0,
713 ), 657 ),
714 full_range: 20..49, 658 full_range: 20..49,
715 focus_range: Some( 659 focus_range: 35..44,
716 35..44,
717 ),
718 name: "test_foo1", 660 name: "test_foo1",
719 kind: FN, 661 kind: Function,
720 container_name: None,
721 description: None,
722 docs: None,
723 }, 662 },
724 kind: Test { 663 kind: Test {
725 test_id: Path( 664 test_id: Path(
@@ -772,14 +711,9 @@ mod root_tests {
772 0, 711 0,
773 ), 712 ),
774 full_range: 22..323, 713 full_range: 22..323,
775 focus_range: Some( 714 focus_range: 26..40,
776 26..40,
777 ),
778 name: "nested_tests_0", 715 name: "nested_tests_0",
779 kind: MODULE, 716 kind: Module,
780 container_name: None,
781 description: None,
782 docs: None,
783 }, 717 },
784 kind: TestMod { 718 kind: TestMod {
785 path: "root_tests::nested_tests_0", 719 path: "root_tests::nested_tests_0",
@@ -792,14 +726,9 @@ mod root_tests {
792 0, 726 0,
793 ), 727 ),
794 full_range: 51..192, 728 full_range: 51..192,
795 focus_range: Some( 729 focus_range: 55..69,
796 55..69,
797 ),
798 name: "nested_tests_1", 730 name: "nested_tests_1",
799 kind: MODULE, 731 kind: Module,
800 container_name: None,
801 description: None,
802 docs: None,
803 }, 732 },
804 kind: TestMod { 733 kind: TestMod {
805 path: "root_tests::nested_tests_0::nested_tests_1", 734 path: "root_tests::nested_tests_0::nested_tests_1",
@@ -812,14 +741,9 @@ mod root_tests {
812 0, 741 0,
813 ), 742 ),
814 full_range: 84..126, 743 full_range: 84..126,
815 focus_range: Some( 744 focus_range: 107..121,
816 107..121,
817 ),
818 name: "nested_test_11", 745 name: "nested_test_11",
819 kind: FN, 746 kind: Function,
820 container_name: None,
821 description: None,
822 docs: None,
823 }, 747 },
824 kind: Test { 748 kind: Test {
825 test_id: Path( 749 test_id: Path(
@@ -837,14 +761,9 @@ mod root_tests {
837 0, 761 0,
838 ), 762 ),
839 full_range: 140..182, 763 full_range: 140..182,
840 focus_range: Some( 764 focus_range: 163..177,
841 163..177,
842 ),
843 name: "nested_test_12", 765 name: "nested_test_12",
844 kind: FN, 766 kind: Function,
845 container_name: None,
846 description: None,
847 docs: None,
848 }, 767 },
849 kind: Test { 768 kind: Test {
850 test_id: Path( 769 test_id: Path(
@@ -862,14 +781,9 @@ mod root_tests {
862 0, 781 0,
863 ), 782 ),
864 full_range: 202..286, 783 full_range: 202..286,
865 focus_range: Some( 784 focus_range: 206..220,
866 206..220,
867 ),
868 name: "nested_tests_2", 785 name: "nested_tests_2",
869 kind: MODULE, 786 kind: Module,
870 container_name: None,
871 description: None,
872 docs: None,
873 }, 787 },
874 kind: TestMod { 788 kind: TestMod {
875 path: "root_tests::nested_tests_0::nested_tests_2", 789 path: "root_tests::nested_tests_0::nested_tests_2",
@@ -882,14 +796,9 @@ mod root_tests {
882 0, 796 0,
883 ), 797 ),
884 full_range: 235..276, 798 full_range: 235..276,
885 focus_range: Some( 799 focus_range: 258..271,
886 258..271,
887 ),
888 name: "nested_test_2", 800 name: "nested_test_2",
889 kind: FN, 801 kind: Function,
890 container_name: None,
891 description: None,
892 docs: None,
893 }, 802 },
894 kind: Test { 803 kind: Test {
895 test_id: Path( 804 test_id: Path(
@@ -925,14 +834,9 @@ fn test_foo1() {}
925 0, 834 0,
926 ), 835 ),
927 full_range: 1..50, 836 full_range: 1..50,
928 focus_range: Some( 837 focus_range: 36..45,
929 36..45,
930 ),
931 name: "test_foo1", 838 name: "test_foo1",
932 kind: FN, 839 kind: Function,
933 container_name: None,
934 description: None,
935 docs: None,
936 }, 840 },
937 kind: Test { 841 kind: Test {
938 test_id: Path( 842 test_id: Path(
@@ -975,14 +879,9 @@ fn test_foo1() {}
975 0, 879 0,
976 ), 880 ),
977 full_range: 1..72, 881 full_range: 1..72,
978 focus_range: Some( 882 focus_range: 58..67,
979 58..67,
980 ),
981 name: "test_foo1", 883 name: "test_foo1",
982 kind: FN, 884 kind: Function,
983 container_name: None,
984 description: None,
985 docs: None,
986 }, 885 },
987 kind: Test { 886 kind: Test {
988 test_id: Path( 887 test_id: Path(
diff --git a/crates/ide_db/src/symbol_index.rs b/crates/ide_db/src/symbol_index.rs
index ca455fa03..0aa6a0765 100644
--- a/crates/ide_db/src/symbol_index.rs
+++ b/crates/ide_db/src/symbol_index.rs
@@ -39,7 +39,7 @@ use rustc_hash::{FxHashMap, FxHashSet};
39use syntax::{ 39use syntax::{
40 ast::{self, NameOwner}, 40 ast::{self, NameOwner},
41 match_ast, AstNode, Parse, SmolStr, SourceFile, 41 match_ast, AstNode, Parse, SmolStr, SourceFile,
42 SyntaxKind::{self, *}, 42 SyntaxKind::*,
43 SyntaxNode, SyntaxNodePtr, TextRange, WalkEvent, 43 SyntaxNode, SyntaxNodePtr, TextRange, WalkEvent,
44}; 44};
45 45
@@ -323,7 +323,7 @@ impl Query {
323 let (start, end) = SymbolIndex::map_value_to_range(indexed_value.value); 323 let (start, end) = SymbolIndex::map_value_to_range(indexed_value.value);
324 324
325 for symbol in &symbol_index.symbols[start..end] { 325 for symbol in &symbol_index.symbols[start..end] {
326 if self.only_types && !is_type(symbol.kind) { 326 if self.only_types && !symbol.kind.is_type() {
327 continue; 327 continue;
328 } 328 }
329 if self.exact && symbol.name != self.query { 329 if self.exact && symbol.name != self.query {
@@ -341,23 +341,44 @@ impl Query {
341 } 341 }
342} 342}
343 343
344fn is_type(kind: SyntaxKind) -> bool {
345 matches!(kind, STRUCT | ENUM | TRAIT | TYPE_ALIAS)
346}
347
348/// The actual data that is stored in the index. It should be as compact as 344/// The actual data that is stored in the index. It should be as compact as
349/// possible. 345/// possible.
350#[derive(Debug, Clone, PartialEq, Eq, Hash)] 346#[derive(Debug, Clone, PartialEq, Eq, Hash)]
351pub struct FileSymbol { 347pub struct FileSymbol {
352 pub file_id: FileId, 348 pub file_id: FileId,
353 pub name: SmolStr, 349 pub name: SmolStr,
354 pub kind: SyntaxKind, 350 pub kind: FileSymbolKind,
355 pub range: TextRange, 351 pub range: TextRange,
356 pub ptr: SyntaxNodePtr, 352 pub ptr: SyntaxNodePtr,
357 pub name_range: Option<TextRange>, 353 pub name_range: Option<TextRange>,
358 pub container_name: Option<SmolStr>, 354 pub container_name: Option<SmolStr>,
359} 355}
360 356
357#[derive(PartialEq, Eq, Hash, Clone, Copy, Debug)]
358pub enum FileSymbolKind {
359 Function,
360 Struct,
361 Enum,
362 Trait,
363 Module,
364 TypeAlias,
365 Const,
366 Static,
367 Macro,
368}
369
370impl FileSymbolKind {
371 fn is_type(self: FileSymbolKind) -> bool {
372 matches!(
373 self,
374 FileSymbolKind::Struct
375 | FileSymbolKind::Enum
376 | FileSymbolKind::Trait
377 | FileSymbolKind::TypeAlias
378 )
379 }
380}
381
361fn source_file_to_file_symbols(source_file: &SourceFile, file_id: FileId) -> Vec<FileSymbol> { 382fn source_file_to_file_symbols(source_file: &SourceFile, file_id: FileId) -> Vec<FileSymbol> {
362 let mut symbols = Vec::new(); 383 let mut symbols = Vec::new();
363 let mut stack = Vec::new(); 384 let mut stack = Vec::new();
@@ -412,7 +433,18 @@ fn to_symbol(node: &SyntaxNode) -> Option<(SmolStr, SyntaxNodePtr, TextRange)> {
412fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> { 433fn to_file_symbol(node: &SyntaxNode, file_id: FileId) -> Option<FileSymbol> {
413 to_symbol(node).map(move |(name, ptr, name_range)| FileSymbol { 434 to_symbol(node).map(move |(name, ptr, name_range)| FileSymbol {
414 name, 435 name,
415 kind: node.kind(), 436 kind: match node.kind() {
437 FN => FileSymbolKind::Function,
438 STRUCT => FileSymbolKind::Struct,
439 ENUM => FileSymbolKind::Enum,
440 TRAIT => FileSymbolKind::Trait,
441 MODULE => FileSymbolKind::Module,
442 TYPE_ALIAS => FileSymbolKind::TypeAlias,
443 CONST => FileSymbolKind::Const,
444 STATIC => FileSymbolKind::Static,
445 MACRO_RULES => FileSymbolKind::Macro,
446 kind => unreachable!("{:?}", kind),
447 },
416 range: node.text_range(), 448 range: node.text_range(),
417 ptr, 449 ptr,
418 file_id, 450 file_id,
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
index af226c109..66f8bee99 100644
--- a/crates/rust-analyzer/src/handlers.rs
+++ b/crates/rust-analyzer/src/handlers.rs
@@ -9,7 +9,7 @@ use std::{
9 9
10use ide::{ 10use ide::{
11 CompletionResolveCapability, FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData, 11 CompletionResolveCapability, FileId, FilePosition, FileRange, HoverAction, HoverGotoTypeData,
12 NavigationTarget, Query, RangeInfo, Runnable, RunnableKind, SearchScope, TextEdit, 12 NavigationTarget, Query, RangeInfo, Runnable, RunnableKind, SearchScope, SymbolKind, TextEdit,
13}; 13};
14use itertools::Itertools; 14use itertools::Itertools;
15use lsp_server::ErrorCode; 15use lsp_server::ErrorCode;
@@ -27,7 +27,7 @@ use project_model::TargetKind;
27use serde::{Deserialize, Serialize}; 27use serde::{Deserialize, Serialize};
28use serde_json::to_value; 28use serde_json::to_value;
29use stdx::{format_to, split_once}; 29use stdx::{format_to, split_once};
30use syntax::{algo, ast, AstNode, SyntaxKind, TextRange, TextSize}; 30use syntax::{algo, ast, AstNode, TextRange, TextSize};
31 31
32use crate::{ 32use crate::{
33 cargo_target_spec::CargoTargetSpec, 33 cargo_target_spec::CargoTargetSpec,
@@ -385,7 +385,10 @@ pub(crate) fn handle_workspace_symbol(
385 #[allow(deprecated)] 385 #[allow(deprecated)]
386 let info = SymbolInformation { 386 let info = SymbolInformation {
387 name: nav.name.to_string(), 387 name: nav.name.to_string(),
388 kind: to_proto::symbol_kind(nav.kind), 388 kind: nav
389 .kind
390 .map(to_proto::symbol_kind)
391 .unwrap_or(lsp_types::SymbolKind::Variable),
389 tags: None, 392 tags: None,
390 location: to_proto::location_from_nav(snap, nav)?, 393 location: to_proto::location_from_nav(snap, nav)?,
391 container_name, 394 container_name,
@@ -1037,10 +1040,10 @@ pub(crate) fn handle_code_lens(
1037 .filter(|it| { 1040 .filter(|it| {
1038 matches!( 1041 matches!(
1039 it.kind, 1042 it.kind,
1040 SyntaxKind::TRAIT 1043 SymbolKind::Trait
1041 | SyntaxKind::STRUCT 1044 | SymbolKind::Struct
1042 | SyntaxKind::ENUM 1045 | SymbolKind::Enum
1043 | SyntaxKind::UNION 1046 | SymbolKind::Union
1044 ) 1047 )
1045 }) 1048 })
1046 .map(|it| { 1049 .map(|it| {
@@ -1263,7 +1266,7 @@ pub(crate) fn handle_call_hierarchy_prepare(
1263 let RangeInfo { range: _, info: navs } = nav_info; 1266 let RangeInfo { range: _, info: navs } = nav_info;
1264 let res = navs 1267 let res = navs
1265 .into_iter() 1268 .into_iter()
1266 .filter(|it| it.kind == SyntaxKind::FN) 1269 .filter(|it| it.kind == Some(SymbolKind::Function))
1267 .map(|it| to_proto::call_hierarchy_item(&snap, it)) 1270 .map(|it| to_proto::call_hierarchy_item(&snap, it))
1268 .collect::<Result<Vec<_>>>()?; 1271 .collect::<Result<Vec<_>>>()?;
1269 1272
diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs
index 72f77a016..6b2302803 100644
--- a/crates/rust-analyzer/src/to_proto.rs
+++ b/crates/rust-analyzer/src/to_proto.rs
@@ -5,14 +5,13 @@ use std::{
5}; 5};
6 6
7use ide::{ 7use ide::{
8 Assist, AssistKind, CallInfo, CompletionItem, CompletionItemKind, Documentation, 8 Assist, AssistKind, CallInfo, CompletionItem, CompletionItemKind, Documentation, FileId,
9 FileSystemEdit, Fold, FoldKind, Highlight, HighlightModifier, HighlightTag, HighlightedRange, 9 FileRange, FileSystemEdit, Fold, FoldKind, Highlight, HighlightModifier, HighlightTag,
10 Indel, InlayHint, InlayKind, InsertTextFormat, LineIndex, Markup, NavigationTarget, 10 HighlightedRange, Indel, InlayHint, InlayKind, InsertTextFormat, LineIndex, Markup,
11 ReferenceAccess, ResolvedAssist, Runnable, Severity, SourceChange, SourceFileEdit, TextEdit, 11 NavigationTarget, ReferenceAccess, ResolvedAssist, Runnable, Severity, SourceChange,
12 SourceFileEdit, SymbolKind, TextEdit, TextRange, TextSize,
12}; 13};
13use ide_db::base_db::{FileId, FileRange};
14use itertools::Itertools; 14use itertools::Itertools;
15use syntax::{SyntaxKind, TextRange, TextSize};
16 15
17use crate::{ 16use crate::{
18 cargo_target_spec::CargoTargetSpec, global_state::GlobalStateSnapshot, 17 cargo_target_spec::CargoTargetSpec, global_state::GlobalStateSnapshot,
@@ -30,21 +29,24 @@ pub(crate) fn range(line_index: &LineIndex, range: TextRange) -> lsp_types::Rang
30 lsp_types::Range::new(start, end) 29 lsp_types::Range::new(start, end)
31} 30}
32 31
33pub(crate) fn symbol_kind(syntax_kind: SyntaxKind) -> lsp_types::SymbolKind { 32pub(crate) fn symbol_kind(symbol_kind: SymbolKind) -> lsp_types::SymbolKind {
34 match syntax_kind { 33 match symbol_kind {
35 SyntaxKind::FN => lsp_types::SymbolKind::Function, 34 SymbolKind::Function => lsp_types::SymbolKind::Function,
36 SyntaxKind::STRUCT => lsp_types::SymbolKind::Struct, 35 SymbolKind::Struct => lsp_types::SymbolKind::Struct,
37 SyntaxKind::ENUM => lsp_types::SymbolKind::Enum, 36 SymbolKind::Enum => lsp_types::SymbolKind::Enum,
38 SyntaxKind::VARIANT => lsp_types::SymbolKind::EnumMember, 37 SymbolKind::Variant => lsp_types::SymbolKind::EnumMember,
39 SyntaxKind::TRAIT => lsp_types::SymbolKind::Interface, 38 SymbolKind::Trait => lsp_types::SymbolKind::Interface,
40 SyntaxKind::MACRO_CALL => lsp_types::SymbolKind::Function, 39 SymbolKind::Macro => lsp_types::SymbolKind::Function,
41 SyntaxKind::MODULE => lsp_types::SymbolKind::Module, 40 SymbolKind::Module => lsp_types::SymbolKind::Module,
42 SyntaxKind::TYPE_ALIAS => lsp_types::SymbolKind::TypeParameter, 41 SymbolKind::TypeAlias | SymbolKind::TypeParam => lsp_types::SymbolKind::TypeParameter,
43 SyntaxKind::RECORD_FIELD => lsp_types::SymbolKind::Field, 42 SymbolKind::Field => lsp_types::SymbolKind::Field,
44 SyntaxKind::STATIC => lsp_types::SymbolKind::Constant, 43 SymbolKind::Static => lsp_types::SymbolKind::Constant,
45 SyntaxKind::CONST => lsp_types::SymbolKind::Constant, 44 SymbolKind::Const => lsp_types::SymbolKind::Constant,
46 SyntaxKind::IMPL => lsp_types::SymbolKind::Object, 45 SymbolKind::Impl => lsp_types::SymbolKind::Object,
47 _ => lsp_types::SymbolKind::Variable, 46 SymbolKind::Local | SymbolKind::SelfParam | SymbolKind::LifetimeParam => {
47 lsp_types::SymbolKind::Variable
48 }
49 SymbolKind::Union => lsp_types::SymbolKind::Struct,
48 } 50 }
49} 51}
50 52
@@ -719,7 +721,7 @@ pub(crate) fn call_hierarchy_item(
719) -> Result<lsp_types::CallHierarchyItem> { 721) -> Result<lsp_types::CallHierarchyItem> {
720 let name = target.name.to_string(); 722 let name = target.name.to_string();
721 let detail = target.description.clone(); 723 let detail = target.description.clone();
722 let kind = symbol_kind(target.kind); 724 let kind = target.kind.map(symbol_kind).unwrap_or(lsp_types::SymbolKind::Function);
723 let (uri, range, selection_range) = location_info(snap, target)?; 725 let (uri, range, selection_range) = location_info(snap, target)?;
724 Ok(lsp_types::CallHierarchyItem { 726 Ok(lsp_types::CallHierarchyItem {
725 name, 727 name,
diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs
index 16b079c42..ba7e5d2fb 100644
--- a/crates/syntax/src/ast/make.rs
+++ b/crates/syntax/src/ast/make.rs
@@ -20,6 +20,9 @@ pub fn name_ref(text: &str) -> ast::NameRef {
20pub fn ty(text: &str) -> ast::Type { 20pub fn ty(text: &str) -> ast::Type {
21 ast_from_text(&format!("impl {} for D {{}};", text)) 21 ast_from_text(&format!("impl {} for D {{}};", text))
22} 22}
23pub fn ty_unit() -> ast::Type {
24 ty("()")
25}
23 26
24pub fn assoc_item_list() -> ast::AssocItemList { 27pub fn assoc_item_list() -> ast::AssocItemList {
25 ast_from_text("impl C for D {};") 28 ast_from_text("impl C for D {};")