Skip to content

Commit 7271367

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
---
yaml --- r: 311700 b: refs/heads/main c: 1b8a3b1 h: refs/heads/main
1 parent 2634e17 commit 7271367

File tree

3 files changed

+60
-8
lines changed

3 files changed

+60
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1994,4 +1994,4 @@ refs/tags/2.14.0-96.0.dev: 1eee24e50fc3028754d9a8e98852b949c04da4e4
19941994
refs/tags/2.14.0-97.0.dev: ba9c1636e87fbdcc02b8bc4a584455c32f8378b4
19951995
refs/tags/2.14.0-98.0.dev: f2d370c93582bbf4da42b5dd4c906d6145b01ea9
19961996
refs/tags/2.14.0-99.0.dev: e722f62b48fb382534efc1f20735def68848006f
1997-
refs/heads/main: 6c301a4e32089b7ec55b10c1a41efaa8c0c762e0
1997+
refs/heads/main: 1b8a3b104593f39a188e5ab074053b4b4113873d

trunk/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) {

trunk/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)