Skip to content

Commit 669bcef

Browse files
chloestefantsovaCommit Queue
authored and
Commit Queue
committed
[model] Introduce isErroneous flag on Members in Kernel
The flag is used to signal known issues with members, so that the verifier could skip on checking assumptions for well-formed programs. Closes #31620 TEST=existing Change-Id: I7cf1983035d26105ccfe2e7a844a9ba3108bfda2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/420760 Reviewed-by: Johnni Winther <[email protected]> Reviewed-by: Alexander Markov <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 6c5d3fb commit 669bcef

File tree

304 files changed

+6445
-650
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

304 files changed

+6445
-650
lines changed

pkg/front_end/lib/src/kernel/hierarchy/delayed.dart

+13-2
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,23 @@ class DelayedOverrideCheck implements DelayedCheck {
2424
final SourceClassBuilder _classBuilder;
2525
final ClassMember _declaredMember;
2626
final Set<ClassMember> _overriddenMembers;
27+
final ClassMember? _localMember;
2728

2829
DelayedOverrideCheck(
29-
this._classBuilder, this._declaredMember, this._overriddenMembers);
30+
this._classBuilder, this._declaredMember, this._overriddenMembers,
31+
{required ClassMember? localMember})
32+
: this._localMember = localMember;
3033

3134
@override
3235
void check(ClassMembersBuilder membersBuilder) {
3336
Member declaredMember = _declaredMember.getMember(membersBuilder);
37+
Member? localMember = _localMember?.getMember(membersBuilder);
38+
39+
// If the local [ClassMember] didn't produce a local [Member], don't mark
40+
// any member as erroneous.
41+
if (localMember?.enclosingTypeDeclaration != _classBuilder.cls) {
42+
localMember = null;
43+
}
3444

3545
/// If [_declaredMember] is a class member that is declared in an opt-in
3646
/// library but inherited to [_classBuilder] through an opt-out class then
@@ -65,7 +75,8 @@ class DelayedOverrideCheck implements DelayedCheck {
6575
void callback(Member interfaceMember, bool isSetter) {
6676
_classBuilder.checkOverride(membersBuilder.hierarchyBuilder.types,
6777
membersBuilder, declaredMember, interfaceMember, isSetter, callback,
68-
isInterfaceCheck: !_classBuilder.isMixinApplication);
78+
isInterfaceCheck: !_classBuilder.isMixinApplication,
79+
localMember: localMember);
6980
}
7081

7182
for (ClassMember overriddenMember in _overriddenMembers) {

pkg/front_end/lib/src/kernel/hierarchy/members_builder.dart

+4-2
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,11 @@ class ClassMembersBuilder implements ClassHierarchyMembers {
4545
}
4646

4747
void registerOverrideCheck(SourceClassBuilder classBuilder,
48-
ClassMember declaredMember, Set<ClassMember> overriddenMembers) {
48+
ClassMember declaredMember, Set<ClassMember> overriddenMembers,
49+
{required ClassMember? localMember}) {
4950
_delayedChecks.add(new DelayedOverrideCheck(
50-
classBuilder, declaredMember, overriddenMembers));
51+
classBuilder, declaredMember, overriddenMembers,
52+
localMember: localMember));
5153
}
5254

5355
void registerGetterSetterCheck(DelayedGetterSetterCheck check) {

pkg/front_end/lib/src/kernel/hierarchy/members_node.dart

+36-3
Original file line numberDiff line numberDiff line change
@@ -979,24 +979,57 @@ class ClassMembersNodeBuilder extends MembersNodeBuilder {
979979

980980
/// Declared members must be checked to validly override the
981981
/// overridden members.
982+
983+
/// In case error is found, the corresponding local member, either
984+
/// synthesized or declared, is marked erroneous.
985+
ClassMember? localMember = classMember.forSetter
986+
? (interfaceSetterMap?[classMember.name])
987+
: (interfaceMemberMap?[classMember.name]);
988+
989+
if (localMember?.declarationBuilder != classBuilder) {
990+
localMember = null;
991+
}
982992
_membersBuilder.registerOverrideCheck(
983-
classBuilder as SourceClassBuilder, classMember, overriddenMembers);
993+
classBuilder as SourceClassBuilder, classMember, overriddenMembers,
994+
localMember: localMember);
984995
});
985996

