Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: frog/leg/typechecker.dart

Issue 9835007: Typecheck constructor calls. I'm pretty sure about the call to (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698