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
19941994refs/tags/2.14.0-97.0.dev: ba9c1636e87fbdcc02b8bc4a584455c32f8378b4
19951995refs/tags/2.14.0-98.0.dev: f2d370c93582bbf4da42b5dd4c906d6145b01ea9
19961996refs/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 {
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) {
Original file line number Diff line number Diff 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 ('''
410459class A {
You can’t perform that action at this time.
0 commit comments