@@ -179,3 +179,83 @@ fn get_definition(sema: &Semantics<RootDatabase>, token: SyntaxToken) -> Option<
179
179
}
180
180
None
181
181
}
182
+
183
+ #[ cfg( test) ]
184
+ mod tests {
185
+ use crate :: { fixture, StaticIndex } ;
186
+ use ide_db:: base_db:: FileRange ;
187
+ use std:: collections:: HashSet ;
188
+
189
+ fn check_all_ranges ( ra_fixture : & str ) {
190
+ let ( analysis, ranges) = fixture:: annotations_without_marker ( ra_fixture) ;
191
+ let s = StaticIndex :: compute ( & * analysis. db , & analysis) . unwrap ( ) ;
192
+ let mut range_set: HashSet < _ > = ranges. iter ( ) . map ( |x| x. 0 ) . collect ( ) ;
193
+ for f in s. files {
194
+ for ( range, _) in f. tokens {
195
+ let x = FileRange { file_id : f. file_id , range } ;
196
+ if !range_set. contains ( & x) {
197
+ panic ! ( "additional range {:?}" , x) ;
198
+ }
199
+ range_set. remove ( & x) ;
200
+ }
201
+ }
202
+ if !range_set. is_empty ( ) {
203
+ panic ! ( "unfound ranges {:?}" , range_set) ;
204
+ }
205
+ }
206
+
207
+ fn check_definitions ( ra_fixture : & str ) {
208
+ let ( analysis, ranges) = fixture:: annotations_without_marker ( ra_fixture) ;
209
+ let s = StaticIndex :: compute ( & * analysis. db , & analysis) . unwrap ( ) ;
210
+ let mut range_set: HashSet < _ > = ranges. iter ( ) . map ( |x| x. 0 ) . collect ( ) ;
211
+ for ( _, t) in s. tokens . iter ( ) {
212
+ if let Some ( x) = t. definition {
213
+ if !range_set. contains ( & x) {
214
+ panic ! ( "additional definition {:?}" , x) ;
215
+ }
216
+ range_set. remove ( & x) ;
217
+ }
218
+ }
219
+ if !range_set. is_empty ( ) {
220
+ panic ! ( "unfound definitions {:?}" , range_set) ;
221
+ }
222
+ }
223
+
224
+ #[ test]
225
+ fn struct_and_enum ( ) {
226
+ check_all_ranges (
227
+ r#"
228
+ struct Foo;
229
+ //^^^
230
+ enum E { X(Foo) }
231
+ //^ ^ ^^^
232
+ "# ,
233
+ ) ;
234
+ check_definitions (
235
+ r#"
236
+ struct Foo;
237
+ //^^^
238
+ enum E { X(Foo) }
239
+ //^ ^
240
+ "# ,
241
+ ) ;
242
+ }
243
+
244
+ #[ test]
245
+ fn derives ( ) {
246
+ check_all_ranges (
247
+ r#"
248
+ #[rustc_builtin_macro]
249
+ pub macro Copy {}
250
+ //^^^^
251
+ #[rustc_builtin_macro]
252
+ pub macro derive {}
253
+ //^^^^^^
254
+ #[derive(Copy)]
255
+ //^^^^^^ ^^^^
256
+ struct Hello(i32);
257
+ //^^^^^ ^^^
258
+ "# ,
259
+ ) ;
260
+ }
261
+ }
0 commit comments