Index: pkg/analyzer/test/src/dart/analysis/driver_test.dart |
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart |
index 1bff4ea0def4bbe843ae3066eca4bf047826cebb..33551dbe45b2cb6d97eaffe8d57f73a745394bce 100644 |
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart |
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart |
@@ -97,6 +97,96 @@ class AnalysisDriverSchedulerTest { |
scheduler.start(); |
} |
+ test_priorities_allChangedFirst() async { |
+ AnalysisDriver driver1 = newDriver(); |
+ AnalysisDriver driver2 = newDriver(); |
+ |
+ String a = _p('/a.dart'); |
+ String b = _p('/b.dart'); |
+ String c = _p('/c.dart'); |
+ String d = _p('/d.dart'); |
+ provider.newFile(a, 'class A {}'); |
+ provider.newFile(b, "import 'a.dart';"); |
+ provider.newFile(c, 'class C {}'); |
+ provider.newFile(d, "import 'c.dart';"); |
+ driver1.addFile(a); |
+ driver1.addFile(b); |
+ driver2.addFile(c); |
+ driver2.addFile(d); |
+ |
+ await scheduler.waitForIdle(); |
+ allResults.clear(); |
+ |
+ provider.updateFile(a, 'class A2 {}'); |
+ provider.updateFile(c, 'class C2 {}'); |
+ driver1.changeFile(a); |
+ driver1.changeFile(c); |
+ driver2.changeFile(a); |
+ driver2.changeFile(c); |
+ |
+ await scheduler.waitForIdle(); |
+ expect(allResults, hasLength(greaterThanOrEqualTo(2))); |
+ expect(allResults[0].path, a); |
+ expect(allResults[1].path, c); |
+ } |
+ |
+ test_priorities_firstChanged_thenImporting() async { |
+ AnalysisDriver driver1 = newDriver(); |
+ AnalysisDriver driver2 = newDriver(); |
+ |
+ String a = _p('/a.dart'); |
+ String b = _p('/b.dart'); |
+ String c = _p('/c.dart'); |
+ provider.newFile(a, "import 'c.dart';"); |
+ provider.newFile(b, 'class B {}'); |
+ provider.newFile(c, "import 'b.dart';"); |
+ driver1.addFile(a); |
+ driver1.addFile(b); |
+ driver2.addFile(c); |
+ |
+ await scheduler.waitForIdle(); |
+ allResults.clear(); |
+ |
+ provider.updateFile(b, 'class B2 {}'); |
+ driver1.changeFile(b); |
+ driver2.changeFile(b); |
+ |
+ await scheduler.waitForIdle(); |
+ expect(allResults, hasLength(greaterThanOrEqualTo(2))); |
+ expect(allResults[0].path, b); |
+ expect(allResults[1].path, c); |
+ } |
+ |
+ test_priorities_firstChanged_thenWithErrors() async { |
+ AnalysisDriver driver1 = newDriver(); |
+ AnalysisDriver driver2 = newDriver(); |
+ |
+ String a = _p('/a.dart'); |
+ String b = _p('/b.dart'); |
+ String c = _p('/c.dart'); |
+ String d = _p('/d.dart'); |
+ provider.newFile(a, 'class A {}'); |
+ provider.newFile(b, "export 'a.dart';"); |
+ provider.newFile(c, "import 'b.dart';"); |
+ provider.newFile(d, "import 'b.dart'; class D extends X {}"); |
+ driver1.addFile(a); |
+ driver1.addFile(b); |
+ driver2.addFile(c); |
+ driver2.addFile(d); |
+ |
+ await scheduler.waitForIdle(); |
+ allResults.clear(); |
+ |
+ provider.updateFile(a, 'class A2 {}'); |
+ driver1.changeFile(a); |
+ driver2.changeFile(a); |
+ |
+ await scheduler.waitForIdle(); |
+ expect(allResults, hasLength(greaterThanOrEqualTo(2))); |
+ expect(allResults[0].path, a); |
+ expect(allResults[1].path, d); |
+ } |
+ |
test_priorities_getResult_beforePriority() async { |
AnalysisDriver driver1 = newDriver(); |
AnalysisDriver driver2 = newDriver(); |
@@ -2179,6 +2269,113 @@ var A = B; |
allResults.clear(); |
} |
+ test_results_order() async { |
+ var a = _p('/test/lib/a.dart'); |
+ var b = _p('/test/lib/b.dart'); |
+ var c = _p('/test/lib/c.dart'); |
+ var d = _p('/test/lib/d.dart'); |
+ var e = _p('/test/lib/e.dart'); |
+ var f = _p('/test/lib/f.dart'); |
+ provider.newFile( |
+ a, |
+ r''' |
+import 'd.dart'; |
+'''); |
+ provider.newFile(b, ''); |
+ provider.newFile( |
+ c, |
+ r''' |
+import 'd.dart'; |
+'''); |
+ provider.newFile( |
+ d, |
+ r''' |
+import 'b.dart'; |
+'''); |
+ provider.newFile( |
+ e, |
+ r''' |
+export 'b.dart'; |
+'''); |
+ provider.newFile( |
+ f, |
+ r''' |
+import 'e.dart'; |
+class F extends X {} |
+'''); |
+ |
+ driver.addFile(a); |
+ driver.addFile(b); |
+ driver.addFile(c); |
+ driver.addFile(d); |
+ driver.addFile(e); |
+ driver.addFile(f); |
+ await scheduler.waitForIdle(); |
+ |
+ // The file f.dart has an error or warning. |
+ // So, its analysis will have higher priority. |
+ expect(driver.fsState.getFileForPath(f).hasErrorOrWarning, isTrue); |
+ |
+ allResults.clear(); |
+ |
+ // Update a.dart with changing its API signature. |
+ provider.updateFile(b, 'class A {}'); |
+ driver.changeFile(b); |
+ await scheduler.waitForIdle(); |
+ |
+ List<String> analyzedPaths = allResults.map((r) => r.path).toList(); |
+ |
+ // The changed file must be the first. |
+ expect(analyzedPaths[0], b); |
+ |
+ // Then the file that imports the changed file. |
+ expect(analyzedPaths[1], d); |
+ |
+ // Then the file that has an error (even if it is unrelated). |
+ expect(analyzedPaths[2], f); |
+ } |
+ |
+ test_results_order_allChangedFirst_thenImports() async { |
+ var a = _p('/test/lib/a.dart'); |
+ var b = _p('/test/lib/b.dart'); |
+ var c = _p('/test/lib/c.dart'); |
+ var d = _p('/test/lib/d.dart'); |
+ var e = _p('/test/lib/e.dart'); |
+ provider.newFile(a, 'class A {}'); |
+ provider.newFile(b, 'class B {}'); |
+ provider.newFile(c, ''); |
+ provider.newFile(d, "import 'a.dart';"); |
+ provider.newFile(e, "import 'b.dart';"); |
+ |
+ driver.addFile(a); |
+ driver.addFile(b); |
+ driver.addFile(c); |
+ driver.addFile(d); |
+ driver.addFile(e); |
+ await scheduler.waitForIdle(); |
+ |
+ allResults.clear(); |
+ |
+ // Change b.dart and then a.dart files. |
+ // So, a.dart and b.dart should be analyzed first. |
+ // Then d.dart and e.dart because they import a.dart and b.dart files. |
+ provider.updateFile(a, 'class A2 {}'); |
+ provider.updateFile(b, 'class B2 {}'); |
+ driver.changeFile(b); |
+ driver.changeFile(a); |
+ await scheduler.waitForIdle(); |
+ |
+ List<String> analyzedPaths = allResults.map((r) => r.path).toList(); |
+ |
+ // The changed files must be the first. |
+ expect(analyzedPaths[0], a); |
+ expect(analyzedPaths[1], b); |
+ |
+ // Then the file that imports the changed file. |
+ expect(analyzedPaths[2], d); |
+ expect(analyzedPaths[3], e); |
+ } |
+ |
test_results_priority() async { |
String content = 'int f() => 42;'; |
addTestFile(content, priority: true); |