Fix summary type inference for async closures with FutureOr<T>.

R=scheglov@google.com

Review-Url: https://codereview.chromium.org/2665813002 .
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 67c5149..486ddc3 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -4660,6 +4660,9 @@
         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)]);
       }
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 5d5874a..f201874 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -61,6 +61,24 @@
     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;
@@ -1665,6 +1683,19 @@
     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';
@@ -1855,19 +1886,6 @@
     ''');
   }
 
-  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';