986997
mixinApplicationOverridesMap.forEach(
987998
(ClassMember classMember, Set<ClassMember> overriddenMembers) {
988999
/// Declared mixed in members must be checked to validly override the
9891000
/// overridden members.
1001+
1002+
/// In case error is found, the corresponding local member, either
1003+
/// synthesized or declared, is marked erroneous.
1004+
ClassMember? localMember = classMember.forSetter
1005+
? (interfaceSetterMap?[classMember.name])
1006+
: (interfaceMemberMap?[classMember.name]);
1007+
1008+
if (localMember?.declarationBuilder != classBuilder) {
1009+
localMember = null;
1010+
}
9901011
_membersBuilder.registerOverrideCheck(
991-
classBuilder as SourceClassBuilder, classMember, overriddenMembers);
1012+
classBuilder as SourceClassBuilder, classMember, overriddenMembers,
1013+
localMember: localMember);
9921014
});
9931015

9941016
inheritedImplementsMap.forEach(
9951017
(ClassMember classMember, Set<ClassMember> overriddenMembers) {
9961018
/// Concrete members must be checked to validly override the overridden
9971019
/// members in concrete classes.
1020+
1021+
/// In case error is found, the corresponding local member, either
1022+
/// synthesized or declared, is marked erroneous.
1023+
ClassMember? localMember = classMember.forSetter
1024+
? (interfaceSetterMap?[classMember.name])
1025+
: (interfaceMemberMap?[classMember.name]);
1026+
1027+
if (localMember?.declarationBuilder != classBuilder) {
1028+
localMember = null;
1029+
}
9981030
_membersBuilder.registerOverrideCheck(
999-
classBuilder as SourceClassBuilder, classMember, overriddenMembers);
1031+
classBuilder as SourceClassBuilder, classMember, overriddenMembers,
1032+
localMember: localMember);
10001033
});
10011034
}
10021035

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

