Skip to content

Commit e2c837b

Browse files
authored
Notify the analyzer of deleted files (#3584)
Related to dart-lang/source_gen#682. Deleted files were never getting a changeFile call and so they were still available in the analyzer. This exposed in particular old generated part files to subsequent builds which could cause weird errors.
1 parent bbd32a1 commit e2c837b

File tree

4 files changed

+53
-1
lines changed

4 files changed

+53
-1
lines changed

build_resolvers/CHANGELOG.md

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.4.1-wip
2+
3+
- Fix an issue where deleted files were not removed from the analysis engine,
4+
and were still accessible via the analyzer apis.
5+
16
## 2.4.0
27

38
- Deprecate the unnamed `AnalyzerResolvers` constructor, an replace it with the

build_resolvers/lib/src/build_asset_uri_resolver.dart

+1
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class BuildAssetUriResolver extends UriResolver {
137137
_cachedAssetDigests.remove(id);
138138
if (resourceProvider.getFile(path).exists) {
139139
resourceProvider.deleteFile(path);
140+
_needsChangeFile.add(path);
140141
}
141142
return _AssetState(path, const {});
142143
}

build_resolvers/pubspec.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: build_resolvers
2-
version: 2.4.0
2+
version: 2.4.1-wip
33
description: Resolve Dart code in a Builder
44
repository: https://github.com/dart-lang/build/tree/master/build_resolvers
55

build_resolvers/test/resolver_test.dart

+46
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,52 @@ void main() {
297297
}, resolvers: resolvers);
298298
});
299299

300+
test('handles removing deleted parts', () async {
301+
var resolvers = AnalyzerResolvers();
302+
await resolveSources({
303+
'a|web/main.dart': '''
304+
part 'main.g.dart';
305+
306+
class A implements B {}
307+
''',
308+
'a|web/main.g.dart': '''
309+
part of 'main.dart';
310+
class B {}
311+
''',
312+
}, (resolver) async {
313+
var lib = await resolver.libraryFor(entryPoint);
314+
var clazz = lib.getClass('A');
315+
expect(clazz, isNotNull);
316+
expect(clazz!.interfaces, hasLength(1));
317+
expect(clazz.interfaces.first.getDisplayString(withNullability: false),
318+
'B');
319+
}, resolvers: resolvers);
320+
321+
// `resolveSources` actually completes prior to the build step being
322+
// done, which causes this `reset` call to fail. After a few microtasks
323+
// it succeeds though.
324+
var tries = 0;
325+
while (tries++ < 5) {
326+
await Future.value(null);
327+
try {
328+
resolvers.reset();
329+
} catch (_) {}
330+
}
331+
332+
await resolveSources({
333+
'a|web/main.dart': '''
334+
part 'main.g.dart';
335+
336+
class A implements B {}
337+
''',
338+
}, (resolver) async {
339+
var lib = await resolver.libraryFor(entryPoint);
340+
var clazz = lib.getClass('A');
341+
expect(clazz, isNotNull);
342+
expect(clazz!.interfaces, isEmpty);
343+
}, resolvers: resolvers);
344+
});
345+
300346
test('should list all libraries', () {
301347
return resolveSources({
302348
'a|web/main.dart': '''

0 commit comments

Comments
 (0)