@@ -14,7 +14,7 @@ import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
1414import 'package:analyzer/src/generated/sdk.dart' ;
1515import 'package:analyzer/src/generated/source.dart' hide CustomUriResolver;
1616import 'package:analyzer/src/summary/package_bundle_reader.dart'
17- show InSummaryUriResolver, SummaryDataStore;
17+ show InSummarySource, InSummaryUriResolver, SummaryDataStore;
1818import 'package:args/args.dart' show ArgParser, ArgResults;
1919import 'package:cli_util/cli_util.dart' show getSdkPath;
2020import 'package:path/path.dart' as path;
@@ -40,10 +40,14 @@ class AnalyzerOptions {
4040 /// The default analysis root.
4141 String analysisRoot = path.current;
4242
43+ // May be null.
44+ final DependencyTracker dependencyTracker;
45+
4346 AnalyzerOptions ._(
4447 {this .contextBuilderOptions,
4548 String dartSdkPath,
46- this .customUrlMappings = const {}})
49+ this .customUrlMappings = const {},
50+ this .dependencyTracker})
4751 : dartSdkPath = dartSdkPath ?? getSdkPath () {
4852 contextBuilderOptions.declaredVariables ?? = const {};
4953 }
@@ -69,12 +73,16 @@ class AnalyzerOptions {
6973 // For building the SDK, we explicitly set the path to none.
7074 if (dartSdkSummaryPath == 'build' ) dartSdkSummaryPath = null ;
7175 contextOpts.dartSdkSummaryPath = dartSdkSummaryPath;
76+ var summaryDepsOutput = args['summary-deps-output' ] as String ;
77+ var dependencyTracker =
78+ summaryDepsOutput != null ? DependencyTracker (summaryDepsOutput) : null ;
7279
7380 return AnalyzerOptions ._(
7481 contextBuilderOptions: contextOpts,
7582 dartSdkPath: dartSdkPath,
7683 customUrlMappings:
77- _parseUrlMappings (args['url-mapping' ] as List <String >));
84+ _parseUrlMappings (args['url-mapping' ] as List <String >),
85+ dependencyTracker: dependencyTracker);
7886 }
7987
8088 static void addArguments (ArgParser parser, {bool hide = true }) {
@@ -126,7 +134,14 @@ SourceFactory createSourceFactory(AnalyzerOptions options,
126134 .add (CustomUriResolver (resourceProvider, options.customUrlMappings));
127135 }
128136 if (summaryData != null ) {
129- resolvers.add (InSummaryUriResolver (resourceProvider, summaryData));
137+ UriResolver summaryResolver =
138+ InSummaryUriResolver (resourceProvider, summaryData);
139+ if (options.dependencyTracker != null ) {
140+ // Wrap summaryResolver.
141+ summaryResolver = TrackingInSummaryUriResolver (
142+ summaryResolver, options.dependencyTracker);
143+ }
144+ resolvers.add (summaryResolver);
130145 }
131146
132147 var fileResolvers = options.fileResolvers ?? createFileResolvers (options);
@@ -160,3 +175,34 @@ Map<String, String> _parseUrlMappings(List<String> argument) {
160175 }
161176 return mappings;
162177}
178+
179+ /// A set of path strings read during the build.
180+ class DependencyTracker {
181+ final _dependencies = Set <String >();
182+
183+ /// The path to the file to create once tracking is done.
184+ final String outputPath;
185+
186+ DependencyTracker (this .outputPath);
187+
188+ Iterable <String > get dependencies => _dependencies;
189+
190+ void record (String path) => _dependencies.add (path);
191+ }
192+
193+ /// Wrapper for [UriResolver] that tracks accesses to summaries.
194+ class TrackingInSummaryUriResolver extends UriResolver {
195+ final UriResolver _summaryResolver;
196+ final DependencyTracker _dependencyTracker;
197+
198+ TrackingInSummaryUriResolver (this ._summaryResolver, this ._dependencyTracker);
199+
200+ @override
201+ Source resolveAbsolute (Uri uri, [Uri actualUri]) {
202+ var source = _summaryResolver.resolveAbsolute (uri, actualUri);
203+ if (source != null && source is InSummarySource ) {
204+ _dependencyTracker.record (source.summaryPath);
205+ }
206+ return source;
207+ }
208+ }
0 commit comments