diff options
Diffstat (limited to 'crates/ra_ide/src/display/structure.rs')
-rw-r--r-- | crates/ra_ide/src/display/structure.rs | 429 |
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)] |
175 | mod tests { | 176 | mod 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#" |
183 | struct Foo { | 191 | struct Foo { |
184 | x: i32 | 192 | x: i32 |
@@ -223,216 +231,211 @@ fn obsolete() {} | |||
223 | #[deprecated(note = "for awhile")] | 231 | #[deprecated(note = "for awhile")] |
224 | fn very_obsolete() {} | 232 | fn 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 | } |