mirror of
https://github.com/dart-lang/sdk
synced 2024-10-14 12:14:36 +00:00
[cfe] Make TypeDeclarationBuilder and DeclarationBuilder sealed
Change-Id: I4f61e6ff41bb7505b22c3449f92088ca9f353e41 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/324060 Reviewed-by: Jens Johansen <jensj@google.com> Commit-Queue: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
parent
1a0e5dea69
commit
df89d602ee
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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 {}
|
|
@ -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 {
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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";
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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<TypeBuilder> mixins;
|
||||
|
|
|
@ -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 <DartType>[]);
|
||||
} 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,
|
||||
<DartType>[type.typeArgument]);
|
||||
}
|
||||
assert(unaliasedDeclaration is ClassBuilder &&
|
||||
unaliasedDeclaration.name == "Null");
|
||||
return new Supertype(
|
||||
(unaliasedDeclaration as ClassBuilder).cls, const <DartType>[]);
|
||||
} 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,
|
||||
<DartType>[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);
|
||||
}
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<TypeBuilder>? 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<DartType> 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;
|
||||
}
|
||||
|
|
|
@ -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<TypeBuilder>? 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<DartType> 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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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<MetadataBuilder>? 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;
|
||||
|
|
|
@ -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 = <TypeBuilder>[declaration.type];
|
||||
} else if (declaration is TypeVariableBuilder) {
|
||||
foundTypeVariables = <TypeVariableBuilder>[declaration];
|
||||
switch (declaration) {
|
||||
case ClassBuilder():
|
||||
foundTypeVariables = declaration.typeVariables;
|
||||
case TypeAliasBuilder():
|
||||
foundTypeVariables = declaration.typeVariables;
|
||||
internalDependents = <TypeBuilder>[declaration.type];
|
||||
case TypeVariableBuilder():
|
||||
foundTypeVariables = <TypeVariableBuilder>[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<TypeVariableBuilder>? typeVariables,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<TypeBuilder>? 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<DartType> 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<TypeBuilder>? 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<DartType> 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<TypeBuilder>? 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<DartType> 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<TypeBuilder>? 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<DartType> 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<DartType> result = new List<DartType>.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<DartType> result = new List<DartType>.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);
|
||||
}
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<TypeBuilder>? 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 = <DartType>[];
|
||||
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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<TypeParameter, DartType>? substitutionMap;
|
||||
switch (supertype) {
|
||||
case ClassBuilder():
|
||||
ClassBuilder superclassBuilder = supertype;
|
||||
bool isConstructorAdded = false;
|
||||
Map<TypeParameter, DartType>? substitutionMap;
|
||||
|
||||
NameIterator<MemberBuilder> 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<MemberBuilder> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<macro.TypeDeclaration> _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'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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<TypeVariableBuilder>? typeVariables,
|
||||
:List<ParameterBuilder>? formals,
|
||||
|
@ -274,72 +281,81 @@ TypeBuilder _substituteNamedTypeBuilder(
|
|||
if (arguments == null || arguments.length == 0) {
|
||||
return type;
|
||||
}
|
||||
|
||||
List<TypeBuilder>? 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<Object> findRawTypesWithInboundReferences(TypeBuilder? type) {
|
|||
:List<TypeBuilder>? arguments
|
||||
):
|
||||
if (arguments == null) {
|
||||
if (declaration is DillClassBuilder) {
|
||||
bool hasInbound = false;
|
||||
List<TypeParameter> 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 <Object>[]);
|
||||
}
|
||||
} else if (declaration is DillTypeAliasBuilder) {
|
||||
bool hasInbound = false;
|
||||
List<TypeParameter> 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 <Object>[]);
|
||||
}
|
||||
} else if (declaration is ClassBuilder &&
|
||||
declaration.typeVariables != null) {
|
||||
List<Object> dependencies =
|
||||
findInboundReferences(declaration.typeVariables!);
|
||||
if (dependencies.length != 0) {
|
||||
typesAndDependencies.add(type);
|
||||
typesAndDependencies.add(dependencies);
|
||||
}
|
||||
} else if (declaration is ExtensionTypeDeclarationBuilder &&
|
||||
declaration.typeParameters != null) {
|
||||
List<Object> dependencies =
|
||||
findInboundReferences(declaration.typeParameters!);
|
||||
if (dependencies.length != 0) {
|
||||
typesAndDependencies.add(type);
|
||||
typesAndDependencies.add(dependencies);
|
||||
}
|
||||
} else if (declaration is TypeAliasBuilder) {
|
||||
if (declaration.typeVariables != null) {
|
||||
List<Object> 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<TypeParameter> 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 <Object>[]);
|
||||
}
|
||||
} else if (declaration.typeVariables != null) {
|
||||
List<Object> 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<TypeParameter> 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 <Object>[]);
|
||||
}
|
||||
} else {
|
||||
if (declaration.typeVariables != null) {
|
||||
List<Object> 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<Object> dependencies =
|
||||
findInboundReferences(type.typeVariables!);
|
||||
if (dependencies.length != 0) {
|
||||
typesAndDependencies.add(type);
|
||||
typesAndDependencies.add(dependencies);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case ExtensionTypeDeclarationBuilder():
|
||||
if (declaration.typeParameters != null) {
|
||||
List<Object> 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<List<RawTypeCycleElement>> findRawTypePathsToDeclaration(
|
|||
paths
|
||||
.add(<RawTypeCycleElement>[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);
|
||||
}
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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():
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<MemberBuilder> 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<MemberBuilder> 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:
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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<T1, T2> {
|
||||
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<int, String>;
|
||||
|
||||
final analyzingProgressToken = ProgressToken.t2('ANALYZING');
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken = new self::Either2::t2<core::int, core::String>("ANALYZING");
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken = new self::Either2::t2<core::int, core::String>("ANALYZING");
|
|
@ -0,0 +1,14 @@
|
|||
class Either2<T1, T2> {
|
||||
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<int, String>;
|
||||
final analyzingProgressToken = ProgressToken.t2('ANALYZING');
|
|
@ -0,0 +1,14 @@
|
|||
class Either2<T1, T2> {
|
||||
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<int, String>;
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken = new self::Either2::t2<core::int, core::String>("ANALYZING");
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken = new self::Either2::t2<core::int, core::String>("ANALYZING");
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken;
|
|
@ -0,0 +1,17 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
typedef ProgressToken = self::Either2<core::int, core::String>;
|
||||
class Either2<T1 extends core::Object? = dynamic, T2 extends core::Object? = dynamic> 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%, self::Either2::T2%>
|
||||
: 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::T1%, self::Either2::T2%>
|
||||
: self::Either2::_t2 = _t2, self::Either2::_t1 = null, self::Either2::_which = 2, super core::Object::•()
|
||||
;
|
||||
}
|
||||
static final field self::Either2<core::int, core::String> analyzingProgressToken = new self::Either2::t2<core::int, core::String>("ANALYZING");
|
Loading…
Reference in a new issue