From 6bcc451e597867cb7c0b4f21d9143d0a43cbb401 Mon Sep 17 00:00:00 2001 From: Konstantin Shcheglov Date: Tue, 8 Feb 2022 01:49:35 +0000 Subject: [PATCH] Report DUPLICATE_DEFINITION for 'values' in enums. Change-Id: I0df2f7286e8913b3a323fd19bb18a8d77f27bbe6 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232025 Reviewed-by: Brian Wilkerson Commit-Queue: Konstantin Shcheglov --- .../lib/src/dart/element/element.dart | 11 +++ .../error/duplicate_definition_verifier.dart | 5 ++ .../duplicate_definition_test.dart | 73 +++++++++++++++++++ .../illegal_enum_values_declaration_test.dart | 10 --- 4 files changed, 89 insertions(+), 10 deletions(-) diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart index d05d022d4de..229d4507451 100644 --- a/pkg/analyzer/lib/src/dart/element/element.dart +++ b/pkg/analyzer/lib/src/dart/element/element.dart @@ -2788,6 +2788,17 @@ class EnumElementImpl extends AbstractClassElementImpl { return super.typeParameters; } + ConstFieldElementImpl? get valuesField { + for (var field in fields) { + if (field is ConstFieldElementImpl && + field.name == 'values' && + field.isSyntheticEnumField) { + return field; + } + } + return null; + } + @override void appendTo(ElementDisplayStringBuilder builder) { builder.writeEnumElement(this); diff --git a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart index 58934633579..ed4297ec09d 100644 --- a/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart +++ b/pkg/analyzer/lib/src/error/duplicate_definition_verifier.dart @@ -53,6 +53,11 @@ class DuplicateDefinitionVerifier { var staticGetters = {}; var staticSetters = {}; + var valuesField = enumElement.valuesField; + if (valuesField != null) { + staticGetters['values'] = valuesField; + } + for (EnumConstantDeclaration constant in node.constants) { _checkDuplicateIdentifier(staticGetters, constant.name); } diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart index 09a546feaf9..517491fae6d 100644 --- a/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart +++ b/pkg/analyzer/test/src/diagnostics/duplicate_definition_test.dart @@ -329,6 +329,26 @@ f(,[]) {} @reflectiveTest class DuplicateDefinitionEnumTest extends PubPackageResolutionTest { + test_constant() async { + await assertErrorsInCode(r''' +enum E { + foo, foo +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 16, 3), + ]); + } + + test_constant_values() async { + await assertErrorsInCode(r''' +enum E { + values +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 11, 6), + ]); + } + test_instance_field_field() async { await assertErrorsInCode(r''' enum E { @@ -491,6 +511,48 @@ enum E { ]); } + test_static_constant_field() async { + await assertErrorsInCode(r''' +enum E { + foo; + static int foo = 0; +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 29, 3), + ]); + } + + test_static_constant_getter() async { + await assertErrorsInCode(r''' +enum E { + foo; + static int get foo => 0; +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 33, 3), + ]); + } + + test_static_constant_method() async { + await assertErrorsInCode(r''' +enum E { + foo; + static void foo() {} +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 30, 3), + ]); + } + + test_static_constant_setter() async { + await assertNoErrorsInCode(r''' +enum E { + foo; + static set foo(int _) {} +} +'''); + } + test_static_field_field() async { await assertErrorsInCode(r''' enum E { @@ -527,6 +589,17 @@ enum E { ]); } + test_static_field_values() async { + await assertErrorsInCode(r''' +enum E { + v; + static int values = 0; +} +''', [ + error(CompileTimeErrorCode.DUPLICATE_DEFINITION, 27, 6), + ]); + } + test_static_fieldFinal_getter() async { await assertErrorsInCode(r''' enum E { diff --git a/pkg/analyzer/test/src/diagnostics/illegal_enum_values_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/illegal_enum_values_declaration_test.dart index bf6a079604c..25014ed6ce6 100644 --- a/pkg/analyzer/test/src/diagnostics/illegal_enum_values_declaration_test.dart +++ b/pkg/analyzer/test/src/diagnostics/illegal_enum_values_declaration_test.dart @@ -98,16 +98,6 @@ enum E { ]); } - /// TODO(scheglov) this is wrong, we should get an error - test_enum_field_static() async { - await assertNoErrorsInCode(r''' -enum E { - v; - static int values = 0; -} -'''); - } - test_enum_getter() async { await assertErrorsInCode(r''' enum E {