Skip to content

Commit 3e5a336

Browse files
committed
add ability to bind varargs
1 parent 99c3cb4 commit 3e5a336

File tree

4 files changed

+22
-10
lines changed

4 files changed

+22
-10
lines changed

lib/less/parser.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,10 @@ less.Parser = function Parser(env) {
807807
if ($(':')) {
808808
value = expect(this.expression, 'expected expression');
809809
params.push({ name: param.name, value: value });
810+
} else if ($(/^\.{3}/)) {
811+
params.push({ name: param.name, variadic: true });
812+
variadic = true;
813+
break;
810814
} else {
811815
params.push({ name: param.name });
812816
}

lib/less/tree/mixin.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,18 @@ tree.mixin.Definition.prototype = {
6969
rulesets: function () { return this.parent.rulesets.apply(this) },
7070

7171
evalParams: function (env, args) {
72-
var frame = new(tree.Ruleset)(null, []);
72+
var frame = new(tree.Ruleset)(null, []), varargs;
7373

74-
for (var i = 0, val; i < this.params.length; i++) {
75-
if (this.params[i].name) {
76-
if (val = (args && args[i]) || this.params[i].value) {
77-
frame.rules.unshift(new(tree.Rule)(this.params[i].name, val.eval(env)));
74+
for (var i = 0, val, name; i < this.params.length; i++) {
75+
if (name = this.params[i].name) {
76+
if (this.params[i].variadic && args) {
77+
varargs = [];
78+
for (var j = i; j < args.length; j++) {
79+
varargs.push(args[j].eval(env));
80+
}
81+
frame.rules.unshift(new(tree.Rule)(name, new(tree.Expression)(varargs).eval(env)));
82+
} else if (val = (args && args[i]) || this.params[i].value) {
83+
frame.rules.unshift(new(tree.Rule)(name, val.eval(env)));
7884
} else {
7985
throw { type: 'Runtime', message: "wrong number of arguments for " + this.name +
8086
' (' + args.length + ' for ' + this.arity + ')' };
@@ -84,7 +90,7 @@ tree.mixin.Definition.prototype = {
8490
return frame;
8591
},
8692
eval: function (env, args, important) {
87-
var frame = this.evalParams(env, args), context, _arguments = [], rules;
93+
var frame = this.evalParams(env, args), context, _arguments = [], rules, start;
8894

8995
for (var i = 0; i < Math.max(this.params.length, args && args.length); i++) {
9096
_arguments.push(args[i] || this.params[i].value);

test/css/mixins-args.css

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ body {
6666
width: 0px;
6767
}
6868
.arguments4 {
69-
border: 4 2;
70-
width: 4;
69+
border: 0 1 2 3 4;
70+
rest: 1 2 3 4;
71+
width: 0;
7172
}
7273
.edge-case {
7374
border: "{";

test/less/mixins-args.less

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,12 +121,13 @@ body {
121121
.mixin-arguments;
122122
}
123123

124-
.mixin-arguments2 (@width, ...) {
124+
.mixin-arguments2 (@width, @rest...) {
125125
border: @arguments;
126+
rest: @rest;
126127
width: @width;
127128
}
128129
.arguments4 {
129-
.mixin-arguments2(4, 2);
130+
.mixin-arguments2(0, 1, 2, 3, 4);
130131
}
131132

132133
// Edge cases

0 commit comments

Comments
 (0)