| Index: pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| index dea26fa211f661820f9fa7a305bb03d292db2a94..020b81bfad39727fdcdaaf139e4eeae99c5de96d 100644
|
| --- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| @@ -541,10 +541,11 @@ class SimpleTypeInferrerVisitor<T>
|
| locals.update(element, parameterType, node);
|
| });
|
| ClassElement cls = analyzedElement.enclosingClass;
|
| + Spannable spannable = node;
|
| if (analyzedElement.isSynthesized) {
|
| - node = analyzedElement;
|
| + spannable = analyzedElement;
|
| ConstructorElement constructor = analyzedElement;
|
| - synthesizeForwardingCall(node, constructor.definingConstructor);
|
| + synthesizeForwardingCall(spannable, constructor.definingConstructor);
|
| } else {
|
| visitingInitializers = true;
|
| visit(node.initializers);
|
| @@ -570,7 +571,8 @@ class SimpleTypeInferrerVisitor<T>
|
| if (field.isFinal) return;
|
| T type = locals.fieldScope.readField(field);
|
| if (type == null && field.initializer == null) {
|
| - inferrer.recordTypeOfNonFinalField(node, field, types.nullType);
|
| + inferrer.recordTypeOfNonFinalField(
|
| + spannable, field, types.nullType);
|
| }
|
| });
|
| }
|
| @@ -580,7 +582,12 @@ class SimpleTypeInferrerVisitor<T>
|
| locals.update(element, inferrer.typeOfElement(element), node);
|
| });
|
| visit(node.body);
|
| - if (returnType == null) {
|
| + if (function.asyncMarker != AsyncMarker.SYNC) {
|
| + // TODO(herhut): Should be type Future/Iterable/Stream instead of
|
| + // dynamic.
|
| + returnType = inferrer.addReturnTypeFor(
|
| + analyzedElement, returnType, types.dynamicType);
|
| + } else if (returnType == null) {
|
| // No return in the body.
|
| returnType = locals.seenReturnOrThrow
|
| ? types.nonNullEmpty() // Body always throws.
|
| @@ -995,6 +1002,12 @@ class SimpleTypeInferrerVisitor<T>
|
| return null;
|
| }
|
|
|
| + T visitAwait(ast.Await node) {
|
| + T futureType = node.expression.accept(this);
|
| + // TODO(herhut): Return a better type here if possible.
|
| + return types.dynamicType;
|
| + }
|
| +
|
| T visitStaticSend(ast.Send node) {
|
| Element element = elements[node];
|
| if (elements.isAssert(node)) {
|
|
|