+61-28
Original file line numberDiff line numberDiff line change
@@ -1387,7 +1387,8 @@ class SourceClassBuilder extends ClassBuilderImpl
13871387
Member interfaceMember,
13881388
bool isSetter,
13891389
callback(Member interfaceMember, bool isSetter),
1390-
{required bool isInterfaceCheck}) {
1390+
{required bool isInterfaceCheck,
1391+
required Member? localMember}) {
13911392
if (declaredMember == interfaceMember) {
13921393
return;
13931394
}
@@ -1402,17 +1403,20 @@ class SourceClassBuilder extends ClassBuilderImpl
14021403
if (declaredMember.kind == ProcedureKind.Method ||
14031404
declaredMember.kind == ProcedureKind.Operator) {
14041405
bool seenCovariant = checkMethodOverride(types, declaredMember,
1405-
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
1406+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck,
1407+
localMember: localMember);
14061408
if (seenCovariant) {
14071409
_handleSeenCovariant(
14081410
memberHierarchy, interfaceMember, isSetter, callback);
14091411
}
14101412
} else if (declaredMember.kind == ProcedureKind.Getter) {
14111413
checkGetterOverride(types, declaredMember, interfaceMember,
1412-
interfaceMemberOrigin, isInterfaceCheck);
1414+
interfaceMemberOrigin, isInterfaceCheck,
1415+
localMember: localMember);
14131416
} else if (declaredMember.kind == ProcedureKind.Setter) {
14141417
bool seenCovariant = checkSetterOverride(types, declaredMember,
1415-
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
1418+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck,
1419+
localMember: localMember);
14161420
if (seenCovariant) {
14171421
_handleSeenCovariant(
14181422
memberHierarchy, interfaceMember, isSetter, callback);
@@ -1440,11 +1444,13 @@ class SourceClassBuilder extends ClassBuilderImpl
14401444
interfaceMember is Procedure && interfaceMember.isSetter;
14411445
if (declaredMemberHasGetter && interfaceMemberHasGetter) {
14421446
checkGetterOverride(types, declaredMember, interfaceMember,
1443-
interfaceMemberOrigin, isInterfaceCheck);
1447+
interfaceMemberOrigin, isInterfaceCheck,
1448+
localMember: localMember);
14441449
}
14451450
if (declaredMemberHasSetter && interfaceMemberHasSetter) {
14461451
bool seenCovariant = checkSetterOverride(types, declaredMember,
1447-
interfaceMember, interfaceMemberOrigin, isInterfaceCheck);
1452+
interfaceMember, interfaceMemberOrigin, isInterfaceCheck,
1453+
localMember: localMember);
14481454
if (seenCovariant) {
14491455
_handleSeenCovariant(
14501456
memberHierarchy, interfaceMember, isSetter, callback);
@@ -1469,7 +1475,8 @@ class SourceClassBuilder extends ClassBuilderImpl
14691475
Member interfaceMemberOrigin,
14701476
FunctionNode? declaredFunction,
14711477
FunctionNode? interfaceFunction,
1472-
bool isInterfaceCheck) {
1478+
bool isInterfaceCheck,
1479+
{required Member? localMember}) {
14731480
Substitution? interfaceSubstitution;
14741481
if (interfaceMember.enclosingClass!.typeParameters.isNotEmpty) {
14751482
Class enclosingClass = interfaceMember.enclosingClass!;
@@ -1496,7 +1503,8 @@ class SourceClassBuilder extends ClassBuilderImpl
14961503
.withArguments(interfaceMemberOrigin.name.text)
14971504
.withLocation(_getMemberUri(interfaceMemberOrigin),
14981505
interfaceMemberOrigin.fileOffset, noLength)
1499-
]);
1506+
],
1507+
localMember: localMember);
15001508
} else if (declaredFunction?.typeParameters != null) {
15011509
// Since the bound of `interfaceFunction!.parameter[i]` may have changed
15021510
// during substitution, it can affect the nullabilities of the types in
@@ -1570,7 +1578,8 @@ class SourceClassBuilder extends ClassBuilderImpl
15701578
.withArguments(interfaceMemberOrigin.name.text)
15711579
.withLocation(_getMemberUri(interfaceMemberOrigin),
15721580
interfaceMemberOrigin.fileOffset, noLength)
1573-
]);
1581+
],
1582+
localMember: localMember);
15741583
}
15751584
}
15761585
}
@@ -1609,7 +1618,8 @@ class SourceClassBuilder extends ClassBuilderImpl
16091618
bool isCovariantByDeclaration,
16101619
VariableDeclaration? declaredParameter,
16111620
bool isInterfaceCheck,
1612-
{bool asIfDeclaredParameter = false}) {
1621+
{bool asIfDeclaredParameter = false,
1622+
required Member? localMember}) {
16131623
if (interfaceSubstitution != null) {
16141624
interfaceType = interfaceSubstitution.substituteType(interfaceType);
16151625
}
@@ -1673,7 +1683,8 @@ class SourceClassBuilder extends ClassBuilderImpl
16731683
.withArguments(interfaceMemberOrigin.name.text)
16741684
.withLocation(_getMemberUri(interfaceMemberOrigin),
16751685
interfaceMemberOrigin.fileOffset, noLength)
1676-
]);
1686+
],
1687+
localMember: localMember);
16771688
}
16781689
}
16791690

