| Index: editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| diff --git a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| index 862a026d4ba05720cff41a27009f658a2c27c469..82d3aba07ef40f800eb600d1736b0ed270f72a5b 100644
|
| --- a/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| +++ b/editor/tools/plugins/com.google.dart.engine/src/com/google/dart/engine/internal/verifier/ErrorVerifier.java
|
| @@ -18,6 +18,7 @@ import com.google.dart.engine.ast.ArgumentDefinitionTest;
|
| import com.google.dart.engine.ast.ArgumentList;
|
| import com.google.dart.engine.ast.AssertStatement;
|
| import com.google.dart.engine.ast.AssignmentExpression;
|
| +import com.google.dart.engine.ast.BinaryExpression;
|
| import com.google.dart.engine.ast.BreakStatement;
|
| import com.google.dart.engine.ast.CatchClause;
|
| import com.google.dart.engine.ast.ClassDeclaration;
|
| @@ -48,6 +49,7 @@ import com.google.dart.engine.ast.Identifier;
|
| import com.google.dart.engine.ast.IfStatement;
|
| import com.google.dart.engine.ast.ImplementsClause;
|
| import com.google.dart.engine.ast.ImportDirective;
|
| +import com.google.dart.engine.ast.IndexExpression;
|
| import com.google.dart.engine.ast.InstanceCreationExpression;
|
| import com.google.dart.engine.ast.ListLiteral;
|
| import com.google.dart.engine.ast.MapLiteral;
|
| @@ -329,6 +331,12 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| }
|
|
|
| @Override
|
| + public Void visitBinaryExpression(BinaryExpression node) {
|
| + checkForArgumentTypeNotAssignable(node.getRightOperand());
|
| + return super.visitBinaryExpression(node);
|
| + }
|
| +
|
| + @Override
|
| public Void visitCatchClause(CatchClause node) {
|
| boolean previousIsInCatchClause = isInCatchClause;
|
| try {
|
| @@ -516,6 +524,12 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| }
|
|
|
| @Override
|
| + public Void visitIndexExpression(IndexExpression node) {
|
| + checkForArgumentTypeNotAssignable(node.getIndex());
|
| + return super.visitIndexExpression(node);
|
| + }
|
| +
|
| + @Override
|
| public Void visitInstanceCreationExpression(InstanceCreationExpression node) {
|
| ConstructorName constructorName = node.getConstructorName();
|
| TypeName typeName = constructorName.getType();
|
| @@ -1411,42 +1425,56 @@ public class ErrorVerifier extends RecursiveASTVisitor<Void> {
|
| }
|
| boolean problemReported = false;
|
| for (Expression argument : argumentList.getArguments()) {
|
| - // prepare corresponding parameter
|
| - ParameterElement parameterElement = argument.getParameterElement();
|
| - if (parameterElement == null) {
|
| - continue;
|
| - }
|
| - // prepare parameter type
|
| - Type parameterType = parameterElement.getType();
|
| - if (parameterType == null) {
|
| - continue;
|
| - }
|
| - // prepare argument type
|
| - Type argumentType = getBestType(argument);
|
| - if (argumentType == null) {
|
| - continue;
|
| - }
|
| - // OK, argument is assignable
|
| - if (argumentType.isAssignableTo(parameterType)) {
|
| - continue;
|
| - }
|
| - // TODO(scheglov) bug in type algebra?
|
| - if (parameterType.isObject() && argumentType instanceof FunctionType) {
|
| - continue;
|
| - }
|
| - // report problem
|
| - errorReporter.reportError(
|
| - StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
|
| - argument,
|
| - argumentType,
|
| - parameterType);
|
| - problemReported = true;
|
| + problemReported |= checkForArgumentTypeNotAssignable(argument);
|
| }
|
| // done
|
| return problemReported;
|
| }
|
|
|
| /**
|
| + * This verifies that the passed argument can be assigned to their corresponding parameters.
|
| + *
|
| + * @param node the argument to evaluate
|
| + * @return {@code true} if and only if an error code is generated on the passed node
|
| + * @see StaticWarningCode#ARGUMENT_TYPE_NOT_ASSIGNABLE
|
| + */
|
| + private boolean checkForArgumentTypeNotAssignable(Expression argument) {
|
| + if (argument == null) {
|
| + return false;
|
| + }
|
| + // prepare corresponding parameter
|
| + ParameterElement parameterElement = argument.getParameterElement();
|
| + if (parameterElement == null) {
|
| + return false;
|
| + }
|
| + // prepare parameter type
|
| + Type parameterType = parameterElement.getType();
|
| + if (parameterType == null) {
|
| + return false;
|
| + }
|
| + // prepare argument type
|
| + Type argumentType = getBestType(argument);
|
| + if (argumentType == null) {
|
| + return false;
|
| + }
|
| + // OK, argument is assignable
|
| + if (argumentType.isAssignableTo(parameterType)) {
|
| + return false;
|
| + }
|
| + // TODO(scheglov) bug in type algebra?
|
| + if (parameterType.isObject() && argumentType instanceof FunctionType) {
|
| + return false;
|
| + }
|
| + // report problem
|
| + errorReporter.reportError(
|
| + StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE,
|
| + argument,
|
| + argumentType,
|
| + parameterType);
|
| + return true;
|
| + }
|
| +
|
| + /**
|
| * This verifies that left hand side of the passed assignment expression is not final.
|
| *
|
| * @param node the assignment expression to evaluate
|
|
|