Fix argument matching. Fixes #1036

This commit is contained in:
Luke Page
2012-11-27 13:14:04 +00:00
parent e5fd5abc60
commit 5dc7ff50f0
3 changed files with 34 additions and 16 deletions

View File

@@ -97,7 +97,7 @@ tree.mixin.Definition.prototype = {
rulesets: function () { return this.parent.rulesets.apply(this) },
evalParams: function (env, args, evaldArguments) {
var frame = new(tree.Ruleset)(null, []), varargs, arg, params = this.params.slice(0), i, j, val, name, isNamedFound;
var frame = new(tree.Ruleset)(null, []), varargs, arg, params = this.params.slice(0), i, j, val, name, isNamedFound, argIndex;
if (args) {
args = args.slice(0);
@@ -125,16 +125,16 @@ tree.mixin.Definition.prototype = {
}
}
}
argIndex = 0;
for (i = 0; i < params.length; i++) {
if (evaldArguments[i]) continue;
arg = args && args[i]
arg = args && args[argIndex];
if (name = params[i].name) {
if (params[i].variadic && args) {
varargs = [];
for (j = i; j < args.length; j++) {
for (j = argIndex; j < args.length; j++) {
varargs.push(args[j].value.eval(env));
}
frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env)));
@@ -148,10 +148,11 @@ tree.mixin.Definition.prototype = {
}
if (params[i].variadic && args) {
for (j = i; j < args.length; j++) {
for (j = argIndex; j < args.length; j++) {
evaldArguments[j] = args[j].value.eval(env);
}
}
argIndex++;
}
return frame;

View File

@@ -89,3 +89,7 @@ body {
one: r, s;
two: t;
}
#named-conflict {
four: a, 11, 12, 13;
four: a, 21, 22, 23;
}

View File

@@ -137,18 +137,31 @@ body {
.mixin-takes-two(@a; @b) {
one: @a;
two: @b;
two: @b;
}
.comma-vs-semi-colon {
.mixin-takes-two(@a : a; @b : b, c);
.mixin-takes-two(@a : d, e; @b : f);
.mixin-takes-one(@a: g);
.mixin-takes-one(@a : h;);
.mixin-takes-one(i);
.mixin-takes-one(j;);
.mixin-takes-two(k, l);
.mixin-takes-one(m, n;);
.mixin-takes-two(o, p; q);
.mixin-takes-two(r, s; t;);
.mixin-takes-two(@a : d, e; @b : f);
.mixin-takes-one(@a: g);
.mixin-takes-one(@a : h;);
.mixin-takes-one(i);
.mixin-takes-one(j;);
.mixin-takes-two(k, l);
.mixin-takes-one(m, n;);
.mixin-takes-two(o, p; q);
.mixin-takes-two(r, s; t;);
}
.mixin-conflict(@a:defA, @b:defB, @c:defC) {
three: @a, @b, @c;
}
.mixin-conflict(@a:defA, @b:defB, @c:defC, @d:defD) {
four: @a, @b, @c, @d;
}
#named-conflict {
.mixin-conflict(11, 12, 13, @a:a);
.mixin-conflict(@a:a, 21, 22, 23);
}