Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 8336597

Browse files
author
Dart CI
committed
Version 2.10.0-135.0.dev
Merge commit '623a9bda6798f0196513ceee40c072bc846f1ad6' into 'dev'
2 parents 9b3b9c2 + 623a9bd commit 8336597

35 files changed

+603
-95
lines changed

pkg/front_end/lib/src/fasta/source/source_class_builder.dart

Lines changed: 95 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,8 @@ class SourceClassBuilder extends ClassBuilderImpl
11421142
if (declaredMember == interfaceMember) {
11431143
return;
11441144
}
1145+
Member interfaceMemberOrigin =
1146+
interfaceMember.memberSignatureOrigin ?? interfaceMember;
11451147
if (declaredMember is Constructor || interfaceMember is Constructor) {
11461148
unimplemented(
11471149
"Constructor in override check.", declaredMember.fileOffset, fileUri);
@@ -1150,18 +1152,18 @@ class SourceClassBuilder extends ClassBuilderImpl
11501152
if (declaredMember.kind == interfaceMember.kind) {
11511153
if (declaredMember.kind == ProcedureKind.Method ||
11521154
declaredMember.kind == ProcedureKind.Operator) {
1153-
bool seenCovariant = checkMethodOverride(
1154-
types, declaredMember, interfaceMember, isInterfaceCheck);
1155+
bool seenCovariant = checkMethodOverride(types, declaredMember,
1156+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
11551157
if (seenCovariant) {
11561158
handleSeenCovariant(
11571159
types, declaredMember, interfaceMember, isSetter, callback);
11581160
}
11591161
} else if (declaredMember.kind == ProcedureKind.Getter) {
1160-
checkGetterOverride(
1161-
types, declaredMember, interfaceMember, isInterfaceCheck);
1162+
checkGetterOverride(types, declaredMember, interfaceMember,
1163+
interfaceMemberOrigin, isInterfaceCheck);
11621164
} else if (declaredMember.kind == ProcedureKind.Setter) {
1163-
bool seenCovariant = checkSetterOverride(
1164-
types, declaredMember, interfaceMember, isInterfaceCheck);
1165+
bool seenCovariant = checkSetterOverride(types, declaredMember,
1166+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
11651167
if (seenCovariant) {
11661168
handleSeenCovariant(
11671169
types, declaredMember, interfaceMember, isSetter, callback);
@@ -1187,12 +1189,12 @@ class SourceClassBuilder extends ClassBuilderImpl
11871189
!interfaceMember.isConst) ||
11881190
interfaceMember is Procedure && interfaceMember.isSetter;
11891191
if (declaredMemberHasGetter && interfaceMemberHasGetter) {
1190-
checkGetterOverride(
1191-
types, declaredMember, interfaceMember, isInterfaceCheck);
1192+
checkGetterOverride(types, declaredMember, interfaceMember,
1193+
interfaceMemberOrigin, isInterfaceCheck);
11921194
}
11931195
if (declaredMemberHasSetter && interfaceMemberHasSetter) {
1194-
bool seenCovariant = checkSetterOverride(
1195-
types, declaredMember, interfaceMember, isInterfaceCheck);
1196+
bool seenCovariant = checkSetterOverride(types, declaredMember,
1197+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
11961198
if (seenCovariant) {
11971199
handleSeenCovariant(
11981200
types, declaredMember, interfaceMember, isSetter, callback);
@@ -1214,6 +1216,7 @@ class SourceClassBuilder extends ClassBuilderImpl
12141216
Types types,
12151217
Member declaredMember,
12161218
Member interfaceMember,
1219+
Member interfaceMemberOrigin,
12171220
FunctionNode declaredFunction,
12181221
FunctionNode interfaceFunction,
12191222
bool isInterfaceCheck) {
@@ -1234,15 +1237,15 @@ class SourceClassBuilder extends ClassBuilderImpl
12341237
templateOverrideTypeVariablesMismatch.withArguments(
12351238
"${declaredMember.enclosingClass.name}."
12361239
"${declaredMember.name.name}",
1237-
"${interfaceMember.enclosingClass.name}."
1238-
"${interfaceMember.name.name}"),
1240+
"${interfaceMemberOrigin.enclosingClass.name}."
1241+
"${interfaceMemberOrigin.name.name}"),
12391242
declaredMember.fileOffset,
12401243
noLength,
12411244
context: [
12421245
templateOverriddenMethodCause
1243-
.withArguments(interfaceMember.name.name)
1244-
.withLocation(_getMemberUri(interfaceMember),
1245-
interfaceMember.fileOffset, noLength)
1246+
.withArguments(interfaceMemberOrigin.name.name)
1247+
.withLocation(_getMemberUri(interfaceMemberOrigin),
1248+
interfaceMemberOrigin.fileOffset, noLength)
12461249
]);
12471250
} else if (declaredFunction?.typeParameters != null) {
12481251
Map<TypeParameter, DartType> substitutionMap =
@@ -1283,16 +1286,16 @@ class SourceClassBuilder extends ClassBuilderImpl
12831286
"${declaredMember.enclosingClass.name}."
12841287
"${declaredMember.name.name}",
12851288
computedBound,
1286-
"${interfaceMember.enclosingClass.name}."
1287-
"${interfaceMember.name.name}",
1289+
"${interfaceMemberOrigin.enclosingClass.name}."
1290+
"${interfaceMemberOrigin.name.name}",
12881291
library.isNonNullableByDefault),
12891292
declaredMember.fileOffset,
12901293
noLength,
12911294
context: [
12921295
templateOverriddenMethodCause
1293-
.withArguments(interfaceMember.name.name)
1294-
.withLocation(_getMemberUri(interfaceMember),
1295-
interfaceMember.fileOffset, noLength)
1296+
.withArguments(interfaceMemberOrigin.name.name)
1297+
.withLocation(_getMemberUri(interfaceMemberOrigin),
1298+
interfaceMemberOrigin.fileOffset, noLength)
12961299
]);
12971300
}
12981301
}
@@ -1322,6 +1325,7 @@ class SourceClassBuilder extends ClassBuilderImpl
13221325
Substitution declaredSubstitution,
13231326
Member declaredMember,
13241327
Member interfaceMember,
1328+
Member interfaceMemberOrigin,
13251329
DartType declaredType,
13261330
DartType interfaceType,
13271331
bool isCovariant,
@@ -1365,8 +1369,9 @@ class SourceClassBuilder extends ClassBuilderImpl
13651369
if (isErrorInNnbdOptedOutMode || library.isNonNullableByDefault) {
13661370
String declaredMemberName = '${declaredMember.enclosingClass.name}'
13671371
'.${declaredMember.name.name}';
1368-
String interfaceMemberName = '${interfaceMember.enclosingClass.name}'
1369-
'.${interfaceMember.name.name}';
1372+
String interfaceMemberName =
1373+
'${interfaceMemberOrigin.enclosingClass.name}'
1374+
'.${interfaceMemberOrigin.name.name}';
13701375
Message message;
13711376
int fileOffset;
13721377
if (declaredParameter == null) {
@@ -1401,18 +1406,28 @@ class SourceClassBuilder extends ClassBuilderImpl
14011406
isInterfaceCheck, declaredMember, message, fileOffset, noLength,
14021407
context: [
14031408
templateOverriddenMethodCause
1404-
.withArguments(interfaceMember.name.name)
1405-
.withLocation(_getMemberUri(interfaceMember),
1406-
interfaceMember.fileOffset, noLength)
1409+
.withArguments(interfaceMemberOrigin.name.name)
1410+
.withLocation(_getMemberUri(interfaceMemberOrigin),
1411+
interfaceMemberOrigin.fileOffset, noLength)
14071412
]);
14081413
}
14091414
}
14101415
}
14111416

