Skip to content

Commit 1b8a3b1

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Implement support for overridden elements that are declared in mixins.
R=brianwilkerson@google.com Change-Id: I70ca606b23b928481f24d1322cfbd01a9b3d3e5f Reviewed-on: https://dart-review.googlesource.com/54071 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
1 parent 6c301a4 commit 1b8a3b1

File tree

2 files changed

+59
-7
lines changed

2 files changed

+59
-7
lines changed

pkg/analysis_server/lib/src/computer/computer_overrides.dart

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ class _OverriddenElementsFinder {
160160
*/
161161
OverriddenElements find() {
162162
_visited.clear();
163-
_addSuperOverrides(_class.supertype);
163+
_addSuperOverrides(_class.type, withThisType: false);
164164
_visited.clear();
165165
_addInterfaceOverrides(_class.type, false);
166166
_superElements.forEach(_interfaceElements.remove);
@@ -189,20 +189,23 @@ class _OverriddenElementsFinder {
189189
_addInterfaceOverrides(type.superclass, checkType);
190190
}
191191

192-
void _addSuperOverrides(InterfaceType type) {
192+
void _addSuperOverrides(InterfaceType type, {bool withThisType: true}) {
193193
if (type == null) {
194194
return;
195195
}
196196
if (!_visited.add(type)) {
197197
return;
198198
}
199-
// this type
200-
Element element = _lookupMember(type.element);
201-
if (element != null && !_superElements.contains(element)) {
202-
_superElements.add(element);
199+
200+
if (withThisType) {
201+
Element element = _lookupMember(type.element);
202+
if (element != null && !_superElements.contains(element)) {
203+
_superElements.add(element);
204+
}
203205
}
204-
// super
206+
205207
_addSuperOverrides(type.superclass);
208+
type.mixins.forEach(_addSuperOverrides);
206209
}
207210

208211
Element _lookupMember(ClassElement classElement) {

pkg/analysis_server/test/analysis/notification_overrides_test.dart

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,55 @@ class C extends A implements A {
405405
expect(override.interfaceMembers, isNull);
406406
}
407407

408+
test_mixin_method_direct() async {
409+
addTestFile('''
410+
class A {
411+
m() {} // in A
412+
}
413+
class B extends Object with A {
414+
m() {} // in B
415+
}
416+
''');
417+
await prepareOverrides();
418+
assertHasOverride('m() {} // in B');
419+
assertHasSuperElement('m() {} // in A');
420+
assertNoInterfaceMembers();
421+
}
422+
423+
test_mixin_method_indirect() async {
424+
addTestFile('''
425+
class A {
426+
m() {} // in A
427+
}
428+
class B extends A {
429+
}
430+
class C extends Object with B {
431+
m() {} // in C
432+
}
433+
''');
434+
await prepareOverrides();
435+
assertHasOverride('m() {} // in C');
436+
assertHasSuperElement('m() {} // in A');
437+
assertNoInterfaceMembers();
438+
}
439+
440+
test_mixin_method_indirect2() async {
441+
addTestFile('''
442+
class A {
443+
m() {} // in A
444+
}
445+
class B extends Object with A {
446+
}
447+
class C extends B {
448+
m() {} // in C
449+
}
450+
''');
451+
await prepareOverrides();
452+
assertHasOverride('m() {} // in C');
453+
assertHasSuperElement('m() {} // in A');
454+
assertNoInterfaceMembers();
455+
}
456+
408457
test_staticMembers() async {
409458
addTestFile('''
410459
class A {

0 commit comments

Comments
 (0)