Skip to content

Commit c365287

Browse files
committed
Reduce the recursion of the extend with "all" keyword to the rplace
part. This is more compatible with the reference implementation.
1 parent e4b6739 commit c365287

File tree

3 files changed

+165
-5
lines changed

3 files changed

+165
-5
lines changed

src/com/inet/lib/less/LessExtendMap.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ void add( LessExtend lessExtend, String[] mainSelector ) {
8585
public String[] concatenateExtends( String[] selectors, boolean isReference ) {
8686
selectorList.clear();
8787
for( String selector : selectors ) {
88-
concatenateExtendsRecursive( selector, isReference );
88+
concatenateExtendsRecursive( selector, isReference, selector );
8989
}
9090

9191
if( isReference ) {
@@ -114,20 +114,23 @@ public String[] concatenateExtends( String[] selectors, boolean isReference ) {
114114
* current selector
115115
* @param isReference
116116
* if the current rule is in a less file which was import with "reference" keyword
117+
* @param allSelector
118+
* selector that should match with the "all" keyword. By default is this equals of the selector. Only on
119+
* recursion this is only the replaced part.
117120
*/
118-
private void concatenateExtendsRecursive( String selector, boolean isReference ) {
121+
private void concatenateExtendsRecursive( String selector, boolean isReference, String allSelector ) {
119122
List<String[]> list = exact.get( selector );
120123
if( list != null ) {
121124
for( String[] lessExtend : list ) {
122125
for( String sel : lessExtend ) {
123126
boolean needRecursion = selectorList.add( sel );
124127
if( needRecursion ) { //only if there are new entries then we need to try a recursion, else we have a stack overflow
125-
concatenateExtendsRecursive( sel, isReference );
128+
concatenateExtendsRecursive( sel, isReference, sel );
126129
}
127130
}
128131
}
129132
}
130-
SelectorTokenizer tokenizer = new SelectorTokenizer( selector );
133+
SelectorTokenizer tokenizer = new SelectorTokenizer( allSelector );
131134
do {
132135
String token = tokenizer.next();
133136
if( token == null ) {
@@ -142,7 +145,7 @@ private void concatenateExtendsRecursive( String selector, boolean isReference )
142145
String replacedSelector = selector.replace( extendingSelector, replace );
143146
boolean needRecursion = selectorList.add( replacedSelector );
144147
if( needRecursion && !replacedSelector.contains( extendingSelector ) ) {
145-
concatenateExtendsRecursive( replacedSelector, isReference );
148+
concatenateExtendsRecursive( replacedSelector, isReference, replace );
146149
}
147150
}
148151
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
.error,
2+
.badError {
3+
border: 1px #f00;
4+
background: #fdd;
5+
}
6+
.error.intrusion,
7+
.badError.intrusion {
8+
font-size: 1.3em;
9+
font-weight: bold;
10+
}
11+
.intrusion .error,
12+
.intrusion .badError {
13+
display: none;
14+
}
15+
.badError {
16+
border-width: 3px;
17+
}
18+
.foo .bar,
19+
.foo .baz,
20+
.ext1 .ext2 .bar,
21+
.ext3 .bar,
22+
.ext4 .bar,
23+
.foo .ext3,
24+
.foo .ext4,
25+
.ext1 .ext2 .baz,
26+
.ext3 .baz,
27+
.ext4 .baz {
28+
display: none;
29+
}
30+
div.ext5,
31+
.ext6 > .ext5,
32+
div.ext7,
33+
.ext6 > .ext7 {
34+
width: 100px;
35+
}
36+
.ext8.ext9,
37+
.fuu {
38+
result: add-foo;
39+
}
40+
.ext8 .ext9,
41+
.ext8 + .ext9,
42+
.ext8 > .ext9,
43+
.buu,
44+
.zap,
45+
.zoo {
46+
result: bar-matched;
47+
}
48+
.ext8.nomatch {
49+
result: none;
50+
}
51+
.ext8 .ext9,
52+
.buu {
53+
result: match-nested-bar;
54+
}
55+
.ext8.ext9,
56+
.fuu {
57+
result: match-nested-foo;
58+
}
59+
.aa,
60+
.cc {
61+
color: black;
62+
}
63+
.aa .dd,
64+
.aa .ee {
65+
background: red;
66+
}
67+
.bb,
68+
.cc,
69+
.ee,
70+
.ff {
71+
background: red;
72+
}
73+
.bb .bb,
74+
.ff .ff {
75+
color: black;
76+
}
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
.error {
2+
border: 1px #f00;
3+
background: #fdd;
4+
}
5+
.error.intrusion {
6+
font-size: 1.3em;
7+
font-weight: bold;
8+
}
9+
.intrusion .error {
10+
display: none;
11+
}
12+
.badError {
13+
&:extend(.error all);
14+
border-width: 3px;
15+
}
16+
17+
.foo .bar, .foo .baz {
18+
display: none;
19+
}
20+
21+
.ext1 .ext2 {
22+
&:extend(.foo all);
23+
}
24+
25+
.ext3,
26+
.ext4 {
27+
&:extend(.foo all);
28+
&:extend(.bar all);
29+
}
30+
31+
div.ext5,
32+
.ext6 > .ext5 {
33+
width: 100px;
34+
}
35+
36+
.ext7 {
37+
&:extend(.ext5 all);
38+
}
39+
40+
.ext8.ext9 {
41+
result: add-foo;
42+
}
43+
.ext8 .ext9,
44+
.ext8 + .ext9,
45+
.ext8 > .ext9 {
46+
result: bar-matched;
47+
}
48+
.ext8.nomatch {
49+
result: none;
50+
}
51+
.ext8 {
52+
.ext9 {
53+
result: match-nested-bar;
54+
}
55+
}
56+
.ext8 {
57+
&.ext9 {
58+
result: match-nested-foo;
59+
}
60+
}
61+
62+
.fuu:extend(.ext8.ext9 all) {}
63+
.buu:extend(.ext8 .ext9 all) {}
64+
.zap: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 {
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)