1417+
/// Checks whether [declaredMember] correctly overrides [interfaceMember].
1418+
///
1419+
/// If an error is reporter [interfaceMemberOrigin] is used as the context
1420+
/// for where [interfaceMember] was declared, since [interfaceMember] might
1421+
/// itself be synthesized.
1422+
///
14121423
/// Returns whether a covariant parameter was seen and more methods thus have
14131424
/// to be checked.
1414-
bool checkMethodOverride(Types types, Procedure declaredMember,
1415-
Procedure interfaceMember, bool isInterfaceCheck) {
1425+
bool checkMethodOverride(
1426+
Types types,
1427+
Procedure declaredMember,
1428+
Procedure interfaceMember,
1429+
Member interfaceMemberOrigin,
1430+
bool isInterfaceCheck) {
14161431
assert(declaredMember.kind == interfaceMember.kind);
14171432
assert(declaredMember.kind == ProcedureKind.Method ||
14181433
declaredMember.kind == ProcedureKind.Operator);
@@ -1424,6 +1439,7 @@ class SourceClassBuilder extends ClassBuilderImpl
14241439
types,
14251440
declaredMember,
14261441
interfaceMember,
1442+
interfaceMemberOrigin,
14271443
declaredFunction,
14281444
interfaceFunction,
14291445
isInterfaceCheck);
@@ -1437,6 +1453,7 @@ class SourceClassBuilder extends ClassBuilderImpl
14371453
declaredSubstitution,
14381454
declaredMember,
14391455
interfaceMember,
1456+
interfaceMemberOrigin,
14401457
declaredFunction.returnType,
14411458
interfaceFunction.returnType,
14421459
false,
@@ -1505,6 +1522,7 @@ class SourceClassBuilder extends ClassBuilderImpl
15051522
declaredSubstitution,
15061523
declaredMember,
15071524
interfaceMember,
1525+
interfaceMemberOrigin,
15081526
declaredParameter.type,
15091527
interfaceParameter.type,
15101528
declaredParameter.isCovariant || interfaceParameter.isCovariant,
@@ -1524,15 +1542,15 @@ class SourceClassBuilder extends ClassBuilderImpl
15241542
templateOverrideFewerNamedArguments.withArguments(
15251543
"${declaredMember.enclosingClass.name}."
15261544
"${declaredMember.name.name}",
1527-
"${interfaceMember.enclosingClass.name}."
1528-
"${interfaceMember.name.name}"),
1545+
"${interfaceMemberOrigin.enclosingClass.name}."
1546+
"${interfaceMemberOrigin.name.name}"),
15291547
declaredMember.fileOffset,
15301548
noLength,
15311549
context: [
15321550
templateOverriddenMethodCause
1533-
.withArguments(interfaceMember.name.name)
1534-
.withLocation(interfaceMember.fileUri,
1535-
interfaceMember.fileOffset, noLength)
1551+
.withArguments(interfaceMemberOrigin.name.name)
1552+
.withLocation(interfaceMemberOrigin.fileUri,
1553+
interfaceMemberOrigin.fileOffset, noLength)
15361554
]);
15371555
}
15381556
int compareNamedParameters(VariableDeclaration p0, VariableDeclaration p1) {
@@ -1582,6 +1600,7 @@ class SourceClassBuilder extends ClassBuilderImpl
15821600
declaredSubstitution,
15831601
declaredMember,
15841602
interfaceMember,
1603+
interfaceMemberOrigin,
15851604
declaredParameter.type,
15861605
interfaceNamedParameters.current.type,
15871606
declaredParameter.isCovariant,
@@ -1604,20 +1623,35 @@ class SourceClassBuilder extends ClassBuilderImpl
16041623
noLength,
16051624
context: [
16061625
templateOverriddenMethodCause
1607-
.withArguments(interfaceMember.name.name)
1608-
.withLocation(_getMemberUri(interfaceMember),
1609-
interfaceMember.fileOffset, noLength)
1626+
.withArguments(interfaceMemberOrigin.name.name)
1627+
.withLocation(_getMemberUri(interfaceMemberOrigin),
1628+
interfaceMemberOrigin.fileOffset, noLength)
16101629
]);
16111630
}
16121631
if (declaredParameter.isCovariant) seenCovariant = true;
16131632
}
16141633
return seenCovariant;
16151634
}
16161635

