Skip to content

Commit

Permalink
Fix summary type inference for async closures with FutureOr<T>.
Browse files Browse the repository at this point in the history
R=scheglov@google.com

Review-Url: https://codereview.chromium.org/2665813002 .
  • Loading branch information
stereotype441 committed Jan 30, 2017
1 parent 7208fda commit f661493
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 13 deletions.
3 changes: 3 additions & 0 deletions pkg/analyzer/lib/src/summary/link.dart
Original file line number Diff line number Diff line change
Expand Up @@ -4672,6 +4672,9 @@ class TypeInferenceNode extends Node<TypeInferenceNode> {
var linker = functionElement.compilationUnit.library._linker;
var typeProvider = linker.typeProvider;
var typeSystem = linker.typeSystem;
if (bodyType.isDartAsyncFutureOr) {
bodyType = (bodyType as InterfaceType).typeArguments[0];
}
bodyType = typeProvider.futureType
.instantiate([bodyType.flattenFutures(typeSystem)]);
}
Expand Down
44 changes: 31 additions & 13 deletions pkg/analyzer/test/src/task/strong/inferred_type_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,24 @@ var g = () async => futureInt;
expect(f.type.toString(), '() → Future<int>');
}

void test_asyncClosureReturnType_futureOr() {
var mainUnit = checkFile('''
import 'dart:async';
FutureOr<int> futureOrInt = null;
var f = () => futureOrInt;
var g = () async => futureOrInt;
''');
var futureOrInt = mainUnit.topLevelVariables[0];
expect(futureOrInt.name, 'futureOrInt');
expect(futureOrInt.type.toString(), 'FutureOr<int>');
var f = mainUnit.topLevelVariables[1];
expect(f.name, 'f');
expect(f.type.toString(), '() → FutureOr<int>');
var g = mainUnit.topLevelVariables[2];
expect(g.name, 'g');
expect(g.type.toString(), '() → Future<int>');
}

void test_blockBodiedLambdas_async_allReturnsAreFutures() {
if (!mayCheckTypesOfLocals) {
return;
Expand Down Expand Up @@ -1665,6 +1683,19 @@ int get y => null;
expect(x.type.toString(), 'int');
}

void test_futureOr_subtyping() {
checkFile(r'''
import 'dart:async';
void add(int x) {}
add2(int y) {}
main() {
Future<int> f;
var a = f.then(add);
var b = f.then(add2);
}
''');
}

void test_futureThen() {
String build({String declared, String downwards, String upwards}) => '''
import 'dart:async';
Expand Down Expand Up @@ -1855,19 +1886,6 @@ main() {
''');
}

void test_futureOr_subtyping() {
checkFile(r'''
import 'dart:async';
void add(int x) {}
add2(int y) {}
main() {
Future<int> f;
var a = f.then(add);
var b = f.then(add2);
}
''');
}

void test_futureUnion_asyncConditional() {
String build({String declared, String downwards, String upwards}) => '''
import 'dart:async';
Expand Down

0 comments on commit f661493

Please sign in to comment.