| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 {} |
| OLD | NEW |