| Index: pkg/analyzer/lib/src/generated/error_verifier.dart
|
| diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
|
| index 4b83983c15b977570ad69cae502f926ca4c14ac3..0ea52160c5b5ec2baa950aaa8edb5facab13e5ab 100644
|
| --- a/pkg/analyzer/lib/src/generated/error_verifier.dart
|
| +++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
|
| @@ -1793,7 +1793,8 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
|
| }
|
| // RETURN_WITHOUT_VALUE
|
| if (returnExpression == null) {
|
| - if (VoidTypeImpl.instance.isAssignableTo(expectedReturnType)) {
|
| + if (_computeReturnTypeForMethod(
|
| + null).isAssignableTo(expectedReturnType)) {
|
| return false;
|
| }
|
| _hasReturnWithoutValue = true;
|
| @@ -5171,7 +5172,7 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
|
| if (_enclosingFunction == null) {
|
| return false;
|
| }
|
| - DartType staticReturnType = getStaticType(returnExpression);
|
| + DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
|
| if (expectedReturnType.isVoid) {
|
| if (staticReturnType.isVoid ||
|
| staticReturnType.isDynamic ||
|
| @@ -5184,22 +5185,6 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
|
| [staticReturnType, expectedReturnType, _enclosingFunction.displayName]);
|
| return true;
|
| }
|
| - if (_enclosingFunction.isAsynchronous && !_enclosingFunction.isGenerator) {
|
| - // TODO(brianwilkerson) Figure out how to get the type "Future" so that we
|
| - // can build the type we need to test against.
|
| -// InterfaceType impliedType = "Future<" + flatten(staticReturnType) + ">"
|
| -// if (impliedType.isAssignableTo(expectedReturnType)) {
|
| -// return false;
|
| -// }
|
| -// errorReporter.reportTypeErrorForNode(
|
| -// StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
|
| -// returnExpression,
|
| -// impliedType,
|
| -// expectedReturnType.getDisplayName(),
|
| -// enclosingFunction.getDisplayName());
|
| -// return true;
|
| - return false;
|
| - }
|
| if (staticReturnType.isAssignableTo(expectedReturnType)) {
|
| return false;
|
| }
|
| @@ -5789,6 +5774,25 @@ class ErrorVerifier extends RecursiveAstVisitor<Object> {
|
| return hasProblem;
|
| }
|
|
|
| + DartType _computeReturnTypeForMethod(Expression returnExpression) {
|
| + // TODO(paulberry): do the right thing for generators.
|
| + if (returnExpression == null) {
|
| + if (_enclosingFunction.isAsynchronous) {
|
| + return _typeProvider.futureType.substitute4(
|
| + <DartType>[_typeProvider.nullType]);
|
| + } else {
|
| + return VoidTypeImpl.instance;
|
| + }
|
| + }
|
| + DartType staticReturnType = getStaticType(returnExpression);
|
| + if (staticReturnType != null &&
|
| + _enclosingFunction.isAsynchronous &&
|
| + staticReturnType.element != _typeProvider.futureType.element) {
|
| + return _typeProvider.futureType.substitute4(<DartType>[staticReturnType]);
|
| + }
|
| + return staticReturnType;
|
| + }
|
| +
|
| /**
|
| * Return the error code that should be used when the given class references itself directly.
|
| *
|
|
|