Skip to content

Commit 0e9957c

Browse files
Markzipancommit-bot@chromium.org
authored andcommitted
[dartdevc] Adding support for analyzer dep pruning
Courtesy of Morgan and Emmanuel: https://critique.corp.google.com/#review/255926209 Change-Id: If9981d7b0eede150caed481d0c9f1d9027419ec6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/107924 Commit-Queue: Mark Zhou <[email protected]> Reviewed-by: Nate Bosch <[email protected]>
1 parent c100308 commit 0e9957c

2 files changed

Lines changed: 59 additions & 4 deletions

File tree

‎pkg/dev_compiler/lib/src/analyzer/context.dart‎

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
1414
import 'package:analyzer/src/generated/sdk.dart';
1515
import 'package:analyzer/src/generated/source.dart' hide CustomUriResolver;
1616
import 'package:analyzer/src/summary/package_bundle_reader.dart'
17-
show InSummaryUriResolver, SummaryDataStore;
17+
show InSummarySource, InSummaryUriResolver, SummaryDataStore;
1818
import 'package:args/args.dart' show ArgParser, ArgResults;
1919
import 'package:cli_util/cli_util.dart' show getSdkPath;
2020
import '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+
}

‎pkg/dev_compiler/lib/src/analyzer/module_compiler.dart‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ JSModuleFile compileWithAnalyzer(
117117
}
118118
}
119119

120+
if (analyzerOptions.dependencyTracker != null) {
121+
var file = File(analyzerOptions.dependencyTracker.outputPath);
122+
file.writeAsStringSync(
123+
(analyzerOptions.dependencyTracker.dependencies.toList()..sort()).join('\n'));
124+
}
125+
120126
var jsModule = JSModuleFile(
121127
errors.formattedErrors.toList(), options, jsProgram, driver.summaryBytes);
122128
return jsModule;
@@ -205,6 +211,9 @@ class CompilerOptions extends SharedCompilerOptions {
205211
hide: hide)
206212
..addOption('summary-out',
207213
help: 'location to write the summary file', hide: hide)
214+
..addOption('summary-deps-output',
215+
help: 'Path to a file to dump summary dependency info to.',
216+
hide: hide)
208217
..addOption('module-root',
209218
help: '(deprecated) used to determine the default module name and\n'
210219
'summary import name if those are not provided.',

0 commit comments

Comments
 (0)