Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(66)

Side by Side Diff: pkg/analysis_server/test/services/completion/imported_computer_test.dart

Issue 811933007: insert parameters when completing imported functions and inherited methods (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: merge Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library test.services.completion.toplevel; 5 library test.services.completion.toplevel;
6 6
7 import 'package:analysis_server/src/protocol.dart'; 7 import 'package:analysis_server/src/protocol.dart';
8 import 'package:analysis_server/src/services/completion/completion_manager.dart' ; 8 import 'package:analysis_server/src/services/completion/completion_manager.dart' ;
9 import 'package:analysis_server/src/services/completion/dart_completion_cache.da rt'; 9 import 'package:analysis_server/src/services/completion/dart_completion_cache.da rt';
10 import 'package:analysis_server/src/services/completion/dart_completion_manager. dart'; 10 import 'package:analysis_server/src/services/completion/dart_completion_manager. dart';
11 import 'package:analysis_server/src/services/completion/imported_computer.dart'; 11 import 'package:analysis_server/src/services/completion/imported_computer.dart';
12 import 'package:analyzer/src/generated/ast.dart'; 12 import 'package:analyzer/src/generated/ast.dart';
13 import 'package:analyzer/src/generated/element.dart'; 13 import 'package:analyzer/src/generated/element.dart';
14 import 'package:analyzer/src/generated/engine.dart'; 14 import 'package:analyzer/src/generated/engine.dart';
15 import 'package:analyzer/src/generated/source.dart'; 15 import 'package:analyzer/src/generated/source.dart';
16 import 'package:unittest/unittest.dart'; 16 import 'package:unittest/unittest.dart';
17 17
18 import '../../abstract_context.dart'; 18 import '../../abstract_context.dart';
19 import '../../reflective_tests.dart'; 19 import '../../reflective_tests.dart';
20 import 'completion_test_util.dart'; 20 import 'completion_test_util.dart';
21 21
22 main() { 22 main() {
23 groupSep = ' | '; 23 groupSep = ' | ';
24 runReflectiveTests(ImportedComputerTest); 24 runReflectiveTests(ImportedComputerTest);
25 } 25 }
26 26
27 @ReflectiveTestCase() 27 @ReflectiveTestCase()
28 class ImportedComputerTest extends AbstractSelectorSuggestionTest { 28 class ImportedComputerTest extends AbstractSelectorSuggestionTest {
29 29
30 @override
31 CompletionSuggestion assertSuggestImportedField(String name, String type, [int relevance =
32 COMPLETION_RELEVANCE_DEFAULT]) {
33 return assertSuggestField(name, type, relevance: relevance);
34 }
35
36 void assertCached(String completion) { 30 void assertCached(String completion) {
37 DartCompletionCache cache = request.cache; 31 DartCompletionCache cache = request.cache;
38 if (!isCached(cache.importedTypeSuggestions, completion) && 32 if (!isCached(cache.importedTypeSuggestions, completion) &&
39 !isCached(cache.importedVoidReturnSuggestions, completion) && 33 !isCached(cache.importedVoidReturnSuggestions, completion) &&
40 !isCached(cache.libraryPrefixSuggestions, completion) && 34 !isCached(cache.libraryPrefixSuggestions, completion) &&
41 !isCached(cache.otherImportedSuggestions, completion)) { 35 !isCached(cache.otherImportedSuggestions, completion)) {
42 fail('expected $completion to be cached'); 36 fail('expected $completion to be cached');
43 } 37 }
44 } 38 }
45 39
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 void assertNotCached(String completion) { 98 void assertNotCached(String completion) {
105 DartCompletionCache cache = request.cache; 99 DartCompletionCache cache = request.cache;
106 if (isCached(cache.importedTypeSuggestions, completion) || 100 if (isCached(cache.importedTypeSuggestions, completion) ||
107 isCached(cache.importedVoidReturnSuggestions, completion) || 101 isCached(cache.importedVoidReturnSuggestions, completion) ||
108 isCached(cache.libraryPrefixSuggestions, completion) || 102 isCached(cache.libraryPrefixSuggestions, completion) ||
109 isCached(cache.otherImportedSuggestions, completion)) { 103 isCached(cache.otherImportedSuggestions, completion)) {
110 fail('expected $completion NOT to be cached'); 104 fail('expected $completion NOT to be cached');
111 } 105 }
112 } 106 }
113 107
108 @override
109 CompletionSuggestion assertSuggestImportedField(String name, String type,
110 [int relevance = COMPLETION_RELEVANCE_DEFAULT]) {
111 return assertSuggestField(name, type, relevance: relevance);
112 }
113
114 bool isCached(List<CompletionSuggestion> suggestions, String completion) => 114 bool isCached(List<CompletionSuggestion> suggestions, String completion) =>
115 suggestions.any((CompletionSuggestion s) => s.completion == completion); 115 suggestions.any((CompletionSuggestion s) => s.completion == completion);
116 116
117 @override 117 @override
118 void setUpComputer() { 118 void setUpComputer() {
119 computer = new ImportedComputer(shouldWaitForLowPrioritySuggestions: true); 119 computer = new ImportedComputer(shouldWaitForLowPrioritySuggestions: true);
120 } 120 }
121 121
122 @override 122 @override
123 test_ArgumentList() { 123 test_ArgumentList() {
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 (computer as ImportedComputer).shouldWaitForLowPrioritySuggestions = false; 199 (computer as ImportedComputer).shouldWaitForLowPrioritySuggestions = false;
200 computeFast(); 200 computeFast();
201 return computeFull((bool result) { 201 return computeFull((bool result) {
202 assertSuggestImportedClass('C'); 202 assertSuggestImportedClass('C');
203 // Assert computer does not wait for or include low priority results 203 // Assert computer does not wait for or include low priority results
204 // from non-imported libraries unless instructed to do so. 204 // from non-imported libraries unless instructed to do so.
205 assertNotSuggested('H'); 205 assertNotSuggested('H');
206 }); 206 });
207 } 207 }
208 208
209 test_function_parameters_mixed_required_and_named() {
210 addSource('/libA.dart', '''
211 void m(x, {int y}) {}
212 ''');
213 addTestSource('''
214 import '/libA.dart';
215 class B extends A {
216 main() {^}
217 }
218 ''');
219 return computeFull((bool result) {
220 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
221 expect(suggestion.parameterNames, hasLength(2));
222 expect(suggestion.parameterNames[0], 'x');
223 expect(suggestion.parameterTypes[0], 'dynamic');
224 expect(suggestion.parameterNames[1], 'y');
225 expect(suggestion.parameterTypes[1], 'int');
226 expect(suggestion.requiredParameterCount, 1);
227 expect(suggestion.hasNamedParameters, true);
228 });
229 }
230
231 test_function_parameters_mixed_required_and_positional() {
232 addSource('/libA.dart', '''
233 void m(x, [int y]) {}
234 ''');
235 addTestSource('''
236 import '/libA.dart';
237 class B extends A {
238 main() {^}
239 }
240 ''');
241 return computeFull((bool result) {
242 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
243 expect(suggestion.parameterNames, hasLength(2));
244 expect(suggestion.parameterNames[0], 'x');
245 expect(suggestion.parameterTypes[0], 'dynamic');
246 expect(suggestion.parameterNames[1], 'y');
247 expect(suggestion.parameterTypes[1], 'int');
248 expect(suggestion.requiredParameterCount, 1);
249 expect(suggestion.hasNamedParameters, false);
250 });
251 }
252
253 test_function_parameters_named() {
254 addSource('/libA.dart', '''
255 void m({x, int y}) {}
256 ''');
257 addTestSource('''
258 import '/libA.dart';
259 class B extends A {
260 main() {^}
261 }
262 ''');
263 return computeFull((bool result) {
264 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
265 expect(suggestion.parameterNames, hasLength(2));
266 expect(suggestion.parameterNames[0], 'x');
267 expect(suggestion.parameterTypes[0], 'dynamic');
268 expect(suggestion.parameterNames[1], 'y');
269 expect(suggestion.parameterTypes[1], 'int');
270 expect(suggestion.requiredParameterCount, 0);
271 expect(suggestion.hasNamedParameters, true);
272 });
273 }
274
275 test_function_parameters_none() {
276 addSource('/libA.dart', '''
277 void m() {}
278 ''');
279 addTestSource('''
280 import '/libA.dart';
281 class B extends A {
282 main() {^}
283 }
284 ''');
285 computeFast();
286 return computeFull((bool result) {
287 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
288 expect(suggestion.parameterNames, isEmpty);
289 expect(suggestion.parameterTypes, isEmpty);
290 expect(suggestion.requiredParameterCount, 0);
291 expect(suggestion.hasNamedParameters, false);
292 });
293 }
294
295 test_function_parameters_positional() {
296 addSource('/libA.dart', '''
297 void m([x, int y]) {}
298 ''');
299 addTestSource('''
300 import '/libA.dart';
301 class B extends A {
302 main() {^}
303 }
304 ''');
305 return computeFull((bool result) {
306 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
307 expect(suggestion.parameterNames, hasLength(2));
308 expect(suggestion.parameterNames[0], 'x');
309 expect(suggestion.parameterTypes[0], 'dynamic');
310 expect(suggestion.parameterNames[1], 'y');
311 expect(suggestion.parameterTypes[1], 'int');
312 expect(suggestion.requiredParameterCount, 0);
313 expect(suggestion.hasNamedParameters, false);
314 });
315 }
316
317 test_function_parameters_required() {
318 addSource('/libA.dart', '''
319 void m(x, int y) {}
320 ''');
321 addTestSource('''
322 import '/libA.dart';
323 class B extends A {
324 main() {^}
325 }
326 ''');
327 return computeFull((bool result) {
328 CompletionSuggestion suggestion = assertSuggestFunction('m', 'void');
329 expect(suggestion.parameterNames, hasLength(2));
330 expect(suggestion.parameterNames[0], 'x');
331 expect(suggestion.parameterTypes[0], 'dynamic');
332 expect(suggestion.parameterNames[1], 'y');
333 expect(suggestion.parameterTypes[1], 'int');
334 expect(suggestion.requiredParameterCount, 2);
335 expect(suggestion.hasNamedParameters, false);
336 });
337 }
338
339 test_method_parameters_mixed_required_and_named() {
340 addSource('/libA.dart', '''
341 class A {
342 void m(x, {int y}) {}
343 }
344 ''');
345 addTestSource('''
346 import '/libA.dart';
347 class B extends A {
348 main() {^}
349 }
350 ''');
351 return computeFull((bool result) {
352 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
353 expect(suggestion.parameterNames, hasLength(2));
354 expect(suggestion.parameterNames[0], 'x');
355 expect(suggestion.parameterTypes[0], 'dynamic');
356 expect(suggestion.parameterNames[1], 'y');
357 expect(suggestion.parameterTypes[1], 'int');
358 expect(suggestion.requiredParameterCount, 1);
359 expect(suggestion.hasNamedParameters, true);
360 });
361 }
362
363 test_method_parameters_mixed_required_and_positional() {
364 addSource('/libA.dart', '''
365 class A {
366 void m(x, [int y]) {}
367 }
368 ''');
369 addTestSource('''
370 import '/libA.dart';
371 class B extends A {
372 main() {^}
373 }
374 ''');
375 return computeFull((bool result) {
376 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
377 expect(suggestion.parameterNames, hasLength(2));
378 expect(suggestion.parameterNames[0], 'x');
379 expect(suggestion.parameterTypes[0], 'dynamic');
380 expect(suggestion.parameterNames[1], 'y');
381 expect(suggestion.parameterTypes[1], 'int');
382 expect(suggestion.requiredParameterCount, 1);
383 expect(suggestion.hasNamedParameters, false);
384 });
385 }
386
387 test_method_parameters_named() {
388 addSource('/libA.dart', '''
389 class A {
390 void m({x, int y}) {}
391 }
392 ''');
393 addTestSource('''
394 import '/libA.dart';
395 class B extends A {
396 main() {^}
397 }
398 ''');
399 return computeFull((bool result) {
400 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
401 expect(suggestion.parameterNames, hasLength(2));
402 expect(suggestion.parameterNames[0], 'x');
403 expect(suggestion.parameterTypes[0], 'dynamic');
404 expect(suggestion.parameterNames[1], 'y');
405 expect(suggestion.parameterTypes[1], 'int');
406 expect(suggestion.requiredParameterCount, 0);
407 expect(suggestion.hasNamedParameters, true);
408 });
409 }
410
411 test_method_parameters_none() {
412 addSource('/libA.dart', '''
413 class A {
414 void m() {}
415 }
416 ''');
417 addTestSource('''
418 import '/libA.dart';
419 class B extends A {
420 main() {^}
421 }
422 ''');
423 computeFast();
424 return computeFull((bool result) {
425 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
426 expect(suggestion.parameterNames, isEmpty);
427 expect(suggestion.parameterTypes, isEmpty);
428 expect(suggestion.requiredParameterCount, 0);
429 expect(suggestion.hasNamedParameters, false);
430 });
431 }
432
433 test_method_parameters_positional() {
434 addSource('/libA.dart', '''
435 class A {
436 void m([x, int y]) {}
437 }
438 ''');
439 addTestSource('''
440 import '/libA.dart';
441 class B extends A {
442 main() {^}
443 }
444 ''');
445 return computeFull((bool result) {
446 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
447 expect(suggestion.parameterNames, hasLength(2));
448 expect(suggestion.parameterNames[0], 'x');
449 expect(suggestion.parameterTypes[0], 'dynamic');
450 expect(suggestion.parameterNames[1], 'y');
451 expect(suggestion.parameterTypes[1], 'int');
452 expect(suggestion.requiredParameterCount, 0);
453 expect(suggestion.hasNamedParameters, false);
454 });
455 }
456
457 test_method_parameters_required() {
458 addSource('/libA.dart', '''
459 class A {
460 void m(x, int y) {}
461 }
462 ''');
463 addTestSource('''
464 import '/libA.dart';
465 class B extends A {
466 main() {^}
467 }
468 ''');
469 return computeFull((bool result) {
470 CompletionSuggestion suggestion = assertSuggestMethod('m', 'A', 'void');
471 expect(suggestion.parameterNames, hasLength(2));
472 expect(suggestion.parameterNames[0], 'x');
473 expect(suggestion.parameterTypes[0], 'dynamic');
474 expect(suggestion.parameterNames[1], 'y');
475 expect(suggestion.parameterTypes[1], 'int');
476 expect(suggestion.requiredParameterCount, 2);
477 expect(suggestion.hasNamedParameters, false);
478 });
479 }
480
209 /** 481 /**
210 * Ensure that completions in one context don't appear in another 482 * Ensure that completions in one context don't appear in another
211 */ 483 */
212 test_multiple_contexts() { 484 test_multiple_contexts() {
213 485
214 // Create a 2nd context with source 486 // Create a 2nd context with source
215 var context2 = AnalysisEngine.instance.createAnalysisContext(); 487 var context2 = AnalysisEngine.instance.createAnalysisContext();
216 context2.sourceFactory = 488 context2.sourceFactory =
217 new SourceFactory([AbstractContextTest.SDK_RESOLVER, resourceResolver]); 489 new SourceFactory([AbstractContextTest.SDK_RESOLVER, resourceResolver]);
218 String content2 = 'class ClassFromAnotherContext { }'; 490 String content2 = 'class ClassFromAnotherContext { }';
(...skipping 27 matching lines...) Expand all
246 main() {C^} 518 main() {C^}
247 '''); 519 ''');
248 computeFast(); 520 computeFast();
249 return computeFull((bool result) { 521 return computeFull((bool result) {
250 assertSuggestImportedClass('ClassInLocalContext'); 522 assertSuggestImportedClass('ClassInLocalContext');
251 // Assert computer does not include results from 2nd context. 523 // Assert computer does not include results from 2nd context.
252 assertNotSuggested('ClassFromAnotherContext'); 524 assertNotSuggested('ClassFromAnotherContext');
253 }); 525 });
254 } 526 }
255 527
528 test_no_parameters_field() {
529 addSource('/libA.dart', '''
530 class A {
531 int x;
532 }
533 ''');
534 addTestSource('''
535 import '/libA.dart';
536 class B extends A {
537 main() {^}
538 }
539 ''');
540 return computeFull((bool result) {
541 CompletionSuggestion suggestion = assertSuggestField('x', 'int');
542 assertHasNoParameterInfo(suggestion);
543 });
544 }
545
546 test_no_parameters_getter() {
547 addSource('/libA.dart', '''
548 class A {
549 int get x => null;
550 }
551 ''');
552 addTestSource('''
553 import '/libA.dart';
554 class B extends A {
555 main() {^}
556 }
557 ''');
558 return computeFull((bool result) {
559 CompletionSuggestion suggestion = assertSuggestGetter('x', 'int');
560 assertHasNoParameterInfo(suggestion);
561 });
562 }
563
564 test_no_parameters_setter() {
565 addSource('/libA.dart', '''
566 class A {
567 set x(int value) {};
568 }
569 ''');
570 addTestSource('''
571 import '/libA.dart';
572 class B extends A {
573 main() {^}
574 }
575 ''');
576 return computeFull((bool result) {
577 CompletionSuggestion suggestion = assertSuggestSetter('x');
578 assertHasNoParameterInfo(suggestion);
579 });
580 }
581
256 @override 582 @override
257 test_partFile_TypeName() { 583 test_partFile_TypeName() {
258 return super.test_partFile_TypeName().then((_) { 584 return super.test_partFile_TypeName().then((_) {
259 expect(request.cache.importKey, 'part of libA;'); 585 expect(request.cache.importKey, 'part of libA;');
260 }); 586 });
261 } 587 }
262 588
263 @override 589 @override
264 test_partFile_TypeName2() { 590 test_partFile_TypeName2() {
265 return super.test_partFile_TypeName2().then((_) { 591 return super.test_partFile_TypeName2().then((_) {
266 expect( 592 expect(
267 request.cache.importKey, 593 request.cache.importKey,
268 'library libA;import "/testB.dart";part "/testA.dart";'); 594 'library libA;import "/testB.dart";part "/testA.dart";');
269 }); 595 });
270 } 596 }
271 } 597 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698