diff options
-rw-r--r-- | crates/ra_ide/src/goto_type_definition.rs | 113 |
1 files changed, 53 insertions, 60 deletions
diff --git a/crates/ra_ide/src/goto_type_definition.rs b/crates/ra_ide/src/goto_type_definition.rs index d9cf975d4..723c3e8ae 100644 --- a/crates/ra_ide/src/goto_type_definition.rs +++ b/crates/ra_ide/src/goto_type_definition.rs | |||
@@ -54,105 +54,98 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> { | |||
54 | 54 | ||
55 | #[cfg(test)] | 55 | #[cfg(test)] |
56 | mod tests { | 56 | mod tests { |
57 | use crate::mock_analysis::analysis_and_position; | 57 | use ra_db::FileRange; |
58 | 58 | ||
59 | fn check_goto(ra_fixture: &str, expected: &str) { | 59 | use crate::mock_analysis::MockAnalysis; |
60 | let (analysis, pos) = analysis_and_position(ra_fixture); | ||
61 | 60 | ||
62 | let mut navs = analysis.goto_type_definition(pos).unwrap().unwrap().info; | 61 | fn check(ra_fixture: &str) { |
62 | let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture); | ||
63 | let (expected, data) = mock.annotation(); | ||
64 | assert!(data.is_empty()); | ||
65 | let analysis = mock.analysis(); | ||
66 | |||
67 | let mut navs = analysis.goto_type_definition(position).unwrap().unwrap().info; | ||
63 | assert_eq!(navs.len(), 1); | 68 | assert_eq!(navs.len(), 1); |
64 | let nav = navs.pop().unwrap(); | 69 | let nav = navs.pop().unwrap(); |
65 | nav.assert_match(expected); | 70 | assert_eq!(expected, FileRange { file_id: nav.file_id(), range: nav.range() }); |
66 | } | 71 | } |
67 | 72 | ||
68 | #[test] | 73 | #[test] |
69 | fn goto_type_definition_works_simple() { | 74 | fn goto_type_definition_works_simple() { |
70 | check_goto( | 75 | check( |
71 | r" | 76 | r#" |
72 | //- /lib.rs | 77 | struct Foo; |
73 | struct Foo; | 78 | //^^^ |
74 | fn foo() { | 79 | fn foo() { |
75 | let f: Foo; | 80 | let f: Foo; f<|> |
76 | f<|> | 81 | } |
77 | } | 82 | "#, |
78 | ", | ||
79 | "Foo STRUCT_DEF FileId(1) 0..11 7..10", | ||
80 | ); | 83 | ); |
81 | } | 84 | } |
82 | 85 | ||
83 | #[test] | 86 | #[test] |
84 | fn goto_type_definition_works_simple_ref() { | 87 | fn goto_type_definition_works_simple_ref() { |
85 | check_goto( | 88 | check( |
86 | r" | 89 | r#" |
87 | //- /lib.rs | 90 | struct Foo; |
88 | struct Foo; | 91 | //^^^ |
89 | fn foo() { | 92 | fn foo() { |
90 | let f: &Foo; | 93 | let f: &Foo; f<|> |
91 | f<|> | 94 | } |
92 | } | 95 | "#, |
93 | ", | ||
94 | "Foo STRUCT_DEF FileId(1) 0..11 7..10", | ||
95 | ); | 96 | ); |
96 | } | 97 | } |
97 | 98 | ||
98 | #[test] | 99 | #[test] |
99 | fn goto_type_definition_works_through_macro() { | 100 | fn goto_type_definition_works_through_macro() { |
100 | check_goto( | 101 | check( |
101 | r" | 102 | r#" |
102 | //- /lib.rs | 103 | macro_rules! id { ($($tt:tt)*) => { $($tt)* } } |
103 | macro_rules! id { | 104 | struct Foo {} |
104 | ($($tt:tt)*) => { $($tt)* } | 105 | //^^^ |
105 | } | 106 | id! { |
106 | struct Foo {} | 107 | fn bar() { let f<|> = Foo {}; } |
107 | id! { | 108 | } |
108 | fn bar() { | 109 | "#, |
109 | let f<|> = Foo {}; | ||
110 | } | ||
111 | } | ||
112 | ", | ||
113 | "Foo STRUCT_DEF FileId(1) 52..65 59..62", | ||
114 | ); | 110 | ); |
115 | } | 111 | } |
116 | 112 | ||
117 | #[test] | 113 | #[test] |
118 | fn goto_type_definition_for_param() { | 114 | fn goto_type_definition_for_param() { |
119 | check_goto( | 115 | check( |
120 | r" | 116 | r#" |
121 | //- /lib.rs | 117 | struct Foo; |
122 | struct Foo; | 118 | //^^^ |
123 | fn foo(<|>f: Foo) {} | 119 | fn foo(<|>f: Foo) {} |
124 | ", | 120 | "#, |
125 | "Foo STRUCT_DEF FileId(1) 0..11 7..10", | ||
126 | ); | 121 | ); |
127 | } | 122 | } |
128 | 123 | ||
129 | #[test] | 124 | #[test] |
130 | fn goto_type_definition_for_tuple_field() { | 125 | fn goto_type_definition_for_tuple_field() { |
131 | check_goto( | 126 | check( |
132 | r" | 127 | r#" |
133 | //- /lib.rs | 128 | struct Foo; |
134 | struct Foo; | 129 | //^^^ |
135 | struct Bar(Foo); | 130 | struct Bar(Foo); |
136 | fn foo() { | 131 | fn foo() { |
137 | let bar = Bar(Foo); | 132 | let bar = Bar(Foo); |
138 | bar.<|>0; | 133 | bar.<|>0; |
139 | } | 134 | } |
140 | ", | 135 | "#, |
141 | "Foo STRUCT_DEF FileId(1) 0..11 7..10", | ||
142 | ); | 136 | ); |
143 | } | 137 | } |
144 | 138 | ||
145 | #[test] | 139 | #[test] |
146 | fn goto_def_for_self_param() { | 140 | fn goto_def_for_self_param() { |
147 | check_goto( | 141 | check( |
148 | r#" | 142 | r#" |
149 | struct Foo; | 143 | struct Foo; |
144 | //^^^ | ||
150 | impl Foo { | 145 | impl Foo { |
151 | //^^^ | ||
152 | fn f(&self<|>) {} | 146 | fn f(&self<|>) {} |
153 | } | 147 | } |
154 | "#, | 148 | "#, |
155 | "Foo STRUCT_DEF FileId(1) 0..11 7..10", | ||
156 | ) | 149 | ) |
157 | } | 150 | } |
158 | } | 151 | } |