@@ -79,53 +79,80 @@ void add( LessExtend lessExtend, String[] mainSelector ) {
7979
8080 /**
8181 * Add to the given selectors all possible extends and return the resulting selectors.
82- * @param selectors current selectors
83- * @param isReference if the current rul is in a less file which was import with "reference" keyword
82+ *
83+ * @param selectors
84+ * current selectors
85+ * @param isReference
86+ * if the current rule is in a less file which was import with "reference" keyword
8487 * @return the selectors concatenate with extends or the original if there are no etends.
8588 */
8689 public String [] concatenateExtends ( String [] selectors , boolean isReference ) {
8790 selectorList .clear ();
8891 for ( String selector : selectors ) {
89- List <String []> list = exact .get ( selector );
90- if ( list != null ) {
91- for ( String [] lessExtend : list ) {
92- for ( String sel : lessExtend ) {
93- selectorList .add ( sel );
94- }
95- }
96- }
97- SelectorTokenizer tokenizer = new SelectorTokenizer ( selector );
98- do {
99- String token = tokenizer .next ();
100- if ( token == null ) {
101- break ;
102- }
103- List <LessExtendResult > results = all .get ( token );
104- if ( results != null ) {
105- for ( LessExtendResult lessExtend : results ) {
106- for ( String extendingSelector : lessExtend .getExtendingSelectors () ) {
107- if ( selector .contains ( extendingSelector ) ) {
108- for ( String replace : lessExtend .getSelectors () ) {
109- selectorList .add ( selector .replace ( extendingSelector , replace ) );
110- }
111- }
112- }
113- }
114- }
115- } while ( true );
92+ concatenateExtendsRecursive ( selector , isReference );
11693 }
11794
11895 if ( isReference ) {
11996 return selectorList .toArray ( new String [selectorList .size ()] );
12097 }
12198
12299 if ( selectorList .size () > 0 ) {
123- int off = selectors .length ;
124- selectors = Arrays .copyOf ( selectors , off + selectorList .size () );
125- for ( String str : selectorList ) {
126- selectors [off ++] = str ;
100+ for ( String selector : selectors ) {
101+ selectorList .remove ( selector ); // remove duplicates
102+ }
103+ if ( selectorList .size () > 0 ) {
104+ int off = selectors .length ;
105+ selectors = Arrays .copyOf ( selectors , off + selectorList .size () );
106+ for ( String str : selectorList ) {
107+ selectors [off ++] = str ;
108+ }
127109 }
128110 }
129111 return selectors ;
130112 }
113+
114+ /**
115+ * Add to the given selector all possible extends to the internal selectorList. This method is call recursive.
116+ *
117+ * @param selector
118+ * current selector
119+ * @param isReference
120+ * if the current rule is in a less file which was import with "reference" keyword
121+ */
122+ private void concatenateExtendsRecursive ( String selector , boolean isReference ) {
123+ List <String []> list = exact .get ( selector );
124+ if ( list != null ) {
125+ for ( String [] lessExtend : list ) {
126+ for ( String sel : lessExtend ) {
127+ boolean needRecursion = selectorList .add ( sel );
128+ if ( needRecursion ) { //only if there are new entries then we need to try a recursion, else we have a stack overflow
129+ concatenateExtendsRecursive ( sel , isReference );
130+ }
131+ }
132+ }
133+ }
134+ SelectorTokenizer tokenizer = new SelectorTokenizer ( selector );
135+ do {
136+ String token = tokenizer .next ();
137+ if ( token == null ) {
138+ break ;
139+ }
140+ List <LessExtendResult > results = all .get ( token );
141+ if ( results != null ) {
142+ for ( LessExtendResult lessExtend : results ) {
143+ for ( String extendingSelector : lessExtend .getExtendingSelectors () ) {
144+ if ( selector .contains ( extendingSelector ) ) {
145+ for ( String replace : lessExtend .getSelectors () ) {
146+ String replacedSelector = selector .replace ( extendingSelector , replace );
147+ boolean needRecursion = selectorList .add ( replacedSelector );
148+ if ( needRecursion && !replacedSelector .contains ( extendingSelector ) ) {
149+ concatenateExtendsRecursive ( replacedSelector , isReference );
150+ }
151+ }
152+ }
153+ }
154+ }
155+ }
156+ } while ( true );
157+ }
131158}
0 commit comments