aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/display/structure.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/display/structure.rs')
-rw-r--r--crates/ra_ide/src/display/structure.rs429
1 files changed, 216 insertions, 213 deletions
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}