Skip to content

Commit 0ff6340

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Error on type arguments without value arguments in enum elements
Part of #47453 Change-Id: Icf8b5a58d991c4fb693fd41e9b49dc326269c9fc Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/229153 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 50db7c5 commit 0ff6340

12 files changed

+114
-25
lines changed

pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2788,6 +2788,16 @@ const MessageCode messageEnumDeclaresConstFactory = const MessageCode(
27882788
correctionMessage:
27892789
r"""Try removing the factory constructor declaration.""");
27902790

2791+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2792+
const Code<Null> codeEnumEntryWithTypeArgumentsWithoutArguments =
2793+
messageEnumEntryWithTypeArgumentsWithoutArguments;
2794+
2795+
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
2796+
const MessageCode messageEnumEntryWithTypeArgumentsWithoutArguments =
2797+
const MessageCode("EnumEntryWithTypeArgumentsWithoutArguments",
2798+
problemMessage:
2799+
r"""Missing arguments in enum constructor invocation.""");
2800+
27912801
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
27922802
const Code<Null> codeEnumInClass = messageEnumInClass;
27932803

pkg/front_end/lib/src/fasta/source/source_enum_builder.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,9 @@ import '../builder/type_variable_builder.dart';
2727
import '../fasta_codes.dart'
2828
show
2929
LocatedMessage,
30+
messageEnumEntryWithTypeArgumentsWithoutArguments,
3031
messageNoUnnamedConstructorInObject,
32+
noLength,
3133
templateDuplicatedDeclaration,
3234
templateDuplicatedDeclarationCause,
3335
templateDuplicatedDeclarationSyntheticCause,
@@ -556,6 +558,13 @@ class SourceEnumBuilder extends SourceClassBuilder {
556558
constructorBuilder is! SourceConstructorBuilder) {
557559
// TODO(cstefantsova): Report an error.
558560
} else {
561+
if (enumConstantInfo.argumentsBeginToken == null &&
562+
enumConstantInfo.constructorReferenceBuilder?.typeArguments !=
563+
null) {
564+
addProblem(messageEnumEntryWithTypeArgumentsWithoutArguments,
565+
enumConstantInfo.charOffset, noLength);
566+
}
567+
559568
Arguments arguments;
560569
List<Expression> enumSyntheticArguments = <Expression>[
561570
new IntLiteral(index++),

pkg/front_end/messages.status

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,8 @@ EnumDeclaresConstFactory/analyzerCode: Fail
217217
EnumDeclaresConstFactory/example: Fail
218218
EnumDeclaresFactory/analyzerCode: Fail
219219
EnumDeclaresFactory/example: Fail
220+
EnumEntryWithTypeArgumentsWithoutArguments/analyzerCode: Fail
221+
EnumEntryWithTypeArgumentsWithoutArguments/example: Fail
220222
EnumInstantiation/example: Fail
221223
EnumSupertypeOfNonAbstractClass/analyzerCode: Fail
222224
EnumSupertypeOfNonAbstractClass/example: Fail

pkg/front_end/messages.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5458,3 +5458,6 @@ SuperInitializerParameter:
54585458

54595459
EnumSupertypeOfNonAbstractClass:
54605460
problemMessage: "Non-abstract class '#name' has 'Enum' as a superinterface."
5461+
5462+
EnumEntryWithTypeArgumentsWithoutArguments:
5463+
problemMessage: "Missing arguments in enum constructor invocation."

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
enum E<X, Y> {
66
one<int, String>(),
77
two<double, num>(),
8-
three<int, int>.named(42);
8+
three<int, int>.named(42),
9+
four<num, bool>; // Error.
910

1011
const E();
1112
const E.named(int value);

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.expect

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = #C10;
13+
static const field core::List<self::E<dynamic, dynamic>> values = #C13;
714
static const field self::E<core::int, core::String> one = #C3;
815
static const field self::E<core::double, core::num> two = #C6;
916
static const field self::E<core::int, core::int> three = #C9;
17+
static const field self::E<dynamic, dynamic> four = #C12;
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -28,13 +36,16 @@ constants {
2836
#C7 = 2
2937
#C8 = "three"
3038
#C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
31-
#C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
39+
#C10 = 3
40+
#C11 = "four"
41+
#C12 = self::E<core::num, core::bool> {index:#C10, _name:#C11}
42+
#C13 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9, #C12]
3243
}
3344

3445

3546
Constructor coverage from constants:
3647
org-dartlang-testcase:///entries_with_type_arguments.dart:
37-
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
48+
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
3849
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
3950
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
40-
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
51+
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:12:9)

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.strong.transformed.expect

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = #C10;
13+
static const field core::List<self::E<dynamic, dynamic>> values = #C13;
714
static const field self::E<core::int, core::String> one = #C3;
815
static const field self::E<core::double, core::num> two = #C6;
916
static const field self::E<core::int, core::int> three = #C9;
17+
static const field self::E<dynamic, dynamic> four = #C12;
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -28,13 +36,16 @@ constants {
2836
#C7 = 2
2937
#C8 = "three"
3038
#C9 = self::E<core::int, core::int> {index:#C7, _name:#C8}
31-
#C10 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9]
39+
#C10 = 3
40+
#C11 = "four"
41+
#C12 = self::E<core::num, core::bool> {index:#C10, _name:#C11}
42+
#C13 = <self::E<dynamic, dynamic>>[#C3, #C6, #C9, #C12]
3243
}
3344

3445

3546
Constructor coverage from constants:
3647
org-dartlang-testcase:///entries_with_type_arguments.dart:
37-
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
48+
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
3849
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
3950
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
40-
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
51+
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:12:9)
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42); const E(); const E.named(int value); }
1+
enum E<X, Y> { one<int, String>(), two<double, num>(), three<int, int>.named(42), four<num, bool>; const E(); const E.named(int value); }
22
main() {}

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.expect

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = #C10;
13+
static const field core::List<self::E<dynamic, dynamic>> values = #C13;
714
static const field self::E<core::int, core::String> one = #C3;
815
static const field self::E<core::double, core::num> two = #C6;
916
static const field self::E<core::int, core::int> three = #C9;
17+
static const field self::E<dynamic, dynamic> four = #C12;
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -28,13 +36,16 @@ constants {
2836
#C7 = 2
2937
#C8 = "three"
3038
#C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
31-
#C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
39+
#C10 = 3
40+
#C11 = "four"
41+
#C12 = self::E<core::num*, core::bool*> {index:#C10, _name:#C11}
42+
#C13 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9, #C12]
3243
}
3344

