Skip to content

Commit 7c90aca

Browse files
committed
Fix a small scope issue with mixins when using parent selectors, introduced in 1.6.2. Fixes #1877
1 parent bf9c590 commit 7c90aca

File tree

5 files changed

+60
-14
lines changed

5 files changed

+60
-14
lines changed

lib/less/tree/ruleset.js

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -111,20 +111,25 @@ tree.Ruleset.prototype = {
111111
rule = rsRules[i];
112112
if (! (rule instanceof tree.mixin.Definition || rule instanceof tree.DetachedRuleset)) {
113113
rsRules[i] = rule = rule.eval ? rule.eval(env) : rule;
114-
// for rulesets, check if it is a css guard and can be removed
115-
if (rule instanceof tree.Ruleset && rule.selectors && rule.selectors.length === 1) {
116-
// check if it can be folded in (e.g. & where)
117-
if (rule.selectors[0].isJustParentSelector()) {
118-
rsRules.splice(i--, 1);
119-
// cannot call if there is no selector, so we can just continue
120-
if (!rule.selectors[0].evaldCondition) {
121-
continue;
122-
}
123-
for(var j = 0; j < rule.rules.length; j++) {
124-
subRule = rule.rules[j];
125-
if (!(subRule instanceof tree.Rule) || !subRule.variable) {
126-
rsRules.splice(++i, 0, subRule);
127-
}
114+
}
115+
}
116+
117+
// Evaluate everything else
118+
for (i = 0; i < rsRules.length; i++) {
119+
rule = rsRules[i];
120+
// for rulesets, check if it is a css guard and can be removed
121+
if (rule instanceof tree.Ruleset && rule.selectors && rule.selectors.length === 1) {
122+
// check if it can be folded in (e.g. & where)
123+
if (rule.selectors[0].isJustParentSelector()) {
124+
rsRules.splice(i--, 1);
125+
// cannot call if there is no selector, so we can just continue
126+
if (!rule.selectors[0].evaldCondition) {
127+
continue;
128+
}
129+
for(var j = 0; j < rule.rules.length; j++) {
130+
subRule = rule.rules[j];
131+
if (!(subRule instanceof tree.Rule) || !subRule.variable) {
132+
rsRules.splice(++i, 0, subRule);
128133
}
129134
}
130135
}

test/css/scope.css

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,6 @@
3333
scope: 'top level';
3434
sub-scope-only: 'inside';
3535
}
36+
#parentSelectorScope {
37+
prop: #ffffff;
38+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.something {
2+
& {
3+
.a {value: a}
4+
}
5+
6+
& {
7+
.b {.a} // was Err. before 1.6.2
8+
}
9+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
NameError: .a is undefined in {path}mixin-not-visible-in-scope-1.less on line 7, column 13:
2+
6 & {
3+
7 .b {.a} // was Err. before 1.6.2
4+
8 }

test/less/scope.less

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,4 +76,29 @@
7676
@subScopeOnly: 'inside';
7777
//use the mixin
7878
.mixinNoParam();
79+
}
80+
#parentSelectorScope {
81+
@col: white;
82+
& {
83+
@col: black;
84+
}
85+
prop: @col;
86+
& {
87+
@col: black;
88+
}
89+
}
90+
.test-empty-mixin() {
91+
}
92+
#parentSelectorScopeMixins {
93+
& {
94+
.test-empty-mixin() {
95+
should: never seee 1;
96+
}
97+
}
98+
.test-empty-mixin();
99+
& {
100+
.test-empty-mixin() {
101+
should: never seee 2;
102+
}
103+
}
79104
}

0 commit comments

Comments
 (0)