From 774cafe41d0b9b3c93b19933a605e214db7f56b1 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Wed, 23 Feb 2022 16:42:42 +0000 Subject: [PATCH] Don't report unimplemented abstract for 'index' in enum. Bug: https://github.com/dart-lang/sdk/issues/48438 Change-Id: I5d6357ce0dcff872a2f4b356359a19554833bf97 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/233968 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../lib/src/error/inheritance_override.dart | 12 +++- .../illegal_enum_values_inheritance_test.dart | 58 ++++++++++++++++++- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart index b55e65d7341..dc309b06dfc 100644 --- a/pkg/analyzer/lib/src/error/inheritance_override.dart +++ b/pkg/analyzer/lib/src/error/inheritance_override.dart @@ -242,10 +242,16 @@ class _ClassVerifier { // No concrete implementation of the name. if (concreteElement == null) { - if (!_reportConcreteClassWithAbstractMember(name.name)) { - inheritedAbstract ??= []; - inheritedAbstract.add(interfaceElement); + if (_reportConcreteClassWithAbstractMember(name.name)) { + continue; } + // We already reported ILLEGAL_ENUM_VALUES_INHERITANCE. + if (classElement.isEnum && + const {'values', 'values='}.contains(name.name)) { + continue; + } + inheritedAbstract ??= []; + inheritedAbstract.add(interfaceElement); continue; } diff --git a/pkg/analyzer/test/src/diagnostics/illegal_enum_values_inheritance_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_enum_values_inheritance_test.dart index 234df7e1b4e..4c32c16351b 100644 --- a/pkg/analyzer/test/src/diagnostics/illegal_enum_values_inheritance_test.dart +++ b/pkg/analyzer/test/src/diagnostics/illegal_enum_values_inheritance_test.dart @@ -87,7 +87,35 @@ abstract class B extends A implements Enum {} ]); } - test_enum_method() async { + test_enum_getter_fromImplements() async { + await assertErrorsInCode(r''' +class A { + int get values => 0; +} + +enum E implements A { + v +} +''', [ + error(CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE, 41, 1), + ]); + } + + test_enum_method_fromImplements() async { + await assertErrorsInCode(r''' +class A { + int values() => 0; +} + +enum E implements A { + v +} +''', [ + error(CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE, 39, 1), + ]); + } + + test_enum_method_fromWith() async { await assertErrorsInCode(r''' mixin M { int values() => 0; @@ -101,6 +129,34 @@ enum E with M { ]); } + test_enum_setter_fromImplements() async { + await assertErrorsInCode(r''' +class A { + set values(int _) {} +} + +enum E implements A { + v +} +''', [ + error(CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE, 41, 1), + ]); + } + + test_enum_setter_fromWith() async { + await assertErrorsInCode(r''' +mixin M { + set values(int _) {} +} + +enum E with M { + v +} +''', [ + error(CompileTimeErrorCode.ILLEGAL_ENUM_VALUES_INHERITANCE, 41, 1), + ]); + } + test_mixin_field() async { await assertErrorsInCode(r''' class A {