Skip to content

Commit c17d939

Browse files
committed
Allow multiple extends for more declarative multiple inheritance
1 parent 45ea535 commit c17d939

File tree

3 files changed

+56
-14
lines changed

3 files changed

+56
-14
lines changed

lib/less/parser.js

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -789,27 +789,34 @@ less.Parser = function Parser(env) {
789789
// extend syntax - used to extend selectors
790790
//
791791
extend: function(isRule) {
792-
var elements = [], e, args, index = i, option;
792+
var elements, e, index = i, option, extendList = [];
793793

794794
if (!$(isRule ? /^&:extend\(/ : /^:extend\(/)) { return; }
795795

796-
while (true) {
797-
option = $(/^(all)(?=\s*\))/);
798-
if (option) { break; }
799-
e = $(this.element);
800-
if (!e) { break; }
801-
elements.push(e);
802-
}
796+
do {
797+
option = null;
798+
elements = [];
799+
while (true) {
800+
option = $(/^(all)(?=\s*(\)|,))/);
801+
if (option) { break; }
802+
e = $(this.element);
803+
if (!e) { break; }
804+
elements.push(e);
805+
}
806+
807+
option = option && option[1];
808+
809+
extendList.push(new(tree.Extend)(new(tree.Selector)(elements), option, index));
810+
811+
} while($(","))
803812

804813
expect(/^\)/);
805-
806-
option = option && option[1];
807-
814+
808815
if (isRule) {
809816
expect(/^;/);
810817
}
811818

812-
return new(tree.Extend)(new(tree.Selector)(elements), option, index);
819+
return extendList;
813820
},
814821

815822
//
@@ -1118,7 +1125,7 @@ less.Parser = function Parser(env) {
11181125

11191126
while ((extend = $(this.extend)) || (e = $(this.element))) {
11201127
if (extend) {
1121-
extendList.push(extend);
1128+
extendList.push.apply(extendList, extend);
11221129
} else {
11231130
if (extendList.length) {
11241131
error("Extend can only be used at the end of selector");

test/css/extend.css

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,22 @@ div.ext7,
5656
.foo {
5757
result: match-nested-foo;
5858
}
59+
.aa,
60+
.bb,
61+
.cc {
62+
color: black;
63+
}
64+
.aa .dd,
65+
.aa .ee {
66+
background: red;
67+
}
68+
.bb,
69+
.cc,
70+
.ee,
71+
.ff {
72+
background: red;
73+
}
74+
.bb .bb,
75+
.ff .ff {
76+
color: black;
77+
}

test/less/extend.less

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,20 @@ div.ext5,
6262
.foo:extend(.ext8.ext9 all) {}
6363
.bar:extend(.ext8 .ext9 all) {}
6464
.zap:extend(.ext8 + .ext9 all) {}
65-
.zoo:extend(.ext8 > .ext9 all) {}
65+
.zoo:extend(.ext8 > .ext9 all) {}
66+
67+
.aa {
68+
color: black;
69+
.dd {
70+
background: red;
71+
}
72+
}
73+
.bb:extend(.aa) {
74+
background: red;
75+
.bb {
76+
color: black;
77+
}
78+
}
79+
.cc:extend(.aa,.bb) {}
80+
.ee:extend(.dd all,.bb) {}
81+
.ff:extend(.dd,.bb all) {}

0 commit comments

Comments
 (0)