3445

3546
Constructor coverage from constants:
3647
org-dartlang-testcase:///entries_with_type_arguments.dart:
37-
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
48+
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
3849
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
3950
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
40-
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
51+
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:12:9)

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.modular.expect

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = #C10;
13+
static const field core::List<self::E<dynamic, dynamic>> values = #C13;
714
static const field self::E<core::int, core::String> one = #C3;
815
static const field self::E<core::double, core::num> two = #C6;
916
static const field self::E<core::int, core::int> three = #C9;
17+
static const field self::E<dynamic, dynamic> four = #C12;
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -28,13 +36,16 @@ constants {
2836
#C7 = 2
2937
#C8 = "three"
3038
#C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
31-
#C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
39+
#C10 = 3
40+
#C11 = "four"
41+
#C12 = self::E<core::num*, core::bool*> {index:#C10, _name:#C11}
42+
#C13 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9, #C12]
3243
}
3344

3445

3546
Constructor coverage from constants:
3647
org-dartlang-testcase:///entries_with_type_arguments.dart:
37-
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
48+
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
3849
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
3950
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
40-
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
51+
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:12:9)

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.outline.expect

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = const <self::E<dynamic, dynamic>>[self::E::one, self::E::two, self::E::three];
13+
static const field core::List<self::E<dynamic, dynamic>> values = const <self::E<dynamic, dynamic>>[self::E::one, self::E::two, self::E::three, self::E::four];
714
static const field self::E<core::int, core::String> one = const self::E::•<core::int, core::String>(0, "one");
815
static const field self::E<core::double, core::num> two = const self::E::•<core::double, core::num>(1, "two");
916
static const field self::E<core::int, core::int> three = const self::E::named<core::int, core::int>(2, "three", 42);
17+
static const field self::E<dynamic, dynamic> four = const self::E::•<core::num, core::bool>(3, "four");
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -21,8 +29,9 @@ static method main() → dynamic
2129

