diff --git a/test/classes_test.dart b/test/classes_test.dart index d1a7123e87..b727c0bf81 100644 --- a/test/classes_test.dart +++ b/test/classes_test.dart @@ -197,5 +197,37 @@ class D implements Object {} expect(toString.canonicalEnclosingContainer!.isDartCoreObject, isTrue); } + void test_multiplyInheritedOperator_oneIsPrivate() async { + // Test an edge case where inherited ExecutableElements can come both from + // private classes and public interfaces. The test makes sure the class + // still takes precedence. + // See https://github.com/dart-lang/dartdoc/issues/1561. + var library = await bootPackageWithLibrary(''' +abstract class A { + void operator []=(K key, V value); +} + +abstract class B implements A { + @override + operator []=(K key, V value); +} + +abstract class C extends B {} + +abstract class _D implements A { + @override + void operator []=(K key, V value); +} + +abstract class E = C with _D; +'''); + + var indexAssign = + library.classes.named('E').inheritedOperators.named('operator []='); + expect(indexAssign.element2.enclosingElement2!.name3, '_D'); + expect(indexAssign.canonicalEnclosingContainer!.name, 'E'); + expect(indexAssign.canonicalModelElement!.enclosingElement!.name, 'E'); + } + // TODO(srawlins): Test everything else about classes. } diff --git a/test/end2end/model_test.dart b/test/end2end/model_test.dart index 9729e5dae5..cb0649bb61 100644 --- a/test/end2end/model_test.dart +++ b/test/end2end/model_test.dart @@ -2,10 +2,10 @@ // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. -// ignore_for_file: non_constant_identifier_names - // ignore_for_file: analyzer_use_new_elements +// ignore_for_file: non_constant_identifier_names + import 'package:analyzer/dart/element/element2.dart'; import 'package:analyzer/dart/element/type.dart'; import 'package:analyzer/source/line_info.dart'; @@ -909,7 +909,7 @@ void main() async { }); test('can import other libraries with unusual URIs', () { - final importLists = fakeLibrary.element2.fragments + final importLists = fakeLibrary.element2.fragments .map((fragment) => fragment.libraryImports2); final exportLists = fakeLibrary.element2.fragments .map((fragment) => fragment.libraryExports2); @@ -1680,19 +1680,6 @@ void main() async { var gadgetGetter = GadgetExtender.instanceFields.named('gadgetGetter'); expect(gadgetGetter.isCanonical, isTrue); }); - - test( - 'ExecutableElements from private classes and from public interfaces (#1561)', - () { - var MIEEMixinWithOverride = - fakeLibrary.classes.wherePublic.named('MIEEMixinWithOverride'); - var problematicOperator = - MIEEMixinWithOverride.inheritedOperators.named('operator []='); - expect(problematicOperator.element2.enclosingElement2?.name3, - equals('_MIEEPrivateOverride')); - expect(problematicOperator.canonicalModelElement!.enclosingElement!.name, - equals('MIEEMixinWithOverride')); - }); }); group('Mixin', () { diff --git a/testing/test_package/lib/fake.dart b/testing/test_package/lib/fake.dart index 7cfaf1c0e2..5d6385f093 100644 --- a/testing/test_package/lib/fake.dart +++ b/testing/test_package/lib/fake.dart @@ -1117,34 +1117,6 @@ extension OnOldSchool on OldSchoolMixin { class School with OldSchoolMixin, NewSchoolMixin {} -// -// -// - -/// Test an edge case for cases where inherited ExecutableElements can come -/// both from private classes and public interfaces. The test makes sure the -/// class still takes precedence (#1561). -abstract class MIEEMixinWithOverride = MIEEBase - with _MIEEPrivateOverride; - -abstract class _MIEEPrivateOverride implements MIEEThing { - // ignore: annotate_overrides - void operator []=(K key, V value) { - throw UnsupportedError("Never use this"); - } -} - -abstract class MIEEBase extends MIEEMixin {} - -abstract class MIEEMixin implements MIEEThing { - // ignore: annotate_overrides - operator []=(K key, V value); -} - -abstract class MIEEThing { - void operator []=(K key, V value); -} - abstract class ImplementingClassForTool { /// Invokes a tool from inherited documentation via `implemented` ///