Skip to content

Commit

Permalink
Version 3.2.0-230.0.dev
Browse files Browse the repository at this point in the history
Merge 65e3f83 into dev
  • Loading branch information
Dart CI committed Oct 4, 2023
2 parents 49561de + 65e3f83 commit b8fceae
Show file tree
Hide file tree
Showing 8 changed files with 542 additions and 308 deletions.
140 changes: 28 additions & 112 deletions pkg/front_end/lib/src/fasta/kernel/combined_member_signature.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@

import 'package:kernel/ast.dart';

import 'package:kernel/class_hierarchy.dart' show ClassHierarchyBase;

import 'package:kernel/core_types.dart' show CoreTypes;

import 'package:kernel/type_algebra.dart';
Expand All @@ -26,11 +24,13 @@ import 'hierarchy/members_builder.dart';
import 'member_covariance.dart';

/// Class used for computing and inspecting the combined member signature for
/// a set of overridden/inherited members.
abstract class CombinedMemberSignatureBase<T> {
ClassHierarchyBase get hierarchy;
/// a set of overridden/inherited [ClassMember]s.
class CombinedClassMemberSignature {
/// The class members builder used for building this class.
final ClassMembersBuilder membersBuilder;

Name get name;
/// The list of the members inherited into or overridden in [classBuilder].
final List<ClassMember> members;

/// The target class for the combined member signature.
///
Expand All @@ -41,9 +41,6 @@ abstract class CombinedMemberSignatureBase<T> {
/// signature should be computed using nnbd or legacy semantics.
final SourceClassBuilder classBuilder;

/// The list of members from which the combined member signature is computed.
List<T> get members;

/// If `true` the combined member signature is for the setter aspect of the
/// members. Otherwise it is for the getter/method aspect of the members.
final bool forSetter;
Expand All @@ -69,8 +66,6 @@ abstract class CombinedMemberSignatureBase<T> {
/// Cache for the types of [members] as inherited into [classBuilder].
List<DartType?>? _memberTypes;

List<Covariance?>? _memberCovariances;

/// Cache for the this type of [classBuilder].
InterfaceType? _thisType;

Expand Down Expand Up @@ -103,16 +98,19 @@ abstract class CombinedMemberSignatureBase<T> {

/// Creates a [CombinedClassMemberSignature] whose canonical member is already
/// defined.
CombinedMemberSignatureBase.internal(
this.classBuilder, this._canonicalMemberIndex, this.forSetter);
CombinedClassMemberSignature.internal(this.membersBuilder, this.classBuilder,
this._canonicalMemberIndex, this.members,
{required this.forSetter});

/// Creates a [CombinedClassMemberSignature] for [members] inherited into
/// [classBuilder].
///
/// If [forSetter] is `true`, contravariance of the setter types is used to
/// compute the most specific member type. Otherwise covariance of the getter
/// types or function types is used.
CombinedMemberSignatureBase(this.classBuilder, {required this.forSetter}) {
CombinedClassMemberSignature(
this.membersBuilder, this.classBuilder, this.members,
{required this.forSetter}) {
int? bestSoFarIndex;
if (members.length == 1) {
bestSoFarIndex = 0;
Expand Down Expand Up @@ -182,7 +180,7 @@ abstract class CombinedMemberSignatureBase<T> {
/// For the nnbd computation, this is one of the members whose type define
/// the combined member signature, and the indices of the all members whose
/// type define the combined member signature are in [mutualSubtypeIndices].
T? get canonicalMember =>
ClassMember? get canonicalMember =>
_canonicalMemberIndex != null ? members[_canonicalMemberIndex!] : null;

/// The index within [members] for the member whose type is the most specific
Expand All @@ -203,11 +201,18 @@ abstract class CombinedMemberSignatureBase<T> {
/// If there is only one most specific member type, this is `null`.
Set<int>? get mutualSubtypeIndices => _mutualSubtypes?.values.toSet();

Member _getMember(int index);
ClassHierarchyBuilder get hierarchy => membersBuilder.hierarchyBuilder;

CoreTypes get _coreTypes => hierarchy.coreTypes;

Types get _types;
Types get _types => hierarchy.types;

Name get name => members.first.name;

Member _getMember(int index) {
ClassMember candidate = members[index];
return candidate.getMember(membersBuilder);
}

/// Returns `true` if legacy erasure was needed to compute the combined
/// member signature type.
Expand Down Expand Up @@ -372,7 +377,10 @@ abstract class CombinedMemberSignatureBase<T> {
return _combinedMemberSignatureType;
}

Covariance _getMemberCovariance(int index);
Covariance _getMemberCovariance(int index) {
ClassMember candidate = members[index];
return candidate.getCovariance(membersBuilder);
}

void _ensureCombinedMemberSignatureCovariance() {
if (!_isCombinedMemberSignatureCovarianceComputed) {
Expand Down Expand Up @@ -706,15 +714,11 @@ abstract class CombinedMemberSignatureBase<T> {
if (member.enclosingClass!.typeParameters.isEmpty) {
return type;
}
InterfaceType? instance = hierarchy.getTypeAsInstanceOf(
InterfaceType instance = hierarchy.getTypeAsInstanceOf(
thisType, member.enclosingClass!,
isNonNullableByDefault:
classBuilder.libraryBuilder.isNonNullableByDefault);
assert(
instance != null,
"No instance of $thisType as ${member.enclosingClass} found for "
"$member.");
return Substitution.fromInterfaceType(instance!).substituteType(type);
return Substitution.fromInterfaceType(instance).substituteType(type);
}

bool _isMoreSpecific(DartType a, DartType b, bool forSetter) {
Expand All @@ -725,91 +729,3 @@ abstract class CombinedMemberSignatureBase<T> {
}
}
}

/// Class used for computing and inspecting the combined member signature for
/// a set of overridden/inherited [ClassMember]s.
class CombinedClassMemberSignature
extends CombinedMemberSignatureBase<ClassMember> {
/// The class members builder used for building this class.
final ClassMembersBuilder membersBuilder;

@override
ClassHierarchyBuilder get hierarchy => membersBuilder.hierarchyBuilder;

/// The list of the members inherited into or overridden in [classBuilder].
@override
final List<ClassMember> members;

/// Creates a [CombinedClassMemberSignature] whose canonical member is already
/// defined.
CombinedClassMemberSignature.internal(this.membersBuilder,
SourceClassBuilder classBuilder, int canonicalMemberIndex, this.members,
{required bool forSetter})
: super.internal(classBuilder, canonicalMemberIndex, forSetter);

/// Creates a [CombinedClassMemberSignature] for [members] inherited into
/// [classBuilder].
///
/// If [forSetter] is `true`, contravariance of the setter types is used to
/// compute the most specific member type. Otherwise covariance of the getter
/// types or function types is used.
CombinedClassMemberSignature(
this.membersBuilder, SourceClassBuilder classBuilder, this.members,
{required bool forSetter})
: super(classBuilder, forSetter: forSetter);

@override
Name get name => members.first.name;

@override
Types get _types => hierarchy.types;

@override
Member _getMember(int index) {
ClassMember candidate = members[index];
return candidate.getMember(membersBuilder);
}

@override
Covariance _getMemberCovariance(int index) {
ClassMember candidate = members[index];
return candidate.getCovariance(membersBuilder);
}
}

/// Class used for computing and inspecting the combined member signature for
/// a set of overridden/inherited [Member]s.
class CombinedMemberSignatureBuilder
extends CombinedMemberSignatureBase<Member> {
@override
final ClassHierarchyBase hierarchy;

@override
final Types _types;

@override
final List<Member> members;

CombinedMemberSignatureBuilder(
this.hierarchy, SourceClassBuilder classBuilder, this.members,
{required bool forSetter})
: _types = new Types(hierarchy),
super(classBuilder, forSetter: forSetter);

@override
Name get name => members.first.name;

@override
Member _getMember(int index) => members[index];

@override
Covariance _getMemberCovariance(int index) {
_memberCovariances ??= new List<Covariance?>.filled(members.length, null);
Covariance? covariance = _memberCovariances![index];
if (covariance == null) {
_memberCovariances![index] = covariance =
new Covariance.fromMember(members[index], forSetter: forSetter);
}
return covariance;
}
}
Loading

0 comments on commit b8fceae

Please sign in to comment.