3232import java .util .ArrayDeque ;
3333import java .util .ArrayList ;
3434import java .util .HashMap ;
35+ import java .util .HashSet ;
3536import java .util .List ;
3637import java .util .StringTokenizer ;
3738
@@ -65,6 +66,8 @@ class LessParser implements FormattableContainer {
6566
6667 private ArrayDeque <Rule > ruleStack = new ArrayDeque <>();
6768
69+ private HashSet <URL > imports = new HashSet <>();
70+
6871 private List <LazyImport > lazyImports ;
6972
7073 /**
@@ -101,7 +104,7 @@ void parse( URL baseURL, Reader input, ReaderFactory readerFactory ) throws Mal
101104 this .baseURL = baseURL ;
102105 this .readerFactory = readerFactory ;
103106 this .relativeURL = new URL ( "file" , null , "" );
104- this .reader = new LessLookAheadReader ( input , null , false );
107+ this .reader = new LessLookAheadReader ( input , null , false , false );
105108 parse ( this );
106109 }
107110
@@ -430,6 +433,7 @@ private void importFile( FormattableContainer currentRule, final String name ) {
430433 boolean isReference = reader .isReference ();
431434 boolean isCss = false ;
432435 boolean isLess = false ;
436+ boolean isMultiple = reader .isMultiple ();
433437 if ( filename .startsWith ( "(" ) ) {
434438 int endIdx = filename .indexOf ( ')' , 1 );
435439 if ( endIdx > 0 ) {
@@ -439,11 +443,15 @@ private void importFile( FormattableContainer currentRule, final String name ) {
439443 String keywordStr = tokenizer .nextToken ().trim ();
440444 switch ( keywordStr ) {
441445 case "inline" :
442- case "once" :
443- case "multiple" :
444446 case "optional" :
445447 System .err .println ( "not implemented @import keyword: " + keywordStr ); //TODO
446448 break ;
449+ case "once" :
450+ isMultiple = false ;
451+ break ;
452+ case "multiple" :
453+ isMultiple = true ;
454+ break ;
447455 case "less" :
448456 isLess = true ;
449457 isCss = false ;
@@ -542,12 +550,14 @@ private void importFile( FormattableContainer currentRule, final String name ) {
542550 baseURL = baseURL == null ? new URL ( filename ) : new URL ( baseURL , filename );
543551 }
544552 relativeURL = new URL ( relativeURL , filename );
545- if ( isReference != reader .isReference () ) {
546- add ( new ReferenceInfo ( isReference ) );
553+ if ( imports .add ( baseURL ) || isMultiple ) {
554+ if ( isReference != reader .isReference () ) {
555+ add ( new ReferenceInfo ( isReference ) );
556+ }
557+ reader = new LessLookAheadReader ( readerFactory .create ( baseURL ), filename , isReference , isMultiple );
558+ parse ( currentRule );
559+ reader .close ();
547560 }
548- reader = new LessLookAheadReader ( readerFactory .create ( baseURL ), filename , isReference );
549- parse ( currentRule );
550- reader .close ();
551561 } catch ( LessException ex ) {
552562 throw ex ;
553563 } catch ( Exception ex ) {
0 commit comments