diff options
Diffstat (limited to 'crates/ra_ide')
| -rw-r--r-- | crates/ra_ide/src/display/navigation_target.rs | 71 | ||||
| -rw-r--r-- | crates/ra_ide/src/lib.rs | 74 |
2 files changed, 71 insertions, 74 deletions
diff --git a/crates/ra_ide/src/display/navigation_target.rs b/crates/ra_ide/src/display/navigation_target.rs index 6dcb9415a..fd245705c 100644 --- a/crates/ra_ide/src/display/navigation_target.rs +++ b/crates/ra_ide/src/display/navigation_target.rs | |||
| @@ -418,3 +418,74 @@ pub(crate) fn description_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> | |||
| 418 | } | 418 | } |
| 419 | } | 419 | } |
| 420 | } | 420 | } |
| 421 | |||
| 422 | #[cfg(test)] | ||
| 423 | mod tests { | ||
| 424 | use expect::expect; | ||
| 425 | |||
| 426 | use crate::{mock_analysis::single_file, Query}; | ||
| 427 | |||
| 428 | #[test] | ||
| 429 | fn test_nav_for_symbol() { | ||
| 430 | let (analysis, _) = single_file( | ||
| 431 | r#" | ||
| 432 | enum FooInner { } | ||
| 433 | fn foo() { enum FooInner { } } | ||
| 434 | "#, | ||
| 435 | ); | ||
| 436 | |||
| 437 | let navs = analysis.symbol_search(Query::new("FooInner".to_string())).unwrap(); | ||
| 438 | expect![[r#" | ||
| 439 | [ | ||
| 440 | NavigationTarget { | ||
| 441 | file_id: FileId( | ||
| 442 | 1, | ||
| 443 | ), | ||
| 444 | full_range: 0..17, | ||
| 445 | focus_range: Some( | ||
| 446 | 5..13, | ||
| 447 | ), | ||
| 448 | name: "FooInner", | ||
| 449 | kind: ENUM_DEF, | ||
| 450 | container_name: None, | ||
| 451 | description: Some( | ||
| 452 | "enum FooInner", | ||
| 453 | ), | ||
| 454 | docs: None, | ||
| 455 | }, | ||
| 456 | NavigationTarget { | ||
| 457 | file_id: FileId( | ||
| 458 | 1, | ||
| 459 | ), | ||
| 460 | full_range: 29..46, | ||
| 461 | focus_range: Some( | ||
| 462 | 34..42, | ||
| 463 | ), | ||
| 464 | name: "FooInner", | ||
| 465 | kind: ENUM_DEF, | ||
| 466 | container_name: Some( | ||
| 467 | "foo", | ||
| 468 | ), | ||
| 469 | description: Some( | ||
| 470 | "enum FooInner", | ||
| 471 | ), | ||
| 472 | docs: None, | ||
| 473 | }, | ||
| 474 | ] | ||
| 475 | "#]] | ||
| 476 | .assert_debug_eq(&navs); | ||
| 477 | } | ||
| 478 | |||
| 479 | #[test] | ||
| 480 | fn test_world_symbols_are_case_sensitive() { | ||
| 481 | let (analysis, _) = single_file( | ||
| 482 | r#" | ||
| 483 | fn foo() {} | ||
| 484 | struct Foo; | ||
| 485 | "#, | ||
| 486 | ); | ||
| 487 | |||
| 488 | let navs = analysis.symbol_search(Query::new("foo".to_string())).unwrap(); | ||
| 489 | assert_eq!(navs.len(), 2) | ||
| 490 | } | ||
| 491 | } | ||
diff --git a/crates/ra_ide/src/lib.rs b/crates/ra_ide/src/lib.rs index 353f430ff..dc9192d42 100644 --- a/crates/ra_ide/src/lib.rs +++ b/crates/ra_ide/src/lib.rs | |||
| @@ -526,77 +526,3 @@ fn analysis_is_send() { | |||
| 526 | fn is_send<T: Send>() {} | 526 | fn is_send<T: Send>() {} |
| 527 | is_send::<Analysis>(); | 527 | is_send::<Analysis>(); |
| 528 | } | 528 | } |
| 529 | |||
| 530 | #[cfg(test)] | ||
| 531 | mod tests { | ||
| 532 | use crate::{display::NavigationTarget, mock_analysis::single_file, Query}; | ||
| 533 | use ra_syntax::{ | ||
| 534 | SmolStr, | ||
| 535 | SyntaxKind::{FN_DEF, STRUCT_DEF}, | ||
| 536 | }; | ||
| 537 | |||
| 538 | #[test] | ||
| 539 | fn test_world_symbols_with_no_container() { | ||
| 540 | let code = r#" | ||
| 541 | enum FooInner { } | ||
| 542 | "#; | ||
| 543 | |||
| 544 | let mut symbols = get_symbols_matching(code, "FooInner"); | ||
| 545 | |||
| 546 | let s = symbols.pop().unwrap(); | ||
| 547 | |||
| 548 | assert_eq!(s.name, "FooInner"); | ||
| 549 | assert!(s.container_name.is_none()); | ||
| 550 | } | ||
| 551 | |||
| 552 | #[test] | ||
| 553 | fn test_world_symbols_include_container_name() { | ||
| 554 | let code = r#" | ||
| 555 | fn foo() { | ||
| 556 | enum FooInner { } | ||
| 557 | } | ||
| 558 | "#; | ||
| 559 | |||
| 560 | let mut symbols = get_symbols_matching(code, "FooInner"); | ||
| 561 | |||
| 562 | let s = symbols.pop().unwrap(); | ||
| 563 | |||
| 564 | assert_eq!(s.name, "FooInner"); | ||
| 565 | assert_eq!(s.container_name, Some(SmolStr::new("foo"))); | ||
| 566 | |||
| 567 | let code = r#" | ||
| 568 | mod foo { | ||
| 569 | struct FooInner; | ||
| 570 | } | ||
| 571 | "#; | ||
| 572 | |||
| 573 | let mut symbols = get_symbols_matching(code, "FooInner"); | ||
| 574 | |||
| 575 | let s = symbols.pop().unwrap(); | ||
| 576 | |||
| 577 | assert_eq!(s.name, "FooInner"); | ||
| 578 | assert_eq!(s.container_name, Some(SmolStr::new("foo"))); | ||
| 579 | } | ||
| 580 | |||
| 581 | #[test] | ||
| 582 | fn test_world_symbols_are_case_sensitive() { | ||
| 583 | let code = r#" | ||
| 584 | fn foo() {} | ||
| 585 | |||
| 586 | struct Foo; | ||
| 587 | "#; | ||
| 588 | |||
| 589 | let symbols = get_symbols_matching(code, "Foo"); | ||
| 590 | |||
| 591 | let fn_match = symbols.iter().find(|s| s.name == "foo").map(|s| s.kind); | ||
| 592 | let struct_match = symbols.iter().find(|s| s.name == "Foo").map(|s| s.kind); | ||
| 593 | |||
| 594 | assert_eq!(fn_match, Some(FN_DEF)); | ||
| 595 | assert_eq!(struct_match, Some(STRUCT_DEF)); | ||
| 596 | } | ||
| 597 | |||
| 598 | fn get_symbols_matching(text: &str, query: &str) -> Vec<NavigationTarget> { | ||
| 599 | let (analysis, _) = single_file(text); | ||
| 600 | analysis.symbol_search(Query::new(query.into())).unwrap() | ||
| 601 | } | ||
| 602 | } | ||
