[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();