@@ -1690,7 +1701,8 @@ class SourceClassBuilder extends ClassBuilderImpl
16901701
Procedure declaredMember,
16911702
Procedure interfaceMember,
16921703
Member interfaceMemberOrigin,
1693-
bool isInterfaceCheck) {
1704+
bool isInterfaceCheck,
1705+
{required Member? localMember}) {
16941706
assert(declaredMember.kind == interfaceMember.kind);
16951707
assert(declaredMember.kind == ProcedureKind.Method ||
16961708
declaredMember.kind == ProcedureKind.Operator);
@@ -1707,7 +1719,8 @@ class SourceClassBuilder extends ClassBuilderImpl
17071719
interfaceMemberOrigin,
17081720
declaredFunction,
17091721
interfaceFunction,
1710-
isInterfaceCheck);
1722+
isInterfaceCheck,
1723+
localMember: localMember);
17111724

17121725
Substitution? declaredSubstitution =
17131726
_computeDeclaredSubstitution(types, declaredMember);
@@ -1723,7 +1736,8 @@ class SourceClassBuilder extends ClassBuilderImpl
17231736
interfaceFunction.returnType,
17241737
/* isCovariantByDeclaration = */ false,
17251738
/* declaredParameter = */ null,
1726-
isInterfaceCheck);
1739+
isInterfaceCheck,
1740+
localMember: localMember);
17271741
if (declaredFunction.positionalParameters.length <
17281742
interfaceFunction.positionalParameters.length) {
17291743
reportInvalidOverride(
@@ -1741,7 +1755,8 @@ class SourceClassBuilder extends ClassBuilderImpl
17411755
.withArguments(interfaceMemberOrigin.name.text)
17421756
.withLocation(interfaceMemberOrigin.fileUri,
17431757
interfaceMemberOrigin.fileOffset, noLength)
1744-
]);
1758+
],
1759+
localMember: localMember);
17451760
}
17461761
if (interfaceFunction.requiredParameterCount <
17471762
declaredFunction.requiredParameterCount) {
@@ -1760,7 +1775,8 @@ class SourceClassBuilder extends ClassBuilderImpl
17601775
.withArguments(interfaceMemberOrigin.name.text)
17611776
.withLocation(interfaceMemberOrigin.fileUri,
17621777
interfaceMemberOrigin.fileOffset, noLength)
1763-
]);
1778+
],
1779+
localMember: localMember);
17641780
}
17651781
for (int i = 0;
17661782
i < declaredFunction.positionalParameters.length &&
@@ -1801,7 +1817,8 @@ class SourceClassBuilder extends ClassBuilderImpl
18011817
declaredParameter.isCovariantByDeclaration ||
18021818
interfaceParameter.isCovariantByDeclaration,
18031819
declaredParameter,
1804-
isInterfaceCheck);
1820+
isInterfaceCheck,
1821+
localMember: localMember);
18051822
if (declaredParameter.isCovariantByDeclaration) seenCovariant = true;
18061823
}
18071824
if (declaredFunction.namedParameters.isEmpty &&
@@ -1825,7 +1842,8 @@ class SourceClassBuilder extends ClassBuilderImpl
18251842
.withArguments(interfaceMemberOrigin.name.text)
18261843
.withLocation(interfaceMemberOrigin.fileUri,
18271844
interfaceMemberOrigin.fileOffset, noLength)
1828-
]);
1845+
],
1846+
localMember: localMember);
18291847
}
18301848

