Chromium Code Reviews| Index: frog/leg/typechecker.dart |
| diff --git a/frog/leg/typechecker.dart b/frog/leg/typechecker.dart |
| index ef555b2a420e88e1cba9224a75c35fbeffce3301..1f03aaceed2f48f6b0e69faec85c2070fdba751a 100644 |
| --- a/frog/leg/typechecker.dart |
| +++ b/frog/leg/typechecker.dart |
| @@ -367,6 +367,29 @@ class TypeCheckerVisitor implements Visitor<Type> { |
| return builder.toLink(); |
| } |
| + /** |
| + * Checks that [parameterTypes] matches [argumentTypes], reports type |
| + * warnings otherwise. Preconditions: |
| + * [: argumentNodes == sendOrNew.arguments :] |
| + * [: argumentTypes == analyzeArguments(argumentNodes) :] |
| + */ |
| + void checkArgumentTypes(Node sendOrNew, Link<Node> argumentNodes, |
|
ahe
2012/03/22 14:46:23
Change this to:
checkArgumentTypes(Send send, Fun
polux
2012/03/22 15:08:26
I could as well merge the loops of checkArgumentTy
polux
2012/03/22 15:36:47
Done.
|
| + Link<Type> parameterTypes, Link<Type> argumentTypes) { |
| + while (!argumentTypes.isEmpty() && !parameterTypes.isEmpty()) { |
| + checkAssignable(argumentNodes.head, parameterTypes.head, |
| + argumentTypes.head); |
| + argumentTypes = argumentTypes.tail; |
| + parameterTypes = parameterTypes.tail; |
| + argumentNodes = argumentNodes.tail; |
| + } |
| + if (!argumentTypes.isEmpty()) { |
| + reportTypeWarning(argumentNodes.head, MessageKind.ADDITIONAL_ARGUMENT); |
| + } else if (!parameterTypes.isEmpty()) { |
| + reportTypeWarning(sendOrNew, MessageKind.MISSING_ARGUMENT, |
| + [parameterTypes.head]); |
| + } |
| + } |
| + |
| Type visitSend(Send node) { |
| if (Elements.isClosureSend(node, elements)) { |
| // TODO(karlklose): Finish implementation. |
| @@ -448,21 +471,7 @@ class TypeCheckerVisitor implements Visitor<Type> { |
| fail(node, 'unexpected element kind ${element.kind}'); |
| } |
| } |
| - Link<Type> parameterTypes = funType.parameterTypes; |
| - Link<Node> argumentNodes = node.arguments; |
| - while (!argumentTypes.isEmpty() && !parameterTypes.isEmpty()) { |
| - checkAssignable(argumentNodes.head, parameterTypes.head, |
| - argumentTypes.head); |
| - argumentTypes = argumentTypes.tail; |
| - parameterTypes = parameterTypes.tail; |
| - argumentNodes = argumentNodes.tail; |
| - } |
| - if (!argumentTypes.isEmpty()) { |
| - reportTypeWarning(argumentNodes.head, MessageKind.ADDITIONAL_ARGUMENT); |
| - } else if (!parameterTypes.isEmpty()) { |
| - reportTypeWarning(node, MessageKind.MISSING_ARGUMENT, |
| - [parameterTypes.head]); |
| - } |
| + checkArgumentTypes(node, node.arguments, funType.parameterTypes, argumentTypes); |
|
ahe
2012/03/22 14:46:23
Change this to:
checkArgumentTypes(node, funType)
polux
2012/03/22 15:36:47
Done.
|
| return funType.returnType; |
| } |
| } |
| @@ -510,6 +519,11 @@ class TypeCheckerVisitor implements Visitor<Type> { |
| } |
| Type visitNewExpression(NewExpression node) { |
| + Link<Type> argumentTypes = analyzeArguments(node.send.arguments); |
| + Link<Type> parameterTypes = new EmptyLink(); |
| + Element element = elements[node.send]; |
| + FunctionType funtype = computeType(element); |
|
ahe
2012/03/22 14:46:23
Calling computeType resolves the element on-demand
polux
2012/03/22 15:36:47
Done.
|
| + checkArgumentTypes(node, node.send.arguments, funtype.parameterTypes, argumentTypes); |
|
ahe
2012/03/22 14:46:23
Change this to:
checkArgumentTypes(node.send, fun
polux
2012/03/22 15:36:47
Done.
|
| return analyze(node.send.selector); |
| } |