From 6f8fa2d858cdb8e360cfee023527f362dfdca1fb Mon Sep 17 00:00:00 2001 From: cloudhead Date: Thu, 22 Apr 2010 13:34:49 -0400 Subject: [PATCH] Fixed mixin calls not working from dynamic mixins Dynamic mixins aren't treated enough like Rulesets. There is some code duplication which needs to be cleaned up, ideally they should share a prototype. --- lib/less/tree/mixin.js | 19 +++++++++++++++---- lib/less/tree/ruleset.js | 16 ++++++++++++---- test/css/mixins-nested.css | 1 + test/less/mixins-nested.less | 5 +++++ 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/less/tree/mixin.js b/lib/less/tree/mixin.js index 190e1be8..d6e5018c 100644 --- a/lib/less/tree/mixin.js +++ b/lib/less/tree/mixin.js @@ -27,10 +27,13 @@ tree.mixin.Definition = function MixinDefinition(name, params, rules) { this.selectors = [new(tree.Selector)([new(tree.Element)(null, name)])]; this.params = params; this.rules = rules; + this._lookups = {}; }; tree.mixin.Definition.prototype = { toCSS: function () { return "" }, variables: function () { return tree.Ruleset.prototype.variables.apply(this) }, + find: function () { return tree.Ruleset.prototype.find.apply(this, arguments) }, + rulesets: function () { return tree.Ruleset.prototype.rulesets.apply(this) }, eval: function (args, env) { var frame = new(tree.Ruleset)(null, []), context; @@ -44,9 +47,17 @@ tree.mixin.Definition.prototype = { } context = { frames: [this, frame].concat(env.frames) }; - return new(tree.Ruleset)(null, this.rules.map(function (rule) { - if (rule.evalRules) return rule.evalRules(context); - else return rule.eval(context); - })); + var rules = []; + + this.rules.forEach(function (rule) { + if (rule.evalRules) { + rules.push(rule.evalRules(context)); + } else if (rule instanceof tree.mixin.Call) { + Array.prototype.push.apply(rules, rule.eval(context)); + } else { + rules.push(rule.eval(context)); + } + }); + return new(tree.Ruleset)(null, rules); } }; diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js index 44fa86cb..b5218efa 100644 --- a/lib/less/tree/ruleset.js +++ b/lib/less/tree/ruleset.js @@ -8,10 +8,18 @@ tree.Ruleset = function Ruleset(selectors, rules) { tree.Ruleset.prototype = { eval: function () { return this }, evalRules: function (context) { - return new(tree.Ruleset)(this.selectors, this.rules.map(function (r) { - if (r.evalRules) return r.evalRules(context); - else return r.eval(context); - })); + var rules = []; + + this.rules.forEach(function (rule) { + if (rule.evalRules) { + rules.push(rule.evalRules(context)); + } else if (rule instanceof tree.mixin.Call) { + Array.prototype.push.apply(rules, rule.eval(context)); + } else { + rules.push(rule.eval(context)); + } + }); + return new(tree.Ruleset)(this.selectors, rules); }, variables: function () { if (this._variables) { return this._variables } diff --git a/test/css/mixins-nested.css b/test/css/mixins-nested.css index 5a678864..048e2a01 100644 --- a/test/css/mixins-nested.css +++ b/test/css/mixins-nested.css @@ -3,4 +3,5 @@ } .class .inner .innest { width: 30; + border-width: 60; } diff --git a/test/less/mixins-nested.less b/test/less/mixins-nested.less index 0015807d..954353b4 100644 --- a/test/less/mixins-nested.less +++ b/test/less/mixins-nested.less @@ -1,9 +1,14 @@ +.mix-inner (@var) { + border-width: @var; +} + .mix (@a: 10) { .inner { height: @a * 10; .innest { width: @a; + .mix-inner(@a * 2); } } }