1617-
void checkGetterOverride(Types types, Member declaredMember,
1618-
Member interfaceMember, bool isInterfaceCheck) {
1636+
/// Checks whether [declaredMember] correctly overrides [interfaceMember].
1637+
///
1638+
/// If an error is reporter [interfaceMemberOrigin] is used as the context
1639+
/// for where [interfaceMember] was declared, since [interfaceMember] might
1640+
/// itself be synthesized.
1641+
void checkGetterOverride(
1642+
Types types,
1643+
Member declaredMember,
1644+
Member interfaceMember,
1645+
Member interfaceMemberOrigin,
1646+
bool isInterfaceCheck) {
16191647
Substitution interfaceSubstitution = _computeInterfaceSubstitution(
1620-
types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
1648+
types,
1649+
declaredMember,
1650+
interfaceMember,
1651+
interfaceMemberOrigin,
1652+
/* declaredFunction = */ null,
1653+
/* interfaceFunction = */ null,
1654+
isInterfaceCheck);
16211655
Substitution declaredSubstitution =
16221656
_computeDeclaredSubstitution(types, declaredMember);
16231657
DartType declaredType = declaredMember.getterType;
@@ -1628,19 +1662,36 @@ class SourceClassBuilder extends ClassBuilderImpl
16281662
declaredSubstitution,
16291663
declaredMember,
16301664
interfaceMember,
1665+
interfaceMemberOrigin,
16311666
declaredType,
16321667
interfaceType,
1633-
false,
1634-
null,
1668+
/* isCovariant = */ false,
1669+
/* declaredParameter = */ null,
16351670
isInterfaceCheck);
16361671
}
16371672

