[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:
Johnni Winther 2023-09-12 12:23:33 +00:00 committed by Commit Queue
parent 1a0e5dea69
commit df89d602ee
93 changed files with 1221 additions and 1074 deletions

View file

@ -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.

View file

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

View file

@ -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;

View file

@ -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 {

View file

@ -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(

View file

@ -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 {}

View file

@ -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 {

View file

@ -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.

View file

@ -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.

View file

@ -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';

View file

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

View file

@ -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';

View file

@ -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";

View file

@ -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 {

View file

@ -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';

View file

@ -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;

View file

@ -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);
}

View file

@ -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';

View file

@ -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';

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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.

View file

@ -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;

View file

@ -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,

View file

@ -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 {

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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;

View file

@ -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;

View file

@ -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);
}

View file

@ -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';

View file

@ -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 {

View file

@ -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;

View file

@ -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,

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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,

View file

@ -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;

View file

@ -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';

View file

@ -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);
}
}

View file

@ -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';

View file

@ -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'));
}
}
}

View file

@ -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');

View file

@ -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);
}

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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;

View file

@ -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';

View file

@ -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';

View file

@ -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;

View file

@ -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';

View file

@ -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';

View file

@ -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,

View file

@ -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,

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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():
}
}
}

View file

@ -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(

View file

@ -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';

View file

@ -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';

View file

@ -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:
}
}
}

View file

@ -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;

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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';

View file

@ -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;

View file

@ -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'

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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';

View file

@ -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';

View file

@ -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');

View file

@ -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");

View file

@ -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");

View file

@ -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');

View file

@ -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>;

View file

@ -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");

View file

@ -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");

View file

@ -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;

View file

@ -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");