[CFE] Use resolved package config for macros.
Otherwise, you have to pass an explicit package config to use macros via "dart run" and "dart compile".
R=johnniwinther@google.com
Change-Id: I20c17442dfe12dfb085cc1832419beebc3cbd129
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/347340
Reviewed-by: Johnni Winther <johnniwinther@google.com>
Auto-Submit: Morgan :) <davidmorgan@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index 6c4385a..a2e38ab 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -152,6 +152,14 @@
Uri? get packagesUriRaw => _raw.packagesFileUri;
+ Uri? _resolvedPackagesFileUri;
+
+ /// The packages file used for this compile, if there is one.
+ Future<Uri?> resolvePackagesFileUri() async {
+ await _getPackages();
+ return _resolvedPackagesFileUri;
+ }
+
bool get verbose => _raw.verbose;
bool get verify => _raw.verify;
@@ -523,6 +531,7 @@
if (_packages != null) return _packages!;
_packagesUri = null;
if (_raw.packagesFileUri != null) {
+ _resolvedPackagesFileUri = _raw.packagesFileUri;
return _packages = await createPackagesFromFile(_raw.packagesFileUri!);
}
@@ -685,7 +694,10 @@
parentDir = dir.resolve('..');
}
- if (candidate != null) return await createPackagesFromFile(candidate);
+ if (candidate != null) {
+ _resolvedPackagesFileUri = candidate;
+ return await createPackagesFromFile(candidate);
+ }
return PackageConfig.empty;
}
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 9705f0e..9038ab8 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -302,8 +302,7 @@
if (options.rawOptionsForTesting.macroTarget != null) {
// TODO(johnniwinther): Assert that some works has been done.
// TODO(johnniwinther): Stop in case of compile-time errors.
- return await _compileMacros(
- neededPrecompilations, options.rawOptionsForTesting);
+ return await _compileMacros(neededPrecompilations, options);
}
} else {
throw new UnsupportedError('Macro precompilation is not supported');
@@ -314,23 +313,27 @@
Future<Map<Uri, ExecutorFactoryToken>> _compileMacros(
NeededPrecompilations neededPrecompilations,
- CompilerOptions options) async {
- assert(options.macroSerializer != null);
+ ProcessedOptions options) async {
+ CompilerOptions rawOptions = options.rawOptionsForTesting;
+ assert(rawOptions.macroSerializer != null);
CompilerOptions precompilationOptions = new CompilerOptions();
- precompilationOptions.target = options.macroTarget;
+ precompilationOptions.target = rawOptions.macroTarget;
precompilationOptions.explicitExperimentalFlags =
- options.explicitExperimentalFlags;
+ rawOptions.explicitExperimentalFlags;
// TODO(johnniwinther): What is the right environment when it isn't passed
// by the caller? Dart2js calls the CFE without an environment, but it's
// macros likely need them.
precompilationOptions.environmentDefines = options.environmentDefines ?? {};
- precompilationOptions.packagesFileUri = options.packagesFileUri;
+ precompilationOptions.packagesFileUri =
+ await options.resolvePackagesFileUri();
MultiMacroExecutor macroExecutor = precompilationOptions.macroExecutor =
- options.macroExecutor ??= new MultiMacroExecutor();
+ rawOptions.macroExecutor ??= new MultiMacroExecutor();
// TODO(johnniwinther): What if sdk root isn't set? How do we then get the
// right sdk?
precompilationOptions.sdkRoot = options.sdkRoot;
precompilationOptions.sdkSummary = options.sdkSummary;
+ precompilationOptions.librariesSpecificationUri =
+ options.librariesSpecificationUri;
Map<String, Map<String, List<String>>> macroDeclarations = {};
neededPrecompilations.macroDeclarations
@@ -347,7 +350,7 @@
..fileSystem = new HybridFileSystem(fs, options.fileSystem);
CompilerResult? compilerResult =
await kernelForProgramInternal(uri, precompilationOptions);
- Uri precompiledUri = await options.macroSerializer!
+ Uri precompiledUri = await options.rawOptionsForTesting.macroSerializer!
.createUriForComponent(compilerResult!.component!);
Set<Uri> macroLibraries =
neededPrecompilations.macroDeclarations.keys.toSet();