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

Unified Diff: frog/member.dart

Issue 8878001: frog: improve errors with named param (bug 507) (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: missed adding the new test Created 9 years 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 | frog/minfrog » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: frog/member.dart
diff --git a/frog/member.dart b/frog/member.dart
index 4f971cbd9c6ed01937e3c3a8b9380b8b835ee399..bc6383066ce9830c25935d41a068eb1065e9beae 100644
--- a/frog/member.dart
+++ b/frog/member.dart
@@ -838,17 +838,16 @@ class MethodMember extends Member {
}
static String _argCountMsg(int actual, int expected, [bool atLeast=false]) {
- // TODO(jimhug): better messages with default named args.
- return 'wrong number of arguments, expected ' +
+ return 'wrong number of positional arguments, expected ' +
'${atLeast ? "at least " : ""}$expected but found $actual';
}
Value _argError(MethodGenerator context, Node node, Value target,
- Arguments args, String msg) {
+ Arguments args, String msg, SourceSpan span) {
if (isStatic || isConstructor) {
- world.error(msg, node.span);
+ world.error(msg, span);
} else {
- world.warning(msg, node.span);
+ world.warning(msg, span);
}
return target.invokeNoSuchMethod(context, name, node, args);
}
@@ -897,9 +896,8 @@ class MethodMember extends Member {
for (int i = 0; i < bareCount; i++) {
var arg = args.values[i];
if (i >= parameters.length) {
- // TODO(jimhug): better error location
var msg = _argCountMsg(args.length, parameters.length);
- return _argError(context, node, target, args, msg);
+ return _argError(context, node, target, args, msg, args.nodes[i].span);
}
arg = arg.convertTo(context, parameters[i].type, node, isDynamic);
if (isConst && arg.isConst) {
@@ -909,10 +907,10 @@ class MethodMember extends Member {
}
}
+ int namedArgsUsed = 0;
if (bareCount < parameters.length) {
genParameterValues();
- int namedArgsUsed = 0;
for (int i = bareCount; i < parameters.length; i++) {
var arg = args.getValue(parameters[i].name);
if (arg == null) {
@@ -923,39 +921,41 @@ class MethodMember extends Member {
}
if (arg == null || !parameters[i].isOptional) {
- // TODO(jimhug): better error location
var msg = _argCountMsg(Math.min(i, args.length), i + 1, atLeast:true);
- return _argError(context, node, target, args, msg);
+ return _argError(context, node, target, args, msg,
+ args.nodes[i].span);
} else {
argsCode.add(isConst && arg.isConst
? arg.canonicalCode : arg.code);
}
}
+ Arguments.removeTrailingNulls(argsCode);
+ }
- if (namedArgsUsed < args.nameCount) {
- // TODO(jmesserly): better error location
- // Find the unused argument name
- var seen = new Set<String>();
- for (int i = bareCount; i < args.length; i++) {
- var name = args.getName(i);
- if (seen.contains(name)) {
- return _argError(context, node, target, args,
- 'duplicate argument "$name"');
- }
- seen.add(name);
- int p = indexOfParameter(name);
- if (p < 0) {
- return _argError(context, node, target, args,
- 'method does not have optional parameter "$name"');
- } else if (p < bareCount) {
- return _argError(context, node, target, args,
- 'argument "$name" passed as positional and named');
- }
+ if (namedArgsUsed < args.nameCount) {
+ // Find the unused argument name
+ var seen = new Set<String>();
+ for (int i = bareCount; i < args.length; i++) {
+ var name = args.getName(i);
+ if (seen.contains(name)) {
+ return _argError(context, node, target, args,
+ 'duplicate argument "$name"', args.nodes[i].span);
+ }
+ seen.add(name);
+ int p = indexOfParameter(name);
+ if (p < 0) {
+ return _argError(context, node, target, args,
+ 'method does not have optional parameter "$name"',
+ args.nodes[i].span);
+ } else if (p < bareCount) {
+ return _argError(context, node, target, args,
+ 'argument "$name" passed as positional and named',
+ // Given that the named was mentioned explicitly, highlight the
+ // positional location instead:
+ args.nodes[p].span);
}
- world.internalError('wrong named arguments calling $name', node.span);
}
-
- Arguments.removeTrailingNulls(argsCode);
+ world.internalError('wrong named arguments calling $name', node.span);
}
var argsString = Strings.join(argsCode, ', ');
« no previous file with comments | « no previous file | frog/minfrog » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698