Skip to content

Commit

Permalink
Version 2.19.0-403.0.dev
Browse files Browse the repository at this point in the history
Merge 3207808 into dev
  • Loading branch information
Dart CI committed Nov 15, 2022
2 parents 09be43f + 3207808 commit 8132f04
Show file tree
Hide file tree
Showing 22 changed files with 154 additions and 124 deletions.
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ vars = {

# co19 is a cipd package. Use update.sh in tests/co19[_2] to update these
# hashes.
"co19_rev": "36cc25de009198a8516be7f12ac5b61069656d09",
"co19_rev": "19439c0d58a0df422c4acc4ae97a3deeb98d0f67",
# This line prevents conflicts when both packages are rolled simultaneously.
"co19_2_rev": "cdab7e4e26f3dd534bcb297ff3f9e9aa5c7a04fb",

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ class ClassHierarchyBuilder implements ClassHierarchyBase {

@override
Supertype? getClassAsInstanceOf(Class subclass, Class superclass) {
if (identical(subclass, superclass)) return subclass.asThisSupertype;
ClassHierarchyNode clsNode = getNodeFromClass(subclass);
ClassHierarchyNode supertypeNode = getNodeFromClass(superclass);
List<Supertype> superclasses = clsNode.superclasses;
Expand Down Expand Up @@ -114,6 +115,11 @@ class ClassHierarchyBuilder implements ClassHierarchyBase {
return asSupertypeOf(type, superclass)?.typeArguments;
}

@override
bool isSubtypeOf(Class subtype, Class superclass) {
return getClassAsInstanceOf(subtype, superclass) != null;
}

@override
InterfaceType getLegacyLeastUpperBound(
InterfaceType type1, InterfaceType type2, Library clientLibrary) {
Expand Down
12 changes: 12 additions & 0 deletions pkg/front_end/lib/src/fasta/kernel/hierarchy/members_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,18 @@ class ClassMembersBuilder implements ClassHierarchyMembers {
return getNodeFromClass(cls).getInterfaceMember(name, setter);
}

@override
Member? getDispatchTarget(Class cls, Name name, {bool setter = false}) {
return getNodeFromClass(cls)
.getDispatchTarget(name, setter)
?.getMember(this);
}

ClassMember? getDispatchClassMember(Class cls, Name name,
{bool setter = false}) {
return getNodeFromClass(cls).getDispatchTarget(name, setter);
}

static ClassMembersBuilder build(
ClassHierarchyBuilder hierarchyBuilder, List<ClassBuilder> classes) {
ClassMembersBuilder membersBuilder =
Expand Down
33 changes: 23 additions & 10 deletions pkg/front_end/lib/src/fasta/kernel/hierarchy/members_node.dart
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,6 @@ class ClassMembersNodeBuilder {
bool get shouldModifyKernel =>
classBuilder.libraryBuilder.loader == hierarchy.loader;

ClassMember? checkInheritanceConflict(ClassMember a, ClassMember b) {
if (a.isStatic || a.isProperty != b.isProperty) {
reportInheritanceConflict(a, b);
return a;
}
return null;
}

static void inferMethodType(
ClassHierarchyBuilder hierarchyBuilder,
ClassMembersBuilder membersBuilder,
Expand Down Expand Up @@ -2311,6 +2303,7 @@ class ClassMembersNodeBuilder {

return new ClassMembersNode(
classBuilder,
supernode,
classMemberMap,
classSetterMap,
interfaceMemberMap,
Expand Down Expand Up @@ -2360,6 +2353,8 @@ class ClassMembersNodeBuilder {
class ClassMembersNode {
final ClassBuilder classBuilder;

final ClassMembersNode? supernode;

/// All the members of this class including [classMembers] of its
/// superclasses. The members are sorted by [compareDeclarations].
final Map<Name, ClassMember> classMemberMap;
Expand Down Expand Up @@ -2387,6 +2382,7 @@ class ClassMembersNode {

ClassMembersNode(
this.classBuilder,
this.supernode,
this.classMemberMap,
this.classSetterMap,
this.interfaceMemberMap,
Expand Down Expand Up @@ -2434,9 +2430,16 @@ class ClassMembersNode {
}

ClassMember? getInterfaceMember(Name name, bool isSetter) {
return isSetter
ClassMember? result = isSetter
? (interfaceSetterMap ?? classSetterMap)[name]
: (interfaceMemberMap ?? classMemberMap)[name];
if (result == null) {
return null;
}
if (result.isStatic) {
return null;
}
return result;
}

ClassMember? findMember(Name name, List<ClassMember> declarations) {
Expand Down Expand Up @@ -2464,7 +2467,17 @@ class ClassMembersNode {
}

ClassMember? getDispatchTarget(Name name, bool isSetter) {
return isSetter ? classSetterMap[name] : classMemberMap[name];
ClassMember? result =
isSetter ? classSetterMap[name] : classMemberMap[name];
if (result == null) {
return null;
}
if (result.isStatic) {
// TODO(johnniwinther): Can we avoid putting static members in the
// [classMemberMap]/[classSetterMap] maps?
return supernode?.getDispatchTarget(name, isSetter);
}
return result;
}
}

Expand Down
12 changes: 6 additions & 6 deletions pkg/front_end/lib/src/fasta/source/source_library_builder.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
import 'package:_fe_analyzer_shared/src/util/resolve_relative_uri.dart'
show resolveRelativeUri;
import 'package:kernel/ast.dart' hide Combinator, MapLiteralEntry;
import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
import 'package:kernel/class_hierarchy.dart'
show ClassHierarchy, ClassHierarchyBase, ClassHierarchyMembers;
import 'package:kernel/clone.dart' show CloneVisitorNotMembers;
import 'package:kernel/reference_from_index.dart'
show IndexedClass, IndexedContainer, IndexedLibrary;
Expand Down Expand Up @@ -4416,7 +4417,8 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
void checkBoundsInMethodInvocation(
DartType receiverType,
TypeEnvironment typeEnvironment,
ClassHierarchy hierarchy,
ClassHierarchyBase classHierarchy,
ClassHierarchyMembers membersHierarchy,
Name name,
Member? interfaceTarget,
Arguments arguments,
Expand All @@ -4437,14 +4439,14 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
}
// TODO(cstefantsova): Find a better way than relying on [interfaceTarget].
Member? method =
hierarchy.getDispatchTarget(klass, name) ?? interfaceTarget;
membersHierarchy.getDispatchTarget(klass, name) ?? interfaceTarget;
// ignore: unnecessary_null_comparison
if (method == null || method is! Procedure) {
return;
}
if (klass != method.enclosingClass) {
Supertype parent =
hierarchy.getClassAsInstanceOf(klass, method.enclosingClass!)!;
classHierarchy.getClassAsInstanceOf(klass, method.enclosingClass!)!;
klass = method.enclosingClass!;
receiverTypeArguments = parent.typeArguments;
Map<TypeParameter, DartType> instanceSubstitutionMap = substitutionMap;
Expand Down Expand Up @@ -4492,7 +4494,6 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {

void checkBoundsInFunctionInvocation(
TypeEnvironment typeEnvironment,
ClassHierarchy hierarchy,
FunctionType functionType,
String? localName,
Arguments arguments,
Expand Down Expand Up @@ -4526,7 +4527,6 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {

void checkBoundsInInstantiation(
TypeEnvironment typeEnvironment,
ClassHierarchy hierarchy,
FunctionType functionType,
List<DartType> typeArguments,
Uri fileUri,
Expand Down
34 changes: 19 additions & 15 deletions pkg/front_end/lib/src/fasta/source/source_loader.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2295,21 +2295,25 @@ severity: $severity
Name name = restrictedMemberNames[i];
Class? declarer = restrictedMemberDeclarers[i];

Member? member = hierarchy.getDispatchTarget(classBuilder.cls, name);
if (member?.enclosingClass != declarer &&
member?.enclosingClass != classBuilder.cls &&
member?.isAbstract == false) {
classBuilder.libraryBuilder.addProblem(
templateEnumInheritsRestricted.withArguments(name.text),
classBuilder.charOffset,
classBuilder.name.length,
classBuilder.fileUri,
context: <LocatedMessage>[
messageEnumInheritsRestrictedMember.withLocation(
member!.fileUri,
member.fileOffset,
member.name.text.length)
]);
ClassMember? classMember =
membersBuilder.getDispatchClassMember(classBuilder.cls, name);
if (classMember != null) {
Member member = classMember.getMember(membersBuilder);
if (member.enclosingClass != declarer &&
member.enclosingClass != classBuilder.cls &&
member.isAbstract == false) {
classBuilder.libraryBuilder.addProblem(
templateEnumInheritsRestricted.withArguments(name.text),
classBuilder.charOffset,
classBuilder.name.length,
classBuilder.fileUri,
context: <LocatedMessage>[
messageEnumInheritsRestrictedMember.withLocation(
classMember.fileUri,
classMember.charOffset,
member.name.text.length)
]);
}
}
}
}
Expand Down
20 changes: 10 additions & 10 deletions pkg/front_end/lib/src/fasta/type_inference/inference_visitor.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1407,7 +1407,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
if (inferredExpressionType is InterfaceType) {
// TODO(johnniwinther): Should we use the type of
// `iterable.iterator.current` instead?
List<DartType>? supertypeArguments = classHierarchy
List<DartType>? supertypeArguments = hierarchyBuilder
.getTypeArgumentsAsInstanceOf(inferredExpressionType, iterableClass);
if (supertypeArguments != null) {
inferredType = supertypeArguments[0];
Expand Down Expand Up @@ -1636,7 +1636,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
InitializerInferenceResult visitInvalidSuperInitializerJudgment(
InvalidSuperInitializerJudgment node) {
Substitution substitution = Substitution.fromSupertype(
classHierarchy.getClassAsInstanceOf(
hierarchyBuilder.getClassAsInstanceOf(
thisType!.classNode, node.target.enclosingClass)!);
FunctionType functionType = replaceReturnType(
substitution.substituteType(node.target.function
Expand Down Expand Up @@ -2843,10 +2843,10 @@ class InferenceVisitorImpl extends InferenceVisitorBase
// Ambiguous set/map literal
if (unfuturedTypeContext is InterfaceType) {
typeContextIsMap = typeContextIsMap ||
classHierarchy.isSubtypeOf(
hierarchyBuilder.isSubtypeOf(
unfuturedTypeContext.classNode, coreTypes.mapClass);
typeContextIsIterable = typeContextIsIterable ||
classHierarchy.isSubtypeOf(
hierarchyBuilder.isSubtypeOf(
unfuturedTypeContext.classNode, coreTypes.iterableClass);
if (node.entries.isEmpty && typeContextIsIterable && !typeContextIsMap) {
// Set literal
Expand Down Expand Up @@ -3086,7 +3086,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
result.inferredType, result.applyResult(invocation));
} else {
// TODO(johnniwinther): Handle augmentation of field with inferred types.
TypeInferenceEngine.resolveInferenceNode(member, classHierarchy);
TypeInferenceEngine.resolveInferenceNode(member, hierarchyBuilder);
Link<NullAwareGuard> nullAwareGuards = const Link<NullAwareGuard>();
DartType receiverType = member.getterType;
Expression receiver = new StaticGet(member)..fileOffset = node.fileOffset;
Expand Down Expand Up @@ -5892,7 +5892,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
return new ExpressionInferenceResult(replacementType, replacement);
} else {
// TODO(johnniwinther): Handle augmentation of field with inferred types.
TypeInferenceEngine.resolveInferenceNode(member, classHierarchy);
TypeInferenceEngine.resolveInferenceNode(member, hierarchyBuilder);
DartType writeContext = member.setterType;
ExpressionInferenceResult rhsResult =
inferExpression(node.value, writeContext, isVoidAllowed: true);
Expand Down Expand Up @@ -6153,7 +6153,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
readResult.inferredType, readResult.expression);
} else {
// TODO(johnniwinther): Handle augmentation of field with inferred types.
TypeInferenceEngine.resolveInferenceNode(member, classHierarchy);
TypeInferenceEngine.resolveInferenceNode(member, hierarchyBuilder);
DartType type = member.getterType;

if (member is Procedure && member.kind == ProcedureKind.Method) {
Expand Down Expand Up @@ -6302,7 +6302,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
ExpressionInferenceResult visitStaticSet(
StaticSet node, DartType typeContext) {
Member writeMember = node.target;
TypeInferenceEngine.resolveInferenceNode(writeMember, classHierarchy);
TypeInferenceEngine.resolveInferenceNode(writeMember, hierarchyBuilder);
DartType writeContext = writeMember.setterType;
ExpressionInferenceResult rhsResult =
inferExpression(node.value, writeContext, isVoidAllowed: true);
Expand All @@ -6318,7 +6318,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
ExpressionInferenceResult visitStaticGet(
StaticGet node, DartType typeContext) {
Member target = node.target;
TypeInferenceEngine.resolveInferenceNode(target, classHierarchy);
TypeInferenceEngine.resolveInferenceNode(target, hierarchyBuilder);
DartType type = target.getterType;

if (!isNonNullableByDefault) {
Expand Down Expand Up @@ -6378,7 +6378,7 @@ class InferenceVisitorImpl extends InferenceVisitorBase
InitializerInferenceResult visitSuperInitializer(SuperInitializer node) {
ensureMemberType(node.target);
Substitution substitution = Substitution.fromSupertype(
classHierarchy.getClassAsInstanceOf(
hierarchyBuilder.getClassAsInstanceOf(
thisType!.classNode, node.target.enclosingClass)!);
FunctionType functionType = replaceReturnType(
substitution.substituteType(node.target.function
Expand Down
Loading

0 comments on commit 8132f04

Please sign in to comment.