Report DUPLICATE_DEFINITION for 'values' in enums.

Change-Id: I0df2f7286e8913b3a323fd19bb18a8d77f27bbe6
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/232025
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2022-02-08 01:49:35 +00:00 committed by Commit Bot
parent cc93c8815b
commit 6bcc451e59
4 changed files with 89 additions and 10 deletions

View file

@ -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);

View file

@ -53,6 +53,11 @@ class DuplicateDefinitionVerifier {
var staticGetters = <String, Element>{};
var staticSetters = <String, Element>{};
var valuesField = enumElement.valuesField;
if (valuesField != null) {
staticGetters['values'] = valuesField;
}
for (EnumConstantDeclaration constant in node.constants) {
_checkDuplicateIdentifier(staticGetters, constant.name);
}

View file

@ -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 {

View file

@ -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 {