Version 2.16.0-137.0.dev
Merge commit 'b3a5dfa66392cdffa1c9b227947b4e4fa03a8e10' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 14682ea..204bd51 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1434,6 +1434,17 @@
}
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeConstEvalFailedAssertionWithNonStringMessage =
+ messageConstEvalFailedAssertionWithNonStringMessage;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageConstEvalFailedAssertionWithNonStringMessage =
+ const MessageCode("ConstEvalFailedAssertionWithNonStringMessage",
+ analyzerCodes: <String>["CONST_EVAL_THROWS_EXCEPTION"],
+ problemMessage:
+ r"""This assertion failed with a non-String message.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function(String nameOKEmpty)>
templateConstEvalGetterNotFound =
const Template<Message Function(String nameOKEmpty)>(
diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
index eb36433..e3f96b9 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -466,11 +466,11 @@
@override
void forEachDeclaredConstructor(
- void Function(String name, ConstructorBuilder constructorBuilder)
+ void Function(String name, SourceConstructorBuilder constructorBuilder)
callback) {
Set<String> visitedConstructorNames = {};
void callbackFilteringFieldBuilders(String name, Builder builder) {
- if (builder is ConstructorBuilder &&
+ if (builder is SourceConstructorBuilder &&
visitedConstructorNames.add(builder.name)) {
callback(name, builder);
}
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
index f53cbfa..5426ed8 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_builder.dart
@@ -50,45 +50,8 @@
import 'type_variable_builder.dart';
abstract class ConstructorBuilder implements FunctionBuilder {
- abstract Token? beginInitializers;
-
- ConstructorBuilder? get actualOrigin;
-
- ConstructorBuilder? get patchForTesting;
-
- Constructor get actualConstructor;
-
- @override
- ConstructorBuilder get origin;
-
- bool get isRedirectingGenerativeConstructor;
-
/// The [Constructor] built by this builder.
Constructor get constructor;
-
- void injectInvalidInitializer(Message message, int charOffset, int length,
- ExpressionGeneratorHelper helper);
-
- void addInitializer(Initializer initializer, ExpressionGeneratorHelper helper,
- {required InitializerInferenceResult? inferenceResult});
-
- void prepareInitializers();
-
- /// Infers the types of any untyped initializing formals.
- void inferFormalTypes();
-
- /// Registers field as being initialized by this constructor.
- ///
- /// The field can be initialized either via an initializing formal or via an
- /// entry in the constructor initializer list.
- void registerInitializedField(FieldBuilder fieldBuilder);
-
- /// Returns the fields registered as initialized by this constructor.
- ///
- /// Returns the set of fields previously registered via
- /// [registerInitializedField] and passes on the ownership of the collection
- /// to the caller.
- Set<FieldBuilder>? takeInitializedFields();
}
class SourceConstructorBuilder extends FunctionBuilderImpl
@@ -106,13 +69,10 @@
RedirectingInitializer? redirectingInitializer;
- @override
Token? beginInitializers;
- @override
- ConstructorBuilder? actualOrigin;
+ SourceConstructorBuilder? actualOrigin;
- @override
Constructor get actualConstructor => _constructor;
SourceConstructorBuilder(
@@ -172,9 +132,8 @@
Iterable<Member> get exportedMembers => [constructor];
@override
- ConstructorBuilder get origin => actualOrigin ?? this;
+ SourceConstructorBuilder get origin => actualOrigin ?? this;
- @override
ConstructorBuilder? get patchForTesting =>
dataForTesting?.patchForTesting as ConstructorBuilder?;
@@ -248,7 +207,7 @@
return _constructor;
}
- @override
+ /// Infers the types of any untyped initializing formals.
void inferFormalTypes() {
if (formals != null) {
for (FormalParameterBuilder formal in formals!) {
@@ -315,7 +274,6 @@
@override
Member get member => constructor;
- @override
void injectInvalidInitializer(Message message, int charOffset, int length,
ExpressionGeneratorHelper helper) {
List<Initializer> initializers = _constructor.initializers;
@@ -328,7 +286,6 @@
initializers.add(lastInitializer);
}
- @override
void addInitializer(Initializer initializer, ExpressionGeneratorHelper helper,
{required InitializerInferenceResult? inferenceResult}) {
List<Initializer> initializers = _constructor.initializers;
@@ -457,7 +414,6 @@
}
}
- @override
void prepareInitializers() {
// For const constructors we parse initializers already at the outlining
// stage, there is no easy way to make body building stage skip initializer
@@ -482,12 +438,19 @@
List<ClassMember> get localSetters =>
throw new UnsupportedError('${runtimeType}.localSetters');
- @override
+ /// Registers field as being initialized by this constructor.
+ ///
+ /// The field can be initialized either via an initializing formal or via an
+ /// entry in the constructor initializer list.
void registerInitializedField(FieldBuilder fieldBuilder) {
(_initializedFields ??= {}).add(fieldBuilder);
}
- @override
+ /// Returns the fields registered as initialized by this constructor.
+ ///
+ /// Returns the set of fields previously registered via
+ /// [registerInitializedField] and passes on the ownership of the collection
+ /// to the caller.
Set<FieldBuilder>? takeInitializedFields() {
Set<FieldBuilder>? result = _initializedFields;
_initializedFields = null;
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index a77692c..9c60578 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -240,7 +240,7 @@
referencesFromIndexed.lookupSetterReference(valuesName);
}
- ConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
+ SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
/* metadata = */ null,
constMask,
/* returnType = */ null,
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 44ee19e..0753eef 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -941,7 +941,7 @@
void prepareInitializers() {
FunctionBuilder member = this.member as FunctionBuilder;
scope = member.computeFormalParameterInitializerScope(scope);
- if (member is ConstructorBuilder) {
+ if (member is SourceConstructorBuilder) {
member.prepareInitializers();
if (member.formals != null) {
for (FormalParameterBuilder formal in member.formals!) {
@@ -1124,7 +1124,7 @@
}
}
}
- if (builder is ConstructorBuilder) {
+ if (builder is SourceConstructorBuilder) {
finishConstructor(builder, asyncModifier, body);
} else if (builder is ProcedureBuilder) {
builder.asyncModifier = asyncModifier;
@@ -1632,7 +1632,8 @@
}
// We are passing [AsyncMarker.Sync] because the error will be reported
// already.
- finishConstructor(member as ConstructorBuilder, AsyncMarker.Sync, null);
+ finishConstructor(
+ member as SourceConstructorBuilder, AsyncMarker.Sync, null);
}
Expression parseFieldInitializer(Token token) {
@@ -1662,8 +1663,8 @@
return annotation;
}
- void finishConstructor(
- ConstructorBuilder builder, AsyncMarker asyncModifier, Statement? body) {
+ void finishConstructor(SourceConstructorBuilder builder,
+ AsyncMarker asyncModifier, Statement? body) {
/// Quotes below are from [Dart Programming Language Specification, 4th
/// Edition](
/// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf).
@@ -6886,7 +6887,8 @@
]);
}
}
- ConstructorBuilder constructorBuilder = member as ConstructorBuilder;
+ SourceConstructorBuilder constructorBuilder =
+ member as SourceConstructorBuilder;
constructorBuilder.registerInitializedField(builder);
return builder.buildInitializer(assignmentOffset, expression,
isSynthetic: formal != null);
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index cf785bd..f9bfef4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1999,14 +1999,12 @@
statement.condition,
templateConstEvalFailedAssertionWithMessage
.withArguments(message.value));
- } else {
+ } else if (message is NullConstant) {
return createEvaluationErrorConstant(
- statement.message!,
- templateConstEvalInvalidType.withArguments(
- message,
- typeEnvironment.coreTypes.stringLegacyRawType,
- message.getType(_staticTypeContext!),
- isNonNullableByDefault));
+ statement.condition, messageConstEvalFailedAssertion);
+ } else {
+ return createEvaluationErrorConstant(statement.message!,
+ messageConstEvalFailedAssertionWithNonStringMessage);
}
}
} else {
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 27f8d35..4cf5f7e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -395,6 +395,7 @@
List<SourceClassBuilder> sourceClassBuilders =
loader.checkSemantics(objectClassBuilder);
loader.computeMacroDeclarations(sourceClassBuilders);
+ loader.computeMacroApplications();
loader.finishTypeVariables(objectClassBuilder, dynamicType);
loader.createTypeInferenceEngine();
loader.buildComponent();
@@ -416,7 +417,6 @@
loader.checkMixins(sourceClassBuilders);
loader.buildOutlineExpressions(
loader.coreTypes, synthesizedFunctionNodes);
- loader.computeMacroApplications();
loader.checkTypes();
loader.checkRedirectingFactories(sourceClassBuilders);
loader.checkMainMethods();
@@ -1153,17 +1153,17 @@
Set<FieldBuilder>? initializedFields = null;
builder.forEachDeclaredConstructor(
- (String name, ConstructorBuilder constructorBuilder) {
+ (String name, SourceConstructorBuilder constructorBuilder) {
if (constructorBuilder.isExternal) return;
// In case of duplicating constructors the earliest ones (those that
// declared towards the beginning of the file) come last in the list.
// To report errors on the first definition of a constructor, we need to
// iterate until that last element.
- ConstructorBuilder earliest = constructorBuilder;
+ SourceConstructorBuilder earliest = constructorBuilder;
Builder earliestBuilder = constructorBuilder;
while (earliestBuilder.next != null) {
earliestBuilder = earliestBuilder.next!;
- if (earliestBuilder is ConstructorBuilder) {
+ if (earliestBuilder is SourceConstructorBuilder) {
earliest = earliestBuilder;
}
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
index dd6dfb1..65a8279 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -21,11 +21,19 @@
}
class MacroApplications {
- final List<Class> macros;
+ final List<MacroApplication> macros;
MacroApplications(this.macros);
}
+class MacroApplication {
+ final Class cls;
+ final String constructorName;
+ // TODO(johnniwinther): Add support for arguments.
+
+ MacroApplication(this.cls, this.constructorName);
+}
+
class LibraryMacroApplicationData {
Map<Class, ClassMacroApplicationData> classData = {};
Map<Member, MacroApplications> memberApplications = {};
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart
new file mode 100644
index 0000000..118e001
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart
@@ -0,0 +1,1927 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:_fe_analyzer_shared/src/messages/codes.dart';
+import 'package:_fe_analyzer_shared/src/parser/parser.dart';
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+
+import '../builder/builder.dart';
+import '../builder/class_builder.dart';
+import '../builder/member_builder.dart';
+import '../builder/metadata_builder.dart';
+import '../builder/prefix_builder.dart';
+import '../scope.dart';
+import '../source/diet_parser.dart';
+import '../source/source_library_builder.dart';
+
+import 'macro.dart';
+
+List<MacroApplication>? prebuildAnnotations(
+ {required SourceLibraryBuilder enclosingLibrary,
+ required List<MetadataBuilder>? metadataBuilders,
+ required Uri fileUri,
+ required Scope scope}) {
+ if (metadataBuilders == null) return null;
+ List<MacroApplication>? result;
+ for (MetadataBuilder metadataBuilder in metadataBuilders) {
+ _MacroListener listener =
+ new _MacroListener(enclosingLibrary, fileUri, scope);
+ Parser parser = new Parser(listener,
+ useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+ parser.parseMetadata(
+ parser.syntheticPreviousToken(metadataBuilder.beginToken));
+ MacroApplication? application = listener.popMacroApplication();
+ if (application != null) {
+ result ??= [];
+ result.add(application);
+ }
+ }
+ return result;
+}
+
+class _Node {}
+
+class _UnrecognizedNode implements _Node {
+ const _UnrecognizedNode();
+}
+
+class _MacroClassNode implements _Node {
+ final Token token;
+ final ClassBuilder classBuilder;
+
+ _MacroClassNode(this.token, this.classBuilder);
+}
+
+class _MacroConstructorNode implements _Node {
+ final ClassBuilder classBuilder;
+ final String constructorName;
+
+ _MacroConstructorNode(this.classBuilder, this.constructorName);
+}
+
+class _PrefixNode implements _Node {
+ final PrefixBuilder prefixBuilder;
+
+ _PrefixNode(this.prefixBuilder);
+}
+
+class _MacroApplicationNode implements _Node {
+ final MacroApplication application;
+
+ _MacroApplicationNode(this.application);
+}
+
+class _NoArgumentsNode implements _Node {
+ const _NoArgumentsNode();
+}
+
+class _ArgumentsNode implements _Node {
+ _ArgumentsNode();
+}
+
+class _MacroListener implements Listener {
+ final SourceLibraryBuilder currentLibrary;
+
+ @override
+ final Uri uri;
+
+ final Scope scope;
+
+ final List<_Node> _stack = [];
+
+ Object? _unrecognized;
+
+ bool get unrecognized => _unrecognized != null;
+
+ void set unrecognized(bool value) {
+ if (value) {
+ // TODO(johnniwinther): Remove this when implementation is more mature.
+ _unrecognized = StackTrace.current;
+ } else {
+ _unrecognized = null;
+ }
+ }
+
+ _MacroListener(this.currentLibrary, this.uri, this.scope);
+
+ void pushUnsupported() {
+ push(const _UnrecognizedNode());
+ _unsupported();
+ }
+
+ void push(_Node node) {
+ _stack.add(node);
+ }
+
+ _Node pop() => _stack.removeLast();
+
+ MacroApplication? popMacroApplication() {
+ if (unrecognized) return null;
+ if (_stack.length != 1) return null;
+ _Node node = pop();
+ if (node is _MacroApplicationNode) {
+ return node.application;
+ }
+ return null;
+ }
+
+ @override
+ void beginMetadata(Token token) {
+ // Do nothing.
+ }
+
+ @override
+ void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
+ _Node argumentsNode = pop();
+ _Node referenceNode = pop();
+ if (!unrecognized) {
+ ClassBuilder? macroClass;
+ String? constructorName;
+ if (referenceNode is _MacroClassNode) {
+ macroClass = referenceNode.classBuilder;
+ MemberBuilder? member = referenceNode.classBuilder
+ .findConstructorOrFactory(
+ '', referenceNode.token.charOffset, uri, currentLibrary);
+ if (member != null) {
+ constructorName = '';
+ }
+ } else if (referenceNode is _MacroConstructorNode) {
+ macroClass = referenceNode.classBuilder;
+ constructorName = referenceNode.constructorName;
+ }
+ if (macroClass != null &&
+ constructorName != null &&
+ argumentsNode is _ArgumentsNode) {
+ push(new _MacroApplicationNode(
+ new MacroApplication(macroClass.cls, constructorName)));
+ return;
+ }
+ }
+ pushUnsupported();
+ }
+
+ @override
+ void handleIdentifier(Token token, IdentifierContext context) {
+ switch (context) {
+ case IdentifierContext.metadataReference:
+ Builder? builder = scope.lookup(token.lexeme, token.charOffset, uri);
+ if (builder is ClassBuilder && builder.isMacro) {
+ push(new _MacroClassNode(token, builder));
+ } else if (builder is PrefixBuilder) {
+ push(new _PrefixNode(builder));
+ } else {
+ pushUnsupported();
+ }
+ break;
+ case IdentifierContext.metadataContinuation:
+ _Node node = pop();
+ if (node is _PrefixNode) {
+ Builder? builder =
+ node.prefixBuilder.lookup(token.lexeme, token.charOffset, uri);
+ if (builder is ClassBuilder && builder.isMacro) {
+ push(new _MacroClassNode(token, builder));
+ } else {
+ pushUnsupported();
+ }
+ } else if (node is _MacroClassNode) {
+ MemberBuilder? member = node.classBuilder.findConstructorOrFactory(
+ token.lexeme, token.charOffset, uri, currentLibrary);
+ if (member != null) {
+ push(new _MacroConstructorNode(node.classBuilder, token.lexeme));
+ } else {
+ pushUnsupported();
+ }
+ } else {
+ pushUnsupported();
+ }
+ break;
+ case IdentifierContext.metadataContinuationAfterTypeArguments:
+ _Node node = pop();
+ if (node is _MacroClassNode) {
+ MemberBuilder? member = node.classBuilder.findConstructorOrFactory(
+ token.lexeme, token.charOffset, uri, currentLibrary);
+ if (member != null) {
+ push(new _MacroConstructorNode(node.classBuilder, token.lexeme));
+ } else {
+ pushUnsupported();
+ }
+ } else {
+ pushUnsupported();
+ }
+ break;
+ default:
+ pushUnsupported();
+ break;
+ }
+ }
+
+ @override
+ void beginArguments(Token token) {
+ // Do nothing.
+ }
+
+ @override
+ void endArguments(int count, Token beginToken, Token endToken) {
+ if (count == 0) {
+ push(new _ArgumentsNode());
+ } else {
+ // TODO(johnniwinther): Handle arguments.
+ pushUnsupported();
+ }
+ }
+
+ @override
+ void handleNoArguments(Token token) {
+ push(const _NoArgumentsNode());
+ }
+
+ @override
+ void handleNoTypeArguments(Token token) {
+ // TODO(johnniwinther): Handle type arguments. Ignore for now.
+ }
+
+ @override
+ void handleQualified(Token period) {
+ // Do nothing. Supported qualified names are handled through the identifier
+ // context.
+ }
+
+ //////////////////////////////////////////////////////////////////////////////
+ // Stub implementation
+ //////////////////////////////////////////////////////////////////////////////
+
+ /// Called for listener events that are expected but not supported.
+ void _unsupported() {
+ unrecognized = true;
+ }
+
+ /// Called for listener events that are unexpected.
+ void _unexpected() {
+ unrecognized = true;
+ }
+
+ /// Called for listener events that are supported but not handled yet.
+ void _unhandled() {
+ unrecognized = true;
+ }
+
+ /// Called for listener events whose use in unknown.
+ void _unknown() {
+ unrecognized = true;
+ }
+
+ /// Called for listener events that are ignored.
+ void _ignored() {}
+
+ @override
+ void beginAsOperatorType(Token operator) {
+ _unsupported();
+ }
+
+ @override
+ void beginAssert(Token assertKeyword, Assert kind) {
+ _unsupported();
+ }
+
+ @override
+ void beginAwaitExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginBinaryExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginBlock(Token token, BlockKind blockKind) {
+ _unsupported();
+ }
+
+ @override
+ void beginBlockFunctionBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginCascade(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginCaseExpression(Token caseKeyword) {
+ _unsupported();
+ }
+
+ @override
+ void beginCatchClause(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginClassDeclaration(
+ Token begin, Token? abstractToken, Token? macroToken, Token name) {
+ _unexpected();
+ }
+
+ @override
+ void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginCombinators(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginCompilationUnit(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginConditionalExpression(Token question) {
+ _unsupported();
+ }
+
+ @override
+ void beginConditionalUri(Token ifKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginConditionalUris(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginConstExpression(Token constKeyword) {
+ _unhandled();
+ }
+
+ @override
+ void beginConstLiteral(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void beginConstructorReference(Token start) {
+ _unknown();
+ }
+
+ @override
+ void beginDoWhileStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginDoWhileStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginElseStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginEnum(Token enumKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginExport(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
+ _unexpected();
+ }
+
+ @override
+ void beginExtensionDeclarationPrelude(Token extensionKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
+ Token? externalToken, Token? constToken) {
+ _unexpected();
+ }
+
+ @override
+ void beginFieldInitializer(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginFields(
+ DeclarationKind declarationKind,
+ Token? abstractToken,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ Token lastConsumed) {
+ _unexpected();
+ }
+
+ @override
+ void beginForControlFlow(Token? awaitToken, Token forToken) {
+ _unsupported();
+ }
+
+ @override
+ void beginForInBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginForInExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginForStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginForStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+ Token? covariantToken, Token? varFinalOrConst) {
+ _unsupported();
+ }
+
+ @override
+ void beginFormalParameterDefaultValueExpression() {
+ _unsupported();
+ }
+
+ @override
+ void beginFormalParameters(Token token, MemberKind kind) {
+ _unsupported();
+ }
+
+ @override
+ void beginFunctionExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginFunctionName(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginFunctionType(Token beginToken) {
+ _unhandled();
+ }
+
+ @override
+ void beginFunctionTypedFormalParameter(Token token) {
+ _unknown();
+ }
+
+ @override
+ void beginHide(Token hideKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginIfControlFlow(Token ifToken) {
+ _unsupported();
+ }
+
+ @override
+ void beginIfStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginImplicitCreationExpression(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void beginImport(Token importKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginInitializedIdentifier(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginInitializer(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginInitializers(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginIsOperatorType(Token operator) {
+ _unhandled();
+ }
+
+ @override
+ void beginLabeledStatement(Token token, int labelCount) {
+ _unsupported();
+ }
+
+ @override
+ void beginLibraryName(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginLiteralString(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void beginLiteralSymbol(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void beginLocalFunctionDeclaration(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginMember() {
+ _unexpected();
+ }
+
+ @override
+ void beginMetadataStar(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginMethod(
+ DeclarationKind declarationKind,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? varFinalOrConst,
+ Token? getOrSet,
+ Token name) {
+ _unexpected();
+ }
+
+ @override
+ void beginMixinDeclaration(Token mixinKeyword, Token name) {
+ _unexpected();
+ }
+
+ @override
+ void beginNamedFunctionExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginNamedMixinApplication(
+ Token begin, Token? abstractToken, Token? macroToken, Token name) {
+ _unexpected();
+ }
+
+ @override
+ void beginNewExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginOptionalFormalParameters(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginPart(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginPartOf(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginRedirectingFactoryBody(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginRethrowStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginReturnStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginShow(Token showKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void beginSwitchBlock(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
+ _unsupported();
+ }
+
+ @override
+ void beginSwitchStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginThenStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginTopLevelMember(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
+ _unexpected();
+ }
+
+ @override
+ void beginTryStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginTypeArguments(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void beginTypeList(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginTypeVariable(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginTypeVariables(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginTypedef(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginUncategorizedTopLevelDeclaration(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void beginVariableInitializer(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginVariablesDeclaration(
+ Token token, Token? lateToken, Token? varFinalOrConst) {
+ _unsupported();
+ }
+
+ @override
+ void beginWhileStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginWhileStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void beginYieldStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endAsOperatorType(Token operator) {
+ _unhandled();
+ }
+
+ @override
+ void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+ Token? commaToken, Token semicolonToken) {
+ _unsupported();
+ }
+
+ @override
+ void endAwaitExpression(Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endBinaryExpression(Token token) {
+ _unknown();
+ }
+
+ @override
+ void endBlock(
+ int count, Token beginToken, Token endToken, BlockKind blockKind) {
+ _unsupported();
+ }
+
+ @override
+ void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endCascade() {
+ _unsupported();
+ }
+
+ @override
+ void endCaseExpression(Token colon) {
+ _unsupported();
+ }
+
+ @override
+ void endCatchClause(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endClassDeclaration(Token beginToken, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endClassFactoryMethod(
+ Token beginToken, Token factoryKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endClassFields(
+ Token? abstractToken,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ int count,
+ Token beginToken,
+ Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endClassOrMixinOrExtensionBody(
+ DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endCombinators(int count) {
+ _unexpected();
+ }
+
+ @override
+ void endCompilationUnit(int count, Token token) {
+ _unexpected();
+ }
+
+ @override
+ void endConditionalExpression(Token question, Token colon) {
+ _unhandled();
+ }
+
+ @override
+ void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
+ _unexpected();
+ }
+
+ @override
+ void endConditionalUris(int count) {
+ _unexpected();
+ }
+
+ @override
+ void endConstExpression(Token token) {
+ _unknown();
+ }
+
+ @override
+ void endConstLiteral(Token token) {
+ _unknown();
+ }
+
+ @override
+ void endConstructorReference(Token start, Token? periodBeforeName,
+ Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+ _unknown();
+ }
+
+ @override
+ void endDoWhileStatement(
+ Token doKeyword, Token whileKeyword, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endDoWhileStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endElseStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endEnum(Token enumKeyword, Token leftBrace, int memberCount) {
+ _unexpected();
+ }
+
+ @override
+ void endEnumConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endEnumFactoryMethod(
+ Token beginToken, Token factoryKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endEnumFields(
+ Token? abstractToken,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ int count,
+ Token beginToken,
+ Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endEnumMethod(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endExport(Token exportKeyword, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void endExtensionConstructor(Token? getOrSet, Token beginToken,
+ Token beginParam, Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
+ Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endExtensionFactoryMethod(
+ Token beginToken, Token factoryKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endExtensionFields(
+ Token? abstractToken,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ int count,
+ Token beginToken,
+ Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endFieldInitializer(Token assignment, Token token) {
+ _unexpected();
+ }
+
+ @override
+ void endForControlFlow(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endForIn(Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endForInBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endForInControlFlow(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endForInExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endForStatement(Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endForStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endFormalParameter(
+ Token? thisKeyword,
+ Token? superKeyword,
+ Token? periodAfterThisOrSuper,
+ Token nameToken,
+ Token? initializerStart,
+ Token? initializerEnd,
+ FormalParameterKind kind,
+ MemberKind memberKind) {
+ _unsupported();
+ }
+
+ @override
+ void endFormalParameterDefaultValueExpression() {
+ _unsupported();
+ }
+
+ @override
+ void endFormalParameters(
+ int count, Token beginToken, Token endToken, MemberKind kind) {
+ _unsupported();
+ }
+
+ @override
+ void endFunctionExpression(Token beginToken, Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endFunctionName(Token beginToken, Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endFunctionType(Token functionToken, Token? questionMark) {
+ _unhandled();
+ }
+
+ @override
+ void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
+ _unknown();
+ }
+
+ @override
+ void endHide(Token hideKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void endIfControlFlow(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endIfElseControlFlow(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endIfStatement(Token ifToken, Token? elseToken) {
+ _unsupported();
+ }
+
+ @override
+ void endImplicitCreationExpression(Token token, Token openAngleBracket) {
+ _unhandled();
+ }
+
+ @override
+ void endImport(Token importKeyword, Token? semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void endInitializedIdentifier(Token nameToken) {
+ _unsupported();
+ }
+
+ @override
+ void endInitializer(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void endInitializers(int count, Token beginToken, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endInvalidAwaitExpression(
+ Token beginToken, Token endToken, MessageCode errorCode) {
+ _unsupported();
+ }
+
+ @override
+ void endInvalidYieldStatement(Token beginToken, Token? starToken,
+ Token endToken, MessageCode errorCode) {
+ _unsupported();
+ }
+
+ @override
+ void endIsOperatorType(Token operator) {
+ _unhandled();
+ }
+
+ @override
+ void endLabeledStatement(int labelCount) {
+ _unsupported();
+ }
+
+ @override
+ void endLibraryName(Token libraryKeyword, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void endLiteralString(int interpolationCount, Token endToken) {
+ _unhandled();
+ }
+
+ @override
+ void endLiteralSymbol(Token hashToken, int identifierCount) {
+ _unhandled();
+ }
+
+ @override
+ void endLocalFunctionDeclaration(Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endMember() {
+ _unexpected();
+ }
+
+ @override
+ void endMetadataStar(int count) {
+ _unsupported();
+ }
+
+ @override
+ void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endMixinFactoryMethod(
+ Token beginToken, Token factoryKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endMixinFields(
+ Token? abstractToken,
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ int count,
+ Token beginToken,
+ Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+ Token? beginInitializers, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endNamedFunctionExpression(Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
+ Token? implementsKeyword, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endNewExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endOptionalFormalParameters(
+ int count, Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endPart(Token partKeyword, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void endPartOf(
+ Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+ _unexpected();
+ }
+
+ @override
+ void endRedirectingFactoryBody(Token beginToken, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endRethrowStatement(Token rethrowToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endReturnStatement(
+ bool hasExpression, Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endShow(Token showKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endSwitchCase(
+ int labelCount,
+ int expressionCount,
+ Token? defaultKeyword,
+ Token? colonAfterDefault,
+ int statementCount,
+ Token firstToken,
+ Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endSwitchStatement(Token switchKeyword, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endThenStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endTopLevelDeclaration(Token nextToken) {
+ _unexpected();
+ }
+
+ @override
+ void endTopLevelFields(
+ Token? externalToken,
+ Token? staticToken,
+ Token? covariantToken,
+ Token? lateToken,
+ Token? varFinalOrConst,
+ int count,
+ Token beginToken,
+ Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endTryStatement(
+ int catchCount, Token tryKeyword, Token? finallyKeyword) {
+ _unsupported();
+ }
+
+ @override
+ void endTypeArguments(int count, Token beginToken, Token endToken) {
+ _unhandled();
+ }
+
+ @override
+ void endTypeList(int count) {
+ _unexpected();
+ }
+
+ @override
+ void endTypeVariable(
+ Token token, int index, Token? extendsOrSuper, Token? variance) {
+ _unsupported();
+ }
+
+ @override
+ void endTypeVariables(Token beginToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void endVariableInitializer(Token assignmentOperator) {
+ _unsupported();
+ }
+
+ @override
+ void endVariablesDeclaration(int count, Token? endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endWhileStatement(Token whileKeyword, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void endWhileStatementBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleAsOperator(Token operator) {
+ _unhandled();
+ }
+
+ @override
+ void handleAssignmentExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleAsyncModifier(Token? asyncToken, Token? starToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleBreakStatement(
+ bool hasTarget, Token breakKeyword, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleCaseMatch(Token caseKeyword, Token colon) {
+ _unsupported();
+ }
+
+ @override
+ void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
+ _unsupported();
+ }
+
+ @override
+ void handleClassExtends(Token? extendsKeyword, int typeCount) {
+ _unexpected();
+ }
+
+ @override
+ void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
+ _unexpected();
+ }
+
+ @override
+ void handleClassNoWithClause() {
+ _unexpected();
+ }
+
+ @override
+ void handleClassWithClause(Token withKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleCommentReference(
+ Token? newKeyword,
+ Token? firstToken,
+ Token? firstPeriod,
+ Token? secondToken,
+ Token? secondPeriod,
+ Token thirdToken) {
+ _ignored();
+ }
+
+ @override
+ void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+ _ignored();
+ }
+
+ @override
+ void handleConditionalExpressionColon() {
+ _unhandled();
+ }
+
+ @override
+ void handleConstFactory(Token constKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleContinueStatement(
+ bool hasTarget, Token continueKeyword, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleDirectivesOnly() {
+ _unknown();
+ }
+
+ @override
+ void handleDottedName(int count, Token firstIdentifier) {
+ _unknown();
+ }
+
+ @override
+ void handleElseControlFlow(Token elseToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleEmptyFunctionBody(Token semicolon) {
+ _unsupported();
+ }
+
+ @override
+ void handleEmptyStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleEndingBinaryExpression(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleEnumElement(Token beginToken) {
+ _unexpected();
+ }
+
+ @override
+ void handleEnumElements(Token elementsEndToken, int elementsCount) {
+ _unexpected();
+ }
+
+ @override
+ void handleEnumHeader(Token enumKeyword, Token leftBrace) {
+ _unexpected();
+ }
+
+ @override
+ void handleEnumNoWithClause() {
+ _unexpected();
+ }
+
+ @override
+ void handleEnumWithClause(Token withKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleErrorToken(ErrorToken token) {
+ _unsupported();
+ }
+
+ @override
+ void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleExpressionStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+ Token? hideKeyword, int hideElementCount) {
+ _unexpected();
+ }
+
+ @override
+ void handleExtraneousExpression(Token token, Message message) {
+ _unknown();
+ }
+
+ @override
+ void handleFinallyBlock(Token finallyKeyword) {
+ _unsupported();
+ }
+
+ @override
+ void handleForInLoopParts(Token? awaitToken, Token forToken,
+ Token leftParenthesis, Token inKeyword) {
+ _unsupported();
+ }
+
+ @override
+ void handleForInitializerEmptyStatement(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleForInitializerExpressionStatement(Token token, bool forIn) {
+ _unsupported();
+ }
+
+ @override
+ void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
+ _unsupported();
+ }
+
+ @override
+ void handleForLoopParts(Token forKeyword, Token leftParen,
+ Token leftSeparator, int updateExpressionCount) {
+ _unsupported();
+ }
+
+ @override
+ void handleFormalParameterWithoutValue(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
+ _unsupported();
+ }
+
+ @override
+ void handleIdentifierList(int count) {
+ _unknown();
+ }
+
+ @override
+ void handleImplements(Token? implementsKeyword, int interfacesCount) {
+ _unexpected();
+ }
+
+ @override
+ void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleIndexedExpression(
+ Token? question, Token openSquareBracket, Token closeSquareBracket) {
+ _unsupported();
+ }
+
+ @override
+ void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
+ _unhandled();
+ }
+
+ @override
+ void handleInvalidExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleInvalidFunctionBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleInvalidMember(Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+ _unexpected();
+ }
+
+ @override
+ void handleInvalidStatement(Token token, Message message) {
+ _unsupported();
+ }
+
+ @override
+ void handleInvalidTopLevelBlock(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void handleInvalidTopLevelDeclaration(Token endToken) {
+ _unexpected();
+ }
+
+ @override
+ void handleInvalidTypeArguments(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleInvalidTypeReference(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleIsOperator(Token isOperator, Token? not) {
+ _unhandled();
+ }
+
+ @override
+ void handleLabel(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleLiteralBool(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralDouble(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralInt(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralList(
+ int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralMapEntry(Token colon, Token endToken) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralNull(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleLiteralSetOrMap(int count, Token leftBrace, Token? constKeyword,
+ Token rightBrace, bool hasSetEntry) {
+ _unhandled();
+ }
+
+ @override
+ void handleMixinHeader(Token mixinKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleMixinOn(Token? onKeyword, int typeCount) {
+ _unexpected();
+ }
+
+ @override
+ void handleNamedArgument(Token colon) {
+ _unhandled();
+ }
+
+ @override
+ void handleNamedMixinApplicationWithClause(Token withKeyword) {
+ _unexpected();
+ }
+
+ @override
+ void handleNativeClause(Token nativeToken, bool hasName) {
+ _unexpected();
+ }
+
+ @override
+ void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void handleNewAsIdentifier(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleNoCommentReference() {
+ _ignored();
+ }
+
+ @override
+ void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleNoFieldInitializer(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void handleNoFormalParameters(Token token, MemberKind kind) {
+ _unsupported();
+ }
+
+ @override
+ void handleNoFunctionBody(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleNoInitializers() {
+ _unexpected();
+ }
+
+ @override
+ void handleNoName(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleNoType(Token lastConsumed) {
+ _unknown();
+ }
+
+ @override
+ void handleNoTypeNameInConstructorReference(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleNoTypeVariables(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleNoVariableInitializer(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleNonNullAssertExpression(Token bang) {
+ _unsupported();
+ }
+
+ @override
+ void handleOperator(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleOperatorName(Token operatorKeyword, Token token) {
+ _unexpected();
+ }
+
+ @override
+ void handleParenthesizedCondition(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleParenthesizedExpression(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleRecoverClassHeader() {
+ _unexpected();
+ }
+
+ @override
+ void handleRecoverImport(Token? semicolon) {
+ _unexpected();
+ }
+
+ @override
+ void handleRecoverMixinHeader() {
+ _unexpected();
+ }
+
+ @override
+ void handleRecoverableError(
+ Message message, Token startToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleScript(Token token) {
+ _unexpected();
+ }
+
+ @override
+ void handleSend(Token beginToken, Token endToken) {
+ _unhandled();
+ }
+
+ @override
+ void handleShowHideIdentifier(Token? modifier, Token identifier) {
+ _unexpected();
+ }
+
+ @override
+ void handleSpreadExpression(Token spreadToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleStringJuxtaposition(Token startToken, int literalCount) {
+ _unhandled();
+ }
+
+ @override
+ void handleStringPart(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleSuperExpression(Token token, IdentifierContext context) {
+ _unsupported();
+ }
+
+ @override
+ void handleSymbolVoid(Token token) {
+ _unhandled();
+ }
+
+ @override
+ void handleThenControlFlow(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleThisExpression(Token token, IdentifierContext context) {
+ _unsupported();
+ }
+
+ @override
+ void handleThrowExpression(Token throwToken, Token endToken) {
+ _unsupported();
+ }
+
+ @override
+ void handleType(Token beginToken, Token? questionMark) {
+ _unknown();
+ }
+
+ @override
+ void handleTypeArgumentApplication(Token openAngleBracket) {
+ _unhandled();
+ }
+
+ @override
+ void handleTypeVariablesDefined(Token token, int count) {
+ _unsupported();
+ }
+
+ @override
+ void handleUnaryPostfixAssignmentExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleUnaryPrefixAssignmentExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleUnaryPrefixExpression(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleUnescapeError(
+ Message message, covariant Token location, int stringOffset, int length) {
+ _unsupported();
+ }
+
+ @override
+ void handleValuedFormalParameter(Token equals, Token token) {
+ _unsupported();
+ }
+
+ @override
+ void handleVoidKeyword(Token token) {
+ _unknown();
+ }
+
+ @override
+ void handleVoidKeywordWithTypeArguments(Token token) {
+ _unsupported();
+ }
+
+ @override
+ void logEvent(String name) {}
+
+ @override
+ void reportVarianceModifierNotEnabled(Token? variance) {
+ _unsupported();
+ }
+}
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 03de64a..701382f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -2554,7 +2554,7 @@
.lookupGetterReference(constructorTearOffName(
constructorName, _currentClassReferencesFromIndexed!.library));
}
- ConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
+ SourceConstructorBuilder constructorBuilder = new SourceConstructorBuilder(
metadata,
modifiers & ~abstractMask,
returnType,
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index e0779c4..6c12705 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -35,6 +35,7 @@
import '../../base/common.dart';
import '../../base/instrumentation.dart' show Instrumentation;
import '../../base/nnbd_mode.dart';
+import '../builder/metadata_builder.dart';
import '../dill/dill_library_builder.dart';
import '../builder_graph.dart';
import '../builder/builder.dart';
@@ -67,6 +68,7 @@
show SynthesizedFunctionNode, TypeDependency;
import '../kernel/kernel_target.dart' show KernelTarget;
import '../kernel/macro.dart';
+import '../kernel/macro_annotation_parser.dart';
import '../kernel/transform_collections.dart' show CollectionTransformer;
import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
@@ -908,7 +910,7 @@
}
void registerConstructorToBeInferred(
- Constructor constructor, ConstructorBuilder builder) {
+ Constructor constructor, SourceConstructorBuilder builder) {
_typeInferenceEngine!.toBeInferred[constructor] = builder;
}
@@ -1381,65 +1383,108 @@
void computeMacroApplications() {
if (!enableMacros || _macroClassBuilder == null) return;
- Class macroClass = _macroClassBuilder!.cls;
- Class? computeApplication(Expression expression) {
- if (expression is ConstructorInvocation) {
- Class cls = expression.target.enclosingClass;
- if (hierarchy.isSubtypeOf(cls, macroClass)) {
- return cls;
- }
- }
- return null;
- }
-
- MacroApplications? computeApplications(List<Expression> annotations) {
- List<Class> macros = [];
- for (Expression annotation in annotations) {
- Class? cls = computeApplication(annotation);
- if (cls != null) {
- macros.add(cls);
- }
- }
- return macros.isNotEmpty ? new MacroApplications(macros) : null;
+ MacroApplications? computeApplications(
+ SourceLibraryBuilder enclosingLibrary,
+ Scope scope,
+ Uri fileUri,
+ List<MetadataBuilder>? annotations) {
+ List<MacroApplication>? result = prebuildAnnotations(
+ enclosingLibrary: enclosingLibrary,
+ metadataBuilders: annotations,
+ fileUri: fileUri,
+ scope: scope);
+ return result != null ? new MacroApplications(result) : null;
}
for (SourceLibraryBuilder libraryBuilder in sourceLibraryBuilders) {
// TODO(johnniwinther): Handle patch libraries.
LibraryMacroApplicationData libraryMacroApplicationData =
new LibraryMacroApplicationData();
- Library library = libraryBuilder.library;
- for (Class cls in library.classes) {
- ClassMacroApplicationData classMacroApplicationData =
- new ClassMacroApplicationData();
- classMacroApplicationData.classApplications =
- computeApplications(cls.annotations);
- for (Member member in cls.members) {
- MacroApplications? macroApplications =
- computeApplications(member.annotations);
+ Iterator<Builder> iterator = libraryBuilder.iterator;
+ while (iterator.moveNext()) {
+ Builder builder = iterator.current;
+ if (builder is SourceClassBuilder) {
+ SourceClassBuilder classBuilder = builder;
+ ClassMacroApplicationData classMacroApplicationData =
+ new ClassMacroApplicationData();
+ classMacroApplicationData.classApplications = computeApplications(
+ libraryBuilder,
+ classBuilder.scope,
+ classBuilder.fileUri,
+ classBuilder.metadata);
+ builder.forEach((String name, Builder memberBuilder) {
+ if (memberBuilder is SourceProcedureBuilder) {
+ MacroApplications? macroApplications = computeApplications(
+ libraryBuilder,
+ classBuilder.scope,
+ memberBuilder.fileUri,
+ memberBuilder.metadata);
+ if (macroApplications != null) {
+ classMacroApplicationData
+ .memberApplications[memberBuilder.procedure] =
+ macroApplications;
+ }
+ } else if (memberBuilder is SourceFieldBuilder) {
+ MacroApplications? macroApplications = computeApplications(
+ libraryBuilder,
+ classBuilder.scope,
+ memberBuilder.fileUri,
+ memberBuilder.metadata);
+ if (macroApplications != null) {
+ classMacroApplicationData
+ .memberApplications[memberBuilder.field] =
+ macroApplications;
+ }
+ }
+ });
+ classBuilder.forEachConstructor((String name, Builder memberBuilder) {
+ if (memberBuilder is SourceConstructorBuilder) {
+ MacroApplications? macroApplications = computeApplications(
+ libraryBuilder,
+ classBuilder.scope,
+ memberBuilder.fileUri,
+ memberBuilder.metadata);
+ if (macroApplications != null) {
+ classMacroApplicationData
+ .memberApplications[memberBuilder.constructor] =
+ macroApplications;
+ }
+ }
+ });
+
+ if (classMacroApplicationData.classApplications != null ||
+ classMacroApplicationData.memberApplications.isNotEmpty) {
+ libraryMacroApplicationData.classData[builder.cls] =
+ classMacroApplicationData;
+ }
+ } else if (builder is SourceProcedureBuilder) {
+ MacroApplications? macroApplications = computeApplications(
+ libraryBuilder,
+ libraryBuilder.scope,
+ builder.fileUri,
+ builder.metadata);
if (macroApplications != null) {
- classMacroApplicationData.memberApplications[member] =
+ libraryMacroApplicationData.memberApplications[builder.procedure] =
macroApplications;
}
- }
- if (classMacroApplicationData.classApplications != null ||
- classMacroApplicationData.memberApplications.isNotEmpty) {
- libraryMacroApplicationData.classData[cls] =
- classMacroApplicationData;
- }
- }
- for (Member member in library.members) {
- MacroApplications? macroApplications =
- computeApplications(member.annotations);
- if (macroApplications != null) {
- libraryMacroApplicationData.memberApplications[member] =
- macroApplications;
+ } else if (builder is SourceFieldBuilder) {
+ MacroApplications? macroApplications = computeApplications(
+ libraryBuilder,
+ libraryBuilder.scope,
+ builder.fileUri,
+ builder.metadata);
+ if (macroApplications != null) {
+ libraryMacroApplicationData.memberApplications[builder.field] =
+ macroApplications;
+ }
}
}
if (libraryMacroApplicationData.classData.isNotEmpty ||
libraryMacroApplicationData.memberApplications.isNotEmpty) {
if (retainDataForTesting) {
- dataForTesting!.macroApplicationData.libraryData[library] =
+ dataForTesting!
+ .macroApplicationData.libraryData[libraryBuilder.library] =
libraryMacroApplicationData;
}
}
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
index b14927c..34aa46b 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inference_engine.dart
@@ -122,14 +122,14 @@
/// This is represented as a map from a constructor to its library
/// builder because the builder is used to report errors due to cyclic
/// inference dependencies.
- final Map<Constructor, ConstructorBuilder> toBeInferred = {};
+ final Map<Constructor, SourceConstructorBuilder> toBeInferred = {};
/// A map containing constructors in the process of being inferred.
///
/// This is used to detect cyclic inference dependencies. It is represented
/// as a map from a constructor to its library builder because the builder
/// is used to report errors.
- final Map<Constructor, ConstructorBuilder> beingInferred = {};
+ final Map<Constructor, SourceConstructorBuilder> beingInferred = {};
final Map<Member, TypeDependency> typeDependencies = {};
@@ -153,7 +153,7 @@
void finishTopLevelInitializingFormals() {
// Field types have all been inferred so we don't need to guard against
// cyclic dependency.
- for (ConstructorBuilder builder in toBeInferred.values) {
+ for (SourceConstructorBuilder builder in toBeInferred.values) {
builder.inferFormalTypes();
}
toBeInferred.clear();
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
index 5dc515a..ad23808 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
@@ -376,7 +376,7 @@
@override
void inferConstructorParameterTypes(Constructor target) {
- ConstructorBuilder? constructor = engine.beingInferred[target];
+ SourceConstructorBuilder? constructor = engine.beingInferred[target];
if (constructor != null) {
// There is a cyclic dependency where inferring the types of the
// initializing formals of a constructor required us to infer the
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index 10ad152..0fed875 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -111,6 +111,7 @@
ConstEvalExternalFactory/example: Fail
ConstEvalFailedAssertion/example: Fail
ConstEvalFailedAssertionWithMessage/example: Fail
+ConstEvalFailedAssertionWithNonStringMessage/example: Fail
ConstEvalFreeTypeParameter/analyzerCode: Fail
ConstEvalFreeTypeParameter/example: Fail
ConstEvalGetterNotFound/analyzerCode: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 6632763..9819804 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -189,6 +189,10 @@
problemMessage: "This assertion failed with message: #stringOKEmpty"
analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+ConstEvalFailedAssertionWithNonStringMessage:
+ problemMessage: "This assertion failed with a non-String message."
+ analyzerCode: CONST_EVAL_THROWS_EXCEPTION
+
ConstEvalNonConstantVariableGet:
problemMessage: "The variable '#nameOKEmpty' is not a constant, only constant expressions are allowed."
analyzerCode: NON_CONSTANT_VALUE_IN_INITIALIZER
diff --git a/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
index d7bf92d..c7fc7d5 100644
--- a/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
+++ b/pkg/front_end/test/macros/data/pkgs/macro/lib/macro.dart
@@ -6,14 +6,20 @@
macro class Macro1 implements Macro {
const Macro1();
+
+ const Macro1.named();
}
macro class Macro2 implements Macro {
const Macro2();
+
+ const Macro2.named();
}
-macro class Macro3 implements Macro {
+macro class Macro3<T> implements Macro {
const Macro3();
+
+ const Macro3.named();
}
class NonMacro {
diff --git a/pkg/front_end/test/macros/data/tests/applications.dart b/pkg/front_end/test/macros/data/tests/applications.dart
new file mode 100644
index 0000000..804253c
--- /dev/null
+++ b/pkg/front_end/test/macros/data/tests/applications.dart
@@ -0,0 +1,58 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/*library:
+ compilationSequence=[
+ package:_fe_analyzer_shared/src/macros/api.dart,
+ package:macro/macro.dart,
+ main.dart],
+ macrosAreApplied,
+ macrosAreAvailable
+*/
+
+import 'package:macro/macro.dart';
+import 'package:macro/macro.dart' as prefix;
+
+/*class: Class:
+ appliedMacros=[
+ Macro1.new,
+ Macro2.named,
+ Macro2.new,
+ Macro3.named],
+ macrosAreApplied
+*/
+@Macro2.named()
+@prefix.Macro2()
+@prefix.Macro3.named()
+@Macro1()
+class Class {
+ /*member: Class.:appliedMacros=[
+ Macro1.named,
+ Macro1.new,
+ Macro2.named,
+ Macro3.new]*/
+ @Macro1.named()
+ @prefix.Macro1()
+ @prefix.Macro2.named()
+ @Macro3()
+ Class();
+
+ /*member: Class.method:appliedMacros=[Macro3.named]*/
+ @Macro3.named()
+ void method() {}
+
+ /*member: Class.field:appliedMacros=[Macro3.new]*/
+ @prefix.Macro3()
+ var field;
+}
+
+/*member: method:appliedMacros=[Macro2.named]*/
+@Macro2.named()
+void method() {}
+
+@Macro3()
+/*member: field:appliedMacros=[Macro3.new]*/
+var field;
+
+main() {}
diff --git a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
index f4e6484..fc6ae56 100644
--- a/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
+++ b/pkg/front_end/test/macros/data/tests/declare_vs_apply/apply_lib.dart
@@ -10,9 +10,9 @@
import 'macro_lib.dart';
import 'apply_lib_dep.dart';
-@Macro1()
/*class: Class:
- appliedMacros=[Macro1],
+ appliedMacros=[Macro1.new],
macrosAreApplied
*/
+@Macro1()
class Class extends Super {}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
index 1c2e947..3aa757c 100644
--- a/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/macro_lib2b.dart
@@ -11,11 +11,11 @@
import 'package:_fe_analyzer_shared/src/macros/api.dart';
import 'macro_lib2a.dart';
-@Macro2a()
/*class: Macro2b:
- appliedMacros=[Macro2a],
+ appliedMacros=[Macro2a.new],
macrosAreApplied
*/
+@Macro2a()
macro class Macro2b implements Macro {
const Macro2b();
}
diff --git a/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
index 9a3839e..455b1b1 100644
--- a/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
+++ b/pkg/front_end/test/macros/data/tests/multiple_macros/main.dart
@@ -16,11 +16,11 @@
import 'macro_lib2a.dart';
import 'macro_lib2b.dart';
+/*member: main:appliedMacros=[
+ Macro1.new,
+ Macro2a.new,
+ Macro2b.new]*/
@Macro1()
@Macro2a()
@Macro2b()
-/*member: main:appliedMacros=[
- Macro1,
- Macro2a,
- Macro2b]*/
void main() {}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_package.dart b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
index a830bb3..241eda8 100644
--- a/pkg/front_end/test/macros/data/tests/use_macro_package.dart
+++ b/pkg/front_end/test/macros/data/tests/use_macro_package.dart
@@ -14,25 +14,25 @@
import 'package:macro/macro.dart';
+/*member: main:appliedMacros=[Macro1.new]*/
@Macro1()
-/*member: main:appliedMacros=[Macro1]*/
void main() {}
-@Macro2()
/*class: Class1:
- appliedMacros=[Macro2],
+ appliedMacros=[Macro2.new],
macrosAreApplied
*/
+@Macro2()
class Class1 {
+ /*member: Class1.:appliedMacros=[Macro3.new]*/
@Macro3()
- /*member: Class1.:appliedMacros=[Macro3]*/
Class1();
+ /*member: Class1.method:appliedMacros=[
+ Macro1.new,
+ Macro2.new]*/
@Macro1()
@Macro2()
- /*member: Class1.method:appliedMacros=[
- Macro1,
- Macro2]*/
void method() {}
}
@@ -41,8 +41,8 @@
/*class: Class3:macrosAreApplied*/
class Class3 {
+ /*member: Class3.field:appliedMacros=[Macro3.new]*/
@Macro3()
- /*member: Class3.field:appliedMacros=[Macro3]*/
var field;
}
@@ -51,20 +51,20 @@
var field;
}
+/*member: field:appliedMacros=[Macro1.new]*/
@Macro1()
-/*member: field:appliedMacros=[Macro1]*/
var field;
extension Extension on int {
+ /*member: Extension|field:*/
@Macro1()
- /*member: Extension|field:appliedMacros=[Macro1]*/
static var field;
+ /*member: Extension|method:*/
@Macro2()
- /*member: Extension|method:appliedMacros=[Macro2]*/
void method() {}
+ /*member: Extension|staticMethod:*/
@Macro3()
- /*member: Extension|staticMethod:appliedMacros=[Macro3]*/
static void staticMethod() {}
}
diff --git a/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
index 7c78a01..026aeb3 100644
--- a/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
+++ b/pkg/front_end/test/macros/data/tests/use_macro_source/main.dart
@@ -13,21 +13,21 @@
import 'macro_lib.dart';
+/*member: main:appliedMacros=[Macro1.new]*/
@Macro1()
-/*member: main:appliedMacros=[Macro1]*/
void main() {}
-@Macro2()
/*class: Class1:
- appliedMacros=[Macro2],
+ appliedMacros=[Macro2.new],
macrosAreApplied
*/
+@Macro2()
class Class1 {
+ /*member: Class1.method:appliedMacros=[
+ Macro1.new,
+ Macro2.new]*/
@Macro1()
@Macro2()
- /*member: Class1.method:appliedMacros=[
- Macro1,
- Macro2]*/
void method() {}
}
@@ -36,8 +36,8 @@
/*class: Class3:macrosAreApplied*/
class Class3 {
+ /*member: Class3.field:appliedMacros=[Macro1.new]*/
@Macro1()
- /*member: Class3.field:appliedMacros=[Macro1]*/
var field;
}
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index 6042432..ee92293 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -139,8 +139,13 @@
void registerMacroApplications(
Features features, MacroApplications? macroApplications) {
if (macroApplications != null) {
- for (Class cls in macroApplications.macros) {
- features.addElement(Tags.appliedMacros, cls.name);
+ for (MacroApplication application in macroApplications.macros) {
+ String className = application.cls.name;
+ String constructorName = application.constructorName == ''
+ ? 'new'
+ : application.constructorName;
+ features.addElement(
+ Tags.appliedMacros, '${className}.${constructorName}');
}
}
}
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 81e6368..dd3fd3e 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -766,6 +766,7 @@
masking
masks
master
+mature
mb
mc
md
@@ -964,6 +965,7 @@
pow
pragma
pre
+prebuild
prebuilt
preexisted
preexisting
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.expect
index be365f6..a0f8836 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.expect
@@ -34,7 +34,7 @@
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
@@ -182,7 +182,7 @@
static const field self::Foo* foo1 = #C4;
static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
-static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect
index be365f6..a0f8836 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.modular.expect
@@ -34,7 +34,7 @@
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
@@ -182,7 +182,7 @@
static const field self::Foo* foo1 = #C4;
static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
-static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.transformed.expect
index 8d10eb2..c635add 100644
--- a/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/const_asserts.dart.weak.transformed.expect
@@ -34,7 +34,7 @@
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/const_asserts.dart:16:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/const_asserts.dart:34:11: Context: While analyzing:
@@ -182,7 +182,7 @@
static const field self::Foo* foo1 = #C4;
static const field self::Foo* foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo* foo3 = invalid-expression "This assertion failed with message: btw foo was false";
-static const field self::Foo* foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo* foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo* foo5 = invalid-expression "pkg/front_end/testcases/general/constants/const_asserts.dart:17:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.expect
index 9f6cb29..9106d0c 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.expect
@@ -19,7 +19,7 @@
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
@@ -98,7 +98,7 @@
static const field self::Foo foo1 = #C9;
static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo foo3 = #C12;
-static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect
index 9f6cb29..9106d0c 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.modular.expect
@@ -19,7 +19,7 @@
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
@@ -98,7 +98,7 @@
static const field self::Foo foo1 = #C9;
static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo foo3 = #C12;
-static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.transformed.expect
index 0bcf7671..d6b50e0 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart.weak.transformed.expect
@@ -19,7 +19,7 @@
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:24: Error: Constant evaluation error:
// const Foo foo4 = const Foo.withInvalidMessage(42);
// ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: Expected constant '42' to be of type 'String', but was of type 'int'.
+// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:15:56: Context: This assertion failed with a non-String message.
// const Foo.withInvalidMessage(this.x) : assert(x < 0, x);
// ^
// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:28:11: Context: While analyzing:
@@ -98,7 +98,7 @@
static const field self::Foo foo1 = #C9;
static const field self::Foo foo2 = invalid-expression "This assertion failed with message: x is not positive";
static const field self::Foo foo3 = #C12;
-static const field self::Foo foo4 = invalid-expression "Expected constant '42' to be of type 'String', but was of type 'int'.";
+static const field self::Foo foo4 = invalid-expression "This assertion failed with a non-String message.";
static const field self::Foo foo5 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/const_asserts.dart:16:51: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
const Foo.withInvalidCondition(this.x) : assert(x);
^";
diff --git a/pkg/front_end/testcases/general/issue47994a.dart b/pkg/front_end/testcases/general/issue47994a.dart
new file mode 100644
index 0000000..a669064
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Const {
+ const Const();
+}
+
+class BuildAssert {
+ const BuildAssert(bool condition, [Object? message])
+ : assert(condition, message);
+}
+
+const _assert1 = BuildAssert(false);
+const _assert2 = BuildAssert(false, null);
+const _assert3 = BuildAssert(false, 'foo');
+const _assert4 = BuildAssert(false, 0);
+const _assert5 = BuildAssert(false, const {});
+const _assert6 = BuildAssert(false, #_symbol);
+const _assert7 = BuildAssert(false, const Const());
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47994a.dart.textual_outline.expect
new file mode 100644
index 0000000..11ad895
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.textual_outline.expect
@@ -0,0 +1,17 @@
+class Const {
+ const Const();
+}
+
+class BuildAssert {
+ const BuildAssert(bool condition, [Object? message])
+ : assert(condition, message);
+}
+
+const _assert1 = BuildAssert(false);
+const _assert2 = BuildAssert(false, null);
+const _assert3 = BuildAssert(false, 'foo');
+const _assert4 = BuildAssert(false, 0);
+const _assert5 = BuildAssert(false, const {});
+const _assert6 = BuildAssert(false, #_symbol);
+const _assert7 = BuildAssert(false, const Const());
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47994a.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..96343a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.textual_outline_modelled.expect
@@ -0,0 +1,17 @@
+class BuildAssert {
+ const BuildAssert(bool condition, [Object? message])
+ : assert(condition, message);
+}
+
+class Const {
+ const Const();
+}
+
+const _assert1 = BuildAssert(false);
+const _assert2 = BuildAssert(false, null);
+const _assert3 = BuildAssert(false, 'foo');
+const _assert4 = BuildAssert(false, 0);
+const _assert5 = BuildAssert(false, const {});
+const _assert6 = BuildAssert(false, #_symbol);
+const _assert7 = BuildAssert(false, const Const());
+void main() {}
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.weak.expect b/pkg/front_end/testcases/general/issue47994a.dart.weak.expect
new file mode 100644
index 0000000..af71fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.weak.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47994a.dart:14:18: Error: Constant evaluation error:
+// const _assert1 = BuildAssert(false);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:14:7: Context: While analyzing:
+// const _assert1 = BuildAssert(false);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:15:18: Error: Constant evaluation error:
+// const _assert2 = BuildAssert(false, null);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:15:7: Context: While analyzing:
+// const _assert2 = BuildAssert(false, null);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:16:18: Error: Constant evaluation error:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed with message: foo
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:16:7: Context: While analyzing:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:17:18: Error: Constant evaluation error:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:17:7: Context: While analyzing:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:18:18: Error: Constant evaluation error:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:18:7: Context: While analyzing:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:19:18: Error: Constant evaluation error:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:19:7: Context: While analyzing:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:20:18: Error: Constant evaluation error:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:20:7: Context: While analyzing:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class BuildAssert extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::bool condition, [core::Object? message = #C1]) → self::BuildAssert
+ : assert(condition, message), super core::Object::•()
+ ;
+}
+static const field self::BuildAssert _assert1 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert2 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert3 = invalid-expression "This assertion failed with message: foo";
+static const field self::BuildAssert _assert4 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert5 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert6 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert7 = invalid-expression "This assertion failed with a non-String message.";
+static method main() → void {}
+
+constants {
+ #C1 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994a.dart:
+- BuildAssert. (from org-dartlang-testcase:///issue47994a.dart:10:9)
+- Const. (from org-dartlang-testcase:///issue47994a.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47994a.dart.weak.modular.expect
new file mode 100644
index 0000000..af71fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.weak.modular.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47994a.dart:14:18: Error: Constant evaluation error:
+// const _assert1 = BuildAssert(false);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:14:7: Context: While analyzing:
+// const _assert1 = BuildAssert(false);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:15:18: Error: Constant evaluation error:
+// const _assert2 = BuildAssert(false, null);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:15:7: Context: While analyzing:
+// const _assert2 = BuildAssert(false, null);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:16:18: Error: Constant evaluation error:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed with message: foo
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:16:7: Context: While analyzing:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:17:18: Error: Constant evaluation error:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:17:7: Context: While analyzing:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:18:18: Error: Constant evaluation error:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:18:7: Context: While analyzing:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:19:18: Error: Constant evaluation error:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:19:7: Context: While analyzing:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:20:18: Error: Constant evaluation error:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:20:7: Context: While analyzing:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class BuildAssert extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::bool condition, [core::Object? message = #C1]) → self::BuildAssert
+ : assert(condition, message), super core::Object::•()
+ ;
+}
+static const field self::BuildAssert _assert1 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert2 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert3 = invalid-expression "This assertion failed with message: foo";
+static const field self::BuildAssert _assert4 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert5 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert6 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert7 = invalid-expression "This assertion failed with a non-String message.";
+static method main() → void {}
+
+constants {
+ #C1 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994a.dart:
+- BuildAssert. (from org-dartlang-testcase:///issue47994a.dart:10:9)
+- Const. (from org-dartlang-testcase:///issue47994a.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47994a.dart.weak.outline.expect
new file mode 100644
index 0000000..0347e2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.weak.outline.expect
@@ -0,0 +1,30 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class BuildAssert extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::bool condition, [core::Object? message]) → self::BuildAssert
+ : assert(condition, message), super core::Object::•()
+ ;
+}
+static const field self::BuildAssert _assert1 = const self::BuildAssert::•(false);
+static const field self::BuildAssert _assert2 = const self::BuildAssert::•(false, null);
+static const field self::BuildAssert _assert3 = const self::BuildAssert::•(false, "foo");
+static const field self::BuildAssert _assert4 = const self::BuildAssert::•(false, 0);
+static const field self::BuildAssert _assert5 = const self::BuildAssert::•(false, const <dynamic, dynamic>{});
+static const field self::BuildAssert _assert6 = const self::BuildAssert::•(false, #_symbol);
+static const field self::BuildAssert _assert7 = const self::BuildAssert::•(false, const self::Const::•());
+static method main() → void
+ ;
+
+
+Extra constant evaluation status:
+Evaluated: MapLiteral @ org-dartlang-testcase:///issue47994a.dart:18:37 -> MapConstant(const <dynamic, dynamic>{})
+Evaluated: SymbolLiteral @ org-dartlang-testcase:///issue47994a.dart:19:37 -> SymbolConstant(#_symbol)
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue47994a.dart:20:43 -> InstanceConstant(const Const{})
+Extra constant evaluation: evaluated: 12, effectively constant: 3
diff --git a/pkg/front_end/testcases/general/issue47994a.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47994a.dart.weak.transformed.expect
new file mode 100644
index 0000000..af71fb3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994a.dart.weak.transformed.expect
@@ -0,0 +1,106 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47994a.dart:14:18: Error: Constant evaluation error:
+// const _assert1 = BuildAssert(false);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:14:7: Context: While analyzing:
+// const _assert1 = BuildAssert(false);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:15:18: Error: Constant evaluation error:
+// const _assert2 = BuildAssert(false, null);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:15:7: Context: While analyzing:
+// const _assert2 = BuildAssert(false, null);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:16:18: Error: Constant evaluation error:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:16: Context: This assertion failed with message: foo
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:16:7: Context: While analyzing:
+// const _assert3 = BuildAssert(false, 'foo');
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:17:18: Error: Constant evaluation error:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:17:7: Context: While analyzing:
+// const _assert4 = BuildAssert(false, 0);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:18:18: Error: Constant evaluation error:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:18:7: Context: While analyzing:
+// const _assert5 = BuildAssert(false, const {});
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:19:18: Error: Constant evaluation error:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:19:7: Context: While analyzing:
+// const _assert6 = BuildAssert(false, #_symbol);
+// ^
+//
+// pkg/front_end/testcases/general/issue47994a.dart:20:18: Error: Constant evaluation error:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:11:27: Context: This assertion failed with a non-String message.
+// : assert(condition, message);
+// ^
+// pkg/front_end/testcases/general/issue47994a.dart:20:7: Context: While analyzing:
+// const _assert7 = BuildAssert(false, const Const());
+// ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class BuildAssert extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::bool condition, [core::Object? message = #C1]) → self::BuildAssert
+ : assert(condition, message), super core::Object::•()
+ ;
+}
+static const field self::BuildAssert _assert1 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert2 = invalid-expression "This assertion failed.";
+static const field self::BuildAssert _assert3 = invalid-expression "This assertion failed with message: foo";
+static const field self::BuildAssert _assert4 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert5 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert6 = invalid-expression "This assertion failed with a non-String message.";
+static const field self::BuildAssert _assert7 = invalid-expression "This assertion failed with a non-String message.";
+static method main() → void {}
+
+constants {
+ #C1 = null
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994a.dart:
+- BuildAssert. (from org-dartlang-testcase:///issue47994a.dart:10:9)
+- Const. (from org-dartlang-testcase:///issue47994a.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue47994b.dart b/pkg/front_end/testcases/general/issue47994b.dart
new file mode 100644
index 0000000..1fbaf90
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class Const {
+ const Const();
+}
+
+class Class {
+ const Class(Object? message) : assert(false, message);
+}
+
+main() {
+ expect(null, test(() {
+ assert(false);
+ }));
+ expect(null, test(() {
+ assert(false, null);
+ }));
+ expect('foo', test(() {
+ assert(false, 'foo');
+ }));
+ expect(0, test(() {
+ assert(false, 0);
+ }));
+ expect(const {}, test(() {
+ assert(false, const {});
+ }));
+ expect(#_symbol, test(() {
+ assert(false, #_symbol);
+ }));
+ expect(const Const(), test(() {
+ assert(false, const Const());
+ }));
+
+ expect(null, test(() {
+ Class(null);
+ }));
+ expect('foo', test(() {
+ Class('foo');
+ }));
+ expect(0, test(() {
+ Class(0);
+ }));
+ expect(const {}, test(() {
+ Class(const {});
+ }));
+ expect(#_symbol, test(() {
+ Class(#_symbol);
+ }));
+ expect(const Const(), test(() {
+ Class(const Const());
+ }));
+}
+
+expect(expected, actual) {
+ if (expected != actual) throw 'Expected $expected, actual $actual';
+}
+
+Object? test(void Function() f) {
+ try {
+ f();
+ } on AssertionError catch (e) {
+ print(e);
+ return e.message;
+ } catch (e) {
+ throw 'Unexpected exception $e (${e.runtimeType}';
+ }
+ throw 'Missing exception';
+}
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47994b.dart.textual_outline.expect
new file mode 100644
index 0000000..e522fca
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.textual_outline.expect
@@ -0,0 +1,11 @@
+class Const {
+ const Const();
+}
+
+class Class {
+ const Class(Object? message) : assert(false, message);
+}
+
+main() {}
+expect(expected, actual) {}
+Object? test(void Function() f) {}
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47994b.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..84a681d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.textual_outline_modelled.expect
@@ -0,0 +1,12 @@
+Object? test(void Function() f) {}
+
+class Class {
+ const Class(Object? message) : assert(false, message);
+}
+
+class Const {
+ const Const();
+}
+
+expect(expected, actual) {}
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.weak.expect b/pkg/front_end/testcases/general/issue47994b.dart.weak.expect
new file mode 100644
index 0000000..94d8be3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.weak.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class Class extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::Object? message) → self::Class
+ : assert(false, message), super core::Object::•()
+ ;
+}
+static method main() → dynamic {
+ self::expect(null, self::test(() → void {
+ assert(false);
+ }));
+ self::expect(null, self::test(() → void {
+ assert(false, null);
+ }));
+ self::expect("foo", self::test(() → void {
+ assert(false, "foo");
+ }));
+ self::expect(0, self::test(() → void {
+ assert(false, 0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ assert(false, #C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ assert(false, #C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ assert(false, #C3);
+ }));
+ self::expect(null, self::test(() → void {
+ new self::Class::•(null);
+ }));
+ self::expect("foo", self::test(() → void {
+ new self::Class::•("foo");
+ }));
+ self::expect(0, self::test(() → void {
+ new self::Class::•(0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ new self::Class::•(#C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ new self::Class::•(#C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ new self::Class::•(#C3);
+ }));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
+static method test(() → void f) → core::Object? {
+ try {
+ f(){() → void};
+ }
+ on core::AssertionError catch(final core::AssertionError e) {
+ core::print(e);
+ return e.{core::AssertionError::message}{core::Object?};
+ }
+ on core::Object catch(final core::Object e) {
+ throw "Unexpected exception ${e} (${e.{core::Object::runtimeType}{core::Type}}";
+ }
+ throw "Missing exception";
+}
+
+constants {
+ #C1 = <dynamic, dynamic>{)
+ #C2 = #org-dartlang-testcase:///issue47994b.dart::_symbol
+ #C3 = self::Const {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994b.dart:
+- Const. (from org-dartlang-testcase:///issue47994b.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.weak.modular.expect b/pkg/front_end/testcases/general/issue47994b.dart.weak.modular.expect
new file mode 100644
index 0000000..94d8be3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.weak.modular.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class Class extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::Object? message) → self::Class
+ : assert(false, message), super core::Object::•()
+ ;
+}
+static method main() → dynamic {
+ self::expect(null, self::test(() → void {
+ assert(false);
+ }));
+ self::expect(null, self::test(() → void {
+ assert(false, null);
+ }));
+ self::expect("foo", self::test(() → void {
+ assert(false, "foo");
+ }));
+ self::expect(0, self::test(() → void {
+ assert(false, 0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ assert(false, #C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ assert(false, #C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ assert(false, #C3);
+ }));
+ self::expect(null, self::test(() → void {
+ new self::Class::•(null);
+ }));
+ self::expect("foo", self::test(() → void {
+ new self::Class::•("foo");
+ }));
+ self::expect(0, self::test(() → void {
+ new self::Class::•(0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ new self::Class::•(#C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ new self::Class::•(#C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ new self::Class::•(#C3);
+ }));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
+static method test(() → void f) → core::Object? {
+ try {
+ f(){() → void};
+ }
+ on core::AssertionError catch(final core::AssertionError e) {
+ core::print(e);
+ return e.{core::AssertionError::message}{core::Object?};
+ }
+ on core::Object catch(final core::Object e) {
+ throw "Unexpected exception ${e} (${e.{core::Object::runtimeType}{core::Type}}";
+ }
+ throw "Missing exception";
+}
+
+constants {
+ #C1 = <dynamic, dynamic>{)
+ #C2 = #org-dartlang-testcase:///issue47994b.dart::_symbol
+ #C3 = self::Const {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994b.dart:
+- Const. (from org-dartlang-testcase:///issue47994b.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47994b.dart.weak.outline.expect
new file mode 100644
index 0000000..ebe1a07
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.weak.outline.expect
@@ -0,0 +1,20 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class Class extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::Object? message) → self::Class
+ : assert(false, message), super core::Object::•()
+ ;
+}
+static method main() → dynamic
+ ;
+static method expect(dynamic expected, dynamic actual) → dynamic
+ ;
+static method test(() → void f) → core::Object?
+ ;
diff --git a/pkg/front_end/testcases/general/issue47994b.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47994b.dart.weak.transformed.expect
new file mode 100644
index 0000000..94d8be3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47994b.dart.weak.transformed.expect
@@ -0,0 +1,84 @@
+library /*isNonNullableByDefault*/;
+import self as self;
+import "dart:core" as core;
+
+class Const extends core::Object /*hasConstConstructor*/ {
+ const constructor •() → self::Const
+ : super core::Object::•()
+ ;
+}
+class Class extends core::Object /*hasConstConstructor*/ {
+ const constructor •(core::Object? message) → self::Class
+ : assert(false, message), super core::Object::•()
+ ;
+}
+static method main() → dynamic {
+ self::expect(null, self::test(() → void {
+ assert(false);
+ }));
+ self::expect(null, self::test(() → void {
+ assert(false, null);
+ }));
+ self::expect("foo", self::test(() → void {
+ assert(false, "foo");
+ }));
+ self::expect(0, self::test(() → void {
+ assert(false, 0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ assert(false, #C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ assert(false, #C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ assert(false, #C3);
+ }));
+ self::expect(null, self::test(() → void {
+ new self::Class::•(null);
+ }));
+ self::expect("foo", self::test(() → void {
+ new self::Class::•("foo");
+ }));
+ self::expect(0, self::test(() → void {
+ new self::Class::•(0);
+ }));
+ self::expect(#C1, self::test(() → void {
+ new self::Class::•(#C1);
+ }));
+ self::expect(#C2, self::test(() → void {
+ new self::Class::•(#C2);
+ }));
+ self::expect(#C3, self::test(() → void {
+ new self::Class::•(#C3);
+ }));
+}
+static method expect(dynamic expected, dynamic actual) → dynamic {
+ if(!(expected =={core::Object::==}{(core::Object) → core::bool} actual))
+ throw "Expected ${expected}, actual ${actual}";
+}
+static method test(() → void f) → core::Object? {
+ try {
+ f(){() → void};
+ }
+ on core::AssertionError catch(final core::AssertionError e) {
+ core::print(e);
+ return e.{core::AssertionError::message}{core::Object?};
+ }
+ on core::Object catch(final core::Object e) {
+ throw "Unexpected exception ${e} (${e.{core::Object::runtimeType}{core::Type}}";
+ }
+ throw "Missing exception";
+}
+
+constants {
+ #C1 = <dynamic, dynamic>{)
+ #C2 = #org-dartlang-testcase:///issue47994b.dart::_symbol
+ #C3 = self::Const {}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///issue47994b.dart:
+- Const. (from org-dartlang-testcase:///issue47994b.dart:6:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 8d551bb..577ee4a 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -90,6 +90,7 @@
general/issue41210b/issue41210.no_link: TypeCheckError
general/issue41210b/issue41210: TypeCheckError
general/issue44733: TypeCheckError
+general/issue47994b: RuntimeError # Assertions are not enabled
general/issue_46886: RuntimeError
general/micro: RuntimeError
general/mixin_application_override: TypeCheckError
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index ae8b870..699bd29 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -104,6 +104,7 @@
general/issue41210b/issue41210.no_link: TypeCheckError
general/issue41210b/issue41210: TypeCheckError
general/issue44733: TypeCheckError
+general/issue47994b: RuntimeError # Assertions are not enabled
general/issue_46886: RuntimeError
general/micro: RuntimeError
general/mixin_application_override: ExpectationFileMismatch # Too many errors.
diff --git a/tools/VERSION b/tools/VERSION
index bc4419c..52d9513 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 16
PATCH 0
-PRERELEASE 136
+PRERELEASE 137
PRERELEASE_PATCH 0
\ No newline at end of file