Index: pkg/analyzer/lib/src/generated/static_type_analyzer.dart |
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart |
index a86bcdefecee5fed63ab91bd425df6454e595f11..a2aeae15c7741c74e7444e1ef09841ccf790c371 100644 |
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart |
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart |
@@ -278,16 +278,19 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> { |
*/ |
@override |
Object visitAwaitExpression(AwaitExpression node) { |
- DartType staticExpressionType = _getStaticType(node.expression); |
- if (staticExpressionType == null) { |
- // TODO(brianwilkerson) Determine whether this can still happen. |
- staticExpressionType = _dynamicType; |
+ // Await the Future. This results in whatever type is (ultimately) returned. |
+ DartType awaitType(DartType awaitedType) { |
+ if (awaitedType == null) { |
+ return null; |
+ } |
+ if (awaitedType.isDartAsyncFutureOr) { |
+ return awaitType((awaitedType as InterfaceType).typeArguments[0]); |
+ } |
+ return awaitedType.flattenFutures(_typeSystem); |
} |
- DartType staticType = staticExpressionType.flattenFutures(_typeSystem); |
- _recordStaticType(node, staticType); |
- DartType propagatedExpressionType = node.expression.propagatedType; |
- DartType propagatedType = |
- propagatedExpressionType?.flattenFutures(_typeSystem); |
+ |
+ _recordStaticType(node, awaitType(_getStaticType(node.expression))); |
+ DartType propagatedType = awaitType(node.expression.propagatedType); |
_resolver.recordPropagatedTypeIfBetter(node, propagatedType); |
return null; |
} |