Skip to content

Commit da7de8f

Browse files
committed
move extend fully into visitor, bringing back functionality and fixes #1165
1 parent aac8e97 commit da7de8f

File tree

6 files changed

+87
-37
lines changed

6 files changed

+87
-37
lines changed

lib/less/extend-visitor.js

+33-5
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,9 @@
1313
},
1414
visitRule: function (ruleNode, visitArgs) {
1515
visitArgs.visitDeeper = false;
16-
return ruleNode;
1716
},
1817
visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
1918
visitArgs.visitDeeper = false;
20-
return mixinDefinitionNode;
2119
},
2220
visitRuleset: function (rulesetNode, visitArgs) {
2321

@@ -38,7 +36,9 @@
3836
// and the ones which apply to an individual extend
3937
for(i = 0; i < rulesetNode.selectors.length; i++) {
4038
var selector = rulesetNode.selectors[i];
41-
extendList = selector.extendList.slice(0).concat(allSelectorsExtendList);
39+
extendList = selector.extendList.slice(0).concat(allSelectorsExtendList.map(function(allSelectorsExtend) {
40+
return allSelectorsExtend.clone();
41+
}));
4242
for(j = 0; j < extendList.length; j++) {
4343
extend = extendList[j];
4444
extend.findSelfSelectors([[selector]].concat(this.contexts.slice(0)));
@@ -82,16 +82,44 @@
8282
},
8383
visitRule: function (ruleNode, visitArgs) {
8484
visitArgs.visitDeeper = false;
85-
return ruleNode;
8685
},
8786
visitMixinDefinition: function (mixinDefinitionNode, visitArgs) {
8887
visitArgs.visitDeeper = false;
89-
return mixinDefinitionNode;
88+
},
89+
visitSelector: function (selectorNode, visitArgs) {
90+
visitArgs.visitDeeper = false;
9091
},
9192
visitRuleset: function (rulesetNode, visitArgs) {
9293
if (rulesetNode.root) {
9394
return;
9495
}
96+
var i, j, k, selector, element, allExtends = this.allExtendsStack[this.allExtendsStack.length-1], selectorsToAdd = [];
97+
if (allExtends.length) {
98+
for(i = 0; i < rulesetNode.selectors.length; i++) {
99+
selector = rulesetNode.selectors[i];
100+
for(j = 0; j < selector.elements.length; j++) {
101+
element = selector.elements[j];
102+
for(k = 0; k < allExtends.length; k++) {
103+
if (allExtends[k].selector.elements[0].value === element.value) {
104+
allExtends[k].selfSelectors.forEach(function(selfSelector) {
105+
selfSelector.elements[0] = new tree.Element(
106+
element.combinator,
107+
selfSelector.elements[0].value,
108+
selfSelector.elements[0].index
109+
);
110+
selectorsToAdd.push(new tree.Selector(
111+
selector.elements
112+
.slice(0, j)
113+
.concat(selfSelector.elements)
114+
.concat(selector.elements.slice(j + 1))
115+
));
116+
});
117+
}
118+
}
119+
}
120+
}
121+
rulesetNode.selectors = rulesetNode.selectors.concat(selectorsToAdd);
122+
}
95123
},
96124
visitRulesetOut: function (rulesetNode) {
97125
},

lib/less/tree/extend.js

+3-29
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ tree.Extend.prototype = {
1414
eval: function (env) {
1515
return new(tree.Extend)(this.selector.eval(env), this.option, this.index);
1616
},
17+
clone: function (env) {
18+
return new(tree.Extend)(this.selector, this.option, this.index);
19+
},
1720
findSelfSelectors: function (selectors) {
1821
var selfSelectors = [];
1922

@@ -31,35 +34,6 @@ tree.Extend.prototype = {
3134
})([], 0);
3235

3336
this.selfSelectors = selfSelectors;
34-
},
35-
a: function() {
36-
var selfSelectors = findSelfSelectors(selectors || env.selectors),
37-
targetValue = this.selector.elements[0].value;
38-
39-
env.frames.forEach(function(frame) {
40-
frame.rulesets().forEach(function(rule) {
41-
rule.selectors.forEach(function(selector) {
42-
selector.elements.forEach(function(element, idx) {
43-
if (element.value === targetValue) {
44-
selfSelectors.forEach(function(_selector) {
45-
_selector.elements[0] = new tree.Element(
46-
element.combinator,
47-
_selector.elements[0].value,
48-
_selector.elements[0].index
49-
);
50-
rule.selectors.push(new tree.Selector(
51-
selector.elements
52-
.slice(0, idx)
53-
.concat(_selector.elements)
54-
.concat(selector.elements.slice(idx + 1))
55-
));
56-
});
57-
}
58-
});
59-
});
60-
});
61-
});
62-
return this;
6337
}
6438
};
6539

test/css/extend-media.css

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
.ext1 .ext2,
2+
.all .ext2 {
3+
background: black;
4+
}
5+
@media tv {
6+
.ext1 .ext3,
7+
.tv-lowres .ext3,
8+
.all .ext3 {
9+
color: white;
10+
}
11+
.tv-lowres {
12+
background: blue;
13+
}
14+
}
15+
@media tv and hires {
16+
.ext1 .ext4,
17+
.tv-hires .ext4,
18+
.all .ext4 {
19+
color: green;
20+
}
21+
.tv-hires {
22+
background: red;
23+
}
24+
}

test/css/extend-selector.css

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@
1818
.foo .bar,
1919
.foo .baz,
2020
.ext1 .ext2 .bar,
21-
.ext1 .ext2 .baz,
2221
.ext3 .bar,
23-
.ext3 .baz,
2422
.ext4 .bar,
23+
.ext1 .ext2 .baz,
24+
.ext3 .baz,
2525
.ext4 .baz {
2626
display: none;
2727
}

test/css/extend.css

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
.foo .bar,
1919
.foo .baz,
2020
.ext1 .ext2 .bar,
21-
.ext1 .ext2 .baz,
2221
.ext3 .bar,
2322
.ext4 .bar,
23+
.ext1 .ext2 .baz,
2424
.ext3 .baz,
2525
.ext4 .baz {
2626
display: none;

test/less/extend-media.less

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
.ext1 .ext2 {
2+
background: black;
3+
}
4+
5+
@media tv {
6+
.ext1 .ext3 {
7+
color: white;
8+
}
9+
.tv-lowres :extend(.ext1 all) {
10+
background: blue;
11+
}
12+
@media hires {
13+
.ext1 .ext4 {
14+
color: green;
15+
}
16+
.tv-hires :extend(.ext1 all) {
17+
background: red;
18+
}
19+
}
20+
}
21+
22+
.all:extend(.ext1 all) {
23+
24+
}

0 commit comments

Comments
 (0)