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

Commit 34afa49

Browse files
Merge interfaces only when necessary
Change-Id: I3d6f709df3e262447150abd84c30ef5a58a7a1d8 Reviewed-on: https://dart-review.googlesource.com/c/88323 Reviewed-by: Dmitry Stefantsov <[email protected]>
1 parent 1dc920e commit 34afa49

File tree

1 file changed

+38
-15
lines changed

1 file changed

+38
-15
lines changed

pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -97,14 +97,16 @@ class ClassHierarchyBuilder {
9797
]);
9898
}
9999
}
100-
if (aTarget.name == noSuchMethodName && !aTarget.isAbstract) {
100+
if (mergeKind == MergeKind.superclass &&
101+
aTarget.name == noSuchMethodName &&
102+
!aTarget.isAbstract) {
101103
hasNoSuchMethod = true;
102104
}
103105
Declaration result = a;
104106
if (mergeKind == MergeKind.interfaces) {
105107
// TODO(ahe): Combine the signatures of a and b.
106108
} else if (aTarget.isAbstract) {
107-
if (!bTarget.isAbstract) {
109+
if (mergeKind == MergeKind.superclass && !bTarget.isAbstract) {
108110
// An abstract method doesn't override an implemention inherited from a
109111
// superclass.
110112
result = b;
@@ -124,7 +126,8 @@ class ClassHierarchyBuilder {
124126
/// implementing/overriding anything.
125127
void handleOnlyA(Declaration member, MergeKind mergeKind) {
126128
Member target = member.target;
127-
if (mergeKind == MergeKind.superclass && target.isAbstract) {
129+
if (mergeKind == MergeKind.supertypes ||
130+
(mergeKind == MergeKind.superclass && target.isAbstract)) {
128131
abstractMemberCount++;
129132
}
130133
}
@@ -139,7 +142,8 @@ class ClassHierarchyBuilder {
139142
void handleOnlyB(
140143
KernelClassBuilder cls, Declaration member, MergeKind mergeKind) {
141144
Member target = member.target;
142-
if (mergeKind == MergeKind.superclass && target.isAbstract) {
145+
if (mergeKind == MergeKind.supertypes ||
146+
(mergeKind == MergeKind.superclass && target.isAbstract)) {
143147
if (isNameVisibleIn(target.name, cls.library)) {
144148
abstractMemberCount++;
145149
}
@@ -189,8 +193,8 @@ class ClassHierarchyBuilder {
189193
List<Declaration> interfaceSetters;
190194
if (supernode == null) {
191195
// This should be Object.
192-
interfaceMembers = classMembers = localMembers;
193-
interfaceSetters = classSetters = localSetters;
196+
classMembers = localMembers;
197+
classSetters = localSetters;
194198
} else {
195199
classMembers = merge(
196200
cls, localMembers, supernode.classMembers, MergeKind.superclass);
@@ -202,8 +206,16 @@ class ClassHierarchyBuilder {
202206
interfaceMembers = result.mergedMembers;
203207
interfaceSetters = result.mergedSetters;
204208
} else {
205-
interfaceMembers = classMembers;
206-
interfaceSetters = classSetters;
209+
interfaceMembers = supernode.interfaceMembers;
210+
interfaceSetters = supernode.interfaceSetters;
211+
}
212+
if (interfaceMembers != null) {
213+
interfaceMembers =
214+
merge(cls, classMembers, interfaceMembers, MergeKind.supertypes);
215+
}
216+
if (interfaceMembers != null) {
217+
interfaceSetters =
218+
merge(cls, classSetters, interfaceSetters, MergeKind.supertypes);
207219
}
208220
}
209221
nodes[cls] = new ClassHierarchyNode(cls, scope, classMembers, classSetters,
@@ -223,19 +235,21 @@ class ClassHierarchyBuilder {
223235
MergeResult mergeInterfaces(KernelClassBuilder cls,
224236
ClassHierarchyNode supernode, List<KernelTypeBuilder> interfaces) {
225237
List<List<Declaration>> memberLists =
226-
List<List<Declaration>>(interfaces.length + 1);
238+
new List<List<Declaration>>(interfaces.length + 1);
227239
List<List<Declaration>> setterLists =
228-
List<List<Declaration>>(interfaces.length + 1);
240+
new List<List<Declaration>>(interfaces.length + 1);
229241
memberLists[0] = supernode.interfaceMembers;
230242
setterLists[0] = supernode.interfaceSetters;
231243
for (int i = 0; i < interfaces.length; i++) {
232244
ClassHierarchyNode interfaceNode = getNode(interfaces[i]);
233245
if (interfaceNode == null) {
234-
memberLists[i + 1] = <Declaration>[];
235-
setterLists[i + 1] = <Declaration>[];
246+
memberLists[i + 1] = null;
247+
setterLists[i + 1] = null;
236248
} else {
237-
memberLists[i + 1] = interfaceNode.interfaceMembers;
238-
setterLists[i + 1] = interfaceNode.interfaceSetters;
249+
memberLists[i + 1] =
250+
interfaceNode.interfaceMembers ?? interfaceNode.classMembers;
251+
setterLists[i + 1] =
252+
interfaceNode.interfaceSetters ?? interfaceNode.classSetters;
239253
}
240254
}
241255
return new MergeResult(
@@ -250,7 +264,15 @@ class ClassHierarchyBuilder {
250264
while (input.length > 1) {
251265
List<List<Declaration>> output = <List<Declaration>>[];
252266
for (int i = 0; i < input.length - 1; i += 2) {
253-
output.add(merge(cls, input[i], input[i + 1], MergeKind.interfaces));
267+
List<Declaration> first = input[i];
268+
List<Declaration> second = input[i + 1];
269+
if (first == null) {
270+
output.add(second);
271+
} else if (second == null) {
272+
output.add(first);
273+
} else {
274+
output.add(merge(cls, first, second, MergeKind.interfaces));
275+
}
254276
}
255277
if (input.length.isOdd) {
256278
output.add(input.last);
@@ -350,6 +372,7 @@ class ClassHierarchyBuilder {
350372
}
351373
}
352374
}
375+
if (missingNames.isEmpty) return;
353376
cls.addProblem(
354377
templateMissingImplementationNotAbstract.withArguments(
355378
cls.fullNameForErrors, missingNames),

0 commit comments

Comments
 (0)