Skip to content

Commit b1fbe0c

Browse files
joshualittCommit Bot
authored andcommitted
[dart2js] Support running modular analysis alongside building a dill.
Change-Id: If10385445c5f6267e2de20b090b37e1741b7ace7 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/237925 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Sigmund Cherem <[email protected]> Commit-Queue: Joshua Litt <[email protected]>
1 parent 818f886 commit b1fbe0c

File tree

13 files changed

+301
-125
lines changed

13 files changed

+301
-125
lines changed

pkg/compiler/lib/src/commandline_options.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ class Flags {
112112
static const String reportAllMetrics = '--report-all-metrics';
113113

114114
static const String dillDependencies = '--dill-dependencies';
115+
static const String sources = '--sources';
115116
static const String readData = '--read-data';
116117
static const String writeData = '--write-data';
117118
static const String noClosedWorldInData = '--no-closed-world-in-data';

pkg/compiler/lib/src/dart2js.dart

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ Future<api.CompilationResult> compile(List<String> argv,
133133
bool showWarnings;
134134
bool showHints;
135135
bool enableColors;
136+
List<Uri> sources;
136137
int optimizationLevel = null;
137138
Uri platformBinaries;
138139
Map<String, String> environment = Map<String, String>();
@@ -289,11 +290,12 @@ Future<api.CompilationResult> compile(List<String> argv,
289290
Uri.base.resolve(extractPath(argument, isDirectory: true));
290291
}
291292

292-
void setUriList(String flag, String argument) {
293+
List<Uri> setUriList(String flag, String argument) {
293294
String list = extractParameter(argument);
294-
String uriList = list.splitMapJoin(',',
295-
onMatch: (_) => ',', onNonMatch: (p) => '${fe.nativeToUri(p)}');
295+
List<Uri> uris = list.split(',').map(fe.nativeToUri).toList();
296+
String uriList = uris.map((uri) => '$uri').join(',');
296297
options.add('${flag}=${uriList}');
298+
return uris;
297299
}
298300

299301
void setModularAnalysisInputs(String argument) {
@@ -361,6 +363,10 @@ Future<api.CompilationResult> compile(List<String> argv,
361363
setUriList(Flags.dillDependencies, argument);
362364
}
363365

366+
void setSources(String argument) {
367+
sources = setUriList(Flags.sources, argument);
368+
}
369+
364370
void setCfeOnly(String argument) {
365371
if (writeStrategy == WriteStrategy.toModularAnalysis) {
366372
fail("Cannot use ${Flags.cfeOnly} "
@@ -547,6 +553,7 @@ Future<api.CompilationResult> compile(List<String> argv,
547553
OptionHandler('--library-root=.+', ignoreOption),
548554
OptionHandler('--libraries-spec=.+', setLibrarySpecificationUri),
549555
OptionHandler('${Flags.dillDependencies}=.+', setDillDependencies),
556+
OptionHandler('${Flags.sources}=.+', setSources),
550557
OptionHandler('${Flags.readModularAnalysis}=.+', setModularAnalysisInputs),
551558
OptionHandler(
552559
'${Flags.writeModularAnalysis}|${Flags.writeModularAnalysis}=.+',
@@ -761,7 +768,10 @@ Future<api.CompilationResult> compile(List<String> argv,
761768
helpAndExit(wantHelp, wantVersion, diagnosticHandler.verbose);
762769
}
763770

764-
if (arguments.isEmpty && entryUri == null && inputDillUri == null) {
771+
if (arguments.isEmpty &&
772+
entryUri == null &&
773+
inputDillUri == null &&
774+
sources == null) {
765775
helpAndFail('No Dart file specified.');
766776
}
767777

@@ -787,8 +797,11 @@ Future<api.CompilationResult> compile(List<String> argv,
787797
}
788798

789799
// Make [scriptName] a relative path..
790-
String scriptName =
791-
fe.relativizeUri(Uri.base, inputDillUri ?? entryUri, Platform.isWindows);
800+
String scriptName = sources == null
801+
? fe.relativizeUri(Uri.base, inputDillUri ?? entryUri, Platform.isWindows)
802+
: sources
803+
.map((uri) => fe.relativizeUri(Uri.base, uri, Platform.isWindows))
804+
.join(',');
792805

793806
switch (writeStrategy) {
794807
case WriteStrategy.toJs:

pkg/compiler/lib/src/options.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ class CompilerOptions implements DiagnosticOptions {
171171
Uri? get compilationTarget => inputDillUri ?? entryUri;
172172

173173
bool get fromDill {
174+
if (sources != null) return false;
174175
var targetPath = compilationTarget!.path;
175176
return targetPath.endsWith('.dill');
176177
}
@@ -191,6 +192,9 @@ class CompilerOptions implements DiagnosticOptions {
191192
/// files for linking.
192193
List<Uri>? dillDependencies;
193194

195+
/// A list of sources to compile, only used for modular analysis.
196+
List<Uri>? sources;
197+
194198
Uri? writeModularAnalysisUri;
195199

196200
/// Helper to determine if compiler is being run just for modular analysis.
@@ -676,6 +680,7 @@ class CompilerOptions implements DiagnosticOptions {
676680
..showInternalProgress = _hasOption(options, Flags.progress)
677681
..dillDependencies =
678682
_extractUriListOption(options, '${Flags.dillDependencies}')
683+
..sources = _extractUriListOption(options, '${Flags.sources}')
679684
..readProgramSplit =
680685
_extractUriOption(options, '${Flags.readProgramSplit}=')
681686
..writeModularAnalysisUri =

pkg/compiler/lib/src/phase/load_kernel.dart

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,10 @@ Future<_LoadFromKernelResult> _loadFromKernel(CompilerOptions options,
195195
class _LoadFromSourceResult {
196196
final ir.Component component;
197197
final fe.InitializedCompilerState initializedCompilerState;
198+
final List<Uri> moduleLibraries;
198199

199-
_LoadFromSourceResult(this.component, this.initializedCompilerState);
200+
_LoadFromSourceResult(
201+
this.component, this.initializedCompilerState, this.moduleLibraries);
200202
}
201203

202204
Future<_LoadFromSourceResult> _loadFromSource(
@@ -215,21 +217,36 @@ Future<_LoadFromSourceResult> _loadFromSource(
215217
reportFrontEndMessage(reporter, message);
216218
}
217219
};
218-
fe.CompilerOptions feOptions = fe.CompilerOptions()
219-
..target = target
220-
..librariesSpecificationUri = options.librariesSpecificationUri
221-
..packagesFileUri = options.packageConfig
222-
..explicitExperimentalFlags = options.explicitExperimentalFlags
223-
..verbose = verbose
224-
..fileSystem = fileSystem
225-
..onDiagnostic = onDiagnostic
226-
..verbosity = verbosity;
227-
Uri resolvedUri = options.compilationTarget;
228-
bool isLegacy = await fe.uriUsesLegacyLanguageVersion(resolvedUri, feOptions);
229-
_inferNullSafetyMode(options, !isLegacy);
230220

221+
// If we are passed a list of sources, then we are performing a modular
222+
// compile. In this case, we cannot infer null safety from the source files
223+
// and must instead rely on the options passed in on the command line.
224+
bool isModularCompile = false;
225+
List<Uri> sources = [];
226+
if (options.sources != null) {
227+
isModularCompile = true;
228+
sources.addAll(options.sources);
229+
} else {
230+
fe.CompilerOptions feOptions = fe.CompilerOptions()
231+
..target = target
232+
..librariesSpecificationUri = options.librariesSpecificationUri
233+
..packagesFileUri = options.packageConfig
234+
..explicitExperimentalFlags = options.explicitExperimentalFlags
235+
..verbose = verbose
236+
..fileSystem = fileSystem
237+
..onDiagnostic = onDiagnostic
238+
..verbosity = verbosity;
239+
Uri resolvedUri = options.compilationTarget;
240+
bool isLegacy =
241+
await fe.uriUsesLegacyLanguageVersion(resolvedUri, feOptions);
242+
_inferNullSafetyMode(options, !isLegacy);
243+
sources.add(options.compilationTarget);
244+
}
245+
246+
// If we are performing a modular compile, we expect the platform binary to be
247+
// supplied along with other dill dependencies.
231248
List<Uri> dependencies = [];
232-
if (options.platformBinaries != null) {
249+
if (options.platformBinaries != null && !isModularCompile) {
233250
dependencies.add(options.platformBinaries
234251
.resolve(_getPlatformFilename(options, targetName)));
235252
}
@@ -248,10 +265,17 @@ Future<_LoadFromSourceResult> _loadFromSource(
248265
options.useLegacySubtyping ? fe.NnbdMode.Weak : fe.NnbdMode.Strong,
249266
invocationModes: options.cfeInvocationModes,
250267
verbosity: verbosity);
251-
ir.Component component = await fe.compile(
252-
initializedCompilerState, verbose, fileSystem, onDiagnostic, resolvedUri);
268+
ir.Component component = await fe.compile(initializedCompilerState, verbose,
269+
fileSystem, onDiagnostic, sources, isModularCompile);
253270
_validateNullSafetyMode(options);
254-
return _LoadFromSourceResult(component, initializedCompilerState);
271+
272+
// We have to compute canonical names on the component here to avoid missing
273+
// canonical names downstream.
274+
if (isModularCompile) {
275+
component.computeCanonicalNames();
276+
}
277+
return _LoadFromSourceResult(
278+
component, initializedCompilerState, isModularCompile ? sources : []);
255279
}
256280

257281
Output _createOutput(
@@ -336,6 +360,7 @@ Future<Output> run(Input input) async {
336360
reporter, input.initializedCompilerState, targetName);
337361
component = result.component;
338362
initializedCompilerState = result.initializedCompilerState;
363+
moduleLibraries = result.moduleLibraries;
339364
}
340365
if (component == null) return null;
341366
if (input.forceSerialization) {

pkg/compiler/test/end_to_end/no_platform_test.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ main() {
3030
(fe.DiagnosticMessage message) {
3131
message.plainTextFormatted.forEach(print);
3232
Expect.notEquals(fe.Severity.error, message.severity);
33-
}, Uri.base.resolve('pkg/compiler/test/end_to_end/data/hello_world.dart'));
33+
}, [Uri.base.resolve('pkg/compiler/test/end_to_end/data/hello_world.dart')],
34+
false);
3435
Expect.isNotNull(new ir.CoreTypes(component).futureClass);
3536
}
3637

pkg/compiler/tool/modular_test_suite.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ main(List<String> args) async {
2121
options,
2222
IOPipeline([
2323
OutlineDillCompilationStep(),
24-
FullDillCompilationStep(),
24+
FullDillCompilationStep(onlyOnSdk: true),
25+
ModularAnalysisStep(onlyOnSdk: true),
2526
ModularAnalysisStep(),
2627
ConcatenateDillsStep(useModularAnalysis: true),
2728
ComputeClosedWorldStep(useModularAnalysis: true),

0 commit comments

Comments
 (0)