[Kernel] Report unresolved invocations in kernel/bin/type_check.dart

Bug:
Change-Id: Id95694c687ce0251a887f1a035769b2b796fb2a3
Reviewed-on: https://dart-review.googlesource.com/12661
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Vyacheslav Egorov
2017-10-11 06:35:35 +00:00
parent 7d9188aea1
commit bbc1933705
2 changed files with 28 additions and 2 deletions
+9
View File
@@ -248,6 +248,15 @@ super method declares ${superParameter.type}
}
}
@override
void checkUnresolvedInvocation(DartType receiver, TreeNode where) {
if (receiver is DynamicType) {
return;
}
fail(where, 'Unresolved method invocation');
}
@override
void fail(TreeNode where, String message) {
fails++;
+19 -2
View File
@@ -99,6 +99,12 @@ abstract class TypeChecker {
return expression;
}
/// Check unresolved invocation (one that has no interfaceTarget)
/// and report an error if necessary.
void checkUnresolvedInvocation(DartType receiver, TreeNode where) {
// By default we ignore unresolved method invocations.
}
/// Indicates that type checking failed.
void fail(TreeNode where, String message);
}
@@ -122,6 +128,10 @@ class TypeCheckingVisitor
checker.checkAssignable(where, from, to);
}
void checkUnresolvedInvocation(DartType receiver, TreeNode where) {
checker.checkUnresolvedInvocation(receiver, where);
}
Expression checkAndDowncastExpression(Expression from, DartType to) {
var parent = from.parent;
var type = visitExpression(from);
@@ -535,6 +545,7 @@ class TypeCheckingVisitor
if (node.name.name == 'call' && receiver is FunctionType) {
return handleFunctionCall(node, receiver, node.arguments);
}
checkUnresolvedInvocation(receiver, node);
return handleDynamicCall(receiver, node.arguments);
} else if (target is Procedure &&
environment.isOverloadedArithmeticOperator(target)) {
@@ -551,7 +562,8 @@ class TypeCheckingVisitor
@override
DartType visitPropertyGet(PropertyGet node) {
if (node.interfaceTarget == null) {
visitExpression(node.receiver);
final receiver = visitExpression(node.receiver);
checkUnresolvedInvocation(receiver, node);
return const DynamicType();
} else {
var receiver = getReceiverType(node, node.receiver, node.interfaceTarget);
@@ -570,7 +582,8 @@ class TypeCheckingVisitor
receiver.substituteType(node.interfaceTarget.setterType,
contravariant: true));
} else {
visitExpression(node.receiver);
final receiver = visitExpression(node.receiver);
checkUnresolvedInvocation(receiver, node);
}
return value;
}
@@ -622,6 +635,7 @@ class TypeCheckingVisitor
@override
DartType visitSuperMethodInvocation(SuperMethodInvocation node) {
if (node.interfaceTarget == null) {
checkUnresolvedInvocation(environment.thisType, node);
return handleDynamicCall(environment.thisType, node.arguments);
} else {
return handleCall(node.arguments, node.interfaceTarget.getterType,
@@ -632,6 +646,7 @@ class TypeCheckingVisitor
@override
DartType visitSuperPropertyGet(SuperPropertyGet node) {
if (node.interfaceTarget == null) {
checkUnresolvedInvocation(environment.thisType, node);
return const DynamicType();
} else {
var receiver = getSuperReceiverType(node.interfaceTarget);
@@ -649,6 +664,8 @@ class TypeCheckingVisitor
value,
receiver.substituteType(node.interfaceTarget.setterType,
contravariant: true));
} else {
checkUnresolvedInvocation(environment.thisType, node);
}
return value;
}