[Pkg-javascript-commits] [less.js] 95/285: Added guards checking to namespaces. Issue #1418.
Jonas Smedegaard
dr at jones.dk
Mon Oct 26 23:23:42 UTC 2015
This is an automated email from the git hooks/post-receive script.
js pushed a commit to annotated tag v2.0.0
in repository less.js.
commit c330c3a4a8b14a525ae2bd57a00ea1e1e305cb2d
Author: jurcovicovam <meri at meri.org>
Date: Fri Sep 5 09:01:56 2014 +0200
Added guards checking to namespaces. Issue #1418.
---
lib/less/tree/mixin.js | 67 +++++++++++++++++++++++++++-----------------
lib/less/tree/ruleset.js | 15 ++++++----
test/css/mixins-guards.css | 8 ++++++
test/less/mixins-guards.less | 55 ++++++++++++++++++++++++++++++++++++
4 files changed, 115 insertions(+), 30 deletions(-)
diff --git a/lib/less/tree/mixin.js b/lib/less/tree/mixin.js
index 94f48ef..078f30e 100644
--- a/lib/less/tree/mixin.js
+++ b/lib/less/tree/mixin.js
@@ -19,16 +19,45 @@ tree.mixin.Call.prototype = {
}
},
eval: function (env) {
- var mixins, mixin, args, rules = [], match = false, i, m, f, isRecursive, isOneFound, rule,
- candidates = [], candidate, conditionResult = [], defaultFunc = tree.defaultFunc,
- defaultResult, defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset;
+ var mixins, mixin, mixinPath, args, rules = [], match = false, i, m, f, isRecursive, isOneFound, rule,
+ candidates = [], candidate, conditionResult = [], defaultFunc = tree.defaultFunc,
+ defaultResult, defFalseEitherCase=-1, defNone = 0, defTrue = 1, defFalse = 2, count, originalRuleset, noArgumentsFilter;
+
+ function calcDefGroup(mixin, mixinPath) {
+ var p, namespace;
+
+ for (f = 0; f < 2; f++) {
+ conditionResult[f] = true;
+ defaultFunc.value(f);
+ for(p = 0; p < mixinPath.length && conditionResult[f]; p++) {
+ namespace = mixinPath[p];
+ if (namespace.matchCondition) {
+ conditionResult[f] = conditionResult[f] && namespace.matchCondition(null, env);
+ }
+ }
+ if (mixin.matchCondition) {
+ conditionResult[f] = conditionResult[f] && mixin.matchCondition(args, env);
+ }
+ }
+ if (conditionResult[0] || conditionResult[1]) {
+ if (conditionResult[0] != conditionResult[1]) {
+ return conditionResult[1] ?
+ defTrue : defFalse;
+ }
+
+ return defNone;
+ }
+ return defFalseEitherCase;
+ }
args = this.arguments && this.arguments.map(function (a) {
return { name: a.name, value: a.value.eval(env) };
});
+ noArgumentsFilter = function(rule) {return rule.matchArgs(null, env);};
+
for (i = 0; i < env.frames.length; i++) {
- if ((mixins = env.frames[i].find(this.selector)).length > 0) {
+ if ((mixins = env.frames[i].find(this.selector, null, noArgumentsFilter)).length > 0) {
isOneFound = true;
// To make `default()` function independent of definition order we have two "subpasses" here.
@@ -37,7 +66,8 @@ tree.mixin.Call.prototype = {
// we make a final decision.
for (m = 0; m < mixins.length; m++) {
- mixin = mixins[m];
+ mixin = mixins[m].rule;
+ mixinPath = mixins[m].path;
isRecursive = false;
for(f = 0; f < env.frames.length; f++) {
if ((!(mixin instanceof tree.mixin.Definition)) && mixin === (env.frames[f].originalRuleset || env.frames[f])) {
@@ -48,28 +78,14 @@ tree.mixin.Call.prototype = {
if (isRecursive) {
continue;
}
-
- if (mixin.matchArgs(args, env)) {
- candidate = {mixin: mixin, group: defNone};
-
- if (mixin.matchCondition) {
- for (f = 0; f < 2; f++) {
- defaultFunc.value(f);
- conditionResult[f] = mixin.matchCondition(args, env);
- }
- if (conditionResult[0] || conditionResult[1]) {
- if (conditionResult[0] != conditionResult[1]) {
- candidate.group = conditionResult[1] ?
- defTrue : defFalse;
- }
- candidates.push(candidate);
- }
- }
- else {
- candidates.push(candidate);
+ if (mixin.matchArgs(args, env)) {
+ candidate = {mixin: mixin, group: calcDefGroup(mixin, mixinPath)};
+
+ if (candidate.group!==defFalseEitherCase) {
+ candidates.push(candidate);
}
-
+
match = true;
}
}
@@ -133,6 +149,7 @@ tree.mixin.Call.prototype = {
message: this.selector.toCSS().trim() + " is undefined",
index: this.index, filename: this.currentFileInfo.filename };
}
+
},
format: function (args) {
return this.selector.toCSS().trim() + '(' +
diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js
index 17c0ad1..f5cdf1f 100644
--- a/lib/less/tree/ruleset.js
+++ b/lib/less/tree/ruleset.js
@@ -238,9 +238,9 @@ tree.Ruleset.prototype = {
var rules = this.rules;
if (rules) { rules.unshift(rule); } else { this.rules = [ rule ]; }
},
- find: function (selector, self) {
+ find: function (selector, self, filter) {
self = self || this;
- var rules = [], match,
+ var rules = [], match, foundMixins,
key = selector.toCSS();
if (key in this._lookups) { return this._lookups[key]; }
@@ -251,10 +251,15 @@ tree.Ruleset.prototype = {
match = selector.match(rule.selectors[j]);
if (match) {
if (selector.elements.length > match) {
- Array.prototype.push.apply(rules, rule.find(
- new(tree.Selector)(selector.elements.slice(match)), self));
+ if (!filter || filter(rule)) {
+ foundMixins = rule.find(new(tree.Selector)(selector.elements.slice(match)), self, filter);
+ for (var i = 0; i < foundMixins.length; ++i) {
+ foundMixins[i].path.push(rule);
+ }
+ Array.prototype.push.apply(rules, foundMixins);
+ }
} else {
- rules.push(rule);
+ rules.push({ rule: rule, path: []});
}
break;
}
diff --git a/test/css/mixins-guards.css b/test/css/mixins-guards.css
index 59b6f93..b918cda 100644
--- a/test/css/mixins-guards.css
+++ b/test/css/mixins-guards.css
@@ -91,3 +91,11 @@
.mixin-generated-class {
a: 1;
}
+#guarded-caller {
+ guarded: namespace;
+ silent: namespace;
+ guarded: with default;
+}
+#guarded-deeper {
+ should: match 1;
+}
diff --git a/test/less/mixins-guards.less b/test/less/mixins-guards.less
index 5aec2e5..33a3583 100644
--- a/test/less/mixins-guards.less
+++ b/test/less/mixins-guards.less
@@ -171,3 +171,58 @@
}
#ns > .mixin-for-root-usage(1);
+
+ at namespaceGuard: 1;
+#guarded when (@namespaceGuard>0) {
+ #deeper {
+ .mixin() {
+ guarded: namespace;
+ }
+ }
+}
+#guarded() when (@namespaceGuard>0) {
+ #deeper {
+ .mixin() {
+ silent: namespace;
+ }
+ }
+}
+#guarded(@variable) when (@namespaceGuard>0) {
+ #deeper {
+ .mixin() {
+ should: not match because namespace argument;
+ }
+ }
+}
+#guarded(@variable: default) when (@namespaceGuard>0) {
+ #deeper {
+ .mixin() {
+ guarded: with default;
+ }
+ }
+}
+#guarded when (@namespaceGuard<0) {
+ #deeper {
+ .mixin() {
+ should: not match because namespace guard;
+ }
+ }
+}
+#guarded-caller {
+ #guarded > #deeper > .mixin();
+}
+#top {
+ #deeper when (@namespaceGuard<0) {
+ .mixin(@a) {
+ should: not match because namespace guard;
+ }
+ }
+ #deeper() when (@namespaceGuard>0) {
+ .mixin(@a) {
+ should: match @a;
+ }
+ }
+}
+#guarded-deeper {
+ #top > #deeper > .mixin(1);
+}
\ No newline at end of file
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/less.js.git
More information about the Pkg-javascript-commits
mailing list