[cfe] Add Resolver

This adds a Resolver class that encapsulates all use of the BodyBuilder. Furthermore, the external interface of BodyBuilder is extracted into the BodyBuilder interface and the BodyBuilderImpl implementation.

This is a step towards separating the BodyBuilder from the TypeInferrer. In future CLs the inferrer will be removed from BodyBuilder and Resolved will be responsible for first calling the BodyBuilder to create the uninferred AST nodes and then call the TypeInferrer to created the inferred and lowered AST nodes.


Change-Id: I198e2a65400555878d7b6c330fc6ef23be88851d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/449321
Reviewed-by: Jens Johansen <jensj@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Johnni Winther
2025-09-18 03:11:52 -07:00
committed by Commit Queue
parent 4df2a9515d
commit ef73551874
37 changed files with 1328 additions and 802 deletions
@@ -15,13 +15,12 @@ import 'package:kernel/ast.dart'
VariableDeclaration;
import 'package:kernel/class_hierarchy.dart';
import '../base/constant_context.dart' show ConstantContext;
import '../base/lookup_result.dart';
import '../base/modifiers.dart';
import '../base/scope.dart' show LookupScope;
import '../kernel/body_builder.dart' show BodyBuilder;
import '../kernel/body_builder_context.dart';
import '../kernel/internal_ast.dart' show VariableDeclarationImpl;
import '../kernel/resolver.dart';
import '../kernel/wildcard_lowering.dart';
import '../source/fragment_factory.dart';
import '../source/source_constructor_builder.dart';
@@ -296,32 +295,22 @@ class FormalParameterBuilder extends NamedBuilderImpl
declarationBuilder,
this,
);
BodyBuilder bodyBuilder = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
);
ConstantContext constantContext = ConstantContext.required;
bodyBuilder.constantContext = constantContext;
assert(!initializerWasInferred);
Expression initializer = bodyBuilder.parseFieldInitializer(
initializerToken!,
);
initializer = bodyBuilder.typeInferrer.inferParameterInitializer(
Resolver resolver = libraryBuilder.loader.createResolver();
Expression initializer = resolver.buildParameterInitializer(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
scope: scope,
fileUri: fileUri,
initializer: initializer,
initializerToken: initializerToken!,
declaredType: variable!.type,
hasDeclaredInitializer: hasDeclaredInitializer,
constantContext: constantContext,
);
variable!.initializer = initializer..parent = variable;
if (initializer is InvalidExpression) {
variable!.isErroneouslyInitialized = true;
}
initializerWasInferred = true;
bodyBuilder.performBacklogComputations();
} else if (kind.isOptional) {
// As done by BodyBuilder.endFormalParameter.
variable!.initializer = new NullLiteral()..parent = variable;
@@ -9,7 +9,6 @@ import 'package:kernel/clone.dart';
import '../base/loader.dart';
import '../base/scope.dart' show LookupScope;
import '../kernel/body_builder.dart' show BodyBuilder;
import '../kernel/body_builder_context.dart';
import '../kernel/macro/metadata.dart';
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
@@ -17,6 +16,22 @@ import '../source/source_library_builder.dart' show SourceLibraryBuilder;
bool computeSharedExpressionForTesting = false;
bool delaySharedExpressionLookupForTesting = false;
class Annotation {
final MetadataBuilder metadataBuilder;
final Token atToken;
final bool createFileUriExpression;
Annotation(
this.metadataBuilder,
this.atToken, {
required this.createFileUriExpression,
});
late int annotationIndex;
late Expression expression;
}
class MetadataBuilder {
/// Token for `@` for annotations that have not yet been parsed.
Token? _atToken;
@@ -56,30 +71,23 @@ class MetadataBuilder {
required Annotatable annotatable,
required Uri annotatableFileUri,
required List<MetadataBuilder>? metadata,
required Uri annotationsFileUri,
required BodyBuilderContext bodyBuilderContext,
required SourceLibraryBuilder libraryBuilder,
required LookupScope scope,
}) {
if (metadata == null) return;
// [BodyBuilder] used to build annotations from [Token]s.
BodyBuilder? bodyBuilder;
// Cloner used to clone already parsed annotations.
CloneVisitorNotMembers? cloner;
// Map from annotation builder of parsed annotations to the index of the
// corresponding annotation in `parent.annotations`.
//
// This is used to read the fully inferred annotation from [parent] and
// store it in `_expression` of the corresponding [MetadataBuilder].
Map<MetadataBuilder, int> parsedAnnotationBuilders = {};
List<int> indicesOfAnnotationsToBeInferred = [];
List<Annotation> annotations = [];
for (int i = 0; i < metadata.length; ++i) {
MetadataBuilder annotationBuilder = metadata[i];
bool createFileUriExpression =
annotatableFileUri != annotationBuilder.fileUri;
Token? beginToken = annotationBuilder._atToken;
annotationBuilder._atToken = null;
if (beginToken != null) {
if (computeSharedExpressionForTesting) {
// Coverage-ignore-block(suite): Not run.
@@ -102,29 +110,13 @@ class MetadataBuilder {
);
}
}
bodyBuilder ??= libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
annotationBuilder.fileUri,
);
Expression annotation = bodyBuilder.parseAnnotation(beginToken);
annotationBuilder._atToken = null;
if (createFileUriExpression) {
annotation = new FileUriExpression(
annotation,
annotationBuilder.fileUri,
)..fileOffset = annotationBuilder.atOffset;
}
// Record the index of [annotation] in `parent.annotations`.
int annotationIndex = annotatable.annotations.length;
parsedAnnotationBuilders[annotationBuilder] = annotationIndex;
indicesOfAnnotationsToBeInferred.add(annotationIndex);
// It is important for the inference and backlog computations that the
// annotation is already a child of [parent].
annotatable.addAnnotation(annotation);
annotations.add(
new Annotation(
annotationBuilder,
beginToken,
createFileUriExpression: createFileUriExpression,
),
);
} else {
// The annotation is needed for multiple declarations so we need to
// clone the expression to use it more than once. For instance
@@ -157,19 +149,16 @@ class MetadataBuilder {
annotatable.addAnnotation(annotation);
}
}
if (bodyBuilder != null) {
bodyBuilder.inferAnnotations(
annotatable,
annotatable.annotations,
indices: indicesOfAnnotationsToBeInferred,
);
bodyBuilder.performBacklogComputations();
for (MapEntry<MetadataBuilder, int> entry
in parsedAnnotationBuilders.entries) {
MetadataBuilder annotationBuilder = entry.key;
int index = entry.value;
annotationBuilder._expression = annotatable.annotations[index];
}
libraryBuilder.loader.createResolver().buildAnnotations(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
annotationsFileUri: annotationsFileUri,
scope: scope,
annotatable: annotatable,
annotations: annotations,
);
for (Annotation annotation in annotations) {
annotation.metadataBuilder._expression = annotation.expression;
}
}
}
@@ -81,6 +81,7 @@ class RegularClassDeclaration implements ClassDeclaration {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -147,6 +148,7 @@ class EnumDeclaration implements ClassDeclaration {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -214,6 +216,7 @@ class NamedMixinApplication implements ClassDeclaration {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -340,6 +343,7 @@ class MixinDeclaration implements ClassDeclaration {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -9,7 +9,6 @@ import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/type_algebra.dart';
import 'package:kernel/type_environment.dart';
import '../../base/constant_context.dart';
import '../../base/identifiers.dart';
import '../../base/local_scope.dart';
import '../../base/messages.dart';
@@ -23,9 +22,9 @@ import '../../builder/metadata_builder.dart';
import '../../builder/omitted_type_builder.dart';
import '../../builder/type_builder.dart';
import '../../builder/variable_builder.dart';
import '../../kernel/body_builder.dart';
import '../../kernel/body_builder_context.dart';
import '../../kernel/kernel_helper.dart';
import '../../kernel/resolver.dart';
import '../../kernel/type_algorithms.dart';
import '../../source/check_helper.dart';
import '../../source/name_scheme.dart';
@@ -244,19 +243,14 @@ mixin _ConstructorDeclarationMixin
List<Initializer>? initializers;
Token? beginInitializers = this._beginInitializers;
if (beginInitializers != null) {
BodyBuilder bodyBuilder = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
createBodyBuilderContext(constructorBuilder),
_typeParameterScope,
fileUri,
);
if (isConst) {
bodyBuilder.constantContext = ConstantContext.required;
}
initializers = bodyBuilder.parseInitializers(
beginInitializers,
doFinishConstructor: false,
Resolver resolver = libraryBuilder.loader.createResolver();
initializers = resolver.buildInitializersUnfinished(
libraryBuilder: libraryBuilder,
bodyBuilderContext: createBodyBuilderContext(constructorBuilder),
typeParameterScope: _typeParameterScope,
fileUri: fileUri,
beginInitializers: beginInitializers,
isConst: isConst,
);
}
_finalizeSuperInitializingFormals(
@@ -575,23 +569,17 @@ mixin _ConstructorDeclarationMixin
} else {
formalParameterScope = null;
}
BodyBuilder bodyBuilder = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
createBodyBuilderContext(constructorBuilder),
_typeParameterScope,
fileUri,
formalParameterScope: formalParameterScope,
);
if (isConst) {
bodyBuilder.constantContext = ConstantContext.required;
}
constructorBuilder.inferFormalTypes(bodyBuilder.hierarchy);
bodyBuilder.parseInitializers(
_beginInitializers!,
doFinishConstructor: isConst,
Resolver resolver = libraryBuilder.loader.createResolver();
resolver.buildInitializers(
libraryBuilder: libraryBuilder,
constructorBuilder: constructorBuilder,
typeParameterScope: _typeParameterScope,
formalParameterScope: formalParameterScope,
bodyBuilderContext: createBodyBuilderContext(constructorBuilder),
fileUri: fileUri,
beginInitializers: _beginInitializers!,
isConst: isConst,
);
bodyBuilder.performBacklogComputations();
}
}
@@ -998,6 +986,7 @@ class RegularConstructorDeclaration
annotatable: annotatable,
annotatableFileUri: annotatablesFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -94,6 +94,7 @@ class EnumElementDeclaration
];
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
@@ -135,7 +136,8 @@ class EnumElementDeclaration
bodyBuilderContext: bodyBuilderContext,
annotatable: annotatable,
annotatableFileUri: annotatablesFileUri,
metadata: metadata,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
}
}
@@ -358,82 +360,29 @@ class EnumElementDeclaration
length: noLength,
)..parent = _field;
} else if (libraryBuilder.libraryFeatures.enhancedEnums.isEnabled) {
// We need to create a BodyBuilder to solve the following: 1) if
// the arguments token is provided, we'll use the BodyBuilder to
// parse them and perform inference, 2) if the type arguments
// aren't provided, but required, we'll use it to infer them, and
// 3) in case of erroneous code the constructor invocation should
// be built via a body builder to detect potential errors.
ConstantContext constantContext = ConstantContext.inferred;
BodyBuilder bodyBuilder = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
sourceEnumBuilder.createBodyBuilderContext(),
_fragment.enclosingScope,
fileUri,
var (Expression initializer, DartType? fieldType) = libraryBuilder.loader
.createResolver()
.buildEnumConstant(
libraryBuilder: libraryBuilder,
bodyBuilderContext: sourceEnumBuilder.createBodyBuilderContext(),
scope: _fragment.enclosingScope,
token: token,
enumSyntheticArguments: enumSyntheticArguments,
enumTypeParameterCount: sourceEnumBuilder.typeParametersCount,
typeArguments: typeArguments,
constructorBuilder: constructorBuilder,
fileUri: fileUri,
fileOffset: fileOffset,
fullConstructorNameForErrors: fullConstructorNameForErrors,
);
bodyBuilder.constantContext = constantContext;
ArgumentsImpl arguments;
if (token != null) {
arguments = bodyBuilder.parseArguments(token);
// We pass `true` for [allowFurtherDelays] here because the members of
// the enums are built before the inference, and the resolution of the
// redirecting factories can't be completed at this moment and
// therefore should be delayed to another invocation of
// [BodyBuilder.performBacklogComputations].
bodyBuilder.performBacklogComputations();
arguments.positional.insertAll(0, enumSyntheticArguments);
arguments.argumentsOriginalOrder?.insertAll(0, enumSyntheticArguments);
} else {
arguments = new ArgumentsImpl(enumSyntheticArguments);
}
if (typeArguments != null) {
arguments.setExplicitTypeArguments(typeArguments);
} else if (sourceEnumBuilder.cls.typeParameters.isNotEmpty) {
arguments.types.addAll(
new List<DartType>.filled(
sourceEnumBuilder.cls.typeParameters.length,
const UnknownType(),
),
);
}
setParents(enumSyntheticArguments, arguments);
if (constructorBuilder == null ||
constructorBuilder is! SourceConstructorBuilder) {
assert(
_field!.initializer == null,
"Initializer has already been computed for $this: "
"${_field!.initializer}.",
);
_field!.initializer = bodyBuilder.buildUnresolvedError(
fullConstructorNameForErrors,
fileOffset,
kind: UnresolvedKind.Constructor,
)..parent = _field;
} else {
Expression initializer = bodyBuilder.buildConstructorInvocation(
constructorBuilder.invokeTarget,
arguments,
constness: Constness.explicitConst,
fileOffset: nameOffset,
);
ExpressionInferenceResult inferenceResult = bodyBuilder.typeInferrer
.inferFieldInitializer(
fileUri: fileUri,
constantContext: constantContext,
declaredType: const UnknownType(),
initializer: initializer,
);
initializer = inferenceResult.expression;
inferredFieldType = inferenceResult.inferredType;
assert(
_field!.initializer == null,
"Initializer has already been computed for $this: "
"${_field!.initializer}.",
);
_field!.initializer = initializer..parent = _field;
assert(
_field!.initializer == null,
"Initializer has already been computed for $this: "
"${_field!.initializer}.",
);
_field!.initializer = initializer..parent = _field;
if (fieldType != null) {
inferredFieldType = fieldType;
}
} else {
Arguments arguments = new Arguments(enumSyntheticArguments);
@@ -112,7 +112,6 @@ class _FactoryBodyBuildingContext implements FunctionBodyBuildingContext {
?.inferenceData;
@override
// Coverage-ignore(suite): Not run.
MemberKind get memberKind => MemberKind.Factory;
@override
@@ -214,6 +214,7 @@ class FactoryDeclarationImpl
annotatable: annotatable,
annotatableFileUri: annotatablesFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.enclosingScope,
@@ -20,15 +20,14 @@ import '../../builder/metadata_builder.dart';
import '../../builder/omitted_type_builder.dart';
import '../../builder/property_builder.dart';
import '../../builder/type_builder.dart';
import '../../kernel/body_builder.dart';
import '../../kernel/body_builder_context.dart';
import '../../source/check_helper.dart';
import '../../kernel/hierarchy/class_member.dart';
import '../../kernel/hierarchy/members_builder.dart';
import '../../kernel/implicit_field_type.dart';
import '../../kernel/late_lowering.dart' as late_lowering;
import '../../kernel/macro/metadata.dart';
import '../../kernel/type_algorithms.dart';
import '../../source/check_helper.dart';
import '../../source/name_scheme.dart';
import '../../source/source_class_builder.dart';
import '../../source/source_library_builder.dart';
@@ -243,6 +242,7 @@ class RegularFieldDeclaration
List<ClassMember> get localSetters => _encoding.localSetters;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
@@ -374,7 +374,8 @@ class RegularFieldDeclaration
bodyBuilderContext: bodyBuilderContext,
annotatable: annotatable,
annotatableFileUri: annotatablesFileUri,
metadata: metadata,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
}
// For modular compilation we need to include initializers of all const
@@ -388,27 +389,18 @@ class RegularFieldDeclaration
.declaresConstConstructor)) &&
token != null) {
LookupScope scope = _fragment.enclosingScope;
BodyBuilder bodyBuilder = libraryBuilder.loader
.createBodyBuilderForOutlineExpression(
libraryBuilder,
createBodyBuilderContext(),
scope,
fileUri,
);
ConstantContext constantContext = _fragment.modifiers.isConst
? ConstantContext.inferred
: ConstantContext.required;
bodyBuilder.constantContext = constantContext;
Expression initializer = bodyBuilder.typeInferrer
.inferFieldInitializer(
Expression initializer = libraryBuilder.loader
.createResolver()
.buildFieldInitializer2(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
fileUri: fileUri,
constantContext: constantContext,
declaredType: fieldType,
initializer: bodyBuilder.parseFieldInitializer(token),
)
.expression;
scope: scope,
isConst: isConst,
fieldType: fieldType,
startToken: token,
);
buildBody(classHierarchy.coreTypes, initializer);
bodyBuilder.performBacklogComputations();
if (computeSharedExpressionForTesting) {
// Coverage-ignore-block(suite): Not run.
_initializerExpression = parseFieldInitializer(
@@ -671,38 +663,22 @@ class RegularFieldDeclaration
)
: null;
LookupScope scope = _fragment.enclosingScope;
TypeInferrer typeInferrer = libraryBuilder.loader.typeInferenceEngine
.createTopLevelTypeInferrer(
fileUri,
enclosingClassThisType,
libraryBuilder,
scope,
builder
inferredType = libraryBuilder.loader
.createResolver()
.buildFieldInitializer1(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
scope: scope,
enclosingClassThisType: enclosingClassThisType,
inferenceDataForTesting: builder
.dataForTesting
// Coverage-ignore(suite): Not run.
?.inferenceData,
bodyBuilderContext: createBodyBuilderContext(),
startToken: token,
isConst: _fragment.modifiers.isConst,
isLate: _fragment.modifiers.isLate,
);
BodyBuilderContext bodyBuilderContext = createBodyBuilderContext();
BodyBuilder bodyBuilder = libraryBuilder.loader.createBodyBuilderForField(
libraryBuilder,
bodyBuilderContext,
scope,
typeInferrer,
fileUri,
);
ConstantContext constantContext = _fragment.modifiers.isConst
? ConstantContext.inferred
: ConstantContext.none;
bodyBuilder.constantContext = constantContext;
bodyBuilder.inFieldInitializer = true;
bodyBuilder.inLateFieldInitializer = _fragment.modifiers.isLate;
Expression initializer = bodyBuilder.parseFieldInitializer(token);
inferredType = typeInferrer.inferImplicitFieldType(
fileUri: fileUri,
constantContext: constantContext,
initializer: initializer,
);
} else {
inferredType = const DynamicType();
}
+1 -6
View File
@@ -32,11 +32,7 @@ import '../builder/omitted_type_builder.dart';
import '../builder/property_builder.dart';
import '../builder/type_builder.dart';
import '../builder/variable_builder.dart';
import '../kernel/body_builder.dart';
import '../kernel/body_builder_context.dart';
import '../source/check_helper.dart';
import '../kernel/constness.dart';
import '../kernel/expression_generator_helper.dart';
import '../kernel/hierarchy/class_member.dart';
import '../kernel/hierarchy/members_builder.dart';
import '../kernel/implicit_field_type.dart';
@@ -44,6 +40,7 @@ import '../kernel/internal_ast.dart';
import '../kernel/late_lowering.dart' as late_lowering;
import '../kernel/member_covariance.dart';
import '../kernel/type_algorithms.dart';
import '../source/check_helper.dart';
import '../source/fragment_factory.dart';
import '../source/name_scheme.dart';
import '../source/name_space_builder.dart';
@@ -61,10 +58,8 @@ import '../source/source_property_builder.dart';
import '../source/source_type_alias_builder.dart';
import '../source/source_type_parameter_builder.dart';
import '../source/type_parameter_factory.dart';
import '../type_inference/inference_results.dart';
import '../type_inference/type_inference_engine.dart';
import '../type_inference/type_inferrer.dart';
import '../type_inference/type_schema.dart';
import 'constructor/declaration.dart';
import 'factory/declaration.dart';
import 'field/declaration.dart';
@@ -248,6 +248,7 @@ mixin _DirectGetterEncodingMixin implements GetterEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
classHierarchy,
@@ -520,6 +521,7 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
@@ -176,6 +176,7 @@ mixin _DirectMethodEncodingMixin implements MethodEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
classHierarchy,
@@ -479,6 +480,7 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
@@ -86,6 +86,7 @@ class PrimaryConstructorFieldDeclaration
List<ClassMember> get localMembers => _encoding.localMembers;
@override
// Coverage-ignore(suite): Not run.
List<MetadataBuilder>? get metadata => _fragment.metadata;
@override
@@ -166,7 +167,8 @@ class PrimaryConstructorFieldDeclaration
bodyBuilderContext: bodyBuilderContext,
annotatable: annotatable,
annotatableFileUri: annotatablesFileUri,
metadata: metadata,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
}
}
@@ -433,33 +435,19 @@ class PrimaryConstructorFieldDeclaration
)
: null;
LookupScope scope = _fragment.enclosingScope;
TypeInferrer typeInferrer = libraryBuilder.loader.typeInferenceEngine
.createTopLevelTypeInferrer(
fileUri,
enclosingClassThisType,
libraryBuilder,
scope,
builder.dataForTesting?.inferenceData,
inferredType = libraryBuilder.loader
.createResolver()
.buildFieldInitializer1(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
scope: scope,
enclosingClassThisType: enclosingClassThisType,
inferenceDataForTesting: builder.dataForTesting?.inferenceData,
bodyBuilderContext: createBodyBuilderContext(),
startToken: token,
isConst: false,
isLate: false,
);
BodyBuilderContext bodyBuilderContext = createBodyBuilderContext();
BodyBuilder bodyBuilder = libraryBuilder.loader.createBodyBuilderForField(
libraryBuilder,
bodyBuilderContext,
scope,
typeInferrer,
fileUri,
);
ConstantContext constantContext = ConstantContext.none;
bodyBuilder.constantContext = constantContext;
bodyBuilder.inFieldInitializer = true;
bodyBuilder.inLateFieldInitializer = false;
Expression initializer = bodyBuilder.parseFieldInitializer(token);
inferredType = typeInferrer.inferImplicitFieldType(
fileUri: fileUri,
constantContext: constantContext,
initializer: initializer,
);
} else {
inferredType = const DynamicType();
}
@@ -245,6 +245,7 @@ mixin _DirectSetterEncodingMixin implements SetterEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
@@ -521,6 +522,7 @@ mixin _ExtensionInstanceSetterEncodingMixin implements SetterEncoding {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
);
buildTypeParametersForOutlineExpressions(
+2
View File
@@ -51,11 +51,13 @@ void buildMetadataForOutlineExpressions({
required BodyBuilderContext bodyBuilderContext,
required Annotatable annotatable,
required Uri annotatableFileUri,
required Uri annotationsFileUri,
required List<MetadataBuilder>? metadata,
}) {
MetadataBuilder.buildAnnotations(
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
annotationsFileUri: annotationsFileUri,
metadata: metadata,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
@@ -266,13 +266,14 @@ enum BenchmarkSubdivides {
body_buildBody_benchmark_specific_diet_parser,
body_buildBody_benchmark_specific_parser,
diet_listener_createListener,
diet_listener_buildFields,
diet_listener_buildFunctionBody,
diet_listener_buildFunctionBody_parseFunctionBody,
diet_listener_buildPrimaryConstructor,
diet_listener_buildRedirectingFactoryMethod,
resolver_createBodyBuilder,
resolver_buildFunctionBody,
inferImplicitFieldType,
inferFieldInitializer,
inferFunctionBody,
@@ -282,8 +283,4 @@ enum BenchmarkSubdivides {
inferRedirectingFactoryTypeArguments,
buildOutlineExpressions,
computeMacroApplications_macroExecutorProvider,
macroApplications_macroExecutorLoadMacro,
macroApplications_macroExecutorInstantiateMacro,
}
+442 -8
View File
@@ -47,6 +47,7 @@ import '../api_prototype/experimental_flags.dart';
import '../api_prototype/lowering_predicates.dart';
import '../base/compiler_context.dart';
import '../base/constant_context.dart' show ConstantContext;
import '../base/crash.dart';
import '../base/identifiers.dart'
show
Identifier,
@@ -61,7 +62,8 @@ import '../base/local_scope.dart';
import '../base/lookup_result.dart';
import '../base/messages.dart';
import '../base/modifiers.dart' show Modifiers;
import '../base/problems.dart' show internalProblem, unhandled, unsupported;
import '../base/problems.dart'
show internalProblem, unhandled, unsupported, DebugAbort;
import '../base/scope.dart';
import '../builder/builder.dart';
import '../builder/constructor_builder.dart';
@@ -98,14 +100,15 @@ import '../source/stack_listener_impl.dart'
import '../source/type_parameter_factory.dart';
import '../source/value_kinds.dart';
import '../type_inference/inference_results.dart'
show InitializerInferenceResult;
show InitializerInferenceResult, ExpressionInferenceResult;
import '../type_inference/inference_visitor.dart'
show ExpressionEvaluationHelper;
import '../type_inference/type_inferrer.dart'
show TypeInferrer, InferredFunctionBody;
import '../type_inference/type_schema.dart';
import '../util/helpers.dart';
import '../util/local_stack.dart';
import 'benchmarker.dart' show Benchmarker;
import 'benchmarker.dart' show Benchmarker, BenchmarkSubdivides;
import 'body_builder_context.dart';
import 'collections.dart';
import 'constness.dart' show Constness;
@@ -121,8 +124,94 @@ import 'utils.dart';
part 'body_builder_helpers.dart';
class BodyBuilder extends StackListenerImpl
implements ExpressionGeneratorHelper {
abstract class BodyBuilder {
void buildInitializers({
required Token beginInitializers,
required SourceConstructorBuilder constructorBuilder,
required bool isConst,
});
List<Initializer>? buildInitializersUnfinished({
required Token beginInitializers,
required bool isConst,
});
Expression buildParameterInitializer({
required Token initializerToken,
required DartType declaredType,
required bool hasDeclaredInitializer,
});
void buildRedirectingFactoryMethod({
required Token token,
required Token? metadata,
});
void buildPrimaryConstructor({required Token startToken});
void buildFunctionBody({
required Token startToken,
required Token? metadata,
required MemberKind kind,
});
/// Builds the uninferred [Expression] for an annotation starting at
/// [atToken].
Expression buildUnfinishedAnnotation({required Token atToken});
/// Infers the [Expression]s created by [buildUnfinishedAnnotation].
void inferUnfinishedAnnotations({
required Annotatable parent,
required List<Expression> annotations,
required List<int> indices,
});
/// Returns the metadata [Expression]s parsed from [metadata].
List<Expression> buildMetadataList({
required Token metadata,
required Annotatable? parent,
});
void buildFields({
required OffsetMap offsetMap,
required Token startToken,
required Token? metadata,
required bool isTopLevel,
});
Expression buildFieldInitializerUnfinished({
required Token startToken,
required ConstantContext constantContext,
required bool isLate,
});
Expression buildFieldInitializer2({
required Token startToken,
required bool isConst,
required Uri fileUri,
required DartType declaredFieldType,
});
(Expression, DartType?) buildEnumConstant({
required Token? token,
required List<Expression> enumSyntheticArguments,
required int enumTypeParameterCount,
required List<DartType>? typeArguments,
required MemberBuilder? constructorBuilder,
required int fileOffset,
required String fullConstructorNameForErrors,
});
Expression buildSingleExpression({
required Token token,
required Procedure procedure,
required List<VariableDeclarationImpl> extraKnownVariables,
required ExpressionEvaluationHelper expressionEvaluationHelper,
});
}
class BodyBuilderImpl extends StackListenerImpl
implements BodyBuilder, ExpressionGeneratorHelper {
@override
final Forest forest;
@@ -307,7 +396,7 @@ class BodyBuilder extends StackListenerImpl
/// Index for building unique lowered names for wildcard variables.
int wildcardVariableIndex = 0;
BodyBuilder({
BodyBuilderImpl({
required this.libraryBuilder,
required BodyBuilderContext context,
required this.enclosingScope,
@@ -341,7 +430,7 @@ class BodyBuilder extends StackListenerImpl
}
}
BodyBuilder.forField(
BodyBuilderImpl.forField(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
@@ -359,7 +448,7 @@ class BodyBuilder extends StackListenerImpl
typeInferrer: typeInferrer,
);
BodyBuilder.forOutlineExpression(
BodyBuilderImpl.forOutlineExpression(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
@@ -11994,4 +12083,349 @@ class BodyBuilder extends StackListenerImpl
constantContext = pop() as ConstantContext;
push(dotShorthand);
}
@override
void buildInitializers({
required Token beginInitializers,
required SourceConstructorBuilder constructorBuilder,
required bool isConst,
}) {
if (isConst) {
constantContext = ConstantContext.required;
}
constructorBuilder.inferFormalTypes(hierarchy);
parseInitializers(beginInitializers, doFinishConstructor: isConst);
performBacklogComputations();
}
@override
List<Initializer>? buildInitializersUnfinished({
required Token beginInitializers,
required bool isConst,
}) {
if (isConst) {
constantContext = ConstantContext.required;
}
return parseInitializers(beginInitializers, doFinishConstructor: false);
}
@override
Expression buildParameterInitializer({
required Token initializerToken,
required DartType declaredType,
required bool hasDeclaredInitializer,
}) {
constantContext = ConstantContext.required;
Expression initializer = parseFieldInitializer(initializerToken);
initializer = typeInferrer.inferParameterInitializer(
fileUri: uri,
initializer: initializer,
declaredType: declaredType,
hasDeclaredInitializer: hasDeclaredInitializer,
constantContext: constantContext,
);
performBacklogComputations();
return initializer;
}
@override
void buildRedirectingFactoryMethod({
required Token token,
required Token? metadata,
}) {
try {
Parser parser = new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
pop(); // Pops metadata constants.
}
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
MemberKind.Factory,
);
pop(); // Pops formal parameters.
finishRedirectingFactoryBody();
checkEmpty(token.next!.charOffset);
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
}
@override
void buildPrimaryConstructor({required Token startToken}) {
Token token = startToken;
try {
Parser parser = new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
MemberKind.PrimaryConstructor,
);
FormalParameters? formals = pop() as FormalParameters?;
checkEmpty(token.next!.charOffset);
handleNoInitializers();
checkEmpty(token.charOffset);
finishFunction(formals, AsyncMarker.Sync, null);
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
}
@override
void buildFunctionBody({
required Token startToken,
required Token? metadata,
required MemberKind kind,
}) {
Token token = startToken;
try {
Parser parser = new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
pop(); // Annotations.
}
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
kind,
);
FormalParameters? formals = pop() as FormalParameters?;
checkEmpty(token.next!.charOffset);
token = parser.parseInitializersOpt(token);
token = parser.parseAsyncModifierOpt(token);
AsyncMarker asyncModifier = pop() as AsyncMarker? ?? AsyncMarker.Sync;
if (kind == MemberKind.Factory && asyncModifier != AsyncMarker.Sync) {
// Factories has to be sync. The parser issued an error.
// Recover to sync.
asyncModifier = AsyncMarker.Sync;
}
bool isExpression = false;
bool allowAbstract = asyncModifier == AsyncMarker.Sync;
benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(
BenchmarkSubdivides.diet_listener_buildFunctionBody_parseFunctionBody,
);
parser.parseFunctionBody(token, isExpression, allowAbstract);
Statement? body = pop() as Statement?;
benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
checkEmpty(token.charOffset);
finishFunction(formals, asyncModifier, body);
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
}
@override
Expression buildUnfinishedAnnotation({required Token atToken}) {
return parseAnnotation(atToken);
}
@override
void inferUnfinishedAnnotations({
required Annotatable parent,
required List<Expression> annotations,
required List<int> indices,
}) {
inferAnnotations(parent, annotations, indices: indices);
performBacklogComputations();
}
@override
List<Expression> buildMetadataList({
required Token metadata,
required Annotatable? parent,
}) {
Parser parser = new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
return finishMetadata(parent);
}
@override
void buildFields({
required OffsetMap offsetMap,
required Token startToken,
required Token? metadata,
required bool isTopLevel,
}) {
Token token = startToken;
Parser parser = new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
if (isTopLevel) {
token = parser.parseTopLevelMember(metadata ?? token);
} else {
// TODO(danrubel): disambiguate between class/mixin/extension members
token = parser.parseClassMember(metadata ?? token, null).next!;
}
finishFields(offsetMap);
checkEmpty(token.charOffset);
}
@override
Expression buildFieldInitializerUnfinished({
required Token startToken,
required ConstantContext constantContext,
required bool isLate,
}) {
this.constantContext = constantContext;
inFieldInitializer = true;
inLateFieldInitializer = isLate;
return parseFieldInitializer(startToken);
}
@override
Expression buildFieldInitializer2({
required Token startToken,
required bool isConst,
required Uri fileUri,
required DartType declaredFieldType,
}) {
ConstantContext constantContext = isConst
? ConstantContext.inferred
: ConstantContext.required;
this.constantContext = constantContext;
Expression initializer = typeInferrer
.inferFieldInitializer(
fileUri: fileUri,
constantContext: constantContext,
declaredType: declaredFieldType,
initializer: parseFieldInitializer(startToken),
)
.expression;
performBacklogComputations();
return initializer;
}
@override
(Expression, DartType?) buildEnumConstant({
required Token? token,
required List<Expression> enumSyntheticArguments,
required int enumTypeParameterCount,
required List<DartType>? typeArguments,
required MemberBuilder? constructorBuilder,
required int fileOffset,
required String fullConstructorNameForErrors,
}) {
ConstantContext constantContext = ConstantContext.inferred;
this.constantContext = constantContext;
ArgumentsImpl arguments;
if (token != null) {
arguments = parseArguments(token);
// We pass `true` for [allowFurtherDelays] here because the members of
// the enums are built before the inference, and the resolution of the
// redirecting factories can't be completed at this moment and
// therefore should be delayed to another invocation of
// [BodyBuilderImpl.performBacklogComputations].
performBacklogComputations();
arguments.positional.insertAll(0, enumSyntheticArguments);
arguments.argumentsOriginalOrder?.insertAll(0, enumSyntheticArguments);
} else {
arguments = new ArgumentsImpl(enumSyntheticArguments);
}
if (typeArguments != null) {
arguments.setExplicitTypeArguments(typeArguments);
} else if (enumTypeParameterCount != 0) {
arguments.types.addAll(
new List<DartType>.filled(enumTypeParameterCount, const UnknownType()),
);
}
setParents(enumSyntheticArguments, arguments);
Expression initializer;
DartType? fieldType;
if (constructorBuilder == null ||
constructorBuilder is! SourceConstructorBuilder) {
initializer = buildUnresolvedError(
fullConstructorNameForErrors,
fileOffset,
kind: UnresolvedKind.Constructor,
);
} else {
initializer = buildConstructorInvocation(
constructorBuilder.invokeTarget,
arguments,
constness: Constness.explicitConst,
fileOffset: fileOffset,
);
ExpressionInferenceResult inferenceResult = typeInferrer
.inferFieldInitializer(
fileUri: uri,
constantContext: constantContext,
declaredType: const UnknownType(),
initializer: initializer,
);
initializer = inferenceResult.expression;
fieldType = inferenceResult.inferredType;
}
return (initializer, fieldType);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildSingleExpression({
required Token token,
required Procedure procedure,
required List<VariableDeclarationImpl> extraKnownVariables,
required ExpressionEvaluationHelper expressionEvaluationHelper,
}) {
for (VariableDeclaration variable
in procedure.function.positionalParameters) {
typeInferrer.assignedVariables.declare(variable);
}
return parseSingleExpression(
new Parser(
this,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryBuilder.libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts:
libraryBuilder.libraryFeatures.enhancedParts.isEnabled,
),
token,
procedure.function,
extraKnownVariables,
expressionEvaluationHelper,
);
}
}
@@ -18,7 +18,6 @@ import '../builder/library_builder.dart';
import '../builder/named_type_builder.dart';
import '../builder/type_builder.dart';
import '../dill/dill_class_builder.dart';
import '../source/diet_listener.dart';
import '../source/source_class_builder.dart';
import '../source/source_constructor_builder.dart';
import '../source/source_enum_builder.dart';
@@ -811,7 +810,6 @@ class ExpressionCompilerProcedureBodyBuildContext extends BodyBuilderContext {
final Procedure _procedure;
ExpressionCompilerProcedureBodyBuildContext(
DietListener listener,
this._procedure,
SourceLibraryBuilder libraryBuilder,
DeclarationBuilder? declarationBuilder, {
+637
View File
@@ -0,0 +1,637 @@
// Copyright (c) 2025, 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/scanner/token.dart' show Token;
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart';
import 'package:kernel/core_types.dart';
import '../base/constant_context.dart' show ConstantContext;
import '../base/local_scope.dart';
import '../base/scope.dart';
import '../builder/member_builder.dart';
import '../builder/metadata_builder.dart';
import '../fragment/fragment.dart';
import '../source/offset_map.dart';
import '../source/source_constructor_builder.dart';
import '../source/source_library_builder.dart';
import '../type_inference/inference_visitor.dart'
show ExpressionEvaluationHelper;
import '../type_inference/type_inference_engine.dart';
import '../type_inference/type_inferrer.dart' show TypeInferrer;
import 'benchmarker.dart' show Benchmarker, BenchmarkSubdivides;
import 'body_builder.dart';
import 'body_builder_context.dart';
import 'internal_ast.dart';
class Resolver {
final ClassHierarchy _classHierarchy;
final CoreTypes _coreTypes;
final TypeInferenceEngineImpl _typeInferenceEngine;
final Benchmarker? _benchmarker;
Resolver({
required ClassHierarchy classHierarchy,
required CoreTypes coreTypes,
required TypeInferenceEngineImpl typeInferenceEngine,
required Benchmarker? benchmarker,
}) : this._classHierarchy = classHierarchy,
this._coreTypes = coreTypes,
_typeInferenceEngine = typeInferenceEngine,
_benchmarker = benchmarker;
void buildInitializers({
required SourceLibraryBuilder libraryBuilder,
required SourceConstructorBuilder constructorBuilder,
required BodyBuilderContext bodyBuilderContext,
required LookupScope typeParameterScope,
required LocalScope? formalParameterScope,
required Uri fileUri,
required Token beginInitializers,
required bool isConst,
}) {
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
typeParameterScope,
fileUri,
formalParameterScope: formalParameterScope,
);
bodyBuilder.buildInitializers(
beginInitializers: beginInitializers,
constructorBuilder: constructorBuilder,
isConst: isConst,
);
}
List<Initializer>? buildInitializersUnfinished({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required LookupScope typeParameterScope,
required Uri fileUri,
required Token beginInitializers,
required bool isConst,
}) {
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
typeParameterScope,
fileUri,
);
return bodyBuilder.buildInitializersUnfinished(
beginInitializers: beginInitializers,
isConst: isConst,
);
}
Expression buildParameterInitializer({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required LookupScope scope,
required Uri fileUri,
required Token initializerToken,
required DartType declaredType,
required bool hasDeclaredInitializer,
}) {
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
);
return bodyBuilder.buildParameterInitializer(
initializerToken: initializerToken,
declaredType: declaredType,
hasDeclaredInitializer: hasDeclaredInitializer,
);
}
void buildRedirectingFactoryMethod({
required SourceLibraryBuilder libraryBuilder,
required FunctionBodyBuildingContext functionBodyBuildingContext,
required Uri fileUri,
required Token token,
required Token? metadata,
}) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(
BenchmarkSubdivides.diet_listener_buildRedirectingFactoryMethod,
);
BodyBuilder bodyBuilder = _createBodyBuilderForFunctionBody(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
functionBodyBuildingContext: functionBodyBuildingContext,
);
bodyBuilder.buildRedirectingFactoryMethod(token: token, metadata: metadata);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
void buildPrimaryConstructor({
required SourceLibraryBuilder libraryBuilder,
required FunctionBodyBuildingContext functionBodyBuildingContext,
required Uri fileUri,
required Token startToken,
}) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.diet_listener_buildPrimaryConstructor);
BodyBuilder bodyBuilder = _createBodyBuilderForFunctionBody(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
functionBodyBuildingContext: functionBodyBuildingContext,
);
bodyBuilder.buildPrimaryConstructor(startToken: startToken);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
void buildFunctionBody({
required SourceLibraryBuilder libraryBuilder,
required FunctionBodyBuildingContext functionBodyBuildingContext,
required Uri fileUri,
required Token startToken,
required Token? metadata,
}) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.resolver_buildFunctionBody);
BodyBuilder bodyBuilder = _createBodyBuilderForFunctionBody(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
functionBodyBuildingContext: functionBodyBuildingContext,
);
bodyBuilder.buildFunctionBody(
startToken: startToken,
metadata: metadata,
kind: functionBodyBuildingContext.memberKind,
);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
void buildAnnotations({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri annotationsFileUri,
required LookupScope scope,
required Annotatable annotatable,
required List<Annotation> annotations,
}) {
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
annotationsFileUri,
);
List<int> indicesOfAnnotationsToBeInferred = [];
for (Annotation annotation in annotations) {
Expression expression = bodyBuilder.buildUnfinishedAnnotation(
atToken: annotation.atToken,
);
if (annotation.createFileUriExpression) {
expression = new FileUriExpression(
expression,
annotation.metadataBuilder.fileUri,
)..fileOffset = annotation.metadataBuilder.atOffset;
}
// Record the index of [annotation] in `annotatable.annotations` in order
// to perform inference only on the new annotations, and to be able to
// store inferred [Expression] to the corresponding [MetadataBuilder]
// after inference.
int annotationIndex = annotation.annotationIndex =
annotatable.annotations.length;
indicesOfAnnotationsToBeInferred.add(annotationIndex);
// It is important for the inference and backlog computations that the
// annotation is already a child of [parent].
// TODO(johnniwinther): Is the parent relation still needed?
annotatable.addAnnotation(expression);
}
bodyBuilder.inferUnfinishedAnnotations(
parent: annotatable,
annotations: annotatable.annotations,
indices: indicesOfAnnotationsToBeInferred,
);
for (Annotation annotation in annotations) {
annotation.expression =
annotatable.annotations[annotation.annotationIndex];
}
}
List<Expression>? buildMetadata({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
required Token metadata,
required Annotatable? parent,
}) {
BodyBuilder bodyBuilder = _createBodyBuilder(
libraryBuilder: libraryBuilder,
fileUri: fileUri,
bodyBuilderContext: bodyBuilderContext,
scope: scope,
);
return bodyBuilder.buildMetadataList(metadata: metadata, parent: parent);
}
void buildFields({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required OffsetMap offsetMap,
required LookupScope scope,
required InferenceDataForTesting? inferenceDataForTesting,
required Token startToken,
required Token? metadata,
required bool isTopLevel,
}) {
// TODO(paulberry): don't re-parse the field if we've already parsed it
// for type inference.
BodyBuilder bodyBuilder = _createBodyBuilder(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
fileUri: fileUri,
scope: scope,
inferenceDataForTesting: inferenceDataForTesting,
);
bodyBuilder.buildFields(
offsetMap: offsetMap,
startToken: startToken,
metadata: metadata,
isTopLevel: isTopLevel,
);
}
// TODO(johnniwinther): Merge this with [buildFieldInitializer2].
DartType buildFieldInitializer1({
required SourceLibraryBuilder libraryBuilder,
required Uri fileUri,
required LookupScope scope,
required InterfaceType? enclosingClassThisType,
required InferenceDataForTesting? inferenceDataForTesting,
required BodyBuilderContext bodyBuilderContext,
required Token startToken,
required bool isConst,
required bool isLate,
}) {
TypeInferrer typeInferrer = _typeInferenceEngine.createTopLevelTypeInferrer(
fileUri,
enclosingClassThisType,
libraryBuilder,
scope,
inferenceDataForTesting,
);
BodyBuilder bodyBuilder = _createBodyBuilderForField(
libraryBuilder,
bodyBuilderContext,
scope,
typeInferrer,
fileUri,
);
ConstantContext constantContext = isConst
? ConstantContext.inferred
: ConstantContext.none;
Expression initializer = bodyBuilder.buildFieldInitializerUnfinished(
startToken: startToken,
constantContext: constantContext,
isLate: isLate,
);
DartType inferredType = typeInferrer.inferImplicitFieldType(
fileUri: fileUri,
constantContext: constantContext,
initializer: initializer,
);
return inferredType;
}
Expression buildFieldInitializer2({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
required bool isConst,
required DartType fieldType,
required Token startToken,
}) {
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
);
return bodyBuilder.buildFieldInitializer2(
startToken: startToken,
isConst: isConst,
fileUri: fileUri,
declaredFieldType: fieldType,
);
}
(Expression, DartType?) buildEnumConstant({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required LookupScope scope,
required Token? token,
required List<Expression> enumSyntheticArguments,
required int enumTypeParameterCount,
required List<DartType>? typeArguments,
required MemberBuilder? constructorBuilder,
required Uri fileUri,
required int fileOffset,
required String fullConstructorNameForErrors,
}) {
// We need to create a BodyBuilder to solve the following: 1) if
// the arguments token is provided, we'll use the BodyBuilder to
// parse them and perform inference, 2) if the type arguments
// aren't provided, but required, we'll use it to infer them, and
// 3) in case of erroneous code the constructor invocation should
// be built via a body builder to detect potential errors.
BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
);
return bodyBuilder.buildEnumConstant(
token: token,
enumSyntheticArguments: enumSyntheticArguments,
enumTypeParameterCount: enumTypeParameterCount,
typeArguments: typeArguments,
constructorBuilder: constructorBuilder,
fileOffset: fileOffset,
fullConstructorNameForErrors: fullConstructorNameForErrors,
);
}
// Coverage-ignore(suite): Not run.
Expression buildSingleExpression({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
required Token token,
required Procedure procedure,
required List<VariableDeclarationImpl> extraKnownVariables,
required ExpressionEvaluationHelper expressionEvaluationHelper,
required VariableDeclaration? extensionThis,
}) {
BodyBuilder bodyBuilder = _createBodyBuilder(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
fileUri: fileUri,
scope: scope,
thisVariable: extensionThis,
);
return bodyBuilder.buildSingleExpression(
token: token,
procedure: procedure,
extraKnownVariables: extraKnownVariables,
expressionEvaluationHelper: expressionEvaluationHelper,
);
}
BodyBuilder _createBodyBuilderForFunctionBody({
required SourceLibraryBuilder libraryBuilder,
required Uri fileUri,
required FunctionBodyBuildingContext functionBodyBuildingContext,
}) {
final LookupScope typeParameterScope =
functionBodyBuildingContext.typeParameterScope;
final LocalScope formalParameterScope = functionBodyBuildingContext
.computeFormalParameterScope(typeParameterScope);
return _createBodyBuilder(
libraryBuilder: libraryBuilder,
bodyBuilderContext: functionBodyBuildingContext
.createBodyBuilderContext(),
fileUri: fileUri,
scope: typeParameterScope,
thisVariable: functionBodyBuildingContext.thisVariable,
thisTypeParameters: functionBodyBuildingContext.thisTypeParameters,
formalParameterScope: formalParameterScope,
inferenceDataForTesting:
functionBodyBuildingContext.inferenceDataForTesting,
);
}
BodyBuilder _createBodyBuilderForOutlineExpression(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
}) {
return new BodyBuilderImpl.forOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
formalParameterScope: formalParameterScope,
);
}
BodyBuilder _createBodyBuilderForField(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
) {
return new BodyBuilderImpl.forField(
libraryBuilder,
bodyBuilderContext,
enclosingScope,
typeInferrer,
uri,
);
}
BodyBuilder _createBodyBuilder({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
VariableDeclaration? thisVariable,
List<TypeParameter>? thisTypeParameters,
LocalScope? formalParameterScope,
InferenceDataForTesting? inferenceDataForTesting,
}) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.resolver_createBodyBuilder);
// Note: we set thisType regardless of whether we are building a static
// member, since that provides better error recovery.
// TODO(johnniwinther): Provide a dummy this on static extension methods
// for better error recovery?
TypeInferrer typeInferrer = _typeInferenceEngine.createLocalTypeInferrer(
fileUri,
bodyBuilderContext.thisType,
libraryBuilder,
scope,
inferenceDataForTesting,
);
ConstantContext constantContext = bodyBuilderContext.constantContext;
BodyBuilder result = _createBodyBuilderInternal(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
fileUri: fileUri,
scope: scope,
formalParameterScope: formalParameterScope,
thisVariable: thisVariable,
thisTypeParameters: thisTypeParameters,
typeInferrer: typeInferrer,
constantContext: constantContext,
);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
return result;
}
BodyBuilder _createBodyBuilderInternal({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
required LocalScope? formalParameterScope,
required VariableDeclaration? thisVariable,
required List<TypeParameter>? thisTypeParameters,
required TypeInferrer typeInferrer,
required ConstantContext constantContext,
}) {
return new BodyBuilderImpl(
libraryBuilder: libraryBuilder,
context: bodyBuilderContext,
enclosingScope: new EnclosingLocalScope(scope),
formalParameterScope: formalParameterScope,
hierarchy: _classHierarchy,
coreTypes: _coreTypes,
thisVariable: thisVariable,
thisTypeParameters: thisTypeParameters,
uri: fileUri,
typeInferrer: typeInferrer,
)..constantContext = constantContext;
}
}
typedef BodyBuilderCreatorUnnamed =
BodyBuilder Function({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext context,
required LookupScope enclosingScope,
LocalScope? formalParameterScope,
required ClassHierarchy hierarchy,
required CoreTypes coreTypes,
VariableDeclaration? thisVariable,
List<TypeParameter>? thisTypeParameters,
required Uri uri,
required TypeInferrer typeInferrer,
required ConstantContext constantContext,
});
typedef BodyBuilderCreatorForField =
BodyBuilder Function(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
);
typedef BodyBuilderCreatorForOutlineExpression =
BodyBuilder Function(
SourceLibraryBuilder library,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
});
typedef BodyBuilderCreator = ({
BodyBuilderCreatorUnnamed create,
BodyBuilderCreatorForField createForField,
BodyBuilderCreatorForOutlineExpression createForOutlineExpression,
});
// Coverage-ignore(suite): Not run.
class ResolverForTesting extends Resolver {
final BodyBuilderCreator bodyBuilderCreator;
ResolverForTesting({
required super.classHierarchy,
required super.coreTypes,
required super.typeInferenceEngine,
required super.benchmarker,
required this.bodyBuilderCreator,
});
@override
BodyBuilder _createBodyBuilderForField(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
) {
return bodyBuilderCreator.createForField(
libraryBuilder,
bodyBuilderContext,
enclosingScope,
typeInferrer,
uri,
);
}
@override
BodyBuilder _createBodyBuilderForOutlineExpression(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
}) {
return bodyBuilderCreator.createForOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
formalParameterScope: formalParameterScope,
);
}
@override
BodyBuilder _createBodyBuilderInternal({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext bodyBuilderContext,
required Uri fileUri,
required LookupScope scope,
required LocalScope? formalParameterScope,
required VariableDeclaration? thisVariable,
required List<TypeParameter>? thisTypeParameters,
required TypeInferrer typeInferrer,
required ConstantContext constantContext,
}) {
return bodyBuilderCreator.create(
libraryBuilder: libraryBuilder,
context: bodyBuilderContext,
enclosingScope: scope,
formalParameterScope: formalParameterScope,
hierarchy: _classHierarchy,
coreTypes: _coreTypes,
thisVariable: thisVariable,
thisTypeParameters: thisTypeParameters,
uri: fileUri,
typeInferrer: typeInferrer,
constantContext: constantContext,
);
}
}
+47 -315
View File
@@ -8,20 +8,15 @@ import 'package:_fe_analyzer_shared/src/parser/parser.dart'
ConstructorReferenceContext,
DeclarationKind,
IdentifierContext,
MemberKind,
Parser;
MemberKind;
import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
import 'package:_fe_analyzer_shared/src/parser/stack_listener.dart'
show FixedNullableList, NullValues, ParserRecovery;
import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
import 'package:_fe_analyzer_shared/src/util/value_kind.dart';
import 'package:kernel/ast.dart';
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/core_types.dart' show CoreTypes;
import '../api_prototype/experimental_flags.dart';
import '../base/constant_context.dart' show ConstantContext;
import '../base/crash.dart' show Crash;
import '../base/identifiers.dart'
show
Identifier,
@@ -29,20 +24,13 @@ import '../base/identifiers.dart'
QualifiedNameIdentifier,
SimpleIdentifier;
import '../base/ignored_parser_errors.dart' show isIgnoredParserError;
import '../base/local_scope.dart';
import '../base/problems.dart' show DebugAbort;
import '../base/scope.dart';
import '../codes/cfe_codes.dart'
show Code, LocatedMessage, Message, codeExpectedBlockToSkip;
import '../fragment/fragment.dart';
import '../kernel/benchmarker.dart' show BenchmarkSubdivides, Benchmarker;
import '../kernel/body_builder.dart' show BodyBuilder, FormalParameters;
import '../kernel/body_builder_context.dart';
import '../source/value_kinds.dart';
import '../type_inference/type_inference_engine.dart'
show InferenceDataForTesting, TypeInferenceEngine;
import '../type_inference/type_inferrer.dart' show TypeInferrer;
import 'diet_parser.dart';
import 'offset_map.dart';
import 'source_library_builder.dart' show SourceLibraryBuilder;
import 'stack_listener_impl.dart';
@@ -57,14 +45,8 @@ class DietListener extends StackListenerImpl {
/// declaration in which the expression should be evaluated.
final LookupScope outermostScope;
final ClassHierarchy hierarchy;
final CoreTypes coreTypes;
final bool enableNative;
final TypeInferenceEngine typeInferenceEngine;
bool _inRedirectingFactory = false;
bool currentClassIsParserRecovery = false;
@@ -83,9 +65,6 @@ class DietListener extends StackListenerImpl {
DietListener(
SourceLibraryBuilder library,
this.outermostScope,
this.hierarchy,
this.coreTypes,
this.typeInferenceEngine,
this._offsetMap,
) : libraryBuilder = library,
uri = _offsetMap.uri,
@@ -415,15 +394,7 @@ class DietListener extends StackListenerImpl {
FunctionBodyBuildingContext functionBodyBuildingContext = functionFragment
.createFunctionBodyBuildingContext();
if (functionBodyBuildingContext.shouldBuild) {
final BodyBuilder listener = createFunctionListener(
functionBodyBuildingContext,
);
buildFunctionBody(
listener,
bodyToken,
metadata,
MemberKind.TopLevelMethod,
);
buildFunctionBody(functionBodyBuildingContext, bodyToken, metadata);
}
}
@@ -736,19 +707,15 @@ class DietListener extends StackListenerImpl {
.createFunctionBodyBuildingContext();
if (functionBodyBuildingContext.shouldBuild) {
if (_inRedirectingFactory) {
buildRedirectingFactoryMethod(
bodyToken,
functionBodyBuildingContext,
MemberKind.Factory,
metadata,
libraryBuilder.loader.createResolver().buildRedirectingFactoryMethod(
libraryBuilder: libraryBuilder,
functionBodyBuildingContext: functionBodyBuildingContext,
fileUri: uri,
token: bodyToken,
metadata: metadata,
);
} else {
buildFunctionBody(
createFunctionListener(functionBodyBuildingContext),
bodyToken,
metadata,
MemberKind.Factory,
);
buildFunctionBody(functionBodyBuildingContext, bodyToken, metadata);
}
}
}
@@ -955,140 +922,10 @@ class DietListener extends StackListenerImpl {
FunctionBodyBuildingContext functionBodyBuildingContext = functionFragment
.createFunctionBodyBuildingContext();
if (functionBodyBuildingContext.shouldBuild) {
MemberKind memberKind = functionBodyBuildingContext.memberKind;
buildFunctionBody(
createFunctionListener(functionBodyBuildingContext),
beginParam,
metadata,
memberKind,
);
buildFunctionBody(functionBodyBuildingContext, beginParam, metadata);
}
}
BodyBuilder createListener(
BodyBuilderContext bodyBuilderContext,
LookupScope memberScope, {
VariableDeclaration? thisVariable,
List<TypeParameter>? thisTypeParameters,
LocalScope? formalParameterScope,
InferenceDataForTesting? inferenceDataForTesting,
}) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.diet_listener_createListener);
// Note: we set thisType regardless of whether we are building a static
// member, since that provides better error recovery.
// TODO(johnniwinther): Provide a dummy this on static extension methods
// for better error recovery?
TypeInferrer typeInferrer = typeInferenceEngine.createLocalTypeInferrer(
uri,
bodyBuilderContext.thisType,
libraryBuilder,
memberScope,
inferenceDataForTesting,
);
ConstantContext constantContext = bodyBuilderContext.constantContext;
BodyBuilder result = createListenerInternal(
bodyBuilderContext,
memberScope,
formalParameterScope,
thisVariable,
thisTypeParameters,
typeInferrer,
constantContext,
);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
return result;
}
BodyBuilder createListenerInternal(
BodyBuilderContext bodyBuilderContext,
LookupScope memberScope,
LocalScope? formalParameterScope,
VariableDeclaration? thisVariable,
List<TypeParameter>? thisTypeParameters,
TypeInferrer typeInferrer,
ConstantContext constantContext,
) {
return new BodyBuilder(
libraryBuilder: libraryBuilder,
context: bodyBuilderContext,
enclosingScope: new EnclosingLocalScope(memberScope),
formalParameterScope: formalParameterScope,
hierarchy: hierarchy,
coreTypes: coreTypes,
thisVariable: thisVariable,
thisTypeParameters: thisTypeParameters,
uri: uri,
typeInferrer: typeInferrer,
)..constantContext = constantContext;
}
BodyBuilder createFunctionListener(
FunctionBodyBuildingContext functionBodyBuildingContext,
) {
final LookupScope typeParameterScope =
functionBodyBuildingContext.typeParameterScope;
final LocalScope formalParameterScope = functionBodyBuildingContext
.computeFormalParameterScope(typeParameterScope);
return createListener(
functionBodyBuildingContext.createBodyBuilderContext(),
typeParameterScope,
thisVariable: functionBodyBuildingContext.thisVariable,
thisTypeParameters: functionBodyBuildingContext.thisTypeParameters,
formalParameterScope: formalParameterScope,
inferenceDataForTesting:
functionBodyBuildingContext.inferenceDataForTesting,
);
}
void buildRedirectingFactoryMethod(
Token token,
FunctionBodyBuildingContext functionBodyBuildingContext,
MemberKind kind,
Token? metadata,
) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(
BenchmarkSubdivides.diet_listener_buildRedirectingFactoryMethod,
);
final BodyBuilder listener = createFunctionListener(
functionBodyBuildingContext,
);
try {
Parser parser = new Parser(
listener,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
listener.pop(); // Pops metadata constants.
}
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
MemberKind.Factory,
);
listener.pop(); // Pops formal parameters.
listener.finishRedirectingFactoryBody();
listener.checkEmpty(token.next!.charOffset);
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
void buildFields(int count, Token token, bool isTopLevel) {
assert(
checkState(
@@ -1110,22 +947,20 @@ class DietListener extends StackListenerImpl {
Identifier first = names.first!;
FieldFragment fragment = _offsetMap.lookupField(first);
// TODO(paulberry): don't re-parse the field if we've already parsed it
// for type inference.
_parseFields(
_offsetMap,
createListener(
fragment.declaration.createBodyBuilderContext(),
_memberScope,
inferenceDataForTesting: fragment
.builder
.dataForTesting
// Coverage-ignore(suite): Not run.
?.inferenceData,
),
token,
metadata,
isTopLevel,
libraryBuilder.loader.createResolver().buildFields(
libraryBuilder: libraryBuilder,
bodyBuilderContext: fragment.declaration.createBodyBuilderContext(),
fileUri: uri,
offsetMap: _offsetMap,
scope: _memberScope,
inferenceDataForTesting: fragment
.builder
.dataForTesting
// Coverage-ignore(suite): Not run.
?.inferenceData,
startToken: token,
metadata: metadata,
isTopLevel: isTopLevel,
);
checkEmpty(token.charOffset);
_benchmarker
@@ -1314,9 +1149,11 @@ class DietListener extends StackListenerImpl {
FunctionBodyBuildingContext functionBodyBuildingContext = functionFragment
.createFunctionBodyBuildingContext();
if (functionBodyBuildingContext.shouldBuild) {
buildPrimaryConstructor(
createFunctionListener(functionBodyBuildingContext),
formalsToken,
libraryBuilder.loader.createResolver().buildPrimaryConstructor(
libraryBuilder: libraryBuilder,
functionBodyBuildingContext: functionBodyBuildingContext,
fileUri: uri,
startToken: formalsToken,
);
}
@@ -1468,128 +1305,24 @@ class DietListener extends StackListenerImpl {
checkEmpty(beginToken.charOffset);
}
AsyncMarker? getAsyncMarker(StackListenerImpl listener) =>
listener.pop() as AsyncMarker?;
void buildPrimaryConstructor(BodyBuilder bodyBuilder, Token startToken) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.diet_listener_buildPrimaryConstructor);
Token token = startToken;
try {
Parser parser = new Parser(
bodyBuilder,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
MemberKind.PrimaryConstructor,
);
FormalParameters? formals = bodyBuilder.pop() as FormalParameters?;
bodyBuilder.checkEmpty(token.next!.charOffset);
bodyBuilder.handleNoInitializers();
bodyBuilder.checkEmpty(token.charOffset);
bodyBuilder.finishFunction(formals, AsyncMarker.Sync, null);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
}
void buildFunctionBody(
BodyBuilder bodyBuilder,
FunctionBodyBuildingContext functionBodyBuildingContext,
Token startToken,
Token? metadata,
MemberKind kind,
) {
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(BenchmarkSubdivides.diet_listener_buildFunctionBody);
Token token = startToken;
try {
Parser parser = new Parser(
bodyBuilder,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
);
if (metadata != null) {
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
bodyBuilder.pop(); // Annotations.
}
token = parser.parseFormalParametersOpt(
parser.syntheticPreviousToken(token),
kind,
);
FormalParameters? formals = bodyBuilder.pop() as FormalParameters?;
bodyBuilder.checkEmpty(token.next!.charOffset);
token = parser.parseInitializersOpt(token);
token = parser.parseAsyncModifierOpt(token);
AsyncMarker asyncModifier =
getAsyncMarker(bodyBuilder) ?? AsyncMarker.Sync;
if (kind == MemberKind.Factory && asyncModifier != AsyncMarker.Sync) {
// Factories has to be sync. The parser issued an error.
// Recover to sync.
asyncModifier = AsyncMarker.Sync;
}
bool isExpression = false;
bool allowAbstract = asyncModifier == AsyncMarker.Sync;
_benchmarker
// Coverage-ignore(suite): Not run.
?.beginSubdivide(
BenchmarkSubdivides.diet_listener_buildFunctionBody_parseFunctionBody,
);
parser.parseFunctionBody(token, isExpression, allowAbstract);
Statement? body = bodyBuilder.pop() as Statement?;
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
bodyBuilder.checkEmpty(token.charOffset);
bodyBuilder.finishFunction(formals, asyncModifier, body);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
// Coverage-ignore(suite): Not run.
on DebugAbort {
rethrow;
} catch (e, s) {
throw new Crash(uri, token.charOffset, e, s);
}
}
void _parseFields(
OffsetMap offsetMap,
BodyBuilder bodyBuilder,
Token startToken,
Token? metadata,
bool isTopLevel,
) {
Token token = startToken;
Parser parser = new Parser(
bodyBuilder,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
?.beginSubdivide(BenchmarkSubdivides.resolver_buildFunctionBody);
libraryBuilder.loader.createResolver().buildFunctionBody(
libraryBuilder: libraryBuilder,
functionBodyBuildingContext: functionBodyBuildingContext,
fileUri: uri,
startToken: startToken,
metadata: metadata,
);
if (isTopLevel) {
token = parser.parseTopLevelMember(metadata ?? token);
} else {
// TODO(danrubel): disambiguate between class/mixin/extension members
token = parser.parseClassMember(metadata ?? token, null).next!;
}
bodyBuilder.finishFields(_offsetMap);
bodyBuilder.checkEmpty(token.charOffset);
_benchmarker
// Coverage-ignore(suite): Not run.
?.endSubdivide();
}
@override
@@ -1623,15 +1356,14 @@ class DietListener extends StackListenerImpl {
Annotatable? parent,
) {
if (metadata != null) {
BodyBuilder listener = createListener(bodyBuilderContext, _memberScope);
Parser parser = new Parser(
listener,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts: libraryFeatures.enhancedParts.isEnabled,
return libraryBuilder.loader.createResolver().buildMetadata(
libraryBuilder: libraryBuilder,
bodyBuilderContext: bodyBuilderContext,
fileUri: uri,
scope: _memberScope,
metadata: metadata,
parent: parent,
);
parser.parseMetadataStar(parser.syntheticPreviousToken(metadata));
return listener.finishMetadata(parent);
}
return null;
}
@@ -1109,6 +1109,7 @@ class SourceCompilationUnitImpl implements SourceCompilationUnit {
annotatable: annotatable,
annotatableFileUri: annotatableFileUri,
metadata: metadata,
annotationsFileUri: fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: compilationUnitScope,
@@ -204,6 +204,7 @@ class SourceExtensionBuilder extends ExtensionBuilderImpl
annotatable: extension,
annotatableFileUri: extension.fileUri,
metadata: fragment.metadata,
annotationsFileUri: fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: fragment.enclosingScope,
@@ -834,6 +834,7 @@ class SourceExtensionTypeDeclarationBuilder
annotatable: extensionTypeDeclaration,
annotatableFileUri: extensionTypeDeclaration.fileUri,
metadata: _introductory.metadata,
annotationsFileUri: _introductory.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _introductory.enclosingScope,
+21 -73
View File
@@ -38,7 +38,6 @@ import '../base/export.dart' show Export;
import '../base/import_chains.dart';
import '../base/instrumentation.dart' show Instrumentation;
import '../base/loader.dart' show Loader, untranslatableUriScheme;
import '../base/local_scope.dart';
import '../base/lookup_result.dart';
import '../base/messages.dart';
import '../base/problems.dart' show internalProblem;
@@ -58,7 +57,6 @@ import '../codes/denylisted_classes.dart'
show denylistedCoreClasses, denylistedTypedDataClasses;
import '../dill/dill_library_builder.dart';
import '../kernel/benchmarker.dart' show BenchmarkSubdivides;
import '../kernel/body_builder.dart' show BodyBuilder;
import '../kernel/body_builder_context.dart';
import '../kernel/exhaustiveness.dart';
import '../kernel/hierarchy/class_member.dart';
@@ -69,14 +67,14 @@ import '../kernel/hierarchy/members_builder.dart';
import '../kernel/kernel_helper.dart'
show DelayedDefaultValueCloner, TypeDependency;
import '../kernel/kernel_target.dart' show KernelTarget;
import '../kernel/resolver.dart';
import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
import '../type_inference/inference_visitor.dart'
show ExpressionEvaluationHelper;
import '../type_inference/type_inference_engine.dart';
import '../type_inference/type_inferrer.dart';
import '../util/reference_map.dart';
import 'diet_listener.dart' show DietListener;
import 'diet_parser.dart' show DietParser, useImplicitCreationExpressionInCfe;
import 'diet_parser.dart' show DietParser;
import 'offset_map.dart';
import 'outline_builder.dart' show OutlineBuilder;
import 'source_class_builder.dart' show SourceClassBuilder;
@@ -1003,22 +1001,6 @@ severity: $severity
annotatable.addAnnotation(annotation);
}
BodyBuilder createBodyBuilderForOutlineExpression(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
}) {
return new BodyBuilder.forOutlineExpression(
libraryBuilder,
bodyBuilderContext,
scope,
fileUri,
formalParameterScope: formalParameterScope,
);
}
CoreTypes get coreTypes {
assert(_coreTypes != null, "CoreTypes has not been computed.");
return _coreTypes!;
@@ -1486,42 +1468,22 @@ severity: $severity
suppressLexicalErrors: false,
allowLazyStrings: false,
);
DietListener dietListener = createDietListener(
libraryBuilder,
memberScope,
// Expression compilation doesn't build an outline, and thus doesn't
// support members from source, so we provide an empty [DeclarationMap].
new OffsetMap(libraryBuilder.fileUri),
);
BodyBuilder listener = dietListener.createListener(
new ExpressionCompilerProcedureBodyBuildContext(
dietListener,
return createResolver().buildSingleExpression(
libraryBuilder: libraryBuilder,
bodyBuilderContext: new ExpressionCompilerProcedureBodyBuildContext(
procedure,
libraryBuilder,
declarationBuilder,
isDeclarationInstanceMember: isClassInstanceMember,
),
memberScope,
thisVariable: extensionThis,
);
for (VariableDeclaration variable
in procedure.function.positionalParameters) {
listener.typeInferrer.assignedVariables.declare(variable);
}
return listener.parseSingleExpression(
new Parser(
listener,
useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
allowPatterns: libraryBuilder.libraryFeatures.patterns.isEnabled,
enableFeatureEnhancedParts:
libraryBuilder.libraryFeatures.enhancedParts.isEnabled,
),
token,
procedure.function,
extraKnownVariables,
expressionEvaluationHelper,
fileUri: libraryBuilder.fileUri,
scope: memberScope,
token: token,
procedure: procedure,
extraKnownVariables: extraKnownVariables,
expressionEvaluationHelper: expressionEvaluationHelper,
extensionThis: extensionThis,
);
}
@@ -1530,13 +1492,15 @@ severity: $severity
LookupScope compilationUnitScope,
OffsetMap offsetMap,
) {
return new DietListener(
library,
compilationUnitScope,
hierarchy,
coreTypes,
typeInferenceEngine,
offsetMap,
return new DietListener(library, compilationUnitScope, offsetMap);
}
Resolver createResolver() {
return new Resolver(
classHierarchy: hierarchy,
coreTypes: coreTypes,
typeInferenceEngine: typeInferenceEngine,
benchmarker: target.benchmarker,
);
}
@@ -3201,22 +3165,6 @@ severity: $severity
TypeBuilder computeTypeBuilder(DartType type) {
return _typeBuilderComputer.visit(type);
}
BodyBuilder createBodyBuilderForField(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
) {
return new BodyBuilder.forField(
libraryBuilder,
bodyBuilderContext,
enclosingScope,
typeInferrer,
uri,
);
}
}
/// A minimal implementation of dart:core that is sufficient to create an
@@ -420,6 +420,7 @@ class SourceTypeAliasBuilder extends TypeAliasBuilderImpl {
annotatable: typedef,
annotatableFileUri: typedef.fileUri,
metadata: _introductory.metadata,
annotationsFileUri: _introductory.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _introductory.enclosingScope,
@@ -150,6 +150,7 @@ class RegularNominalParameterDeclaration
annotatable: parameter,
annotatableFileUri: annotatableFileUri,
metadata: _fragment.metadata,
annotationsFileUri: _fragment.fileUri,
bodyBuilderContext: bodyBuilderContext,
libraryBuilder: libraryBuilder,
scope: _fragment.typeParameterScope,
@@ -19,7 +19,7 @@ import 'package:front_end/src/builder/declaration_builders.dart'
show TypeDeclarationBuilder;
import 'package:front_end/src/builder/type_builder.dart' show TypeBuilder;
import 'package:front_end/src/codes/cfe_codes.dart' as cfe show codeUnspecified;
import 'package:front_end/src/kernel/body_builder.dart' show BodyBuilder;
import 'package:front_end/src/kernel/body_builder.dart' show BodyBuilderImpl;
import 'package:front_end/src/kernel/constness.dart' show Constness;
import 'package:front_end/src/kernel/expression_generator_helper.dart'
show UnresolvedKind;
@@ -239,7 +239,7 @@ Set<Uri> _replaceParts(Uri packageConfigUri, Set<Uri> files) {
class BodyBuilderTester = BodyBuilderTest with BodyBuilderTestMixin;
mixin BodyBuilderTestMixin on BodyBuilder {
mixin BodyBuilderTestMixin on BodyBuilderImpl {
late Set<Uri> _ignoredDirs = {
..._ignoredDirectoryUris,
..._explicitCreationIgnoredDirectoryUris,
+13 -127
View File
@@ -21,8 +21,7 @@ import 'package:front_end/src/dill/dill_target.dart';
import 'package:front_end/src/kernel/body_builder.dart';
import 'package:front_end/src/kernel/body_builder_context.dart';
import 'package:front_end/src/kernel/kernel_target.dart';
import 'package:front_end/src/source/diet_listener.dart';
import 'package:front_end/src/source/offset_map.dart';
import 'package:front_end/src/kernel/resolver.dart';
import 'package:front_end/src/source/source_library_builder.dart';
import 'package:front_end/src/source/source_loader.dart';
import 'package:front_end/src/type_inference/type_inferrer.dart';
@@ -269,140 +268,24 @@ class SourceLoaderTest extends SourceLoader {
) : super(fileSystem, includeComments, target);
@override
DietListener createDietListener(
SourceLibraryBuilder library,
LookupScope compilationUnitScope,
OffsetMap offsetMap,
) {
return new DietListenerTest(
library,
compilationUnitScope,
hierarchy,
coreTypes,
typeInferenceEngine,
offsetMap,
bodyBuilderCreator,
);
}
@override
BodyBuilder createBodyBuilderForOutlineExpression(
SourceLibraryBuilder library,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
}) {
return bodyBuilderCreator.createForOutlineExpression(
library,
bodyBuilderContext,
scope,
fileUri,
formalParameterScope: formalParameterScope,
);
}
@override
BodyBuilder createBodyBuilderForField(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
) {
return bodyBuilderCreator.createForField(
libraryBuilder,
bodyBuilderContext,
enclosingScope,
typeInferrer,
uri,
);
}
}
class DietListenerTest extends DietListener {
final BodyBuilderCreator bodyBuilderCreator;
DietListenerTest(
super.library,
super.compilationUnitScope,
super.hierarchy,
super.coreTypes,
super.typeInferenceEngine,
super.offsetMap,
this.bodyBuilderCreator,
);
@override
BodyBuilder createListenerInternal(
BodyBuilderContext bodyBuilderContext,
LookupScope memberScope,
LocalScope? formalParameterScope,
VariableDeclaration? extensionThis,
List<TypeParameter>? extensionTypeParameters,
TypeInferrer typeInferrer,
ConstantContext constantContext,
) {
return bodyBuilderCreator.create(
libraryBuilder: libraryBuilder,
context: bodyBuilderContext,
enclosingScope: memberScope,
formalParameterScope: formalParameterScope,
hierarchy: hierarchy,
Resolver createResolver() {
return new ResolverForTesting(
classHierarchy: hierarchy,
coreTypes: coreTypes,
thisVariable: extensionThis,
thisTypeParameters: extensionTypeParameters,
uri: uri,
typeInferrer: typeInferrer,
)..constantContext = constantContext;
typeInferenceEngine: typeInferenceEngine,
benchmarker: target.benchmarker,
bodyBuilderCreator: bodyBuilderCreator,
);
}
}
typedef BodyBuilderCreatorUnnamed =
BodyBuilderTest Function({
required SourceLibraryBuilder libraryBuilder,
required BodyBuilderContext context,
required LookupScope enclosingScope,
LocalScope? formalParameterScope,
required ClassHierarchy hierarchy,
required CoreTypes coreTypes,
VariableDeclaration? thisVariable,
List<TypeParameter>? thisTypeParameters,
required Uri uri,
required TypeInferrer typeInferrer,
});
typedef BodyBuilderCreatorForField =
BodyBuilderTest Function(
SourceLibraryBuilder libraryBuilder,
BodyBuilderContext bodyBuilderContext,
LookupScope enclosingScope,
TypeInferrer typeInferrer,
Uri uri,
);
typedef BodyBuilderCreatorForOutlineExpression =
BodyBuilderTest Function(
SourceLibraryBuilder library,
BodyBuilderContext bodyBuilderContext,
LookupScope scope,
Uri fileUri, {
LocalScope? formalParameterScope,
});
typedef BodyBuilderCreator = ({
BodyBuilderCreatorUnnamed create,
BodyBuilderCreatorForField createForField,
BodyBuilderCreatorForOutlineExpression createForOutlineExpression,
});
const BodyBuilderCreator defaultBodyBuilderCreator = (
create: BodyBuilderTest.new,
createForField: BodyBuilderTest.forField,
createForOutlineExpression: BodyBuilderTest.forOutlineExpression,
);
class BodyBuilderTest extends BodyBuilder {
class BodyBuilderTest extends BodyBuilderImpl {
@override
BodyBuilderTest({
required SourceLibraryBuilder libraryBuilder,
@@ -415,6 +298,7 @@ class BodyBuilderTest extends BodyBuilder {
List<TypeParameter>? thisTypeParameters,
required Uri uri,
required TypeInferrer typeInferrer,
required ConstantContext constantContext,
}) : super(
libraryBuilder: libraryBuilder,
context: context,
@@ -426,7 +310,9 @@ class BodyBuilderTest extends BodyBuilder {
thisTypeParameters: thisTypeParameters,
uri: uri,
typeInferrer: typeInferrer,
);
) {
this.constantContext = constantContext;
}
@override
BodyBuilderTest.forField(
@@ -20,7 +20,7 @@ import 'package:front_end/src/codes/cfe_codes.dart'
show Message, codeUnspecified;
import 'package:front_end/src/dill/dill_target.dart' show DillTarget;
import 'package:front_end/src/dill/dill_type_parameter_builder.dart';
import 'package:front_end/src/kernel/body_builder.dart' show BodyBuilder;
import 'package:front_end/src/kernel/body_builder.dart' show BodyBuilderImpl;
import 'package:front_end/src/kernel/body_builder_context.dart';
import 'package:front_end/src/kernel/expression_generator.dart';
import 'package:front_end/src/kernel/expression_generator_helper.dart';
@@ -178,7 +178,7 @@ Future<void> main() async {
TypeInferenceEngineImpl engine = new TypeInferenceEngineImpl(null, null);
engine.prepareTopLevel(coreTypes, hierarchy);
BodyBuilder helper = new BodyBuilder(
ExpressionGeneratorHelper helper = new BodyBuilderImpl(
libraryBuilder: libraryBuilder,
context: new LibraryBodyBuilderContext(libraryBuilder),
uri: uri,
@@ -2052,6 +2052,7 @@ unifies
uniform
unify
uninferable
uninferred
uninhabited
uninstantiable
uninstantiated
@@ -10,6 +10,7 @@ import 'package:front_end/src/base/compiler_context.dart';
import 'package:front_end/src/base/uri_translator.dart';
import 'package:front_end/src/dill/dill_target.dart';
import 'package:front_end/src/kernel/kernel_target.dart';
import 'package:front_end/src/kernel/resolver.dart';
import 'package:kernel/ast.dart' show CanonicalName, Class;
import 'package:vm_service/vm_service.dart' as vmService;
import "package:vm_service/vm_service_io.dart" as vmServiceIo;
@@ -72,7 +72,7 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///constructor_calls.dart:7:7 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "one"})
Evaluated: StaticGet @ org-dartlang-testcase:///constructor_calls.dart:5:6 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"})
Extra constant evaluation: evaluated: 15, effectively constant: 4
@@ -31,7 +31,7 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E<int, String>{_Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E<double, num>{_Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E<int, int>{_Enum.index: 2, _Enum._name: "three"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:19 -> InstanceConstant(const E<int, int>{_Enum.index: 2, _Enum._name: "three"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:9:3 -> InstanceConstant(const E<num, bool>{_Enum.index: 3, _Enum._name: "four"})
Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E<dynamic, dynamic>>[const E<int, String>{_Enum.index: 0, _Enum._name: "one"}, const E<double, num>{_Enum.index: 1, _Enum._name: "two"}, const E<int, int>{_Enum.index: 2, _Enum._name: "three"}, const E<num, bool>{_Enum.index: 3, _Enum._name: "four"}])
Extra constant evaluation: evaluated: 12, effectively constant: 5
@@ -206,7 +206,7 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///missed_checks.dart:6:3 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///missed_checks.dart:6:11 -> InstanceConstant(const E1{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///missed_checks.dart:5:6 -> ListConstant(const <E1>[const E1{_Enum.index: 0, _Enum._name: "element"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///missed_checks.dart:11:3 -> InstanceConstant(const E2<dynamic>{_Enum.index: 0, _Enum._name: "element"})
Evaluated: ListLiteral @ org-dartlang-testcase:///missed_checks.dart:10:6 -> ListConstant(const <E2<dynamic>>[const E2<dynamic>{_Enum.index: 0, _Enum._name: "element"}])
@@ -36,8 +36,8 @@ Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:6:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 0, _Enum._name: "a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:7:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 1, _Enum._name: "b"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:8:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 2, _Enum._name: "c"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:9:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 3, _Enum._name: "d"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:10:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 4, _Enum._name: "e"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:11:3 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 5, _Enum._name: "f"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:9:5 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 3, _Enum._name: "d"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:10:5 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 4, _Enum._name: "e"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_constructor.dart:11:5 -> InstanceConstant(const C{C.log: "x=1, y=2, z=3", _Enum.index: 5, _Enum._name: "f"})
Evaluated: ListLiteral @ org-dartlang-testcase:///redirecting_constructor.dart:5:6 -> ListConstant(const <C>[const C{C.log: "x=1, y=2, z=3", _Enum.index: 0, _Enum._name: "a"}, const C{C.log: "x=1, y=2, z=3", _Enum.index: 1, _Enum._name: "b"}, const C{C.log: "x=1, y=2, z=3", _Enum.index: 2, _Enum._name: "c"}, const C{C.log: "x=1, y=2, z=3", _Enum.index: 3, _Enum._name: "d"}, const C{C.log: "x=1, y=2, z=3", _Enum.index: 4, _Enum._name: "e"}, const C{C.log: "x=1, y=2, z=3", _Enum.index: 5, _Enum._name: "f"}])
Extra constant evaluation: evaluated: 38, effectively constant: 7
@@ -16,6 +16,6 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "a"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:6:5 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "a"})
Evaluated: ListLiteral @ org-dartlang-testcase:///qualified_names_with_no_type_arguments.dart:5:6 -> ListConstant(const <E>[const E{_Enum.index: 0, _Enum._name: "a"}])
Extra constant evaluation: evaluated: 7, effectively constant: 2
@@ -47,7 +47,7 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:6:3 -> InstanceConstant(const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:7:3 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:7:7 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
Evaluated: ListLiteral @ org-dartlang-testcase:///redirecting_initializers.dart:5:6 -> ListConstant(const <E1>[const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"}, const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///redirecting_initializers.dart:16:3 -> InstanceConstant(const E2{E2.foo: 1, _Enum.index: 0, _Enum._name: "one"})
Evaluated: StaticGet @ org-dartlang-testcase:///redirecting_initializers.dart:15:6 -> InstanceConstant(const E2{E2.foo: 1, _Enum.index: 0, _Enum._name: "one"})
@@ -38,10 +38,10 @@ static method main() → dynamic
Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:6:3 -> InstanceConstant(const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:7:3 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:7:7 -> InstanceConstant(const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"})
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:5:6 -> ListConstant(const <E1>[const E1{E1.foo: 1, _Enum.index: 0, _Enum._name: "one"}, const E1{E1.foo: 2, _Enum.index: 1, _Enum._name: "two"}])
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:17:3 -> InstanceConstant(const E2<int, String>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:18:3 -> InstanceConstant(const E2<int, String>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:19:3 -> InstanceConstant(const E2<String, String>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:18:7 -> InstanceConstant(const E2<int, String>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///simple_fields.dart:19:9 -> InstanceConstant(const E2<String, String>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"})
Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:16:6 -> ListConstant(const <E2<dynamic, dynamic>>[const E2<int, String>{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"}, const E2<int, String>{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"}, const E2<String, String>{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"}])
Extra constant evaluation: evaluated: 27, effectively constant: 7