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

Side by Side Diff: pkg/analyzer/test/src/dart/analysis/driver_test.dart

Issue 2665263002: Streamline AnalysisDriver status tracking. (Closed)
Patch Set: Created 3 years, 10 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 analyzer.test.driver; 5 library analyzer.test.driver;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 import 'dart:convert'; 8 import 'dart:convert';
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 provider.newFile(c, 'class C {}'); 105 provider.newFile(c, 'class C {}');
106 driver1.addFile(a); 106 driver1.addFile(a);
107 driver2.addFile(b); 107 driver2.addFile(b);
108 driver2.addFile(c); 108 driver2.addFile(c);
109 driver1.priorityFiles = [a]; 109 driver1.priorityFiles = [a];
110 driver2.priorityFiles = [a]; 110 driver2.priorityFiles = [a];
111 111
112 AnalysisResult result = await driver2.getResult(b); 112 AnalysisResult result = await driver2.getResult(b);
113 expect(result.path, b); 113 expect(result.path, b);
114 114
115 await driver1.status.firstWhere((status) => status.isIdle); 115 await scheduler.status.firstWhere((status) => status.isIdle);
116 await driver2.status.firstWhere((status) => status.isIdle);
117 116
118 expect(allResults, hasLength(3)); 117 expect(allResults, hasLength(3));
119 expect(allResults[0].path, b); 118 expect(allResults[0].path, b);
120 expect(allResults[1].path, a); 119 expect(allResults[1].path, a);
121 expect(allResults[2].path, c); 120 expect(allResults[2].path, c);
122 } 121 }
123 122
124 test_priorities_priorityBeforeGeneral1() async { 123 test_priorities_priorityBeforeGeneral1() async {
125 AnalysisDriver driver1 = newDriver(); 124 AnalysisDriver driver1 = newDriver();
126 AnalysisDriver driver2 = newDriver(); 125 AnalysisDriver driver2 = newDriver();
127 126
128 String a = _p('/a.dart'); 127 String a = _p('/a.dart');
129 String b = _p('/b.dart'); 128 String b = _p('/b.dart');
130 provider.newFile(a, 'class A {}'); 129 provider.newFile(a, 'class A {}');
131 provider.newFile(b, 'class B {}'); 130 provider.newFile(b, 'class B {}');
132 driver1.addFile(a); 131 driver1.addFile(a);
133 driver2.addFile(b); 132 driver2.addFile(b);
134 driver1.priorityFiles = [a]; 133 driver1.priorityFiles = [a];
135 driver2.priorityFiles = [a]; 134 driver2.priorityFiles = [a];
136 135
137 await driver1.status.firstWhere((status) => status.isIdle); 136 await scheduler.status.firstWhere((status) => status.isIdle);
138 await driver2.status.firstWhere((status) => status.isIdle);
139 137
140 expect(allResults, hasLength(2)); 138 expect(allResults, hasLength(2));
141 expect(allResults[0].path, a); 139 expect(allResults[0].path, a);
142 expect(allResults[1].path, b); 140 expect(allResults[1].path, b);
143 } 141 }
144 142
145 test_priorities_priorityBeforeGeneral2() async { 143 test_priorities_priorityBeforeGeneral2() async {
146 AnalysisDriver driver1 = newDriver(); 144 AnalysisDriver driver1 = newDriver();
147 AnalysisDriver driver2 = newDriver(); 145 AnalysisDriver driver2 = newDriver();
148 146
149 String a = _p('/a.dart'); 147 String a = _p('/a.dart');
150 String b = _p('/b.dart'); 148 String b = _p('/b.dart');
151 provider.newFile(a, 'class A {}'); 149 provider.newFile(a, 'class A {}');
152 provider.newFile(b, 'class B {}'); 150 provider.newFile(b, 'class B {}');
153 driver1.addFile(a); 151 driver1.addFile(a);
154 driver2.addFile(b); 152 driver2.addFile(b);
155 driver1.priorityFiles = [b]; 153 driver1.priorityFiles = [b];
156 driver2.priorityFiles = [b]; 154 driver2.priorityFiles = [b];
157 155
158 await driver1.status.firstWhere((status) => status.isIdle); 156 await scheduler.status.firstWhere((status) => status.isIdle);
159 await driver2.status.firstWhere((status) => status.isIdle);
160 157
161 expect(allResults, hasLength(2)); 158 expect(allResults, hasLength(2));
162 expect(allResults[0].path, b); 159 expect(allResults[0].path, b);
163 expect(allResults[1].path, a); 160 expect(allResults[1].path, a);
164 } 161 }
165 162
166 test_priorities_priorityBeforeGeneral3() async { 163 test_priorities_priorityBeforeGeneral3() async {
167 AnalysisDriver driver1 = newDriver(); 164 AnalysisDriver driver1 = newDriver();
168 AnalysisDriver driver2 = newDriver(); 165 AnalysisDriver driver2 = newDriver();
169 166
170 String a = _p('/a.dart'); 167 String a = _p('/a.dart');
171 String b = _p('/b.dart'); 168 String b = _p('/b.dart');
172 String c = _p('/c.dart'); 169 String c = _p('/c.dart');
173 provider.newFile(a, 'class A {}'); 170 provider.newFile(a, 'class A {}');
174 provider.newFile(b, 'class B {}'); 171 provider.newFile(b, 'class B {}');
175 provider.newFile(c, 'class C {}'); 172 provider.newFile(c, 'class C {}');
176 driver1.addFile(a); 173 driver1.addFile(a);
177 driver1.addFile(b); 174 driver1.addFile(b);
178 driver2.addFile(c); 175 driver2.addFile(c);
179 driver1.priorityFiles = [a, c]; 176 driver1.priorityFiles = [a, c];
180 driver2.priorityFiles = [a, c]; 177 driver2.priorityFiles = [a, c];
181 178
182 await driver1.status.firstWhere((status) => status.isIdle); 179 await scheduler.status.firstWhere((status) => status.isIdle);
183 await driver2.status.firstWhere((status) => status.isIdle);
184 180
185 expect(allResults, hasLength(3)); 181 expect(allResults, hasLength(3));
186 expect(allResults[0].path, a); 182 expect(allResults[0].path, a);
187 expect(allResults[1].path, c); 183 expect(allResults[1].path, c);
188 expect(allResults[2].path, b); 184 expect(allResults[2].path, b);
189 } 185 }
190 186
191 test_status() async { 187 test_status() async {
192 AnalysisDriver driver1 = newDriver(); 188 AnalysisDriver driver1 = newDriver();
193 AnalysisDriver driver2 = newDriver(); 189 AnalysisDriver driver2 = newDriver();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
284 driver.addFile(a); 280 driver.addFile(a);
285 driver.addFile(b); 281 driver.addFile(b);
286 282
287 void assertNumberOfErrorsInB(int n) { 283 void assertNumberOfErrorsInB(int n) {
288 var bResult = allResults.singleWhere((r) => r.path == b); 284 var bResult = allResults.singleWhere((r) => r.path == b);
289 expect(bResult.errors, hasLength(n)); 285 expect(bResult.errors, hasLength(n));
290 allResults.clear(); 286 allResults.clear();
291 } 287 }
292 288
293 // Initial analysis, 'b' does not use 'a', so there is a hint. 289 // Initial analysis, 'b' does not use 'a', so there is a hint.
294 await driver.waitForIdle(); 290 await scheduler.waitForIdle();
295 assertNumberOfErrorsInB(1); 291 assertNumberOfErrorsInB(1);
296 292
297 // Update 'b' to use 'a', no more hints. 293 // Update 'b' to use 'a', no more hints.
298 provider.newFile( 294 provider.newFile(
299 b, 295 b,
300 r''' 296 r'''
301 import 'a.dart'; 297 import 'a.dart';
302 main() { 298 main() {
303 print(A); 299 print(A);
304 } 300 }
305 '''); 301 ''');
306 driver.changeFile(b); 302 driver.changeFile(b);
307 await driver.waitForIdle(); 303 await scheduler.waitForIdle();
308 assertNumberOfErrorsInB(0); 304 assertNumberOfErrorsInB(0);
309 305
310 // Change 'b' content so that it has a hint. 306 // Change 'b' content so that it has a hint.
311 // Remove 'b' and add it again. 307 // Remove 'b' and add it again.
312 // The file 'b' must be refreshed, and the hint must be reported. 308 // The file 'b' must be refreshed, and the hint must be reported.
313 provider.newFile( 309 provider.newFile(
314 b, 310 b,
315 r''' 311 r'''
316 import 'a.dart'; 312 import 'a.dart';
317 '''); 313 ''');
318 driver.removeFile(b); 314 driver.removeFile(b);
319 driver.addFile(b); 315 driver.addFile(b);
320 await driver.waitForIdle(); 316 await scheduler.waitForIdle();
321 assertNumberOfErrorsInB(1); 317 assertNumberOfErrorsInB(1);
322 } 318 }
323 319
324 test_addFile_thenRemove() async { 320 test_addFile_thenRemove() async {
325 var a = _p('/test/lib/a.dart'); 321 var a = _p('/test/lib/a.dart');
326 var b = _p('/test/lib/b.dart'); 322 var b = _p('/test/lib/b.dart');
327 provider.newFile(a, 'class A {}'); 323 provider.newFile(a, 'class A {}');
328 provider.newFile(b, 'class B {}'); 324 provider.newFile(b, 'class B {}');
329 driver.addFile(a); 325 driver.addFile(a);
330 driver.addFile(b); 326 driver.addFile(b);
331 327
332 // Now remove 'a'. 328 // Now remove 'a'.
333 driver.removeFile(a); 329 driver.removeFile(a);
334 330
335 await driver.waitForIdle(); 331 await scheduler.waitForIdle();
336 332
337 // Only 'b' has been analyzed, because 'a' was removed before we started. 333 // Only 'b' has been analyzed, because 'a' was removed before we started.
338 expect(allResults, hasLength(1)); 334 expect(allResults, hasLength(1));
339 expect(allResults[0].path, b); 335 expect(allResults[0].path, b);
340 } 336 }
341 337
342 test_cachedPriorityResults() async { 338 test_cachedPriorityResults() async {
343 var a = _p('/test/bin/a.dart'); 339 var a = _p('/test/bin/a.dart');
344 provider.newFile(a, 'var a = 1;'); 340 provider.newFile(a, 'var a = 1;');
345 341
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 r''' 430 r'''
435 import 'b.dart'; 431 import 'b.dart';
436 var A = B; 432 var A = B;
437 '''); 433 ''');
438 provider.newFile(b, 'var B = 1;'); 434 provider.newFile(b, 'var B = 1;');
439 435
440 driver.priorityFiles = [a]; 436 driver.priorityFiles = [a];
441 driver.addFile(a); 437 driver.addFile(a);
442 438
443 // We have a result only for "a". 439 // We have a result only for "a".
444 await driver.waitForIdle(); 440 await scheduler.waitForIdle();
445 expect(allResults, hasLength(1)); 441 expect(allResults, hasLength(1));
446 { 442 {
447 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 443 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
448 expect(_getTopLevelVarType(ar.unit, 'A'), 'int'); 444 expect(_getTopLevelVarType(ar.unit, 'A'), 'int');
449 } 445 }
450 allResults.clear(); 446 allResults.clear();
451 447
452 // Change "b" and notify. 448 // Change "b" and notify.
453 provider.updateFile(b, 'var B = 1.2;'); 449 provider.updateFile(b, 'var B = 1.2;');
454 driver.changeFile(b); 450 driver.changeFile(b);
455 451
456 // "b" is not an added file, so it is not scheduled for analysis. 452 // "b" is not an added file, so it is not scheduled for analysis.
457 expect(driver.test.filesToAnalyze, isEmpty); 453 expect(driver.test.filesToAnalyze, isEmpty);
458 454
459 // While "b" is not analyzed explicitly, it is analyzed implicitly. 455 // While "b" is not analyzed explicitly, it is analyzed implicitly.
460 // The change causes "a" to be reanalyzed. 456 // The change causes "a" to be reanalyzed.
461 await driver.waitForIdle(); 457 await scheduler.waitForIdle();
462 expect(allResults, hasLength(1)); 458 expect(allResults, hasLength(1));
463 { 459 {
464 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 460 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
465 expect(_getTopLevelVarType(ar.unit, 'A'), 'double'); 461 expect(_getTopLevelVarType(ar.unit, 'A'), 'double');
466 } 462 }
467 } 463 }
468 464
469 test_changeFile_notUsed() async { 465 test_changeFile_notUsed() async {
470 var a = _p('/test/lib/a.dart'); 466 var a = _p('/test/lib/a.dart');
471 var b = _p('/other/b.dart'); 467 var b = _p('/other/b.dart');
472 provider.newFile(a, ''); 468 provider.newFile(a, '');
473 provider.newFile(b, 'class B1 {}'); 469 provider.newFile(b, 'class B1 {}');
474 470
475 driver.addFile(a); 471 driver.addFile(a);
476 472
477 await driver.waitForIdle(); 473 await scheduler.waitForIdle();
478 allResults.clear(); 474 allResults.clear();
479 475
480 // Change "b" and notify. 476 // Change "b" and notify.
481 // Nothing depends on "b", so nothing is analyzed. 477 // Nothing depends on "b", so nothing is analyzed.
482 provider.updateFile(b, 'class B2 {}'); 478 provider.updateFile(b, 'class B2 {}');
483 driver.changeFile(b); 479 driver.changeFile(b);
484 await driver.waitForIdle(); 480 await scheduler.waitForIdle();
485 expect(allResults, isEmpty); 481 expect(allResults, isEmpty);
486 482
487 // This should not add "b" to the file state. 483 // This should not add "b" to the file state.
488 expect(driver.fsState.knownFilePaths, isNot(contains(b))); 484 expect(driver.fsState.knownFilePaths, isNot(contains(b)));
489 } 485 }
490 486
491 test_changeFile_selfConsistent() async { 487 test_changeFile_selfConsistent() async {
492 var a = _p('/test/lib/a.dart'); 488 var a = _p('/test/lib/a.dart');
493 var b = _p('/test/lib/b.dart'); 489 var b = _p('/test/lib/b.dart');
494 provider.newFile( 490 provider.newFile(
495 a, 491 a,
496 r''' 492 r'''
497 import 'b.dart'; 493 import 'b.dart';
498 var A1 = 1; 494 var A1 = 1;
499 var A2 = B1; 495 var A2 = B1;
500 '''); 496 ''');
501 provider.newFile( 497 provider.newFile(
502 b, 498 b,
503 r''' 499 r'''
504 import 'a.dart'; 500 import 'a.dart';
505 var B1 = A1; 501 var B1 = A1;
506 '''); 502 ''');
507 503
508 driver.priorityFiles = [a, b]; 504 driver.priorityFiles = [a, b];
509 driver.addFile(a); 505 driver.addFile(a);
510 driver.addFile(b); 506 driver.addFile(b);
511 await driver.waitForIdle(); 507 await scheduler.waitForIdle();
512 508
513 // We have results for both "a" and "b". 509 // We have results for both "a" and "b".
514 expect(allResults, hasLength(2)); 510 expect(allResults, hasLength(2));
515 { 511 {
516 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 512 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
517 expect(_getTopLevelVarType(ar.unit, 'A1'), 'int'); 513 expect(_getTopLevelVarType(ar.unit, 'A1'), 'int');
518 expect(_getTopLevelVarType(ar.unit, 'A2'), 'int'); 514 expect(_getTopLevelVarType(ar.unit, 'A2'), 'int');
519 } 515 }
520 { 516 {
521 AnalysisResult br = allResults.firstWhere((r) => r.path == b); 517 AnalysisResult br = allResults.firstWhere((r) => r.path == b);
522 expect(_getTopLevelVarType(br.unit, 'B1'), 'int'); 518 expect(_getTopLevelVarType(br.unit, 'B1'), 'int');
523 } 519 }
524 520
525 // Clear the results and update "a". 521 // Clear the results and update "a".
526 allResults.clear(); 522 allResults.clear();
527 provider.updateFile( 523 provider.updateFile(
528 a, 524 a,
529 r''' 525 r'''
530 import 'b.dart'; 526 import 'b.dart';
531 var A1 = 1.2; 527 var A1 = 1.2;
532 var A2 = B1; 528 var A2 = B1;
533 '''); 529 ''');
534 driver.changeFile(a); 530 driver.changeFile(a);
535 531
536 // We again get results for both "a" and "b". 532 // We again get results for both "a" and "b".
537 // The results are consistent. 533 // The results are consistent.
538 await driver.waitForIdle(); 534 await scheduler.waitForIdle();
539 expect(allResults, hasLength(2)); 535 expect(allResults, hasLength(2));
540 { 536 {
541 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 537 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
542 expect(_getTopLevelVarType(ar.unit, 'A1'), 'double'); 538 expect(_getTopLevelVarType(ar.unit, 'A1'), 'double');
543 expect(_getTopLevelVarType(ar.unit, 'A2'), 'double'); 539 expect(_getTopLevelVarType(ar.unit, 'A2'), 'double');
544 } 540 }
545 { 541 {
546 AnalysisResult br = allResults.firstWhere((r) => r.path == b); 542 AnalysisResult br = allResults.firstWhere((r) => r.path == b);
547 expect(_getTopLevelVarType(br.unit, 'B1'), 'double'); 543 expect(_getTopLevelVarType(br.unit, 'B1'), 'double');
548 } 544 }
549 } 545 }
550 546
551 test_changeFile_single() async { 547 test_changeFile_single() async {
552 addTestFile('var V = 1;', priority: true); 548 addTestFile('var V = 1;', priority: true);
553 549
554 // Initial analysis. 550 // Initial analysis.
555 { 551 {
556 await driver.waitForIdle(); 552 await scheduler.waitForIdle();
557 expect(allResults, hasLength(1)); 553 expect(allResults, hasLength(1));
558 AnalysisResult result = allResults[0]; 554 AnalysisResult result = allResults[0];
559 expect(result.path, testFile); 555 expect(result.path, testFile);
560 expect(_getTopLevelVarType(result.unit, 'V'), 'int'); 556 expect(_getTopLevelVarType(result.unit, 'V'), 'int');
561 } 557 }
562 558
563 // Update the file, but don't notify the driver. 559 // Update the file, but don't notify the driver.
564 allResults.clear(); 560 allResults.clear();
565 provider.updateFile(testFile, 'var V = 1.2'); 561 provider.updateFile(testFile, 'var V = 1.2');
566 562
567 // No new results. 563 // No new results.
568 await pumpEventQueue(); 564 await pumpEventQueue();
569 expect(allResults, isEmpty); 565 expect(allResults, isEmpty);
570 566
571 // Notify the driver about the change. 567 // Notify the driver about the change.
572 driver.changeFile(testFile); 568 driver.changeFile(testFile);
573 569
574 // The file was added, so it is scheduled for analysis. 570 // The file was added, so it is scheduled for analysis.
575 expect(driver.test.filesToAnalyze, contains(testFile)); 571 expect(driver.test.filesToAnalyze, contains(testFile));
576 572
577 // We get a new result. 573 // We get a new result.
578 { 574 {
579 await driver.waitForIdle(); 575 await scheduler.waitForIdle();
580 expect(allResults, hasLength(1)); 576 expect(allResults, hasLength(1));
581 AnalysisResult result = allResults[0]; 577 AnalysisResult result = allResults[0];
582 expect(result.path, testFile); 578 expect(result.path, testFile);
583 expect(_getTopLevelVarType(result.unit, 'V'), 'double'); 579 expect(_getTopLevelVarType(result.unit, 'V'), 'double');
584 } 580 }
585 } 581 }
586 582
587 test_errors_uriDoesNotExist_export() async { 583 test_errors_uriDoesNotExist_export() async {
588 addTestFile(r''' 584 addTestFile(r'''
589 export 'foo.dart'; 585 export 'foo.dart';
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
664 String path = source.fullName; 660 String path = source.fullName;
665 if (path == templatePath || path == generatedPath) { 661 if (path == templatePath || path == generatedPath) {
666 return uri; 662 return uri;
667 } else { 663 } else {
668 return null; 664 return null;
669 } 665 }
670 }); 666 });
671 667
672 driver.addFile(templatePath); 668 driver.addFile(templatePath);
673 669
674 await driver.waitForIdle(); 670 await scheduler.waitForIdle();
675 expect(allExceptions, isEmpty); 671 expect(allExceptions, isEmpty);
676 expect(allResults, isEmpty); 672 expect(allResults, isEmpty);
677 673
678 var result = await driver.getResult(templatePath); 674 var result = await driver.getResult(templatePath);
679 expect(result, isNull); 675 expect(result, isNull);
680 expect(allExceptions, isEmpty); 676 expect(allExceptions, isEmpty);
681 expect(allResults, isEmpty); 677 expect(allResults, isEmpty);
682 678
683 var element = await driver.getUnitElement(templatePath); 679 var element = await driver.getUnitElement(templatePath);
684 expect(element, isNull); 680 expect(element, isNull);
685 expect(allExceptions, isEmpty); 681 expect(allExceptions, isEmpty);
686 expect(allResults, isEmpty); 682 expect(allResults, isEmpty);
687 683
688 driver.priorityFiles = [templatePath]; 684 driver.priorityFiles = [templatePath];
689 driver.changeFile(templatePath); 685 driver.changeFile(templatePath);
690 await driver.waitForIdle(); 686 await scheduler.waitForIdle();
691 expect(allExceptions, isEmpty); 687 expect(allExceptions, isEmpty);
692 expect(allResults, isEmpty); 688 expect(allResults, isEmpty);
693 689
694 expect(driver.knownFiles, isNot(contains(templatePath))); 690 expect(driver.knownFiles, isNot(contains(templatePath)));
695 } 691 }
696 692
697 test_getErrors() async { 693 test_getErrors() async {
698 String content = 'int f() => 42 + bar();'; 694 String content = 'int f() => 42 + bar();';
699 addTestFile(content, priority: true); 695 addTestFile(content, priority: true);
700 696
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 expect(result.content, content); 760 expect(result.content, content);
765 expect(result.contentHash, _md5(content)); 761 expect(result.contentHash, _md5(content));
766 expect(result.unit, isNotNull); 762 expect(result.unit, isNotNull);
767 expect(result.errors, hasLength(0)); 763 expect(result.errors, hasLength(0));
768 764
769 var f = result.unit.declarations[0] as FunctionDeclaration; 765 var f = result.unit.declarations[0] as FunctionDeclaration;
770 expect(f.name.staticType.toString(), '() → int'); 766 expect(f.name.staticType.toString(), '() → int');
771 expect(f.returnType.type.toString(), 'int'); 767 expect(f.returnType.type.toString(), 'int');
772 768
773 // The same result is also received through the stream. 769 // The same result is also received through the stream.
774 await driver.waitForIdle(); 770 await scheduler.waitForIdle();
775 expect(allResults, [result]); 771 expect(allResults, [result]);
776 } 772 }
777 773
778 test_getResult_constants_defaultParameterValue_localFunction() async { 774 test_getResult_constants_defaultParameterValue_localFunction() async {
779 var a = _p('/test/bin/a.dart'); 775 var a = _p('/test/bin/a.dart');
780 var b = _p('/test/bin/b.dart'); 776 var b = _p('/test/bin/b.dart');
781 provider.newFile(a, 'const C = 42;'); 777 provider.newFile(a, 'const C = 42;');
782 provider.newFile( 778 provider.newFile(
783 b, 779 b,
784 r''' 780 r'''
785 import 'a.dart'; 781 import 'a.dart';
786 main() { 782 main() {
787 foo({int p: C}) {} 783 foo({int p: C}) {}
788 foo(); 784 foo();
789 } 785 }
790 '''); 786 ''');
791 driver.addFile(a); 787 driver.addFile(a);
792 driver.addFile(b); 788 driver.addFile(b);
793 await driver.waitForIdle(); 789 await scheduler.waitForIdle();
794 790
795 AnalysisResult result = await driver.getResult(b); 791 AnalysisResult result = await driver.getResult(b);
796 expect(result.errors, isEmpty); 792 expect(result.errors, isEmpty);
797 } 793 }
798 794
799 test_getResult_doesNotExist() async { 795 test_getResult_doesNotExist() async {
800 var a = _p('/test/lib/a.dart'); 796 var a = _p('/test/lib/a.dart');
801 797
802 AnalysisResult result = await driver.getResult(a); 798 AnalysisResult result = await driver.getResult(a);
803 expect(result.path, a); 799 expect(result.path, a);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
841 } 837 }
842 838
843 test_getResult_inferTypes_finalField() async { 839 test_getResult_inferTypes_finalField() async {
844 addTestFile( 840 addTestFile(
845 r''' 841 r'''
846 class C { 842 class C {
847 final f = 42; 843 final f = 42;
848 } 844 }
849 ''', 845 ''',
850 priority: true); 846 priority: true);
851 await driver.waitForIdle(); 847 await scheduler.waitForIdle();
852 848
853 AnalysisResult result = await driver.getResult(testFile); 849 AnalysisResult result = await driver.getResult(testFile);
854 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int'); 850 expect(_getClassFieldType(result.unit, 'C', 'f'), 'int');
855 } 851 }
856 852
857 test_getResult_inferTypes_instanceMethod() async { 853 test_getResult_inferTypes_instanceMethod() async {
858 addTestFile( 854 addTestFile(
859 r''' 855 r'''
860 class A { 856 class A {
861 int m(double p) => 1; 857 int m(double p) => 1;
862 } 858 }
863 class B extends A { 859 class B extends A {
864 m(double p) => 2; 860 m(double p) => 2;
865 } 861 }
866 ''', 862 ''',
867 priority: true); 863 priority: true);
868 await driver.waitForIdle(); 864 await scheduler.waitForIdle();
869 865
870 AnalysisResult result = await driver.getResult(testFile); 866 AnalysisResult result = await driver.getResult(testFile);
871 expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int'); 867 expect(_getClassMethodReturnType(result.unit, 'A', 'm'), 'int');
872 expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int'); 868 expect(_getClassMethodReturnType(result.unit, 'B', 'm'), 'int');
873 } 869 }
874 870
875 test_getResult_invalid_annotation_functionAsConstructor() async { 871 test_getResult_invalid_annotation_functionAsConstructor() async {
876 addTestFile( 872 addTestFile(
877 r''' 873 r'''
878 fff() {} 874 fff() {}
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 '''); 1011 ''');
1016 provider.newFile( 1012 provider.newFile(
1017 c, 1013 c,
1018 r''' 1014 r'''
1019 import '../lib/a.dart'; 1015 import '../lib/a.dart';
1020 var VC = new A<double>(); 1016 var VC = new A<double>();
1021 '''); 1017 ''');
1022 1018
1023 driver.addFile(a); 1019 driver.addFile(a);
1024 driver.addFile(b); 1020 driver.addFile(b);
1025 await driver.waitForIdle(); 1021 await scheduler.waitForIdle();
1026 1022
1027 { 1023 {
1028 AnalysisResult result = await driver.getResult(b); 1024 AnalysisResult result = await driver.getResult(b);
1029 expect(_getImportSource(result.unit, 0).uri.toString(), 1025 expect(_getImportSource(result.unit, 0).uri.toString(),
1030 'package:test/a.dart'); 1026 'package:test/a.dart');
1031 expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>'); 1027 expect(_getTopLevelVarType(result.unit, 'VB'), 'A<int>');
1032 } 1028 }
1033 1029
1034 { 1030 {
1035 AnalysisResult result = await driver.getResult(c); 1031 AnalysisResult result = await driver.getResult(c);
(...skipping 15 matching lines...) Expand all
1051 '''); 1047 ''');
1052 provider.newFile( 1048 provider.newFile(
1053 b, 1049 b,
1054 r''' 1050 r'''
1055 import 'a.dart'; 1051 import 'a.dart';
1056 var B1 = A1; 1052 var B1 = A1;
1057 '''); 1053 ''');
1058 1054
1059 driver.addFile(a); 1055 driver.addFile(a);
1060 driver.addFile(b); 1056 driver.addFile(b);
1061 await driver.waitForIdle(); 1057 await scheduler.waitForIdle();
1062 1058
1063 { 1059 {
1064 AnalysisResult result = await driver.getResult(a); 1060 AnalysisResult result = await driver.getResult(a);
1065 expect(_getTopLevelVarType(result.unit, 'A1'), 'int'); 1061 expect(_getTopLevelVarType(result.unit, 'A1'), 'int');
1066 expect(_getTopLevelVarType(result.unit, 'A2'), 'int'); 1062 expect(_getTopLevelVarType(result.unit, 'A2'), 'int');
1067 } 1063 }
1068 1064
1069 // Update "a" so that "A1" is now "double". 1065 // Update "a" so that "A1" is now "double".
1070 // Get result for "a". 1066 // Get result for "a".
1071 // 1067 //
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 1222
1227 test_hasFilesToAnalyze() async { 1223 test_hasFilesToAnalyze() async {
1228 // No files yet, nothing to analyze. 1224 // No files yet, nothing to analyze.
1229 expect(driver.hasFilesToAnalyze, isFalse); 1225 expect(driver.hasFilesToAnalyze, isFalse);
1230 1226
1231 // Add a new file, it should be analyzed. 1227 // Add a new file, it should be analyzed.
1232 addTestFile('main() {}', priority: false); 1228 addTestFile('main() {}', priority: false);
1233 expect(driver.hasFilesToAnalyze, isTrue); 1229 expect(driver.hasFilesToAnalyze, isTrue);
1234 1230
1235 // Wait for idle, nothing to do. 1231 // Wait for idle, nothing to do.
1236 await driver.waitForIdle(); 1232 await scheduler.waitForIdle();
1237 expect(driver.hasFilesToAnalyze, isFalse); 1233 expect(driver.hasFilesToAnalyze, isFalse);
1238 1234
1239 // Ask to analyze the file, so there is a file to analyze. 1235 // Ask to analyze the file, so there is a file to analyze.
1240 Future<AnalysisResult> future = driver.getResult(testFile); 1236 Future<AnalysisResult> future = driver.getResult(testFile);
1241 expect(driver.hasFilesToAnalyze, isTrue); 1237 expect(driver.hasFilesToAnalyze, isTrue);
1242 1238
1243 // Once analysis is done, there is nothing to analyze. 1239 // Once analysis is done, there is nothing to analyze.
1244 await future; 1240 await future;
1245 expect(driver.hasFilesToAnalyze, isFalse); 1241 expect(driver.hasFilesToAnalyze, isFalse);
1246 1242
1247 // Change a file, even if not added, it still might affect analysis. 1243 // Change a file, even if not added, it still might affect analysis.
1248 driver.changeFile(_p('/not/added.dart')); 1244 driver.changeFile(_p('/not/added.dart'));
1249 expect(driver.hasFilesToAnalyze, isTrue); 1245 expect(driver.hasFilesToAnalyze, isTrue);
1250 await driver.waitForIdle(); 1246 await scheduler.waitForIdle();
1251 expect(driver.hasFilesToAnalyze, isFalse); 1247 expect(driver.hasFilesToAnalyze, isFalse);
1252 1248
1253 // Request of referenced names is not analysis of a file. 1249 // Request of referenced names is not analysis of a file.
1254 driver.getFilesReferencingName('X'); 1250 driver.getFilesReferencingName('X');
1255 expect(driver.hasFilesToAnalyze, isFalse); 1251 expect(driver.hasFilesToAnalyze, isFalse);
1256 } 1252 }
1257 1253
1258 test_hermetic_modifyLibraryFile_resolvePart() async { 1254 test_hermetic_modifyLibraryFile_resolvePart() async {
1259 var a = _p('/test/lib/a.dart'); 1255 var a = _p('/test/lib/a.dart');
1260 var b = _p('/test/lib/b.dart'); 1256 var b = _p('/test/lib/b.dart');
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1327 provider.newFile( 1323 provider.newFile(
1328 a, 1324 a,
1329 r''' 1325 r'''
1330 import 'b.dart'; 1326 import 'b.dart';
1331 '''); 1327 ''');
1332 provider.newFile(b, ''); 1328 provider.newFile(b, '');
1333 provider.newFile(c, ''); 1329 provider.newFile(c, '');
1334 1330
1335 driver.addFile(a); 1331 driver.addFile(a);
1336 driver.addFile(c); 1332 driver.addFile(c);
1337 await driver.waitForIdle(); 1333 await scheduler.waitForIdle();
1338 1334
1339 expect(driver.knownFiles, contains(a)); 1335 expect(driver.knownFiles, contains(a));
1340 expect(driver.knownFiles, contains(b)); 1336 expect(driver.knownFiles, contains(b));
1341 expect(driver.knownFiles, contains(c)); 1337 expect(driver.knownFiles, contains(c));
1342 1338
1343 // Remove a.dart and analyze. 1339 // Remove a.dart and analyze.
1344 // Both a.dart and b.dart are not known now. 1340 // Both a.dart and b.dart are not known now.
1345 driver.removeFile(a); 1341 driver.removeFile(a);
1346 await driver.waitForIdle(); 1342 await scheduler.waitForIdle();
1347 expect(driver.knownFiles, isNot(contains(a))); 1343 expect(driver.knownFiles, isNot(contains(a)));
1348 expect(driver.knownFiles, isNot(contains(b))); 1344 expect(driver.knownFiles, isNot(contains(b)));
1349 expect(driver.knownFiles, contains(c)); 1345 expect(driver.knownFiles, contains(c));
1350 } 1346 }
1351 1347
1352 test_knownFiles_beforeAnalysis() async { 1348 test_knownFiles_beforeAnalysis() async {
1353 var a = _p('/test/lib/a.dart'); 1349 var a = _p('/test/lib/a.dart');
1354 var b = _p('/test/lib/b.dart'); 1350 var b = _p('/test/lib/b.dart');
1355 1351
1356 provider.newFile(a, ''); 1352 provider.newFile(a, '');
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
1588 var a = new A(); 1584 var a = new A();
1589 var b = new B(); 1585 var b = new B();
1590 '''); 1586 ''');
1591 1587
1592 // The order is important for creating the test case. 1588 // The order is important for creating the test case.
1593 driver.addFile(a); 1589 driver.addFile(a);
1594 driver.addFile(b); 1590 driver.addFile(b);
1595 driver.addFile(c); 1591 driver.addFile(c);
1596 1592
1597 { 1593 {
1598 await driver.waitForIdle(); 1594 await scheduler.waitForIdle();
1599 1595
1600 // c.dart was added after a.dart, so it is analyzed after a.dart, 1596 // c.dart was added after a.dart, so it is analyzed after a.dart,
1601 // so we know that a.dart is the library of c.dart, so no errors. 1597 // so we know that a.dart is the library of c.dart, so no errors.
1602 AnalysisResult result = allResults.lastWhere((r) => r.path == c); 1598 AnalysisResult result = allResults.lastWhere((r) => r.path == c);
1603 expect(result.errors, isEmpty); 1599 expect(result.errors, isEmpty);
1604 expect(result.unit, isNull); 1600 expect(result.unit, isNull);
1605 } 1601 }
1606 1602
1607 // Update a.dart so that c.dart is not a part. 1603 // Update a.dart so that c.dart is not a part.
1608 { 1604 {
1609 provider.updateFile(a, '// does not use c.dart anymore'); 1605 provider.updateFile(a, '// does not use c.dart anymore');
1610 driver.changeFile(a); 1606 driver.changeFile(a);
1611 await driver.waitForIdle(); 1607 await scheduler.waitForIdle();
1612 1608
1613 // Now c.dart does not have a library context, so A and B cannot be 1609 // Now c.dart does not have a library context, so A and B cannot be
1614 // resolved, so there are errors. 1610 // resolved, so there are errors.
1615 AnalysisResult result = allResults.lastWhere((r) => r.path == c); 1611 AnalysisResult result = allResults.lastWhere((r) => r.path == c);
1616 expect(result.errors, isNotEmpty); 1612 expect(result.errors, isNotEmpty);
1617 expect(result.unit, isNull); 1613 expect(result.unit, isNull);
1618 } 1614 }
1619 } 1615 }
1620 1616
1621 test_part_results_beforeLibrary() async { 1617 test_part_results_beforeLibrary() async {
(...skipping 17 matching lines...) Expand all
1639 class C {} 1635 class C {}
1640 var a = new A(); 1636 var a = new A();
1641 var b = new B(); 1637 var b = new B();
1642 '''); 1638 ''');
1643 1639
1644 // The order is important for creating the test case. 1640 // The order is important for creating the test case.
1645 driver.addFile(c); 1641 driver.addFile(c);
1646 driver.addFile(a); 1642 driver.addFile(a);
1647 driver.addFile(b); 1643 driver.addFile(b);
1648 1644
1649 await driver.waitForIdle(); 1645 await scheduler.waitForIdle();
1650 1646
1651 // c.dart was added before a.dart, so we attempt to analyze it before 1647 // c.dart was added before a.dart, so we attempt to analyze it before
1652 // a.dart, but we cannot find the library for it, so we delay analysis 1648 // a.dart, but we cannot find the library for it, so we delay analysis
1653 // until all other files are analyzed, including a.dart, after which we 1649 // until all other files are analyzed, including a.dart, after which we
1654 // analyze the delayed parts. 1650 // analyze the delayed parts.
1655 AnalysisResult result = allResults.lastWhere((r) => r.path == c); 1651 AnalysisResult result = allResults.lastWhere((r) => r.path == c);
1656 expect(result.errors, isEmpty); 1652 expect(result.errors, isEmpty);
1657 expect(result.unit, isNull); 1653 expect(result.unit, isNull);
1658 } 1654 }
1659 1655
1660 test_part_results_noLibrary() async { 1656 test_part_results_noLibrary() async {
1661 var c = _p('/test/lib/c.dart'); 1657 var c = _p('/test/lib/c.dart');
1662 provider.newFile( 1658 provider.newFile(
1663 c, 1659 c,
1664 r''' 1660 r'''
1665 part of a; 1661 part of a;
1666 class C {} 1662 class C {}
1667 var a = new A(); 1663 var a = new A();
1668 var b = new B(); 1664 var b = new B();
1669 '''); 1665 ''');
1670 1666
1671 driver.addFile(c); 1667 driver.addFile(c);
1672 1668
1673 await driver.waitForIdle(); 1669 await scheduler.waitForIdle();
1674 1670
1675 // There is no library which c.dart is a part of, so it has unresolved 1671 // There is no library which c.dart is a part of, so it has unresolved
1676 // A and B references. 1672 // A and B references.
1677 AnalysisResult result = allResults.lastWhere((r) => r.path == c); 1673 AnalysisResult result = allResults.lastWhere((r) => r.path == c);
1678 expect(result.errors, isNotEmpty); 1674 expect(result.errors, isNotEmpty);
1679 expect(result.unit, isNull); 1675 expect(result.unit, isNull);
1680 } 1676 }
1681 1677
1682 test_part_results_priority_beforeLibrary() async { 1678 test_part_results_priority_beforeLibrary() async {
1683 var a = _p('/test/lib/a.dart'); 1679 var a = _p('/test/lib/a.dart');
(...skipping 17 matching lines...) Expand all
1701 var a = new A(); 1697 var a = new A();
1702 var b = new B(); 1698 var b = new B();
1703 '''); 1699 ''');
1704 1700
1705 // The order is important for creating the test case. 1701 // The order is important for creating the test case.
1706 driver.priorityFiles = [c]; 1702 driver.priorityFiles = [c];
1707 driver.addFile(c); 1703 driver.addFile(c);
1708 driver.addFile(a); 1704 driver.addFile(a);
1709 driver.addFile(b); 1705 driver.addFile(b);
1710 1706
1711 await driver.waitForIdle(); 1707 await scheduler.waitForIdle();
1712 1708
1713 // c.dart was added before a.dart, so we attempt to analyze it before 1709 // c.dart was added before a.dart, so we attempt to analyze it before
1714 // a.dart, but we cannot find the library for it, so we delay analysis 1710 // a.dart, but we cannot find the library for it, so we delay analysis
1715 // until all other files are analyzed, including a.dart, after which we 1711 // until all other files are analyzed, including a.dart, after which we
1716 // analyze the delayed parts. 1712 // analyze the delayed parts.
1717 AnalysisResult result = allResults.lastWhere((r) => r.path == c); 1713 AnalysisResult result = allResults.lastWhere((r) => r.path == c);
1718 expect(result.errors, isEmpty); 1714 expect(result.errors, isEmpty);
1719 expect(result.unit, isNotNull); 1715 expect(result.unit, isNotNull);
1720 } 1716 }
1721 1717
1722 test_removeFile_changeFile_implicitlyAnalyzed() async { 1718 test_removeFile_changeFile_implicitlyAnalyzed() async {
1723 var a = _p('/test/lib/a.dart'); 1719 var a = _p('/test/lib/a.dart');
1724 var b = _p('/test/lib/b.dart'); 1720 var b = _p('/test/lib/b.dart');
1725 provider.newFile( 1721 provider.newFile(
1726 a, 1722 a,
1727 r''' 1723 r'''
1728 import 'b.dart'; 1724 import 'b.dart';
1729 var A = B; 1725 var A = B;
1730 '''); 1726 ''');
1731 provider.newFile(b, 'var B = 1;'); 1727 provider.newFile(b, 'var B = 1;');
1732 1728
1733 driver.priorityFiles = [a, b]; 1729 driver.priorityFiles = [a, b];
1734 driver.addFile(a); 1730 driver.addFile(a);
1735 driver.addFile(b); 1731 driver.addFile(b);
1736 1732
1737 // We have results for both "a" and "b". 1733 // We have results for both "a" and "b".
1738 await driver.waitForIdle(); 1734 await scheduler.waitForIdle();
1739 expect(allResults, hasLength(2)); 1735 expect(allResults, hasLength(2));
1740 { 1736 {
1741 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 1737 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
1742 expect(_getTopLevelVarType(ar.unit, 'A'), 'int'); 1738 expect(_getTopLevelVarType(ar.unit, 'A'), 'int');
1743 } 1739 }
1744 { 1740 {
1745 AnalysisResult br = allResults.firstWhere((r) => r.path == b); 1741 AnalysisResult br = allResults.firstWhere((r) => r.path == b);
1746 expect(_getTopLevelVarType(br.unit, 'B'), 'int'); 1742 expect(_getTopLevelVarType(br.unit, 'B'), 'int');
1747 } 1743 }
1748 allResults.clear(); 1744 allResults.clear();
1749 1745
1750 // Remove "b" and send the change notification. 1746 // Remove "b" and send the change notification.
1751 provider.updateFile(b, 'var B = 1.2;'); 1747 provider.updateFile(b, 'var B = 1.2;');
1752 driver.removeFile(b); 1748 driver.removeFile(b);
1753 driver.changeFile(b); 1749 driver.changeFile(b);
1754 1750
1755 // While "b" is not analyzed explicitly, it is analyzed implicitly. 1751 // While "b" is not analyzed explicitly, it is analyzed implicitly.
1756 // We don't get a result for "b". 1752 // We don't get a result for "b".
1757 // But the change causes "a" to be reanalyzed. 1753 // But the change causes "a" to be reanalyzed.
1758 await driver.waitForIdle(); 1754 await scheduler.waitForIdle();
1759 expect(allResults, hasLength(1)); 1755 expect(allResults, hasLength(1));
1760 { 1756 {
1761 AnalysisResult ar = allResults.firstWhere((r) => r.path == a); 1757 AnalysisResult ar = allResults.firstWhere((r) => r.path == a);
1762 expect(_getTopLevelVarType(ar.unit, 'A'), 'double'); 1758 expect(_getTopLevelVarType(ar.unit, 'A'), 'double');
1763 } 1759 }
1764 } 1760 }
1765 1761
1766 test_removeFile_changeFile_notAnalyzed() async { 1762 test_removeFile_changeFile_notAnalyzed() async {
1767 addTestFile('main() {}'); 1763 addTestFile('main() {}');
1768 1764
1769 // We have a result. 1765 // We have a result.
1770 await driver.waitForIdle(); 1766 await scheduler.waitForIdle();
1771 expect(allResults, hasLength(1)); 1767 expect(allResults, hasLength(1));
1772 expect(allResults[0].path, testFile); 1768 expect(allResults[0].path, testFile);
1773 allResults.clear(); 1769 allResults.clear();
1774 1770
1775 // Remove the file and send the change notification. 1771 // Remove the file and send the change notification.
1776 // The change notification does nothing, because the file is explicitly 1772 // The change notification does nothing, because the file is explicitly
1777 // or implicitly analyzed. 1773 // or implicitly analyzed.
1778 driver.removeFile(testFile); 1774 driver.removeFile(testFile);
1779 driver.changeFile(testFile); 1775 driver.changeFile(testFile);
1780 1776
1781 await driver.waitForIdle(); 1777 await scheduler.waitForIdle();
1782 expect(allResults, isEmpty); 1778 expect(allResults, isEmpty);
1783 } 1779 }
1784 1780
1785 test_removeFile_invalidate_importers() async { 1781 test_removeFile_invalidate_importers() async {
1786 var a = _p('/test/lib/a.dart'); 1782 var a = _p('/test/lib/a.dart');
1787 var b = _p('/test/lib/b.dart'); 1783 var b = _p('/test/lib/b.dart');
1788 1784
1789 provider.newFile(a, 'class A {}'); 1785 provider.newFile(a, 'class A {}');
1790 provider.newFile(b, "import 'a.dart'; var a = new A();"); 1786 provider.newFile(b, "import 'a.dart'; var a = new A();");
1791 1787
1792 driver.addFile(a); 1788 driver.addFile(a);
1793 driver.addFile(b); 1789 driver.addFile(b);
1794 await driver.waitForIdle(); 1790 await scheduler.waitForIdle();
1795 1791
1796 // b.dart s clean. 1792 // b.dart s clean.
1797 expect(allResults.singleWhere((r) => r.path == b).errors, isEmpty); 1793 expect(allResults.singleWhere((r) => r.path == b).errors, isEmpty);
1798 allResults.clear(); 1794 allResults.clear();
1799 1795
1800 // Remove a.dart, now b.dart should be reanalyzed and has an error. 1796 // Remove a.dart, now b.dart should be reanalyzed and has an error.
1801 provider.deleteFile(a); 1797 provider.deleteFile(a);
1802 driver.removeFile(a); 1798 driver.removeFile(a);
1803 await driver.waitForIdle(); 1799 await scheduler.waitForIdle();
1804 expect(allResults.singleWhere((r) => r.path == b).errors, hasLength(2)); 1800 expect(allResults.singleWhere((r) => r.path == b).errors, hasLength(2));
1805 allResults.clear(); 1801 allResults.clear();
1806 } 1802 }
1807 1803
1808 test_results_priority() async { 1804 test_results_priority() async {
1809 String content = 'int f() => 42;'; 1805 String content = 'int f() => 42;';
1810 addTestFile(content, priority: true); 1806 addTestFile(content, priority: true);
1811 1807
1812 await driver.waitForIdle(); 1808 await scheduler.waitForIdle();
1813 1809
1814 expect(allResults, hasLength(1)); 1810 expect(allResults, hasLength(1));
1815 AnalysisResult result = allResults.single; 1811 AnalysisResult result = allResults.single;
1816 expect(result.path, testFile); 1812 expect(result.path, testFile);
1817 expect(result.uri.toString(), 'package:test/test.dart'); 1813 expect(result.uri.toString(), 'package:test/test.dart');
1818 expect(result.content, content); 1814 expect(result.content, content);
1819 expect(result.contentHash, _md5(content)); 1815 expect(result.contentHash, _md5(content));
1820 expect(result.unit, isNotNull); 1816 expect(result.unit, isNotNull);
1821 expect(result.errors, hasLength(0)); 1817 expect(result.errors, hasLength(0));
1822 1818
1823 var f = result.unit.declarations[0] as FunctionDeclaration; 1819 var f = result.unit.declarations[0] as FunctionDeclaration;
1824 expect(f.name.staticType.toString(), '() → int'); 1820 expect(f.name.staticType.toString(), '() → int');
1825 expect(f.returnType.type.toString(), 'int'); 1821 expect(f.returnType.type.toString(), 'int');
1826 } 1822 }
1827 1823
1828 test_results_priorityFirst() async { 1824 test_results_priorityFirst() async {
1829 var a = _p('/test/lib/a.dart'); 1825 var a = _p('/test/lib/a.dart');
1830 var b = _p('/test/lib/b.dart'); 1826 var b = _p('/test/lib/b.dart');
1831 var c = _p('/test/lib/c.dart'); 1827 var c = _p('/test/lib/c.dart');
1832 provider.newFile(a, 'class A {}'); 1828 provider.newFile(a, 'class A {}');
1833 provider.newFile(b, 'class B {}'); 1829 provider.newFile(b, 'class B {}');
1834 provider.newFile(c, 'class C {}'); 1830 provider.newFile(c, 'class C {}');
1835 1831
1836 driver.addFile(a); 1832 driver.addFile(a);
1837 driver.addFile(b); 1833 driver.addFile(b);
1838 driver.addFile(c); 1834 driver.addFile(c);
1839 driver.priorityFiles = [b]; 1835 driver.priorityFiles = [b];
1840 await driver.waitForIdle(); 1836 await scheduler.waitForIdle();
1841 1837
1842 expect(allResults, hasLength(3)); 1838 expect(allResults, hasLength(3));
1843 AnalysisResult result = allResults[0]; 1839 AnalysisResult result = allResults[0];
1844 expect(result.path, b); 1840 expect(result.path, b);
1845 expect(result.unit, isNotNull); 1841 expect(result.unit, isNotNull);
1846 expect(result.errors, hasLength(0)); 1842 expect(result.errors, hasLength(0));
1847 } 1843 }
1848 1844
1849 test_results_regular() async { 1845 test_results_regular() async {
1850 String content = 'int f() => 42;'; 1846 String content = 'int f() => 42;';
1851 addTestFile(content); 1847 addTestFile(content);
1852 await driver.waitForIdle(); 1848 await scheduler.waitForIdle();
1853 1849
1854 expect(allResults, hasLength(1)); 1850 expect(allResults, hasLength(1));
1855 AnalysisResult result = allResults.single; 1851 AnalysisResult result = allResults.single;
1856 expect(result.path, testFile); 1852 expect(result.path, testFile);
1857 expect(result.uri.toString(), 'package:test/test.dart'); 1853 expect(result.uri.toString(), 'package:test/test.dart');
1858 expect(result.content, isNull); 1854 expect(result.content, isNull);
1859 expect(result.contentHash, _md5(content)); 1855 expect(result.contentHash, _md5(content));
1860 expect(result.unit, isNull); 1856 expect(result.unit, isNull);
1861 expect(result.errors, hasLength(0)); 1857 expect(result.errors, hasLength(0));
1862 } 1858 }
1863 1859
1864 test_results_status() async { 1860 test_results_status() async {
1865 addTestFile('int f() => 42;'); 1861 addTestFile('int f() => 42;');
1866 await driver.waitForIdle(); 1862 await scheduler.waitForIdle();
1867 1863
1868 expect(allStatuses, hasLength(2)); 1864 expect(allStatuses, hasLength(2));
1869 expect(allStatuses[0].isAnalyzing, isTrue); 1865 expect(allStatuses[0].isAnalyzing, isTrue);
1870 expect(allStatuses[0].isIdle, isFalse); 1866 expect(allStatuses[0].isIdle, isFalse);
1871 expect(allStatuses[1].isAnalyzing, isFalse); 1867 expect(allStatuses[1].isAnalyzing, isFalse);
1872 expect(allStatuses[1].isIdle, isTrue); 1868 expect(allStatuses[1].isIdle, isTrue);
1873 } 1869 }
1874 1870
1875 test_waitForIdle() async { 1871 test_waitForIdle() async {
1876 // With no analysis to do, driver.waitForIdle should complete immediately. 1872 // With no analysis to do, scheduler.waitForIdle should complete immediately .
1877 await driver.waitForIdle(); 1873 await scheduler.waitForIdle();
1878 // Now schedule some analysis. 1874 // Now schedule some analysis.
1879 addTestFile('int f() => 42;'); 1875 addTestFile('int f() => 42;');
1880 expect(allResults, isEmpty); 1876 expect(allResults, isEmpty);
1881 // driver.waitForIdle should wait for the analysis. 1877 // scheduler.waitForIdle should wait for the analysis.
1882 await driver.waitForIdle(); 1878 await scheduler.waitForIdle();
1883 expect(allResults, hasLength(1)); 1879 expect(allResults, hasLength(1));
1884 // Make sure there is no more analysis pending. 1880 // Make sure there is no more analysis pending.
1885 await driver.waitForIdle(); 1881 await scheduler.waitForIdle();
1886 expect(allResults, hasLength(1)); 1882 expect(allResults, hasLength(1));
1887 } 1883 }
1888 1884
1889 void _assertTopLevelDeclarations( 1885 void _assertTopLevelDeclarations(
1890 List<TopLevelDeclarationInSource> declarations, 1886 List<TopLevelDeclarationInSource> declarations,
1891 List<String> expectedFiles, 1887 List<String> expectedFiles,
1892 List<bool> expectedIsExported) { 1888 List<bool> expectedIsExported) {
1893 expect(expectedFiles, hasLength(expectedIsExported.length)); 1889 expect(expectedFiles, hasLength(expectedIsExported.length));
1894 for (int i = 0; i < expectedFiles.length; i++) { 1890 for (int i = 0; i < expectedFiles.length; i++) {
1895 expect(declarations, 1891 expect(declarations,
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
1995 * Return the [provider] specific path for the given Posix [path]. 1991 * Return the [provider] specific path for the given Posix [path].
1996 */ 1992 */
1997 String _p(String path) => provider.convertPath(path); 1993 String _p(String path) => provider.convertPath(path);
1998 1994
1999 static String _md5(String content) { 1995 static String _md5(String content) {
2000 return hex.encode(md5.convert(UTF8.encode(content)).bytes); 1996 return hex.encode(md5.convert(UTF8.encode(content)).bytes);
2001 } 1997 }
2002 } 1998 }
2003 1999
2004 class _SourceMock extends TypedMock implements Source {} 2000 class _SourceMock extends TypedMock implements Source {}
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698