aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/display
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/display')
-rw-r--r--crates/ra_ide/src/display/function_signature.rs120
-rw-r--r--crates/ra_ide/src/display/navigation_target.rs134
-rw-r--r--crates/ra_ide/src/display/structure.rs429
3 files changed, 340 insertions, 343 deletions
diff --git a/crates/ra_ide/src/display/function_signature.rs b/crates/ra_ide/src/display/function_signature.rs
index 9572debd8..1d39544d3 100644
--- a/crates/ra_ide/src/display/function_signature.rs
+++ b/crates/ra_ide/src/display/function_signature.rs
@@ -10,7 +10,7 @@ use std::{
10use hir::{Docs, Documentation, HasSource, HirDisplay}; 10use hir::{Docs, Documentation, HasSource, HirDisplay};
11use ra_ide_db::RootDatabase; 11use ra_ide_db::RootDatabase;
12use ra_syntax::ast::{self, AstNode, NameOwner, VisibilityOwner}; 12use ra_syntax::ast::{self, AstNode, NameOwner, VisibilityOwner};
13use stdx::SepBy; 13use stdx::{split_delim, SepBy};
14 14
15use crate::display::{generic_parameters, where_predicates}; 15use crate::display::{generic_parameters, where_predicates};
16 16
@@ -61,15 +61,11 @@ pub struct FunctionQualifier {
61} 61}
62 62
63impl FunctionSignature { 63impl FunctionSignature {
64 pub(crate) fn with_doc_opt(mut self, doc: Option<Documentation>) -> Self {
65 self.doc = doc;
66 self
67 }
68
69 pub(crate) fn from_hir(db: &RootDatabase, function: hir::Function) -> Self { 64 pub(crate) fn from_hir(db: &RootDatabase, function: hir::Function) -> Self {
70 let doc = function.docs(db);
71 let ast_node = function.source(db).value; 65 let ast_node = function.source(db).value;
72 FunctionSignature::from(&ast_node).with_doc_opt(doc) 66 let mut res = FunctionSignature::from(&ast_node);
67 res.doc = function.docs(db);
68 res
73 } 69 }
74 70
75 pub(crate) fn from_struct(db: &RootDatabase, st: hir::Struct) -> Option<Self> { 71 pub(crate) fn from_struct(db: &RootDatabase, st: hir::Struct) -> Option<Self> {
@@ -93,24 +89,21 @@ impl FunctionSignature {
93 params.push(raw_param); 89 params.push(raw_param);
94 } 90 }
95 91
96 Some( 92 Some(FunctionSignature {
97 FunctionSignature { 93 kind: CallableKind::StructConstructor,
98 kind: CallableKind::StructConstructor, 94 visibility: node.visibility().map(|n| n.syntax().text().to_string()),
99 visibility: node.visibility().map(|n| n.syntax().text().to_string()), 95 // Do we need `const`?
100 // Do we need `const`? 96 qualifier: Default::default(),
101 qualifier: Default::default(), 97 name: node.name().map(|n| n.text().to_string()),
102 name: node.name().map(|n| n.text().to_string()), 98 ret_type: node.name().map(|n| n.text().to_string()),
103 ret_type: node.name().map(|n| n.text().to_string()), 99 parameters: params,
104 parameters: params, 100 parameter_names: vec![],
105 parameter_names: vec![], 101 parameter_types,
106 parameter_types, 102 generic_parameters: generic_parameters(&node),
107 generic_parameters: generic_parameters(&node), 103 where_predicates: where_predicates(&node),
108 where_predicates: where_predicates(&node), 104 doc: st.docs(db),
109 doc: None, 105 has_self_param: false,
110 has_self_param: false, 106 })
111 }
112 .with_doc_opt(st.docs(db)),
113 )
114 } 107 }
115 108
116 pub(crate) fn from_enum_variant(db: &RootDatabase, variant: hir::EnumVariant) -> Option<Self> { 109 pub(crate) fn from_enum_variant(db: &RootDatabase, variant: hir::EnumVariant) -> Option<Self> {
@@ -140,24 +133,21 @@ impl FunctionSignature {
140 params.push(format!("{}: {}", name, ty.display(db))); 133 params.push(format!("{}: {}", name, ty.display(db)));
141 } 134 }
142 135
143 Some( 136 Some(FunctionSignature {
144 FunctionSignature { 137 kind: CallableKind::VariantConstructor,
145 kind: CallableKind::VariantConstructor, 138 visibility: None,
146 visibility: None, 139 // Do we need `const`?
147 // Do we need `const`? 140 qualifier: Default::default(),
148 qualifier: Default::default(), 141 name: Some(name),
149 name: Some(name), 142 ret_type: None,
150 ret_type: None, 143 parameters: params,
151 parameters: params, 144 parameter_names: vec![],
152 parameter_names: vec![], 145 parameter_types,
153 parameter_types, 146 generic_parameters: vec![],
154 generic_parameters: vec![], 147 where_predicates: vec![],
155 where_predicates: vec![], 148 doc: variant.docs(db),
156 doc: None, 149 has_self_param: false,
157 has_self_param: false, 150 })
158 }
159 .with_doc_opt(variant.docs(db)),
160 )
161 } 151 }
162 152
163 pub(crate) fn from_macro(db: &RootDatabase, macro_def: hir::MacroDef) -> Option<Self> { 153 pub(crate) fn from_macro(db: &RootDatabase, macro_def: hir::MacroDef) -> Option<Self> {
@@ -165,23 +155,20 @@ impl FunctionSignature {
165 155
166 let params = vec![]; 156 let params = vec![];
167 157
168 Some( 158 Some(FunctionSignature {
169 FunctionSignature { 159 kind: CallableKind::Macro,
170 kind: CallableKind::Macro, 160 visibility: None,
171 visibility: None, 161 qualifier: Default::default(),
172 qualifier: Default::default(), 162 name: node.name().map(|n| n.text().to_string()),
173 name: node.name().map(|n| n.text().to_string()), 163 ret_type: None,
174 ret_type: None, 164 parameters: params,
175 parameters: params, 165 parameter_names: vec![],
176 parameter_names: vec![], 166 parameter_types: vec![],
177 parameter_types: vec![], 167 generic_parameters: vec![],
178 generic_parameters: vec![], 168 where_predicates: vec![],
179 where_predicates: vec![], 169 doc: macro_def.docs(db),
180 doc: None, 170 has_self_param: false,
181 has_self_param: false, 171 })
182 }
183 .with_doc_opt(macro_def.docs(db)),
184 )
185 } 172 }
186} 173}
187 174
@@ -207,7 +194,16 @@ impl From<&'_ ast::FnDef> for FunctionSignature {
207 res.push(raw_param); 194 res.push(raw_param);
208 } 195 }
209 196
210 res.extend(param_list.params().map(|param| param.syntax().text().to_string())); 197 // macro-generated functions are missing whitespace
198 fn fmt_param(param: ast::Param) -> String {
199 let text = param.syntax().text().to_string();
200 match split_delim(&text, ':') {
201 Some((left, right)) => format!("{}: {}", left.trim(), right.trim()),
202 _ => text,
203 }
204 }
205
206 res.extend(param_list.params().map(fmt_param));
211 res_types.extend(param_list.params().map(|param| { 207 res_types.extend(param_list.params().map(|param| {
212 let param_text = param.syntax().text().to_string(); 208 let param_text = param.syntax().text().to_string();
213 match param_text.split(':').nth(1).and_then(|it| it.get(1..)) { 209 match param_text.split(':').nth(1).and_then(|it| it.get(1..)) {
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs
index 5da28edd2..8bf2428ed 100644
--- a/crates/ra_ide/src/display/navigation_target.rs
+++ b/crates/ra_ide/src/display/navigation_target.rs
@@ -11,7 +11,7 @@ use ra_syntax::{
11 TextRange, 11 TextRange,
12}; 12};
13 13
14use crate::{FileRange, FileSymbol}; 14use crate::FileSymbol;
15 15
16use super::short_label::ShortLabel; 16use super::short_label::ShortLabel;
17 17
@@ -47,6 +47,19 @@ impl NavigationTarget {
47 pub fn range(&self) -> TextRange { 47 pub fn range(&self) -> TextRange {
48 self.focus_range.unwrap_or(self.full_range) 48 self.focus_range.unwrap_or(self.full_range)
49 } 49 }
50 /// A "most interesting" range withing the `full_range`.
51 ///
52 /// Typically, `full_range` is the whole syntax node,
53 /// including doc comments, and `focus_range` is the range of the identifier.
54 pub fn focus_range(&self) -> Option<TextRange> {
55 self.focus_range
56 }
57 pub fn full_range(&self) -> TextRange {
58 self.full_range
59 }
60 pub fn file_id(&self) -> FileId {
61 self.file_id
62 }
50 63
51 pub fn name(&self) -> &SmolStr { 64 pub fn name(&self) -> &SmolStr {
52 &self.name 65 &self.name
@@ -60,18 +73,6 @@ impl NavigationTarget {
60 self.kind 73 self.kind
61 } 74 }
62 75
63 pub fn file_id(&self) -> FileId {
64 self.file_id
65 }
66
67 pub fn file_range(&self) -> FileRange {
68 FileRange { file_id: self.file_id, range: self.full_range }
69 }
70
71 pub fn full_range(&self) -> TextRange {
72 self.full_range
73 }
74
75 pub fn docs(&self) -> Option<&str> { 76 pub fn docs(&self) -> Option<&str> {
76 self.docs.as_deref() 77 self.docs.as_deref()
77 } 78 }
@@ -80,27 +81,20 @@ impl NavigationTarget {
80 self.description.as_deref() 81 self.description.as_deref()
81 } 82 }
82 83
83 /// A "most interesting" range withing the `full_range`.
84 ///
85 /// Typically, `full_range` is the whole syntax node,
86 /// including doc comments, and `focus_range` is the range of the identifier.
87 pub fn focus_range(&self) -> Option<TextRange> {
88 self.focus_range
89 }
90
91 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget { 84 pub(crate) fn from_module_to_decl(db: &RootDatabase, module: hir::Module) -> NavigationTarget {
92 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default(); 85 let name = module.name(db).map(|it| it.to_string().into()).unwrap_or_default();
93 if let Some(src) = module.declaration_source(db) { 86 if let Some(src) = module.declaration_source(db) {
94 let frange = original_range(db, src.as_ref().map(|it| it.syntax())); 87 let frange = original_range(db, src.as_ref().map(|it| it.syntax()));
95 return NavigationTarget::from_syntax( 88 let mut res = NavigationTarget::from_syntax(
96 frange.file_id, 89 frange.file_id,
97 name, 90 name,
98 None, 91 None,
99 frange.range, 92 frange.range,
100 src.value.syntax().kind(), 93 src.value.syntax().kind(),
101 src.value.doc_comment_text(),
102 src.value.short_label(),
103 ); 94 );
95 res.docs = src.value.doc_comment_text();
96 res.description = src.value.short_label();
97 return res;
104 } 98 }
105 module.to_nav(db) 99 module.to_nav(db)
106 } 100 }
@@ -130,14 +124,12 @@ impl NavigationTarget {
130 } 124 }
131 125
132 /// Allows `NavigationTarget` to be created from a `NameOwner` 126 /// Allows `NavigationTarget` to be created from a `NameOwner`
133 fn from_named( 127 pub(crate) fn from_named(
134 db: &RootDatabase, 128 db: &RootDatabase,
135 node: InFile<&dyn ast::NameOwner>, 129 node: InFile<&dyn ast::NameOwner>,
136 docs: Option<String>,
137 description: Option<String>,
138 ) -> NavigationTarget { 130 ) -> NavigationTarget {
139 //FIXME: use `_` instead of empty string 131 let name =
140 let name = node.value.name().map(|it| it.text().clone()).unwrap_or_default(); 132 node.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
141 let focus_range = 133 let focus_range =
142 node.value.name().map(|it| original_range(db, node.with_value(it.syntax())).range); 134 node.value.name().map(|it| original_range(db, node.with_value(it.syntax())).range);
143 let frange = original_range(db, node.map(|it| it.syntax())); 135 let frange = original_range(db, node.map(|it| it.syntax()));
@@ -148,8 +140,25 @@ impl NavigationTarget {
148 focus_range, 140 focus_range,
149 frange.range, 141 frange.range,
150 node.value.syntax().kind(), 142 node.value.syntax().kind(),
151 docs, 143 )
152 description, 144 }
145
146 /// Allows `NavigationTarget` to be created from a `DocCommentsOwner` and a `NameOwner`
147 pub(crate) fn from_doc_commented(
148 db: &RootDatabase,
149 named: InFile<&dyn ast::NameOwner>,
150 node: InFile<&dyn ast::DocCommentsOwner>,
151 ) -> NavigationTarget {
152 let name =
153 named.value.name().map(|it| it.text().clone()).unwrap_or_else(|| SmolStr::new("_"));
154 let frange = original_range(db, node.map(|it| it.syntax()));
155
156 NavigationTarget::from_syntax(
157 frange.file_id,
158 name,
159 None,
160 frange.range,
161 node.value.syntax().kind(),
153 ) 162 )
154 } 163 }
155 164
@@ -159,8 +168,6 @@ impl NavigationTarget {
159 focus_range: Option<TextRange>, 168 focus_range: Option<TextRange>,
160 full_range: TextRange, 169 full_range: TextRange,
161 kind: SyntaxKind, 170 kind: SyntaxKind,
162 docs: Option<String>,
163 description: Option<String>,
164 ) -> NavigationTarget { 171 ) -> NavigationTarget {
165 NavigationTarget { 172 NavigationTarget {
166 file_id, 173 file_id,
@@ -169,8 +176,8 @@ impl NavigationTarget {
169 full_range, 176 full_range,
170 focus_range, 177 focus_range,
171 container_name: None, 178 container_name: None,
172 description, 179 description: None,
173 docs, 180 docs: None,
174 } 181 }
175 } 182 }
176} 183}
@@ -238,12 +245,11 @@ where
238{ 245{
239 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 246 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
240 let src = self.source(db); 247 let src = self.source(db);
241 NavigationTarget::from_named( 248 let mut res =
242 db, 249 NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner));
243 src.as_ref().map(|it| it as &dyn ast::NameOwner), 250 res.docs = src.value.doc_comment_text();
244 src.value.doc_comment_text(), 251 res.description = src.value.short_label();
245 src.value.short_label(), 252 res
246 )
247 } 253 }
248} 254}
249 255
@@ -258,35 +264,31 @@ impl ToNav for hir::Module {
258 } 264 }
259 }; 265 };
260 let frange = original_range(db, src.with_value(syntax)); 266 let frange = original_range(db, src.with_value(syntax));
261 NavigationTarget::from_syntax( 267 NavigationTarget::from_syntax(frange.file_id, name, focus, frange.range, syntax.kind())
262 frange.file_id,
263 name,
264 focus,
265 frange.range,
266 syntax.kind(),
267 None,
268 None,
269 )
270 } 268 }
271} 269}
272 270
273impl ToNav for hir::ImplDef { 271impl ToNav for hir::ImplDef {
274 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 272 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
275 let src = self.source(db); 273 let src = self.source(db);
276 let frange = if let Some(item) = self.is_builtin_derive(db) { 274 let derive_attr = self.is_builtin_derive(db);
275 let frange = if let Some(item) = &derive_attr {
277 original_range(db, item.syntax()) 276 original_range(db, item.syntax())
278 } else { 277 } else {
279 original_range(db, src.as_ref().map(|it| it.syntax())) 278 original_range(db, src.as_ref().map(|it| it.syntax()))
280 }; 279 };
280 let focus_range = if derive_attr.is_some() {
281 None
282 } else {
283 src.value.target_type().map(|ty| original_range(db, src.with_value(ty.syntax())).range)
284 };
281 285
282 NavigationTarget::from_syntax( 286 NavigationTarget::from_syntax(
283 frange.file_id, 287 frange.file_id,
284 "impl".into(), 288 "impl".into(),
285 None, 289 focus_range,
286 frange.range, 290 frange.range,
287 src.value.syntax().kind(), 291 src.value.syntax().kind(),
288 None,
289 None,
290 ) 292 )
291 } 293 }
292} 294}
@@ -296,12 +298,12 @@ impl ToNav for hir::Field {
296 let src = self.source(db); 298 let src = self.source(db);
297 299
298 match &src.value { 300 match &src.value {
299 FieldSource::Named(it) => NavigationTarget::from_named( 301 FieldSource::Named(it) => {
300 db, 302 let mut res = NavigationTarget::from_named(db, src.with_value(it));
301 src.with_value(it), 303 res.docs = it.doc_comment_text();
302 it.doc_comment_text(), 304 res.description = it.short_label();
303 it.short_label(), 305 res
304 ), 306 }
305 FieldSource::Pos(it) => { 307 FieldSource::Pos(it) => {
306 let frange = original_range(db, src.with_value(it.syntax())); 308 let frange = original_range(db, src.with_value(it.syntax()));
307 NavigationTarget::from_syntax( 309 NavigationTarget::from_syntax(
@@ -310,8 +312,6 @@ impl ToNav for hir::Field {
310 None, 312 None,
311 frange.range, 313 frange.range,
312 it.syntax().kind(), 314 it.syntax().kind(),
313 None,
314 None,
315 ) 315 )
316 } 316 }
317 } 317 }
@@ -322,12 +322,10 @@ impl ToNav for hir::MacroDef {
322 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { 322 fn to_nav(&self, db: &RootDatabase) -> NavigationTarget {
323 let src = self.source(db); 323 let src = self.source(db);
324 log::debug!("nav target {:#?}", src.value.syntax()); 324 log::debug!("nav target {:#?}", src.value.syntax());
325 NavigationTarget::from_named( 325 let mut res =
326 db, 326 NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner));
327 src.as_ref().map(|it| it as &dyn ast::NameOwner), 327 res.docs = src.value.doc_comment_text();
328 src.value.doc_comment_text(), 328 res
329 None,
330 )
331 } 329 }
332} 330}
333 331
diff --git a/crates/ra_ide/src/display/structure.rs b/crates/ra_ide/src/display/structure.rs
index aad5a8e4d..1f6a3febf 100644
--- a/crates/ra_ide/src/display/structure.rs
+++ b/crates/ra_ide/src/display/structure.rs
@@ -127,6 +127,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
127 decl_with_detail(it, Some(detail)) 127 decl_with_detail(it, Some(detail))
128 }, 128 },
129 ast::StructDef(it) => decl(it), 129 ast::StructDef(it) => decl(it),
130 ast::UnionDef(it) => decl(it),
130 ast::EnumDef(it) => decl(it), 131 ast::EnumDef(it) => decl(it),
131 ast::EnumVariant(it) => decl(it), 132 ast::EnumVariant(it) => decl(it),
132 ast::TraitDef(it) => decl(it), 133 ast::TraitDef(it) => decl(it),
@@ -173,12 +174,19 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
173 174
174#[cfg(test)] 175#[cfg(test)]
175mod tests { 176mod tests {
177 use expect::{expect, Expect};
178
176 use super::*; 179 use super::*;
177 use insta::assert_debug_snapshot; 180
181 fn check(ra_fixture: &str, expect: Expect) {
182 let file = SourceFile::parse(ra_fixture).ok().unwrap();
183 let structure = file_structure(&file);
184 expect.assert_debug_eq(&structure)
185 }
178 186
179 #[test] 187 #[test]
180 fn test_file_structure() { 188 fn test_file_structure() {
181 let file = SourceFile::parse( 189 check(
182 r#" 190 r#"
183struct Foo { 191struct Foo {
184 x: i32 192 x: i32
@@ -223,216 +231,211 @@ fn obsolete() {}
223#[deprecated(note = "for awhile")] 231#[deprecated(note = "for awhile")]
224fn very_obsolete() {} 232fn very_obsolete() {}
225"#, 233"#,
226 ) 234 expect![[r#"
227 .ok() 235 [
228 .unwrap(); 236 StructureNode {
229 let structure = file_structure(&file); 237 parent: None,
230 assert_debug_snapshot!(structure, 238 label: "Foo",
231 @r###" 239 navigation_range: 8..11,
232 [ 240 node_range: 1..26,
233 StructureNode { 241 kind: STRUCT_DEF,
234 parent: None, 242 detail: None,
235 label: "Foo", 243 deprecated: false,
236 navigation_range: 8..11, 244 },
237 node_range: 1..26, 245 StructureNode {
238 kind: STRUCT_DEF, 246 parent: Some(
239 detail: None, 247 0,
240 deprecated: false, 248 ),
241 }, 249 label: "x",
242 StructureNode { 250 navigation_range: 18..19,
243 parent: Some( 251 node_range: 18..24,
244 0, 252 kind: RECORD_FIELD_DEF,
245 ), 253 detail: Some(
246 label: "x", 254 "i32",
247 navigation_range: 18..19, 255 ),
248 node_range: 18..24, 256 deprecated: false,
249 kind: RECORD_FIELD_DEF, 257 },
250 detail: Some( 258 StructureNode {
251 "i32", 259 parent: None,
252 ), 260 label: "m",
253 deprecated: false, 261 navigation_range: 32..33,
254 }, 262 node_range: 28..158,
255 StructureNode { 263 kind: MODULE,
256 parent: None, 264 detail: None,
257 label: "m", 265 deprecated: false,
258 navigation_range: 32..33, 266 },
259 node_range: 28..158, 267 StructureNode {
260 kind: MODULE, 268 parent: Some(
261 detail: None, 269 2,
262 deprecated: false, 270 ),
263 }, 271 label: "bar1",
264 StructureNode { 272 navigation_range: 43..47,
265 parent: Some( 273 node_range: 40..52,
266 2, 274 kind: FN_DEF,
267 ), 275 detail: Some(
268 label: "bar1", 276 "fn()",
269 navigation_range: 43..47, 277 ),
270 node_range: 40..52, 278 deprecated: false,
271 kind: FN_DEF, 279 },
272 detail: Some( 280 StructureNode {
273 "fn()", 281 parent: Some(
274 ), 282 2,
275 deprecated: false, 283 ),
276 }, 284 label: "bar2",
277 StructureNode { 285 navigation_range: 60..64,
278 parent: Some( 286 node_range: 57..81,
279 2, 287 kind: FN_DEF,
280 ), 288 detail: Some(
281 label: "bar2", 289 "fn<T>(t: T) -> T",
282 navigation_range: 60..64, 290 ),
283 node_range: 57..81, 291 deprecated: false,
284 kind: FN_DEF, 292 },
285 detail: Some( 293 StructureNode {
286 "fn<T>(t: T) -> T", 294 parent: Some(
287 ), 295 2,
288 deprecated: false, 296 ),
289 }, 297 label: "bar3",
290 StructureNode { 298 navigation_range: 89..93,
291 parent: Some( 299 node_range: 86..156,
292 2, 300 kind: FN_DEF,
293 ), 301 detail: Some(
294 label: "bar3", 302 "fn<A, B>(a: A, b: B) -> Vec< u32 >",
295 navigation_range: 89..93, 303 ),
296 node_range: 86..156, 304 deprecated: false,
297 kind: FN_DEF, 305 },
298 detail: Some( 306 StructureNode {
299 "fn<A, B>(a: A, b: B) -> Vec< u32 >", 307 parent: None,
300 ), 308 label: "E",
301 deprecated: false, 309 navigation_range: 165..166,
302 }, 310 node_range: 160..180,
303 StructureNode { 311 kind: ENUM_DEF,
304 parent: None, 312 detail: None,
305 label: "E", 313 deprecated: false,
306 navigation_range: 165..166, 314 },
307 node_range: 160..180, 315 StructureNode {
308 kind: ENUM_DEF, 316 parent: Some(
309 detail: None, 317 6,
310 deprecated: false, 318 ),
311 }, 319 label: "X",
312 StructureNode { 320 navigation_range: 169..170,
313 parent: Some( 321 node_range: 169..170,
314 6, 322 kind: ENUM_VARIANT,
315 ), 323 detail: None,
316 label: "X", 324 deprecated: false,
317 navigation_range: 169..170, 325 },
318 node_range: 169..170, 326 StructureNode {
319 kind: ENUM_VARIANT, 327 parent: Some(
320 detail: None, 328 6,
321 deprecated: false, 329 ),
322 }, 330 label: "Y",
323 StructureNode { 331 navigation_range: 172..173,
324 parent: Some( 332 node_range: 172..178,
325 6, 333 kind: ENUM_VARIANT,
326 ), 334 detail: None,
327 label: "Y", 335 deprecated: false,
328 navigation_range: 172..173, 336 },
329 node_range: 172..178, 337 StructureNode {
330 kind: ENUM_VARIANT, 338 parent: None,
331 detail: None, 339 label: "T",
332 deprecated: false, 340 navigation_range: 186..187,
333 }, 341 node_range: 181..193,
334 StructureNode { 342 kind: TYPE_ALIAS_DEF,
335 parent: None, 343 detail: Some(
336 label: "T", 344 "()",
337 navigation_range: 186..187, 345 ),
338 node_range: 181..193, 346 deprecated: false,
339 kind: TYPE_ALIAS_DEF, 347 },
340 detail: Some( 348 StructureNode {
341 "()", 349 parent: None,
342 ), 350 label: "S",
343 deprecated: false, 351 navigation_range: 201..202,
344 }, 352 node_range: 194..213,
345 StructureNode { 353 kind: STATIC_DEF,
346 parent: None, 354 detail: Some(
347 label: "S", 355 "i32",
348 navigation_range: 201..202, 356 ),
349 node_range: 194..213, 357 deprecated: false,
350 kind: STATIC_DEF, 358 },
351 detail: Some( 359 StructureNode {
352 "i32", 360 parent: None,
353 ), 361 label: "C",
354 deprecated: false, 362 navigation_range: 220..221,
355 }, 363 node_range: 214..232,
356 StructureNode { 364 kind: CONST_DEF,
357 parent: None, 365 detail: Some(
358 label: "C", 366 "i32",
359 navigation_range: 220..221, 367 ),
360 node_range: 214..232, 368 deprecated: false,
361 kind: CONST_DEF, 369 },
362 detail: Some( 370 StructureNode {
363 "i32", 371 parent: None,
364 ), 372 label: "impl E",
365 deprecated: false, 373 navigation_range: 239..240,
366 }, 374 node_range: 234..243,
367 StructureNode { 375 kind: IMPL_DEF,
368 parent: None, 376 detail: None,
369 label: "impl E", 377 deprecated: false,
370 navigation_range: 239..240, 378 },
371 node_range: 234..243, 379 StructureNode {
372 kind: IMPL_DEF, 380 parent: None,
373 detail: None, 381 label: "impl fmt::Debug for E",
374 deprecated: false, 382 navigation_range: 265..266,
375 }, 383 node_range: 245..269,
376 StructureNode { 384 kind: IMPL_DEF,
377 parent: None, 385 detail: None,
378 label: "impl fmt::Debug for E", 386 deprecated: false,
379 navigation_range: 265..266, 387 },
380 node_range: 245..269, 388 StructureNode {
381 kind: IMPL_DEF, 389 parent: None,
382 detail: None, 390 label: "mc",
383 deprecated: false, 391 navigation_range: 284..286,
384 }, 392 node_range: 271..303,
385 StructureNode { 393 kind: MACRO_CALL,
386 parent: None, 394 detail: None,
387 label: "mc", 395 deprecated: false,
388 navigation_range: 284..286, 396 },
389 node_range: 271..303, 397 StructureNode {
390 kind: MACRO_CALL, 398 parent: None,
391 detail: None, 399 label: "mcexp",
392 deprecated: false, 400 navigation_range: 334..339,
393 }, 401 node_range: 305..356,
394 StructureNode { 402 kind: MACRO_CALL,
395 parent: None, 403 detail: None,
396 label: "mcexp", 404 deprecated: false,
397 navigation_range: 334..339, 405 },
398 node_range: 305..356, 406 StructureNode {
399 kind: MACRO_CALL, 407 parent: None,
400 detail: None, 408 label: "mcexp",
401 deprecated: false, 409 navigation_range: 387..392,
402 }, 410 node_range: 358..409,
403 StructureNode { 411 kind: MACRO_CALL,
404 parent: None, 412 detail: None,
405 label: "mcexp", 413 deprecated: false,
406 navigation_range: 387..392, 414 },
407 node_range: 358..409, 415 StructureNode {
408 kind: MACRO_CALL, 416 parent: None,
409 detail: None, 417 label: "obsolete",
410 deprecated: false, 418 navigation_range: 428..436,
411 }, 419 node_range: 411..441,
412 StructureNode { 420 kind: FN_DEF,
413 parent: None, 421 detail: Some(
414 label: "obsolete", 422 "fn()",
415 navigation_range: 428..436, 423 ),
416 node_range: 411..441, 424 deprecated: true,
417 kind: FN_DEF, 425 },
418 detail: Some( 426 StructureNode {
419 "fn()", 427 parent: None,
420 ), 428 label: "very_obsolete",
421 deprecated: true, 429 navigation_range: 481..494,
422 }, 430 node_range: 443..499,
423 StructureNode { 431 kind: FN_DEF,
424 parent: None, 432 detail: Some(
425 label: "very_obsolete", 433 "fn()",
426 navigation_range: 481..494, 434 ),
427 node_range: 443..499, 435 deprecated: true,
428 kind: FN_DEF, 436 },
429 detail: Some( 437 ]
430 "fn()", 438 "#]],
431 ), 439 );
432 deprecated: true,
433 },
434 ]
435 "###
436 );
437 } 440 }
438} 441}