From 119d9d72b7cef3d38a0c2b7879f3c5ec338491ce Mon Sep 17 00:00:00 2001 From: Johnni Winther Date: Wed, 13 May 2026 02:11:33 -0700 Subject: [PATCH] [cfe][InternalNodes] Use internal/external helpers to create AST nodes This replaces the creation of many AST nodes with calls to either the internal or external helpers, to help enforce passing of needed arguments, in particular file offset which are generally not required. Change-Id: Id9b2449f398492dd5fb8bf0c71fbe3ec04444c95 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/497842 Reviewed-by: Chloe Stefantsova Commit-Queue: Johnni Winther --- .../lib/src/base/incremental_compiler.dart | 9 +- pkg/front_end/lib/src/base/lookup_result.dart | 3 +- .../src/builder/formal_parameter_builder.dart | 660 +++++++++--------- .../lib/src/builder/metadata_builder.dart | 10 +- .../src/fragment/constructor/encoding.dart | 113 +-- .../lib/src/fragment/enum_element.dart | 48 +- .../lib/src/fragment/factory/encoding.dart | 19 +- .../lib/src/fragment/field/encoding.dart | 463 ++++++------ pkg/front_end/lib/src/fragment/fragment.dart | 1 + .../lib/src/fragment/getter/encoding.dart | 97 ++- .../lib/src/fragment/method/encoding.dart | 223 +++--- .../lib/src/fragment/setter/declaration.dart | 3 +- .../lib/src/fragment/setter/encoding.dart | 107 +-- .../lib/src/kernel/body_builder.dart | 285 +++++--- .../lib/src/kernel/body_builder_context.dart | 6 +- .../lib/src/kernel/body_builder_helpers.dart | 22 +- pkg/front_end/lib/src/kernel/collections.dart | 8 +- .../src/kernel/combined_member_signature.dart | 208 +++--- .../kernel/const_conditional_simplifier.dart | 7 +- .../lib/src/kernel/constant_evaluator.dart | 145 ++-- .../kernel/constructor_tearoff_lowering.dart | 70 +- .../lib/src/kernel/expression_generator.dart | 49 +- .../lib/src/kernel/external_ast_helper.dart | 513 +++++++++++++- .../lib/src/kernel/forwarding_node.dart | 107 +-- .../lib/src/kernel/internal_ast.dart | 56 +- .../lib/src/kernel/internal_ast_helper.dart | 182 ++++- pkg/front_end/lib/src/kernel/resolver.dart | 2 +- .../lib/src/kernel/resolver_helpers.dart | 8 +- .../lib/src/source/check_helper.dart | 1 + .../lib/src/source/source_enum_builder.dart | 5 +- .../type_inference/delayed_expressions.dart | 2 - .../src/type_inference/inference_visitor.dart | 5 +- .../src/type_inference/matching_cache.dart | 2 - .../lib/src/type_inference/type_inferrer.dart | 17 +- .../test/static_types/static_type_test.dart | 6 +- ...internal_ast_text_representation_test.dart | 82 ++- .../text_representation_test.dart | 17 + ...n_proper_rename.dart.strong.outline.expect | 10 +- ..._variables_name_overlap.dart.strong.expect | 12 +- ...es_name_overlap.dart.strong.modular.expect | 12 +- ...ame_overlap.dart.strong.transformed.expect | 12 +- ..._variables_name_overlap.dart.strong.expect | 12 +- ...es_name_overlap.dart.strong.modular.expect | 12 +- ...ame_overlap.dart.strong.transformed.expect | 12 +- .../ddc/external_field.dart.strong.expect | 4 +- .../external_field.dart.strong.modular.expect | 4 +- .../external_field.dart.strong.outline.expect | 2 +- ...ernal_field.dart.strong.transformed.expect | 4 +- .../offsets/external_field.dart.strong.expect | 4 +- .../external_field.dart.strong.modular.expect | 4 +- .../external_field.dart.strong.outline.expect | 2 +- ...ernal_field.dart.strong.transformed.expect | 4 +- .../pattern_for_loop.dart.strong.expect | 2 +- ...attern_for_loop.dart.strong.modular.expect | 2 +- ...rn_for_loop.dart.strong.transformed.expect | 2 +- ...switch_encoding.dart.strong.outline.expect | 6 +- pkg/kernel/lib/src/ast/expressions.dart | 2 +- 57 files changed, 2335 insertions(+), 1350 deletions(-) diff --git a/pkg/front_end/lib/src/base/incremental_compiler.dart b/pkg/front_end/lib/src/base/incremental_compiler.dart index 7c7a9f3518f..ab08af88269 100644 --- a/pkg/front_end/lib/src/base/incremental_compiler.dart +++ b/pkg/front_end/lib/src/base/incremental_compiler.dart @@ -1940,7 +1940,8 @@ class IncrementalCompiler implements IncrementalKernelGenerator { isConst: true, hasDeclaredInitializer: true, initializer: def.value.initializer, - )..fileOffset = def.value.fileOffset, + fileOffset: def.value.fileOffset, + ), ); } else if (def.value.isInitializingFormal || def.value.isSuperInitializingFormal) { @@ -1957,7 +1958,8 @@ class IncrementalCompiler implements IncrementalKernelGenerator { def.key, type: substitution.substituteType(def.value.type), isConst: false, - )..fileOffset = def.value.fileOffset, + fileOffset: def.value.fileOffset, + ), ); } } else if (existingType is DynamicType || @@ -2229,7 +2231,8 @@ class IncrementalCompiler implements IncrementalKernelGenerator { VariableDeclarationImpl variable = new VariableDeclarationImpl( def.key, type: def.value, - )..fileOffset = offsetToUse ?? libraryBuilder.library.fileOffset; + fileOffset: offsetToUse ?? libraryBuilder.library.fileOffset, + ); if (isExtensionOrExtensionTypeInstanceMember && isExtensionThisName(def.key) && diff --git a/pkg/front_end/lib/src/base/lookup_result.dart b/pkg/front_end/lib/src/base/lookup_result.dart index 72c4bffcc89..858166757e8 100644 --- a/pkg/front_end/lib/src/base/lookup_result.dart +++ b/pkg/front_end/lib/src/base/lookup_result.dart @@ -9,6 +9,7 @@ import '../builder/builder.dart'; import '../builder/declaration_builders.dart'; import '../builder/member_builder.dart'; import '../codes/cfe_codes.dart'; +import '../kernel/external_ast_helper.dart' as extern; import 'compiler_context.dart'; abstract class LookupResult { @@ -66,7 +67,7 @@ abstract class LookupResult { CfeSeverity.error, ) .plain; - return new InvalidExpression(text)..fileOffset = fileOffset; + return extern.createInvalidExpression(text, fileOffset: fileOffset); } static LookupResult? createResult( 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 31c90ab5cc5..bd03f8d1ea9 100644 --- a/pkg/front_end/lib/src/builder/formal_parameter_builder.dart +++ b/pkg/front_end/lib/src/builder/formal_parameter_builder.dart @@ -7,14 +7,10 @@ import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart' import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token; import 'package:kernel/ast.dart' show - CatchVariable, DartType, DynamicType, Expression, InvalidExpression, - NamedParameter, - NullLiteral, - PositionalParameter, VariableDeclaration; import 'package:kernel/class_hierarchy.dart'; @@ -23,6 +19,7 @@ import '../base/lookup_result.dart'; import '../base/modifiers.dart'; import '../base/scope.dart' show LookupScope; import '../kernel/body_builder_context.dart'; +import '../kernel/external_ast_helper.dart' as extern; import '../kernel/internal_ast.dart' show InternalCatchVariable, @@ -46,34 +43,168 @@ import 'property_builder.dart'; import 'type_builder.dart'; import 'variable_builder.dart'; -abstract class ParameterBuilder { - TypeBuilder get type; +/// A builder for a catch block parameter. +class CatchParameterBuilder extends NamedBuilderImpl + with LookupResultMixin + implements ParameterVariableBuilder, InferredTypeListener { + @override + final int fileOffset; - /// The kind of this parameter, i.e. if it's required, positional optional, - /// or named optional. - FormalParameterKind get kind; + final Modifiers modifiers; - bool get isPositional; + @override + TypeBuilder type; - bool get isRequiredPositional; + @override + final String name; - bool get isNamed; + @override + final Uri fileUri; - bool get isRequiredNamed; + /// The variable declaration created for this catch parameter. + InternalVariable? _variable; - /// Whether this formal parameter is a wildcard variable. - bool get isWildcard; + /// If this is a wildcard variable, this holds the index used to create a + /// uniquely named kernel variable for it. + final int? _wildcardIndex; - String? get name; + final int? nameOffset; - int get fileOffset; + final bool isClosureContextLoweringEnabled; - VariableDeclaration build(SourceLibraryBuilder library); + CatchParameterBuilder({ + required this.modifiers, + required this.type, + required this.name, + required this.fileOffset, + required this.fileUri, + Token? defaultValueToken, + int? wildcardIndex, + required this.nameOffset, + required this.isClosureContextLoweringEnabled, + }) : this._wildcardIndex = wildcardIndex { + type.registerInferredTypeListener(this); + } + + @override + // Coverage-ignore(suite): Not run. + String get fullNameForErrors => name; + + @override + NamedBuilder get getable => this; + + @override + bool get isAssignable => false; + + @override + bool get isConst => false; + + @override + // Coverage-ignore(suite): Not run. + bool get isFinal => true; + + @override + // Coverage-ignore(suite): Not run. + bool get isLate => false; + + @override + // Coverage-ignore(suite): Not run. + bool get isNamed => false; + + // Coverage-ignore(suite): Not run. + bool get isOptional => false; + + // Coverage-ignore(suite): Not run. + // TODO(johnniwinther): This was previously named `isOptional` so we might + // have some uses that intended to use the now existing `isOptional` method. + bool get isOptionalPositional => false; + + @override + // Coverage-ignore(suite): Not run. + bool get isPositional => false; + + @override + bool get isPrimaryConstructorParameter => false; + + @override + bool get isRequiredNamed => false; + + @override + // Coverage-ignore(suite): Not run. + bool get isRequiredPositional => true; + + @override + bool get isWildcard => _wildcardIndex != null; + + @override + FormalParameterKind get kind { + throw new UnsupportedError("${this.runtimeType}.kind"); + } + + @override + // Coverage-ignore(suite): Not run. + Builder? get parent => null; + + @override + NamedBuilder? get setable => isAssignable ? this : null; + + @override + VariableDeclaration get variable => _variable!.asVariableDeclaration; + + @override + VariableDeclaration build(SourceLibraryBuilder library) { + if (_variable == null) { + bool isTypeOmitted = type is OmittedTypeBuilder; + DartType? builtType = type.build(library, TypeUse.parameterType); + String variableName = _wildcardIndex != null + ? createWildcardFormalParameterName(_wildcardIndex) + : name; + + if (isClosureContextLoweringEnabled) { + _variable = new InternalCatchVariable( + astVariable: extern.createCatchVariable( + name: variableName, + type: isTypeOmitted ? const DynamicType() : builtType, + isWildcard: isWildcard, + fileOffset: fileOffset, + ), + isImplicitlyTyped: isTypeOmitted, + fileOffset: fileOffset, + ); + } else { + _variable = new VariableDeclarationImpl( + variableName, + // [VariableDeclarationImpl] uses `null` to signal an omitted type. + type: isTypeOmitted ? null : builtType, + isFinal: modifiers.isFinal, + isConst: false, + isInitializingFormal: false, + isSuperInitializingFormal: false, + isCovariantByDeclaration: false, + isRequired: isRequiredNamed, + hasDeclaredInitializer: false, + isLowered: false, + isSynthesized: false, + isWildcard: isWildcard, + fileOffset: fileOffset, + ); + } + } + return _variable!.asVariableDeclaration; + } + + @override + // Coverage-ignore(suite): Not run. + void onInferredType(DartType type) { + if (_variable != null) { + _variable!.type = type; + } + } + + @override + String toString() => '$runtimeType($name)'; } -abstract class ParameterVariableBuilder - implements ParameterBuilder, VariableBuilder {} - /// A builder for a formal parameter, i.e. a parameter on a method or /// constructor. class FormalParameterBuilder extends NamedBuilderImpl @@ -166,39 +297,12 @@ class FormalParameterBuilder extends NamedBuilderImpl type.registerInferredTypeListener(this); } - @override - bool get isWildcard => _wildcardIndex != null; - @override // Coverage-ignore(suite): Not run. - Builder? get parent => null; + String get fullNameForErrors => name; @override - bool get isRequiredPositional => kind.isRequiredPositional; - - // TODO(johnniwinther): This was previously named `isOptional` so we might - // have some uses that intended to use the now existing `isOptional` method. - bool get isOptionalPositional => !isRequiredPositional; - - @override - bool get isRequiredNamed => kind.isRequiredNamed; - - @override - bool get isPositional => kind.isPositional; - - @override - bool get isNamed => kind.isNamed; - - bool get isOptional => kind.isOptional; - - bool get isInitializingFormal => modifiers.isInitializingFormal; - - bool get isSuperInitializingFormal => modifiers.isSuperInitializingFormal; - - bool get isCovariantByDeclaration => modifiers.isCovariant; - - @override - bool get isConst => modifiers.isConst; + NamedBuilder get getable => this; // An initializing formal parameter might be final without its // VariableDeclaration being final. See @@ -210,14 +314,50 @@ class FormalParameterBuilder extends NamedBuilderImpl !isSuperInitializingFormal; @override - NamedBuilder get getable => this; + bool get isConst => modifiers.isConst; + + bool get isCovariantByDeclaration => modifiers.isCovariant; + + @override + bool get isFinal => variable.isFinal; + + bool get isInitializingFormal => modifiers.isInitializingFormal; + + @override + bool get isLate => variable.isLate; + + @override + bool get isNamed => kind.isNamed; + + bool get isOptional => kind.isOptional; + + // TODO(johnniwinther): This was previously named `isOptional` so we might + // have some uses that intended to use the now existing `isOptional` method. + bool get isOptionalPositional => !isRequiredPositional; + + @override + bool get isPositional => kind.isPositional; + + @override + bool get isRequiredNamed => kind.isRequiredNamed; + + @override + bool get isRequiredPositional => kind.isRequiredPositional; + + bool get isSuperInitializingFormal => modifiers.isSuperInitializingFormal; + + @override + bool get isWildcard => _wildcardIndex != null; + + @override + // Coverage-ignore(suite): Not run. + Builder? get parent => null; @override NamedBuilder? get setable => isAssignable ? this : null; @override - // Coverage-ignore(suite): Not run. - String get fullNameForErrors => name; + VariableDeclaration get variable => _variable!.asVariableDeclaration; @override VariableDeclaration build(SourceLibraryBuilder library) { @@ -241,7 +381,7 @@ class FormalParameterBuilder extends NamedBuilderImpl case FormalParameterKind.requiredPositional: case FormalParameterKind.optionalPositional: _variable = new InternalPositionalParameter( - astVariable: new PositionalParameter( + astVariable: extern.createPositionalParameter( cosmeticName: variableName, type: isTypeOmitted ? const DynamicType() : builtType, defaultValue: null, @@ -252,14 +392,16 @@ class FormalParameterBuilder extends NamedBuilderImpl isLowered: isExtensionThis, isSynthesized: name == noNameSentinel, isWildcard: isWildcard, - )..fileOffset = fileOffset, + fileOffset: fileOffset, + ), isImplicitlyTyped: isTypeOmitted, - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); case FormalParameterKind.requiredNamed: // Coverage-ignore(suite): Not run. case FormalParameterKind.optionalNamed: _variable = new InternalNamedParameter( - astVariable: new NamedParameter( + astVariable: extern.createNamedParameter( parameterName: variableName!, type: isTypeOmitted ? const DynamicType() : builtType, defaultValue: null, @@ -270,9 +412,11 @@ class FormalParameterBuilder extends NamedBuilderImpl hasDeclaredDefaultType: hasDeclaredInitializer, isSynthesized: name == noNameSentinel, isWildcard: isWildcard, - )..fileOffset = fileOffset, + fileOffset: fileOffset, + ), isImplicitlyTyped: isTypeOmitted, - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); } } else { _variable = new VariableDeclarationImpl( @@ -289,120 +433,13 @@ class FormalParameterBuilder extends NamedBuilderImpl isLowered: isExtensionThis, isSynthesized: name == noNameSentinel, isWildcard: isWildcard, - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); } } return _variable!.asVariableDeclaration; } - @override - VariableDeclaration get variable => _variable!.asVariableDeclaration; - - @override - void onInferredType(DartType type) { - _variable?.type = type; - } - - /// Creates the [FormalParameterBuilder] for a parameter used in the formal - /// parameters in a primary constructor. - /// - /// If [isDeclaring] is `true` the parameter is marked as an initializing - /// formal whose type is inferred. Otherwise the parameter is marked as - /// final primary constructor parameter. - /// - /// The created parameter replaces the original parameter in the primary - /// constructor declaration. - FormalParameterBuilder forPrimaryConstructor( - FragmentFactory builderFactory, { - required bool isDeclaring, - }) { - assert(_variable == null); - return new FormalParameterBuilder( - kind: kind, - modifiers: isDeclaring - ? (modifiers | Modifiers.InitializingFormal) - : (modifiers | Modifiers.Final), - type: isDeclaring - ? builderFactory.addInferableType(InferenceDefaultType.NullableObject) - : type, - name: name, - fileOffset: fileOffset, - nameOffset: nameOffset, - fileUri: fileUri, - isExtensionThis: isExtensionThis, - defaultValueToken: copyDefaultValueToken(), - hasImmediatelyDeclaredInitializer: hasImmediatelyDeclaredInitializer, - publicName: publicName, - wildcardIndex: _wildcardIndex, - isClosureContextLoweringEnabled: isClosureContextLoweringEnabled, - isPrimaryConstructorParameter: !isDeclaring, - ); - } - - void finalizeInitializingFormal( - DeclarationBuilder declarationBuilder, - SourceConstructorBuilder constructorBuilder, - ClassHierarchyBase hierarchy, - ) { - String fieldName = isWildcardLoweredFormalParameter(name) ? '_' : name; - LookupResult? result = declarationBuilder.lookupLocalMember(fieldName); - Builder? fieldBuilder = result?.getable; - if (result is DuplicateMemberLookupResult) { - fieldBuilder = result.declarations.first; - } - if (fieldBuilder is SourcePropertyBuilder && fieldBuilder.hasField) { - DartType fieldType = fieldBuilder.inferFieldType(hierarchy); - fieldType = constructorBuilder.substituteFieldType(fieldType); - type.registerInferredType(fieldType); - } else { - type.registerInferredType(const DynamicType()); - } - } - - static bool _needsDefaultValuesBuiltAsOutlineExpressions( - SourceMemberBuilder memberBuilder, - ) { - // For modular compilation we need to include default values for optional - // and named parameters in several cases: - // * for const constructors to enable constant evaluation, - // * for instance methods because these might be needed to generated - // noSuchMethod forwarders, - // * for generative constructors to support forwarding constructors - // in mixin applications, and - // * for factories, to uphold the invariant that optional parameters always - // have default values, even during modular compilation. - if (memberBuilder is SourceConstructorBuilder) { - return true; - } else if (memberBuilder is SourceFactoryBuilder) { - return true; - } else { - return memberBuilder.isClassInstanceMember; - } - } - - /// Returns the [_defaultValueToken] field and clears it. - /// - /// This is used to transfer ownership of the token to the receiver. Tokens - /// need to be cleared during the outline phase to avoid holding the token - /// stream in memory. - Token? _takeDefaultValueToken() { - Token? initializerToken = _defaultValueToken; - _defaultValueToken = null; - return initializerToken; - } - - /// Returns the [_defaultValueToken] field and without clearing it. - /// - /// This is used to copy ownership of the token to the receiver, such that - /// both this [FormalParameterBuilder] and the receiver owns a copy. Tokens - /// need to be cleared during the outline phase to avoid holding the token - /// stream in memory. - /// - /// This is used when creating primary constructor formal parameters, where - /// the default value should be used both to infer the field type and to - /// create the default value for the constructor parameter. - Token? copyDefaultValueToken() => _defaultValueToken; - /// Builds the default value from this [initializerToken] if this is a /// formal parameter on a const constructor or instance method. void buildOutlineExpressions({ @@ -443,19 +480,119 @@ class FormalParameterBuilder extends NamedBuilderImpl initializerWasInferred = true; } else if (kind.isOptional) { // As done by BodyBuilder.endFormalParameter. - variable.initializer = new NullLiteral()..parent = variable; + variable.initializer = extern.createNullLiteral(fileOffset: fileOffset) + ..parent = variable; } } } - @override - bool get isFinal => variable.isFinal; + /// Returns the [_defaultValueToken] field and without clearing it. + /// + /// This is used to copy ownership of the token to the receiver, such that + /// both this [FormalParameterBuilder] and the receiver owns a copy. Tokens + /// need to be cleared during the outline phase to avoid holding the token + /// stream in memory. + /// + /// This is used when creating primary constructor formal parameters, where + /// the default value should be used both to infer the field type and to + /// create the default value for the constructor parameter. + Token? copyDefaultValueToken() => _defaultValueToken; + + void finalizeInitializingFormal( + DeclarationBuilder declarationBuilder, + SourceConstructorBuilder constructorBuilder, + ClassHierarchyBase hierarchy, + ) { + String fieldName = isWildcardLoweredFormalParameter(name) ? '_' : name; + LookupResult? result = declarationBuilder.lookupLocalMember(fieldName); + Builder? fieldBuilder = result?.getable; + if (result is DuplicateMemberLookupResult) { + fieldBuilder = result.declarations.first; + } + if (fieldBuilder is SourcePropertyBuilder && fieldBuilder.hasField) { + DartType fieldType = fieldBuilder.inferFieldType(hierarchy); + fieldType = constructorBuilder.substituteFieldType(fieldType); + type.registerInferredType(fieldType); + } else { + type.registerInferredType(const DynamicType()); + } + } + + /// Creates the [FormalParameterBuilder] for a parameter used in the formal + /// parameters in a primary constructor. + /// + /// If [isDeclaring] is `true` the parameter is marked as an initializing + /// formal whose type is inferred. Otherwise the parameter is marked as + /// final primary constructor parameter. + /// + /// The created parameter replaces the original parameter in the primary + /// constructor declaration. + FormalParameterBuilder forPrimaryConstructor( + FragmentFactory builderFactory, { + required bool isDeclaring, + }) { + assert(_variable == null); + return new FormalParameterBuilder( + kind: kind, + modifiers: isDeclaring + ? (modifiers | Modifiers.InitializingFormal) + : (modifiers | Modifiers.Final), + type: isDeclaring + ? builderFactory.addInferableType(InferenceDefaultType.NullableObject) + : type, + name: name, + fileOffset: fileOffset, + nameOffset: nameOffset, + fileUri: fileUri, + isExtensionThis: isExtensionThis, + defaultValueToken: copyDefaultValueToken(), + hasImmediatelyDeclaredInitializer: hasImmediatelyDeclaredInitializer, + publicName: publicName, + wildcardIndex: _wildcardIndex, + isClosureContextLoweringEnabled: isClosureContextLoweringEnabled, + isPrimaryConstructorParameter: !isDeclaring, + ); + } @override - bool get isLate => variable.isLate; + void onInferredType(DartType type) { + _variable?.type = type; + } @override String toString() => '$runtimeType($name)'; + + /// Returns the [_defaultValueToken] field and clears it. + /// + /// This is used to transfer ownership of the token to the receiver. Tokens + /// need to be cleared during the outline phase to avoid holding the token + /// stream in memory. + Token? _takeDefaultValueToken() { + Token? initializerToken = _defaultValueToken; + _defaultValueToken = null; + return initializerToken; + } + + static bool _needsDefaultValuesBuiltAsOutlineExpressions( + SourceMemberBuilder memberBuilder, + ) { + // For modular compilation we need to include default values for optional + // and named parameters in several cases: + // * for const constructors to enable constant evaluation, + // * for instance methods because these might be needed to generated + // noSuchMethod forwarders, + // * for generative constructors to support forwarding constructors + // in mixin applications, and + // * for factories, to uphold the invariant that optional parameters always + // have default values, even during modular compilation. + if (memberBuilder is SourceConstructorBuilder) { + return true; + } else if (memberBuilder is SourceFactoryBuilder) { + return true; + } else { + return memberBuilder.isClassInstanceMember; + } + } } class FunctionTypeParameterBuilder implements ParameterBuilder { @@ -470,14 +607,19 @@ class FunctionTypeParameterBuilder implements ParameterBuilder { FunctionTypeParameterBuilder(this.kind, this.type, this.name); + @override + int get fileOffset { + throw new UnsupportedError("${this.runtimeType}.fileOffset"); + } + @override bool get isNamed => kind.isNamed; @override - bool get isRequiredNamed => kind.isRequiredNamed; + bool get isPositional => kind.isPositional; @override - bool get isPositional => kind.isPositional; + bool get isRequiredNamed => kind.isRequiredNamed; @override bool get isRequiredPositional => kind.isRequiredPositional; @@ -486,172 +628,36 @@ class FunctionTypeParameterBuilder implements ParameterBuilder { // Coverage-ignore(suite): Not run. bool get isWildcard => false; - @override - int get fileOffset { - throw new UnsupportedError("${this.runtimeType}.fileOffset"); - } - @override VariableDeclaration build(SourceLibraryBuilder library) { throw new UnsupportedError("${this.runtimeType}.build"); } } -/// A builder for a catch block parameter. -class CatchParameterBuilder extends NamedBuilderImpl - with LookupResultMixin - implements ParameterVariableBuilder, InferredTypeListener { - @override - final int fileOffset; +abstract class ParameterBuilder { + int get fileOffset; - final Modifiers modifiers; + bool get isNamed; - @override - TypeBuilder type; + bool get isPositional; - @override - final String name; + bool get isRequiredNamed; - @override - final Uri fileUri; + bool get isRequiredPositional; - /// The variable declaration created for this catch parameter. - InternalVariable? _variable; + /// Whether this formal parameter is a wildcard variable. + bool get isWildcard; - /// If this is a wildcard variable, this holds the index used to create a - /// uniquely named kernel variable for it. - final int? _wildcardIndex; + /// The kind of this parameter, i.e. if it's required, positional optional, + /// or named optional. + FormalParameterKind get kind; - final int? nameOffset; + String? get name; - final bool isClosureContextLoweringEnabled; + TypeBuilder get type; - CatchParameterBuilder({ - required this.modifiers, - required this.type, - required this.name, - required this.fileOffset, - required this.fileUri, - Token? defaultValueToken, - int? wildcardIndex, - required this.nameOffset, - required this.isClosureContextLoweringEnabled, - }) : this._wildcardIndex = wildcardIndex { - type.registerInferredTypeListener(this); - } - - @override - bool get isWildcard => _wildcardIndex != null; - - @override - FormalParameterKind get kind { - throw new UnsupportedError("${this.runtimeType}.kind"); - } - - @override - // Coverage-ignore(suite): Not run. - Builder? get parent => null; - - @override - // Coverage-ignore(suite): Not run. - bool get isRequiredPositional => true; - - // Coverage-ignore(suite): Not run. - // TODO(johnniwinther): This was previously named `isOptional` so we might - // have some uses that intended to use the now existing `isOptional` method. - bool get isOptionalPositional => false; - - @override - bool get isRequiredNamed => false; - - @override - // Coverage-ignore(suite): Not run. - bool get isPositional => false; - - @override - // Coverage-ignore(suite): Not run. - bool get isNamed => false; - - // Coverage-ignore(suite): Not run. - bool get isOptional => false; - - @override - bool get isConst => false; - - @override - bool get isAssignable => false; - - @override - NamedBuilder get getable => this; - - @override - NamedBuilder? get setable => isAssignable ? this : null; - - @override - // Coverage-ignore(suite): Not run. - String get fullNameForErrors => name; - - @override - VariableDeclaration get variable => _variable!.asVariableDeclaration; - - @override - VariableDeclaration build(SourceLibraryBuilder library) { - if (_variable == null) { - bool isTypeOmitted = type is OmittedTypeBuilder; - DartType? builtType = type.build(library, TypeUse.parameterType); - String variableName = _wildcardIndex != null - ? createWildcardFormalParameterName(_wildcardIndex) - : name; - - if (isClosureContextLoweringEnabled) { - _variable = new InternalCatchVariable( - astVariable: new CatchVariable( - name: variableName, - type: isTypeOmitted ? const DynamicType() : builtType, - isWildcard: isWildcard, - ), - isImplicitlyTyped: isTypeOmitted, - ); - } else { - _variable = new VariableDeclarationImpl( - variableName, - // [VariableDeclarationImpl] uses `null` to signal an omitted type. - type: isTypeOmitted ? null : builtType, - isFinal: modifiers.isFinal, - isConst: false, - isInitializingFormal: false, - isSuperInitializingFormal: false, - isCovariantByDeclaration: false, - isRequired: isRequiredNamed, - hasDeclaredInitializer: false, - isLowered: false, - isSynthesized: false, - isWildcard: isWildcard, - )..fileOffset = fileOffset; - } - } - return _variable!.asVariableDeclaration; - } - - @override - // Coverage-ignore(suite): Not run. - void onInferredType(DartType type) { - if (_variable != null) { - _variable!.type = type; - } - } - - @override - String toString() => '$runtimeType($name)'; - - @override - // Coverage-ignore(suite): Not run. - bool get isFinal => true; - - @override - // Coverage-ignore(suite): Not run. - bool get isLate => false; - - @override - bool get isPrimaryConstructorParameter => false; + VariableDeclaration build(SourceLibraryBuilder library); } + +abstract class ParameterVariableBuilder + implements ParameterBuilder, VariableBuilder {} diff --git a/pkg/front_end/lib/src/builder/metadata_builder.dart b/pkg/front_end/lib/src/builder/metadata_builder.dart index 8bc36d6d6bf..63a3f2dab70 100644 --- a/pkg/front_end/lib/src/builder/metadata_builder.dart +++ b/pkg/front_end/lib/src/builder/metadata_builder.dart @@ -15,6 +15,7 @@ import '../base/extension_scope.dart'; import '../base/loader.dart'; import '../base/scope.dart' show LookupScope; import '../kernel/body_builder_context.dart'; +import '../kernel/external_ast_helper.dart' as extern; import '../kernel/macro/metadata.dart' hide ExtensionScope; import '../source/source_library_builder.dart' show SourceLibraryBuilder; @@ -149,10 +150,11 @@ class MetadataBuilder { ); // Coverage-ignore(suite): Not run. if (createFileUriExpression && annotation is! FileUriExpression) { - annotation = new FileUriExpression( - annotation, - annotationBuilder.fileUri, - )..fileOffset = annotationBuilder.atOffset; + annotation = extern.createFileUriExpression( + expression: annotation, + fileUri: annotationBuilder.fileUri, + fileOffset: annotationBuilder.atOffset, + ); } annotatable.addAnnotation(annotation); } diff --git a/pkg/front_end/lib/src/fragment/constructor/encoding.dart b/pkg/front_end/lib/src/fragment/constructor/encoding.dart index d07eea2936b..1d10e09f4ca 100644 --- a/pkg/front_end/lib/src/fragment/constructor/encoding.dart +++ b/pkg/front_end/lib/src/fragment/constructor/encoding.dart @@ -16,6 +16,7 @@ import '../../builder/omitted_type_builder.dart'; import '../../builder/type_builder.dart'; import '../../kernel/body_builder_context.dart'; import '../../kernel/constructor_tearoff_lowering.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/internal_ast.dart'; import '../../kernel/kernel_helper.dart'; import '../../source/name_scheme.dart'; @@ -151,7 +152,7 @@ class RegularConstructorEncoding implements ConstructorEncoding { @override void registerNoBodyConstructor() { if (!_isExternal) { - registerFunctionBody(body: new EmptyStatement()); + registerFunctionBody(body: extern.createEmptyStatement()); } } @@ -271,17 +272,20 @@ class RegularConstructorEncoding implements ConstructorEncoding { required List delayedDefaultValueCloners, }) { if (!_hasBeenBuilt) { - _constructor = - new Constructor( - new FunctionNode(_isExternal ? null : new EmptyStatement()), - name: dummyName, - fileUri: fileUri, - reference: constructorReferences?.constructorReference, - isSynthetic: isSynthetic, - ) - ..startFileOffset = startOffset - ..fileOffset = fileOffset - ..fileEndOffset = endOffset; + _constructor = extern.createConstructor( + extern.createFunctionNode( + _isExternal ? null : extern.createEmptyStatement(), + fileOffset: fileOffset, + fileEndOffset: endOffset, + ), + name: dummyName, + fileUri: fileUri, + reference: constructorReferences?.constructorReference, + isSynthetic: isSynthetic, + fileStartOffset: startOffset, + fileOffset: fileOffset, + fileEndOffset: endOffset, + ); nameScheme .getConstructorMemberName(name, isTearOff: false) .attachMember(_constructor); @@ -537,7 +541,7 @@ mixin _ExtensionTypeConstructorEncodingMixin @override void registerNoBodyConstructor() { if (!_hasBuiltBody && !_isExternal) { - registerFunctionBody(body: new EmptyStatement()); + registerFunctionBody(body: extern.createEmptyStatement()); } } @@ -558,6 +562,7 @@ mixin _ExtensionTypeConstructorEncodingMixin required NameScheme nameScheme, required ConstructorReferences? constructorReferences, required Uri fileUri, + required int startOffset, required int fileOffset, required int formalsOffset, required int endOffset, @@ -569,16 +574,20 @@ mixin _ExtensionTypeConstructorEncodingMixin required List delayedDefaultValueCloners, }) { if (!_hasBeenBuilt) { - _constructor = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode(_isExternal ? null : new EmptyStatement()), - fileUri: fileUri, - reference: constructorReferences?.constructorReference, - ) - ..fileOffset = fileOffset - ..fileEndOffset = endOffset; + _constructor = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode( + _isExternal ? null : extern.createEmptyStatement(), + fileOffset: fileOffset, + fileEndOffset: endOffset, + ), + fileUri: fileUri, + reference: constructorReferences?.constructorReference, + fileStartOffset: startOffset, + fileOffset: fileOffset, + fileEndOffset: endOffset, + ); nameScheme .getConstructorMemberName(name, isTearOff: false) .attachMember(_constructor); @@ -642,12 +651,11 @@ mixin _ExtensionTypeConstructorEncodingMixin isLowered: true, )..fileOffset = fileOffset) : (new VariableDeclarationImpl( - syntheticThisName, - isFinal: true, - type: _computeThisType(declarationBuilder, typeArguments), - ) - ..fileOffset = fileOffset - ..isLowered = true); + syntheticThisName, + isFinal: true, + type: _computeThisType(declarationBuilder, typeArguments), + fileOffset: fileOffset, + )..isLowered = true); List typeParameterTypes = []; for (int i = 0; i < _constructor.function.typeParameters.length; i++) { @@ -779,13 +787,23 @@ mixin _ExtensionTypeConstructorEncodingMixin for (Initializer initializer in _initializers) { initializer.accept(visitor); } - if (_constructor.function.body != null && - _constructor.function.body is! EmptyStatement) { - statements.add(_constructor.function.body!); + int fileOffset = _constructor.fileOffset; + int endOffset = _constructor.fileEndOffset; + if (_constructor.function.body case Statement body + when body is! EmptyStatement) { + statements.add(body); } - statements.add(new ReturnStatement(new VariableGet(thisVariable))); + statements.add( + extern.createReturnStatement(extern.createVariableGet(thisVariable)), + ); // TODO(cstefantsova): Provide a scope here. - registerFunctionBody(body: new Block(statements)); + registerFunctionBody( + body: extern.createBlock( + statements, + fileOffset: fileOffset, + fileEndOffset: endOffset, + ), + ); } _hasBuiltBody = true; } @@ -846,19 +864,23 @@ class _ExtensionTypeInitializerToStatementConverter void visitAuxiliaryInitializer(AuxiliaryInitializer node) { if (node is ExtensionTypeRedirectingInitializer) { statements.add( - new ExpressionStatement( - new VariableSet( + extern.createExpressionStatement( + extern.createVariableSet( thisVariable, - new StaticInvocation( + extern.createStaticInvocation( node.target, node.arguments.toArguments( node.inferredTypeArguments, node.positional, node.named, ), - )..fileOffset = node.fileOffset, - )..fileOffset = node.fileOffset, - )..fileOffset = node.fileOffset, + fileOffset: node.fileOffset, + ), + fileOffset: node.fileOffset, + // TODO(johnniwinther): Can we avoid this? + allowFinalAssignment: true, + ), + ), ); return; } else if (node is ExtensionTypeRepresentationFieldInitializer) { @@ -884,9 +906,12 @@ class _ExtensionTypeInitializerToStatementConverter @override void visitInvalidInitializer(InvalidInitializer node) { statements.add( - new ExpressionStatement( - new InvalidExpression(node.message)..fileOffset = node.fileOffset, - )..fileOffset, + extern.createExpressionStatement( + extern.createInvalidExpression( + node.message, + fileOffset: node.fileOffset, + ), + ), ); } @@ -966,6 +991,7 @@ class ExtensionTypeConstructorEncoding constructorReferences: constructorReferences, fileUri: fileUri, fileOffset: fileOffset, + startOffset: startOffset, formalsOffset: formalsOffset, endOffset: endOffset, forAbstractClassOrEnumOrMixin: forAbstractClassOrEnumOrMixin, @@ -1064,6 +1090,7 @@ class ExtensionConstructorEncoding constructorReferences: constructorReferences, fileUri: fileUri, fileOffset: fileOffset, + startOffset: startOffset, formalsOffset: formalsOffset, endOffset: endOffset, forAbstractClassOrEnumOrMixin: forAbstractClassOrEnumOrMixin, diff --git a/pkg/front_end/lib/src/fragment/enum_element.dart b/pkg/front_end/lib/src/fragment/enum_element.dart index d5ca1eb0aa6..64141f3dcff 100644 --- a/pkg/front_end/lib/src/fragment/enum_element.dart +++ b/pkg/front_end/lib/src/fragment/enum_element.dart @@ -142,20 +142,19 @@ class EnumElementDeclaration PropertyReferences references, { required List? classTypeParameters, }) { - _field = - new Field.immutable( - dummyName, - type: _type, - isFinal: false, - isConst: true, - isStatic: true, - fileUri: fileUri, - fieldReference: references.fieldReference, - getterReference: references.getterReference, - isEnumElement: true, - ) - ..fileOffset = nameOffset - ..fileEndOffset = nameOffset; + _field = extern.createImmutableField( + dummyName, + type: _type, + isFinal: false, + isConst: true, + isStatic: true, + fileUri: fileUri, + fieldReference: references.fieldReference, + getterReference: references.getterReference, + isEnumElement: true, + fileOffset: nameOffset, + fileEndOffset: nameOffset, + ); nameScheme .getFieldMemberName( FieldNameType.Field, @@ -329,8 +328,8 @@ class EnumElementDeclaration MemberBuilder? constructorBuilder = result?.getable; List enumSyntheticArguments = [ - new IntLiteral(elementIndex), - new StringLiteral(constant), + extern.createIntLiteral(coreTypes, elementIndex, fileOffset: fileOffset), + extern.createStringLiteral(constant, fileOffset: fileOffset), ]; TypeArguments? typeArguments; List? typeArgumentBuilders = @@ -388,7 +387,10 @@ class EnumElementDeclaration inferredFieldType = fieldType; } } else { - Arguments arguments = new Arguments(enumSyntheticArguments); + Arguments arguments = extern.createArguments( + enumSyntheticArguments, + fileOffset: fileOffset, + ); if (constructorBuilder == null || constructorBuilder is! SourceConstructorBuilder || !constructorBuilder.isConst) { @@ -408,15 +410,17 @@ class EnumElementDeclaration "Initializer has already been computed for $this: " "${_field!.initializer}.", ); - _field!.initializer = new InvalidExpression(text) - ..fileOffset = nameOffset - ..parent = _field; + _field!.initializer = + extern.createInvalidExpression(text, fileOffset: nameOffset) + ..fileOffset = nameOffset + ..parent = _field; } else { - Expression initializer = new ConstructorInvocation( + Expression initializer = extern.createConstructorInvocation( constructorBuilder.invokeTarget as Constructor, arguments, isConst: true, - )..fileOffset = nameOffset; + fileOffset: fileOffset, + ); assert( _field!.initializer == null, "Initializer has already been computed for $this: " diff --git a/pkg/front_end/lib/src/fragment/factory/encoding.dart b/pkg/front_end/lib/src/fragment/factory/encoding.dart index 6ac2d4730a9..6687fb19061 100644 --- a/pkg/front_end/lib/src/fragment/factory/encoding.dart +++ b/pkg/front_end/lib/src/fragment/factory/encoding.dart @@ -26,6 +26,7 @@ import '../../dill/dill_member_builder.dart'; import '../../fragment/fragment.dart'; import '../../kernel/body_builder_context.dart'; import '../../kernel/constructor_tearoff_lowering.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/kernel_helper.dart'; import '../../source/name_scheme.dart'; import '../../source/redirecting_factory_body.dart'; @@ -98,16 +99,24 @@ class FactoryEncoding implements InferredTypeListener { required bool isConst, }) { _procedure = - new Procedure( + extern.createProcedure( dummyName, nameScheme.isExtensionTypeMember ? ProcedureKind.Method : ProcedureKind.Factory, - new FunctionNode(null) - ..asyncMarker = _asyncModifier.kind - ..dartAsyncMarker = _asyncModifier.kind, + extern.createFunctionNode( + null, + asyncMarker: _asyncModifier.kind, + dartAsyncMarker: _asyncModifier.kind, + fileOffset: _fragment.fullNameOffset, + fileEndOffset: _fragment.endOffset, + ), fileUri: _fragment.fileUri, reference: factoryReferences?.factoryReference, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.fullNameOffset, + fileEndOffset: _fragment.endOffset, + isExtensionTypeMember: nameScheme.isExtensionTypeMember, ) ..fileStartOffset = _fragment.startOffset ..fileOffset = _fragment.fullNameOffset @@ -130,7 +139,7 @@ class FactoryEncoding implements InferredTypeListener { if (_redirectionTarget == null && !_fragment.modifiers.isAbstract && !_fragment.modifiers.isExternal) { - _procedure.function.registerFunctionBody(new EmptyStatement()); + _procedure.function.registerFunctionBody(extern.createEmptyStatement()); } buildTypeParametersAndFormals( libraryBuilder, diff --git a/pkg/front_end/lib/src/fragment/field/encoding.dart b/pkg/front_end/lib/src/fragment/field/encoding.dart index b80e4d90999..29edbf32b78 100644 --- a/pkg/front_end/lib/src/fragment/field/encoding.dart +++ b/pkg/front_end/lib/src/fragment/field/encoding.dart @@ -143,7 +143,7 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { }) { bool isImmutable = !hasSetter; _field = isImmutable - ? new Field.immutable( + ? extern.createImmutableField( dummyName, type: _type, isFinal: isFinal, @@ -153,8 +153,10 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { fieldReference: references.fieldReference, getterReference: references.getterReference, isEnumElement: isEnumElement, + fileOffset: nameOffset, + fileEndOffset: endOffset, ) - : new Field.mutable( + : extern.createMutableField( dummyName, type: _type, isFinal: isFinal, @@ -163,13 +165,12 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { fieldReference: references.fieldReference, getterReference: references.getterReference, setterReference: references.setterReference, + fileOffset: nameOffset, + fileEndOffset: endOffset, ); nameScheme .getFieldMemberName(FieldNameType.Field, name, isSynthesized: false) .attachMember(_field!); - _field! - ..fileOffset = nameOffset - ..fileEndOffset = endOffset; _field!..isCovariantByDeclaration = isCovariant; if (isExtensionMember) { _field! @@ -215,9 +216,12 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { required bool isSynthetic, }) { return [ - new FieldInitializer(_field!, value) - ..fileOffset = fileOffset - ..isSynthetic = isSynthetic, + extern.createFieldInitializer( + _field!, + value, + fileOffset: fileOffset, + isSynthetic: isSynthetic, + ), ]; } @@ -263,12 +267,19 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { @override void buildImplicitDefaultValue() { - _field!.initializer = new NullLiteral()..parent = _field; + _field!.initializer = extern.createNullLiteral( + fileOffset: _field!.fileOffset, + )..parent = _field; } @override Initializer buildImplicitInitializer() { - return new FieldInitializer(_field!, new NullLiteral())..isSynthetic = true; + return extern.createFieldInitializer( + _field!, + extern.createNullLiteral(fileOffset: _field!.fileOffset), + fileOffset: _field!.fileOffset, + isSynthetic: true, + ); } @override @@ -280,7 +291,12 @@ mixin RegularFieldEncodingMixin implements FieldEncoding { Initializer takePrimaryConstructorFieldInitializer() { Expression value = _field!.initializer!; _field!.initializer = null; - return new FieldInitializer(_field!, value)..fileOffset = value.fileOffset; + return extern.createFieldInitializer( + _field!, + value, + fileOffset: value.fileOffset, + isSynthetic: false, + ); } } @@ -473,23 +489,25 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { "Type has not been computed for field ${_fragment.name}.", ); if (isSetEncoding == late_lowering.IsSetEncoding.useSentinel) { - _field!.initializer = - new StaticInvocation( - coreTypes.createSentinelMethod, - new Arguments([], types: [_type!]) - ..fileOffset = _fragment.nameOffset, - ) - ..fileOffset = _fragment.nameOffset - ..parent = _field; + _field!.initializer = extern.createStaticInvocation( + coreTypes.createSentinelMethod, + extern.createArguments( + [], + types: [_type!], + fileOffset: _fragment.nameOffset, + ), + fileOffset: _fragment.nameOffset, + )..parent = _field; } else { - _field!.initializer = new NullLiteral() - ..fileOffset = _fragment.nameOffset - ..parent = _field; + _field!.initializer = extern.createNullLiteral( + fileOffset: _fragment.nameOffset, + )..parent = _field; } if (_lateIsSetField != null) { - _lateIsSetField!.initializer = new BoolLiteral(false) - ..fileOffset = _fragment.nameOffset - ..parent = _lateIsSetField; + _lateIsSetField!.initializer = extern.createBoolLiteral( + false, + fileOffset: _fragment.nameOffset, + )..parent = _lateIsSetField; } _lateGetter!.function.registerFunctionBody( _createGetterBody(coreTypes, _fragment.name, initializer), @@ -521,18 +539,21 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { List initializers = []; if (_lateIsSetField != null) { initializers.add( - new FieldInitializer( - _lateIsSetField!, - new BoolLiteral(true)..fileOffset = fileOffset, - ) - ..fileOffset = fileOffset - ..isSynthetic = isSynthetic, + extern.createFieldInitializer( + _lateIsSetField!, + extern.createBoolLiteral(true, fileOffset: fileOffset), + fileOffset: fileOffset, + isSynthetic: isSynthetic, + ), ); } initializers.add( - new FieldInitializer(_field!, value) - ..fileOffset = fileOffset - ..isSynthetic = isSynthetic, + extern.createFieldInitializer( + _field!, + value, + fileOffset: fileOffset, + isSynthetic: isSynthetic, + ), ); return initializers; } @@ -556,13 +577,13 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { "Type has not been computed for field ${_fragment.name}.", ); if (needsPromotion) { - VariableDeclaration variable = new VariableDeclaration.forValue( + VariableDeclaration variable = extern.createVariableCache( _createFieldGet(_field!), - type: _type!.withDeclaredNullability(Nullability.nullable), - )..fileOffset = _fragment.nameOffset; - return new Let( + _type!.withDeclaredNullability(Nullability.nullable), + ); + return extern.createLet( variable, - new VariableGet(variable, _type)..fileOffset = _fragment.nameOffset, + extern.createVariableGet(variable, promotedType: _type), ); } else { return _createFieldGet(_field!); @@ -572,32 +593,38 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { /// Creates an [Expression] that reads [field]. Expression _createFieldGet(Field field) { if (field.isStatic) { - return new StaticGet(field)..fileOffset = _fragment.nameOffset; + return extern.createStaticGet(field, fileOffset: _fragment.nameOffset); } else { // No substitution needed for the result type, since any type parameters // in there are also in scope at the access site. - return new InstanceGet( + return extern.createInstanceGet( InstanceAccessKind.Instance, - new ThisExpression()..fileOffset = _fragment.nameOffset, + extern.createThisExpression(fileOffset: _fragment.nameOffset), field.name, interfaceTarget: field, resultType: field.type, - )..fileOffset = _fragment.nameOffset; + fileOffset: _fragment.nameOffset, + ); } } /// Creates an [Expression] that writes [value] to [field]. Expression _createFieldSet(Field field, Expression value) { if (field.isStatic) { - return new StaticSet(field, value)..fileOffset = _fragment.nameOffset; + return extern.createStaticSet( + field, + value, + fileOffset: _fragment.nameOffset, + ); } else { - return new InstanceSet( + return extern.createInstanceSet( InstanceAccessKind.Instance, - new ThisExpression()..fileOffset = _fragment.nameOffset, + extern.createThisExpression(fileOffset: _fragment.nameOffset), field.name, value, interfaceTarget: field, - )..fileOffset = _fragment.nameOffset; + fileOffset: _fragment.nameOffset, + ); } } @@ -613,25 +640,26 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { Reference? reference, { required bool isCovariantByDeclaration, }) { - VariableDeclaration parameter = - new VariableDeclaration("${_fragment.name}#param") - ..isCovariantByDeclaration = isCovariantByDeclaration - ..fileOffset = _fragment.nameOffset; - return new Procedure( - dummyName, - ProcedureKind.Setter, - new FunctionNode( - null, - positionalParameters: [parameter], - returnType: const VoidType(), - ) - ..fileOffset = charOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: fileUri, - reference: reference, - ) - ..fileOffset = charOffset - ..fileEndOffset = _fragment.endOffset; + VariableDeclaration parameter = extern.createParameterVariable( + "${_fragment.name}#param", + isCovariantByDeclaration: isCovariantByDeclaration, + fileOffset: _fragment.nameOffset, + ); + return extern.createProcedure( + dummyName, + ProcedureKind.Setter, + extern.createFunctionNode( + null, + positionalParameters: [parameter], + returnType: const VoidType(), + fileOffset: charOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: fileUri, + reference: reference, + fileOffset: charOffset, + fileEndOffset: _fragment.endOffset, + ); } Statement _createSetterBody( @@ -736,15 +764,14 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { required bool isAbstractOrExternal, required List? classTypeParameters, }) { - _field = - new Field.mutable( - dummyName, - fileUri: _fragment.fileUri, - fieldReference: references.fieldReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isInternalImplementation = true; + _field = extern.createMutableField( + dummyName, + fileUri: _fragment.fileUri, + fieldReference: references.fieldReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isInternalImplementation: true, + ); nameScheme .getFieldMemberName( FieldNameType.Field, @@ -759,11 +786,13 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { break; case late_lowering.IsSetStrategy.forceUseIsSetField: case late_lowering.IsSetStrategy.useIsSetFieldOrNull: - _lateIsSetField = - new Field.mutable(dummyName, fileUri: _fragment.fileUri) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isInternalImplementation = true; + _lateIsSetField = extern.createMutableField( + dummyName, + fileUri: _fragment.fileUri, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isInternalImplementation: true, + ); nameScheme .getFieldMemberName( FieldNameType.IsSetField, @@ -773,18 +802,19 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding { .attachMember(_lateIsSetField!); break; } - _lateGetter = - new Procedure( - dummyName, - ProcedureKind.Getter, - new FunctionNode(null) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: _fragment.fileUri, - reference: references.getterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + _lateGetter = extern.createProcedure( + dummyName, + ProcedureKind.Getter, + extern.createFunctionNode( + null, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.getterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getFieldMemberName( FieldNameType.Getter, @@ -1233,71 +1263,77 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { required List? classTypeParameters, }) { if (_isExtensionInstanceMember || _isExtensionTypeInstanceMember) { - _getter = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode( - null, - positionalParameters: [ - new VariableDeclaration(syntheticThisName) - ..fileOffset = _fragment.nameOffset - ..isLowered = true, - ], - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: _fragment.fileUri, - reference: references.getterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + _getter = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode( + null, + positionalParameters: [ + extern.createParameterVariable( + syntheticThisName, + fileOffset: _fragment.nameOffset, + isLowered: true, + ), + ], + + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.getterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getProcedureMemberName(ProcedureKind.Getter, _fragment.name) .attachMember(_getter!); if (_fragment.hasSetter) { - VariableDeclaration parameter = - new VariableDeclaration("#externalFieldValue", isSynthesized: true) - ..isCovariantByDeclaration = _fragment.modifiers.isCovariant - ..fileOffset = _fragment.nameOffset; - _setter = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode( - null, - positionalParameters: [ - new VariableDeclaration(syntheticThisName) - ..fileOffset = _fragment.nameOffset - ..isLowered = true, - parameter, - ], - returnType: const VoidType(), - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: _fragment.fileUri, - reference: references.setterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + VariableDeclaration parameter = extern.createParameterVariable( + "#externalFieldValue", + isSynthesized: true, + isCovariantByDeclaration: _fragment.modifiers.isCovariant, + fileOffset: _fragment.nameOffset, + ); + _setter = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode( + null, + positionalParameters: [ + extern.createParameterVariable( + syntheticThisName, + fileOffset: _fragment.nameOffset, + isLowered: true, + ), + parameter, + ], + returnType: const VoidType(), + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.setterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getProcedureMemberName(ProcedureKind.Setter, _fragment.name) .attachMember(_setter!); } } else { - _getter = - new Procedure( - dummyName, - ProcedureKind.Getter, - new FunctionNode(null) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: _fragment.fileUri, - reference: references.getterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + _getter = extern.createProcedure( + dummyName, + ProcedureKind.Getter, + extern.createFunctionNode( + null, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.getterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getFieldMemberName( FieldNameType.Getter, @@ -1321,9 +1357,11 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding { isSynthesized: true, isCovariantByDeclaration: _fragment.modifiers.isCovariant, )..fileOffset = _fragment.nameOffset) - : (new VariableDeclaration( + : (extern.createParameterVariable( "#externalFieldValue", isSynthesized: true, + isCovariantByDeclaration: _fragment.modifiers.isCovariant, + fileOffset: _fragment.nameOffset, ) ..isCovariantByDeclaration = _fragment.modifiers.isCovariant ..fileOffset = _fragment.nameOffset); @@ -1548,8 +1586,11 @@ class RepresentationFieldEncoding implements FieldEncoding { required bool isSynthetic, }) { return [ - new ExtensionTypeRepresentationFieldInitializer(_getter, value) - ..fileOffset = fileOffset, + new ExtensionTypeRepresentationFieldInitializer( + _getter, + value, + fileOffset: fileOffset, + ), ]; } @@ -1561,17 +1602,20 @@ class RepresentationFieldEncoding implements FieldEncoding { required bool isAbstractOrExternal, required List? classTypeParameters, }) { - _getter = - new Procedure( - dummyName, - ProcedureKind.Getter, - new FunctionNode(null), - fileUri: _fragment.fileUri, - reference: references.getterReference, - ) - ..stubKind = ProcedureStubKind.RepresentationField - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.nameOffset; + _getter = extern.createProcedure( + dummyName, + ProcedureKind.Getter, + extern.createFunctionNode( + null, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.nameOffset, + ), + fileUri: _fragment.fileUri, + reference: references.getterReference, + stubKind: ProcedureStubKind.RepresentationField, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.nameOffset, + ); nameScheme .getFieldMemberName( FieldNameType.RepresentationField, @@ -1656,8 +1700,9 @@ class RepresentationFieldEncoding implements FieldEncoding { Initializer buildImplicitInitializer() { return new ExtensionTypeRepresentationFieldInitializer( _getter, - new NullLiteral(), - )..fileOffset = _fragment.nameOffset; + extern.createNullLiteral(fileOffset: _fragment.nameOffset), + fileOffset: _fragment.nameOffset, + ); } @override @@ -1799,52 +1844,58 @@ class ExtensionInstanceFieldEncoding implements FieldEncoding { required bool isAbstractOrExternal, required List? classTypeParameters, }) { - _getter = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode( - null, - positionalParameters: [ - new VariableDeclaration(syntheticThisName) - ..fileOffset = _fragment.nameOffset - ..isLowered = true, - ], - ), - fileUri: _fragment.fileUri, - reference: references.getterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + _getter = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode( + null, + positionalParameters: [ + extern.createParameterVariable( + syntheticThisName, + fileOffset: _fragment.nameOffset, + isLowered: true, + ), + ], + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.getterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getProcedureMemberName(ProcedureKind.Getter, _fragment.name) .attachMember(_getter!); if (_fragment.hasSetter) { - VariableDeclaration parameter = - new VariableDeclaration("#externalFieldValue", isSynthesized: true) - ..isCovariantByDeclaration = _fragment.modifiers.isCovariant - ..fileOffset = _fragment.nameOffset; - _setter = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode( - null, - positionalParameters: [ - new VariableDeclaration(syntheticThisName) - ..fileOffset = _fragment.nameOffset - ..isLowered = true, - parameter, - ], - returnType: const VoidType(), - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset, - fileUri: _fragment.fileUri, - reference: references.setterReference, - ) - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset; + VariableDeclaration parameter = extern.createParameterVariable( + "#externalFieldValue", + isSynthesized: true, + isCovariantByDeclaration: _fragment.modifiers.isCovariant, + fileOffset: _fragment.nameOffset, + ); + _setter = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode( + null, + positionalParameters: [ + extern.createParameterVariable( + syntheticThisName, + fileOffset: _fragment.nameOffset, + isLowered: true, + ), + parameter, + ], + returnType: const VoidType(), + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ), + fileUri: _fragment.fileUri, + reference: references.setterReference, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + ); nameScheme .getProcedureMemberName(ProcedureKind.Setter, _fragment.name) .attachMember(_setter!); diff --git a/pkg/front_end/lib/src/fragment/fragment.dart b/pkg/front_end/lib/src/fragment/fragment.dart index e407dae2d9b..6a270098d9c 100644 --- a/pkg/front_end/lib/src/fragment/fragment.dart +++ b/pkg/front_end/lib/src/fragment/fragment.dart @@ -35,6 +35,7 @@ import '../builder/property_builder.dart'; import '../builder/type_builder.dart'; import '../builder/variable_builder.dart'; import '../kernel/body_builder_context.dart'; +import '../kernel/external_ast_helper.dart' as extern; import '../kernel/hierarchy/class_member.dart'; import '../kernel/hierarchy/members_builder.dart'; import '../kernel/implicit_field_type.dart'; diff --git a/pkg/front_end/lib/src/fragment/getter/encoding.dart b/pkg/front_end/lib/src/fragment/getter/encoding.dart index 8af229e5ac0..05e5a6fbda8 100644 --- a/pkg/front_end/lib/src/fragment/getter/encoding.dart +++ b/pkg/front_end/lib/src/fragment/getter/encoding.dart @@ -19,6 +19,7 @@ import '../../builder/omitted_type_builder.dart'; import '../../builder/type_builder.dart'; import '../../builder/variable_builder.dart'; import '../../kernel/body_builder_context.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/kernel_helper.dart'; import '../../kernel/type_algorithms.dart'; import '../../source/check_helper.dart'; @@ -293,13 +294,12 @@ mixin _DirectGetterEncodingMixin implements GetterEncoding { required bool isAbstractOrExternal, required List? classTypeParameters, }) { - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -322,23 +322,22 @@ mixin _DirectGetterEncodingMixin implements GetterEncoding { ProcedureKind.Getter, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - ProcedureKind.Getter, - function, - reference: references?.getterReference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = _fragment.modifiers.isStatic - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + ProcedureKind.Getter, + function, + reference: references?.getterReference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: _fragment.modifiers.isStatic, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); f(kind: _builtMemberKind, member: procedure); @@ -615,15 +614,14 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding { // Coverage-ignore(suite): Not run. _thisFormal.kind == FormalParameterKind.optionalPositional, ); - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - typeParameters: typeParameters, - positionalParameters: [_thisFormal.build(libraryBuilder)], - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + typeParameters: typeParameters, + positionalParameters: [_thisFormal.build(libraryBuilder)], + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -646,23 +644,22 @@ mixin _ExtensionInstanceGetterEncodingMixin implements GetterEncoding { ProcedureKind.Getter, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - ProcedureKind.Method, - function, - reference: references?.getterReference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = true - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + ProcedureKind.Method, + function, + reference: references?.getterReference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: true, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); f(kind: _builtMemberKind, member: procedure); diff --git a/pkg/front_end/lib/src/fragment/method/encoding.dart b/pkg/front_end/lib/src/fragment/method/encoding.dart index 3f46f5c4a8b..6c0a6e007ce 100644 --- a/pkg/front_end/lib/src/fragment/method/encoding.dart +++ b/pkg/front_end/lib/src/fragment/method/encoding.dart @@ -19,6 +19,7 @@ import '../../builder/omitted_type_builder.dart'; import '../../builder/type_builder.dart'; import '../../builder/variable_builder.dart'; import '../../kernel/body_builder_context.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/kernel_helper.dart'; import '../../kernel/type_algorithms.dart'; import '../../source/check_helper.dart'; @@ -222,13 +223,12 @@ mixin _DirectMethodEncodingMixin implements MethodEncoding { required bool isAbstractOrExternal, List? classTypeParameters, }) { - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -260,23 +260,22 @@ mixin _DirectMethodEncodingMixin implements MethodEncoding { _procedureKind, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - _procedureKind, - function, - reference: reference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = _fragment.modifiers.isStatic - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + _procedureKind, + function, + reference: reference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: _fragment.modifiers.isStatic, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); f(kind: _builtMemberKind, member: procedure); @@ -587,15 +586,14 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { // Coverage-ignore(suite): Not run. _thisFormal.kind == FormalParameterKind.optionalPositional, ); - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - typeParameters: typeParameters, - positionalParameters: [_thisFormal.build(libraryBuilder)], - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + typeParameters: typeParameters, + positionalParameters: [_thisFormal.build(libraryBuilder)], + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -627,23 +625,22 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { ProcedureKind.Method, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - ProcedureKind.Method, - function, - reference: reference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = true - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + ProcedureKind.Method, + function, + reference: reference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: true, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); if (!_isOperator) { @@ -851,7 +848,10 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { Map substitutionMap = {}; List typeArguments = []; for (TypeParameter typeParameter in procedure.function.typeParameters) { - TypeParameter newTypeParameter = new TypeParameter(typeParameter.name); + TypeParameter newTypeParameter = extern.createTypeParameter( + typeParameter.name, + fileOffset: typeParameter.fileOffset, + ); typeParameters.add(newTypeParameter); typeArguments.add( substitutionMap[typeParameter] = new TypeParameterType( @@ -903,13 +903,14 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { isRequired: parameter.isRequired, )..fileOffset = parameter.fileOffset; case VariableDeclaration(): - newParameter = new VariableDeclaration( + newParameter = extern.createParameterVariable( parameter.name, type: type, isFinal: parameter.isFinal, isLowered: parameter.isLowered, isRequired: parameter.isRequired, - )..fileOffset = parameter.fileOffset; + fileOffset: parameter.fileOffset, + ); } _extensionTearOffParameterMap![parameter] = newParameter; return newParameter; @@ -938,14 +939,14 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { if (position == 0) { /// Pass `this` as a captured variable. closurePositionalArguments.add( - new VariableGet(extensionThis)..fileOffset = fileOffset, + extern.createVariableGet(extensionThis, fileOffset: fileOffset), ); } else { DartType type = substitution.substituteType(parameter.type); VariableDeclaration newParameter = copyParameter(parameter, type); closurePositionalParameters.add(newParameter); closurePositionalArguments.add( - new VariableGet(newParameter)..fileOffset = fileOffset, + extern.createVariableGet(newParameter, fileOffset: fileOffset), ); } } @@ -956,79 +957,75 @@ mixin _ExtensionInstanceMethodEncodingMixin implements MethodEncoding { VariableDeclaration newParameter = copyParameter(parameter, type); closureNamedParameters.add(newParameter); closureNamedArguments.add( - new NamedExpression( + extern.createNamedExpression( parameter.name!, - new VariableGet(newParameter)..fileOffset = fileOffset, + extern.createVariableGet(newParameter, fileOffset: fileOffset), ), ); } - Statement closureBody = new ReturnStatement( - new StaticInvocation( - procedure, - new Arguments( - closurePositionalArguments, - types: typeArguments, - named: closureNamedArguments, - ), - ) + Statement closureBody = extern.createReturnStatement( + extern.createStaticInvocation( + procedure, + extern.createArguments( + closurePositionalArguments, + types: typeArguments, + named: closureNamedArguments, + fileOffset: fileOffset, + ), // We need to use the fileStartOffset on the StaticInvocation to // avoid a possible "fake coverage miss" on the name of the // extension method. - ..fileOffset = fileStartOffset, - )..fileOffset = fileOffset; + fileOffset: fileStartOffset, + ), + fileOffset: fileOffset, + ); - FunctionExpression closure = - new FunctionExpression( - new FunctionNode( - closureBody, - typeParameters: closureTypeParameters, - positionalParameters: closurePositionalParameters, - namedParameters: closureNamedParameters, - requiredParameterCount: - procedure.function.requiredParameterCount - 1, - returnType: closureReturnType, - ) - ..fileOffset = fileOffset - ..fileEndOffset = fileEndOffset, - ) - // We need to use the fileStartOffset on the FunctionExpression to - // avoid a possible "fake coverage miss" on the name of the - // extension method. - ..fileOffset = fileStartOffset; + FunctionExpression closure = extern.createFunctionExpression( + extern.createFunctionNode( + closureBody, + typeParameters: closureTypeParameters, + positionalParameters: closurePositionalParameters, + namedParameters: closureNamedParameters, + requiredParameterCount: procedure.function.requiredParameterCount - 1, + returnType: closureReturnType, + fileOffset: fileOffset, + fileEndOffset: fileEndOffset, + ), - FunctionNode function = - new FunctionNode( - new ReturnStatement(closure)..fileOffset = fileOffset, - typeParameters: tearOffTypeParameters, - positionalParameters: [extensionThis], - requiredParameterCount: 1, - returnType: closure.function.computeFunctionType( - Nullability.nonNullable, - ), - ) - ..fileOffset = fileOffset - ..fileEndOffset = fileEndOffset; + // We need to use the fileStartOffset on the FunctionExpression to + // avoid a possible "fake coverage miss" on the name of the + // extension method. + fileOffset: fileStartOffset, + ); + + FunctionNode function = extern.createFunctionNode( + extern.createReturnStatement(closure, fileOffset: fileOffset), + typeParameters: tearOffTypeParameters, + positionalParameters: [extensionThis], + requiredParameterCount: 1, + returnType: closure.function.computeFunctionType(Nullability.nonNullable), + fileOffset: fileOffset, + fileEndOffset: fileEndOffset, + ); MemberName tearOffName = nameScheme.getProcedureMemberName( ProcedureKind.Getter, _fragment.name, ); - Procedure tearOff = - new Procedure( - tearOffName.name, - ProcedureKind.Method, - function, - isStatic: true, - isExtensionMember: _isExtensionMember, - isExtensionTypeMember: _isExtensionTypeMember, - reference: tearOffReference, - fileUri: _fragment.fileUri, - ) - ..fileUri = _fragment.fileUri - ..fileOffset = fileOffset - ..fileStartOffset = _fragment.startOffset - ..fileEndOffset = fileEndOffset; + Procedure tearOff = extern.createProcedure( + tearOffName.name, + ProcedureKind.Method, + function, + isStatic: true, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + reference: tearOffReference, + fileUri: _fragment.fileUri, + fileOffset: fileOffset, + fileStartOffset: _fragment.startOffset, + fileEndOffset: fileEndOffset, + ); tearOffName.attachMember(tearOff); return tearOff; } diff --git a/pkg/front_end/lib/src/fragment/setter/declaration.dart b/pkg/front_end/lib/src/fragment/setter/declaration.dart index 916dfc53219..33af73ef304 100644 --- a/pkg/front_end/lib/src/fragment/setter/declaration.dart +++ b/pkg/front_end/lib/src/fragment/setter/declaration.dart @@ -19,6 +19,7 @@ import '../../builder/property_builder.dart'; import '../../builder/type_builder.dart'; import '../../kernel/body_builder_context.dart'; import '../../kernel/external_ast_helper.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/hierarchy/class_member.dart'; import '../../kernel/hierarchy/members_builder.dart'; import '../../kernel/type_algorithms.dart'; @@ -324,7 +325,7 @@ class RegularSetterDeclaration declaredFormals.single.isOptionalPositional) { int fileOffset = _fragment.formalsOffset; if (body == null) { - body = new EmptyStatement()..fileOffset = fileOffset; + body = extern.createEmptyStatement(fileOffset: fileOffset); } if (declaredFormals != null) { // Illegal parameters were removed by the function builder. diff --git a/pkg/front_end/lib/src/fragment/setter/encoding.dart b/pkg/front_end/lib/src/fragment/setter/encoding.dart index 646617cec26..ecc015119f7 100644 --- a/pkg/front_end/lib/src/fragment/setter/encoding.dart +++ b/pkg/front_end/lib/src/fragment/setter/encoding.dart @@ -17,6 +17,7 @@ import '../../builder/omitted_type_builder.dart'; import '../../builder/type_builder.dart'; import '../../builder/variable_builder.dart'; import '../../kernel/body_builder_context.dart'; +import '../../kernel/external_ast_helper.dart' as extern; import '../../kernel/internal_ast.dart'; import '../../kernel/kernel_helper.dart'; import '../../kernel/type_algorithms.dart'; @@ -294,13 +295,12 @@ mixin _DirectSetterEncodingMixin implements SetterEncoding { required bool isAbstractOrExternal, required List? classTypeParameters, }) { - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -333,7 +333,10 @@ mixin _DirectSetterEncodingMixin implements SetterEncoding { // Replace illegal parameters by single dummy parameter. // Do this after building the parameters, since the diet listener // assumes that parameters are built, even if illegal in number. - VariableDeclaration parameter = new VariableDeclarationImpl("#synthetic"); + VariableDeclaration parameter = new VariableDeclarationImpl( + "#synthetic", + fileOffset: TreeNode.noOffset, + ); function.positionalParameters.clear(); function.positionalParameters.add(parameter); parameter.parent = function; @@ -344,23 +347,22 @@ mixin _DirectSetterEncodingMixin implements SetterEncoding { ProcedureKind.Setter, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - ProcedureKind.Setter, - function, - reference: references?.setterReference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = _fragment.modifiers.isStatic - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + ProcedureKind.Setter, + function, + reference: references?.setterReference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: _fragment.modifiers.isStatic, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); f(kind: _builtMemberKind, member: procedure); @@ -630,15 +632,14 @@ mixin _ExtensionInstanceSetterEncodingMixin implements SetterEncoding { // Coverage-ignore(suite): Not run. _thisFormal.kind == FormalParameterKind.optionalPositional, ); - FunctionNode function = - new FunctionNode( - isAbstractOrExternal ? null : new EmptyStatement(), - typeParameters: typeParameters, - positionalParameters: [_thisFormal.build(libraryBuilder)], - asyncMarker: _fragment.asyncModifier.kind, - ) - ..fileOffset = _fragment.formalsOffset - ..fileEndOffset = _fragment.endOffset; + FunctionNode function = extern.createFunctionNode( + isAbstractOrExternal ? null : extern.createEmptyStatement(), + typeParameters: typeParameters, + positionalParameters: [_thisFormal.build(libraryBuilder)], + asyncMarker: _fragment.asyncModifier.kind, + fileOffset: _fragment.formalsOffset, + fileEndOffset: _fragment.endOffset, + ); buildTypeParametersAndFormals( libraryBuilder, function, @@ -659,7 +660,10 @@ mixin _ExtensionInstanceSetterEncodingMixin implements SetterEncoding { // Do this after building the parameters, since the diet listener // assumes that parameters are built, even if illegal in number. VariableDeclaration thisParameter = function.positionalParameters[0]; - VariableDeclaration parameter = new VariableDeclarationImpl("#synthetic"); + VariableDeclaration parameter = new VariableDeclarationImpl( + "#synthetic", + fileOffset: TreeNode.noOffset, + ); function.positionalParameters.clear(); function.positionalParameters.add(thisParameter); function.positionalParameters.add(parameter); @@ -688,23 +692,22 @@ mixin _ExtensionInstanceSetterEncodingMixin implements SetterEncoding { ProcedureKind.Setter, _fragment.name, ); - Procedure procedure = _procedure = - new Procedure( - memberName.name, - ProcedureKind.Method, - function, - reference: references?.setterReference, - fileUri: _fragment.fileUri, - ) - ..fileStartOffset = _fragment.startOffset - ..fileOffset = _fragment.nameOffset - ..fileEndOffset = _fragment.endOffset - ..isAbstract = _fragment.modifiers.isAbstract - ..isExternal = _fragment.modifiers.isExternal - ..isConst = _fragment.modifiers.isConst - ..isStatic = true - ..isExtensionMember = _isExtensionMember - ..isExtensionTypeMember = _isExtensionTypeMember; + Procedure procedure = _procedure = extern.createProcedure( + memberName.name, + ProcedureKind.Method, + function, + reference: references?.setterReference, + fileUri: _fragment.fileUri, + fileStartOffset: _fragment.startOffset, + fileOffset: _fragment.nameOffset, + fileEndOffset: _fragment.endOffset, + isAbstract: _fragment.modifiers.isAbstract, + isExternal: _fragment.modifiers.isExternal, + isConst: _fragment.modifiers.isConst, + isStatic: true, + isExtensionMember: _isExtensionMember, + isExtensionTypeMember: _isExtensionTypeMember, + ); memberName.attachMember(procedure); f(kind: _builtMemberKind, member: procedure); diff --git a/pkg/front_end/lib/src/kernel/body_builder.dart b/pkg/front_end/lib/src/kernel/body_builder.dart index fd90d7dc92d..51adcef3699 100644 --- a/pkg/front_end/lib/src/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/kernel/body_builder.dart @@ -729,14 +729,14 @@ class BodyBuilderImpl extends StackListenerImpl Statement popBlock(int count, Token openBrace, Token? closeBrace) { return intern.createBlock( - offsetForToken(openBrace), - offsetForToken(closeBrace), const GrowableList().popNonNullable( stack, count, dummyStatement, ) ?? [], + fileOffset: offsetForToken(openBrace), + fileEndOffset: offsetForToken(closeBrace), ); } @@ -755,16 +755,20 @@ class BodyBuilderImpl extends StackListenerImpl Statement _handleStatementNotStatement(Object? element, Token? token) { if (element is ParserRecovery) { - return new Block([ - intern.createExpressionStatement( - element.charOffset, - ParserErrorGenerator.buildProblemExpression( - this, - diag.syntheticToken, - element.charOffset, + return intern.createBlock( + [ + intern.createExpressionStatement( + fileOffset: element.charOffset, + ParserErrorGenerator.buildProblemExpression( + this, + diag.syntheticToken, + element.charOffset, + ), ), - ), - ])..fileOffset = element.charOffset; + ], + fileOffset: element.charOffset, + fileEndOffset: element.charOffset, + ); } else { unhandled( "expected statement is ${element.runtimeType}: $element", @@ -1125,7 +1129,10 @@ class BodyBuilderImpl extends StackListenerImpl initializers = createFieldInitializer( formal.name, formal.fileOffset, - intern.createVariableGet(formal.fileOffset, formal.variable), + intern.createVariableGet( + formal.variable, + fileOffset: formal.fileOffset, + ), formal: formal, ); } @@ -1305,7 +1312,7 @@ class BodyBuilderImpl extends StackListenerImpl debugEvent("ExpressionStatement"); push( intern.createExpressionStatement( - offsetForToken(endToken), + fileOffset: offsetForToken(endToken), popForEffect(), ), ); @@ -2521,7 +2528,7 @@ class BodyBuilderImpl extends StackListenerImpl int charOffset, ) { registerVariableRead(variable); - return intern.createVariableGet(charOffset, variable); + return intern.createVariableGet(variable, fileOffset: charOffset); } /// Helper method to create a [ReadOnlyAccessGenerator] on the [variable] @@ -3401,39 +3408,41 @@ class BodyBuilderImpl extends StackListenerImpl InternalVariable internalVariable; if (isClosureContextLoweringEnabled) { internalVariable = new InternalLocalVariable( - astVariable: new LocalVariable( + astVariable: intern.createLocalVariable( cosmeticName: name, type: currentLocalVariableType, isFinal: isFinal, isConst: isConst, isLate: isLate, isWildcard: isWildcard, + fileOffset: identifier.nameOffset, ), forSyntheticToken: identifier.token.isSynthetic, isImplicitlyTyped: currentLocalVariableType == null, + fileOffset: identifier.nameOffset, ); - variableInitialization = new VariableInitialization( + variableInitialization = intern.createVariableInitialization( variable: internalVariable.asVariableDeclaration, initializer: initializer, hasDeclaredInitializer: initializer != null, + fileOffset: offsetForToken(equalsToken), ); } else { - variableInitialization = internalVariable = - new VariableDeclarationImpl( - name, - forSyntheticToken: identifier.token.isSynthetic, - initializer: initializer, - type: currentLocalVariableType, - isFinal: isFinal, - isConst: isConst, - isLate: isLate, - isRequired: isRequired, - hasDeclaredInitializer: initializer != null, - isStaticLate: isFinal && initializer == null, - isWildcard: isWildcard, - ) - ..fileOffset = identifier.nameOffset - ..fileEqualsOffset = offsetForToken(equalsToken); + variableInitialization = internalVariable = new VariableDeclarationImpl( + name, + forSyntheticToken: identifier.token.isSynthetic, + initializer: initializer, + type: currentLocalVariableType, + isFinal: isFinal, + isConst: isConst, + isLate: isLate, + isRequired: isRequired, + hasDeclaredInitializer: initializer != null, + isStaticLate: isFinal && initializer == null, + isWildcard: isWildcard, + fileOffset: identifier.nameOffset, + fileEqualsOffset: offsetForToken(equalsToken), + ); } assignedVariables.declare(internalVariable.astVariable); push(variableInitialization); @@ -3839,7 +3848,10 @@ class BodyBuilderImpl extends StackListenerImpl // TODO(johnniwinther): Can we avoid creating synthetic variables here? VariableDeclaration intermediateVariable = intern .createVariableDeclarationForValue( - intern.createVariableGet(variable.fileOffset, variable), + intern.createVariableGet( + variable, + fileOffset: variable.fileOffset, + ), ); intermediateVariables.add(intermediateVariable); @@ -3847,8 +3859,8 @@ class BodyBuilderImpl extends StackListenerImpl variable.fileOffset, variable.name!, initializer: intern.createVariableGet( - variable.fileOffset, intermediateVariable, + fileOffset: variable.fileOffset, ), isFinal: isFinal, ); @@ -4118,8 +4130,8 @@ class BodyBuilderImpl extends StackListenerImpl } if (variableOrExpression is PatternVariableDeclaration) { result = intern.createBlock( - result.fileOffset, - result.fileOffset, + fileOffset: result.fileOffset, + fileEndOffset: result.fileOffset, [variableOrExpression, ...intermediateVariables!, result], ); } @@ -5874,7 +5886,13 @@ class BodyBuilderImpl extends StackListenerImpl if (compileTimeErrors == null) { push(NullValues.Block); } else { - push(intern.createBlock(noLocation, noLocation, compileTimeErrors)); + push( + intern.createBlock( + fileOffset: noLocation, + fileEndOffset: noLocation, + compileTimeErrors, + ), + ); } } @@ -5932,7 +5950,13 @@ class BodyBuilderImpl extends StackListenerImpl if (compileTimeErrors != null) { compileTimeErrors.add(result); - push(intern.createBlock(noLocation, noLocation, compileTimeErrors)); + push( + intern.createBlock( + fileOffset: noLocation, + fileEndOffset: noLocation, + compileTimeErrors, + ), + ); } else { push(result); } @@ -6585,7 +6609,7 @@ class BodyBuilderImpl extends StackListenerImpl ); } receiver = intern.createInstantiation( - instantiationOffset, + fileOffset: instantiationOffset, receiver, buildDartTypeArguments( typeArgumentBuilders, @@ -7399,15 +7423,16 @@ class BodyBuilderImpl extends StackListenerImpl } } else { int offset = elseEntry.fileOffset; - node = new MapLiteralEntry( + node = intern.createMapLiteralEntry( buildProblem( message: diag.cantDisambiguateAmbiguousInformation, fileUri: uri, fileOffset: offset, length: 1, ), - new NullLiteral(), - )..fileOffset = offsetForToken(ifToken); + intern.createNullLiteral(TreeNode.noOffset), + fileOffset: offsetForToken(ifToken), + ); } } else { int offset = elseEntry is Expression @@ -7415,15 +7440,16 @@ class BodyBuilderImpl extends StackListenerImpl : // Coverage-ignore(suite): Not run. offsetForToken(ifToken); - node = new MapLiteralEntry( + node = intern.createMapLiteralEntry( buildProblem( message: diag.expectedAfterButGot.withArguments(expected: ':'), fileUri: uri, fileOffset: offset, length: 1, ), - new NullLiteral(), - )..fileOffset = offsetForToken(ifToken); + intern.createNullLiteral(TreeNode.noOffset), + fileOffset: offsetForToken(ifToken), + ); } } else if (elseEntry is MapLiteralEntry) { if (thenEntry is ControlFlowElement) { @@ -7451,15 +7477,16 @@ class BodyBuilderImpl extends StackListenerImpl } } else { int offset = thenEntry.fileOffset; - node = new MapLiteralEntry( + node = intern.createMapLiteralEntry( buildProblem( message: diag.cantDisambiguateAmbiguousInformation, fileUri: uri, fileOffset: offset, length: 1, ), - new NullLiteral(), - )..fileOffset = offsetForToken(ifToken); + intern.createNullLiteral(TreeNode.noOffset), + fileOffset: offsetForToken(ifToken), + ); } } else { int offset = thenEntry is Expression @@ -7467,15 +7494,16 @@ class BodyBuilderImpl extends StackListenerImpl : // Coverage-ignore(suite): Not run. offsetForToken(ifToken); - node = new MapLiteralEntry( + node = intern.createMapLiteralEntry( buildProblem( message: diag.expectedAfterButGot.withArguments(expected: ':'), fileUri: uri, fileOffset: offset, length: 1, ), - new NullLiteral(), - )..fileOffset = offsetForToken(ifToken); + intern.createNullLiteral(TreeNode.noOffset), + fileOffset: offsetForToken(ifToken), + ); } } else { if (condition.patternGuard == null) { @@ -7636,8 +7664,11 @@ class BodyBuilderImpl extends StackListenerImpl if (identifier is Identifier) { push( new NamedArgument( - new NamedExpression(identifier.name, value) - ..fileOffset = identifier.nameOffset, + intern.createNamedExpression( + identifier.name, + value, + fileOffset: identifier.nameOffset, + ), ), ); } else { @@ -7675,8 +7706,11 @@ class BodyBuilderImpl extends StackListenerImpl Object? identifier = pop(); if (identifier is Identifier) { push( - new NamedExpression(identifier.name, value) - ..fileOffset = identifier.nameOffset, + intern.createNamedExpression( + identifier.name, + value, + fileOffset: identifier.nameOffset, + ), ); } else { assert( @@ -7722,7 +7756,8 @@ class BodyBuilderImpl extends StackListenerImpl isFinal: true, isLocalFunction: true, isWildcard: isWildcard, - )..fileOffset = name.nameOffset; + fileOffset: name.nameOffset, + ); push( new FunctionDeclarationImpl( variable, @@ -7858,14 +7893,17 @@ class BodyBuilderImpl extends StackListenerImpl // This must have been a compile-time error. assert(isErroneousNode(variable.initializer!)); - statement = intern - .createBlock(declaration.fileOffset, noLocation, [ - intern.createExpressionStatement( - offsetForToken(token), - variable.initializer!, - ), - declaration, - ]); + statement = intern.createBlock( + fileOffset: declaration.fileOffset, + fileEndOffset: noLocation, + [ + intern.createExpressionStatement( + fileOffset: offsetForToken(token), + variable.initializer!, + ), + declaration, + ], + ); variable.initializer = null; } else { statement = declaration; @@ -7880,8 +7918,12 @@ class BodyBuilderImpl extends StackListenerImpl // function declaration instead. We wrap it in a [BlockExpression]. exitLocalScope(); push( - new BlockExpression( - intern.createBlock(declaration.fileOffset, noLocation, [statement]), + intern.createBlockExpression( + intern.createBlock( + fileOffset: declaration.fileOffset, + fileEndOffset: noLocation, + [statement], + ), buildProblem( message: diag.namedFunctionExpression, fileUri: uri, @@ -7890,7 +7932,8 @@ class BodyBuilderImpl extends StackListenerImpl // Error has already been reported by the parser. errorHasBeenReported: true, ), - )..fileOffset = declaration.fileOffset, + fileOffset: declaration.fileOffset, + ), ); } else { push(statement); @@ -7960,8 +8003,10 @@ class BodyBuilderImpl extends StackListenerImpl length: formals.length, ); } else { - result = new FunctionExpression(function) - ..fileOffset = offsetForToken(beginToken); + result = intern.createFunctionExpression( + function, + fileOffset: offsetForToken(beginToken), + ); } push(result); // This is matched by the call to [beginNode] in [enterFunction]. @@ -8585,14 +8630,15 @@ class BodyBuilderImpl extends StackListenerImpl ); } else { push( - new ExpressionStatement( + intern.createExpressionStatement( buildProblem( message: diag.rethrowNotCatch, fileUri: uri, fileOffset: offsetForToken(rethrowToken), length: lengthForToken(rethrowToken), ), - )..fileOffset = offsetForToken(rethrowToken), + fileOffset: offsetForToken(rethrowToken), + ), ); } } @@ -9322,8 +9368,11 @@ class BodyBuilderImpl extends StackListenerImpl patternSwitchCases, ); } else { - switchStatement = new SwitchStatement(expression, cases) - ..fileOffset = switchKeyword.charOffset; + switchStatement = intern.createSwitchStatement( + expression, + cases, + fileOffset: switchKeyword.charOffset, + ); } Statement result = switchStatement; // We create a labeled statement enclosing the switch statement if it has @@ -9633,9 +9682,10 @@ class BodyBuilderImpl extends StackListenerImpl } if (target.isGotoTarget && target.functionNestingLevel == functionNestingLevel) { - ContinueSwitchStatement statement = new ContinueSwitchStatement( - dummySwitchCase, - )..fileOffset = continueKeyword.charOffset; + ContinueSwitchStatement statement = intern + .createContinueSwitchStatement( + fileOffset: continueKeyword.charOffset, + ); target.addGoto(statement); push(statement); return; @@ -9848,13 +9898,14 @@ class BodyBuilderImpl extends StackListenerImpl void handleInvalidStatement(Token token, Message message) { Statement statement = pop() as Statement; push( - new ExpressionStatement( + intern.createExpressionStatement( buildProblem( message: message, fileUri: uri, fileOffset: statement.fileOffset, length: noLength, ), + fileOffset: statement.fileOffset, ), ); } @@ -9884,16 +9935,23 @@ class BodyBuilderImpl extends StackListenerImpl CfeSeverity.error, ) .plain; - return new InvalidExpression(text, expression)..fileOffset = fileOffset; + return extern.createInvalidExpression( + text, + expression: expression, + fileOffset: fileOffset, + ); } Expression buildAbstractClassInstantiationError( Message message, - String className, [ - int charOffset = -1, - ]) { + String className, + int charOffset, + ) { addProblemErrorIfConst(message, charOffset, className.length); - return new InvalidExpression(message.problemMessage); + return extern.createInvalidExpression( + message.problemMessage, + fileOffset: charOffset, + ); } Statement buildProblemStatement( @@ -9904,7 +9962,7 @@ class BodyBuilderImpl extends StackListenerImpl bool errorHasBeenReported = false, }) { length ??= noLength; - return new ExpressionStatement( + return intern.createExpressionStatement( buildProblem( message: message, fileUri: uri, @@ -9913,6 +9971,7 @@ class BodyBuilderImpl extends StackListenerImpl context: context, errorHasBeenReported: errorHasBeenReported, ), + fileOffset: charOffset, ); } @@ -9994,7 +10053,7 @@ class BodyBuilderImpl extends StackListenerImpl // as we've already reported that the field isn't valid. return [ extern.createInvalidInitializer( - new InvalidExpression( + extern.createInvalidExpression( compilerContext .format( diag.extensionTypeDeclaresInstanceField.withLocation( @@ -10005,6 +10064,7 @@ class BodyBuilderImpl extends StackListenerImpl cfe.CfeSeverity.error, ) .plain, + fileOffset: builder.fileOffset, ), ), ]; @@ -10246,13 +10306,17 @@ class BodyBuilderImpl extends StackListenerImpl push(NullValues.FunctionBody); } else { push( - intern.createBlock(offsetForToken(token), noLocation, [ - buildProblemStatement( - diag.expectedFunctionBody.withArguments(lexeme: token), - token.charOffset, - length: token.length, - ), - ]), + intern.createBlock( + fileOffset: offsetForToken(token), + fileEndOffset: noLocation, + [ + buildProblemStatement( + diag.expectedFunctionBody.withArguments(lexeme: token), + token.charOffset, + length: token.length, + ), + ], + ), ); } } @@ -10293,14 +10357,15 @@ class BodyBuilderImpl extends StackListenerImpl ); } else { push( - new Instantiation( + intern.createInstantiation( toValue(operand), buildDartTypeArguments( typeArguments, TypeUse.tearOffTypeArgument, allowPotentiallyConstantType: true, ), - )..fileOffset = openAngleBracket.charOffset, + fileOffset: openAngleBracket.charOffset, + ), ); } } else { @@ -10435,13 +10500,11 @@ class BodyBuilderImpl extends StackListenerImpl ) { if (arguments == null) return expression; for (Argument argument in arguments.argumentList.reversed) { - expression = new Let( - new VariableDeclaration.forValue( - argument.expression, - isFinal: true, - type: coreTypes.objectRawType(Nullability.nullable), - ), - expression, + expression = intern.createLetForEffect( + effect: argument.expression, + // TODO(johnniwinther): Should we use `void` instead? + effectType: coreTypes.objectRawType(Nullability.nullable), + expression: expression, ); } return expression; @@ -10529,11 +10592,12 @@ class BodyBuilderImpl extends StackListenerImpl length: noLength, ); } else { - Expression receiver = new SuperPropertyGet( - new ThisExpression(), + Expression receiver = intern.createSuperPropertyGet( + intern.createThisExpression(fileOffset: offset), name, target, - )..fileOffset = offset; + fileOffset: offset, + ); return intern.createExpressionInvocation( arguments.fileOffset, receiver, @@ -10609,8 +10673,10 @@ class BodyBuilderImpl extends StackListenerImpl CfeSeverity.error, ) .plain; - InvalidExpression expression = new InvalidExpression(text) - ..fileOffset = charOffset; + InvalidExpression expression = extern.createInvalidExpression( + text, + fileOffset: charOffset, + ); return expression; } @@ -10650,10 +10716,10 @@ class BodyBuilderImpl extends StackListenerImpl PrefixBuilder prefix, int charOffset, ) { - VariableDeclaration check = new VariableDeclaration.forValue( + VariableDeclaration check = intern.createVariableDeclarationForValue( intern.checkLibraryIsLoaded(charOffset, prefix.dependency!), ); - return new DeferredCheck(check, expression)..fileOffset = charOffset; + return new DeferredCheck(check, expression, fileOffset: charOffset); } bool isErroneousNode(TreeNode node) { @@ -10984,7 +11050,10 @@ class BodyBuilderImpl extends StackListenerImpl if (inAssignmentPattern) { // Error has already been reported. pattern = intern.createInvalidPattern( - new InvalidExpression('declared variable pattern in assignment'), + extern.createInvalidExpression( + 'declared variable pattern in assignment', + fileOffset: variable.charOffset, + ), declaredVariables: const [], ); } else { 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 15655bd1a5b..7d90d09876f 100644 --- a/pkg/front_end/lib/src/kernel/body_builder_context.dart +++ b/pkg/front_end/lib/src/kernel/body_builder_context.dart @@ -30,6 +30,7 @@ import '../type_inference/type_inferrer.dart' show InferredConstructorInitializer, TypeInferrer, ConstructorContext; import '../util/helpers.dart'; import 'internal_ast.dart'; +import 'internal_ast_helper.dart' as intern; /// Interface that defines the interface between the [BodyBuilder] and the /// member/declaration whose AST is being built. @@ -416,7 +417,10 @@ abstract class BodyBuilderContext { /// as a parameter in that case. ThisVariable? createInternalThisVariable() { return thisType != null && isDeclarationInstanceContext - ? new ThisVariable(type: thisType!) + ? intern.createThisVariable( + type: thisType!, + fileOffset: memberNameOffset, + ) : null; } } diff --git a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart index f31b7b1774a..e6bbf0ae803 100644 --- a/pkg/front_end/lib/src/kernel/body_builder_helpers.dart +++ b/pkg/front_end/lib/src/kernel/body_builder_helpers.dart @@ -318,17 +318,17 @@ class FormalParameters extends Parameters { t.bound?.build(library, TypeUse.typeParameterBound); } } - return new FunctionNode( - body, - typeParameters: typeParameters, - positionalParameters: positionalParameters, - namedParameters: namedParameters, - requiredParameterCount: requiredParameterCount, - returnType: returnType, - asyncMarker: asyncModifier.kind, - ) - ..fileOffset = charOffset - ..fileEndOffset = fileEndOffset; + return extern.createFunctionNode( + body, + typeParameters: typeParameters, + positionalParameters: positionalParameters, + namedParameters: namedParameters, + requiredParameterCount: requiredParameterCount, + returnType: returnType, + asyncMarker: asyncModifier.kind, + fileOffset: charOffset, + fileEndOffset: fileEndOffset, + ); } @override diff --git a/pkg/front_end/lib/src/kernel/collections.dart b/pkg/front_end/lib/src/kernel/collections.dart index a9f18c852c8..c0865b7440b 100644 --- a/pkg/front_end/lib/src/kernel/collections.dart +++ b/pkg/front_end/lib/src/kernel/collections.dart @@ -13,6 +13,7 @@ import '../base/problems.dart' show getFileUri, unsupported; import '../source/check_helper.dart'; import '../type_inference/inference_results.dart'; import '../type_inference/inference_visitor.dart'; +import 'external_ast_helper.dart' as extern; import 'internal_ast.dart'; /// Base class for all control-flow elements. @@ -1085,7 +1086,7 @@ MapLiteralEntry _convertToErroneousMapEntry( CompilerContext compilerContext, Uri fileUri, ) { - return new MapLiteralEntry( + return extern.createMapLiteralEntry( problemReporting.buildProblem( compilerContext: compilerContext, message: diag.expectedAfterButGot.withArguments(expected: ':'), @@ -1094,6 +1095,7 @@ MapLiteralEntry _convertToErroneousMapEntry( // TODO(danrubel): what is the length of the expression? length: noLength, ), - new NullLiteral()..fileOffset = element.fileOffset, - )..fileOffset = element.fileOffset; + extern.createNullLiteral(fileOffset: element.fileOffset), + fileOffset: element.fileOffset, + ); } diff --git a/pkg/front_end/lib/src/kernel/combined_member_signature.dart b/pkg/front_end/lib/src/kernel/combined_member_signature.dart index 19793419663..99bea0a1da2 100644 --- a/pkg/front_end/lib/src/kernel/combined_member_signature.dart +++ b/pkg/front_end/lib/src/kernel/combined_member_signature.dart @@ -14,6 +14,7 @@ import 'package:kernel/type_algebra.dart'; import '../base/problems.dart' show unhandled; import '../builder/declaration_builders.dart'; import '../source/source_class_builder.dart'; +import 'external_ast_helper.dart' as extern; import 'hierarchy/class_member.dart'; import 'hierarchy/hierarchy_builder.dart'; import 'hierarchy/members_builder.dart'; @@ -492,33 +493,37 @@ abstract class CombinedMemberSignatureBase { Reference? reference = indexedContainer?.lookupGetterReference(member.name); Uri fileUri; - int startFileOffset; + int fileStartOffset; int fileOffset; + int fileEndOffset; if (copyLocation) { // Coverage-ignore-block(suite): Not run. fileUri = member.fileUri; - startFileOffset = member is Procedure + fileStartOffset = member is Procedure ? member.fileStartOffset : member.fileOffset; fileOffset = member.fileOffset; + fileEndOffset = member is Procedure + ? member.fileEndOffset + : member.fileOffset; } else { fileUri = declarationNode.fileUri; - fileOffset = startFileOffset = declarationNode.fileOffset; + fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset; } - return new Procedure( - member.name, - ProcedureKind.Getter, - new FunctionNode(null, returnType: type), - isAbstract: true, - fileUri: fileUri, - reference: reference, - isSynthetic: true, - stubKind: ProcedureStubKind.MemberSignature, - stubTarget: member.memberSignatureOrigin ?? member, - ) - ..fileStartOffset = startFileOffset - ..fileOffset = fileOffset - ..parent = declarationNode; + return extern.createProcedure( + member.name, + ProcedureKind.Getter, + extern.createFunctionNode(null, returnType: type, fileOffset: fileOffset), + isAbstract: true, + fileUri: fileUri, + reference: reference, + isSynthetic: true, + stubKind: ProcedureStubKind.MemberSignature, + stubTarget: member.memberSignatureOrigin ?? member, + fileStartOffset: fileStartOffset, + fileOffset: fileOffset, + fileEndOffset: fileEndOffset, + )..parent = declarationNode; } /// Creates a setter member signature for [member] with the given @@ -537,18 +542,22 @@ abstract class CombinedMemberSignatureBase { }) { Reference? reference = indexedContainer?.lookupSetterReference(member.name); Uri fileUri; - int startFileOffset; + int fileStartOffset; int fileOffset; + int fileEndOffset; if (copyLocation) { // Coverage-ignore-block(suite): Not run. fileUri = member.fileUri; - startFileOffset = member is Procedure + fileStartOffset = member is Procedure ? member.fileStartOffset : member.fileOffset; fileOffset = member.fileOffset; + fileEndOffset = member is Procedure + ? member.fileEndOffset + : member.fileOffset; } else { fileUri = declarationNode.fileUri; - fileOffset = startFileOffset = declarationNode.fileOffset; + fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset; } VariableDeclaration setterParameter; if (_isClosureContextLoweringEnabled) { @@ -564,37 +573,36 @@ abstract class CombinedMemberSignatureBase { ? parameter?.fileOffset ?? fileOffset : fileOffset; } else { - setterParameter = - new VariableDeclaration( - parameter?.name ?? 'value', - type: type, - isCovariantByDeclaration: isCovariantByDeclaration, - ) - ..isCovariantByClass = isCovariantByClass - ..fileOffset = copyLocation - ? - // Coverage-ignore(suite): Not run. - parameter?.fileOffset ?? fileOffset - : fileOffset; + setterParameter = extern.createParameterVariable( + parameter?.name ?? 'value', + type: type, + isCovariantByDeclaration: isCovariantByDeclaration, + isCovariantByClass: isCovariantByClass, + fileOffset: copyLocation + ? + // Coverage-ignore(suite): Not run. + parameter?.fileOffset ?? fileOffset + : fileOffset, + ); } - return new Procedure( - member.name, - ProcedureKind.Setter, - new FunctionNode( - null, - returnType: const VoidType(), - positionalParameters: [setterParameter], - ), - isAbstract: true, - fileUri: fileUri, - reference: reference, - isSynthetic: true, - stubKind: ProcedureStubKind.MemberSignature, - stubTarget: member.memberSignatureOrigin ?? member, - ) - ..fileStartOffset = startFileOffset - ..fileOffset = fileOffset - ..parent = declarationNode; + return extern.createProcedure( + member.name, + ProcedureKind.Setter, + new FunctionNode( + null, + returnType: const VoidType(), + positionalParameters: [setterParameter], + ), + isAbstract: true, + fileUri: fileUri, + reference: reference, + isSynthetic: true, + stubKind: ProcedureStubKind.MemberSignature, + stubTarget: member.memberSignatureOrigin ?? member, + fileStartOffset: fileStartOffset, + fileOffset: fileOffset, + fileEndOffset: fileEndOffset, + )..parent = declarationNode; } Procedure _createMethodSignature( @@ -608,16 +616,18 @@ abstract class CombinedMemberSignatureBase { procedure.name, ); Uri fileUri; - int startFileOffset; + int fileStartOffset; int fileOffset; + int fileEndOffset; if (copyLocation) { // Coverage-ignore-block(suite): Not run. fileUri = procedure.fileUri; - startFileOffset = procedure.fileStartOffset; + fileStartOffset = procedure.fileStartOffset; fileOffset = procedure.fileOffset; + fileEndOffset = procedure.fileEndOffset; } else { fileUri = declarationNode.fileUri; - fileOffset = startFileOffset = declarationNode.fileOffset; + fileOffset = fileStartOffset = fileEndOffset = declarationNode.fileOffset; } FunctionNode function = procedure.function; List positionalParameters = []; @@ -645,20 +655,19 @@ abstract class CombinedMemberSignatureBase { ..isCovariantByClass = parameter.isCovariantByClass ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset; } else { - positionalParameter = - new VariableDeclaration( - parameter.name, - type: parameterType, - isCovariantByDeclaration: parameter.isCovariantByDeclaration, - initializer: cloner.cloneOptional(parameter.initializer), - ) - ..hasDeclaredInitializer = parameter.hasDeclaredInitializer - ..isCovariantByClass = parameter.isCovariantByClass - ..fileOffset = copyLocation - ? - // Coverage-ignore(suite): Not run. - parameter.fileOffset - : fileOffset; + positionalParameter = extern.createParameterVariable( + parameter.name, + type: parameterType, + isCovariantByDeclaration: parameter.isCovariantByDeclaration, + initializer: cloner.cloneOptional(parameter.initializer), + hasDeclaredInitializer: parameter.hasDeclaredInitializer, + isCovariantByClass: parameter.isCovariantByClass, + fileOffset: copyLocation + ? + // Coverage-ignore(suite): Not run. + parameter.fileOffset + : fileOffset, + ); } positionalParameters.add(positionalParameter); } @@ -680,20 +689,20 @@ abstract class CombinedMemberSignatureBase { ..isCovariantByClass = parameter.isCovariantByClass ..fileOffset = copyLocation ? parameter.fileOffset : fileOffset; } else { - return new VariableDeclaration( - parameter.name, - type: freshTypeParameters.substitute(namedType.type), - isRequired: namedType.isRequired, - isCovariantByDeclaration: parameter.isCovariantByDeclaration, - initializer: cloner.cloneOptional(parameter.initializer), - ) - ..hasDeclaredInitializer = parameter.hasDeclaredInitializer - ..isCovariantByClass = parameter.isCovariantByClass - ..fileOffset = copyLocation + return extern.createParameterVariable( + parameter.name, + type: freshTypeParameters.substitute(namedType.type), + isRequired: namedType.isRequired, + isCovariantByDeclaration: parameter.isCovariantByDeclaration, + initializer: cloner.cloneOptional(parameter.initializer), + hasDeclaredInitializer: parameter.hasDeclaredInitializer, + isCovariantByClass: parameter.isCovariantByClass, + fileOffset: copyLocation ? // Coverage-ignore(suite): Not run. parameter.fileOffset - : fileOffset; + : fileOffset, + ); } } @@ -714,27 +723,28 @@ abstract class CombinedMemberSignatureBase { namedParameters.add(cloneNamedParameter(parameter, namedParameterType)); } } - return new Procedure( - procedure.name, - procedure.kind, - new FunctionNode( - null, - typeParameters: freshTypeParameters.freshTypeParameters, - returnType: freshTypeParameters.substitute(functionType.returnType), - positionalParameters: positionalParameters, - namedParameters: namedParameters, - requiredParameterCount: function.requiredParameterCount, - ), - isAbstract: true, - fileUri: fileUri, - reference: reference, - isSynthetic: true, - stubKind: ProcedureStubKind.MemberSignature, - stubTarget: procedure.memberSignatureOrigin ?? procedure, - ) - ..fileStartOffset = startFileOffset - ..fileOffset = fileOffset - ..parent = declarationNode; + return extern.createProcedure( + procedure.name, + procedure.kind, + extern.createFunctionNode( + null, + typeParameters: freshTypeParameters.freshTypeParameters, + returnType: freshTypeParameters.substitute(functionType.returnType), + positionalParameters: positionalParameters, + namedParameters: namedParameters, + requiredParameterCount: function.requiredParameterCount, + fileOffset: fileOffset, + ), + isAbstract: true, + fileUri: fileUri, + reference: reference, + isSynthetic: true, + stubKind: ProcedureStubKind.MemberSignature, + stubTarget: procedure.memberSignatureOrigin ?? procedure, + fileStartOffset: fileStartOffset, + fileOffset: fileOffset, + fileEndOffset: fileEndOffset, + )..parent = declarationNode; } DartType _computeMemberType(Member member) { diff --git a/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart b/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart index bae47e1fe55..cf1f6306c36 100644 --- a/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart +++ b/pkg/front_end/lib/src/kernel/const_conditional_simplifier.dart @@ -8,6 +8,7 @@ import 'package:kernel/core_types.dart'; import 'package:kernel/target/targets.dart'; import 'package:kernel/type_environment.dart'; +import 'external_ast_helper.dart' as extern; import 'try_constant_evaluator.dart'; class ConstConditionalSimplifier extends RemovingTransformer { @@ -81,7 +82,7 @@ class ConstConditionalSimplifier extends RemovingTransformer { } else { return node.otherwise ?? removalSentinel ?? // Coverage-ignore(suite): Not run. - new EmptyStatement(); + extern.createEmptyStatement(); } } @@ -89,7 +90,7 @@ class ConstConditionalSimplifier extends RemovingTransformer { // Coverage-ignore(suite): Not run. TreeNode visitAssertBlock(AssertBlock node, TreeNode? removalSentinel) { if (_removeAsserts) { - return removalSentinel ?? new EmptyStatement(); + return removalSentinel ?? extern.createEmptyStatement(); } else { return super.visitAssertBlock(node, removalSentinel); } @@ -117,7 +118,7 @@ class ConstConditionalSimplifier extends RemovingTransformer { TreeNode? removalSentinel, ) { if (_removeAsserts) { - return removalSentinel ?? new EmptyStatement(); + return removalSentinel ?? extern.createEmptyStatement(); } else { return super.visitAssertStatement(node, removalSentinel); } diff --git a/pkg/front_end/lib/src/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/kernel/constant_evaluator.dart index 2a22cea1cc1..c5a38048943 100644 --- a/pkg/front_end/lib/src/kernel/constant_evaluator.dart +++ b/pkg/front_end/lib/src/kernel/constant_evaluator.dart @@ -531,9 +531,9 @@ class ConstantsTransformer extends RemovingTransformer { Expression left = transform(node.left); Expression right = transform(node.right); if (_isNull(left)) { - return new EqualsNull(right)..fileOffset = node.fileOffset; + return extern.createEqualsNull(right, fileOffset: node.fileOffset); } else if (_isNull(right)) { - return new EqualsNull(left)..fileOffset = node.fileOffset; + return extern.createEqualsNull(left, fileOffset: node.fileOffset); } node.left = left..parent = node; node.right = right..parent = node; @@ -958,18 +958,20 @@ class ConstantsTransformer extends RemovingTransformer { patternGuard.pattern as ConstantPattern; expressionOffsets.add(constantPattern.fileOffset); expressions.add( - new ConstantExpression( + extern.createConstantExpression( constantPattern.value!, constantPattern.expressionType!, - )..fileOffset = constantPattern.expression.fileOffset, + fileOffset: constantPattern.expression.fileOffset, + ), ); } - SwitchCase switchCase = new SwitchCase( + SwitchCase switchCase = extern.createSwitchCase( expressions, expressionOffsets, patternSwitchCase.body, isDefault: patternSwitchCase.isDefault, - )..fileOffset = patternSwitchCase.fileOffset; + fileOffset: patternSwitchCase.fileOffset, + ); switchCases.add(switchCase); for (Statement labelUser in patternSwitchCase.labelUsers) { (labelUser as ContinueSwitchStatement).target = switchCase; @@ -1288,8 +1290,9 @@ class ConstantsTransformer extends RemovingTransformer { if (node.parent is LabeledStatement) { target = node.parent as LabeledStatement; } else { - target = outerLabeledStatement = new LabeledStatement( + target = outerLabeledStatement = extern.createLabeledStatement( dummyStatement, + fileOffset: node.fileOffset, ); } breakStatement = extern.createBreakStatement( @@ -1378,8 +1381,10 @@ class ConstantsTransformer extends RemovingTransformer { // Coverage-ignore-block(suite): Not run. replacement = replacementStatements.first; } else { - replacement = new Block(replacementStatements) - ..fileOffset = node.fileOffset; + replacement = extern.createBlock( + replacementStatements, + fileOffset: node.fileOffset, + ); } } if (outerLabeledStatement != null) { @@ -1962,33 +1967,32 @@ class ConstantsTransformer extends RemovingTransformer { patternGuard.pattern as ConstantPattern; expressionOffsets.add(constantPattern.fileOffset); expressions.add( - new ConstantExpression( + extern.createConstantExpression( constantPattern.value!, constantPattern.expressionType!, - )..fileOffset = constantPattern.expression.fileOffset, + fileOffset: constantPattern.expression.fileOffset, + ), ); - SwitchCase switchCase = - new SwitchCase( - expressions, - expressionOffsets, - extern.createBlock([ - extern.createExpressionStatement( - extern.createVariableSet( - valueVariable, - switchExpressionCase.expression, - fileOffset: switchExpressionCase.expression.fileOffset, - ), - ), - extern.createBreakStatement( - labeledStatement, - fileOffset: switchExpressionCase.expression.fileOffset, - ), - ], fileOffset: switchExpressionCase.fileOffset), - isDefault: false, - ) - ..fileOffset = switchExpressionCase.fileOffset - ..fileOffset; + SwitchCase switchCase = extern.createSwitchCase( + expressions, + expressionOffsets, + extern.createBlock([ + extern.createExpressionStatement( + extern.createVariableSet( + valueVariable, + switchExpressionCase.expression, + fileOffset: switchExpressionCase.expression.fileOffset, + ), + ), + extern.createBreakStatement( + labeledStatement, + fileOffset: switchExpressionCase.expression.fileOffset, + ), + ], fileOffset: switchExpressionCase.fileOffset), + isDefault: false, + fileOffset: switchExpressionCase.fileOffset, + ); switchCases.add(switchCase); } @@ -2455,22 +2459,25 @@ class ConstantsTransformer extends RemovingTransformer { constant.expression is InvalidExpression) { return constant.expression; } - ConstantExpression constantExpression = new ConstantExpression( + ConstantExpression constantExpression = extern.createConstantExpression( constant, node.getStaticType(staticTypeContext), - )..fileOffset = node.fileOffset; + fileOffset: node.fileOffset, + ); if (node is FileUriExpression) { - return new FileUriConstantExpression( + return extern.createFileUriConstantExpression( constantExpression.constant, type: constantExpression.type, fileUri: node.fileUri, - )..fileOffset = node.fileOffset; + fileOffset: node.fileOffset, + ); } else if (node is FileUriConstantExpression) { - return new FileUriConstantExpression( + return extern.createFileUriConstantExpression( constantExpression.constant, type: constantExpression.type, fileUri: node.fileUri, - )..fileOffset = node.fileOffset; + fileOffset: node.fileOffset, + ); } return constantExpression; } @@ -2763,21 +2770,30 @@ class ConstantEvaluator errorReporter.report(locatedMessage, contextMessages); } return new UnevaluatedConstant( - new InvalidExpression(message.problemMessage), + extern.createInvalidExpression( + message.problemMessage, + fileOffset: result.node.fileOffset, + ), ); case _AbortDueToInvalidExpressionConstant(): return new UnevaluatedConstant( // Create a new [InvalidExpression] without the expression, which // might now have lost the needed context. For instance references // to variables no longer in scope. - new InvalidExpression(result.node.message), + extern.createInvalidExpression( + result.node.message, + fileOffset: result.node.fileOffset, + ), ); case _AbortDueToInvalidInitializerConstant(): return new UnevaluatedConstant( // Create a new [InvalidExpression] without the expression, which // might now have lost the needed context. For instance references // to variables no longer in scope. - new InvalidExpression(result.node.message), + extern.createInvalidExpression( + result.node.message, + fileOffset: result.node.fileOffset, + ), ); } } @@ -2904,8 +2920,11 @@ class ConstantEvaluator Constant unevaluated(Expression original, Expression replacement) { replacement.fileOffset = original.fileOffset; return new UnevaluatedConstant( - new FileUriExpression(replacement, getFileUri(original)!) - ..fileOffset = original.fileOffset, + extern.createFileUriExpression( + expression: replacement, + fileUri: getFileUri(original)!, + fileOffset: original.fileOffset, + ), ); } @@ -3448,10 +3467,11 @@ class ConstantEvaluator // Coverage-ignore-block(suite): Not run. return unevaluated( node, - new ConstructorInvocation( + extern.createConstructorInvocation( constructor, unevaluatedArguments(positional, named, node.arguments.types), isConst: true, + fileOffset: node.fileOffset, ), ); } @@ -3796,11 +3816,12 @@ class ConstantEvaluator leaveLazy(); } instanceBuilder!.asserts.add( - new AssertStatement( + extern.createAssertStatement( _wrap(condition), message: message, conditionStartOffset: statement.conditionStartOffset, conditionEndOffset: statement.conditionEndOffset, + fileOffset: statement.fileOffset, ), ); } else { @@ -3820,11 +3841,12 @@ class ConstantEvaluator if (shouldBeUnevaluated) { // Coverage-ignore-block(suite): Not run. instanceBuilder!.asserts.add( - new AssertStatement( + extern.createAssertStatement( _wrap(condition), message: _wrap(message), conditionStartOffset: statement.conditionStartOffset, conditionEndOffset: statement.conditionEndOffset, + fileOffset: statement.fileOffset, ), ); } else if (message is StringConstant) { @@ -3907,14 +3929,14 @@ class ConstantEvaluator // Coverage-ignore-block(suite): Not run. return unevaluated( node, - new DynamicInvocation( - node.kind, - _wrap(receiver), - node.name, - unevaluatedArguments(positionalArguments, {}, node.arguments.types), - ) - ..fileOffset = node.fileOffset - ..flags = node.flags, + extern.createDynamicInvocation( + node.kind, + _wrap(receiver), + node.name, + unevaluatedArguments(positionalArguments, {}, node.arguments.types), + fileOffset: node.fileOffset, + flags: node.flags, + ), ); } @@ -4091,12 +4113,13 @@ class ConstantEvaluator // Coverage-ignore-block(suite): Not run. return unevaluated( node, - new EqualsCall( + extern.createEqualsCall( _wrap(left), _wrap(right), functionType: node.functionType, interfaceTarget: node.interfaceTarget, - )..fileOffset = node.fileOffset, + fileOffset: node.fileOffset, + ), ); } @@ -4111,7 +4134,7 @@ class ConstantEvaluator if (shouldBeUnevaluated) { return unevaluated( node, - new EqualsNull(_wrap(expression))..fileOffset = node.fileOffset, + extern.createEqualsNull(_wrap(expression), fileOffset: node.fileOffset), ); } @@ -4567,11 +4590,12 @@ class ConstantEvaluator leaveLazy(); return unevaluated( node, - new ConditionalExpression( + extern.createConditionalExpression( _wrap(condition), _wrap(then), _wrap(otherwise), - env.substituteType(node.staticType), + staticType: env.substituteType(node.staticType), + fileOffset: node.fileOffset, ), ); } else { @@ -4626,12 +4650,13 @@ class ConstantEvaluator // Coverage-ignore-block(suite): Not run. return unevaluated( node, - new InstanceGet( + extern.createInstanceGet( node.kind, _wrap(receiver), node.name, resultType: node.resultType, interfaceTarget: node.interfaceTarget, + fileOffset: node.fileOffset, ), ); } else if (receiver is NullConstant) { diff --git a/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart index 6d691216676..f508dc52f92 100644 --- a/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart +++ b/pkg/front_end/lib/src/kernel/constructor_tearoff_lowering.dart @@ -9,6 +9,7 @@ import 'package:kernel/type_algebra.dart'; import '../builder/library_builder.dart'; import '../source/name_scheme.dart'; import '../source/source_library_builder.dart'; +import 'external_ast_helper.dart' as extern; import 'kernel_helper.dart'; // TODO(johnniwinther): move all lowering predicates to `package:kernel`. @@ -316,19 +317,18 @@ Procedure _createTearOffProcedure( int fileOffset, Reference? reference, ) { - Procedure tearOff = - new Procedure( - dummyName, - ProcedureKind.Method, - new FunctionNode(null), - fileUri: fileUri, - isStatic: true, - isSynthetic: true, - reference: reference, - ) - ..fileStartOffset = fileOffset - ..fileOffset = fileOffset - ..fileEndOffset = fileOffset; + Procedure tearOff = extern.createProcedure( + dummyName, + ProcedureKind.Method, + extern.createFunctionNode(null, fileOffset: fileOffset), + fileUri: fileUri, + isStatic: true, + isSynthetic: true, + reference: reference, + fileStartOffset: fileOffset, + fileOffset: fileOffset, + fileEndOffset: fileOffset, + ); tearOffName.attachMember(tearOff); return tearOff; } @@ -392,11 +392,12 @@ DelayedDefaultValueCloner _createParameters( )..fileOffset = constructorParameter.fileOffset; } } else { - return new VariableDeclaration( + return extern.createParameterVariable( constructorParameter.name, type: substitution.substituteType(constructorParameter.type), isRequired: !isPositional && constructorParameter.isRequired, - )..fileOffset = constructorParameter.fileOffset; + fileOffset: constructorParameter.fileOffset, + ); } } @@ -449,24 +450,25 @@ Arguments _createArguments( for (VariableDeclaration tearOffParameter in tearOff.function.positionalParameters) { positionalArguments.add( - new VariableGet(tearOffParameter)..fileOffset = fileOffset, + extern.createVariableGet(tearOffParameter, fileOffset: fileOffset), ); } List namedArguments = []; for (VariableDeclaration tearOffParameter in tearOff.function.namedParameters) { namedArguments.add( - new NamedExpression( + extern.createNamedExpression( tearOffParameter.name!, - new VariableGet(tearOffParameter)..fileOffset = fileOffset, - )..fileOffset = fileOffset, + extern.createVariableGet(tearOffParameter, fileOffset: fileOffset), + ), ); } - Arguments arguments = new Arguments( + Arguments arguments = extern.createArguments( positionalArguments, named: namedArguments, types: typeArguments, - )..fileOffset = tearOff.fileOffset; + fileOffset: tearOff.fileOffset, + ); return arguments; } @@ -480,14 +482,20 @@ void _createTearOffBody(Procedure tearOff, Member target, Arguments arguments) { ); Expression constructorInvocation; if (target is Constructor) { - constructorInvocation = new ConstructorInvocation(target, arguments) - ..fileOffset = tearOff.fileOffset; + constructorInvocation = extern.createConstructorInvocation( + target, + arguments, + fileOffset: tearOff.fileOffset, + ); } else { - constructorInvocation = new StaticInvocation(target as Procedure, arguments) - ..fileOffset = tearOff.fileOffset; + constructorInvocation = extern.createStaticInvocation( + target as Procedure, + arguments, + fileOffset: tearOff.fileOffset, + ); } tearOff.function.registerFunctionBody( - new ReturnStatement(constructorInvocation)..fileOffset = tearOff.fileOffset, + extern.createReturnStatement(constructorInvocation), ); } @@ -537,9 +545,15 @@ class LoweredTypedefTearOff { if (target is Constructor || target is Procedure && target.isFactory) { // Coverage-ignore-block(suite): Not run. - targetTearOff = new ConstructorTearOff(target!); + targetTearOff = extern.createConstructorTearOff( + target!, + fileOffset: expression.fileOffset, + ); } else { - targetTearOff = new StaticTearOff(target as Procedure); + targetTearOff = extern.createStaticTearOff( + target as Procedure, + fileOffset: expression.fileOffset, + ); } return new LoweredTypedefTearOff( typedefTearOff, diff --git a/pkg/front_end/lib/src/kernel/expression_generator.dart b/pkg/front_end/lib/src/kernel/expression_generator.dart index 0a1f2e21156..72ed799b7e1 100644 --- a/pkg/front_end/lib/src/kernel/expression_generator.dart +++ b/pkg/front_end/lib/src/kernel/expression_generator.dart @@ -314,14 +314,15 @@ abstract class Generator { int fileOffset, List? typeArguments, ) { - return new Instantiation( + return intern.createInstantiation( buildSimpleRead(), _helper.buildDartTypeArguments( typeArguments, TypeUse.tearOffTypeArgument, allowPotentiallyConstantType: true, ), - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); } /// Returns a [TypeBuilder] for this subexpression instantiated with the @@ -479,7 +480,7 @@ class VariableUseGenerator extends Generator { Expression _createWrite(int offset, Expression value) { _checkAssignment(offset); _helper.registerVariableAssignment(variable); - return intern.createVariableSet(offset, variable, value); + return intern.createVariableSet(variable, value, fileOffset: offset); } @override @@ -981,8 +982,11 @@ class ThisPropertyAccessGenerator extends Generator { int get _nameOffset => fileOffset; Expression get _thisExpression => thisVariable != null - ? intern.createVariableGet(thisOffset ?? fileOffset, thisVariable!) - : intern.createThisExpression(thisOffset ?? fileOffset); + ? intern.createVariableGet( + thisVariable!, + fileOffset: thisOffset ?? fileOffset, + ) + : intern.createThisExpression(fileOffset: thisOffset ?? fileOffset); @override Expression buildSimpleRead() { @@ -1385,8 +1389,12 @@ class SuperPropertyAccessGenerator extends Generator { ); } else { _helper.readInternalThisVariable(); - return new SuperPropertyGet(new ThisExpression(), name, getter) - ..fileOffset = fileOffset; + return intern.createSuperPropertyGet( + intern.createThisExpression(fileOffset: fileOffset), + name, + getter, + fileOffset: fileOffset, + ); } } @@ -1406,8 +1414,13 @@ class SuperPropertyAccessGenerator extends Generator { ); } else { _helper.readInternalThisVariable(); - return new SuperPropertySet(new ThisExpression(), name, value, setter) - ..fileOffset = offset; + return intern.createSuperPropertySet( + intern.createThisExpression(fileOffset: fileOffset), + name, + setter, + value, + fileOffset: offset, + ); } } @@ -1808,7 +1821,7 @@ class ThisIndexedAccessGenerator extends Generator { @override Expression buildSimpleRead() { _helper.readInternalThisVariable(); - Expression receiver = intern.createThisExpression(fileOffset); + Expression receiver = intern.createThisExpression(fileOffset: fileOffset); return intern.createIndexGet( fileOffset, receiver, @@ -1820,7 +1833,7 @@ class ThisIndexedAccessGenerator extends Generator { @override Expression buildAssignment(Expression value, {bool voidContext = false}) { _helper.readInternalThisVariable(); - Expression receiver = intern.createThisExpression(fileOffset); + Expression receiver = intern.createThisExpression(fileOffset: fileOffset); return intern.createIndexSet( fileOffset, receiver, @@ -1853,7 +1866,7 @@ class ThisIndexedAccessGenerator extends Generator { bool voidContext = false, }) { _helper.readInternalThisVariable(); - Expression receiver = intern.createThisExpression(fileOffset); + Expression receiver = intern.createThisExpression(fileOffset: fileOffset); return new IfNullIndexSet( receiver: receiver, index: index, @@ -1876,7 +1889,7 @@ class ThisIndexedAccessGenerator extends Generator { bool isPostIncDec = false, }) { _helper.readInternalThisVariable(); - Expression receiver = intern.createThisExpression(fileOffset); + Expression receiver = intern.createThisExpression(fileOffset: fileOffset); return new CompoundIndexSet( receiver: receiver, index: index, @@ -2313,7 +2326,7 @@ class StaticAccessGenerator extends Generator { if (target == null) { return _makeInvalidWrite(); } else { - return new StaticSet(target, value)..fileOffset = offset; + return intern.createStaticSet(writeTarget!, value, fileOffset: offset); } } @@ -4858,7 +4871,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { builtTypeArguments = unaliasTypes(builtTypeArguments)!; tearOffExpression = intern.createInstantiation( - token.charOffset, + fileOffset: token.charOffset, tearOffExpression, builtTypeArguments, ); @@ -6757,7 +6770,7 @@ class ThisAccessGenerator extends Generator { _helper.readInternalThisVariable(); return _helper.thisVariable != null ? _helper.createVariableGet(_helper.thisVariable!, fileOffset) - : intern.createThisExpression(fileOffset); + : intern.createThisExpression(fileOffset: fileOffset); } } else { return _helper.buildProblem( @@ -6829,7 +6842,7 @@ class ThisAccessGenerator extends Generator { return _helper.buildMethodInvocation( _helper.thisVariable != null ? _helper.createVariableGet(_helper.thisVariable!, fileOffset) - : intern.createThisExpression(fileOffset), + : intern.createThisExpression(fileOffset: fileOffset), name, selector.typeArguments, selector.arguments, @@ -6888,7 +6901,7 @@ class ThisAccessGenerator extends Generator { offset, _helper.thisVariable != null ? _helper.createVariableGet(_helper.thisVariable!, fileOffset) - : intern.createThisExpression(fileOffset), + : intern.createThisExpression(fileOffset: fileOffset), typeArguments, arguments, ); diff --git a/pkg/front_end/lib/src/kernel/external_ast_helper.dart b/pkg/front_end/lib/src/kernel/external_ast_helper.dart index 25fdad7ea69..1f6039c1fc5 100644 --- a/pkg/front_end/lib/src/kernel/external_ast_helper.dart +++ b/pkg/front_end/lib/src/kernel/external_ast_helper.dart @@ -22,6 +22,14 @@ ConstructorInvocation createConstructorInvocation( ..fileOffset = fileOffset; } +// Coverage-ignore(suite): Not run. +ConstructorTearOff createConstructorTearOff( + Member target, { + required int fileOffset, +}) { + return new ConstructorTearOff(target)..fileOffset = fileOffset; +} + /// Creates a static invocation of [target] with the given arguments. StaticInvocation createStaticInvocation( Procedure target, @@ -33,6 +41,10 @@ StaticInvocation createStaticInvocation( ..fileOffset = fileOffset; } +StaticTearOff createStaticTearOff(Procedure target, {required int fileOffset}) { + return new StaticTearOff(target)..fileOffset = fileOffset; +} + /// Creates a super method invocation of [target] with the given arguments. SuperMethodInvocation createSuperMethodInvocation( Expression receiver, @@ -45,6 +57,26 @@ SuperMethodInvocation createSuperMethodInvocation( ..fileOffset = fileOffset; } +SuperPropertyGet createSuperPropertyGet( + Expression receiver, + Name name, + Member target, { + required int fileOffset, +}) { + return new SuperPropertyGet(receiver, name, target)..fileOffset = fileOffset; +} + +SuperPropertySet createSuperPropertySet( + Expression receiver, + Name name, + Member target, + Expression value, { + required int fileOffset, +}) { + return new SuperPropertySet(receiver, name, value, target) + ..fileOffset = fileOffset; +} + /// Creates a `== null` test on [expression]. EqualsNull createEqualsNull(Expression expression, {required int fileOffset}) { return new EqualsNull(expression)..fileOffset = fileOffset; @@ -254,15 +286,18 @@ IsExpression createIsExpression( AsExpression createAsExpression( Expression operand, DartType type, { - required bool forNonNullableByDefault, bool isUnchecked = false, bool isCovarianceCheck = false, + bool isTypeError = false, + bool isForDynamic = false, required int fileOffset, }) { return new AsExpression(operand, type) ..fileOffset = fileOffset ..isUnchecked = isUnchecked - ..isCovarianceCheck = isCovarianceCheck; + ..isCovarianceCheck = isCovarianceCheck + ..isTypeError = isTypeError + ..isForDynamic = isForDynamic; } /// Creates a [NullCheck] of [expression]. @@ -282,9 +317,13 @@ BlockExpression createBlockExpression( /// Creates a throw of [expression] using the file offset of [expression] for /// the throw expression. -Throw createThrow(Expression expression, {bool forErrorHandling = false}) { +Throw createThrow( + Expression expression, { + bool forErrorHandling = false, + int? fileOffset, +}) { return new Throw(expression) - ..fileOffset = expression.fileOffset + ..fileOffset = fileOffset ?? expression.fileOffset ..forErrorHandling = forErrorHandling; } @@ -337,6 +376,13 @@ Arguments createArguments( ..fileOffset = fileOffset; } +Arguments createArgumentsForwarded( + FunctionNode function, { + required int fileOffset, +}) { + return new Arguments.forwarded(function)..fileOffset = fileOffset; +} + /// Creates a switch case for the case [expressions] and their corresponding /// file offsets in [expressionOffsets] with the given [body]. SwitchCase createSwitchCase( @@ -383,6 +429,14 @@ LabeledStatement createLabeledStatement( return new LabeledStatement(statement)..fileOffset = fileOffset; } +InvalidExpression createInvalidExpression( + String message, { + Expression? expression, + required int fileOffset, +}) { + return new InvalidExpression(message, expression)..fileOffset = fileOffset; +} + InvalidInitializer createInvalidInitializer( InvalidExpression expression, { bool isSuperInitializer = false, @@ -394,6 +448,448 @@ InvalidInitializer createInvalidInitializer( ..isRedirectingInitializer = isRedirectingInitializer; } +ConstantExpression createConstantExpression( + Constant constant, + DartType type, { + required int fileOffset, +}) { + return new ConstantExpression(constant, type)..fileOffset = fileOffset; +} + +AssertStatement createAssertStatement( + Expression condition, { + Expression? message, + required int conditionStartOffset, + required int conditionEndOffset, + required int fileOffset, +}) { + return new AssertStatement( + condition, + message: message, + conditionStartOffset: conditionStartOffset, + conditionEndOffset: conditionEndOffset, + )..fileOffset = fileOffset; +} + +// Coverage-ignore(suite): Not run. +DynamicInvocation createDynamicInvocation( + DynamicAccessKind kind, + Expression receiver, + Name name, + Arguments arguments, { + int flags = 0, + required int fileOffset, +}) { + return new DynamicInvocation(kind, receiver, name, arguments) + ..flags = flags + ..fileOffset = fileOffset; +} + +// Coverage-ignore(suite): Not run. +EqualsCall createEqualsCall( + Expression left, + Expression right, { + required FunctionType functionType, + required Procedure interfaceTarget, + required int fileOffset, +}) { + return new EqualsCall( + left, + right, + functionType: functionType, + interfaceTarget: interfaceTarget, + )..fileOffset = fileOffset; +} + +// TODO(johnniwinther): Should this require a type? +VariableDeclaration createParameterVariable( + String? name, { + DartType type = const DynamicType(), + required int fileOffset, + bool isCovariantByDeclaration = false, + bool isCovariantByClass = false, + bool isLowered = false, + bool isSynthesized = false, + bool isFinal = false, + bool isRequired = false, + Expression? initializer, + bool hasDeclaredInitializer = false, +}) { + return new VariableDeclaration( + name, + type: type, + isCovariantByDeclaration: isCovariantByDeclaration, + isLowered: isLowered, + isSynthesized: isSynthesized, + isFinal: isFinal, + isRequired: isRequired, + initializer: initializer, + hasDeclaredInitializer: hasDeclaredInitializer, + ) + ..fileOffset = fileOffset + ..isCovariantByClass = isCovariantByClass; +} + +PositionalParameter createPositionalParameter({ + String? cosmeticName, + required DartType type, + Expression? defaultValue, + bool isCovariantByDeclaration = false, + bool isRequired = false, + bool isInitializingFormal = false, + bool isSuperInitializingFormal = false, + bool isFinal = false, + bool hasDeclaredDefaultType = false, + bool isLowered = false, + bool isSynthesized = false, + bool isWildcard = false, + required int fileOffset, +}) { + return new PositionalParameter( + cosmeticName: cosmeticName, + type: type, + defaultValue: defaultValue, + isCovariantByDeclaration: isCovariantByDeclaration, + isRequired: isRequired, + isInitializingFormal: isInitializingFormal, + isSuperInitializingFormal: isSuperInitializingFormal, + isFinal: isFinal, + hasDeclaredDefaultType: hasDeclaredDefaultType, + isLowered: isLowered, + isSynthesized: isSynthesized, + isWildcard: isWildcard, + )..fileOffset = fileOffset; +} + +NamedParameter createNamedParameter({ + required String parameterName, + required DartType type, + Expression? defaultValue, + bool isCovariantByDeclaration = false, + bool isRequired = false, + bool isInitializingFormal = false, + bool isSuperInitializingFormal = false, + bool isFinal = false, + bool hasDeclaredDefaultType = false, + bool isLowered = false, + bool isSynthesized = false, + bool isWildcard = false, + required int fileOffset, +}) { + return new NamedParameter( + parameterName: parameterName, + type: type, + defaultValue: defaultValue, + isCovariantByDeclaration: isCovariantByDeclaration, + isRequired: isRequired, + isInitializingFormal: isInitializingFormal, + isSuperInitializingFormal: isSuperInitializingFormal, + isFinal: isFinal, + hasDeclaredDefaultType: hasDeclaredDefaultType, + isLowered: isLowered, + isSynthesized: isSynthesized, + isWildcard: isWildcard, + )..fileOffset = fileOffset; +} + +CatchVariable createCatchVariable({ + required String name, + required DartType? type, + bool isWildcard = false, + required int fileOffset, +}) { + return new CatchVariable(name: name, type: type, isWildcard: isWildcard) + ..fileOffset = fileOffset; +} + +FileUriExpression createFileUriExpression({ + required Expression expression, + required Uri fileUri, + required int fileOffset, +}) { + return new FileUriExpression(expression, fileUri)..fileOffset = fileOffset; +} + +FileUriConstantExpression createFileUriConstantExpression( + Constant constant, { + DartType type = const DynamicType(), + required Uri fileUri, + required int fileOffset, +}) { + return new FileUriConstantExpression(constant, type: type, fileUri: fileUri) + ..fileOffset = fileOffset; +} + +// TODO(johnniwinther): Should [fileOffset] be required? +Statement createEmptyStatement({int fileOffset = TreeNode.noOffset}) { + return new EmptyStatement()..fileOffset = fileOffset; +} + +Constructor createConstructor( + FunctionNode function, { + required Name name, + Reference? reference, + bool isSynthetic = false, + required Uri fileUri, + required int fileOffset, + required int fileStartOffset, + required int fileEndOffset, +}) { + return new Constructor( + function, + name: name, + reference: reference, + fileUri: fileUri, + isSynthetic: isSynthetic, + ) + ..fileOffset = fileOffset + ..startFileOffset = fileStartOffset + ..fileEndOffset = fileEndOffset; +} + +FunctionNode createFunctionNode( + Statement? body, { + List? typeParameters, + List? positionalParameters, + List? namedParameters, + int? requiredParameterCount, + DartType returnType = const DynamicType(), + required int fileOffset, + int? fileEndOffset, + AsyncMarker asyncMarker = AsyncMarker.Sync, + AsyncMarker? dartAsyncMarker, +}) { + return new FunctionNode( + body, + typeParameters: typeParameters, + positionalParameters: positionalParameters, + namedParameters: namedParameters, + returnType: returnType, + requiredParameterCount: requiredParameterCount, + asyncMarker: asyncMarker, + dartAsyncMarker: dartAsyncMarker, + ) + ..fileOffset = fileOffset + ..fileEndOffset = fileEndOffset ?? fileOffset; +} + +Procedure createProcedure( + Name name, + ProcedureKind kind, + FunctionNode function, { + Reference? reference, + ProcedureStubKind stubKind = ProcedureStubKind.Regular, + Member? stubTarget, + required Uri fileUri, + required int fileOffset, + int fileStartOffset = TreeNode.noOffset, + required int fileEndOffset, + bool isAbstract = false, + bool isExternal = false, + bool isStatic = false, + bool isConst = false, + bool isExtensionMember = false, + bool isExtensionTypeMember = false, + bool isSynthetic = false, +}) { + return new Procedure( + name, + kind, + function, + stubKind: stubKind, + stubTarget: stubTarget, + fileUri: fileUri, + reference: reference, + isAbstract: isAbstract, + isExternal: isExternal, + isConst: isConst, + isStatic: isStatic, + isExtensionMember: isExtensionMember, + isExtensionTypeMember: isExtensionTypeMember, + isSynthetic: isSynthetic, + ) + ..fileStartOffset = fileStartOffset + ..fileOffset = fileOffset + ..fileEndOffset = fileEndOffset; +} + +ReturnStatement createReturnStatement( + Expression expression, { + int? fileOffset, +}) { + return new ReturnStatement(expression) + ..fileOffset = fileOffset ?? expression.fileOffset; +} + +Field createImmutableField( + Name name, { + required DartType type, + bool isLate = false, + bool isFinal = false, + bool isConst = false, + bool isStatic = false, + required Uri fileUri, + Reference? fieldReference, + Reference? getterReference, + bool isEnumElement = false, + required int fileOffset, + required int fileEndOffset, +}) { + return new Field.immutable( + name, + type: type, + isLate: isLate, + isFinal: isFinal, + isConst: isConst, + isStatic: isStatic, + fileUri: fileUri, + fieldReference: fieldReference, + getterReference: getterReference, + isEnumElement: isEnumElement, + ) + ..fileOffset = fileOffset + ..fileEndOffset = fileEndOffset; +} + +Field createMutableField( + Name name, { + DartType type = const DynamicType(), + bool isLate = false, + bool isFinal = false, + bool isStatic = false, + required Uri fileUri, + Reference? fieldReference, + Reference? getterReference, + Reference? setterReference, + required int fileOffset, + required int fileEndOffset, + bool isInternalImplementation = false, +}) { + return new Field.mutable( + name, + type: type, + isLate: isLate, + isFinal: isFinal, + isStatic: isStatic, + fileUri: fileUri, + fieldReference: fieldReference, + getterReference: getterReference, + setterReference: setterReference, + ) + ..fileOffset = fileOffset + ..fileEndOffset = fileEndOffset + ..isInternalImplementation = isInternalImplementation; +} + +FieldInitializer createFieldInitializer( + Field field, + Expression value, { + required int fileOffset, + required bool isSynthetic, +}) { + return new FieldInitializer(field, value) + ..fileOffset = fileOffset + ..isSynthetic = isSynthetic; +} + +StaticGet createStaticGet(Member member, {required int fileOffset}) { + return new StaticGet(member)..fileOffset = fileOffset; +} + +StaticSet createStaticSet( + Member member, + Expression value, { + required int fileOffset, +}) { + return new StaticSet(member, value)..fileOffset = fileOffset; +} + +InstanceInvocation createInstanceInvocation( + InstanceAccessKind kind, + Expression receiver, + Name name, + Arguments arguments, { + required Procedure interfaceTarget, + required FunctionType functionType, + required int fileOffset, +}) { + return new InstanceInvocation( + kind, + receiver, + name, + arguments, + interfaceTarget: interfaceTarget, + functionType: functionType, + )..fileOffset = fileOffset; +} + +InstanceGet createInstanceGet( + InstanceAccessKind kind, + Expression receiver, + Name name, { + required Member interfaceTarget, + required DartType resultType, + required int fileOffset, +}) { + return new InstanceGet( + kind, + receiver, + name, + interfaceTarget: interfaceTarget, + resultType: resultType, + )..fileOffset = fileOffset; +} + +InstanceSet createInstanceSet( + InstanceAccessKind kind, + Expression receiver, + Name name, + Expression value, { + required Member interfaceTarget, + required int fileOffset, +}) { + return new InstanceSet( + kind, + receiver, + name, + value, + interfaceTarget: interfaceTarget, + )..fileOffset = fileOffset; +} + +ThisExpression createThisExpression({required int fileOffset}) { + return new ThisExpression()..fileOffset = fileOffset; +} + +TypeParameter createTypeParameter(String? name, {required int fileOffset}) { + return new TypeParameter(name)..fileOffset = fileOffset; +} + +NamedExpression createNamedExpression( + String name, + Expression expression, { + int? fileOffset, +}) { + return new NamedExpression(name, expression) + ..fileOffset = fileOffset ?? expression.fileOffset; +} + +FunctionExpression createFunctionExpression( + FunctionNode function, { + required int fileOffset, +}) { + return new FunctionExpression(function)..fileOffset = fileOffset; +} + +// Coverage-ignore(suite): Not run. +MapLiteralEntry createMapLiteralEntry( + Expression key, + Expression value, { + required int fileOffset, +}) { + return new MapLiteralEntry(key, value)..fileOffset = fileOffset; +} + /// Returns a block like this: /// /// { @@ -413,9 +909,10 @@ Block combineStatements(Statement statement, Statement body) { } return body; } else { - return new Block([ - if (statement is Block) ...statement.statements else statement, - body, - ])..fileOffset = statement.fileOffset; + return createBlock( + [if (statement is Block) ...statement.statements else statement, body], + fileOffset: statement.fileOffset, + fileEndOffset: body.fileOffset, + ); } } diff --git a/pkg/front_end/lib/src/kernel/forwarding_node.dart b/pkg/front_end/lib/src/kernel/forwarding_node.dart index dee458cd16c..7713f10f6a8 100644 --- a/pkg/front_end/lib/src/kernel/forwarding_node.dart +++ b/pkg/front_end/lib/src/kernel/forwarding_node.dart @@ -13,6 +13,7 @@ import "../base/problems.dart" show unhandled; import '../builder/declaration_builders.dart'; import '../source/source_library_builder.dart'; import 'combined_member_signature.dart'; +import 'external_ast_helper.dart' as extern; import 'hierarchy/class_member.dart'; import 'kernel_helper.dart'; import 'kernel_target.dart'; @@ -354,8 +355,7 @@ class ForwardingNode { VariableDeclaration parameter = function.positionalParameters[index]; int fileOffset = parameter.fileOffset; - Expression expression = new VariableGet(parameter) - ..fileOffset = fileOffset; + Expression expression = extern.createVariableGet(parameter); DartType superParameterType = type.positionalParameters[index]; if (isForwardingSemiStub) { if (parameter.type != superParameterType) { @@ -367,8 +367,11 @@ class ForwardingNode { parameter.type, superParameterType, )) { - expression = new AsExpression(expression, superParameterType) - ..fileOffset = fileOffset; + expression = extern.createAsExpression( + expression, + superParameterType, + fileOffset: fileOffset, + ); } } return expression; @@ -380,8 +383,7 @@ class ForwardingNode { (int index) { VariableDeclaration parameter = function.namedParameters[index]; int fileOffset = parameter.fileOffset; - Expression expression = new VariableGet(parameter) - ..fileOffset = fileOffset; + Expression expression = extern.createVariableGet(parameter); DartType superParameterType = type.namedParameters .singleWhere( (NamedType namedType) => namedType.name == parameter.name, @@ -397,11 +399,14 @@ class ForwardingNode { parameter.type, superParameterType, )) { - expression = new AsExpression(expression, superParameterType) - ..fileOffset = fileOffset; + expression = extern.createAsExpression( + expression, + superParameterType, + fileOffset: fileOffset, + ); } } - return new NamedExpression(parameter.name!, expression); + return extern.createNamedExpression(parameter.name!, expression); }, growable: true, ); @@ -411,23 +416,26 @@ class ForwardingNode { new TypeParameterType.withDefaultNullability(typeParameter), ) .toList(); - Arguments arguments = new Arguments( + Arguments arguments = extern.createArguments( positionalArguments, types: typeArguments, named: namedArguments, + fileOffset: procedure.fileOffset, ); - superCall = new SuperMethodInvocation( - new ThisExpression(), + superCall = extern.createSuperMethodInvocation( + extern.createThisExpression(fileOffset: procedure.fileOffset), name, - arguments, superTarget as Procedure, + arguments, + fileOffset: procedure.fileOffset, ); break; case ProcedureKind.Getter: - superCall = new SuperPropertyGet( - new ThisExpression(), + superCall = extern.createSuperPropertyGet( + extern.createThisExpression(fileOffset: procedure.fileOffset), name, superTarget, + fileOffset: procedure.fileOffset, ); break; case ProcedureKind.Setter: @@ -435,8 +443,7 @@ class ForwardingNode { .getMemberTypeForTarget(superTarget); VariableDeclaration parameter = function.positionalParameters[0]; int fileOffset = parameter.fileOffset; - Expression expression = new VariableGet(parameter) - ..fileOffset = fileOffset; + Expression expression = extern.createVariableGet(parameter); if (isForwardingSemiStub) { if (parameter.type != superParameterType) { parameter.type = superParameterType; @@ -447,15 +454,19 @@ class ForwardingNode { parameter.type, superParameterType, )) { - expression = new AsExpression(expression, superParameterType) - ..fileOffset = fileOffset; + expression = extern.createAsExpression( + expression, + superParameterType, + fileOffset: fileOffset, + ); } } - superCall = new SuperPropertySet( - new ThisExpression(), + superCall = extern.createSuperPropertySet( + extern.createThisExpression(fileOffset: fileOffset), name, - expression, superTarget, + expression, + fileOffset: fileOffset, ); break; // Coverage-ignore(suite): Not run. @@ -463,7 +474,7 @@ class ForwardingNode { unhandled('$kind', '_createForwardingImplIfNeeded', -1, null); } function.registerFunctionBody( - new ReturnStatement(superCall)..fileOffset = procedure.fileOffset, + extern.createReturnStatement(superCall, fileOffset: procedure.fileOffset), ); procedure.transformerFlags |= TransformerFlag.superCalls; procedure.stubKind = isForwardingStub @@ -505,38 +516,48 @@ class ForwardingNode { CoreTypes coreTypes = target.loader.coreTypes; Expression invocation = target.backendTarget.instantiateInvocation( coreTypes, - new ThisExpression(), + extern.createThisExpression(fileOffset: procedure.fileOffset), invocationName, - new Arguments.forwarded(procedure.function, libraryBuilder.library), + extern.createArgumentsForwarded( + procedure.function, + fileOffset: procedure.fileOffset, + ), procedure.fileOffset, /*isSuper=*/ false, ); if (shouldThrow) { // Build `throw new NoSuchMethodError(this, invocation)`. - result = - new Throw( - new StaticInvocation( - coreTypes.noSuchMethodErrorDefaultConstructor, - new Arguments([new ThisExpression(), invocation]), - ), - ) - ..fileOffset = procedure.fileOffset - ..forErrorHandling = true; + result = extern.createThrow( + extern.createStaticInvocation( + coreTypes.noSuchMethodErrorDefaultConstructor, + extern.createArguments([ + extern.createThisExpression(fileOffset: procedure.fileOffset), + invocation, + ], fileOffset: procedure.fileOffset), + fileOffset: procedure.fileOffset, + ), + fileOffset: procedure.fileOffset, + forErrorHandling: true, + ); } else { // Build `this.noSuchMethod(invocation)`. - result = new InstanceInvocation( + result = extern.createInstanceInvocation( InstanceAccessKind.Instance, - new ThisExpression(), + extern.createThisExpression(fileOffset: procedure.fileOffset), noSuchMethodName, - new Arguments([invocation]), + extern.createArguments([invocation], fileOffset: procedure.fileOffset), functionType: noSuchMethodInterface.getterType as FunctionType, interfaceTarget: noSuchMethodInterface, - )..fileOffset = procedure.fileOffset; + fileOffset: procedure.fileOffset, + ); if (procedure.function.returnType is! VoidType) { - result = new AsExpression(result, procedure.function.returnType) - ..isTypeError = true - ..isForDynamic = true - ..fileOffset = procedure.fileOffset; + result = extern.createAsExpression( + result, + procedure.function.returnType, + isTypeError: true, + isForDynamic: true, + fileOffset: procedure.fileOffset, + ); } } @@ -587,7 +608,7 @@ class ForwardingNode { procedure.signatureType = signatureType; } procedure.function.registerFunctionBody( - new ReturnStatement(result)..fileOffset = procedure.fileOffset, + extern.createReturnStatement(result, fileOffset: procedure.fileOffset), ); procedure.isAbstract = false; diff --git a/pkg/front_end/lib/src/kernel/internal_ast.dart b/pkg/front_end/lib/src/kernel/internal_ast.dart index 1993c30f828..f25b4ce1cd3 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast.dart @@ -404,11 +404,12 @@ class ActualArguments extends TreeNode with InternalTreeNode { List positionalArguments, List namedArguments, ) { - return new Arguments( + return extern.createArguments( positionalArguments, types: typeArguments, named: namedArguments, - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); } @override @@ -564,9 +565,10 @@ class DeferredCheck extends InternalExpression { VariableDeclaration variable; Expression expression; - DeferredCheck(this.variable, this.expression) { + DeferredCheck(this.variable, this.expression, {required int fileOffset}) { variable.parent = this; expression.parent = this; + this.fileOffset = fileOffset; } @override @@ -1001,6 +1003,8 @@ class VariableDeclarationImpl extends VariableStatement bool isStaticLate = false, bool isWildcard = false, bool isLateFinalWithoutInitializer = false, + required int fileOffset, + int fileEqualsOffset = TreeNode.noOffset, }) : isImplicitlyTyped = type == null, isLocalFunction = isLocalFunction, super( @@ -1021,6 +1025,8 @@ class VariableDeclarationImpl extends VariableStatement ) { this.isStaticLate = isStaticLate; this.isLateFinalWithoutInitializer = isLateFinalWithoutInitializer; + this.fileOffset = fileOffset; + this.fileEqualsOffset = fileEqualsOffset; } VariableDeclarationImpl.forEffect(Expression initializer) @@ -1082,7 +1088,10 @@ class InternalLocalVariable extends TreeNode required this.isImplicitlyTyped, this.forSyntheticToken = false, this.isLocalFunction = false, - }); + required int fileOffset, + }) { + this.fileOffset = fileOffset; + } @override // Coverage-ignore(suite): Not run. @@ -1163,7 +1172,10 @@ class InternalPositionalParameter extends TreeNode required this.isImplicitlyTyped, this.forSyntheticToken = false, this.isLocalFunction = false, - }); + required int fileOffset, + }) { + this.fileOffset = fileOffset; + } @override // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this. @@ -1266,7 +1278,10 @@ class InternalNamedParameter extends TreeNode required this.isImplicitlyTyped, this.forSyntheticToken = false, this.isLocalFunction = false, - }); + required int fileOffset, + }) { + this.fileOffset = fileOffset; + } @override // TODO(62620): Conforming to [VariableDeclaration] interface. Remove this. @@ -1388,7 +1403,10 @@ class InternalCatchVariable extends TreeNode required this.isImplicitlyTyped, this.forSyntheticToken = false, this.isLocalFunction = false, - }); + required int fileOffset, + }) { + this.fileOffset = fileOffset; + } @override String toString() { @@ -1435,7 +1453,10 @@ class InternalSyntheticVariable extends TreeNode required this.isImplicitlyTyped, this.forSyntheticToken = false, this.isLocalFunction = false, - }); + required int fileOffset, + }) { + this.fileOffset = fileOffset; + } @override String toString() { @@ -4942,15 +4963,18 @@ bool isPureExpression(Expression node) { /// This assumes that `isPureExpression(node)` is `true`. Expression clonePureExpression(Expression node) { if (node is ThisExpression) { - return new ThisExpression()..fileOffset = node.fileOffset; + return extern.createThisExpression(fileOffset: node.fileOffset); } else if (node is VariableGet) { assert( node.variable.isFinal && !node.variable.isLate, "Trying to clone VariableGet of non-final variable" " ${node.variable}.", ); - return new VariableGet(node.variable, node.promotedType) - ..fileOffset = node.fileOffset; + return extern.createVariableGet( + node.variable, + promotedType: node.promotedType, + fileOffset: node.fileOffset, + ); } // Coverage-ignore-block(suite): Not run. throw new UnsupportedError("Clone not supported for ${node.runtimeType}."); @@ -5270,10 +5294,14 @@ class ExtensionTypeRepresentationFieldInitializer extends InternalInitializer { Reference fieldReference; Expression value; - ExtensionTypeRepresentationFieldInitializer(Procedure field, this.value) - : assert(field.stubKind == ProcedureStubKind.RepresentationField), - this.fieldReference = field.reference { + ExtensionTypeRepresentationFieldInitializer( + Procedure field, + this.value, { + required int fileOffset, + }) : assert(field.stubKind == ProcedureStubKind.RepresentationField), + this.fieldReference = field.reference { value.parent = this; + this.fileOffset = fileOffset; } @override diff --git a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart index d5a48da3b68..c6c723187c0 100644 --- a/pkg/front_end/lib/src/kernel/internal_ast_helper.dart +++ b/pkg/front_end/lib/src/kernel/internal_ast_helper.dart @@ -407,10 +407,10 @@ Expression createAwaitExpression(int fileOffset, Expression operand) { /// Return a representation of a block of [statements] at the given /// [fileOffset]. Block createBlock( - int fileOffset, - int fileEndOffset, - List statements, -) { + List statements, { + required int fileOffset, + required int fileEndOffset, +}) { List? copy; for (int i = 0; i < statements.length; i++) { Statement statement = statements[i]; @@ -486,7 +486,10 @@ Statement createDoStatement( /// Return a representation of an expression statement at the given /// [fileOffset] containing the [expression]. -Statement createExpressionStatement(int fileOffset, Expression expression) { +Statement createExpressionStatement( + Expression expression, { + required int fileOffset, +}) { return new ExpressionStatement(expression)..fileOffset = fileOffset; } @@ -600,7 +603,7 @@ LabeledStatement createLabeledStatement(Statement statement) { return new LabeledStatement(statement)..fileOffset = statement.fileOffset; } -Expression createThisExpression(int fileOffset) { +Expression createThisExpression({required int fileOffset}) { return new ThisExpression()..fileOffset = fileOffset; } @@ -717,7 +720,8 @@ VariableDeclaration createVariableDeclaration( isLocalFunction: isLocalFunction, isSynthesized: isSynthesized, hasDeclaredInitializer: initializer != null, - )..fileOffset = fileOffset; + fileOffset: fileOffset, + ); } VariableDeclarationImpl createVariableDeclarationForValue( @@ -839,18 +843,18 @@ IndexSet createIndexSet( } InternalVariableGet createVariableGet( - int fileOffset, - VariableDeclaration variable, -) { + VariableDeclaration variable, { + required int fileOffset, +}) { return new InternalVariableGet(variable as InternalVariable) ..fileOffset = fileOffset; } InternalVariableSet createVariableSet( - int fileOffset, VariableDeclaration variable, - Expression value, -) { + Expression value, { + required int fileOffset, +}) { return new InternalVariableSet(variable as InternalVariable, value) ..fileOffset = fileOffset; } @@ -914,6 +918,15 @@ StaticGet createStaticGet(int fileOffset, Member target) { return new StaticGet(target)..fileOffset = fileOffset; } +StaticSet createStaticSet( + Member target, + Expression value, { + required int fileOffset, +}) { + assert(target is Field || (target is Procedure && target.isSetter)); + return new StaticSet(target, value)..fileOffset = fileOffset; +} + RedirectingFactoryTearOff createRedirectingFactoryTearOff( int fileOffset, Procedure procedure, @@ -923,10 +936,10 @@ RedirectingFactoryTearOff createRedirectingFactoryTearOff( } Instantiation createInstantiation( - int fileOffset, Expression expression, - List typeArguments, -) { + List typeArguments, { + required int fileOffset, +}) { return new Instantiation(expression, typeArguments)..fileOffset = fileOffset; } @@ -1103,6 +1116,20 @@ SwitchExpression createSwitchExpression( return new SwitchExpression(expression, cases)..fileOffset = fileOffset; } +SwitchStatement createSwitchStatement( + Expression expression, + List cases, { + required int fileOffset, +}) { + return new SwitchStatement(expression, cases)..fileOffset = fileOffset; +} + +ContinueSwitchStatement createContinueSwitchStatement({ + required int fileOffset, +}) { + return new ContinueSwitchStatement(dummySwitchCase)..fileOffset = fileOffset; +} + PatternVariableDeclaration createPatternVariableDeclaration( int fileOffset, Pattern pattern, @@ -1165,6 +1192,129 @@ DotShorthandPropertyGet createDotShorthandPropertyGet( ..fileOffset = fileOffset; } +LocalVariable createLocalVariable({ + required String? cosmeticName, + required DartType? type, + bool isFinal = false, + bool isConst = false, + bool isLate = false, + bool isWildcard = false, + required int fileOffset, +}) { + return new LocalVariable( + cosmeticName: cosmeticName, + type: type, + isFinal: isFinal, + isConst: isConst, + isLate: isLate, + isWildcard: isWildcard, + )..fileOffset = fileOffset; +} + +VariableInitialization createVariableInitialization({ + required VariableDeclaration variable, + required Expression? initializer, + required bool hasDeclaredInitializer, + required int fileOffset, +}) { + return new VariableInitialization( + variable: variable, + initializer: initializer, + hasDeclaredInitializer: hasDeclaredInitializer, + )..fileOffset = fileOffset; +} + +MapLiteralEntry createMapLiteralEntry( + Expression key, + Expression value, { + required int fileOffset, +}) { + return new MapLiteralEntry(key, value)..fileOffset = fileOffset; +} + +NamedExpression createNamedExpression( + String name, + Expression value, { + required int fileOffset, +}) { + return new NamedExpression(name, value)..fileOffset = fileOffset; +} + +BlockExpression createBlockExpression( + Block body, + Expression value, { + required int fileOffset, +}) { + return new BlockExpression(body, value)..fileOffset = fileOffset; +} + +FunctionExpression createFunctionExpression( + FunctionNode function, { + required int fileOffset, +}) { + return new FunctionExpression(function)..fileOffset = fileOffset; +} + +// Coverage-ignore(suite): Not run. +SyntheticVariable createSyntheticVariable({ + required DartType type, + required int fileOffset, +}) { + return new SyntheticVariable(type: type)..fileOffset = fileOffset; +} + +// Coverage-ignore(suite): Not run. +ForInStatement createForInStatement( + VariableDeclaration variable, + Expression expression, + Statement body, { + required bool isAsync, + required int fileOffset, + required int bodyOffset, +}) { + return new ForInStatement(variable, expression, body, isAsync: isAsync) + ..fileOffset = fileOffset + ..bodyOffset = bodyOffset; +} + +Let createLetForEffect({ + required Expression effect, + required DartType effectType, + required Expression expression, +}) { + return new Let( + createVariableDeclarationForValue(effect, type: effectType), + expression, + )..fileOffset = effect.fileOffset; +} + +SuperPropertyGet createSuperPropertyGet( + Expression receiver, + Name name, + Member target, { + required int fileOffset, +}) { + return new SuperPropertyGet(receiver, name, target)..fileOffset = fileOffset; +} + +SuperPropertySet createSuperPropertySet( + Expression receiver, + Name name, + Member target, + Expression value, { + required int fileOffset, +}) { + return new SuperPropertySet(receiver, name, value, target) + ..fileOffset = fileOffset; +} + +ThisVariable createThisVariable({ + required DartType type, + required int fileOffset, +}) { + return new ThisVariable(type: type)..fileOffset = fileOffset; +} + class _VariablesDeclaration extends AuxiliaryStatement { final List declarations; final Uri uri; diff --git a/pkg/front_end/lib/src/kernel/resolver.dart b/pkg/front_end/lib/src/kernel/resolver.dart index 04608fdbef1..fb03243374e 100644 --- a/pkg/front_end/lib/src/kernel/resolver.dart +++ b/pkg/front_end/lib/src/kernel/resolver.dart @@ -1244,8 +1244,8 @@ class Resolver { assignedVariables.read(variable.astVariable); } return intern.createVariableGet( - fileOffset, variable as VariableDeclaration, + fileOffset: fileOffset, ); } diff --git a/pkg/front_end/lib/src/kernel/resolver_helpers.dart b/pkg/front_end/lib/src/kernel/resolver_helpers.dart index 751d3853d09..478ab715f22 100644 --- a/pkg/front_end/lib/src/kernel/resolver_helpers.dart +++ b/pkg/front_end/lib/src/kernel/resolver_helpers.dart @@ -301,12 +301,12 @@ class _InitializerBuilder { ActualArguments arguments = initializer.arguments; List enumSyntheticArguments = [ intern.createVariableGet( - formals[0].fileOffset, formals[0].variable, + fileOffset: formals[0].fileOffset, )..parent = initializer.arguments, intern.createVariableGet( - formals[1].fileOffset, formals[1].variable, + fileOffset: formals[1].fileOffset, )..parent = initializer.arguments, ]; arguments.prependArguments([ @@ -651,12 +651,12 @@ class _InitializerBuilder { formals[1].name == "#name", ); Expression indexExpression = intern.createVariableGet( - formals[0].fileOffset, formals[0].variable, + fileOffset: formals[0].fileOffset, ); Expression nameExpression = intern.createVariableGet( - formals[1].fileOffset, formals[1].variable, + fileOffset: formals[1].fileOffset, ); (argumentsOriginalOrder ??= []).insertAll(0, [ new PositionalArgument(indexExpression), diff --git a/pkg/front_end/lib/src/source/check_helper.dart b/pkg/front_end/lib/src/source/check_helper.dart index 8d4acf8d3ef..e8fdc287ae2 100644 --- a/pkg/front_end/lib/src/source/check_helper.dart +++ b/pkg/front_end/lib/src/source/check_helper.dart @@ -873,6 +873,7 @@ extension CheckHelper on ProblemReporting { // See [issue 29717](https://github.com/dart-lang/sdk/issues/29717) int offset = expression.fileOffset; if (offset == -1) { + // Coverage-ignore-block(suite): Not run. offset = message.charOffset; } return buildProblem( diff --git a/pkg/front_end/lib/src/source/source_enum_builder.dart b/pkg/front_end/lib/src/source/source_enum_builder.dart index bc71a2c4237..c670f520065 100644 --- a/pkg/front_end/lib/src/source/source_enum_builder.dart +++ b/pkg/front_end/lib/src/source/source_enum_builder.dart @@ -432,10 +432,7 @@ class SourceEnumBuilder extends SourceClassBuilder { constructor.initializers.add( new SuperInitializer.byReference( superConstructor.invokeTargetReference!, - new Arguments.forwarded( - constructor.function, - libraryBuilder.library, - ), + new Arguments.forwarded(constructor.function), )..parent = constructor, ); } diff --git a/pkg/front_end/lib/src/type_inference/delayed_expressions.dart b/pkg/front_end/lib/src/type_inference/delayed_expressions.dart index 05251e85971..136dbd984b5 100644 --- a/pkg/front_end/lib/src/type_inference/delayed_expressions.dart +++ b/pkg/front_end/lib/src/type_inference/delayed_expressions.dart @@ -827,7 +827,6 @@ class DelayedAsExpression extends AbstractDelayedExpression { return createAsExpression( operand, _type, - forNonNullableByDefault: true, isCovarianceCheck: true, fileOffset: fileOffset, ); @@ -840,7 +839,6 @@ class DelayedAsExpression extends AbstractDelayedExpression { return createAsExpression( operand, _type, - forNonNullableByDefault: true, isUnchecked: isUnchecked, fileOffset: fileOffset, ); diff --git a/pkg/front_end/lib/src/type_inference/inference_visitor.dart b/pkg/front_end/lib/src/type_inference/inference_visitor.dart index 20ab37f2e5f..37be2a76f85 100644 --- a/pkg/front_end/lib/src/type_inference/inference_visitor.dart +++ b/pkg/front_end/lib/src/type_inference/inference_visitor.dart @@ -3354,10 +3354,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase computePatternVariableDeclaration: () => new PatternVariableDeclaration( pattern, - extern.createVariableGet( - loopVariable, - fileOffset: TreeNode.noOffset, - ), + extern.createVariableGet(loopVariable, fileOffset: inOffset), isFinal: false, ) ..fileOffset = inOffset diff --git a/pkg/front_end/lib/src/type_inference/matching_cache.dart b/pkg/front_end/lib/src/type_inference/matching_cache.dart index d8709f36f97..0aec636f303 100644 --- a/pkg/front_end/lib/src/type_inference/matching_cache.dart +++ b/pkg/front_end/lib/src/type_inference/matching_cache.dart @@ -1080,7 +1080,6 @@ class PromotedCacheableExpression result = createAsExpression( result, _promotedType, - forNonNullableByDefault: true, isUnchecked: true, fileOffset: result.fileOffset, ); @@ -1150,7 +1149,6 @@ class CovariantCheckCacheableExpression return createAsExpression( result, _checkedType, - forNonNullableByDefault: true, fileOffset: fileOffset, isCovarianceCheck: true, ); diff --git a/pkg/front_end/lib/src/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/type_inference/type_inferrer.dart index 3636e48ae85..88a6b583a0a 100644 --- a/pkg/front_end/lib/src/type_inference/type_inferrer.dart +++ b/pkg/front_end/lib/src/type_inference/type_inferrer.dart @@ -347,14 +347,18 @@ class TypeInferrerImpl implements TypeInferrer { Expression variableGet; if (isClosureContextLoweringEnabled) { variableGet = intern.createVariableGet( - parameter.fileOffset, new InternalPositionalParameter( astVariable: parameter as PositionalParameter, isImplicitlyTyped: false, + fileOffset: parameter.fileOffset, ), - )..fileOffset = parameter.fileOffset; + fileOffset: parameter.fileOffset, + ); } else { - variableGet = intern.createVariableGet(parameter.fileOffset, parameter); + variableGet = intern.createVariableGet( + parameter, + fileOffset: parameter.fileOffset, + ); } arguments.add(new PositionalArgument(variableGet)); positionalCount++; @@ -371,17 +375,18 @@ class TypeInferrerImpl implements TypeInferrer { namedExpression = new NamedExpression( parameter.name!, intern.createVariableGet( - parameter.fileOffset, new InternalNamedParameter( astVariable: parameter as NamedParameter, isImplicitlyTyped: false, - )..fileOffset = parameter.fileOffset, + fileOffset: parameter.fileOffset, + ), + fileOffset: parameter.fileOffset, ), ); } else { namedExpression = new NamedExpression( parameter.name!, - intern.createVariableGet(parameter.fileOffset, parameter), + intern.createVariableGet(parameter, fileOffset: parameter.fileOffset), ); } arguments.add(new NamedArgument(namedExpression)); diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart index c70c77ab6c4..b2355eb368b 100644 --- a/pkg/front_end/test/static_types/static_type_test.dart +++ b/pkg/front_end/test/static_types/static_type_test.dart @@ -158,7 +158,11 @@ class StaticTypeDataExtractor extends CfeDataExtractor { isThrowReachabilityError(object) || isNewReachabilityErrorArgument(object) || isNewReachabilityError(object) || - object is BlockExpression; + object is BlockExpression || + (object is NullLiteral && + // Skip implicit initializers/default values. + (object.parent is VariableDeclaration || object.parent is Field) && + object.fileOffset == object.parent?.fileOffset); @override ActualData mergeData( diff --git a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart index bf4a3272adf..8cb4f904236 100644 --- a/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart +++ b/pkg/front_end/test/text_representation/internal_ast_text_representation_test.dart @@ -348,7 +348,7 @@ void _testInternalForInStatement() { testStatement( new InternalForInStatement( new SingleVariableDeclarationForInElement( - variableDeclaration: new VariableDeclarationImpl('e'), + variableDeclaration: new VariableDeclarationImpl('e', fileOffset: -1), error: null, ), new NullLiteral(), @@ -367,6 +367,7 @@ for (var e in null) {}''', variableDeclaration: new VariableDeclarationImpl( 'e', type: const VoidType(), + fileOffset: -1, ), error: null, ), @@ -386,9 +387,12 @@ for (void e in null) {}''', pattern: new RecordPattern([ new VariablePattern( const VoidType(), - new VariableDeclarationImpl('a'), + new VariableDeclarationImpl('a', fileOffset: -1), + ), + new VariablePattern( + null, + new VariableDeclarationImpl('b', fileOffset: -1), ), - new VariablePattern(null, new VariableDeclarationImpl('b')), ]), inOffset: -1, ), @@ -405,7 +409,7 @@ for (var (void a, var b) in null) {}''', testStatement( new InternalForInStatement( new ExistingVariableForInElement( - variable: new VariableDeclarationImpl('a'), + variable: new VariableDeclarationImpl('a', fileOffset: -1), nameOffset: -1, inOffset: -1, ), @@ -493,8 +497,8 @@ for (null in null) {}''', new InternalForInStatement( new MultiVariableDeclarationForInElement( variableDeclarations: [ - new VariableDeclarationImpl('a'), - new VariableDeclarationImpl('b'), + new VariableDeclarationImpl('a', fileOffset: -1), + new VariableDeclarationImpl('b', fileOffset: -1), ], error: new InvalidExpression('error'), ), @@ -512,8 +516,12 @@ for (var a, b in null) {}''', new InternalForInStatement( new MultiVariableDeclarationForInElement( variableDeclarations: [ - new VariableDeclarationImpl('a', type: const VoidType()), - new VariableDeclarationImpl('b'), + new VariableDeclarationImpl( + 'a', + type: const VoidType(), + fileOffset: -1, + ), + new VariableDeclarationImpl('b', fileOffset: -1), ], error: new InvalidExpression('error'), ), @@ -834,8 +842,11 @@ void _testDeferredCheck() { VariableDeclaration check = new VariableDeclaration.forValue( new CheckLibraryIsLoaded(dependency), ); - testExpression(new DeferredCheck(check, new IntLiteral(0)), ''' -let final dynamic #0 = pre.checkLibraryIsLoaded() in 0'''); + testExpression( + new DeferredCheck(check, new IntLiteral(0), fileOffset: TreeNode.noOffset), + ''' +let final dynamic #0 = pre.checkLibraryIsLoaded() in 0''', + ); } void _testFactoryConstructorInvocation() { @@ -1162,7 +1173,7 @@ const library test:dummy::Typedef.foo(0, bar: 1)''', void _testFunctionDeclarationImpl() { testStatement( new FunctionDeclarationImpl( - new VariableDeclarationImpl('foo'), + new VariableDeclarationImpl('foo', fileOffset: TreeNode.noOffset), new FunctionNode(new Block([])), ), ''' @@ -1384,10 +1395,17 @@ return 0;'''); } void _testVariableDeclarationImpl() { - testStatement(new VariableDeclarationImpl('foo'), ''' -dynamic foo;'''); testStatement( - new VariableDeclarationImpl('foo', initializer: new IntLiteral(0)), + new VariableDeclarationImpl('foo', fileOffset: TreeNode.noOffset), + ''' +dynamic foo;''', + ); + testStatement( + new VariableDeclarationImpl( + 'foo', + initializer: new IntLiteral(0), + fileOffset: TreeNode.noOffset, + ), ''' dynamic foo = 0;''', ); @@ -1398,6 +1416,7 @@ dynamic foo = 0;''', initializer: new IntLiteral(0), isFinal: true, isRequired: true, + fileOffset: TreeNode.noOffset, ), ''' required final void foo;''', @@ -1408,17 +1427,9 @@ required final void foo;''', type: const VoidType(), initializer: new IntLiteral(0), isLate: true, + fileOffset: TreeNode.noOffset, ), ''' -late void foo = 0;''', - ); - testStatement( - new VariableDeclarationImpl( - 'foo', - type: const VoidType(), - initializer: new IntLiteral(0), - )..lateGetter = new VariableDeclarationImpl('foo#getter'), - ''' late void foo = 0;''', ); testStatement( @@ -1426,8 +1437,26 @@ late void foo = 0;''', 'foo', type: const VoidType(), initializer: new IntLiteral(0), + fileOffset: TreeNode.noOffset, + ) + ..lateGetter = new VariableDeclarationImpl( + 'foo#getter', + fileOffset: TreeNode.noOffset, + ), + ''' +late void foo = 0;''', + ); + testStatement( + new VariableDeclarationImpl( + 'foo', + type: const VoidType(), + initializer: new IntLiteral(0), + fileOffset: TreeNode.noOffset, + ) + ..lateGetter = new VariableDeclarationImpl( + 'foo#getter', + fileOffset: TreeNode.noOffset, ) - ..lateGetter = new VariableDeclarationImpl('foo#getter') ..lateType = const DynamicType(), ''' late dynamic foo = 0;''', @@ -1844,7 +1873,10 @@ void _testPropertyIncDec() { } void _testLocalIncDec() { - VariableDeclarationImpl variable = new VariableDeclarationImpl('foo'); + VariableDeclarationImpl variable = new VariableDeclarationImpl( + 'foo', + fileOffset: TreeNode.noOffset, + ); testExpression( new LocalIncDec( diff --git a/pkg/front_end/test/text_representation/text_representation_test.dart b/pkg/front_end/test/text_representation/text_representation_test.dart index eb2c2479f53..0385bf10bc8 100644 --- a/pkg/front_end/test/text_representation/text_representation_test.dart +++ b/pkg/front_end/test/text_representation/text_representation_test.dart @@ -193,4 +193,21 @@ class TextRepresentationDataExtractor extends CfeDataExtractor { } return null; } + + @override + ActualData? mergeData( + ActualData value1, + ActualData value2, + ) { + // Prefer [VariableDeclaration] over [ConstantExpression]. This is done to + // avoid conflict between a parameter and its implicit initializer. + if (value1.object is ConstantExpression && + value2.object is VariableDeclaration) { + return value2; + } else if (value2.object is ConstantExpression && + value1.object is VariableDeclaration) { + return value1; + } + return super.mergeData(value1, value2); + } } diff --git a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect index 4f62a19fa3f..6c45b913fe2 100644 --- a/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect +++ b/pkg/front_end/testcases/constructor_tearoffs/lowering/inferred_non_proper_rename.dart.strong.outline.expect @@ -64,17 +64,17 @@ static synthetic method _#H#redirect#tearOff InstantiationConstant(A._#new#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:18:13 -> InstantiationConstant(A._#new#tearOff) -Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:25 -> InstantiationConstant(A._#new#tearOff) +Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:19:31 -> InstantiationConstant(A._#new#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:20:13 -> InstantiationConstant(A._#fact#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:21:13 -> InstantiationConstant(A._#fact#tearOff) -Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:25 -> InstantiationConstant(A._#fact#tearOff) +Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:22:31 -> InstantiationConstant(A._#fact#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:23:13 -> InstantiationConstant(A._#redirect#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:24:13 -> InstantiationConstant(A._#redirect#tearOff) -Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:25 -> InstantiationConstant(A._#redirect#tearOff) +Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:25:31 -> InstantiationConstant(A._#redirect#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:27:13 -> InstantiationConstant(A._#new#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:28:13 -> InstantiationConstant(A._#new#tearOff) -Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:25 -> InstantiationConstant(A._#new#tearOff) +Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:29:31 -> InstantiationConstant(A._#new#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:31:13 -> InstantiationConstant(A._#new#tearOff) Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:32:13 -> InstantiationConstant(A._#new#tearOff) -Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:25 -> InstantiationConstant(A._#new#tearOff) +Evaluated: Instantiation @ org-dartlang-testcase:///inferred_non_proper_rename.dart:33:31 -> InstantiationConstant(A._#new#tearOff) Extra constant evaluation: evaluated: 28, effectively constant: 15 diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect index 996bef352c0..927565526b1 100644 --- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.expect @@ -3,17 +3,17 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect index 996bef352c0..927565526b1 100644 --- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.modular.expect @@ -3,17 +3,17 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect index 996bef352c0..927565526b1 100644 --- a/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/case_variables_name_overlap.dart.strong.transformed.expect @@ -3,17 +3,17 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect index 5e036ff88e2..9e3c980456f 100644 --- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.expect @@ -3,9 +3,9 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; @@ -13,9 +13,9 @@ import "dart:core" as core; [478] return [478] [478] new self::X1::• [478](); } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect index 5e036ff88e2..9e3c980456f 100644 --- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.modular.expect @@ -3,9 +3,9 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; @@ -13,9 +13,9 @@ import "dart:core" as core; [478] return [478] [478] new self::X1::• [478](); } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect index 5e036ff88e2..9e3c980456f 100644 --- a/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/ddc/case_variables_name_overlap.dart.strong.transformed.expect @@ -3,9 +3,9 @@ import self as self; import "dart:core" as core; [478]class X1 extends core::Object { -[493] field core::String? s = [-1] [-1] null; -[503] field core::int? i = [-1] [-1] null; -[516] field core::double? d = [-1] [-1] null; +[493] field core::String? s = [493] [493] null; +[503] field core::int? i = [503] [503] null; +[516] field core::double? d = [516] [516] null; [478] synthetic constructor [-1] [-1] •() → self::X1 : [-1] super core::Object::• [-1]() [-1] ; @@ -13,9 +13,9 @@ import "dart:core" as core; [478] return [478] [478] new self::X1::• [478](); } [528]class X2 extends core::Object { -[543] field core::String? s2 = [-1] [-1] null; -[554] field core::int? i = [-1] [-1] null; -[567] field core::double? d = [-1] [-1] null; +[543] field core::String? s2 = [543] [543] null; +[554] field core::int? i = [554] [554] null; +[567] field core::double? d = [567] [567] null; [528] synthetic constructor [-1] [-1] •() → self::X2 : [-1] super core::Object::• [-1]() [-1] ; diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect index 90a0d7ce094..6b441bbd666 100644 --- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.expect @@ -6,7 +6,7 @@ import "dart:core" as core; [217]import "dart:js_interop"; [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ { -[274] abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; +[274] abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -14,7 +14,7 @@ import "dart:core" as core; } [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ { [274] [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal; -[-1] return [-1] [-1] #this; +[274] return [274] [274] #this; } [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ [263] return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect index 90a0d7ce094..6b441bbd666 100644 --- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.modular.expect @@ -6,7 +6,7 @@ import "dart:core" as core; [217]import "dart:js_interop"; [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ { -[274] abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; +[274] abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -14,7 +14,7 @@ import "dart:core" as core; } [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ { [274] [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal; -[-1] return [-1] [-1] #this; +[274] return [274] [274] #this; } [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ [263] return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect index d16ff8795e0..40e95e40331 100644 --- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect +++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.outline.expect @@ -6,7 +6,7 @@ import "dart:core" as core; [217]import "dart:js_interop"; [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ { -[274] abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; +[274] abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; diff --git a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect index 90a0d7ce094..6b441bbd666 100644 --- a/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/ddc/external_field.dart.strong.transformed.expect @@ -6,7 +6,7 @@ import "dart:core" as core; [217]import "dart:js_interop"; [259]extension type Foo(js_::JSObject /* erasure=dart._interceptors::JSObject */ _) implements js_::JSObject /* erasure=dart._interceptors::JSObject */ { -[274] abstract extension-type-member representation-field get [-1] [-1] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; +[274] abstract extension-type-member representation-field get [274] [274] _() → js_::JSObject /* erasure=dart._interceptors::JSObject */; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -14,7 +14,7 @@ import "dart:core" as core; } [263]static extension-type-member method [264] [275] Foo|constructor#_([274] wildcard initializing-formal js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ { [274] [274] lowered final self::Foo /* erasure=dart._interceptors::JSObject */ #this = [274] [274] _#wc0#formal; -[-1] return [-1] [-1] #this; +[274] return [274] [274] #this; } [263]static extension-type-member synthetic method [263] [263] Foo|constructor#_#_#tearOff([274] js_::JSObject /* erasure=dart._interceptors::JSObject */ _#wc0#formal) → self::Foo /* erasure=dart._interceptors::JSObject */ [263] return [263] [263] self::Foo|constructor#_ [263]([263] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.expect index 6986f7c1a0a..74998eb2c60 100644 --- a/pkg/front_end/testcases/offsets/external_field.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.expect @@ -3,7 +3,7 @@ import self as self; import "dart:core" as core; [232]extension type Foo(core::Duration _) implements core::Duration { -[247] abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration; +[247] abstract extension-type-member representation-field get [247] [247] _() → core::Duration; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -11,7 +11,7 @@ import "dart:core" as core; } [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ { [247] [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal; -[-1] return [-1] [-1] #this; +[247] return [247] [247] #this; } [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ [236] return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect index 6986f7c1a0a..74998eb2c60 100644 --- a/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.modular.expect @@ -3,7 +3,7 @@ import self as self; import "dart:core" as core; [232]extension type Foo(core::Duration _) implements core::Duration { -[247] abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration; +[247] abstract extension-type-member representation-field get [247] [247] _() → core::Duration; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -11,7 +11,7 @@ import "dart:core" as core; } [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ { [247] [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal; -[-1] return [-1] [-1] #this; +[247] return [247] [247] #this; } [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ [236] return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect index 79c3337f8b6..f15a77e422b 100644 --- a/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect +++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.outline.expect @@ -3,7 +3,7 @@ import self as self; import "dart:core" as core; [232]extension type Foo(core::Duration _) implements core::Duration { -[247] abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration; +[247] abstract extension-type-member representation-field get [247] [247] _() → core::Duration; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; diff --git a/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect index 6986f7c1a0a..74998eb2c60 100644 --- a/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/external_field.dart.strong.transformed.expect @@ -3,7 +3,7 @@ import self as self; import "dart:core" as core; [232]extension type Foo(core::Duration _) implements core::Duration { -[247] abstract extension-type-member representation-field get [-1] [-1] _() → core::Duration; +[247] abstract extension-type-member representation-field get [247] [247] _() → core::Duration; get bar = self::Foo|get#bar; set bar = self::Foo|set#bar; constructor _ = self::Foo|constructor#_; @@ -11,7 +11,7 @@ import "dart:core" as core; } [236]static extension-type-member method [237] [248] Foo|constructor#_([247] wildcard initializing-formal core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ { [247] [247] lowered final self::Foo /* erasure=core::Duration */ #this = [247] [247] _#wc0#formal; -[-1] return [-1] [-1] #this; +[247] return [247] [247] #this; } [236]static extension-type-member synthetic method [236] [236] Foo|constructor#_#_#tearOff([247] core::Duration _#wc0#formal) → self::Foo /* erasure=core::Duration */ [236] return [236] [236] self::Foo|constructor#_ [236]([236] _#wc0#formal); diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect index 687ae3e9396..bde7949331b 100644 --- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect +++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.expect @@ -22,7 +22,7 @@ import "dart:core" as core; [315] [315] hoisted dynamic a; [318] [318] hoisted dynamic b; [321] { -[-1] [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5; +[321] [321] final synthesized dynamic #1#0 = [321] [321] #t5; [314] [314] final const synthesized core::int #1#3 = [314] [314] #C1; [321] if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List && [314] [314] [314] [314] [-1] [-1] #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true))) [321] [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error"); diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect index 687ae3e9396..bde7949331b 100644 --- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect +++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.modular.expect @@ -22,7 +22,7 @@ import "dart:core" as core; [315] [315] hoisted dynamic a; [318] [318] hoisted dynamic b; [321] { -[-1] [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5; +[321] [321] final synthesized dynamic #1#0 = [321] [321] #t5; [314] [314] final const synthesized core::int #1#3 = [314] [314] #C1; [321] if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List && [314] [314] [314] [314] [-1] [-1] #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true))) [321] [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error"); diff --git a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect index cb0b4016619..0155173480e 100644 --- a/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/offsets/pattern_for_loop.dart.strong.transformed.expect @@ -26,7 +26,7 @@ import "dart:core" as core; [315] [315] hoisted dynamic a; [318] [318] hoisted dynamic b; [321] { -[-1] [-1] final synthesized dynamic #1#0 = [-1] [-1] #t5; +[321] [321] final synthesized dynamic #1#0 = [321] [321] #t5; [314] [314] final const synthesized core::int #1#3 = [314] [314] #C1; [321] if([314] [314]![314]([314] [314] [314] [314] [314] [314] [314] [-1] [-1] #1#0 is core::List && [314] [314] [314] [314] [-1] [-1] #1#0{core::List}.{core::List::length}{core::int} =={core::num::==}{(core::Object) → core::bool} [-1] [-1] #C1 && [315]([315] let [315] final dynamic #t6 = [315] [315] a = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 0){(core::int) → dynamic} in [-1] [-1] true) && [318]([318] let [318] final dynamic #t7 = [318] [318] b = [314] [314] [-1] [-1] #1#0{core::List}.{core::List::[]}[314]([314] 1){(core::int) → dynamic} in [-1] [-1] true))) [321] [321] [321] throw{for-error-handling} [321] [321] new core::StateError::• [321]([321] "Pattern matching error"); diff --git a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect index bf5cf9d91fb..78039e05d85 100644 --- a/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect +++ b/pkg/front_end/testcases/offsets/switch_encoding.dart.strong.outline.expect @@ -3,9 +3,9 @@ import self as self; import "dart:core" as core; [222]class E extends core::_Enum /*isEnum*/ { -[226] enum-element static const field self::E a = [226] [226] const self::E::• [-1]([-1] 0, [-1] "a"); -[229] enum-element static const field self::E b = [229] [229] const self::E::• [-1]([-1] 1, [-1] "b"); -[232] enum-element static const field self::E c = [232] [232] const self::E::• [-1]([-1] 2, [-1] "c"); +[226] enum-element static const field self::E a = [226] [226] const self::E::• [-1]([226] 0, [226] "a"); +[229] enum-element static const field self::E b = [229] [229] const self::E::• [-1]([229] 1, [229] "b"); +[232] enum-element static const field self::E c = [232] [232] const self::E::• [-1]([232] 2, [232] "c"); [222] static const field core::List values = [-1] [-1] const [[-1] self::E::a, [-1] self::E::b, [-1] self::E::c]; [222] const synthetic constructor [222] [222] •([222] core::int #index, [222] core::String #name) → self::E : [222] super core::_Enum::• [222]([222] #index, [222] #name) diff --git a/pkg/kernel/lib/src/ast/expressions.dart b/pkg/kernel/lib/src/ast/expressions.dart index a78149fee16..c452998fe03 100644 --- a/pkg/kernel/lib/src/ast/expressions.dart +++ b/pkg/kernel/lib/src/ast/expressions.dart @@ -1550,7 +1550,7 @@ class Arguments extends TreeNode { positional = [], named = []; - factory Arguments.forwarded(FunctionNode function, Library library) { + factory Arguments.forwarded(FunctionNode function) { return new Arguments( function.positionalParameters .map((p) => new VariableGet(p))