Skip to content

Commit 56b013f

Browse files
chloestefantsovaCommit Bot
authored and
Commit Bot
committed
[cfe] Adjust the parameter number for enum constructors
Closes #49216 Change-Id: Id3ad8f10632fc87075fef45f2f60b21016ade20f Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247965 Commit-Queue: Chloe Stefantsova <[email protected]> Reviewed-by: Johnni Winther <[email protected]>
1 parent 2b97a2f commit 56b013f

13 files changed

+179
-15
lines changed

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

+10
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import '../messages.dart'
4747
noLength;
4848
import '../scope.dart';
4949
import '../source/source_class_builder.dart';
50+
import '../source/source_enum_builder.dart';
5051
import '../source/source_library_builder.dart' show SourceLibraryBuilder;
5152
import '../source/source_loader.dart' show SourceLoader;
5253
import '../source/source_member_builder.dart';
@@ -248,6 +249,15 @@ class DeclaredSourceConstructorBuilder extends SourceFunctionBuilderImpl
248249
return _constructor;
249250
}
250251

252+
@override
253+
VariableDeclaration getFormalParameter(int index) {
254+
if (parent is SourceEnumBuilder) {
255+
return formals![index + 2].variable!;
256+
} else {
257+
return super.getFormalParameter(index);
258+
}
259+
}
260+
251261
@override
252262
void inferTypes(ClassHierarchyBase hierarchy) {
253263
inferFormalTypes(hierarchy);

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class E0 extends core::_Enum /*isEnum*/ {
88
final field core::int bar;
99
static const field self::E0 one = #C4;
1010
static const field self::E0 two = #C7;
11-
const constructor •(core::int #index, core::String #name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
11+
const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
1212
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
1313
;
1414
method toString() → core::String
@@ -19,7 +19,7 @@ class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
1919
final field self::E1::X% foo;
2020
static const field self::E1<core::String> one = #C11;
2121
static const field self::E1<core::int> two = #C12;
22-
const constructor •(core::int #index = #C9, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
22+
const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
2323
: self::E1::foo = foo, super core::_Enum::•(#index, #name)
2424
;
2525
method toString() → core::String
@@ -33,7 +33,7 @@ class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z
3333
static const field self::E2<core::int, core::String, core::double> one = #C15;
3434
static const field self::E2<core::String, core::int, core::double> two = #C17;
3535
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
36-
const constructor •(core::int #index, core::String #name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
36+
const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
3737
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
3838
;
3939
method toString() → core::String

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class E0 extends core::_Enum /*isEnum*/ {
88
final field core::int bar;
99
static const field self::E0 one = #C4;
1010
static const field self::E0 two = #C7;
11-
const constructor •(core::int #index, core::String #name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
11+
const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
1212
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
1313
;
1414
method toString() → core::String
@@ -19,7 +19,7 @@ class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
1919
final field self::E1::X% foo;
2020
static const field self::E1<core::String> one = #C11;
2121
static const field self::E1<core::int> two = #C12;
22-
const constructor •(core::int #index = #C9, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
22+
const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
2323
: self::E1::foo = foo, super core::_Enum::•(#index, #name)
2424
;
2525
method toString() → core::String
@@ -33,7 +33,7 @@ class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z
3333
static const field self::E2<core::int, core::String, core::double> one = #C15;
3434
static const field self::E2<core::String, core::int, core::double> two = #C17;
3535
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
36-
const constructor •(core::int #index, core::String #name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
36+
const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
3737
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
3838
;
3939
method toString() → core::String

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class E0 extends core::_Enum /*isEnum*/ {
88
final field core::int bar;
99
static const field self::E0 one = #C4;
1010
static const field self::E0 two = #C7;
11-
const constructor •(core::int #index, core::String #name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
11+
const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
1212
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
1313
;
1414
method toString() → core::String
@@ -19,7 +19,7 @@ class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
1919
final field self::E1::X% foo;
2020
static const field self::E1<core::String> one = #C11;
2121
static const field self::E1<core::int> two = #C12;
22-
const constructor •(core::int #index = #C9, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
22+
const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
2323
: self::E1::foo = foo, super core::_Enum::•(#index, #name)
2424
;
2525
method toString() → core::String
@@ -33,7 +33,7 @@ class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z
3333
static const field self::E2<core::int, core::String, core::double> one = #C15;
3434
static const field self::E2<core::String, core::int, core::double> two = #C17;
3535
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
36-
const constructor •(core::int #index, core::String #name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
36+
const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
3737
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
3838
;
3939
method toString() → core::String

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class E0 extends core::_Enum /*isEnum*/ {
88
final field core::int bar;
99
static const field self::E0 one = #C4;
1010
static const field self::E0 two = #C7;
11-
const constructor •(core::int #index, core::String #name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
11+
const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
1212
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
1313
;
1414
method toString() → core::String
@@ -19,7 +19,7 @@ class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
1919
final field self::E1::X% foo;
2020
static const field self::E1<core::String> one = #C11;
2121
static const field self::E1<core::int> two = #C12;
22-
const constructor •(core::int #index = #C9, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
22+
const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
2323
: self::E1::foo = foo, super core::_Enum::•(#index, #name)
2424
;
2525
method toString() → core::String
@@ -33,7 +33,7 @@ class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z
3333
static const field self::E2<core::int, core::String, core::double> one = #C15;
3434
static const field self::E2<core::String, core::int, core::double> two = #C17;
3535
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
36-
const constructor •(core::int #index, core::String #name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
36+
const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
3737
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
3838
;
3939
method toString() → core::String

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class E0 extends core::_Enum /*isEnum*/ {
88
final field core::int bar;
99
static const field self::E0 one = #C4;
1010
static const field self::E0 two = #C7;
11-
const constructor •(core::int #index, core::String #name = #C9, core::int foo, {required core::int bar = #C9}) → self::E0
11+
const constructor •(core::int #index, core::String #name, core::int foo, {required core::int bar = #C9}) → self::E0
1212
: self::E0::foo = foo, self::E0::bar = bar, super core::_Enum::•(#index, #name)
1313
;
1414
method toString() → core::String
@@ -19,7 +19,7 @@ class E1<X extends core::Object? = dynamic> extends core::_Enum /*isEnum*/ {
1919
final field self::E1::X% foo;
2020
static const field self::E1<core::String> one = #C11;
2121
static const field self::E1<core::int> two = #C12;
22-
const constructor •(core::int #index = #C9, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
22+
const constructor •(core::int #index, core::String #name, {required self::E1::X% foo = #C9}) → self::E1<self::E1::X%>
2323
: self::E1::foo = foo, super core::_Enum::•(#index, #name)
2424
;
2525
method toString() → core::String
@@ -33,7 +33,7 @@ class E2<X extends core::Object? = dynamic, Y extends core::Object? = dynamic, Z
3333
static const field self::E2<core::int, core::String, core::double> one = #C15;
3434
static const field self::E2<core::String, core::int, core::double> two = #C17;
3535
static const field self::E2<core::double, core::bool, dynamic> three = #C21;
36-
const constructor •(core::int #index, core::String #name = #C9, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
36+
const constructor •(core::int #index, core::String #name, self::E2::X% foo, {required self::E2::Y% bar = #C9, has-declared-initializer self::E2::Z? baz = #C9}) → self::E2<self::E2::X%, self::E2::Y%, self::E2::Z%>
3737
: self::E2::foo = foo, self::E2::bar = bar, self::E2::baz = baz, super core::_Enum::•(#index, #name)
3838
;
3939
method toString() → core::String
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
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 E {
6+
foo;
7+
8+
const E([int x = 0, String y = "", num? z]);
9+
const E.named(int x, {String y = "", bool b = false, String? z, bool? t});
10+
}
11+
12+
main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
enum E {
2+
foo;
3+
4+
const E([int x = 0, String y = "", num? z]);
5+
const E.named(int x, {String y = "", bool b = false, String? z, bool? t});
6+
}
7+
8+
main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
enum E {
2+
foo;
3+
4+
const E([int x = 0, String y = "", num? z]);
5+
const E.named(int x, {String y = "", bool b = false, String? z, bool? t});
6+
}
7+
8+
main() {}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E foo = #C3;
8+
const constructor •(core::int #index, core::String #name, [core::int x = #C1, core::String y = #C5, core::num? z = #C6]) → self::E
9+
: super core::_Enum::•(#index, #name)
10+
;
11+
const constructor named(core::int #index, core::String #name, core::int x, {core::String y = #C5, core::bool b = #C7, core::String? z = #C6, core::bool? t = #C6}) → self::E
12+
: super core::_Enum::•(#index, #name)
13+
;
14+
method toString() → core::String
15+
return "E.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
static method main() → dynamic {}
18+
19+
constants {
20+
#C1 = 0
21+
#C2 = "foo"
22+
#C3 = self::E {index:#C1, _name:#C2}
23+
#C4 = <self::E*>[#C3]
24+
#C5 = ""
25+
#C6 = null
26+
#C7 = false
27+
}
28+
29+
30+
Constructor coverage from constants:
31+
org-dartlang-testcase:///issue49216.dart:
32+
- E. (from org-dartlang-testcase:///issue49216.dart:8:9)
33+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
34+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E foo = #C3;
8+
const constructor •(core::int #index, core::String #name, [core::int x = #C1, core::String y = #C5, core::num? z = #C6]) → self::E
9+
: super core::_Enum::•(#index, #name)
10+
;
11+
const constructor named(core::int #index, core::String #name, core::int x, {core::String y = #C5, core::bool b = #C7, core::String? z = #C6, core::bool? t = #C6}) → self::E
12+
: super core::_Enum::•(#index, #name)
13+
;
14+
method toString() → core::String
15+
return "E.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
static method main() → dynamic {}
18+
19+
constants {
20+
#C1 = 0
21+
#C2 = "foo"
22+
#C3 = self::E {index:#C1, _name:#C2}
23+
#C4 = <self::E*>[#C3]
24+
#C5 = ""
25+
#C6 = null
26+
#C7 = false
27+
}
28+
29+
30+
Constructor coverage from constants:
31+
org-dartlang-testcase:///issue49216.dart:
32+
- E. (from org-dartlang-testcase:///issue49216.dart:8:9)
33+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
34+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = const <self::E>[self::E::foo];
7+
static const field self::E foo = const self::E::•(0, "foo");
8+
const constructor •(core::int #index, core::String #name, [core::int x = 0, core::String y = "", core::num? z = null]) → self::E
9+
: super core::_Enum::•(#index, #name)
10+
;
11+
const constructor named(core::int #index, core::String #name, core::int x, {core::String y = "", core::bool b = false, core::String? z = null, core::bool? t = null}) → self::E
12+
: super core::_Enum::•(#index, #name)
13+
;
14+
method toString() → core::String
15+
return "E.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
static method main() → dynamic
18+
;
19+
20+
21+
Extra constant evaluation status:
22+
Evaluated: ListLiteral @ org-dartlang-testcase:///issue49216.dart:5:6 -> ListConstant(const <E*>[const E{_Enum.index: 0, _Enum._name: "foo"}])
23+
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///issue49216.dart:6:3 -> InstanceConstant(const E{_Enum.index: 0, _Enum._name: "foo"})
24+
Extra constant evaluation: evaluated: 9, effectively constant: 2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
library /*isNonNullableByDefault*/;
2+
import self as self;
3+
import "dart:core" as core;
4+
5+
class E extends core::_Enum /*isEnum*/ {
6+
static const field core::List<self::E> values = #C4;
7+
static const field self::E foo = #C3;
8+
const constructor •(core::int #index, core::String #name, [core::int x = #C1, core::String y = #C5, core::num? z = #C6]) → self::E
9+
: super core::_Enum::•(#index, #name)
10+
;
11+
const constructor named(core::int #index, core::String #name, core::int x, {core::String y = #C5, core::bool b = #C7, core::String? z = #C6, core::bool? t = #C6}) → self::E
12+
: super core::_Enum::•(#index, #name)
13+
;
14+
method toString() → core::String
15+
return "E.${this.{core::_Enum::_name}{core::String}}";
16+
}
17+
static method main() → dynamic {}
18+
19+
constants {
20+
#C1 = 0
21+
#C2 = "foo"
22+
#C3 = self::E {index:#C1, _name:#C2}
23+
#C4 = <self::E*>[#C3]
24+
#C5 = ""
25+
#C6 = null
26+
#C7 = false
27+
}
28+
29+
30+
Constructor coverage from constants:
31+
org-dartlang-testcase:///issue49216.dart:
32+
- E. (from org-dartlang-testcase:///issue49216.dart:8:9)
33+
- _Enum. (from org-dartlang-sdk:///sdk/lib/core/enum.dart:103:9)
34+
- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)

0 commit comments

Comments
 (0)