Skip to content

Commit 5261e6e

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Support named constructor arguments in enum elements
Part of #47453 Change-Id: I68e9d822527bce84828924f849468d23794a4feb Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/228501 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Chloe Stefantsova <[email protected]>
1 parent 42d16cd commit 5261e6e

11 files changed

+491
-0
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ class DietListener extends StackListenerImpl {
187187
debugEvent("NamedMixinApplicationWithClause");
188188
}
189189

190+
@override
191+
void handleNamedArgument(Token colon) {
192+
debugEvent("NamedArgument");
193+
pop(); // Named argument name.
194+
}
195+
190196
@override
191197
void handleClassWithClause(Token withKeyword) {
192198
debugEvent("ClassWithClause");

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,6 +1898,13 @@ class OutlineBuilder extends StackListenerImpl {
18981898
}
18991899
}
19001900

1901+
@override
1902+
void handleNamedArgument(Token colon) {
1903+
debugEvent("NamedArgument");
1904+
pop(); // Named argument offset.
1905+
pop(); // Named argument name.
1906+
}
1907+
19011908
@override
19021909
void endNamedMixinApplication(Token beginToken, Token classKeyword,
19031910
Token equals, Token? implementsKeyword, Token endToken) {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
enum E0 {
6+
one(1, bar: 1),
7+
two(2, bar: 2);
8+
9+
final int foo;
10+
final int bar;
11+
12+
const E0(this.foo, {required this.bar});
13+
}
14+
15+
enum E1<X> {
16+
one(foo: "1"),
17+
two(foo: 2);
18+
19+
final X foo;
20+
21+
const E1({required this.foo});
22+
}
23+
24+
enum E2<X, Y, Z> {
25+
one(1, bar: "1", baz: 3.14),
26+
two("2", baz: 3.14, bar: 2),
27+
three(3.0, bar: false);
28+
29+
final X foo;
30+
final Y bar;
31+
final Z? baz;
32+
33+
const E2(this.foo, {required this.bar, this.baz = null});
34+
}
35+
36+
main() {}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E0 extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E0> values = #C8;
7+
static const field self::E0 one = #C4;
8+
static const field self::E0 two = #C7;
9+
final field core::int foo;
10+
final field core::int bar;
11+
const constructor •(core::int index, core::String name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
12+
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(index, name)
13+
;
14+
method toString() → core::String
15+
return "E0.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
18+
static const field core::List<self::E1<dynamic>> values = #C13;
19+
static const field self::E1<core::String> one = #C11;
20+
static const field self::E1<core::int> two = #C12;
21+
final field self::E1::X% foo;
22+
const constructor •(core::int index = #C9, core::String name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
23+
: self::E1::foo = foo, super core::_Enum::•(index, name)
24+
;
25+
method toString() → core::String
26+
return "E1.${this.{core::_Enum::_name}{core::String}}";
27+
}
28+
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
29+
static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
30+
static const field self::E2<core::int, core::String, core::double> one = #C15;
31+
static const field self::E2<core::String, core::int, core::double> two = #C17;
32+
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
33+
final field self::E2::X% foo;
34+
final field self::E2::Y% bar;
35+
final field self::E2::Z? baz;
36+
const constructor •(core::int index, core::String name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
37+
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(index, name)
38+
;
39+
method toString() → core::String
40+
return "E2.${this.{core::_Enum::_name}{core::String}}";
41+
}
42+
static method main() → dynamic {}
43+
44+
constants {
45+
#C1 = 1
46+
#C2 = 0
47+
#C3 = "one"
48+
#C4 = self::E0 {foo:#C1, bar:#C1, index:#C2, _name:#C3}
49+
#C5 = 2
50+
#C6 = "two"
51+
#C7 = self::E0 {foo:#C5, bar:#C5, index:#C1, _name:#C6}
52+
#C8 = <self::E0>[#C4, #C7]
53+
#C9 = null
54+
#C10 = "1"
55+
#C11 = self::E1<core::String> {foo:#C10, index:#C2, _name:#C3}
56+
#C12 = self::E1<core::int> {foo:#C5, index:#C1, _name:#C6}
57+
#C13 = <self::E1<dynamic>>[#C11, #C12]
58+
#C14 = 3.14
59+
#C15 = self::E2<core::int, core::String, core::double> {foo:#C1, bar:#C10, baz:#C14, index:#C2, _name:#C3}
60+
#C16 = "2"
61+
#C17 = self::E2<core::String, core::int, core::double> {foo:#C16, bar:#C5, baz:#C14, index:#C1, _name:#C6}
62+
#C18 = 3.0
63+
#C19 = false
64+
#C20 = "three"
65+
#C21 = self::E2<core::double, core::bool, dynamic> {foo:#C18, bar:#C19, baz:#C9, index:#C5, _name:#C20}
66+
#C22 = <self::E2<dynamic, dynamic, dynamic>>[#C15, #C17, #C21]
67+
}
68+
69+
70+
Constructor coverage from constants:
71+
org-dartlang-testcase:///named_arguments.dart:
72+
- E0. (from org-dartlang-testcase:///named_arguments.dart:12:9)
73+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
74+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
75+
- E1. (from org-dartlang-testcase:///named_arguments.dart:21:9)
76+
- E2. (from org-dartlang-testcase:///named_arguments.dart:33:9)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E0 extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E0> values = #C8;
7+
static const field self::E0 one = #C4;
8+
static const field self::E0 two = #C7;
9+
final field core::int foo;
10+
final field core::int bar;
11+
const constructor •(core::int index, core::String name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
12+
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(index, name)
13+
;
14+
method toString() → core::String
15+
return "E0.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
18+
static const field core::List<self::E1<dynamic>> values = #C13;
19+
static const field self::E1<core::String> one = #C11;
20+
static const field self::E1<core::int> two = #C12;
21+
final field self::E1::X% foo;
22+
const constructor •(core::int index = #C9, core::String name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
23+
: self::E1::foo = foo, super core::_Enum::•(index, name)
24+
;
25+
method toString() → core::String
26+
return "E1.${this.{core::_Enum::_name}{core::String}}";
27+
}
28+
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
29+
static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
30+
static const field self::E2<core::int, core::String, core::double> one = #C15;
31+
static const field self::E2<core::String, core::int, core::double> two = #C17;
32+
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
33+
final field self::E2::X% foo;
34+
final field self::E2::Y% bar;
35+
final field self::E2::Z? baz;
36+
const constructor •(core::int index, core::String name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
37+
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(index, name)
38+
;
39+
method toString() → core::String
40+
return "E2.${this.{core::_Enum::_name}{core::String}}";
41+
}
42+
static method main() → dynamic {}
43+
44+
constants {
45+
#C1 = 1
46+
#C2 = 0
47+
#C3 = "one"
48+
#C4 = self::E0 {foo:#C1, bar:#C1, index:#C2, _name:#C3}
49+
#C5 = 2
50+
#C6 = "two"
51+
#C7 = self::E0 {foo:#C5, bar:#C5, index:#C1, _name:#C6}
52+
#C8 = <self::E0>[#C4, #C7]
53+
#C9 = null
54+
#C10 = "1"
55+
#C11 = self::E1<core::String> {foo:#C10, index:#C2, _name:#C3}
56+
#C12 = self::E1<core::int> {foo:#C5, index:#C1, _name:#C6}
57+
#C13 = <self::E1<dynamic>>[#C11, #C12]
58+
#C14 = 3.14
59+
#C15 = self::E2<core::int, core::String, core::double> {foo:#C1, bar:#C10, baz:#C14, index:#C2, _name:#C3}
60+
#C16 = "2"
61+
#C17 = self::E2<core::String, core::int, core::double> {foo:#C16, bar:#C5, baz:#C14, index:#C1, _name:#C6}
62+
#C18 = 3.0
63+
#C19 = false
64+
#C20 = "three"
65+
#C21 = self::E2<core::double, core::bool, dynamic> {foo:#C18, bar:#C19, baz:#C9, index:#C5, _name:#C20}
66+
#C22 = <self::E2<dynamic, dynamic, dynamic>>[#C15, #C17, #C21]
67+
}
68+
69+
70+
Constructor coverage from constants:
71+
org-dartlang-testcase:///named_arguments.dart:
72+
- E0. (from org-dartlang-testcase:///named_arguments.dart:12:9)
73+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
74+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
75+
- E1. (from org-dartlang-testcase:///named_arguments.dart:21:9)
76+
- E2. (from org-dartlang-testcase:///named_arguments.dart:33:9)
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
enum E0 { one(1, bar: 1), two(2, bar: 2); final int foo; final int bar; const E0(this.foo, {required this.bar}); }
2+
enum E1<X> { one(foo: "1"), two(foo: 2); final X foo; const E1({required this.foo}); }
3+
enum E2<X, Y, Z> { one(1, bar: "1", baz: 3.14), two("2", baz: 3.14, bar: 2), three(3.0, bar: false); final X foo; final Y bar; final Z? baz; const E2(this.foo, {required this.bar, this.baz = null}); }
4+
main() {}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E0 extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E0> values = #C8;
7+
static const field self::E0 one = #C4;
8+
static const field self::E0 two = #C7;
9+
final field core::int foo;
10+
final field core::int bar;
11+
const constructor •(core::int index, core::String name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
12+
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(index, name)
13+
;
14+
method toString() → core::String
15+
return "E0.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
18+
static const field core::List<self::E1<dynamic>> values = #C13;
19+
static const field self::E1<core::String> one = #C11;
20+
static const field self::E1<core::int> two = #C12;
21+
final field self::E1::X% foo;
22+
const constructor •(core::int index = #C9, core::String name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
23+
: self::E1::foo = foo, super core::_Enum::•(index, name)
24+
;
25+
method toString() → core::String
26+
return "E1.${this.{core::_Enum::_name}{core::String}}";
27+
}
28+
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
29+
static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
30+
static const field self::E2<core::int, core::String, core::double> one = #C15;
31+
static const field self::E2<core::String, core::int, core::double> two = #C17;
32+
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
33+
final field self::E2::X% foo;
34+
final field self::E2::Y% bar;
35+
final field self::E2::Z? baz;
36+
const constructor •(core::int index, core::String name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
37+
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(index, name)
38+
;
39+
method toString() → core::String
40+
return "E2.${this.{core::_Enum::_name}{core::String}}";
41+
}
42+
static method main() → dynamic {}
43+
44+
constants {
45+
#C1 = 1
46+
#C2 = 0
47+
#C3 = "one"
48+
#C4 = self::E0 {foo:#C1, bar:#C1, index:#C2, _name:#C3}
49+
#C5 = 2
50+
#C6 = "two"
51+
#C7 = self::E0 {foo:#C5, bar:#C5, index:#C1, _name:#C6}
52+
#C8 = <self::E0*>[#C4, #C7]
53+
#C9 = null
54+
#C10 = "1"
55+
#C11 = self::E1<core::String*> {foo:#C10, index:#C2, _name:#C3}
56+
#C12 = self::E1<core::int*> {foo:#C5, index:#C1, _name:#C6}
57+
#C13 = <self::E1<dynamic>*>[#C11, #C12]
58+
#C14 = 3.14
59+
#C15 = self::E2<core::int*, core::String*, core::double*> {foo:#C1, bar:#C10, baz:#C14, index:#C2, _name:#C3}
60+
#C16 = "2"
61+
#C17 = self::E2<core::String*, core::int*, core::double*> {foo:#C16, bar:#C5, baz:#C14, index:#C1, _name:#C6}
62+
#C18 = 3.0
63+
#C19 = false
64+
#C20 = "three"
65+
#C21 = self::E2<core::double*, core::bool*, dynamic> {foo:#C18, bar:#C19, baz:#C9, index:#C5, _name:#C20}
66+
#C22 = <self::E2<dynamic, dynamic, dynamic>*>[#C15, #C17, #C21]
67+
}
68+
69+
70+
Constructor coverage from constants:
71+
org-dartlang-testcase:///named_arguments.dart:
72+
- E0. (from org-dartlang-testcase:///named_arguments.dart:12:9)
73+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
74+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
75+
- E1. (from org-dartlang-testcase:///named_arguments.dart:21:9)
76+
- E2. (from org-dartlang-testcase:///named_arguments.dart:33:9)
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E0 extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E0> values = #C8;
7+
static const field self::E0 one = #C4;
8+
static const field self::E0 two = #C7;
9+
final field core::int foo;
10+
final field core::int bar;
11+
const constructor •(core::int index, core::String name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
12+
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(index, name)
13+
;
14+
method toString() → core::String
15+
return "E0.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
18+
static const field core::List<self::E1<dynamic>> values = #C13;
19+
static const field self::E1<core::String> one = #C11;
20+
static const field self::E1<core::int> two = #C12;
21+
final field self::E1::X% foo;
22+
const constructor •(core::int index = #C9, core::String name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
23+
: self::E1::foo = foo, super core::_Enum::•(index, name)
24+
;
25+
method toString() → core::String
26+
return "E1.${this.{core::_Enum::_name}{core::String}}";
27+
}
28+
class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
29+
static const field core::List<self::E2<dynamic, dynamic, dynamic>> values = #C22;
30+
static const field self::E2<core::int, core::String, core::double> one = #C15;
31+
static const field self::E2<core::String, core::int, core::double> two = #C17;
32+
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
33+
final field self::E2::X% foo;
34+
final field self::E2::Y% bar;
35+
final field self::E2::Z? baz;
36+
const constructor •(core::int index, core::String name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
37+
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(index, name)
38+
;
39+
method toString() → core::String
40+
return "E2.${this.{core::_Enum::_name}{core::String}}";
41+
}
42+
static method main() → dynamic {}
43+
44+
constants {
45+
#C1 = 1
46+
#C2 = 0
47+
#C3 = "one"
48+
#C4 = self::E0 {foo:#C1, bar:#C1, index:#C2, _name:#C3}
49+
#C5 = 2
50+
#C6 = "two"
51+
#C7 = self::E0 {foo:#C5, bar:#C5, index:#C1, _name:#C6}
52+
#C8 = <self::E0*>[#C4, #C7]
53+
#C9 = null
54+
#C10 = "1"
55+
#C11 = self::E1<core::String*> {foo:#C10, index:#C2, _name:#C3}
56+
#C12 = self::E1<core::int*> {foo:#C5, index:#C1, _name:#C6}
57+
#C13 = <self::E1<dynamic>*>[#C11, #C12]
58+
#C14 = 3.14
59+
#C15 = self::E2<core::int*, core::String*, core::double*> {foo:#C1, bar:#C10, baz:#C14, index:#C2, _name:#C3}
60+
#C16 = "2"
61+
#C17 = self::E2<core::String*, core::int*, core::double*> {foo:#C16, bar:#C5, baz:#C14, index:#C1, _name:#C6}
62+
#C18 = 3.0
63+
#C19 = false
64+
#C20 = "three"
65+
#C21 = self::E2<core::double*, core::bool*, dynamic> {foo:#C18, bar:#C19, baz:#C9, index:#C5, _name:#C20}
66+
#C22 = <self::E2<dynamic, dynamic, dynamic>*>[#C15, #C17, #C21]
67+
}
68+
69+
70+
Constructor coverage from constants:
71+
org-dartlang-testcase:///named_arguments.dart:
72+
- E0. (from org-dartlang-testcase:///named_arguments.dart:12:9)
73+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:76:9)
74+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
75+
- E1. (from org-dartlang-testcase:///named_arguments.dart:21:9)
76+
- E2. (from org-dartlang-testcase:///named_arguments.dart:33:9)

0 commit comments

Comments
 (0)