diff --git a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart index ae846b54bdd..0624e6a9e94 100644 --- a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart +++ b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart @@ -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; diff --git a/pkg/front_end/lib/src/builder/metadata_builder.dart b/pkg/front_end/lib/src/builder/metadata_builder.dart index b0ddccd8663..68886125313 100644 --- a/pkg/front_end/lib/src/builder/metadata_builder.dart +++ b/pkg/front_end/lib/src/builder/metadata_builder.dart @@ -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? 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 parsedAnnotationBuilders = {}; - - List indicesOfAnnotationsToBeInferred = []; + List 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 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; } } } diff --git a/pkg/front_end/lib/src/fragment/class/declaration.dart b/pkg/front_end/lib/src/fragment/class/declaration.dart index a6fa0998315..16bdd7a12d2 100644 --- a/pkg/front_end/lib/src/fragment/class/declaration.dart +++ b/pkg/front_end/lib/src/fragment/class/declaration.dart @@ -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, diff --git a/pkg/front_end/lib/src/fragment/constructor/declaration.dart b/pkg/front_end/lib/src/fragment/constructor/declaration.dart index 1681f8cd419..4420b79f600 100644 --- a/pkg/front_end/lib/src/fragment/constructor/declaration.dart +++ b/pkg/front_end/lib/src/fragment/constructor/declaration.dart @@ -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? 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, diff --git a/pkg/front_end/lib/src/fragment/enum_element.dart b/pkg/front_end/lib/src/fragment/enum_element.dart index 45de021dd22..658b92da056 100644 --- a/pkg/front_end/lib/src/fragment/enum_element.dart +++ b/pkg/front_end/lib/src/fragment/enum_element.dart @@ -94,6 +94,7 @@ class EnumElementDeclaration ]; @override + // Coverage-ignore(suite): Not run. List? 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.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); diff --git a/pkg/front_end/lib/src/fragment/factory.dart b/pkg/front_end/lib/src/fragment/factory.dart index f107f44e05f..7fe0029848b 100644 --- a/pkg/front_end/lib/src/fragment/factory.dart +++ b/pkg/front_end/lib/src/fragment/factory.dart @@ -112,7 +112,6 @@ class _FactoryBodyBuildingContext implements FunctionBodyBuildingContext { ?.inferenceData; @override - // Coverage-ignore(suite): Not run. MemberKind get memberKind => MemberKind.Factory; @override diff --git a/pkg/front_end/lib/src/fragment/factory/declaration.dart b/pkg/front_end/lib/src/fragment/factory/declaration.dart index f904f682846..6457ebc35b5 100644 --- a/pkg/front_end/lib/src/fragment/factory/declaration.dart +++ b/pkg/front_end/lib/src/fragment/factory/declaration.dart @@ -214,6 +214,7 @@ class FactoryDeclarationImpl annotatable: annotatable, annotatableFileUri: annotatablesFileUri, metadata: _fragment.metadata, + annotationsFileUri: _fragment.fileUri, bodyBuilderContext: bodyBuilderContext, libraryBuilder: libraryBuilder, scope: _fragment.enclosingScope, diff --git a/pkg/front_end/lib/src/fragment/field/declaration.dart b/pkg/front_end/lib/src/fragment/field/declaration.dart index dc26d2633f1..7e049eef1f4 100644 --- a/pkg/front_end/lib/src/fragment/field/declaration.dart +++ b/pkg/front_end/lib/src/fragment/field/declaration.dart @@ -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 get localSetters => _encoding.localSetters; @override + // Coverage-ignore(suite): Not run. List? 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(); } diff --git a/pkg/front_end/lib/src/fragment/fragment.dart b/pkg/front_end/lib/src/fragment/fragment.dart index 1a230148a89..338de5d98c2 100644 --- a/pkg/front_end/lib/src/fragment/fragment.dart +++ b/pkg/front_end/lib/src/fragment/fragment.dart @@ -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'; diff --git a/pkg/front_end/lib/src/fragment/getter/encoding.dart b/pkg/front_end/lib/src/fragment/getter/encoding.dart index 70e021b876e..353edd03fac 100644 --- a/pkg/front_end/lib/src/fragment/getter/encoding.dart +++ b/pkg/front_end/lib/src/fragment/getter/encoding.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( diff --git a/pkg/front_end/lib/src/fragment/method/encoding.dart b/pkg/front_end/lib/src/fragment/method/encoding.dart index c6cb898b380..4b16e2397b2 100644 --- a/pkg/front_end/lib/src/fragment/method/encoding.dart +++ b/pkg/front_end/lib/src/fragment/method/encoding.dart @@ -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( diff --git a/pkg/front_end/lib/src/fragment/primary_constructor_field.dart b/pkg/front_end/lib/src/fragment/primary_constructor_field.dart index 6be8ad64e63..a083a9eef02 100644 --- a/pkg/front_end/lib/src/fragment/primary_constructor_field.dart +++ b/pkg/front_end/lib/src/fragment/primary_constructor_field.dart @@ -86,6 +86,7 @@ class PrimaryConstructorFieldDeclaration List get localMembers => _encoding.localMembers; @override + // Coverage-ignore(suite): Not run. List? 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(); } diff --git a/pkg/front_end/lib/src/fragment/setter/encoding.dart b/pkg/front_end/lib/src/fragment/setter/encoding.dart index f5d09ffaaf4..d4abfd90bf7 100644 --- a/pkg/front_end/lib/src/fragment/setter/encoding.dart +++ b/pkg/front_end/lib/src/fragment/setter/encoding.dart @@ -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( diff --git a/pkg/front_end/lib/src/fragment/util.dart b/pkg/front_end/lib/src/fragment/util.dart index a5a8816bf4b..44fa822b0fd 100644 --- a/pkg/front_end/lib/src/fragment/util.dart +++ b/pkg/front_end/lib/src/fragment/util.dart @@ -51,11 +51,13 @@ void buildMetadataForOutlineExpressions({ required BodyBuilderContext bodyBuilderContext, required Annotatable annotatable, required Uri annotatableFileUri, + required Uri annotationsFileUri, required List? metadata, }) { MetadataBuilder.buildAnnotations( annotatable: annotatable, annotatableFileUri: annotatableFileUri, + annotationsFileUri: annotationsFileUri, metadata: metadata, bodyBuilderContext: bodyBuilderContext, libraryBuilder: libraryBuilder, diff --git a/pkg/front_end/lib/src/kernel/benchmarker.dart b/pkg/front_end/lib/src/kernel/benchmarker.dart index de7c97653c0..f9bc8a0734d 100644 --- a/pkg/front_end/lib/src/kernel/benchmarker.dart +++ b/pkg/front_end/lib/src/kernel/benchmarker.dart @@ -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, } diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index 64cff6b5271..9a3beed798a 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -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? 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 annotations, + required List indices, + }); + + /// Returns the metadata [Expression]s parsed from [metadata]. + List 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 enumSyntheticArguments, + required int enumTypeParameterCount, + required List? typeArguments, + required MemberBuilder? constructorBuilder, + required int fileOffset, + required String fullConstructorNameForErrors, + }); + + Expression buildSingleExpression({ + required Token token, + required Procedure procedure, + required List 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? 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 annotations, + required List indices, + }) { + inferAnnotations(parent, annotations, indices: indices); + performBacklogComputations(); + } + + @override + List 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 enumSyntheticArguments, + required int enumTypeParameterCount, + required List? 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.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 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, + ); + } } diff --git a/pkg/front_end/lib/src/kernel/body_builder_context.dart b/pkg/front_end/lib/src/kernel/body_builder_context.dart index eb51d4f9b97..f655519602f 100644 --- a/pkg/front_end/lib/src/kernel/body_builder_context.dart +++ b/pkg/front_end/lib/src/kernel/body_builder_context.dart @@ -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, { diff --git a/pkg/front_end/lib/src/kernel/resolver.dart b/pkg/front_end/lib/src/kernel/resolver.dart new file mode 100644 index 00000000000..33595cbc414 --- /dev/null +++ b/pkg/front_end/lib/src/kernel/resolver.dart @@ -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? 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 annotations, + }) { + BodyBuilder bodyBuilder = _createBodyBuilderForOutlineExpression( + libraryBuilder, + bodyBuilderContext, + scope, + annotationsFileUri, + ); + List 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? 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 enumSyntheticArguments, + required int enumTypeParameterCount, + required List? 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 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? 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? 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? 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? 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, + ); + } +} diff --git a/pkg/front_end/lib/src/source/diet_listener.dart b/pkg/front_end/lib/src/source/diet_listener.dart index 7a235d202f7..4b2ad273974 100644 --- a/pkg/front_end/lib/src/source/diet_listener.dart +++ b/pkg/front_end/lib/src/source/diet_listener.dart @@ -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? 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? 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; } diff --git a/pkg/front_end/lib/src/source/source_compilation_unit.dart b/pkg/front_end/lib/src/source/source_compilation_unit.dart index 9597440455a..75ed359a95d 100644 --- a/pkg/front_end/lib/src/source/source_compilation_unit.dart +++ b/pkg/front_end/lib/src/source/source_compilation_unit.dart @@ -1109,6 +1109,7 @@ class SourceCompilationUnitImpl implements SourceCompilationUnit { annotatable: annotatable, annotatableFileUri: annotatableFileUri, metadata: metadata, + annotationsFileUri: fileUri, bodyBuilderContext: bodyBuilderContext, libraryBuilder: libraryBuilder, scope: compilationUnitScope, diff --git a/pkg/front_end/lib/src/source/source_extension_builder.dart b/pkg/front_end/lib/src/source/source_extension_builder.dart index aa89a5aa650..62615d5657b 100644 --- a/pkg/front_end/lib/src/source/source_extension_builder.dart +++ b/pkg/front_end/lib/src/source/source_extension_builder.dart @@ -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, diff --git a/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart index 79489b0e91f..43608dc3fe4 100644 --- a/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/source/source_extension_type_declaration_builder.dart @@ -834,6 +834,7 @@ class SourceExtensionTypeDeclarationBuilder annotatable: extensionTypeDeclaration, annotatableFileUri: extensionTypeDeclaration.fileUri, metadata: _introductory.metadata, + annotationsFileUri: _introductory.fileUri, bodyBuilderContext: bodyBuilderContext, libraryBuilder: libraryBuilder, scope: _introductory.enclosingScope, diff --git a/pkg/front_end/lib/src/source/source_loader.dart b/pkg/front_end/lib/src/source/source_loader.dart index a042da7630e..f13961578b0 100644 --- a/pkg/front_end/lib/src/source/source_loader.dart +++ b/pkg/front_end/lib/src/source/source_loader.dart @@ -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 diff --git a/pkg/front_end/lib/src/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/source/source_type_alias_builder.dart index 10476e1608a..158636ca7e0 100644 --- a/pkg/front_end/lib/src/source/source_type_alias_builder.dart +++ b/pkg/front_end/lib/src/source/source_type_alias_builder.dart @@ -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, diff --git a/pkg/front_end/lib/src/source/source_type_parameter_builder.dart b/pkg/front_end/lib/src/source/source_type_parameter_builder.dart index 3b084f6e2f1..5b80f731853 100644 --- a/pkg/front_end/lib/src/source/source_type_parameter_builder.dart +++ b/pkg/front_end/lib/src/source/source_type_parameter_builder.dart @@ -150,6 +150,7 @@ class RegularNominalParameterDeclaration annotatable: parameter, annotatableFileUri: annotatableFileUri, metadata: _fragment.metadata, + annotationsFileUri: _fragment.fileUri, bodyBuilderContext: bodyBuilderContext, libraryBuilder: libraryBuilder, scope: _fragment.typeParameterScope, diff --git a/pkg/front_end/test/compile_and_lint_impl.dart b/pkg/front_end/test/compile_and_lint_impl.dart index 4217ece59d0..5e3e7747192 100644 --- a/pkg/front_end/test/compile_and_lint_impl.dart +++ b/pkg/front_end/test/compile_and_lint_impl.dart @@ -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 _replaceParts(Uri packageConfigUri, Set files) { class BodyBuilderTester = BodyBuilderTest with BodyBuilderTestMixin; -mixin BodyBuilderTestMixin on BodyBuilder { +mixin BodyBuilderTestMixin on BodyBuilderImpl { late Set _ignoredDirs = { ..._ignoredDirectoryUris, ..._explicitCreationIgnoredDirectoryUris, diff --git a/pkg/front_end/test/compiler_test_helper.dart b/pkg/front_end/test/compiler_test_helper.dart index a60a6054359..e2a2508c09d 100644 --- a/pkg/front_end/test/compiler_test_helper.dart +++ b/pkg/front_end/test/compiler_test_helper.dart @@ -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? 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? 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? 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( diff --git a/pkg/front_end/test/generator_to_string_test.dart b/pkg/front_end/test/generator_to_string_test.dart index cd7a801d78b..b90491428ac 100644 --- a/pkg/front_end/test/generator_to_string_test.dart +++ b/pkg/front_end/test/generator_to_string_test.dart @@ -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 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, diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt index fee137f8a3e..39f4123fe35 100644 --- a/pkg/front_end/test/spell_checking_list_code.txt +++ b/pkg/front_end/test/spell_checking_list_code.txt @@ -2052,6 +2052,7 @@ unifies uniform unify uninferable +uninferred uninhabited uninstantiable uninstantiated diff --git a/pkg/front_end/test/token_leak_git_test.dart b/pkg/front_end/test/token_leak_git_test.dart index ef7c8dbd70a..3e496235dc8 100644 --- a/pkg/front_end/test/token_leak_git_test.dart +++ b/pkg/front_end/test/token_leak_git_test.dart @@ -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; diff --git a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.outline.expect index fb4e471585f..d1146816191 100644 --- a/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/constructor_calls.dart.strong.outline.expect @@ -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 diff --git a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.outline.expect index 4688c203bc8..909b5f5e0f3 100644 --- a/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.outline.expect @@ -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{_Enum.index: 0, _Enum._name: "one"}) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E{_Enum.index: 1, _Enum._name: "two"}) -Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"}) +Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:19 -> InstanceConstant(const E{_Enum.index: 2, _Enum._name: "three"}) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:9:3 -> InstanceConstant(const E{_Enum.index: 3, _Enum._name: "four"}) Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const >[const E{_Enum.index: 0, _Enum._name: "one"}, const E{_Enum.index: 1, _Enum._name: "two"}, const E{_Enum.index: 2, _Enum._name: "three"}, const E{_Enum.index: 3, _Enum._name: "four"}]) Extra constant evaluation: evaluated: 12, effectively constant: 5 diff --git a/pkg/front_end/testcases/enhanced_enums/missed_checks.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/missed_checks.dart.strong.outline.expect index cab2898e226..73e1bfceebc 100644 --- a/pkg/front_end/testcases/enhanced_enums/missed_checks.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/missed_checks.dart.strong.outline.expect @@ -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 [const E1{_Enum.index: 0, _Enum._name: "element"}]) Evaluated: ConstructorInvocation @ org-dartlang-testcase:///missed_checks.dart:11:3 -> InstanceConstant(const E2{_Enum.index: 0, _Enum._name: "element"}) Evaluated: ListLiteral @ org-dartlang-testcase:///missed_checks.dart:10:6 -> ListConstant(const >[const E2{_Enum.index: 0, _Enum._name: "element"}]) diff --git a/pkg/front_end/testcases/enhanced_enums/named_arguments_anywhere/redirecting_constructor.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/named_arguments_anywhere/redirecting_constructor.dart.strong.outline.expect index 84a4522f1bd..a2ae285aea0 100644 --- a/pkg/front_end/testcases/enhanced_enums/named_arguments_anywhere/redirecting_constructor.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/named_arguments_anywhere/redirecting_constructor.dart.strong.outline.expect @@ -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 [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 diff --git a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.outline.expect index acdf6338453..1ea12dcb67a 100644 --- a/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/qualified_names_with_no_type_arguments.dart.strong.outline.expect @@ -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 [const E{_Enum.index: 0, _Enum._name: "a"}]) Extra constant evaluation: evaluated: 7, effectively constant: 2 diff --git a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.outline.expect index ccbc2ebecd5..e70810b94af 100644 --- a/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/redirecting_initializers.dart.strong.outline.expect @@ -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 [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"}) diff --git a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.outline.expect b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.outline.expect index 7ed57ac5e0e..596c56bcb02 100644 --- a/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.outline.expect +++ b/pkg/front_end/testcases/enhanced_enums/simple_fields.dart.strong.outline.expect @@ -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 [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{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{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{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{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{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"}) Evaluated: ListLiteral @ org-dartlang-testcase:///simple_fields.dart:16:6 -> ListConstant(const >[const E2{E2.foo: 1, E2.bar: "one", _Enum.index: 0, _Enum._name: "one"}, const E2{E2.foo: 2, E2.bar: "two", _Enum.index: 1, _Enum._name: "two"}, const E2{E2.foo: "three", E2.bar: "three", _Enum.index: 2, _Enum._name: "three"}]) Extra constant evaluation: evaluated: 27, effectively constant: 7