Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit e696279

Browse files
jensjohacommit-bot@chromium.org
authored andcommitted
Use import URIs when invalidating files
Fixes flutter/flutter#16368 Note that this is mostly a copy of https://dart-review.googlesource.com/c/sdk/+/48180 Change-Id: Ibdf7719d8b362a4c179fd7a4a6ab5ae7028a5429 Reviewed-on: https://dart-review.googlesource.com/50420 Commit-Queue: Jens Johansen <[email protected]> Reviewed-by: Peter von der Ahé <[email protected]>
1 parent 23c59bd commit e696279

File tree

5 files changed

+75
-38
lines changed

5 files changed

+75
-38
lines changed

pkg/front_end/lib/src/fasta/incremental_compiler.dart

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
101101
userBuilders = <Uri, LibraryBuilder>{};
102102
platformBuilders = <LibraryBuilder>[];
103103
dillLoadedData.loader.builders.forEach((uri, builder) {
104-
if (builder.fileUri.scheme == "dart") {
104+
if (builder.uri.scheme == "dart") {
105105
platformBuilders.add(builder);
106106
} else {
107107
userBuilders[uri] = builder;
@@ -110,7 +110,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
110110
if (userBuilders.isEmpty) userBuilders = null;
111111
}
112112

113-
List<Uri> invalidatedUris = this.invalidatedUris.toList();
113+
Set<Uri> invalidatedUris = this.invalidatedUris.toSet();
114114
this.invalidatedUris.clear();
115115
if (fullComponent) {
116116
invalidatedUris.add(entryPoint);
@@ -156,7 +156,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
156156
List<Library> librariesWithSdk = userCode.component.libraries;
157157
List<Library> libraries = <Library>[];
158158
for (Library lib in librariesWithSdk) {
159-
if (lib.fileUri.scheme == "dart") continue;
159+
if (lib.importUri.scheme == "dart") continue;
160160
libraries.add(lib);
161161
break;
162162
}
@@ -199,20 +199,20 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
199199
IncrementalCompilerData data) {
200200
Map<Uri, Library> libraryMap = <Uri, Library>{};
201201
for (Library library in libraries) {
202-
libraryMap[library.fileUri] = library;
202+
libraryMap[library.importUri] = library;
203203
}
204204
List<Uri> worklist = new List<Uri>.from(libraryMap.keys);
205-
worklist.add(mainMethod?.enclosingLibrary?.fileUri);
205+
worklist.add(mainMethod?.enclosingLibrary?.importUri);
206206
if (entry != null) {
207207
worklist.add(entry);
208208
}
209209

210210
Map<Uri, Library> potentiallyReferencedLibraries = <Uri, Library>{};
211211
for (LibraryBuilder library in reusedLibraries) {
212-
if (library.fileUri.scheme == "dart") continue;
212+
if (library.uri.scheme == "dart") continue;
213213
Library lib = library.target;
214-
potentiallyReferencedLibraries[library.fileUri] = lib;
215-
libraryMap[library.fileUri] = lib;
214+
potentiallyReferencedLibraries[library.uri] = lib;
215+
libraryMap[library.uri] = lib;
216216
}
217217

218218
LibraryGraph graph = new LibraryGraph(libraryMap);
@@ -325,45 +325,52 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
325325
}
326326

327327
List<LibraryBuilder> computeReusedLibraries(
328-
Iterable<Uri> invalidatedUris, UriTranslator uriTranslator) {
328+
Set<Uri> invalidatedUris, UriTranslator uriTranslator) {
329329
if (userCode == null && userBuilders == null) {
330330
return <LibraryBuilder>[];
331331
}
332332

333-
// [invalidatedUris] converted to a set.
334-
Set<Uri> invalidatedFileUris = invalidatedUris.toSet();
335-
336333
// Maps all non-platform LibraryBuilders from their import URI.
337334
Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
338335

339336
// Invalidated URIs translated back to their import URI (package:, dart:,
340337
// etc.).
341338
List<Uri> invalidatedImportUris = <Uri>[];
342339

340+
bool isInvalidated(Uri importUri, Uri fileUri) {
341+
if (invalidatedUris.contains(importUri) ||
342+
(importUri != fileUri && invalidatedUris.contains(fileUri))) {
343+
return true;
344+
}
345+
if (importUri.scheme == "package" &&
346+
uriTranslator.translate(importUri, false) != fileUri) {
347+
return true;
348+
}
349+
return false;
350+
}
351+
343352
// Compute [builders] and [invalidatedImportUris].
344353
addBuilderAndInvalidateUris(Uri uri, LibraryBuilder library,
345354
[bool recursive = true]) {
346355
builders[uri] = library;
347-
if (invalidatedFileUris.contains(uri) ||
348-
(uri != library.fileUri &&
349-
invalidatedFileUris.contains(library.fileUri)) ||
350-
(library is DillLibraryBuilder &&
351-
uri != library.library.fileUri &&
352-
invalidatedFileUris.contains(library.library.fileUri)) ||
353-
(library.uri.scheme == "package" &&
354-
uriTranslator.translate(library.uri, false) !=
355-
library.target.fileUri)) {
356+
if (isInvalidated(uri, library.target.fileUri)) {
356357
invalidatedImportUris.add(uri);
357358
}
358-
if (!recursive) return;
359359
if (library is SourceLibraryBuilder) {
360360
for (LibraryBuilder part in library.parts) {
361-
addBuilderAndInvalidateUris(part.uri, part, false);
361+
if (isInvalidated(part.uri, part.fileUri)) {
362+
invalidatedImportUris.add(part.uri);
363+
builders[part.uri] = part;
364+
}
362365
}
363366
} else if (library is DillLibraryBuilder) {
364-
for (LibraryPart part in library.library.parts) {
367+
for (LibraryPart part in library.target.parts) {
365368
Uri partUri = library.uri.resolve(part.partUri);
366-
addBuilderAndInvalidateUris(partUri, library, false);
369+
Uri fileUri = library.library.fileUri.resolve(part.partUri);
370+
if (isInvalidated(partUri, fileUri)) {
371+
invalidatedImportUris.add(partUri);
372+
builders[partUri] = library;
373+
}
367374
}
368375
}
369376
}
@@ -417,7 +424,10 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
417424
List<LibraryBuilder> result = <LibraryBuilder>[];
418425
for (LibraryBuilder builder in builders.values) {
419426
if (builder.isPart) continue;
420-
if (!seenUris.add(builder.fileUri)) continue;
427+
// TODO(jensj/ahe): This line can probably go away once
428+
// https://dart-review.googlesource.com/47442 lands.
429+
if (builder.isPatch) continue;
430+
if (!seenUris.add(builder.uri)) continue;
421431
result.add(builder);
422432
}
423433
return result;

pkg/front_end/test/incremental_load_from_dill_test.dart

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,30 @@ class RunCompilations extends Step<TestData, TestData, Context> {
117117

118118
void basicTest(Map<String, String> sourceFiles, String entryPoint, bool strong,
119119
List<String> invalidate, Directory outDir) async {
120-
Uri entryPointUri;
120+
Uri entryPointUri = outDir.uri.resolve(entryPoint);
121121
Set<String> invalidateFilenames = invalidate?.toSet() ?? new Set<String>();
122122
List<Uri> invalidateUris = <Uri>[];
123123
Uri packagesUri;
124124
for (String filename in sourceFiles.keys) {
125125
Uri uri = outDir.uri.resolve(filename);
126-
if (filename == entryPoint) entryPointUri = uri;
127-
if (invalidateFilenames.contains(filename)) invalidateUris.add(uri);
126+
if (invalidateFilenames.contains(filename)) {
127+
invalidateUris.add(uri);
128+
invalidateFilenames.remove(filename);
129+
}
128130
String source = sourceFiles[filename];
129131
if (filename == ".packages") {
130132
source = substituteVariables(source, outDir.uri);
131133
packagesUri = uri;
132134
}
133135
new File.fromUri(uri).writeAsStringSync(source);
134136
}
137+
for (String invalidateFilename in invalidateFilenames) {
138+
if (invalidateFilename.startsWith('package:')) {
139+
invalidateUris.add(Uri.parse(invalidateFilename));
140+
} else {
141+
throw "Error in test yaml: $invalidateFilename was not recognized.";
142+
}
143+
}
135144

136145
Uri output = outDir.uri.resolve("full.dill");
137146
Uri initializedOutput = outDir.uri.resolve("full_from_initialized.dill");
@@ -145,9 +154,13 @@ void basicTest(Map<String, String> sourceFiles, String entryPoint, bool strong,
145154
print("Normal compile took ${stopwatch.elapsedMilliseconds} ms");
146155

147156
stopwatch.reset();
157+
options = getOptions(strong);
158+
if (packagesUri != null) {
159+
options.packagesFileUri = packagesUri;
160+
}
148161
bool initializedResult = await initializedCompile(
149162
entryPointUri, initializedOutput, output, invalidateUris,
150-
options: getOptions(strong));
163+
options: options);
151164
print("Initialized compile(s) from ${output.pathSegments.last} "
152165
"took ${stopwatch.elapsedMilliseconds} ms");
153166
Expect.isTrue(initializedResult);
@@ -249,7 +262,8 @@ void newWorldTest(bool strong, List worlds) async {
249262
}
250263

251264
Stopwatch stopwatch = new Stopwatch()..start();
252-
Component component = await compiler.computeDelta(fullComponent: true);
265+
Component component = await compiler.computeDelta(
266+
fullComponent: brandNewWorld ? false : true);
253267
if (world["errors"] == true && !gotError) {
254268
throw "Expected error, but didn't get any.";
255269
} else if (world["errors"] != true && gotError) {
@@ -278,7 +292,7 @@ void newWorldTest(bool strong, List worlds) async {
278292
if (world["checkInvalidatedFiles"] != false) {
279293
if (world["invalidate"] != null) {
280294
Expect.equals(world["invalidate"].length,
281-
compiler.invalidatedImportUrisForTesting.length);
295+
compiler.invalidatedImportUrisForTesting?.length ?? 0);
282296
List expectedInvalidatedUri = world["expectedInvalidatedUri"];
283297
if (expectedInvalidatedUri != null) {
284298
Expect.setEquals(
@@ -357,6 +371,12 @@ Future<bool> initializedCompile(
357371
throwOnEmptyMixinBodies(initializedComponent);
358372
bool result = compiler.initializedFromDill;
359373
await writeComponentToFile(initializedComponent, output);
374+
int actuallyInvalidatedCount =
375+
compiler.invalidatedImportUrisForTesting?.length ?? 0;
376+
if (result && actuallyInvalidatedCount < invalidateUris.length) {
377+
Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
378+
"got $actuallyInvalidatedCount");
379+
}
360380

361381
var initializedComponent2 = await compiler.computeDelta(fullComponent: true);
362382
throwOnEmptyMixinBodies(initializedComponent2);
@@ -371,6 +391,13 @@ Future<bool> initializedCompile(
371391

372392
var partialComponent = await compiler.computeDelta();
373393
throwOnEmptyMixinBodies(partialComponent);
394+
actuallyInvalidatedCount =
395+
(compiler.invalidatedImportUrisForTesting?.length ?? 0);
396+
if (actuallyInvalidatedCount < invalidateUris.length) {
397+
Expect.fail("Expected at least ${invalidateUris.length} invalidated uris, "
398+
"got $actuallyInvalidatedCount");
399+
}
400+
374401
var emptyComponent = await compiler.computeDelta();
375402
throwOnEmptyMixinBodies(emptyComponent);
376403

@@ -384,6 +411,7 @@ Future<bool> initializedCompile(
384411
Expect.isTrue(fullLibUris.length > partialLibUris.length ||
385412
partialLibUris.length == invalidateUris.length);
386413
Expect.isTrue(partialLibUris.isNotEmpty || invalidateUris.isEmpty);
414+
387415
Expect.isTrue(emptyLibUris.isEmpty);
388416

389417
return result;
@@ -417,7 +445,7 @@ String substituteVariables(String source, Uri base) {
417445
}
418446

419447
class TestIncrementalCompiler extends IncrementalCompiler {
420-
List<Uri> invalidatedImportUrisForTesting;
448+
Set<Uri> invalidatedImportUrisForTesting;
421449

422450
TestIncrementalCompiler(CompilerOptions options, Uri entryPoint,
423451
[Uri initializeFrom])
@@ -428,6 +456,6 @@ class TestIncrementalCompiler extends IncrementalCompiler {
428456

429457
@override
430458
void recordInvalidatedImportUrisForTesting(List<Uri> uris) {
431-
invalidatedImportUrisForTesting = uris.isEmpty ? null : uris.toList();
459+
invalidatedImportUrisForTesting = uris.isEmpty ? null : uris.toSet();
432460
}
433461
}

pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_file.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ type: basic
88
entry: "package:dummy/main.dart"
99
strong: false
1010
invalidate:
11+
- b.dart
1112
sources:
1213
main.dart: |
1314
part "b.dart";

pkg/front_end/testcases/incremental_initialize_from_dill/invalidate_package_part_as_package.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
# for details. All rights reserved. Use of this source code is governed by a
33
# BSD-style license that can be found in the LICENSE.md file.
44

5-
# Test that invalidating a part of a package works with file URI.
5+
# Test that invalidating a part of a package works with package URI.
66

77
type: basic
88
entry: "package:dummy/main.dart"
99
strong: false
1010
invalidate:
11+
- "package:dummy/b.dart"
1112
sources:
1213
main.dart: |
1314
part "b.dart";

pkg/front_end/testcases/incremental_initialize_from_dill/status.status

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,4 @@
55
# Status file for the test suite ../test/incremental_load_from_dill_yaml_test.dart.
66

77
calculated_bounds_no_strongmode: Crash
8-
invalidate_package_part: Crash
9-
invalidate_package_part_as_file: Crash
10-
invalidate_package_part_as_package: Crash
118
strongmode_mixins_2: Crash

0 commit comments

Comments
 (0)