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))