File tree Expand file tree Collapse file tree 3 files changed +60
-8
lines changed
trunk/pkg/analysis_server Expand file tree Collapse file tree 3 files changed +60
-8
lines changed Original file line number Diff line number Diff line change @@ -1994,4 +1994,4 @@ refs/tags/2.14.0-96.0.dev: 1eee24e50fc3028754d9a8e98852b949c04da4e4
1994
1994
refs/tags/2.14.0-97.0.dev: ba9c1636e87fbdcc02b8bc4a584455c32f8378b4
1995
1995
refs/tags/2.14.0-98.0.dev: f2d370c93582bbf4da42b5dd4c906d6145b01ea9
1996
1996
refs/tags/2.14.0-99.0.dev: e722f62b48fb382534efc1f20735def68848006f
1997
- refs/heads/main: 6c301a4e32089b7ec55b10c1a41efaa8c0c762e0
1997
+ refs/heads/main: 1b8a3b104593f39a188e5ab074053b4b4113873d
Original file line number Diff line number Diff line change @@ -160,7 +160,7 @@ class _OverriddenElementsFinder {
160
160
*/
161
161
OverriddenElements find () {
162
162
_visited.clear ();
163
- _addSuperOverrides (_class.supertype );
163
+ _addSuperOverrides (_class.type, withThisType : false );
164
164
_visited.clear ();
165
165
_addInterfaceOverrides (_class.type, false );
166
166
_superElements.forEach (_interfaceElements.remove);
@@ -189,20 +189,23 @@ class _OverriddenElementsFinder {
189
189
_addInterfaceOverrides (type.superclass, checkType);
190
190
}
191
191
192
- void _addSuperOverrides (InterfaceType type) {
192
+ void _addSuperOverrides (InterfaceType type, { bool withThisType : true } ) {
193
193
if (type == null ) {
194
194
return ;
195
195
}
196
196
if (! _visited.add (type)) {
197
197
return ;
198
198
}
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
+ }
203
205
}
204
- // super
206
+
205
207
_addSuperOverrides (type.superclass);
208
+ type.mixins.forEach (_addSuperOverrides);
206
209
}
207
210
208
211
Element _lookupMember (ClassElement classElement) {
Original file line number Diff line number Diff line change @@ -405,6 +405,55 @@ class C extends A implements A {
405
405
expect (override.interfaceMembers, isNull);
406
406
}
407
407
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
+
408
457
test_staticMembers () async {
409
458
addTestFile ('''
410
459
class A {
You can’t perform that action at this time.
0 commit comments