2230

2331
Extra constant evaluation status:
24-
Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E<dynamic, dynamic>*>[const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"}, const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"}, const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"}])
32+
Evaluated: ListLiteral @ org-dartlang-testcase:///entries_with_type_arguments.dart:5:6 -> ListConstant(const <E<dynamic, dynamic>*>[const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"}, const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"}, const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"}, const E<num*, bool*>{_Enum.index: 3, _Enum._name: "four"}])
2533
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:6:3 -> InstanceConstant(const E<int*, String*>{_Enum.index: 0, _Enum._name: "one"})
2634
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:7:3 -> InstanceConstant(const E<double*, num*>{_Enum.index: 1, _Enum._name: "two"})
2735
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:8:3 -> InstanceConstant(const E<int*, int*>{_Enum.index: 2, _Enum._name: "three"})
28-
Extra constant evaluation: evaluated: 11, effectively constant: 4
36+
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///entries_with_type_arguments.dart:9:3 -> InstanceConstant(const E<num*, bool*>{_Enum.index: 3, _Enum._name: "four"})
37+
Extra constant evaluation: evaluated: 12, effectively constant: 5

pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart.weak.transformed.expect

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,20 @@
11
library /*isNonNullableByDefault*/;
2+
//
3+
// Problems in library:
4+
//
5+
// pkg/front_end/testcases/enhanced_enums/entries_with_type_arguments.dart:9:3: Error: Missing arguments in enum constructor invocation.
6+
// four<num, bool>; // Error.
7+
// ^
8+
//
29
import self as self;
310
import "dart:core" as core;
411

512
class E<X extends core::Object? = dynamic, Y extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
6-
static const field core::List<self::E<dynamic, dynamic>> values = #C10;
13+
static const field core::List<self::E<dynamic, dynamic>> values = #C13;
714
static const field self::E<core::int, core::String> one = #C3;
815
static const field self::E<core::double, core::num> two = #C6;
916
static const field self::E<core::int, core::int> three = #C9;
17+
static const field self::E<dynamic, dynamic> four = #C12;
1018
const constructor •(core::int index, core::String name) → self::E<self::E::X%, self::E::Y%>
1119
: super core::_Enum::•(index, name)
1220
;
@@ -28,13 +36,16 @@ constants {
2836
#C7 = 2
2937
#C8 = "three"
3038
#C9 = self::E<core::int*, core::int*> {index:#C7, _name:#C8}
31-
#C10 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9]
39+
#C10 = 3
40+
#C11 = "four"
41+
#C12 = self::E<core::num*, core::bool*> {index:#C10, _name:#C11}
42+
#C13 = <self::E<dynamic, dynamic>*>[#C3, #C6, #C9, #C12]
3243
}
3344

3445

3546
Constructor coverage from constants:
3647
org-dartlang-testcase:///entries_with_type_arguments.dart:
37-
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:10:9)
48+
- E. (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
3849
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
3950
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
40-
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:11:9)
51+
- E.named (from org-dartlang-testcase:///entries_with_type_arguments.dart:12:9)

0 commit comments

Comments
 (0)