@@ -18,6 +18,18 @@ void main() {
18
18
19
19
@reflectiveTest
20
20
class ImportTest extends AbstractLspAnalysisServerTest {
21
+ /// A helper for creating files for multi-level-parts tests.
22
+ ({Uri uri, String filePath, TestCode code}) createFile (
23
+ String filename,
24
+ String content,
25
+ ) {
26
+ assert (filename.endsWith ('.dart' ));
27
+ var filePath = join (projectFolderPath, 'lib' , filename);
28
+ var code = TestCode .parse (content);
29
+ newFile (filePath, code.code);
30
+ return (uri: toUri (filePath), filePath: filePath, code: code);
31
+ }
32
+
21
33
Future <void > test_constant () async {
22
34
await _verifyGoToImports (
23
35
TestCode .parse ('''
@@ -180,6 +192,131 @@ a.A^? r;
180
192
);
181
193
}
182
194
195
+ Future <void > test_import_multiLevelParts () async {
196
+ // Create a tree of files that all import 'dart:math' and ensure we find
197
+ // only the import from the parent (not a grandparent, sibling, or child).
198
+ //
199
+ //
200
+ // - root has import
201
+ // - level1_other has import
202
+ // - level1 has import, is the used reference
203
+ // - level2_other has import
204
+ // - level2 has reference
205
+ // - level3_other has import
206
+
207
+ createFile ('root.dart' , '''
208
+ import 'dart:math';
209
+ part 'level1_other.dart';
210
+ part 'level1.dart';
211
+ ''' );
212
+
213
+ createFile ('level1_other.dart' , '''
214
+ part of 'root.dart';
215
+ import 'dart:math';
216
+ ''' );
217
+
218
+ var level1 = createFile ('level1.dart' , '''
219
+ part of 'root.dart';
220
+ [!import 'dart:math';!]
221
+ part 'level2_other.dart';
222
+ part 'level2.dart';
223
+ ''' );
224
+
225
+ createFile ('level2_other.dart' , '''
226
+ part of 'level1.dart';
227
+ import 'dart:math';
228
+ ''' );
229
+
230
+ var level2 = createFile ('level2.dart' , '''
231
+ part of 'level1.dart';
232
+ part 'level3_other.dart';
233
+
234
+ Rando^m? r;
235
+ ''' );
236
+
237
+ createFile ('level3_other.dart' , '''
238
+ part of 'level2.dart';
239
+ import 'dart:math';
240
+ ''' );
241
+
242
+ await _verifyGoToImports (
243
+ // Test the position in level2.
244
+ level2.code,
245
+ fileUri: level2.uri,
246
+ // Expect only the nearest parent import (level1).
247
+ expecting: (level1.uri, level1.code.ranges),
248
+ );
249
+ }
250
+
251
+ Future <void > test_import_multiLevelParts_findsInGrandParent () async {
252
+ var root = createFile ('root.dart' , '''
253
+ [!import 'dart:math';!]
254
+ part 'level1.dart';
255
+ ''' );
256
+
257
+ createFile ('level1.dart' , '''
258
+ part of 'root.dart';
259
+ part 'level2.dart';
260
+ ''' );
261
+
262
+ var level2 = createFile ('level2.dart' , '''
263
+ part of 'level1.dart';
264
+ Rando^m? r;''' );
265
+
266
+ await _verifyGoToImports (
267
+ // Test the position in level2, expect reference in root.
268
+ level2.code,
269
+ fileUri: level2.uri,
270
+ expecting: (root.uri, root.code.ranges),
271
+ );
272
+ }
273
+
274
+ Future <void > test_import_multiLevelParts_findsInParent () async {
275
+ createFile ('root.dart' , '''
276
+ part 'level1.dart';
277
+ ''' );
278
+
279
+ var level1 = createFile ('level1.dart' , '''
280
+ part of 'root.dart';
281
+ [!import 'dart:math';!]
282
+ part 'level2.dart';
283
+ ''' );
284
+
285
+ var level2 = createFile ('level2.dart' , '''
286
+ part of 'level1.dart';
287
+ Rando^m? r;''' );
288
+
289
+ await _verifyGoToImports (
290
+ // Test the position in level2, expect reference in level1.
291
+ level2.code,
292
+ fileUri: level2.uri,
293
+ expecting: (level1.uri, level1.code.ranges),
294
+ );
295
+ }
296
+
297
+ Future <void > test_import_multiLevelParts_findsInSelf () async {
298
+ createFile ('root.dart' , '''
299
+ part 'level1.dart';
300
+ ''' );
301
+
302
+ createFile ('level1.dart' , '''
303
+ part of 'root.dart';
304
+ part 'level2.dart';
305
+ ''' );
306
+
307
+ var level2 = createFile ('level2.dart' , '''
308
+ part of 'level1.dart';
309
+ [!import 'dart:math';!]
310
+ Rando^m? r;''' );
311
+
312
+ await _verifyGoToImports (
313
+ // Test the position in level2, expect reference in same.
314
+ level2.code,
315
+ fileUri: level2.uri,
316
+ expecting: (level2.uri, level2.code.ranges),
317
+ );
318
+ }
319
+
183
320
Future <void > test_import_part () async {
184
321
var otherFileUri = Uri .file (join (projectFolderPath, 'lib' , 'other.dart' ));
185
322
var main = TestCode .parse ('''
@@ -195,7 +332,7 @@ part of '$mainFileUri';
195
332
Rando^m? r;
196
333
''' ),
197
334
fileUri: otherFileUri,
198
- expecting: [ _Results (mainFileUri, main.ranges)] ,
335
+ expecting: (mainFileUri, main.ranges),
199
336
);
200
337
}
201
338
@@ -277,38 +414,23 @@ var a = 1.abs().ba^r();
277
414
);
278
415
}
279
416
280
- void _expecting (List <Location >? res, List <_Results >? fileRanges) {
281
- List <Location >? expected;
282
- if (fileRanges != null && fileRanges.expand ((r) => r.ranges).isNotEmpty) {
283
- expected = [
284
- for (final _Results (: uri, : ranges) in fileRanges)
285
- for (final range in ranges) Location (uri: uri, range: range.range),
286
- ];
287
- }
288
-
289
- expect (res, equals (expected));
290
- }
291
-
292
417
Future <void > _verifyGoToImports (
293
418
TestCode code, {
294
419
Uri ? fileUri,
295
- List <_Results > ? expecting,
420
+ ( Uri , List <TestCodeRange >) ? expecting,
296
421
}) async {
422
+ expecting ?? = (fileUri ?? mainFileUri, code.ranges);
423
+ var (expectedUri, expectedRanges) = expecting;
424
+ var expectedLocations = [
425
+ for (var range in expectedRanges)
426
+ Location (uri: expectedUri, range: range.range),
427
+ ];
428
+
297
429
newFile (fromUri (fileUri ?? mainFileUri), code.code);
298
430
await initialize ();
299
431
await initialAnalysis;
300
432
var res = await getImports (fileUri ?? mainFileUri, code.position.position);
301
- List <_Results >? results;
302
- if (expecting == null && code.ranges.isNotEmpty) {
303
- results = [_Results (fileUri ?? mainFileUri, code.ranges)];
304
- }
305
- _expecting (res, expecting ?? results);
306
- }
307
- }
308
-
309
- extension type _Results ._((Uri uri, List <TestCodeRange > ranges) _r) {
310
- _Results (Uri uri, List <TestCodeRange > ranges) : _r = (uri, ranges);
311
433
312
- List < TestCodeRange > get ranges => _r.$2 ;
313
- Uri get uri => _r.$1;
434
+ expect (res ?? [], expectedLocations) ;
435
+ }
314
436
}
0 commit comments