Skip to content

Commit b2d31da

Browse files
davidmorganCommit Queue
authored andcommitted
[CFE] Surface diagnostics from nested macro build.
[email protected] Change-Id: Ia8558bbc7ff92699266eb865a0eb4bf3b98b7a4c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/356520 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Morgan :) <[email protected]>
1 parent a7c57c3 commit b2d31da

File tree

4 files changed

+51
-25
lines changed

4 files changed

+51
-25
lines changed

pkg/front_end/lib/src/fasta/kernel/macro/macro.dart

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
import 'package:macros/macros.dart' as macro;
6-
import 'package:macros/src/executor.dart' as macro;
7-
import 'package:macros/src/executor/span.dart' as macro;
85
import 'package:_fe_analyzer_shared/src/macros/uri.dart';
96
import 'package:_fe_analyzer_shared/src/scanner/scanner.dart';
107
import 'package:front_end/src/fasta/uri_offset.dart';
118
import 'package:kernel/ast.dart';
129
import 'package:kernel/class_hierarchy.dart';
10+
import 'package:macros/macros.dart' as macro;
11+
import 'package:macros/src/executor.dart' as macro;
12+
import 'package:macros/src/executor/span.dart' as macro;
1313

1414
import '../../../api_prototype/compiler_options.dart';
1515
import '../../../base/common.dart';
@@ -551,22 +551,34 @@ class MacroApplications {
551551
try {
552552
benchmarker?.beginSubdivide(BenchmarkSubdivides
553553
.macroApplications_macroExecutorInstantiateMacro);
554-
macro.MacroInstanceIdentifier instance =
555-
application.instanceIdentifier = instanceIdCache[
556-
application] ??=
557-
// TODO: Dispose of these instances using
558-
// `macroExecutor.disposeMacro` once we are done with them.
559-
await macroExecutor.instantiateMacro(
560-
libraryUri,
561-
macroClassName,
562-
application.constructorName,
563-
application.arguments);
564-
565-
application.phasesToExecute = macro.Phase.values.where((phase) {
566-
return instance.shouldExecute(targetDeclarationKind, phase);
567-
}).toSet();
568-
569-
if (!instance.supportsDeclarationKind(targetDeclarationKind)) {
554+
macro.MacroInstanceIdentifier? instance;
555+
try {
556+
instance = application.instanceIdentifier = instanceIdCache[
557+
application] ??=
558+
// TODO: Dispose of these instances using
559+
// `macroExecutor.disposeMacro` once we are done with them.
560+
await macroExecutor.instantiateMacro(
561+
libraryUri,
562+
macroClassName,
563+
application.constructorName,
564+
application.arguments);
565+
} catch (_) {
566+
applicationData.libraryBuilder.addProblem(
567+
messageUnsupportedMacroApplication,
568+
application.uriOffset.fileOffset,
569+
noLength,
570+
application.uriOffset.uri);
571+
}
572+
573+
application.phasesToExecute = instance == null
574+
? {}
575+
: macro.Phase.values.where((phase) {
576+
return instance!
577+
.shouldExecute(targetDeclarationKind, phase);
578+
}).toSet();
579+
580+
if (instance != null &&
581+
!instance.supportsDeclarationKind(targetDeclarationKind)) {
570582
Iterable<macro.DeclarationKind> supportedKinds = macro
571583
.DeclarationKind.values
572584
.where(instance.supportsDeclarationKind);

pkg/front_end/lib/src/kernel_generator_impl.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ Future<Map<Uri, ExecutorFactoryToken>?> precompileMacros(
321321
return null;
322322
}
323323

324-
Future<Map<Uri, ExecutorFactoryToken>> _compileMacros(
324+
Future<Map<Uri, ExecutorFactoryToken>?> _compileMacros(
325325
NeededPrecompilations neededPrecompilations,
326326
ProcessedOptions options) async {
327327
CompilerOptions rawOptions = options.rawOptionsForTesting;
@@ -362,11 +362,22 @@ Future<Map<Uri, ExecutorFactoryToken>> _compileMacros(
362362
MemoryFileSystem fs = new MemoryFileSystem(_defaultDir);
363363
fs.entityForUri(uri).writeAsStringSync(
364364
bootstrapMacroIsolate(macroDeclarations, SerializationMode.byteData));
365-
366365
precompilationOptions
367366
..fileSystem = new HybridFileSystem(fs, options.fileSystem);
367+
368+
// Surface diagnostics in the outer compile, failing the build if the macro
369+
// build fails.
370+
bool failed = false;
371+
precompilationOptions.onDiagnostic = (diagnostic) {
372+
options.rawOptionsForTesting.onDiagnostic!(diagnostic);
373+
if (diagnostic.severity == Severity.error) {
374+
failed = true;
375+
}
376+
};
377+
368378
CompilerResult? compilerResult =
369379
await kernelForProgramInternal(uri, precompilationOptions);
380+
if (failed) return null;
370381
Uri precompiledUri = await options.macroSerializer
371382
.createUriForComponent(compilerResult!.component!);
372383
Set<Uri> macroLibraries =

pkg/front_end/test/macros/application/data/tests/cycle4.expect

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,13 @@ import "org-dartlang-test:///a/b/c/main_lib.dart";
77
static method method() → dynamic {}
88

99
library;
10+
//
11+
// Problems in library:
12+
//
13+
// org-dartlang-test:///a/b/c/main_lib.dart:15:2: Error: This macro application didn't apply correctly.
14+
// @Macro() // Error
15+
// ^
16+
//
1017
import self as self2;
1118
import "dart:core" as core;
1219
import "package:_macros/src/api.dart" as api;

pkg/front_end/test/macros/application/data/tests/cycle4/main.dart

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@
22
// for details. All rights reserved. Use of this source code is governed by a
33
// BSD-style license that can be found in the LICENSE file.
44

5-
/*library:
6-
Declarations Order:
7-
method:Macro.new()*/
8-
95
import 'dart:async';
106
import 'main_lib.dart';
117

0 commit comments

Comments
 (0)