Skip to content

Commit 3fe4f63

Browse files
kallentuCommit Queue
authored andcommitted
[tests] Enum shorthands - FutureOr tests and some additional tests.
Added back the `FutureOr` tests now that we've decided what we want to do for `FutureOr`. "`FutureOr<S>` denotes the same namespace as `S` for enum shorthands." There are a few tests for `X extends T` where the context type is `X`. It would be a compile-time error to find static members of `T` even if `T` did have the corresponding static member. Bug: #57038 Change-Id: Ibb8054d66e024d93b71878ed49bc7866b785b02c Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/397986 Commit-Queue: Kallen Tu <[email protected]> Reviewed-by: Erik Ernst <[email protected]>
1 parent 3e2567a commit 3fe4f63

File tree

3 files changed

+152
-0
lines changed

3 files changed

+152
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// Copyright (c) 2024, 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+
// When we get a type `X` that extends a type `T`, we wouldn't be able to find
6+
// the static members of `T`. It is a compile-time error to use an enum
7+
// shorthand for type `X` in these cases.
8+
9+
// SharedOptions=--enable-experiment=enum-shorthands
10+
11+
import 'dart:async';
12+
13+
import '../enum_shorthand_helper.dart';
14+
15+
void extendsInteger<X extends Integer>() {
16+
X x = .one;
17+
// ^
18+
// [analyzer] unspecified
19+
// [cfe] unspecified
20+
}
21+
22+
void extendsIntegerNullable<X extends Integer?>() {
23+
X x = .one;
24+
// ^
25+
// [analyzer] unspecified
26+
// [cfe] unspecified
27+
}
28+
29+
void extendsFutureOrInteger<X extends FutureOr<Integer>>() {
30+
X x = .one;
31+
// ^
32+
// [analyzer] unspecified
33+
// [cfe] unspecified
34+
}
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
// Copyright (c) 2024, 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+
// `FutureOr<S>` denotes the same namespace as `S` for enum shorthands.
6+
7+
// SharedOptions=--enable-experiment=enum-shorthands
8+
9+
import 'dart:async';
10+
11+
import '../enum_shorthand_helper.dart';
12+
13+
class ColorFutureOrContext {
14+
final FutureOr<Color> color;
15+
final FutureOr<Color?> nullableColor;
16+
ColorFutureOrContext(this.color, this.nullableColor);
17+
ColorFutureOrContext.named({this.color = .blue, this.nullableColor});
18+
ColorFutureOrContext.optional([this.color = .blue, this.nullableColor]);
19+
}
20+
21+
class IntegerFutureOrContext {
22+
final FutureOr<Integer> integer;
23+
final FutureOr<Integer?> nullableInteger;
24+
IntegerFutureOrContext(this.integer, this.nullableInteger);
25+
IntegerFutureOrContext.named({this.integer = .constOne, this.nullableInteger});
26+
IntegerFutureOrContext.optional([this.integer = .constOne, this.nullableInteger]);
27+
}
28+
29+
class IntegerExtFutureOrContext {
30+
final FutureOr<IntegerExt> integer;
31+
final FutureOr<IntegerExt?> nullableInteger;
32+
IntegerExtFutureOrContext(this.integer, this.nullableInteger);
33+
IntegerExtFutureOrContext.named({this.integer = .constOne, this.nullableInteger});
34+
IntegerExtFutureOrContext.optional([this.integer = .constOne, this.nullableInteger]);
35+
}
36+
37+
class IntegerMixinFutureOrContext {
38+
final FutureOr<IntegerMixin> integer;
39+
final FutureOr<IntegerMixin?> nullableInteger;
40+
IntegerMixinFutureOrContext(this.integer, this.nullableInteger);
41+
IntegerMixinFutureOrContext.named({this.integer = .mixinConstOne, this.nullableInteger});
42+
IntegerMixinFutureOrContext.optional([this.integer = .mixinConstOne, this.nullableInteger]);
43+
}
44+
45+
void main() {
46+
// Enum
47+
FutureOr<Color> color = .blue;
48+
FutureOr<Color?> nullableColor = .blue;
49+
const FutureOr<Color> constColor = .blue;
50+
const FutureOr<Color?> constNullableColor = .blue;
51+
switch (color) {
52+
case .blue:
53+
print('blue');
54+
case .red:
55+
print('red');
56+
case .green:
57+
print('green');
58+
}
59+
60+
var colorList = <FutureOr<Color>>[.blue, .green, .red];
61+
var nullableColorList = <FutureOr<Color?>>[.blue, .green, .red];
62+
63+
var colorContextPositional = ColorFutureOrContext(.blue, .red);
64+
var colorContextNamed = ColorFutureOrContext.named(color: .blue, nullableColor: .red);
65+
var colorContextOptional = ColorFutureOrContext.optional(.blue, .red);
66+
67+
// Class
68+
FutureOr<Integer> integer = .one;
69+
FutureOr<Integer?> nullableInteger = .one;
70+
const FutureOr<Integer> constInteger = .constOne;
71+
const FutureOr<Integer?> constNullableInteger = .constOne;
72+
73+
var integerList = <FutureOr<Integer>>[.one, .two, .one];
74+
var nullableIntegerList = <FutureOr<Integer?>>[.one, .two, .one];
75+
76+
var integerContextPositional = IntegerFutureOrContext(.one, .two);
77+
var integerContextNamed = IntegerFutureOrContext.named(integer: .one, nullableInteger: .two);
78+
var integerContextOptional = IntegerFutureOrContext.optional(.one, .two);
79+
80+
// Extension type
81+
FutureOr<IntegerExt> integerExt = .one;
82+
FutureOr<IntegerExt?> nullableIntegerExt = .one;
83+
const FutureOr<IntegerExt> constIntegerExt = .constOne;
84+
const FutureOr<IntegerExt?> constNullableIntegerExt = .constOne;
85+
86+
var integerExtList = <FutureOr<IntegerExt>>[.one, .two, .one];
87+
var nullableIntegerExtList = <FutureOr<IntegerExt?>>[.one, .two, .one];
88+
89+
var integerExtContextPositional = IntegerExtFutureOrContext(.one, .two);
90+
var integerExtContextNamed = IntegerExtFutureOrContext.named(integer: .one, nullableInteger: .two);
91+
var integerExtContextOptional = IntegerExtFutureOrContext.optional(.one, .two);
92+
93+
// Mixin
94+
FutureOr<IntegerMixin> integerMixin = .mixinOne;
95+
FutureOr<IntegerMixin?> nullableIntegerMixin = .mixinOne;
96+
const FutureOr<IntegerMixin> constIntegerMixin = .mixinConstOne;
97+
const FutureOr<IntegerMixin?> constNullableIntegerMixin = .mixinConstOne;
98+
99+
var integerMixinList = <FutureOr<IntegerExt>>[.one, .two, .one];
100+
var nullableIntegerMixinList = <FutureOr<IntegerExt?>>[.one, .two, .one];
101+
102+
var integerMixinContextPositional = IntegerMixinFutureOrContext(.mixinOne, .mixinTwo);
103+
var integerMixinContextNamed = IntegerMixinFutureOrContext.named(integer: .mixinOne, nullableInteger: .mixinTwotwo);
104+
var integerMixinContextOptional = IntegerMixinFutureOrContext.optional(.mixinOne, .mixinTwo);
105+
}
106+

tests/language/enum_shorthands/simple/simple_identifier_nullable_test.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88

99
import '../enum_shorthand_helper.dart';
1010

11+
class NullableInteger {
12+
static NullableInteger? get one => NullableInteger(1);
13+
static NullableInteger? get two => NullableInteger(2);
14+
final int integer;
15+
NullableInteger(this.integer);
16+
}
17+
1118
void main() {
1219
// Enum
1320
Color? color = .blue;
@@ -36,5 +43,10 @@ void main() {
3643
IntegerMixin? integerMixin = .mixinOne;
3744
const IntegerMixin? constIntegerMixin = .mixinConstOne;
3845
var integerMixinList = <IntegerMixin?>[.one, .two, .one];
46+
47+
// Null assertion on a nullable static member.
48+
NullableInteger? nullableInteger = .one;
49+
NullableInteger nullableIntegerAssert = .one!;
50+
var nullableIntegerMixinList = <NullableInteger>[.one!, .two!, .one!];
3951
}
4052

0 commit comments

Comments
 (0)