diff --git a/pkg/front_end/lib/src/fasta/builder/builder_mixins.dart b/pkg/front_end/lib/src/fasta/builder/builder_mixins.dart index 35399d74c76..95c228d8160 100644 --- a/pkg/front_end/lib/src/fasta/builder/builder_mixins.dart +++ b/pkg/front_end/lib/src/fasta/builder/builder_mixins.dart @@ -9,17 +9,16 @@ import '../messages.dart'; import '../problems.dart'; import '../scope.dart'; import 'builder.dart'; -import 'declaration_builder.dart'; +import 'declaration_builders.dart'; import 'field_builder.dart'; import 'library_builder.dart'; import 'member_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; -import 'type_variable_builder.dart'; /// Shared implementation between extension and extension type declaration /// builders. -mixin DeclarationBuilderMixin implements DeclarationBuilder { +mixin DeclarationBuilderMixin implements IDeclarationBuilder { /// Type parameters declared. /// /// This is `null` if the declaration is not generic. diff --git a/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart index dbb06597777..3a2dc33effe 100644 --- a/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/builtin_type_declaration_builder.dart @@ -2,19 +2,10 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.builtin_type_builder; +part of 'declaration_builders.dart'; -import 'package:kernel/ast.dart' show DartType, Nullability; -import 'package:kernel/class_hierarchy.dart'; - -import 'library_builder.dart'; -import 'nullability_builder.dart'; -import 'type_builder.dart'; - -import 'type_declaration_builder.dart'; - -abstract class BuiltinTypeDeclarationBuilder - extends TypeDeclarationBuilderImpl { +abstract class BuiltinTypeDeclarationBuilder extends TypeDeclarationBuilderImpl + implements TypeDeclarationBuilder { final DartType type; @override diff --git a/pkg/front_end/lib/src/fasta/builder/class_builder.dart b/pkg/front_end/lib/src/fasta/builder/class_builder.dart index c96767a1128..b15c7cb5648 100644 --- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart @@ -2,43 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.class_builder; - -import 'package:kernel/ast.dart' - show - Class, - DartType, - DynamicType, - FutureOrType, - InterfaceType, - InvalidType, - Member, - Name, - NullType, - Nullability, - Supertype, - TreeNode, - getAsTypeArguments; -import 'package:kernel/class_hierarchy.dart' - show ClassHierarchy, ClassHierarchyBase; -import 'package:kernel/src/unaliasing.dart'; - -import '../fasta_codes.dart'; -import '../modifier.dart'; -import '../problems.dart' show internalProblem, unhandled; -import '../scope.dart'; -import '../source/source_library_builder.dart'; -import '../type_inference/type_schema.dart' show UnknownType; -import '../util/helpers.dart'; -import 'builder.dart'; -import 'declaration_builder.dart'; -import 'library_builder.dart'; -import 'member_builder.dart'; -import 'metadata_builder.dart'; -import 'name_iterator.dart'; -import 'nullability_builder.dart'; -import 'type_builder.dart'; -import 'type_variable_builder.dart'; +part of 'declaration_builders.dart'; const Uri? noUri = null; diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart index 6a7980ecdeb..8bfda7476c5 100644 --- a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart @@ -11,10 +11,9 @@ import '../identifiers.dart' show QualifiedName, flattenName; import '../scope.dart'; import 'builder.dart'; -import 'declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'prefix_builder.dart'; -import 'type_alias_builder.dart'; import 'type_builder.dart'; class ConstructorReferenceBuilder { diff --git a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart index 996543d655c..c6e26989581 100644 --- a/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/declaration_builder.dart @@ -2,19 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:kernel/ast.dart'; -import 'package:kernel/class_hierarchy.dart'; +part of 'declaration_builders.dart'; -import '../messages.dart'; -import '../scope.dart'; -import 'builder.dart'; -import 'library_builder.dart'; -import 'member_builder.dart'; -import 'metadata_builder.dart'; -import 'type_builder.dart'; -import 'type_declaration_builder.dart'; - -abstract class DeclarationBuilder implements TypeDeclarationBuilder { +abstract class IDeclarationBuilder implements ITypeDeclarationBuilder { Scope get scope; LibraryBuilder get libraryBuilder; @@ -54,7 +44,7 @@ abstract class DeclarationBuilder implements TypeDeclarationBuilder { } abstract class DeclarationBuilderImpl extends TypeDeclarationBuilderImpl - implements DeclarationBuilder { + implements IDeclarationBuilder { @override final Scope scope; @@ -82,7 +72,7 @@ abstract class DeclarationBuilderImpl extends TypeDeclarationBuilderImpl } @override - DeclarationBuilder get origin => this; + DeclarationBuilder get origin => this as DeclarationBuilder; @override MemberBuilder? findConstructorOrFactory( diff --git a/pkg/front_end/lib/src/fasta/builder/declaration_builders.dart b/pkg/front_end/lib/src/fasta/builder/declaration_builders.dart new file mode 100644 index 00000000000..4356d4d9e78 --- /dev/null +++ b/pkg/front_end/lib/src/fasta/builder/declaration_builders.dart @@ -0,0 +1,46 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +import 'package:kernel/ast.dart'; +import 'package:kernel/class_hierarchy.dart'; +import 'package:kernel/src/unaliasing.dart'; + +import '../fasta_codes.dart'; +import '../kernel/body_builder_context.dart'; +import '../messages.dart'; +import '../modifier.dart'; +import '../problems.dart' show internalProblem, unhandled; +import '../scope.dart'; +import '../source/source_library_builder.dart'; +import '../type_inference/type_schema.dart' show UnknownType; +import '../uris.dart'; +import '../util/helpers.dart'; +import 'builder.dart'; +import 'builder_mixins.dart'; +import 'formal_parameter_builder.dart'; +import 'library_builder.dart'; +import 'member_builder.dart'; +import 'metadata_builder.dart'; +import 'modifier_builder.dart'; +import 'name_iterator.dart'; +import 'named_type_builder.dart'; +import 'nullability_builder.dart'; +import 'record_type_builder.dart'; +import 'type_builder.dart'; + +part 'builtin_type_declaration_builder.dart'; +part 'class_builder.dart'; +part 'declaration_builder.dart'; +part 'extension_builder.dart'; +part 'extension_type_declaration_builder.dart'; +part 'invalid_type_declaration_builder.dart'; +part 'omitted_type_declaration_builder.dart'; +part 'type_alias_builder.dart'; +part 'type_declaration_builder.dart'; +part 'type_variable_builder.dart'; + +sealed class TypeDeclarationBuilder implements ITypeDeclarationBuilder {} + +sealed class DeclarationBuilder + implements TypeDeclarationBuilder, IDeclarationBuilder {} diff --git a/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart index 4a172337f21..3b384488a68 100644 --- a/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/dynamic_type_declaration_builder.dart @@ -6,7 +6,7 @@ library fasta.dynamic_type_builder; import 'package:kernel/ast.dart' show DartType; -import 'builtin_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; class DynamicTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder { diff --git a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart index 88757487c1b..08f5cc58fb1 100644 --- a/pkg/front_end/lib/src/fasta/builder/extension_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/extension_builder.dart @@ -2,15 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:kernel/ast.dart'; -import '../scope.dart'; -import 'builder.dart'; -import 'builder_mixins.dart'; -import 'declaration_builder.dart'; -import 'library_builder.dart'; -import 'metadata_builder.dart'; -import 'type_builder.dart'; -import 'type_variable_builder.dart'; +part of 'declaration_builders.dart'; abstract class ExtensionBuilder implements DeclarationBuilder { /// Type parameters declared on the extension. diff --git a/pkg/front_end/lib/src/fasta/builder/extension_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/extension_type_declaration_builder.dart index 6fca4428824..fe1c4cbdc55 100644 --- a/pkg/front_end/lib/src/fasta/builder/extension_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/extension_type_declaration_builder.dart @@ -2,17 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import 'package:kernel/ast.dart'; - -import '../scope.dart'; -import '../source/source_library_builder.dart'; -import 'builder.dart'; -import 'builder_mixins.dart'; -import 'declaration_builder.dart'; -import 'library_builder.dart'; -import 'metadata_builder.dart'; -import 'type_builder.dart'; -import 'type_variable_builder.dart'; +part of 'declaration_builders.dart'; abstract class ExtensionTypeDeclarationBuilder implements DeclarationBuilder { /// Type parameters declared on the extension type declaration. diff --git a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart index fc086a3deaf..21819f6b356 100644 --- a/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/formal_parameter_builder.dart @@ -24,7 +24,7 @@ import '../source/source_library_builder.dart'; import '../util/helpers.dart' show DelayedActionPerformer; import 'builder.dart'; import 'constructor_builder.dart'; -import 'declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'metadata_builder.dart'; import 'modifier_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart index 58808e1dc8b..fd403703dd1 100644 --- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart @@ -12,12 +12,12 @@ import 'package:kernel/src/unaliasing.dart'; import '../fasta_codes.dart' show messageSupertypeIsFunction, noLength; import '../kernel/implicit_field_type.dart'; import '../source/source_library_builder.dart'; +import 'declaration_builders.dart'; import 'formal_parameter_builder.dart'; import 'inferable_type_builder.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; -import 'type_variable_builder.dart'; abstract class FunctionTypeBuilderImpl extends FunctionTypeBuilder { @override diff --git a/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart index 5f818e9abc7..7ed0ed5ddfd 100644 --- a/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/future_or_type_declaration_builder.dart @@ -7,7 +7,7 @@ library fasta.future_or_type_builder; import 'package:kernel/ast.dart' show DartType, FutureOrType, Nullability; import 'package:kernel/class_hierarchy.dart'; -import 'builtin_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart index 5f9b4768ccf..d1129040940 100644 --- a/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/invalid_type_declaration_builder.dart @@ -2,21 +2,11 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.invalid_type_builder; - -import 'package:kernel/ast.dart' show DartType, InvalidType, Nullability; -import 'package:kernel/class_hierarchy.dart'; - -import '../fasta_codes.dart' show LocatedMessage; -import '../scope.dart'; - -import 'library_builder.dart'; -import 'nullability_builder.dart'; -import 'type_builder.dart'; -import 'type_declaration_builder.dart'; +part of 'declaration_builders.dart'; class InvalidTypeDeclarationBuilder extends TypeDeclarationBuilderImpl - with ErroneousMemberBuilderMixin { + with ErroneousMemberBuilderMixin + implements TypeDeclarationBuilder { @override String get debugName => "InvalidTypeDeclarationBuilder"; diff --git a/pkg/front_end/lib/src/fasta/builder/library_builder.dart b/pkg/front_end/lib/src/fasta/builder/library_builder.dart index 6dbf934ce84..ebf1ac29d66 100644 --- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart @@ -28,13 +28,12 @@ import '../messages.dart' import '../scope.dart'; import 'builder.dart'; -import 'class_builder.dart'; +import 'declaration_builders.dart'; import 'member_builder.dart'; import 'modifier_builder.dart'; import 'name_iterator.dart'; import 'nullability_builder.dart'; import 'prefix_builder.dart'; -import 'type_alias_builder.dart'; import 'type_builder.dart'; abstract class LibraryBuilder implements ModifierBuilder { diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart index 004412444a2..5c3028ce5a7 100644 --- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart @@ -9,10 +9,7 @@ import 'package:kernel/ast.dart'; import '../kernel/hierarchy/class_member.dart'; import '../modifier.dart'; import 'builder.dart'; -import 'class_builder.dart'; -import 'declaration_builder.dart'; -import 'extension_builder.dart'; -import 'extension_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'modifier_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart index b4edd0ab5a0..03d9d88e177 100644 --- a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart @@ -4,8 +4,8 @@ library fasta.mixin_application_builder; +import 'declaration_builders.dart'; import 'type_builder.dart'; -import 'type_variable_builder.dart'; class MixinApplicationBuilder { final List mixins; diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart index 5514c0f50f6..ef2601a5c3d 100644 --- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart @@ -36,17 +36,12 @@ import '../scope.dart'; import '../source/source_library_builder.dart'; import '../uris.dart'; import 'builder.dart'; -import 'builtin_type_declaration_builder.dart'; -import 'class_builder.dart'; +import 'declaration_builders.dart'; import 'inferable_type_builder.dart'; -import 'invalid_type_declaration_builder.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'prefix_builder.dart'; -import 'type_alias_builder.dart'; import 'type_builder.dart'; -import 'type_declaration_builder.dart'; -import 'type_variable_builder.dart'; import 'void_type_declaration_builder.dart'; /// Enum used to determine how instance type variable access is allowed. @@ -462,83 +457,92 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder { @override Supertype? buildSupertype(LibraryBuilder library) { TypeDeclarationBuilder declaration = this.declaration!; - if (declaration is ClassBuilder) { - if (declaration.isNullClass) { - if (!library.mayImplementRestrictedTypes) { - library.addProblem( - templateExtendingRestricted.withArguments(declaration.name), - charOffset!, - noLength, - fileUri); + switch (declaration) { + case ClassBuilder(): + if (declaration.isNullClass) { + if (!library.mayImplementRestrictedTypes) { + library.addProblem( + templateExtendingRestricted.withArguments(declaration.name), + charOffset!, + noLength, + fileUri); + } } - } - DartType type = build(library, TypeUse.superType); - if (type is InterfaceType) { - if (!library.isNonNullableByDefault) { - // This "normalizes" type argument `Never*` to `Null`. - type = legacyErasure(type) as InterfaceType; + DartType type = build(library, TypeUse.superType); + if (type is InterfaceType) { + if (!library.isNonNullableByDefault) { + // This "normalizes" type argument `Never*` to `Null`. + type = legacyErasure(type) as InterfaceType; + } + return new Supertype(type.classNode, type.typeArguments); + } else if (type is FutureOrType) { + return new Supertype(declaration.cls, [type.typeArgument]); + } else if (type is NullType) { + return new Supertype(declaration.cls, []); } - return new Supertype(type.classNode, type.typeArguments); - } else if (type is FutureOrType) { - return new Supertype(declaration.cls, [type.typeArgument]); - } else if (type is NullType) { - return new Supertype(declaration.cls, []); - } - } else if (declaration is TypeAliasBuilder) { - TypeAliasBuilder aliasBuilder = declaration; - DartType type = build(library, TypeUse.superType); - if (type is InterfaceType && type.nullability != Nullability.nullable) { - return new Supertype(type.classNode, type.typeArguments); - } else if (type is NullType) { - // Even though Null is disallowed as a supertype, ClassHierarchyBuilder - // still expects it to be built to the respective InterfaceType - // referencing the deprecated class. - // TODO(cstefantsova): Remove the dependency on the deprecated Null - // class from ClassHierarchyBuilder. - TypeDeclarationBuilder? unaliasedDeclaration = this.declaration; - // The following code assumes that the declaration is a TypeAliasBuilder - // that through a chain of other TypeAliasBuilders (possibly, the chain - // length is 0) references a ClassBuilder of the Null class. Otherwise, - // it won't produce the NullType on the output. - while (unaliasedDeclaration is TypeAliasBuilder) { - unaliasedDeclaration = unaliasedDeclaration.type.declaration; - assert(unaliasedDeclaration != null); + case TypeAliasBuilder(): + TypeAliasBuilder aliasBuilder = declaration; + DartType type = build(library, TypeUse.superType); + if (type is InterfaceType && type.nullability != Nullability.nullable) { + return new Supertype(type.classNode, type.typeArguments); + } else if (type is NullType) { + // Even though `Null` is disallowed as a supertype, + // [ClassHierarchyBuilder] still expects it to be built to the + // respective [InterfaceType] referencing the deprecated class. + // TODO(cstefantsova): Remove the dependency on the deprecated Null + // class from ClassHierarchyBuilder. + TypeDeclarationBuilder? unaliasedDeclaration = this.declaration; + // The following code assumes that the declaration is a + // [TypeAliasBuilder] that through a chain of other + // [TypeAliasBuilder]s (possibly, the chain length is 0) references a + // [ClassBuilder] of the `Null` class. Otherwise, it won't produce the + // [NullType] on the output. + while (unaliasedDeclaration is TypeAliasBuilder) { + unaliasedDeclaration = unaliasedDeclaration.type.declaration; + assert(unaliasedDeclaration != null); + } + assert(unaliasedDeclaration is ClassBuilder && + unaliasedDeclaration.name == "Null"); + return new Supertype( + (unaliasedDeclaration as ClassBuilder).cls, const []); + } else if (type is FutureOrType) { + // Even though `FutureOr` is disallowed as a supertype, + // [ClassHierarchyBuilder] still expects it to be built to the + // respective [InterfaceType] referencing the deprecated class. In + // contrast with `Null`, it doesn't surface as an error due to + // `FutureOr` class not having any inheritable members. + // TODO(cstefantsova): Remove the dependency on the deprecated + // FutureOr class from ClassHierarchyBuilder. + TypeDeclarationBuilder? unaliasedDeclaration = this.declaration; + // The following code assumes that the declaration is a + // [TypeAliasBuilder] that through a chain of other + // [TypeAliasBuilder]s (possibly, the chain length is 0) references a + // [ClassBuilder] of the `FutureOr` class. Otherwise, it won't produce + // the [FutureOrType] on the output. + while (unaliasedDeclaration is TypeAliasBuilder) { + unaliasedDeclaration = unaliasedDeclaration.type.declaration; + assert(unaliasedDeclaration != null); + } + assert(unaliasedDeclaration is ClassBuilder && + unaliasedDeclaration.name == "FutureOr"); + return new Supertype((unaliasedDeclaration as ClassBuilder).cls, + [type.typeArgument]); } - assert(unaliasedDeclaration is ClassBuilder && - unaliasedDeclaration.name == "Null"); - return new Supertype( - (unaliasedDeclaration as ClassBuilder).cls, const []); - } else if (type is FutureOrType) { - // Even though FutureOr is disallowed as a supertype, - // ClassHierarchyBuilder still expects it to be built to the respective - // InterfaceType referencing the deprecated class. In contrast with - // Null, it doesn't surface as an error due to FutureOr class not having - // any inheritable members. - // TODO(cstefantsova): Remove the dependency on the deprecated FutureOr - // class from ClassHierarchyBuilder. - TypeDeclarationBuilder? unaliasedDeclaration = this.declaration; - // The following code assumes that the declaration is a TypeAliasBuilder - // that through a chain of other TypeAliasBuilders (possibly, the chain - // length is 0) references a ClassBuilder of the FutureOr class. - // Otherwise, it won't produce the FutureOrType on the output. - while (unaliasedDeclaration is TypeAliasBuilder) { - unaliasedDeclaration = unaliasedDeclaration.type.declaration; - assert(unaliasedDeclaration != null); - } - assert(unaliasedDeclaration is ClassBuilder && - unaliasedDeclaration.name == "FutureOr"); - return new Supertype((unaliasedDeclaration as ClassBuilder).cls, - [type.typeArgument]); - } - return _handleInvalidAliasedSupertype(library, aliasBuilder, type); - } else if (declaration is InvalidTypeDeclarationBuilder) { - library.addProblem( - declaration.message.messageObject, - declaration.message.charOffset, - declaration.message.length, - declaration.message.uri, - severity: Severity.error); - return null; + return _handleInvalidAliasedSupertype(library, aliasBuilder, type); + case InvalidTypeDeclarationBuilder(): + library.addProblem( + declaration.message.messageObject, + declaration.message.charOffset, + declaration.message.length, + declaration.message.uri, + severity: Severity.error); + return null; + case TypeVariableBuilder(): + case ExtensionTypeDeclarationBuilder(): + case ExtensionBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): } return _handleInvalidSupertype(library); } @@ -546,23 +550,30 @@ abstract class NamedTypeBuilderImpl extends NamedTypeBuilder { @override Supertype? buildMixedInType(LibraryBuilder library) { TypeDeclarationBuilder declaration = this.declaration!; - if (declaration is ClassBuilder) { - return declaration.buildMixedInType(library, arguments); - } else if (declaration is TypeAliasBuilder) { - TypeAliasBuilder aliasBuilder = declaration; - DartType type = build(library, TypeUse.mixedInType); - if (type is InterfaceType && type.nullability != Nullability.nullable) { - return new Supertype(type.classNode, type.typeArguments); - } - return _handleInvalidAliasedSupertype(library, aliasBuilder, type); - } else if (declaration is InvalidTypeDeclarationBuilder) { - library.addProblem( - declaration.message.messageObject, - declaration.message.charOffset, - declaration.message.length, - declaration.message.uri, - severity: Severity.error); - return null; + switch (declaration) { + case ClassBuilder(): + return declaration.buildMixedInType(library, arguments); + case TypeAliasBuilder(): + TypeAliasBuilder aliasBuilder = declaration; + DartType type = build(library, TypeUse.mixedInType); + if (type is InterfaceType && type.nullability != Nullability.nullable) { + return new Supertype(type.classNode, type.typeArguments); + } + return _handleInvalidAliasedSupertype(library, aliasBuilder, type); + case InvalidTypeDeclarationBuilder(): + library.addProblem( + declaration.message.messageObject, + declaration.message.charOffset, + declaration.message.length, + declaration.message.uri, + severity: Severity.error); + return null; + case TypeVariableBuilder(): + case ExtensionBuilder(): + case ExtensionTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): } return _handleInvalidSupertype(library); } diff --git a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart index 561b2be1168..b0dcd23b666 100644 --- a/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/never_type_declaration_builder.dart @@ -8,7 +8,7 @@ import 'package:kernel/ast.dart' show DartType, Nullability; import 'package:kernel/class_hierarchy.dart'; import '../uris.dart'; -import 'builtin_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart index 3fba0f07c2b..11a3ab598fa 100644 --- a/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/null_type_declaration_builder.dart @@ -7,7 +7,7 @@ library fasta.null_type_declaration_builder; import 'package:kernel/ast.dart' show DartType, Nullability; import 'package:kernel/class_hierarchy.dart'; -import 'builtin_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart index f0b6638731d..156ea2be477 100644 --- a/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/omitted_type_builder.dart @@ -11,7 +11,6 @@ import 'inferable_type_builder.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'type_builder.dart'; -import 'type_declaration_builder.dart'; abstract class OmittedTypeBuilderImpl extends OmittedTypeBuilder { const OmittedTypeBuilderImpl(); @@ -249,49 +248,3 @@ abstract class Inferable { /// [InferableTypeBuilder]s. void inferTypes(ClassHierarchyBase hierarchy); } - -/// [TypeDeclaration] wrapper for an [OmittedTypeBuilder]. -/// -/// This is used in macro generated code to create type annotations from -/// inferred types in the original code. -class OmittedTypeDeclarationBuilder extends TypeDeclarationBuilderImpl { - OmittedTypeBuilder omittedTypeBuilder; - - OmittedTypeDeclarationBuilder( - String name, this.omittedTypeBuilder, SourceLibraryBuilder parent) - : super(null, 0, name, parent, TreeNode.noOffset); - - @override - DartType buildAliasedType( - LibraryBuilder library, - NullabilityBuilder nullabilityBuilder, - List? arguments, - TypeUse typeUse, - Uri fileUri, - int charOffset, - ClassHierarchyBase? hierarchy, - {required bool hasExplicitTypeArguments}) { - // TODO(johnniwinther): This should probably be an error case. - throw new UnimplementedError('${runtimeType}.buildAliasedType'); - } - - @override - DartType buildAliasedTypeWithBuiltArguments( - LibraryBuilder library, - Nullability nullability, - List arguments, - TypeUse typeUse, - Uri fileUri, - int charOffset, - {required bool hasExplicitTypeArguments}) { - // TODO(johnniwinther): This should probably be an error case. - throw new UnimplementedError( - '${runtimeType}.buildAliasedTypeWithBuiltArguments'); - } - - @override - String get debugName => 'OmittedTypeDeclarationBuilder'; - - @override - Uri? get fileUri => parent!.fileUri; -} diff --git a/pkg/front_end/lib/src/fasta/builder/omitted_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/omitted_type_declaration_builder.dart new file mode 100644 index 00000000000..0dbc280877d --- /dev/null +++ b/pkg/front_end/lib/src/fasta/builder/omitted_type_declaration_builder.dart @@ -0,0 +1,52 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +part of 'declaration_builders.dart'; + +/// [TypeDeclaration] wrapper for an [OmittedTypeBuilder]. +/// +/// This is used in macro generated code to create type annotations from +/// inferred types in the original code. +class OmittedTypeDeclarationBuilder extends TypeDeclarationBuilderImpl + implements TypeDeclarationBuilder { + final OmittedTypeBuilder omittedTypeBuilder; + + OmittedTypeDeclarationBuilder( + String name, this.omittedTypeBuilder, SourceLibraryBuilder parent) + : super(null, 0, name, parent, TreeNode.noOffset); + + @override + DartType buildAliasedType( + LibraryBuilder library, + NullabilityBuilder nullabilityBuilder, + List? arguments, + TypeUse typeUse, + Uri fileUri, + int charOffset, + ClassHierarchyBase? hierarchy, + {required bool hasExplicitTypeArguments}) { + // TODO(johnniwinther): This should probably be an error case. + throw new UnimplementedError('${runtimeType}.buildAliasedType'); + } + + @override + DartType buildAliasedTypeWithBuiltArguments( + LibraryBuilder library, + Nullability nullability, + List arguments, + TypeUse typeUse, + Uri fileUri, + int charOffset, + {required bool hasExplicitTypeArguments}) { + // TODO(johnniwinther): This should probably be an error case. + throw new UnimplementedError( + '${runtimeType}.buildAliasedTypeWithBuiltArguments'); + } + + @override + String get debugName => 'OmittedTypeDeclarationBuilder'; + + @override + Uri? get fileUri => parent!.fileUri; +} diff --git a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart index de8cb190436..f2600498041 100644 --- a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart @@ -14,7 +14,7 @@ import '../scope.dart'; import '../source/source_library_builder.dart'; import 'builder.dart'; -import 'extension_builder.dart'; +import 'declaration_builders.dart'; class PrefixBuilder extends BuilderImpl { final String name; diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart index 2fa1d106845..8a125ec1086 100644 --- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart @@ -2,29 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.function_type_alias_builder; - -import 'package:kernel/ast.dart'; -import 'package:kernel/class_hierarchy.dart'; - -import '../fasta_codes.dart' - show - noLength, - templateCyclicTypedef, - templateTypeArgumentMismatch, - messageTypedefTypeVariableNotConstructor, - messageTypedefTypeVariableNotConstructorCause; -import '../problems.dart' show unhandled; -import '../source/source_library_builder.dart'; -import 'class_builder.dart'; -import 'extension_type_declaration_builder.dart'; -import 'library_builder.dart'; -import 'metadata_builder.dart'; -import 'named_type_builder.dart'; -import 'nullability_builder.dart'; -import 'type_builder.dart'; -import 'type_declaration_builder.dart'; -import 'type_variable_builder.dart'; +part of 'declaration_builders.dart'; abstract class TypeAliasBuilder implements TypeDeclarationBuilder { TypeBuilder get type; diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart index 9b89136ddf2..1d07aaea57a 100644 --- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart @@ -11,15 +11,12 @@ import '../kernel/type_algorithms.dart'; import '../messages.dart'; import '../scope.dart'; import '../source/source_library_builder.dart'; +import 'declaration_builders.dart'; import 'formal_parameter_builder.dart'; -import 'invalid_type_declaration_builder.dart'; import 'library_builder.dart'; import 'nullability_builder.dart'; import 'omitted_type_builder.dart'; import 'record_type_builder.dart'; -import 'type_alias_builder.dart'; -import 'type_declaration_builder.dart'; -import 'type_variable_builder.dart'; enum TypeUse { /// A type used as the type of a parameter. diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart index eeeab5db3c7..a2841d3a476 100644 --- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart @@ -2,19 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.type_declaration_builder; +part of 'declaration_builders.dart'; -import 'package:kernel/ast.dart' show DartType, Nullability; -import 'package:kernel/class_hierarchy.dart'; - -import 'builder.dart'; -import 'library_builder.dart'; -import 'metadata_builder.dart'; -import 'modifier_builder.dart'; -import 'nullability_builder.dart'; -import 'type_builder.dart'; - -abstract class TypeDeclarationBuilder implements ModifierBuilder { +abstract class ITypeDeclarationBuilder implements ModifierBuilder { @override String get name; @@ -64,7 +54,7 @@ abstract class TypeDeclarationBuilder implements ModifierBuilder { } abstract class TypeDeclarationBuilderImpl extends ModifierBuilderImpl - implements TypeDeclarationBuilder { + implements ITypeDeclarationBuilder { @override final List? metadata; @@ -79,7 +69,7 @@ abstract class TypeDeclarationBuilderImpl extends ModifierBuilderImpl : super(parent, charOffset); @override - TypeDeclarationBuilder get origin => this; + TypeDeclarationBuilder get origin => this as TypeDeclarationBuilder; @override bool get isNamedMixinApplication => false; diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart index 3f5ad27c4be..2c541a5a687 100644 --- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart @@ -2,31 +2,7 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -library fasta.type_variable_builder; - -import 'package:kernel/ast.dart' - show DartType, Nullability, TypeParameter, TypeParameterType; -import 'package:kernel/class_hierarchy.dart'; - -import '../fasta_codes.dart' - show - templateInternalProblemUnfinishedTypeVariable, - templateTypeArgumentsOnTypeVariable; -import '../kernel/body_builder_context.dart'; -import '../scope.dart'; -import '../source/source_library_builder.dart'; -import '../uris.dart'; -import '../util/helpers.dart'; -import 'builder.dart'; -import 'class_builder.dart'; -import 'formal_parameter_builder.dart'; -import 'library_builder.dart'; -import 'metadata_builder.dart'; -import 'nullability_builder.dart'; -import 'record_type_builder.dart'; -import 'type_alias_builder.dart'; -import 'type_builder.dart'; -import 'type_declaration_builder.dart'; +part of 'declaration_builders.dart'; enum TypeVariableKind { /// A type variable declared on a function, method, local function or @@ -47,7 +23,8 @@ enum TypeVariableKind { fromKernel, } -class TypeVariableBuilder extends TypeDeclarationBuilderImpl { +class TypeVariableBuilder extends TypeDeclarationBuilderImpl + implements TypeDeclarationBuilder { /// Sentinel value used to indicate that the variable has no name. This is /// used for error recovery. static const String noNameSentinel = 'no name sentinel'; @@ -290,13 +267,22 @@ void _sortTypeVariablesTopologicallyFromRoot(TypeBuilder root, switch (root) { case NamedTypeBuilder(:TypeDeclarationBuilder? declaration): - if (declaration is ClassBuilder) { - foundTypeVariables = declaration.typeVariables; - } else if (declaration is TypeAliasBuilder) { - foundTypeVariables = declaration.typeVariables; - internalDependents = [declaration.type]; - } else if (declaration is TypeVariableBuilder) { - foundTypeVariables = [declaration]; + switch (declaration) { + case ClassBuilder(): + foundTypeVariables = declaration.typeVariables; + case TypeAliasBuilder(): + foundTypeVariables = declaration.typeVariables; + internalDependents = [declaration.type]; + case TypeVariableBuilder(): + foundTypeVariables = [declaration]; + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther):: Handle this case. + case ExtensionBuilder(): + case BuiltinTypeDeclarationBuilder(): + case InvalidTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } case FunctionTypeBuilder( :List? typeVariables, diff --git a/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart index 97e238f3e73..e53f457a235 100644 --- a/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/builder/void_type_declaration_builder.dart @@ -6,7 +6,7 @@ library fasta.void_type_builder; import 'package:kernel/ast.dart' show DartType; -import 'builtin_type_declaration_builder.dart'; +import 'declaration_builders.dart'; import 'library_builder.dart'; class VoidTypeDeclarationBuilder extends BuiltinTypeDeclarationBuilder { diff --git a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart index 023223fd7dd..6c6e6af0ca2 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_class_builder.dart @@ -8,12 +8,11 @@ import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/name_iterator.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../modifier.dart' show abstractMask, namedMixinApplicationMask; import '../problems.dart' show unimplemented; import '../scope.dart'; diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart index 1549452efa8..d67431b7cca 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_builder.dart @@ -4,11 +4,10 @@ import 'package:kernel/ast.dart'; -import '../builder/extension_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../scope.dart'; import 'dill_class_builder.dart'; import 'dill_extension_member_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/dill/dill_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_extension_type_declaration_builder.dart index a908aa1eb24..1966390d170 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_extension_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_extension_type_declaration_builder.dart @@ -2,10 +2,9 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/member_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import 'package:kernel/ast.dart'; import '../scope.dart'; diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart index 193537f69c4..c5faa53a475 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart @@ -9,17 +9,13 @@ import 'dart:convert' show jsonDecode; import 'package:kernel/ast.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/dynamic_type_declaration_builder.dart'; -import '../builder/extension_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/modifier_builder.dart'; import '../builder/name_iterator.dart'; import '../builder/never_type_declaration_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../fasta_codes.dart' show Message, noLength, templateDuplicatedDeclaration, templateUnspecified; import '../kernel/constructor_tearoff_lowering.dart'; diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart index e8070c3a51b..484b7f753ae 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart @@ -9,8 +9,7 @@ import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity; import 'package:kernel/ast.dart' show Class, Component, DartType, ExtensionTypeDeclaration, Library; -import '../builder/class_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart index 1423f765382..7eec12614ef 100644 --- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart +++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart @@ -7,11 +7,10 @@ library fasta.dill_typedef_builder; import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/metadata_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../problems.dart' show unimplemented; import 'dill_class_builder.dart' show computeTypeVariableBuilders; import 'dill_library_builder.dart' show DillLibraryBuilder; diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart index 15c50141cc6..cacfa72e2b2 100644 --- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart +++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart @@ -84,9 +84,8 @@ import '../kernel_generator_impl.dart' show precompileMacros; import 'builder/builder.dart' show Builder; -import 'builder/class_builder.dart' show ClassBuilder; - -import 'builder/extension_builder.dart' show ExtensionBuilder; +import 'builder/declaration_builders.dart' + show ClassBuilder, ExtensionBuilder, TypeDeclarationBuilder; import 'builder/field_builder.dart' show FieldBuilder; @@ -98,8 +97,6 @@ import 'builder/name_iterator.dart' show NameIterator; import 'builder/type_builder.dart' show NamedTypeBuilder, TypeBuilder; -import 'builder/type_declaration_builder.dart' show TypeDeclarationBuilder; - import 'builder_graph.dart' show BuilderGraph; import 'combinator.dart' show CombinatorBuilder; diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart index 5fe872dd917..1dc97c30bd1 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart @@ -44,13 +44,10 @@ import 'package:kernel/type_algebra.dart'; import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/extension_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_type_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; import '../builder/invalid_type_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/named_type_builder.dart'; @@ -58,10 +55,7 @@ import '../builder/nullability_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/prefix_builder.dart'; import '../builder/record_type_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../builder/variable_builder.dart'; import '../builder/void_type_declaration_builder.dart'; import '../constant_context.dart' show ConstantContext; @@ -6386,82 +6380,100 @@ class BodyBuilder extends StackListenerImpl } else { if (aliasBuilder.typeVariablesCount > 0) { // Raw generic type alias used for instance creation, needs inference. - ClassBuilder classBuilder; - if (type is ClassBuilder) { - classBuilder = type; - } else { - if (type is InvalidTypeDeclarationBuilder) { + switch (type) { + case ClassBuilder(): + ClassBuilder classBuilder = type; + MemberBuilder? b = classBuilder.findConstructorOrFactory( + name, charOffset, uri, libraryBuilder); + Member? target = b?.member; + if (b == null) { + // Not found. Reported below. + } else if (b is AmbiguousMemberBuilder) { + message = b.message.withLocation(uri, charOffset, noLength); + } else if (b.isConstructor) { + if (classBuilder.isAbstract) { + return evaluateArgumentsBefore( + arguments, + buildAbstractClassInstantiationError( + fasta.templateAbstractClassInstantiation + .withArguments(type.name), + type.name, + nameToken.charOffset)); + } + } + if (target is Constructor || + (target is Procedure && + target.kind == ProcedureKind.Factory)) { + Expression invocation; + invocation = buildStaticInvocation(target!, arguments, + constness: constness, + typeAliasBuilder: aliasBuilder, + charOffset: nameToken.charOffset, + charLength: nameToken.length, + isConstructorInvocation: true); + return invocation; + } else { + return buildUnresolvedError(errorName, nameLastToken.charOffset, + arguments: arguments, + message: message, + kind: UnresolvedKind.Constructor); + } + case InvalidTypeDeclarationBuilder(): LocatedMessage message = type.message; return evaluateArgumentsBefore( arguments, buildProblem(message.messageObject, nameToken.charOffset, nameToken.lexeme.length)); - } - - return buildUnresolvedError(errorName, nameLastToken.charOffset, - arguments: arguments, - message: message, - kind: UnresolvedKind.Constructor); - } - MemberBuilder? b = classBuilder.findConstructorOrFactory( - name, charOffset, uri, libraryBuilder); - Member? target = b?.member; - if (b == null) { - // Not found. Reported below. - } else if (b is AmbiguousMemberBuilder) { - message = b.message.withLocation(uri, charOffset, noLength); - } else if (b.isConstructor) { - if (classBuilder.isAbstract) { - return evaluateArgumentsBefore( - arguments, - buildAbstractClassInstantiationError( - fasta.templateAbstractClassInstantiation - .withArguments(type.name), - type.name, - nameToken.charOffset)); - } - } - if (target is Constructor || - (target is Procedure && target.kind == ProcedureKind.Factory)) { - Expression invocation; - invocation = buildStaticInvocation(target!, arguments, - constness: constness, - typeAliasBuilder: aliasBuilder, - charOffset: nameToken.charOffset, - charLength: nameToken.length, - isConstructorInvocation: true); - return invocation; - } else { - return buildUnresolvedError(errorName, nameLastToken.charOffset, - arguments: arguments, - message: message, - kind: UnresolvedKind.Constructor); + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: + return buildUnresolvedError(errorName, nameLastToken.charOffset, + arguments: arguments, + message: message, + kind: UnresolvedKind.Constructor); } } else { // Empty `typeArguments` and `aliasBuilder``is non-generic, but it // may still unalias to a class type with some type arguments. - if (type is ClassBuilder) { - List? unaliasedTypeArgumentBuilders = - aliasBuilder.unaliasTypeArguments(const []); - if (unaliasedTypeArgumentBuilders == null) { - // TODO(eernst): This is a wrong number of type arguments, - // occurring indirectly (in an alias of an alias, etc.). - return evaluateArgumentsBefore( - arguments, - buildProblem( - fasta.templateTypeArgumentMismatch - .withArguments(numberOfTypeParameters), - nameToken.charOffset, - nameToken.length, - suppressMessage: true)); - } - List dartTypeArguments = []; - for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) { - dartTypeArguments.add(typeBuilder.build( - libraryBuilder, TypeUse.constructorTypeArgument)); - } - assert(forest.argumentsTypeArguments(arguments).isEmpty); - forest.argumentsSetTypeArguments(arguments, dartTypeArguments); + switch (type) { + case ClassBuilder(): + List? unaliasedTypeArgumentBuilders = + aliasBuilder.unaliasTypeArguments(const []); + if (unaliasedTypeArgumentBuilders == null) { + // TODO(eernst): This is a wrong number of type arguments, + // occurring indirectly (in an alias of an alias, etc.). + return evaluateArgumentsBefore( + arguments, + buildProblem( + fasta.templateTypeArgumentMismatch + .withArguments(numberOfTypeParameters), + nameToken.charOffset, + nameToken.length, + suppressMessage: true)); + } + List dartTypeArguments = []; + for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) { + dartTypeArguments.add(typeBuilder.build( + libraryBuilder, TypeUse.constructorTypeArgument)); + } + assert(forest.argumentsTypeArguments(arguments).isEmpty); + forest.argumentsSetTypeArguments(arguments, dartTypeArguments); + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } } } @@ -6482,57 +6494,69 @@ class BodyBuilder extends StackListenerImpl typeToCheck, typeEnvironment, uri, charOffset, allowSuperBounded: false); - if (type is ClassBuilder) { - if (typeArguments != null) { - int numberOfTypeParameters = aliasBuilder.typeVariables?.length ?? 0; - if (numberOfTypeParameters != typeArgumentBuilders.length) { - // TODO(eernst): Use position of type arguments, not nameToken. - return evaluateArgumentsBefore( - arguments, - buildProblem( - fasta.templateTypeArgumentMismatch - .withArguments(numberOfTypeParameters), - nameToken.charOffset, - nameToken.length)); - } - List? unaliasedTypeArgumentBuilders = - aliasBuilder.unaliasTypeArguments(typeArgumentBuilders); - if (unaliasedTypeArgumentBuilders == null) { - // TODO(eernst): This is a wrong number of type arguments, - // occurring indirectly (in an alias of an alias, etc.). - return evaluateArgumentsBefore( - arguments, - buildProblem( - fasta.templateTypeArgumentMismatch - .withArguments(numberOfTypeParameters), - nameToken.charOffset, - nameToken.length, - suppressMessage: true)); - } - List dartTypeArguments = []; - for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) { - dartTypeArguments.add(typeBuilder.build( - libraryBuilder, TypeUse.constructorTypeArgument)); - } - assert(forest.argumentsTypeArguments(arguments).isEmpty); - forest.argumentsSetTypeArguments(arguments, dartTypeArguments); - } else { - ClassBuilder cls = type; - if (cls.typeVariables?.isEmpty ?? true) { + switch (type) { + case ClassBuilder(): + if (typeArguments != null) { + int numberOfTypeParameters = + aliasBuilder.typeVariables?.length ?? 0; + if (numberOfTypeParameters != typeArgumentBuilders.length) { + // TODO(eernst): Use position of type arguments, not nameToken. + return evaluateArgumentsBefore( + arguments, + buildProblem( + fasta.templateTypeArgumentMismatch + .withArguments(numberOfTypeParameters), + nameToken.charOffset, + nameToken.length)); + } + List? unaliasedTypeArgumentBuilders = + aliasBuilder.unaliasTypeArguments(typeArgumentBuilders); + if (unaliasedTypeArgumentBuilders == null) { + // TODO(eernst): This is a wrong number of type arguments, + // occurring indirectly (in an alias of an alias, etc.). + return evaluateArgumentsBefore( + arguments, + buildProblem( + fasta.templateTypeArgumentMismatch + .withArguments(numberOfTypeParameters), + nameToken.charOffset, + nameToken.length, + suppressMessage: true)); + } + List dartTypeArguments = []; + for (TypeBuilder typeBuilder in unaliasedTypeArgumentBuilders) { + dartTypeArguments.add(typeBuilder.build( + libraryBuilder, TypeUse.constructorTypeArgument)); + } assert(forest.argumentsTypeArguments(arguments).isEmpty); - forest.argumentsSetTypeArguments(arguments, []); + forest.argumentsSetTypeArguments(arguments, dartTypeArguments); } else { - if (forest.argumentsTypeArguments(arguments).isEmpty) { - // No type arguments provided to unaliased class, use defaults. - List result = new List.generate( - cls.typeVariables!.length, - (int i) => cls.typeVariables![i].defaultType!.build( - cls.libraryBuilder, TypeUse.constructorTypeArgument), - growable: true); - forest.argumentsSetTypeArguments(arguments, result); + ClassBuilder cls = type; + if (cls.typeVariables?.isEmpty ?? true) { + assert(forest.argumentsTypeArguments(arguments).isEmpty); + forest.argumentsSetTypeArguments(arguments, []); + } else { + if (forest.argumentsTypeArguments(arguments).isEmpty) { + // No type arguments provided to unaliased class, use defaults. + List result = new List.generate( + cls.typeVariables!.length, + (int i) => cls.typeVariables![i].defaultType!.build( + cls.libraryBuilder, TypeUse.constructorTypeArgument), + growable: true); + forest.argumentsSetTypeArguments(arguments, result); + } } } - } + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } } else { if (typeArguments != null && !isTypeArgumentsInForest) { @@ -6544,80 +6568,86 @@ class BodyBuilder extends StackListenerImpl allowPotentiallyConstantType: false)); } } - if (type is ClassBuilder) { - MemberBuilder? b = - type.findConstructorOrFactory(name, charOffset, uri, libraryBuilder); - Member? target; - if (b == null) { - // Not found. Reported below. - } else if (b is AmbiguousMemberBuilder) { - message = b.message.withLocation(uri, charOffset, noLength); - } else if (b.isConstructor) { - if (type.isAbstract) { - return evaluateArgumentsBefore( - arguments, - buildAbstractClassInstantiationError( - fasta.templateAbstractClassInstantiation - .withArguments(type.name), - type.name, - nameToken.charOffset)); + switch (type) { + case ClassBuilder(): + MemberBuilder? b = type.findConstructorOrFactory( + name, charOffset, uri, libraryBuilder); + Member? target; + if (b == null) { + // Not found. Reported below. + } else if (b is AmbiguousMemberBuilder) { + message = b.message.withLocation(uri, charOffset, noLength); + } else if (b.isConstructor) { + if (type.isAbstract) { + return evaluateArgumentsBefore( + arguments, + buildAbstractClassInstantiationError( + fasta.templateAbstractClassInstantiation + .withArguments(type.name), + type.name, + nameToken.charOffset)); + } + target = b.member; + } else { + target = b.member; } - target = b.member; - } else { - target = b.member; - } - if (type.isEnum && - !(libraryFeatures.enhancedEnums.isEnabled && - target is Procedure && - target.kind == ProcedureKind.Factory)) { - return buildProblem(fasta.messageEnumInstantiation, - nameToken.charOffset, nameToken.length); - } - if (target is Constructor || - (target is Procedure && target.kind == ProcedureKind.Factory)) { - Expression invocation; + if (type.isEnum && + !(libraryFeatures.enhancedEnums.isEnabled && + target is Procedure && + target.kind == ProcedureKind.Factory)) { + return buildProblem(fasta.messageEnumInstantiation, + nameToken.charOffset, nameToken.length); + } + if (target is Constructor || + (target is Procedure && target.kind == ProcedureKind.Factory)) { + Expression invocation; - invocation = buildStaticInvocation(target!, arguments, - constness: constness, - charOffset: nameToken.charOffset, - charLength: nameToken.length, - typeAliasBuilder: typeAliasBuilder as TypeAliasBuilder?, - isConstructorInvocation: true); - return invocation; - } else { - errorName ??= debugName(type.name, name); - } - } else if (type is ExtensionTypeDeclarationBuilder) { - MemberBuilder? b = - type.findConstructorOrFactory(name, charOffset, uri, libraryBuilder); - Member? target; - if (b == null) { - // Not found. Reported below. - } else if (b is AmbiguousMemberBuilder) { - message = b.message.withLocation(uri, charOffset, noLength); - } else { - target = b.member; - } - if (target != null) { - return buildStaticInvocation(target, arguments, - constness: constness, - charOffset: nameToken.charOffset, - charLength: nameToken.length, - typeAliasBuilder: typeAliasBuilder as TypeAliasBuilder?, - isConstructorInvocation: true); - } else { - errorName ??= debugName(type.name, name); - } - } else if (type is InvalidTypeDeclarationBuilder) { - LocatedMessage message = type.message; - return evaluateArgumentsBefore( - arguments, - buildProblem(message.messageObject, nameToken.charOffset, - nameToken.lexeme.length)); - } else { - errorName ??= debugName(type!.fullNameForErrors, name); + invocation = buildStaticInvocation(target!, arguments, + constness: constness, + charOffset: nameToken.charOffset, + charLength: nameToken.length, + typeAliasBuilder: typeAliasBuilder as TypeAliasBuilder?, + isConstructorInvocation: true); + return invocation; + } else { + errorName ??= debugName(type.name, name); + } + case ExtensionTypeDeclarationBuilder(): + MemberBuilder? b = type.findConstructorOrFactory( + name, charOffset, uri, libraryBuilder); + Member? target; + if (b == null) { + // Not found. Reported below. + } else if (b is AmbiguousMemberBuilder) { + message = b.message.withLocation(uri, charOffset, noLength); + } else { + target = b.member; + } + if (target != null) { + return buildStaticInvocation(target, arguments, + constness: constness, + charOffset: nameToken.charOffset, + charLength: nameToken.length, + typeAliasBuilder: typeAliasBuilder as TypeAliasBuilder?, + isConstructorInvocation: true); + } else { + errorName ??= debugName(type.name, name); + } + case InvalidTypeDeclarationBuilder(): + LocatedMessage message = type.message; + return evaluateArgumentsBefore( + arguments, + buildProblem(message.messageObject, nameToken.charOffset, + nameToken.lexeme.length)); + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: + errorName ??= debugName(type!.fullNameForErrors, name); } - return buildUnresolvedError(errorName, nameLastToken.charOffset, arguments: arguments, message: message, kind: unresolvedKind); } diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart index 19a99187d23..cb6b86797c1 100644 --- a/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart +++ b/pkg/front_end/lib/src/fasta/kernel/body_builder_context.dart @@ -8,9 +8,8 @@ import 'package:kernel/core_types.dart'; import 'package:kernel/transformations/flags.dart'; import '../builder/builder.dart'; -import '../builder/declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/named_type_builder.dart'; import '../builder/type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart index b86d38ffd03..67084ed671d 100644 --- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart +++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart @@ -14,21 +14,14 @@ import 'package:kernel/text/ast_to_text.dart'; import 'package:kernel/type_algebra.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/declaration_builder.dart'; -import '../builder/extension_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/named_type_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/prefix_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../constant_context.dart' show ConstantContext; import '../fasta_codes.dart'; import '../names.dart' @@ -3155,10 +3148,22 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { usedAsClassCharOffset: this.fileOffset, usedAsClassFileUri: _uri); - bool isConstructorTearOff = send is PropertySelector && - _helper.libraryFeatures.constructorTearoffs.isEnabled && - declarationBuilder is ClassBuilder || - declarationBuilder is ExtensionTypeDeclarationBuilder; + bool supportsConstructorTearOff = + _helper.libraryFeatures.constructorTearoffs.isEnabled && + switch (declarationBuilder) { + ClassBuilder() => true, + ExtensionBuilder() => false, + ExtensionTypeDeclarationBuilder() => true, + TypeAliasBuilder() => false, + TypeVariableBuilder() => false, + InvalidTypeDeclarationBuilder() => false, + BuiltinTypeDeclarationBuilder() => false, + // TODO(johnniwinther): How should we handle this case? + OmittedTypeDeclarationBuilder() => false, + null => false, + }; + bool isConstructorTearOff = + send is PropertySelector && supportsConstructorTearOff; List? aliasedTypeArguments = typeArguments ?.map((unknownType) => _helper.validateTypeVariableUse(unknownType, allowPotentiallyConstantType: isConstructorTearOff)) @@ -3209,10 +3214,16 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { } } if (declarationBuilder is DeclarationBuilder) { - DeclarationBuilder declaration = declarationBuilder; - Builder? member = declaration.findStaticBuilder( + Builder? member = declarationBuilder.findStaticBuilder( name.text, nameOffset, _uri, _helper.libraryBuilder); Generator generator; + bool supportsConstructorTearOff = + _helper.libraryFeatures.constructorTearoffs.isEnabled && + switch (declarationBuilder) { + ClassBuilder() => true, + ExtensionBuilder() => false, + ExtensionTypeDeclarationBuilder() => true, + }; if (member == null) { // If we find a setter, [member] is an [AccessErrorBuilder], not null. if (send is PropertySelector) { @@ -3221,9 +3232,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { "Unexpected non-null typeArguments of " "an IncompletePropertyAccessGenerator object: " "'${send.typeArguments.runtimeType}'."); - if (_helper.libraryFeatures.constructorTearoffs.isEnabled && - declarationBuilder is ClassBuilder || - declarationBuilder is ExtensionTypeDeclarationBuilder) { + if (supportsConstructorTearOff) { MemberBuilder? constructor = declarationBuilder.findConstructorOrFactory( name.text, nameOffset, _uri, _helper.libraryBuilder); @@ -3270,17 +3279,20 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { // fallback, as the error is reported during a check on the // typedef. builtTypeArguments = []; - if (declarationBuilder is ClassBuilder) { - for (TypeParameter typeParameter - in declarationBuilder.cls.typeParameters) { - builtTypeArguments.add(typeParameter.defaultType); - } - } else { - declarationBuilder as ExtensionTypeDeclarationBuilder; - for (TypeParameter typeParameter in declarationBuilder - .extensionTypeDeclaration.typeParameters) { - builtTypeArguments.add(typeParameter.defaultType); - } + switch (declarationBuilder) { + case ClassBuilder(): + for (TypeParameter typeParameter + in declarationBuilder.cls.typeParameters) { + builtTypeArguments.add(typeParameter.defaultType); + } + case ExtensionTypeDeclarationBuilder(): + for (TypeParameter typeParameter in declarationBuilder + .extensionTypeDeclaration.typeParameters) { + builtTypeArguments.add(typeParameter.defaultType); + } + case ExtensionBuilder(): + throw new UnsupportedError( + "Unexpected declaration $declarationBuilder"); } } else { builtTypeArguments = unaliasTypes( @@ -3353,7 +3365,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { unresolvedReadKind: UnresolvedKind.Member); } else { return _helper.buildConstructorInvocation( - declaration, + declarationBuilder, send.token, send.token, arguments!, @@ -3380,13 +3392,13 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator { setter = member; member = null; } else if (member.isGetter) { - setter = declaration.findStaticBuilder( + setter = declarationBuilder.findStaticBuilder( name.text, fileOffset, _uri, _helper.libraryBuilder, isSetter: true); } else if (member.isField) { MemberBuilder fieldBuilder = member as MemberBuilder; if (!fieldBuilder.isAssignable) { - setter = declaration.findStaticBuilder( + setter = declarationBuilder.findStaticBuilder( name.text, fileOffset, _uri, _helper.libraryBuilder, isSetter: true); } else { diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart index 2ab6eea3f1a..a885114adb4 100644 --- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart +++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart @@ -11,11 +11,11 @@ import 'package:kernel/type_environment.dart'; import '../../api_prototype/experimental_flags.dart'; import '../builder/builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/named_type_builder.dart'; import '../builder/prefix_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; import '../constant_context.dart' show ConstantContext; import '../fasta_codes.dart' show LocatedMessage; import '../messages.dart' show Message; diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart index 8c55f436de0..da6fdef85bf 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/class_member.dart @@ -6,7 +6,7 @@ library fasta.class_hierarchy_builder; import 'package:kernel/ast.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../messages.dart' show LocatedMessage, diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart index 1b2a2e7dc43..de6f4edde1a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_builder.dart @@ -11,8 +11,7 @@ import 'package:kernel/core_types.dart' show CoreTypes; import 'package:kernel/src/types.dart' show Types; import 'package:kernel/type_algebra.dart' show Substitution, uniteNullabilities; -import '../../builder/class_builder.dart'; -import '../../builder/extension_type_declaration_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../loader.dart' show Loader; import '../../source/source_class_builder.dart'; import '../../source/source_extension_type_declaration_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart index c3c0d4c1f73..104115116eb 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/hierarchy_node.dart @@ -12,11 +12,9 @@ import 'package:kernel/type_algebra.dart' show Substitution; import '../../../testing/id_testing_utils.dart' show typeToText; import '../../builder/builder.dart'; -import '../../builder/class_builder.dart'; -import '../../builder/extension_type_declaration_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/library_builder.dart'; import '../../builder/named_type_builder.dart'; -import '../../builder/type_alias_builder.dart'; import '../../builder/type_builder.dart'; import '../../fasta_codes.dart'; import '../../source/source_library_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart index 86c1cffcb70..fc182c64dde 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart @@ -7,7 +7,7 @@ library fasta.class_hierarchy_builder; import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart' show ClassHierarchyMembers; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/type_builder.dart'; import '../../source/source_class_builder.dart'; import '../../source/source_field_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart index c8bba62d81a..0b9c873ee2a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart @@ -11,14 +11,12 @@ import 'package:kernel/src/nnbd_top_merge.dart'; import 'package:kernel/src/norm.dart'; import '../../../base/common.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/formal_parameter_builder.dart'; import '../../builder/library_builder.dart'; import '../../builder/member_builder.dart'; import '../../builder/omitted_type_builder.dart'; -import '../../builder/type_alias_builder.dart'; import '../../builder/type_builder.dart'; -import '../../builder/type_declaration_builder.dart'; import '../../messages.dart' show LocatedMessage, diff --git a/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart b/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart index ab97305b9f3..d76d37b11e2 100644 --- a/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart +++ b/pkg/front_end/lib/src/fasta/kernel/hierarchy/mixin_inferrer.dart @@ -9,7 +9,7 @@ import 'package:kernel/core_types.dart' show CoreTypes; import 'package:kernel/src/standard_bounds.dart'; import 'package:kernel/type_environment.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../messages.dart' show Message; import '../../type_inference/standard_bounds.dart' show TypeSchemaStandardBounds; diff --git a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart index 69c5f4924c1..f88efb0aec7 100644 --- a/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart +++ b/pkg/front_end/lib/src/fasta/kernel/internal_ast.dart @@ -25,7 +25,7 @@ import 'package:kernel/type_environment.dart'; import 'package:_fe_analyzer_shared/src/type_inference/type_analysis_result.dart' as shared; -import '../builder/type_alias_builder.dart'; +import '../builder/declaration_builders.dart'; import '../names.dart'; import '../problems.dart' show unsupported; import '../source/source_constructor_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart index 19f4c195377..864c410c21a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart @@ -23,22 +23,15 @@ import '../../api_prototype/file_system.dart' show FileSystem; import '../../base/nnbd_mode.dart'; import '../../base/processed_options.dart' show ProcessedOptions; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/dynamic_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/field_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/name_iterator.dart'; import '../builder/named_type_builder.dart'; -import '../builder/never_type_declaration_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/procedure_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; -import '../builder/void_type_declaration_builder.dart'; import '../compiler_context.dart' show CompilerContext; import '../crash.dart' show withCrashReporting; import '../dill/dill_target.dart' show DillTarget; @@ -923,67 +916,69 @@ class KernelTarget extends TargetImplementation { new Name(constructorTearOffName(""), indexedClass.library)); } - if (supertype is ClassBuilder) { - ClassBuilder superclassBuilder = supertype; - bool isConstructorAdded = false; - Map? substitutionMap; + switch (supertype) { + case ClassBuilder(): + ClassBuilder superclassBuilder = supertype; + bool isConstructorAdded = false; + Map? substitutionMap; - NameIterator iterator = - superclassBuilder.fullConstructorNameIterator(); - while (iterator.moveNext()) { - String name = iterator.name; - MemberBuilder memberBuilder = iterator.current; - if (memberBuilder.member is Constructor) { - substitutionMap ??= builder.getSubstitutionMap(superclassBuilder.cls); - Reference? constructorReference; - Reference? tearOffReference; - if (indexedClass != null) { - constructorReference = indexedClass - // We use the name of the member builder here since it refers to - // the library of the original declaration when private. For - // instance: - // - // // lib1: - // class Super { Super._() } - // class Subclass extends Class { - // Subclass() : super._(); - // } - // // lib2: - // class Mixin {} - // class Class = Super with Mixin; - // - // Here `super._()` in `Subclass` targets the forwarding stub - // added to `Class` whose name is `_` private to `lib1`. - .lookupConstructorReference(memberBuilder.member.name); - tearOffReference = indexedClass.lookupGetterReference( - new Name(constructorTearOffName(name), indexedClass.library)); + NameIterator iterator = + superclassBuilder.fullConstructorNameIterator(); + while (iterator.moveNext()) { + String name = iterator.name; + MemberBuilder memberBuilder = iterator.current; + if (memberBuilder.member is Constructor) { + substitutionMap ??= + builder.getSubstitutionMap(superclassBuilder.cls); + Reference? constructorReference; + Reference? tearOffReference; + if (indexedClass != null) { + constructorReference = indexedClass + // We use the name of the member builder here since it refers + // to the library of the original declaration when private. + // For instance: + // + // // lib1: + // class Super { Super._() } + // class Subclass extends Class { + // Subclass() : super._(); + // } + // // lib2: + // class Mixin {} + // class Class = Super with Mixin; + // + // Here `super._()` in `Subclass` targets the forwarding stub + // added to `Class` whose name is `_` private to `lib1`. + .lookupConstructorReference(memberBuilder.member.name); + tearOffReference = indexedClass.lookupGetterReference( + new Name(constructorTearOffName(name), indexedClass.library)); + } + builder.addSyntheticConstructor(_makeMixinApplicationConstructor( + builder, + builder.cls.mixin, + memberBuilder as MemberBuilderImpl, + substitutionMap, + constructorReference, + tearOffReference)); + isConstructorAdded = true; } - builder.addSyntheticConstructor(_makeMixinApplicationConstructor( - builder, - builder.cls.mixin, - memberBuilder as MemberBuilderImpl, - substitutionMap, - constructorReference, - tearOffReference)); - isConstructorAdded = true; } - } - if (!isConstructorAdded) { + if (!isConstructorAdded) { + builder.addSyntheticConstructor(_makeDefaultConstructor( + builder, constructorReference, tearOffReference)); + } + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case ExtensionTypeDeclarationBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: builder.addSyntheticConstructor(_makeDefaultConstructor( builder, constructorReference, tearOffReference)); - } - } else if (supertype is InvalidTypeDeclarationBuilder || - supertype is TypeVariableBuilder || - supertype is DynamicTypeDeclarationBuilder || - supertype is VoidTypeDeclarationBuilder || - supertype is NeverTypeDeclarationBuilder || - supertype is TypeAliasBuilder) { - builder.addSyntheticConstructor(_makeDefaultConstructor( - builder, constructorReference, tearOffReference)); - } else { - unhandled("${supertype.runtimeType}", "installForwardingConstructors", - builder.charOffset, builder.fileUri); } } diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart index 2b45df3e588..e42d2d49079 100644 --- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart +++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart @@ -11,7 +11,7 @@ import 'package:_fe_analyzer_shared/src/scanner/error_token.dart'; import 'package:_fe_analyzer_shared/src/scanner/token.dart'; import '../../builder/builder.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/member_builder.dart'; import '../../builder/metadata_builder.dart'; import '../../builder/prefix_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart index 75daa98d7cb..71b4fbdbcee 100644 --- a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart +++ b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart @@ -8,14 +8,12 @@ import 'package:_fe_analyzer_shared/src/macros/executor/introspection_impls.dart as macro; import 'package:kernel/ast.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/formal_parameter_builder.dart'; import '../../builder/library_builder.dart'; import '../../builder/member_builder.dart'; import '../../builder/nullability_builder.dart'; -import '../../builder/type_alias_builder.dart'; import '../../builder/type_builder.dart'; -import '../../builder/type_declaration_builder.dart'; import '../../uris.dart'; import 'macro.dart'; @@ -37,13 +35,26 @@ abstract class IdentifierImpl extends macro.IdentifierImpl { TypeDeclarationBuilder? typeDeclarationBuilder) { if (typeDeclarationBuilder != null) { Uri? uri; - if (typeDeclarationBuilder is ClassBuilder) { - uri = typeDeclarationBuilder.libraryBuilder.importUri; - } else if (typeDeclarationBuilder is TypeAliasBuilder) { - uri = typeDeclarationBuilder.libraryBuilder.importUri; - } else if (name == 'dynamic') { - uri = dartCore; + switch (typeDeclarationBuilder) { + case ClassBuilder(): + uri = typeDeclarationBuilder.libraryBuilder.importUri; + case TypeAliasBuilder(): + uri = typeDeclarationBuilder.libraryBuilder.importUri; + case TypeVariableBuilder(): + // TODO(johnniwinther): Handle this case. + case ExtensionBuilder(): + // TODO(johnniwinther): Handle this case. + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + if (name == 'dynamic') { + uri = dartCore; + } + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): } + return new macro.ResolvedIdentifier( kind: macro.IdentifierKind.topLevelMember, name: name, @@ -57,15 +68,24 @@ abstract class IdentifierImpl extends macro.IdentifierImpl { Future _resolveTypeDeclaration( MacroApplications macroApplications, TypeDeclarationBuilder? typeDeclarationBuilder) { - if (typeDeclarationBuilder is ClassBuilder) { - return new Future.value( - macroApplications.getClassDeclaration(typeDeclarationBuilder)); - } else if (typeDeclarationBuilder is TypeAliasBuilder) { - return new Future.value( - macroApplications.getTypeAliasDeclaration(typeDeclarationBuilder)); - } else { - return new Future.error( - new ArgumentError('Unable to resolve identifier $this')); + switch (typeDeclarationBuilder) { + case ClassBuilder(): + return new Future.value( + macroApplications.getClassDeclaration(typeDeclarationBuilder)); + case TypeAliasBuilder(): + return new Future.value( + macroApplications.getTypeAliasDeclaration(typeDeclarationBuilder)); + case TypeVariableBuilder(): + case ExtensionBuilder(): + case ExtensionTypeDeclarationBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: + // TODO(johnniwinther): Handle these cases. + return new Future.error( + new ArgumentError('Unable to resolve identifier $this')); } } } diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart index e6b667d4325..a2a27bb29e1 100644 --- a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart +++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart @@ -19,14 +19,12 @@ import 'package:kernel/type_environment.dart' show SubtypeCheckMode; import '../../../base/common.dart'; import '../../builder/builder.dart'; -import '../../builder/class_builder.dart'; +import '../../builder/declaration_builders.dart'; import '../../builder/formal_parameter_builder.dart'; import '../../builder/library_builder.dart'; import '../../builder/member_builder.dart'; import '../../builder/nullability_builder.dart'; -import '../../builder/type_alias_builder.dart'; import '../../builder/type_builder.dart'; -import '../../builder/type_declaration_builder.dart'; import '../../fasta_codes.dart'; import '../../identifiers.dart'; import '../../source/source_class_builder.dart'; @@ -427,8 +425,17 @@ class MacroApplications { } else if (identifier is TypeDeclarationBuilderIdentifier) { final TypeDeclarationBuilder typeDeclarationBuilder = identifier.typeDeclarationBuilder; - if (typeDeclarationBuilder is ClassBuilder) { - return getClassDeclaration(typeDeclarationBuilder); + switch (typeDeclarationBuilder) { + case ClassBuilder(): + return getClassDeclaration(typeDeclarationBuilder); + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case ExtensionTypeDeclarationBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): } throw new UnimplementedError( 'Resolving declarations is only supported for classes'); diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart index 966244be20c..11c1d4b0a4d 100644 --- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart +++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart @@ -10,21 +10,14 @@ import 'package:kernel/type_algebra.dart' show containsTypeVariable; import 'package:kernel/util/graph.dart' show Graph, computeStrongComponents; -import '../builder/builtin_type_declaration_builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/extension_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_type_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/named_type_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/record_type_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../dill/dill_class_builder.dart' show DillClassBuilder; @@ -71,63 +64,77 @@ int computeTypeVariableBuilderVariance(TypeVariableBuilder variable, } else { return Variance.unrelated; } - } else if (declaration is ClassBuilder) { - int result = Variance.unrelated; - if (arguments != null) { - for (int i = 0; i < arguments.length; ++i) { - result = Variance.meet( - result, - Variance.combine( - declaration.cls.typeParameters[i].variance, - computeTypeVariableBuilderVariance( - variable, arguments[i], libraryBuilder))); - } - } - return result; - } else if (declaration is TypeAliasBuilder) { - int result = Variance.unrelated; - - if (type.arguments != null) { - for (int i = 0; i < type.arguments!.length; ++i) { - const int visitMarker = -2; - - int declarationTypeVariableVariance = declaration.varianceAt(i); - if (declarationTypeVariableVariance == pendingVariance) { - assert(!declaration.fromDill); - TypeVariableBuilder declarationTypeVariable = - declaration.typeVariables![i]; - declarationTypeVariable.variance = visitMarker; - int computedVariance = computeTypeVariableBuilderVariance( - declarationTypeVariable, declaration.type, libraryBuilder); - declarationTypeVariableVariance = - declarationTypeVariable.variance = computedVariance; - } else if (declarationTypeVariableVariance == visitMarker) { - assert(!declaration.fromDill); - TypeVariableBuilder declarationTypeVariable = - declaration.typeVariables![i]; - libraryBuilder.addProblem( - templateCyclicTypedef.withArguments(declaration.name), - declaration.charOffset, - declaration.name.length, - declaration.fileUri); - // Use [Variance.unrelated] for recovery. The type with the - // cyclic dependency will be replaced with an [InvalidType] - // elsewhere. - declarationTypeVariableVariance = - declarationTypeVariable.variance = Variance.unrelated; + } else { + switch (declaration) { + case ClassBuilder(): + int result = Variance.unrelated; + if (arguments != null) { + for (int i = 0; i < arguments.length; ++i) { + result = Variance.meet( + result, + Variance.combine( + declaration.cls.typeParameters[i].variance, + computeTypeVariableBuilderVariance( + variable, arguments[i], libraryBuilder))); + } } + return result; + case TypeAliasBuilder(): + int result = Variance.unrelated; - result = Variance.meet( - result, - Variance.combine( - computeTypeVariableBuilderVariance( - variable, type.arguments![i], libraryBuilder), - declarationTypeVariableVariance)); - } + if (type.arguments != null) { + for (int i = 0; i < type.arguments!.length; ++i) { + const int visitMarker = -2; + + int declarationTypeVariableVariance = declaration.varianceAt(i); + if (declarationTypeVariableVariance == pendingVariance) { + assert(!declaration.fromDill); + TypeVariableBuilder declarationTypeVariable = + declaration.typeVariables![i]; + declarationTypeVariable.variance = visitMarker; + int computedVariance = computeTypeVariableBuilderVariance( + declarationTypeVariable, + declaration.type, + libraryBuilder); + declarationTypeVariableVariance = + declarationTypeVariable.variance = computedVariance; + } else if (declarationTypeVariableVariance == visitMarker) { + assert(!declaration.fromDill); + TypeVariableBuilder declarationTypeVariable = + declaration.typeVariables![i]; + libraryBuilder.addProblem( + templateCyclicTypedef.withArguments(declaration.name), + declaration.charOffset, + declaration.name.length, + declaration.fileUri); + // Use [Variance.unrelated] for recovery. The type with the + // cyclic dependency will be replaced with an [InvalidType] + // elsewhere. + declarationTypeVariableVariance = + declarationTypeVariable.variance = Variance.unrelated; + } + + result = Variance.meet( + result, + Variance.combine( + computeTypeVariableBuilderVariance( + variable, type.arguments![i], libraryBuilder), + declarationTypeVariableVariance)); + } + } + return result; + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeVariableBuilder(): + case ExtensionBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } - return result; + return Variance.unrelated; } - return Variance.unrelated; case FunctionTypeBuilder( :List? typeVariables, :List? formals, @@ -274,72 +281,81 @@ TypeBuilder _substituteNamedTypeBuilder( if (arguments == null || arguments.length == 0) { return type; } + List? newArguments; - if (declaration == null) { - assert( - identical(upperSubstitution, lowerSubstitution), - "Can only handle unbound named type builders identical " - "`upperSubstitution` and `lowerSubstitution`."); - for (int i = 0; i < arguments.length; ++i) { - TypeBuilder substitutedArgument = substituteRange( - arguments[i], - upperSubstitution, - lowerSubstitution, - unboundTypes, - unboundTypeVariables, - variance: variance); - if (substitutedArgument != arguments[i]) { - newArguments ??= arguments.toList(); - newArguments[i] = substitutedArgument; + switch (declaration) { + case null: + assert( + identical(upperSubstitution, lowerSubstitution), + "Can only handle unbound named type builders identical " + "`upperSubstitution` and `lowerSubstitution`."); + for (int i = 0; i < arguments.length; ++i) { + TypeBuilder substitutedArgument = substituteRange( + arguments[i], + upperSubstitution, + lowerSubstitution, + unboundTypes, + unboundTypeVariables, + variance: variance); + if (substitutedArgument != arguments[i]) { + newArguments ??= arguments.toList(); + newArguments[i] = substitutedArgument; + } } - } - } else if (declaration is ClassBuilder) { - for (int i = 0; i < arguments.length; ++i) { - TypeBuilder substitutedArgument = substituteRange( - arguments[i], - upperSubstitution, - lowerSubstitution, - unboundTypes, - unboundTypeVariables, - variance: variance); - if (substitutedArgument != arguments[i]) { - newArguments ??= arguments.toList(); - newArguments[i] = substitutedArgument; + case ClassBuilder(): + for (int i = 0; i < arguments.length; ++i) { + TypeBuilder substitutedArgument = substituteRange( + arguments[i], + upperSubstitution, + lowerSubstitution, + unboundTypes, + unboundTypeVariables, + variance: variance); + if (substitutedArgument != arguments[i]) { + newArguments ??= arguments.toList(); + newArguments[i] = substitutedArgument; + } } - } - } else if (declaration is ExtensionTypeDeclarationBuilder) { - for (int i = 0; i < arguments.length; ++i) { - TypeBuilder substitutedArgument = substituteRange( - arguments[i], - upperSubstitution, - lowerSubstitution, - unboundTypes, - unboundTypeVariables, - variance: variance); - if (substitutedArgument != arguments[i]) { - newArguments ??= arguments.toList(); - newArguments[i] = substitutedArgument; + case ExtensionTypeDeclarationBuilder(): + for (int i = 0; i < arguments.length; ++i) { + TypeBuilder substitutedArgument = substituteRange( + arguments[i], + upperSubstitution, + lowerSubstitution, + unboundTypes, + unboundTypeVariables, + variance: variance); + if (substitutedArgument != arguments[i]) { + newArguments ??= arguments.toList(); + newArguments[i] = substitutedArgument; + } } - } - } else if (declaration is TypeAliasBuilder) { - for (int i = 0; i < arguments.length; ++i) { - TypeVariableBuilder variable = declaration.typeVariables![i]; - TypeBuilder substitutedArgument = substituteRange( - arguments[i], - upperSubstitution, - lowerSubstitution, - unboundTypes, - unboundTypeVariables, - variance: Variance.combine(variance, variable.variance)); - if (substitutedArgument != arguments[i]) { - newArguments ??= arguments.toList(); - newArguments[i] = substitutedArgument; + case TypeAliasBuilder(): + for (int i = 0; i < arguments.length; ++i) { + TypeVariableBuilder variable = declaration.typeVariables![i]; + TypeBuilder substitutedArgument = substituteRange( + arguments[i], + upperSubstitution, + lowerSubstitution, + unboundTypes, + unboundTypeVariables, + variance: Variance.combine(variance, variable.variance)); + if (substitutedArgument != arguments[i]) { + newArguments ??= arguments.toList(); + newArguments[i] = substitutedArgument; + } } - } - } else if (declaration is InvalidTypeDeclarationBuilder) { - // Don't substitute. - } else { - assert(false, "Unexpected named type builder declaration: $declaration."); + case TypeVariableBuilder(): + // Handled above. + throw new UnsupportedError("Unexpected TypeVariableBuilder"); + case InvalidTypeDeclarationBuilder(): + // Don't substitute. + break; + case ExtensionBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + assert(false, "Unexpected named type builder declaration: $declaration."); } if (newArguments != null) { NamedTypeBuilder newTypeBuilder = type.withArguments(newArguments); @@ -767,69 +783,83 @@ List findRawTypesWithInboundReferences(TypeBuilder? type) { :List? arguments ): if (arguments == null) { - if (declaration is DillClassBuilder) { - bool hasInbound = false; - List typeParameters = declaration.cls.typeParameters; - for (int i = 0; i < typeParameters.length && !hasInbound; ++i) { - if (containsTypeVariable( - typeParameters[i].bound, typeParameters.toSet())) { - hasInbound = true; - } - } - if (hasInbound) { - typesAndDependencies.add(type); - typesAndDependencies.add(const []); - } - } else if (declaration is DillTypeAliasBuilder) { - bool hasInbound = false; - List typeParameters = - declaration.typedef.typeParameters; - for (int i = 0; i < typeParameters.length && !hasInbound; ++i) { - if (containsTypeVariable( - typeParameters[i].bound, typeParameters.toSet())) { - hasInbound = true; - } - } - if (hasInbound) { - typesAndDependencies.add(type); - typesAndDependencies.add(const []); - } - } else if (declaration is ClassBuilder && - declaration.typeVariables != null) { - List dependencies = - findInboundReferences(declaration.typeVariables!); - if (dependencies.length != 0) { - typesAndDependencies.add(type); - typesAndDependencies.add(dependencies); - } - } else if (declaration is ExtensionTypeDeclarationBuilder && - declaration.typeParameters != null) { - List dependencies = - findInboundReferences(declaration.typeParameters!); - if (dependencies.length != 0) { - typesAndDependencies.add(type); - typesAndDependencies.add(dependencies); - } - } else if (declaration is TypeAliasBuilder) { - if (declaration.typeVariables != null) { - List dependencies = - findInboundReferences(declaration.typeVariables!); - if (dependencies.length != 0) { - typesAndDependencies.add(type); - typesAndDependencies.add(dependencies); - } - } - if (declaration.type is FunctionTypeBuilder) { - FunctionTypeBuilder type = declaration.type as FunctionTypeBuilder; - if (type.typeVariables != null) { + switch (declaration) { + case ClassBuilder(): + if (declaration is DillClassBuilder) { + bool hasInbound = false; + List typeParameters = + declaration.cls.typeParameters; + for (int i = 0; i < typeParameters.length && !hasInbound; ++i) { + if (containsTypeVariable( + typeParameters[i].bound, typeParameters.toSet())) { + hasInbound = true; + } + } + if (hasInbound) { + typesAndDependencies.add(type); + typesAndDependencies.add(const []); + } + } else if (declaration.typeVariables != null) { List dependencies = - findInboundReferences(type.typeVariables!); + findInboundReferences(declaration.typeVariables!); if (dependencies.length != 0) { typesAndDependencies.add(type); typesAndDependencies.add(dependencies); } } - } + case TypeAliasBuilder(): + if (declaration is DillTypeAliasBuilder) { + bool hasInbound = false; + List typeParameters = + declaration.typedef.typeParameters; + for (int i = 0; i < typeParameters.length && !hasInbound; ++i) { + if (containsTypeVariable( + typeParameters[i].bound, typeParameters.toSet())) { + hasInbound = true; + } + } + if (hasInbound) { + typesAndDependencies.add(type); + typesAndDependencies.add(const []); + } + } else { + if (declaration.typeVariables != null) { + List dependencies = + findInboundReferences(declaration.typeVariables!); + if (dependencies.length != 0) { + typesAndDependencies.add(type); + typesAndDependencies.add(dependencies); + } + } + if (declaration.type is FunctionTypeBuilder) { + FunctionTypeBuilder type = + declaration.type as FunctionTypeBuilder; + if (type.typeVariables != null) { + List dependencies = + findInboundReferences(type.typeVariables!); + if (dependencies.length != 0) { + typesAndDependencies.add(type); + typesAndDependencies.add(dependencies); + } + } + } + } + case ExtensionTypeDeclarationBuilder(): + if (declaration.typeParameters != null) { + List dependencies = + findInboundReferences(declaration.typeParameters!); + if (dependencies.length != 0) { + typesAndDependencies.add(type); + typesAndDependencies.add(dependencies); + } + } + case TypeVariableBuilder(): + case ExtensionBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } } else { for (TypeBuilder argument in arguments) { @@ -1002,32 +1032,35 @@ List> findRawTypePathsToDeclaration( paths .add([new RawTypeCycleElement(start, null)]); } else if (visited.add(start.declaration!)) { - if (declaration is ClassBuilder) { - visitTypeVariables(declaration.typeVariables); - } else if (declaration is TypeAliasBuilder) { - visitTypeVariables(declaration.typeVariables); - if (declaration.type is FunctionTypeBuilder) { - FunctionTypeBuilder type = - declaration.type as FunctionTypeBuilder; - visitTypeVariables(type.typeVariables); - } - } else if (declaration is ExtensionBuilder) { - visitTypeVariables(declaration.typeParameters); - } else if (declaration is ExtensionTypeDeclarationBuilder) { - visitTypeVariables(declaration.typeParameters); - } else if (declaration is TypeVariableBuilder) { - // Do nothing. The type variable is handled by its parent - // declaration. - } else if (declaration is BuiltinTypeDeclarationBuilder) { - // Do nothing. - } else if (declaration is InvalidTypeDeclarationBuilder) { - // Do nothing. - } else { - unhandled( - '$declaration (${declaration.runtimeType})', - 'findRawTypePathsToDeclaration', - declaration?.charOffset ?? -1, - declaration?.fileUri); + switch (declaration) { + case ClassBuilder(): + visitTypeVariables(declaration.typeVariables); + case TypeAliasBuilder(): + visitTypeVariables(declaration.typeVariables); + if (declaration.type is FunctionTypeBuilder) { + FunctionTypeBuilder type = + declaration.type as FunctionTypeBuilder; + visitTypeVariables(type.typeVariables); + } + case ExtensionBuilder(): + visitTypeVariables(declaration.typeParameters); + case ExtensionTypeDeclarationBuilder(): + visitTypeVariables(declaration.typeParameters); + case TypeVariableBuilder(): + // Do nothing. The type variable is handled by its parent + // declaration. + break; + case InvalidTypeDeclarationBuilder(): + // Do nothing. + break; + case BuiltinTypeDeclarationBuilder(): + // Do nothing. + break; + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: + // Do nothing. + break; } visited.remove(declaration); } diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart index 0add5a9b5eb..9ce14d1e93a 100644 --- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart +++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart @@ -9,9 +9,8 @@ import 'package:_fe_analyzer_shared/src/parser/parser.dart' import 'package:kernel/ast.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/dynamic_type_declaration_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; import '../builder/fixed_type_builder.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_type_builder.dart'; @@ -22,7 +21,6 @@ import '../builder/null_type_declaration_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/record_type_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../builder/void_type_declaration_builder.dart'; import '../kernel/utils.dart'; diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart index 61660c8d107..78195d5c47d 100644 --- a/pkg/front_end/lib/src/fasta/kernel/utils.dart +++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart @@ -16,13 +16,13 @@ import 'package:kernel/clone.dart'; import 'package:kernel/binary/ast_to_binary.dart'; import 'package:kernel/text/ast_to_text.dart'; +import '../builder/declaration_builders.dart'; import '../builder/fixed_type_builder.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/record_type_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../combinator.dart'; import '../configuration.dart'; import '../identifiers.dart'; diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart index b543ba7457f..b8fac25c2bf 100644 --- a/pkg/front_end/lib/src/fasta/loader.dart +++ b/pkg/front_end/lib/src/fasta/loader.dart @@ -8,8 +8,7 @@ import 'package:_fe_analyzer_shared/src/messages/severity.dart' show Severity; import 'package:kernel/ast.dart' show Class, DartType, ExtensionTypeDeclaration; -import 'builder/class_builder.dart'; -import 'builder/extension_type_declaration_builder.dart'; +import 'builder/declaration_builders.dart'; import 'builder/library_builder.dart'; import 'builder/type_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart index 2586eecf942..0f9e4ce02d0 100644 --- a/pkg/front_end/lib/src/fasta/scope.dart +++ b/pkg/front_end/lib/src/fasta/scope.dart @@ -9,13 +9,11 @@ import 'package:kernel/class_hierarchy.dart'; import 'package:kernel/type_environment.dart'; import 'builder/builder.dart'; -import 'builder/class_builder.dart'; -import 'builder/extension_builder.dart'; +import 'builder/declaration_builders.dart'; import 'builder/library_builder.dart'; import 'builder/member_builder.dart'; import 'builder/metadata_builder.dart'; import 'builder/name_iterator.dart'; -import 'builder/type_variable_builder.dart'; import 'fasta_codes.dart'; import 'kernel/body_builder.dart' show JumpTarget; import 'kernel/body_builder_context.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/class_declaration.dart b/pkg/front_end/lib/src/fasta/source/class_declaration.dart index 2e99986ab7d..baf60fa5606 100644 --- a/pkg/front_end/lib/src/fasta/source/class_declaration.dart +++ b/pkg/front_end/lib/src/fasta/source/class_declaration.dart @@ -5,10 +5,8 @@ import 'package:kernel/ast.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; import '../builder/constructor_reference_builder.dart'; -import '../builder/declaration_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/function_builder.dart'; import '../builder/member_builder.dart'; import '../builder/name_iterator.dart'; @@ -27,7 +25,7 @@ import 'source_library_builder.dart'; // TODO(johnniwinther): Should this be renamed now that inline classes are // renamed to extension type declarations? abstract class ClassDeclaration - implements DeclarationBuilder, ClassMemberAccess { + implements IDeclarationBuilder, ClassMemberAccess { @override SourceLibraryBuilder get libraryBuilder; diff --git a/pkg/front_end/lib/src/fasta/source/diet_listener.dart b/pkg/front_end/lib/src/fasta/source/diet_listener.dart index 23e32ea601d..1aff11a892a 100644 --- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart +++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart @@ -22,9 +22,7 @@ import 'package:kernel/class_hierarchy.dart' show ClassHierarchy; import 'package:kernel/core_types.dart' show CoreTypes; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/declaration_builder.dart'; -import '../builder/extension_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/modifier_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart index f846f8ea287..55f86d8b029 100644 --- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart @@ -27,10 +27,10 @@ import 'package:kernel/ast.dart' import '../../api_prototype/experimental_flags.dart'; import '../../api_prototype/lowering_predicates.dart'; import '../builder/constructor_reference_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/fixed_type_builder.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/invalid_type_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/mixin_application_builder.dart'; import '../builder/named_type_builder.dart'; @@ -38,7 +38,6 @@ import '../builder/nullability_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/record_type_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../combinator.dart' show CombinatorBuilder; import '../configuration.dart' show Configuration; import '../fasta_codes.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_builder_mixins.dart b/pkg/front_end/lib/src/fasta/source/source_builder_mixins.dart index 19189ae1a92..3f67f455c06 100644 --- a/pkg/front_end/lib/src/fasta/source/source_builder_mixins.dart +++ b/pkg/front_end/lib/src/fasta/source/source_builder_mixins.dart @@ -8,8 +8,7 @@ import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; import '../builder/builder_mixins.dart'; -import '../builder/class_builder.dart'; -import '../builder/declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/procedure_builder.dart'; @@ -26,8 +25,7 @@ import 'source_library_builder.dart'; import 'source_member_builder.dart'; import 'source_procedure_builder.dart'; -mixin SourceDeclarationBuilderMixin - implements DeclarationBuilder, DeclarationBuilderMixin { +mixin SourceDeclarationBuilderMixin implements DeclarationBuilderMixin { @override SourceLibraryBuilder get libraryBuilder; diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart index afa469b18d9..f199453e26e 100644 --- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart @@ -22,9 +22,8 @@ import 'package:kernel/type_algebra.dart' import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/constructor_reference_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; @@ -32,10 +31,7 @@ import '../builder/name_iterator.dart'; import '../builder/named_type_builder.dart'; import '../builder/never_type_declaration_builder.dart'; import '../builder/nullability_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../builder/void_type_declaration_builder.dart'; import '../fasta_codes.dart'; import '../kernel/body_builder_context.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart index b72d61c3f34..358202d0804 100644 --- a/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_constructor_builder.dart @@ -9,17 +9,13 @@ import 'package:kernel/type_algebra.dart'; import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; import '../builder/constructor_builder.dart'; -import '../builder/declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/omitted_type_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../constant_context.dart' show ConstantContext; import '../dill/dill_member_builder.dart'; import '../identifiers.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart index f963df54f7b..a9a9dca9c64 100644 --- a/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_enum_builder.dart @@ -15,8 +15,8 @@ import 'package:kernel/src/bounds_checks.dart'; import 'package:kernel/transformations/flags.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; import '../builder/constructor_reference_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; @@ -25,8 +25,6 @@ import '../builder/named_type_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/procedure_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../fasta_codes.dart' show LocatedMessage, diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart index b9dc20ff6ef..4e1eacdf61e 100644 --- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart @@ -6,11 +6,10 @@ import 'package:kernel/ast.dart'; import '../../base/common.dart'; import '../builder/builder.dart'; -import '../builder/extension_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../fasta_codes.dart' show messagePatchDeclarationMismatch, diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart index 103718a3e3f..02e427cf676 100644 --- a/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_extension_type_declaration_builder.dart @@ -13,16 +13,13 @@ import 'package:kernel/type_environment.dart'; import '../../base/common.dart'; import '../builder/builder.dart'; import '../builder/constructor_reference_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/name_iterator.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../kernel/hierarchy/hierarchy_builder.dart'; import '../kernel/kernel_helper.dart'; import '../messages.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart index c487f19cb8e..2a845850cc8 100644 --- a/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_factory_builder.dart @@ -9,11 +9,11 @@ import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; import '../builder/constructor_reference_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../dill/dill_member_builder.dart'; import '../fasta_codes.dart'; import '../identifiers.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart index fb83366fed3..dd926f3ff5c 100644 --- a/pkg/front_end/lib/src/fasta/source/source_field_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_field_builder.dart @@ -13,7 +13,7 @@ import 'package:kernel/type_algebra.dart'; import 'package:kernel/type_environment.dart'; import '../../api_prototype/lowering_predicates.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/field_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart index edf9ebcb43e..83536b70794 100644 --- a/pkg/front_end/lib/src/fasta/source/source_function_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_function_builder.dart @@ -9,9 +9,8 @@ import 'package:kernel/class_hierarchy.dart'; import '../../api_prototype/lowering_predicates.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; import '../builder/constructor_builder.dart'; -import '../builder/declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_builder.dart'; import '../builder/library_builder.dart'; @@ -19,7 +18,6 @@ import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../identifiers.dart'; import '../kernel/internal_ast.dart' show VariableDeclarationImpl; import '../kernel/kernel_helper.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart index f7807e1c836..1a0b24b11f1 100644 --- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart @@ -32,18 +32,14 @@ import 'package:kernel/type_environment.dart' import '../../api_prototype/experimental_flags.dart'; import '../../base/nnbd_mode.dart'; import '../builder/builder.dart'; -import '../builder/builtin_type_declaration_builder.dart'; -import '../builder/class_builder.dart'; import '../builder/constructor_reference_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/dynamic_type_declaration_builder.dart'; -import '../builder/extension_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; import '../builder/field_builder.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/function_builder.dart'; import '../builder/function_type_builder.dart'; import '../builder/inferable_type_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; @@ -56,10 +52,7 @@ import '../builder/omitted_type_builder.dart'; import '../builder/prefix_builder.dart'; import '../builder/procedure_builder.dart'; import '../builder/record_type_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../builder/void_type_declaration_builder.dart'; import '../combinator.dart' show CombinatorBuilder; import '../configuration.dart' show Configuration; @@ -1452,48 +1445,53 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { String name = iterator.name; Builder builder = iterator.current; if (builder.parent?.origin != origin) { - if (builder is DynamicTypeDeclarationBuilder) { - assert(name == 'dynamic', - "Unexpected export name for 'dynamic': '$name'"); - (unserializableExports ??= {})[name] = exportDynamicSentinel; - } else if (builder is NeverTypeDeclarationBuilder) { - assert( - name == 'Never', "Unexpected export name for 'Never': '$name'"); - (unserializableExports ??= {})[name] = exportNeverSentinel; - } else { - if (builder is InvalidTypeDeclarationBuilder) { - (unserializableExports ??= {})[name] = - builder.message.problemMessage; - } else { - if (builder is ClassBuilder) { + if (builder is TypeDeclarationBuilder) { + switch (builder) { + case ClassBuilder(): library.additionalExports.add(builder.cls.reference); - } else if (builder is ExtensionTypeDeclarationBuilder) { + case TypeAliasBuilder(): + library.additionalExports.add(builder.typedef.reference); + case ExtensionBuilder(): + library.additionalExports.add(builder.extension.reference); + case ExtensionTypeDeclarationBuilder(): library.additionalExports .add(builder.extensionTypeDeclaration.reference); - } else if (builder is TypeAliasBuilder) { - library.additionalExports.add(builder.typedef.reference); - } else if (builder is ExtensionBuilder) { - library.additionalExports.add(builder.extension.reference); - } else if (builder is MemberBuilder) { - for (Member exportedMember in builder.exportedMembers) { - if (exportedMember is Field) { - // For fields add both getter and setter references - // so replacing a field with a getter/setter pair still - // exports correctly. - library.additionalExports.add(exportedMember.getterReference); - if (exportedMember.hasSetter) { - library.additionalExports - .add(exportedMember.setterReference!); - } - } else { - library.additionalExports.add(exportedMember.reference); - } + case InvalidTypeDeclarationBuilder(): + (unserializableExports ??= {})[name] = + builder.message.problemMessage; + case BuiltinTypeDeclarationBuilder(): + if (builder is DynamicTypeDeclarationBuilder) { + assert(name == 'dynamic', + "Unexpected export name for 'dynamic': '$name'"); + (unserializableExports ??= {})[name] = exportDynamicSentinel; + } else if (builder is NeverTypeDeclarationBuilder) { + assert(name == 'Never', + "Unexpected export name for 'Never': '$name'"); + (unserializableExports ??= {})[name] = exportNeverSentinel; } - } else { + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case TypeVariableBuilder(): unhandled( 'member', 'exportScope', builder.charOffset, builder.fileUri); + } + } else if (builder is MemberBuilder) { + for (Member exportedMember in builder.exportedMembers) { + if (exportedMember is Field) { + // For fields add both getter and setter references + // so replacing a field with a getter/setter pair still + // exports correctly. + library.additionalExports.add(exportedMember.getterReference); + if (exportedMember.hasSetter) { + library.additionalExports.add(exportedMember.setterReference!); + } + } else { + library.additionalExports.add(exportedMember.reference); } } + } else { + unhandled( + 'member', 'exportScope', builder.charOffset, builder.fileUri); } } } @@ -2072,12 +2070,24 @@ class SourceLibraryBuilder extends LibraryBuilderImpl { } } else { typeVariablesByName[tv.name] = tv; - if (owner is ClassBuilder) { - // Only classes and type variables can't have the same name. See - // [#29555](https://github.com/dart-lang/sdk/issues/29555). - if (tv.name == owner.name) { - addProblem(messageTypeVariableSameNameAsEnclosing, tv.charOffset, - tv.name.length, fileUri); + if (owner is TypeDeclarationBuilder) { + switch (owner) { + case ClassBuilder(): + // Only classes and type variables can't have the same name. See + // [#29555](https://github.com/dart-lang/sdk/issues/29555). + if (tv.name == owner.name) { + addProblem(messageTypeVariableSameNameAsEnclosing, + tv.charOffset, tv.name.length, fileUri); + } + case ExtensionBuilder(): + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Should an error be reported here? + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): } } } diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart index 86df28f9a65..2450231bdec 100644 --- a/pkg/front_end/lib/src/fasta/source/source_loader.dart +++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart @@ -42,11 +42,8 @@ import '../../base/common.dart'; import '../../base/instrumentation.dart' show Instrumentation; import '../../base/nnbd_mode.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; -import '../builder/extension_builder.dart'; -import '../builder/extension_type_declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/inferable_type_builder.dart'; -import '../builder/invalid_type_declaration_builder.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/name_iterator.dart'; @@ -54,10 +51,7 @@ import '../builder/named_type_builder.dart'; import '../builder/nullability_builder.dart'; import '../builder/omitted_type_builder.dart'; import '../builder/prefix_builder.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../builder_graph.dart'; import '../denylisted_classes.dart' show denylistedCoreClasses, denylistedTypedDataClasses; @@ -1271,21 +1265,34 @@ severity: $severity Builder parent = libraryBuilder; if (enclosingClassOrExtension != null) { - Builder? cls = dietListener.memberScope + Builder? builder = dietListener.memberScope .lookup(enclosingClassOrExtension, -1, libraryBuilder.fileUri); - if (cls is ClassBuilder) { - parent = cls; - dietListener - ..currentDeclaration = cls - ..memberScope = cls.scope.copyWithParent( - dietListener.memberScope.withTypeVariables(cls.typeVariables), - "debugExpression in class $enclosingClassOrExtension"); - } else if (cls is ExtensionBuilder) { - parent = cls; - dietListener - ..currentDeclaration = cls - ..memberScope = cls.scope.copyWithParent(dietListener.memberScope, - "debugExpression in extension $enclosingClassOrExtension"); + if (builder is TypeDeclarationBuilder) { + switch (builder) { + case ClassBuilder(): + parent = builder; + dietListener + ..currentDeclaration = builder + ..memberScope = builder.scope.copyWithParent( + dietListener.memberScope + .withTypeVariables(builder.typeVariables), + "debugExpression in class $enclosingClassOrExtension"); + case ExtensionBuilder(): + parent = builder; + dietListener + ..currentDeclaration = builder + ..memberScope = builder.scope.copyWithParent( + dietListener.memberScope, + "debugExpression in extension $enclosingClassOrExtension"); + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + } } } SourceProcedureBuilder builder = new SourceProcedureBuilder( diff --git a/pkg/front_end/lib/src/fasta/source/source_member_builder.dart b/pkg/front_end/lib/src/fasta/source/source_member_builder.dart index c1a9c4e0271..68ab2f9f6c8 100644 --- a/pkg/front_end/lib/src/fasta/source/source_member_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_member_builder.dart @@ -10,7 +10,7 @@ import 'package:kernel/type_environment.dart'; import '../../base/common.dart'; import '../builder/builder.dart'; -import '../builder/declaration_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/member_builder.dart'; import '../kernel/body_builder_context.dart'; import '../kernel/kernel_helper.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart index 712cbf4df7e..04431896660 100644 --- a/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_procedure_builder.dart @@ -8,12 +8,12 @@ import 'package:kernel/type_algebra.dart'; import 'package:kernel/type_environment.dart'; import '../builder/builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/formal_parameter_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/procedure_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../kernel/augmentation_lowering.dart'; import '../kernel/hierarchy/class_member.dart'; import '../kernel/hierarchy/members_builder.dart'; diff --git a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart index 93d38a7b934..43cf2832173 100644 --- a/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart +++ b/pkg/front_end/lib/src/fasta/source/source_type_alias_builder.dart @@ -8,15 +8,12 @@ import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart'; import '../builder/builder.dart'; -import '../builder/class_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/library_builder.dart'; import '../builder/member_builder.dart'; import '../builder/metadata_builder.dart'; import '../builder/name_iterator.dart'; -import '../builder/type_alias_builder.dart'; import '../builder/type_builder.dart'; -import '../builder/type_declaration_builder.dart'; -import '../builder/type_variable_builder.dart'; import '../fasta_codes.dart' show noLength, templateCyclicTypedef, templateTypeArgumentMismatch; import '../kernel/body_builder_context.dart'; @@ -247,60 +244,72 @@ class SourceTypeAliasBuilder extends TypeAliasBuilderImpl { SourceLibraryBuilder libraryBuilder, void Function(Procedure) f) { TypeDeclarationBuilder? declaration = unaliasDeclaration(null); DartType? targetType = typedef.type; - if (declaration is ClassBuilder && - targetType is InterfaceType && - typedef.typeParameters.isNotEmpty && - !isProperRenameForClass(libraryBuilder.loader.typeEnvironment, typedef, - libraryBuilder.library)) { - tearOffs = {}; - _tearOffDependencies = {}; - NameIterator iterator = - declaration.fullConstructorNameIterator(); - while (iterator.moveNext()) { - String constructorName = iterator.name; - MemberBuilder builder = iterator.current; - Member? target = builder.invokeTarget; - if (target != null) { - if (target is Procedure && target.isRedirectingFactory) { - target = builder.readTarget!; - } - Class targetClass = target.enclosingClass!; - if (target is Constructor && targetClass.isAbstract) { - continue; - } - Name targetName = - new Name(constructorName, declaration.libraryBuilder.library); - Reference? tearOffReference; - if (libraryBuilder.referencesFromIndexed != null) { - Name tearOffName = new Name( - typedefTearOffName(name, constructorName), - libraryBuilder.referencesFromIndexed!.library); - tearOffReference = libraryBuilder.referencesFromIndexed! - .lookupGetterReference(tearOffName); - } + switch (declaration) { + case ClassBuilder(): + if (targetType is InterfaceType && + typedef.typeParameters.isNotEmpty && + !isProperRenameForClass(libraryBuilder.loader.typeEnvironment, + typedef, libraryBuilder.library)) { + tearOffs = {}; + _tearOffDependencies = {}; + NameIterator iterator = + declaration.fullConstructorNameIterator(); + while (iterator.moveNext()) { + String constructorName = iterator.name; + MemberBuilder builder = iterator.current; + Member? target = builder.invokeTarget; + if (target != null) { + if (target is Procedure && target.isRedirectingFactory) { + target = builder.readTarget!; + } + Class targetClass = target.enclosingClass!; + if (target is Constructor && targetClass.isAbstract) { + continue; + } + Name targetName = + new Name(constructorName, declaration.libraryBuilder.library); + Reference? tearOffReference; + if (libraryBuilder.referencesFromIndexed != null) { + Name tearOffName = new Name( + typedefTearOffName(name, constructorName), + libraryBuilder.referencesFromIndexed!.library); + tearOffReference = libraryBuilder.referencesFromIndexed! + .lookupGetterReference(tearOffName); + } - Procedure tearOff = tearOffs![targetName] = - createTypedefTearOffProcedure( - name, - constructorName, - libraryBuilder, - target.fileUri, - target.fileOffset, - tearOffReference); - _tearOffDependencies![tearOff] = target; + Procedure tearOff = tearOffs![targetName] = + createTypedefTearOffProcedure( + name, + constructorName, + libraryBuilder, + target.fileUri, + target.fileOffset, + tearOffReference); + _tearOffDependencies![tearOff] = target; - buildTypedefTearOffProcedure( - tearOff: tearOff, - declarationConstructor: target, - // TODO(johnniwinther): Handle patched constructors. - implementationConstructor: target, - enclosingClass: declaration.cls, - typeParameters: typedef.typeParameters, - typeArguments: targetType.typeArguments, - libraryBuilder: libraryBuilder); - f(tearOff); + buildTypedefTearOffProcedure( + tearOff: tearOff, + declarationConstructor: target, + // TODO(johnniwinther): Handle patched constructors. + implementationConstructor: target, + enclosingClass: declaration.cls, + typeParameters: typedef.typeParameters, + typeArguments: targetType.typeArguments, + libraryBuilder: libraryBuilder); + f(tearOff); + } + } } - } + case ExtensionTypeDeclarationBuilder(): + // TODO(johnniwinther): Handle this case. + case TypeAliasBuilder(): + case TypeVariableBuilder(): + case ExtensionBuilder(): + case InvalidTypeDeclarationBuilder(): + case BuiltinTypeDeclarationBuilder(): + // TODO(johnniwinther): How should we handle this case? + case OmittedTypeDeclarationBuilder(): + case null: } } } diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart index d769c8a88b7..817a0853da7 100644 --- a/pkg/front_end/lib/src/fasta/source/value_kinds.dart +++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart @@ -17,12 +17,12 @@ import 'package:_fe_analyzer_shared/src/util/value_kind.dart'; import 'package:kernel/ast.dart' as type; +import '../builder/declaration_builders.dart' as type; import '../builder/formal_parameter_builder.dart' as type; import '../builder/metadata_builder.dart' as type; import '../builder/mixin_application_builder.dart' as type; import '../builder/type_builder.dart' as type; import '../builder/record_type_builder.dart' as type; -import '../builder/type_variable_builder.dart' as type; import '../identifiers.dart' as type; diff --git a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart index 445a78bd90f..54026566688 100644 --- a/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart +++ b/pkg/front_end/lib/src/fasta/type_inference/inference_visitor_base.dart @@ -28,7 +28,7 @@ import '../../base/instrumentation.dart' import '../../base/nnbd_mode.dart'; import '../../testing/id_extractor.dart'; import '../../testing/id_testing_utils.dart'; -import '../builder/extension_builder.dart'; +import '../builder/declaration_builders.dart'; import '../builder/member_builder.dart'; import '../fasta_codes.dart'; import '../kernel/constructor_tearoff_lowering.dart'; diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart index 4b0cf9ea4c0..80ee8f0df98 100644 --- a/pkg/front_end/lib/src/testing/id_testing_utils.dart +++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart @@ -4,12 +4,10 @@ import 'package:kernel/ast.dart'; -import '../fasta/builder/class_builder.dart'; +import '../fasta/builder/declaration_builders.dart'; import '../fasta/builder/library_builder.dart'; import '../fasta/builder/member_builder.dart'; import '../fasta/builder/type_builder.dart'; -import '../fasta/builder/type_variable_builder.dart'; -import '../fasta/builder/extension_builder.dart'; import '../fasta/messages.dart'; import '../fasta/source/source_library_builder.dart'; import '../fasta/source/source_loader.dart'; diff --git a/pkg/front_end/test/explicit_creation_git_test.dart b/pkg/front_end/test/explicit_creation_git_test.dart index 7f86dbbf258..e643a18ac09 100644 --- a/pkg/front_end/test/explicit_creation_git_test.dart +++ b/pkg/front_end/test/explicit_creation_git_test.dart @@ -11,8 +11,8 @@ import 'package:front_end/src/api_prototype/file_system.dart' as api; import 'package:front_end/src/base/processed_options.dart'; import 'package:front_end/src/compute_platform_binaries_location.dart' show computePlatformBinariesLocation; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/builder/type_builder.dart'; -import 'package:front_end/src/fasta/builder/type_declaration_builder.dart'; import 'package:front_end/src/fasta/compiler_context.dart'; import 'package:front_end/src/fasta/constant_context.dart'; import 'package:front_end/src/fasta/dill/dill_target.dart'; diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart index c1ebe2fbdcd..9cf077dd445 100644 --- a/pkg/front_end/test/extensions/extensions_test.dart +++ b/pkg/front_end/test/extensions/extensions_test.dart @@ -8,13 +8,11 @@ import 'package:_fe_analyzer_shared/src/testing/features.dart'; import 'package:_fe_analyzer_shared/src/testing/id.dart'; import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'; import 'package:front_end/src/api_prototype/experimental_flags.dart'; -import 'package:front_end/src/fasta/builder/class_builder.dart'; -import 'package:front_end/src/fasta/builder/extension_builder.dart'; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/builder/formal_parameter_builder.dart'; import 'package:front_end/src/fasta/builder/library_builder.dart'; import 'package:front_end/src/fasta/builder/member_builder.dart'; import 'package:front_end/src/fasta/builder/type_builder.dart'; -import 'package:front_end/src/fasta/builder/type_variable_builder.dart'; import 'package:front_end/src/fasta/source/source_function_builder.dart'; import 'package:front_end/src/fasta/source/source_library_builder.dart'; import 'package:front_end/src/testing/id_testing_helper.dart'; diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart index 9ac41129071..1e0a00cdb2f 100644 --- a/pkg/front_end/test/fasta/ambiguous_export_test.dart +++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart @@ -6,7 +6,7 @@ import 'package:async_helper/async_helper.dart' show asyncTest; import 'package:expect/expect.dart' show Expect; -import 'package:front_end/src/fasta/builder/invalid_type_declaration_builder.dart'; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext; diff --git a/pkg/front_end/test/fasta/generator_to_string_test.dart b/pkg/front_end/test/fasta/generator_to_string_test.dart index e22531b1bc3..a8c510def0f 100644 --- a/pkg/front_end/test/fasta/generator_to_string_test.dart +++ b/pkg/front_end/test/fasta/generator_to_string_test.dart @@ -7,9 +7,8 @@ import 'package:_fe_analyzer_shared/src/scanner/scanner.dart' show Token, scanString; import 'package:expect/expect.dart' show Expect; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/builder/prefix_builder.dart'; -import 'package:front_end/src/fasta/builder/type_declaration_builder.dart'; -import 'package:front_end/src/fasta/builder/type_variable_builder.dart'; import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext; import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget; import 'package:front_end/src/fasta/fasta_codes.dart' diff --git a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart index 639ee03fcc9..e803945cdae 100644 --- a/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart +++ b/pkg/front_end/test/fasta/types/dill_hierarchy_test.dart @@ -21,7 +21,7 @@ import "package:front_end/src/api_prototype/compiler_options.dart" import "package:front_end/src/base/processed_options.dart" show ProcessedOptions; -import "package:front_end/src/fasta/builder/class_builder.dart"; +import "package:front_end/src/fasta/builder/declaration_builders.dart"; import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext; diff --git a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart index 5bf03696f3d..8e0ec3e9118 100644 --- a/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart +++ b/pkg/front_end/test/fasta/types/fasta_legacy_upper_bound_test.dart @@ -12,7 +12,7 @@ import "package:front_end/src/api_prototype/compiler_options.dart" import "package:front_end/src/base/processed_options.dart" show ProcessedOptions; -import "package:front_end/src/fasta/builder/class_builder.dart"; +import "package:front_end/src/fasta/builder/declaration_builders.dart"; import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext; diff --git a/pkg/front_end/test/fasta/types/fasta_types_test.dart b/pkg/front_end/test/fasta/types/fasta_types_test.dart index efbfacc160d..e554925f44c 100644 --- a/pkg/front_end/test/fasta/types/fasta_types_test.dart +++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart @@ -21,7 +21,7 @@ import "package:front_end/src/api_prototype/compiler_options.dart" import "package:front_end/src/base/processed_options.dart" show ProcessedOptions; -import "package:front_end/src/fasta/builder/class_builder.dart"; +import "package:front_end/src/fasta/builder/declaration_builders.dart"; import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext; diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart index d1f142842d1..01362c1ccee 100644 --- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart +++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart @@ -26,7 +26,7 @@ import "package:front_end/src/api_prototype/compiler_options.dart" import "package:front_end/src/base/processed_options.dart" show ProcessedOptions; -import "package:front_end/src/fasta/builder/class_builder.dart"; +import "package:front_end/src/fasta/builder/declaration_builders.dart"; import "package:front_end/src/fasta/compiler_context.dart" show CompilerContext; diff --git a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart index cd714539d88..963a2ab0bb3 100644 --- a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart +++ b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart @@ -13,7 +13,7 @@ import 'package:_fe_analyzer_shared/src/testing/id.dart' show ActualData, Id; import 'package:_fe_analyzer_shared/src/testing/id_testing.dart'; import 'package:front_end/src/api_prototype/compiler_options.dart'; import 'package:front_end/src/api_prototype/experimental_flags.dart'; -import 'package:front_end/src/fasta/builder/class_builder.dart'; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/builder/library_builder.dart'; import 'package:front_end/src/fasta/builder/member_builder.dart'; import 'package:front_end/src/fasta/kernel/macro/macro.dart'; 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 0a53b304c47..e9eceea0818 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 @@ -5,7 +5,7 @@ import 'package:_fe_analyzer_shared/src/util/libraries_specification.dart'; import 'package:expect/expect.dart'; import 'package:front_end/src/base/processed_options.dart'; -import 'package:front_end/src/fasta/builder/type_alias_builder.dart'; +import 'package:front_end/src/fasta/builder/declaration_builders.dart'; import 'package:front_end/src/fasta/compiler_context.dart'; import 'package:front_end/src/fasta/dill/dill_library_builder.dart'; import 'package:front_end/src/fasta/dill/dill_loader.dart'; diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart new file mode 100644 index 00000000000..d54ec4a788c --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart @@ -0,0 +1,21 @@ +// Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +class Either2 { + final int _which; + final T1? _t1; + final T2? _t2; + + const Either2.t1(T1 this._t1) + : _t2 = null, + _which = 1; + + const Either2.t2(T2 this._t2) + : _t1 = null, + _which = 2; +} + +typedef ProgressToken = Either2; + +final analyzingProgressToken = ProgressToken.t2('ANALYZING'); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.expect new file mode 100644 index 00000000000..3ebe225ca2b --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken = new self::Either2::t2("ANALYZING"); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.transformed.expect new file mode 100644 index 00000000000..3ebe225ca2b --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.strong.transformed.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken = new self::Either2::t2("ANALYZING"); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline.expect new file mode 100644 index 00000000000..6d789a1af3a --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline.expect @@ -0,0 +1,14 @@ +class Either2 { + final int _which; + final T1? _t1; + final T2? _t2; + const Either2.t1(T1 this._t1) + : _t2 = null, + _which = 1; + const Either2.t2(T2 this._t2) + : _t1 = null, + _which = 2; +} + +typedef ProgressToken = Either2; +final analyzingProgressToken = ProgressToken.t2('ANALYZING'); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline_modelled.expect new file mode 100644 index 00000000000..ad57c05b5e2 --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.textual_outline_modelled.expect @@ -0,0 +1,14 @@ +class Either2 { + const Either2.t1(T1 this._t1) + : _t2 = null, + _which = 1; + const Either2.t2(T2 this._t2) + : _t1 = null, + _which = 2; + final T1? _t1; + final T2? _t2; + final int _which; +} + +final analyzingProgressToken = ProgressToken.t2('ANALYZING'); +typedef ProgressToken = Either2; diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.expect new file mode 100644 index 00000000000..3ebe225ca2b --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken = new self::Either2::t2("ANALYZING"); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.modular.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.modular.expect new file mode 100644 index 00000000000..3ebe225ca2b --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.modular.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken = new self::Either2::t2("ANALYZING"); diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.outline.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.outline.expect new file mode 100644 index 00000000000..1f5d8846d1d --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.outline.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken; diff --git a/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.transformed.expect b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.transformed.expect new file mode 100644 index 00000000000..3ebe225ca2b --- /dev/null +++ b/pkg/front_end/testcases/nonfunction_type_aliases/constructor_invocation.dart.weak.transformed.expect @@ -0,0 +1,17 @@ +library; +import self as self; +import "dart:core" as core; + +typedef ProgressToken = self::Either2; +class Either2 extends core::Object /*hasConstConstructor*/ { + final field core::int _which; + final field self::Either2::T1? _t1; + final field self::Either2::T2? _t2; + const constructor t1(self::Either2::T1% _t1) → self::Either2 + : self::Either2::_t1 = _t1, self::Either2::_t2 = null, self::Either2::_which = 1, super core::Object::•() + ; + const constructor t2(self::Either2::T2% _t2) → self::Either2 + : self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•() + ; +} +static final field self::Either2 analyzingProgressToken = new self::Either2::t2("ANALYZING");