18311849
int compareNamedParameters(VariableDeclaration p0, VariableDeclaration p1) {
@@ -1865,7 +1883,8 @@ class SourceClassBuilder extends ClassBuilderImpl
18651883
.withArguments(interfaceMember.name.text)
18661884
.withLocation(interfaceMember.fileUri,
18671885
interfaceMember.fileOffset, noLength)
1868-
]);
1886+
],
1887+
localMember: localMember);
18691888
break outer;
18701889
}
18711890
}
@@ -1881,7 +1900,8 @@ class SourceClassBuilder extends ClassBuilderImpl
18811900
interfaceNamedParameters.current.type,
18821901
declaredParameter.isCovariantByDeclaration,
18831902
declaredParameter,
1884-
isInterfaceCheck);
1903+
isInterfaceCheck,
1904+
localMember: localMember);
18851905
if (declaredParameter.isRequired &&
18861906
!interfaceNamedParameters.current.isRequired) {
18871907
// Coverage-ignore-block(suite): Not run.
@@ -1901,7 +1921,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19011921
.withArguments(interfaceMemberOrigin.name.text)
19021922
.withLocation(_getMemberUri(interfaceMemberOrigin),
19031923
interfaceMemberOrigin.fileOffset, noLength)
1904-
]);
1924+
],
1925+
localMember: localMember);
19051926
}
19061927
if (declaredParameter.isCovariantByDeclaration) seenCovariant = true;
19071928
}
@@ -1918,7 +1939,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19181939
Member declaredMember,
19191940
Member interfaceMember,
19201941
Member interfaceMemberOrigin,
1921-
bool isInterfaceCheck) {
1942+
bool isInterfaceCheck,
1943+
{required Member? localMember}) {
19221944
Substitution? interfaceSubstitution = _computeInterfaceSubstitution(
19231945
types,
19241946
declaredMember,
@@ -1928,7 +1950,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19281950
null,
19291951
/* interfaceFunction = */
19301952
null,
1931-
isInterfaceCheck);
1953+
isInterfaceCheck,
1954+
localMember: localMember);
19321955
Substitution? declaredSubstitution =
19331956
_computeDeclaredSubstitution(types, declaredMember);
19341957
DartType declaredType = declaredMember.getterType;
@@ -1946,7 +1969,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19461969
false,
19471970
/* declaredParameter = */
19481971
null,
1949-
isInterfaceCheck);
1972+
isInterfaceCheck,
1973+
localMember: localMember);
19501974
}
19511975

19521976
/// Checks whether [declaredMember] correctly overrides [interfaceMember].
@@ -1962,7 +1986,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19621986
Member declaredMember,
19631987
Member interfaceMember,
19641988
Member interfaceMemberOrigin,
1965-
bool isInterfaceCheck) {
1989+
bool isInterfaceCheck,
1990+
{required Member? localMember}) {
19661991
Substitution? interfaceSubstitution = _computeInterfaceSubstitution(
19671992
types,
19681993
declaredMember,
@@ -1972,7 +1997,8 @@ class SourceClassBuilder extends ClassBuilderImpl
19721997
null,
19731998
/* interfaceFunction = */
19741999
null,
1975-
isInterfaceCheck);
2000+
isInterfaceCheck,
2001+
localMember: localMember);
19762002
Substitution? declaredSubstitution =
19772003
_computeDeclaredSubstitution(types, declaredMember);
19782004
DartType declaredType = declaredMember.setterType;
@@ -1999,19 +2025,26 @@ class SourceClassBuilder extends ClassBuilderImpl
19992025
isCovariantByDeclaration,
20002026
declaredParameter,
20012027
isInterfaceCheck,
2002-
asIfDeclaredParameter: true);
2028+
asIfDeclaredParameter: true,
2029+
localMember: localMember);
20032030
return isCovariantByDeclaration;
20042031
}
20052032

20062033
// When the overriding member is inherited, report the class containing
20072034
// the conflict as the main error.
20082035
void reportInvalidOverride(bool isInterfaceCheck, Member declaredMember,
20092036
Message message, int fileOffset, int length,
2010-
{List<LocatedMessage>? context}) {
2037+
{List<LocatedMessage>? context, required Member? localMember}) {
20112038
if (shouldOverrideProblemBeOverlooked(this)) {
20122039
return;
20132040
}
20142041

2042+
if (localMember is Procedure) {
2043+
localMember.isErroneous = true;
2044+
} else if (localMember is Field) {
2045+
localMember.isErroneous = true;
2046+
}
2047+
20152048
if (declaredMember.enclosingClass == cls) {
20162049
// Ordinary override
20172050
libraryBuilder.addProblem(

0 commit comments

Comments
 (0)