1673+
/// Checks whether [declaredMember] correctly overrides [interfaceMember].
1674+
///
1675+
/// If an error is reporter [interfaceMemberOrigin] is used as the context
1676+
/// for where [interfaceMember] was declared, since [interfaceMember] might
1677+
/// itself be synthesized.
1678+
///
16381679
/// Returns whether a covariant parameter was seen and more methods thus have
16391680
/// to be checked.
1640-
bool checkSetterOverride(Types types, Member declaredMember,
1641-
Member interfaceMember, bool isInterfaceCheck) {
1681+
bool checkSetterOverride(
1682+
Types types,
1683+
Member declaredMember,
1684+
Member interfaceMember,
1685+
Member interfaceMemberOrigin,
1686+
bool isInterfaceCheck) {
16421687
Substitution interfaceSubstitution = _computeInterfaceSubstitution(
1643-
types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
1688+
types,
1689+
declaredMember,
1690+
interfaceMember,
1691+
interfaceMemberOrigin,
1692+
/* declaredFunction = */ null,
1693+
/* interfaceFunction = */ null,
1694+
isInterfaceCheck);
16441695
Substitution declaredSubstitution =
16451696
_computeDeclaredSubstitution(types, declaredMember);
16461697
DartType declaredType = declaredMember.setterType;
@@ -1660,6 +1711,7 @@ class SourceClassBuilder extends ClassBuilderImpl
16601711
declaredSubstitution,
16611712
declaredMember,
16621713
interfaceMember,
1714+
interfaceMemberOrigin,
16631715
declaredType,
16641716
interfaceType,
16651717
isCovariant,

pkg/front_end/lib/src/fasta/source/source_library_builder.dart

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1903,7 +1903,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
19031903
isMixinDeclaration ? null : supertype,
19041904
isNamedMixinApplication
19051905
? interfaces
1906-
: isMixinDeclaration ? [supertype, mixin] : null,
1906+
: isMixinDeclaration
1907+
? [supertype, mixin]
1908+
: null,
19071909
null, // No `on` clause types.
19081910
new Scope(
19091911
local: <String, MemberBuilder>{},

pkg/front_end/lib/src/fasta/type_inference/type_constraint_gatherer.dart

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -511,11 +511,28 @@ abstract class TypeConstraintGatherer {
511511

512512
// If Q is a legacy type Q0* then the match holds under constraint set C:
513513
//
514-
// Only if P is a subtype match for Q? under constraint set C.
514+
// If P is dynamic or void and P is a subtype match for Q0 under constraint
515+
// set C.
516+
// Or if P is not dynamic or void and P is a subtype match for Q0? under
517+
// constraint set C.
515518
if (_isLegacyTypeConstructorApplication(q)) {
516-
return _isNullabilityAwareSubtypeMatch(
517-
p, q.withDeclaredNullability(Nullability.nullable),
518-
constrainSupertype: constrainSupertype);
519+
final int baseConstraintCount = _protoConstraints.length;
520+
521+
if ((p is DynamicType || p is VoidType) &&
522+
_isNullabilityAwareSubtypeMatch(p, _computeRawType(q),
523+
constrainSupertype: constrainSupertype)) {
524+
return true;
525+
}
526+
_protoConstraints.length = baseConstraintCount;
527+
528+
if (p is! DynamicType &&
529+
p is! VoidType &&
530+
_isNullabilityAwareSubtypeMatch(
531+
p, q.withDeclaredNullability(Nullability.nullable),
532+
constrainSupertype: constrainSupertype)) {
533+
return true;
534+
}
535+
_protoConstraints.length = baseConstraintCount;
519536
}
520537

521538
// If Q is FutureOr<Q0> the match holds under constraint set C:
@@ -560,6 +577,8 @@ abstract class TypeConstraintGatherer {
560577
// If Q is Q0? the match holds under constraint set C:
561578
//
562579
// If P is P0? and P0 is a subtype match for Q0 under constraint set C.
580+
// Or if P is dynamic or void and Object is a subtype match for Q0 under
581+
// constraint set C.
563582
// Or if P is a subtype match for Q0 under non-empty constraint set C.
564583
// Or if P is a subtype match for Null under constraint set C.
565584
// Or if P is a subtype match for Q0 under empty constraint set C.
@@ -575,6 +594,14 @@ abstract class TypeConstraintGatherer {
575594
}
576595
_protoConstraints.length = baseConstraintCount;
577596

597+
if ((p is DynamicType || p is VoidType) &&
598+
_isNullabilityAwareSubtypeMatch(
599+
coreTypes.objectNonNullableRawType, rawQ,
600+
constrainSupertype: constrainSupertype)) {
601+
return true;
602+
}
603+
_protoConstraints.length = baseConstraintCount;
604+
578605
bool isMatchWithRawQ = _isNullabilityAwareSubtypeMatch(p, rawQ,
579606
constrainSupertype: constrainSupertype);
580607
bool matchWithRawQAddsConstraints =

0 commit comments

Comments
 (0)