Skip to content

Commit 7de867d

Browse files
kallentuCommit Queue
authored andcommitted
[cfe] Dot shorthands - FutureOr for invocations.
This CL implements `FutureOr` for static method invocations and constructors. Note: `static_method_future_or_test` doesn't work due to unrelated reasons (initializers), but I corrected a typo anyways. Bug: #59758 Change-Id: I77b97b0a9104fb0354ce1de39b619394f4477f32 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/414664 Reviewed-by: Johnni Winther <[email protected]> Commit-Queue: Kallen Tu <[email protected]>
1 parent 78e1278 commit 7de867d

File tree

9 files changed

+66
-1
lines changed

9 files changed

+66
-1
lines changed

pkg/front_end/lib/src/type_inference/inference_visitor.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12127,6 +12127,13 @@ class InferenceVisitorImpl extends InferenceVisitorBase
1212712127
// Use the previously cached context type to determine the declaration
1212812128
// member that we're trying to find.
1212912129
DartType cachedContext = getDotShorthandContext().unwrapTypeSchemaView();
12130+
12131+
// The static namespace denoted by `S` is also the namespace denoted by
12132+
// `FutureOr<S>`.
12133+
while (cachedContext is FutureOrType) {
12134+
cachedContext = cachedContext.typeArgument;
12135+
}
12136+
1213012137
Member? member = findInterfaceMember(
1213112138
cachedContext, node.name, node.fileOffset,
1213212139
includeExtensionMethods: false,

pkg/front_end/testcases/dot_shorthands/futureor.dart

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@ import 'dart:async';
66

77
enum Color { red, blue, green }
88

9+
class E {
10+
final int x;
11+
static E y(int x) => E(x);
12+
E(this.x);
13+
}
14+
915
void main() {
1016
FutureOr<Color> color = .blue;
1117
FutureOr<FutureOr<Color>> recursiveColor = .blue;
@@ -22,4 +28,7 @@ void main() {
2228
}
2329

2430
var colorList = <FutureOr<Color>>[.blue, .green, .red];
31+
32+
FutureOr<E> e = .y(1);
33+
FutureOr<FutureOr<E>> recursiveE = .y(1);
2534
}

pkg/front_end/testcases/dot_shorthands/futureor.dart.strong.expect

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ class Color extends core::_Enum /*isEnum*/ {
1616
method _enumToString() → core::String
1717
return "Color.${this.{core::_Enum::_name}{core::String}}";
1818
}
19+
class E extends core::Object {
20+
final field core::int x;
21+
constructor •(core::int x) → self::E
22+
: self::E::x = x, super core::Object::•()
23+
;
24+
static method y(core::int x) → self::E
25+
return new self::E::•(x);
26+
}
1927
static method main() → void {
2028
FutureOr<self::Color>color = #C6;
2129
FutureOr<FutureOr<self::Color>>recursiveColor = #C6;
@@ -55,6 +63,8 @@ static method main() → void {
5563
}
5664
}
5765
core::List<FutureOr<self::Color>> colorList = <FutureOr<self::Color>>[#C6, #C9, #C3];
66+
FutureOr<self::E>e = self::E::y(1);
67+
FutureOr<FutureOr<self::E>>recursiveE = self::E::y(1);
5868
}
5969

6070
constants {

pkg/front_end/testcases/dot_shorthands/futureor.dart.strong.modular.expect

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ class Color extends core::_Enum /*isEnum*/ {
1616
method _enumToString() → core::String
1717
return "Color.${this.{core::_Enum::_name}{core::String}}";
1818
}
19+
class E extends core::Object {
20+
final field core::int x;
21+
constructor •(core::int x) → self::E
22+
: self::E::x = x, super core::Object::•()
23+
;
24+
static method y(core::int x) → self::E
25+
return new self::E::•(x);
26+
}
1927
static method main() → void {
2028
FutureOr<self::Color>color = #C6;
2129
FutureOr<FutureOr<self::Color>>recursiveColor = #C6;
@@ -55,6 +63,8 @@ static method main() → void {
5563
}
5664
}
5765
core::List<FutureOr<self::Color>> colorList = <FutureOr<self::Color>>[#C6, #C9, #C3];
66+
FutureOr<self::E>e = self::E::y(1);
67+
FutureOr<FutureOr<self::E>>recursiveE = self::E::y(1);
5868
}
5969

6070
constants {

pkg/front_end/testcases/dot_shorthands/futureor.dart.strong.outline.expect

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ class Color extends core::_Enum /*isEnum*/ {
1515
method _enumToString() → core::String
1616
return "Color.${this.{core::_Enum::_name}{core::String}}";
1717
}
18+
class E extends core::Object {
19+
final field core::int x;
20+
constructor •(core::int x) → self::E
21+
;
22+
static method y(core::int x) → self::E
23+
;
24+
}
1825
static method main() → void
1926
;
2027

pkg/front_end/testcases/dot_shorthands/futureor.dart.strong.transformed.expect

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,14 @@ class Color extends core::_Enum /*isEnum*/ {
1616
method _enumToString() → core::String
1717
return "Color.${this.{core::_Enum::_name}{core::String}}";
1818
}
19+
class E extends core::Object {
20+
final field core::int x;
21+
constructor •(core::int x) → self::E
22+
: self::E::x = x, super core::Object::•()
23+
;
24+
static method y(core::int x) → self::E
25+
return new self::E::•(x);
26+
}
1927
static method main() → void {
2028
FutureOr<self::Color>color = #C6;
2129
FutureOr<FutureOr<self::Color>>recursiveColor = #C6;
@@ -55,6 +63,8 @@ static method main() → void {
5563
}
5664
}
5765
core::List<FutureOr<self::Color>> colorList = core::_GrowableList::_literal3<FutureOr<self::Color>>(#C6, #C9, #C3);
66+
FutureOr<self::E>e = self::E::y(1);
67+
FutureOr<FutureOr<self::E>>recursiveE = self::E::y(1);
5868
}
5969

6070
constants {

pkg/front_end/testcases/dot_shorthands/futureor.dart.textual_outline.expect

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,10 @@ import 'dart:async';
22

33
enum Color { red, blue, green }
44

5+
class E {
6+
final int x;
7+
static E y(int x) => E(x);
8+
E(this.x);
9+
}
10+
511
void main() {}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import 'dart:async';
22

3+
class E {
4+
E(this.x);
5+
final int x;
6+
static E y(int x) => E(x);
7+
}
8+
39
enum Color { red, blue, green }
410

511
void main() {}

tests/language/dot_shorthands/member/static_method_future_or_test.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ void main() {
4646
var memberExtList = <FutureOr<StaticMemberExt>>[.member(), .memberType<String, int>("s")];
4747
var nullableMemberExtList = <FutureOr<StaticMemberExt?>>[.member(), .memberType<String, int>("s")];
4848

49-
var memberExtContextPositional = StaticMemberExtFutureOrContext(.member(), .regular(1));
49+
var memberExtContextPositional = StaticMemberExtFutureOrContext(.member(), .memberType<String, int>("s"));
5050
var memberExtContextNamed = StaticMemberExtFutureOrContext.named(nullableMemberExt: .memberType<String, int>("s"));
5151
var memberExtContextOptional = StaticMemberExtFutureOrContext.optional(.memberType<String, int>("s"));
5252
}

0 commit comments

Comments
 (0)