@@ -29,9 +29,9 @@ export class ClassCompletionItemProvider implements CompletionItemProvider {
2929 remoteStyleSheets : string [ ] = [ ] ;
3030
3131 parseTextToItems ( text : string , items : Map < string , CompletionItem > ) {
32- walk ( parse ( text ) , ( node ) => {
33- if ( node . type === "ClassSelector" ) {
34- items . set ( node . name , new CompletionItem ( node . name , CompletionItemKind . EnumMember ) ) ;
32+ walk ( parse ( text ) , v => {
33+ if ( v . type === "ClassSelector" ) {
34+ items . set ( v . name , new CompletionItem ( v . name , CompletionItemKind . EnumMember ) ) ;
3535 }
3636 } ) ;
3737 }
@@ -41,28 +41,27 @@ export class ClassCompletionItemProvider implements CompletionItemProvider {
4141
4242 if ( key === NONE ) {
4343 resolve ( NONE ) ;
44- return ;
45- }
46-
47- const items = this . cache . get ( key ) ;
48-
49- if ( items ) {
50- resolve ( key ) ;
5144 } else {
52- const items = new Map < string , CompletionItem > ( ) ;
53-
54- fetch ( key ) . then ( res => {
55- if ( res . ok ) {
56- res . text ( ) . then ( text => {
57- this . parseTextToItems ( text , items ) ;
45+ const items = this . cache . get ( key ) ;
46+
47+ if ( items ) {
48+ resolve ( key ) ;
49+ } else {
50+ const items = new Map < string , CompletionItem > ( ) ;
51+
52+ fetch ( key ) . then ( res => {
53+ if ( res . ok ) {
54+ res . text ( ) . then ( text => {
55+ this . parseTextToItems ( text , items ) ;
56+ this . cache . set ( key , items ) ;
57+ resolve ( key ) ;
58+ } , ( ) => resolve ( NONE ) ) ;
59+ } else {
5860 this . cache . set ( key , items ) ;
5961 resolve ( key ) ;
60- } , ( ) => resolve ( NONE ) ) ;
61- } else {
62- this . cache . set ( key , items ) ;
63- resolve ( key ) ;
64- }
65- } , ( ) => resolve ( NONE ) ) ;
62+ }
63+ } , ( ) => resolve ( NONE ) ) ;
64+ }
6665 }
6766 } ) ;
6867 }
@@ -82,8 +81,7 @@ export class ClassCompletionItemProvider implements CompletionItemProvider {
8281 const href = this . findLinkHref . exec ( link [ 1 ] ) ;
8382
8483 if ( href && href [ 2 ] . startsWith ( "http" ) ) {
85- promises . push ( this . fetchRemoteStyleSheet ( href [ 2 ] )
86- . then ( key => keys . add ( key ) ) ) ;
84+ promises . push ( this . fetchRemoteStyleSheet ( href [ 2 ] ) . then ( k => keys . add ( k ) ) ) ;
8785 }
8886 }
8987 }
@@ -97,9 +95,8 @@ export class ClassCompletionItemProvider implements CompletionItemProvider {
9795 const keys = new Set < string > ( ) ;
9896 const promises = [ ] ;
9997
100- for ( let i = 0 ; i < this . remoteStyleSheets . length ; i ++ ) {
101- promises . push ( this . fetchRemoteStyleSheet ( this . remoteStyleSheets [ i ] )
102- . then ( key => keys . add ( key ) ) ) ;
98+ for ( const sheet of this . remoteStyleSheets ) {
99+ promises . push ( this . fetchRemoteStyleSheet ( sheet ) . then ( k => keys . add ( k ) ) ) ;
103100 }
104101
105102 Promise . all ( promises ) . then ( ( ) => resolve ( keys ) ) ;
@@ -119,33 +116,37 @@ export class ClassCompletionItemProvider implements CompletionItemProvider {
119116 return items ;
120117 }
121118
119+ buildItems ( items : Map < string , CompletionItem > , ...sets : Set < string > [ ] ) : CompletionItem [ ] {
120+ const keys = new Set < string > ( ) ;
121+ sets . forEach ( v => v . forEach ( v => keys . add ( v ) ) ) ;
122+ keys . forEach ( k => this . cache . get ( k ) ?. forEach ( ( v , k ) => items . set ( k , v ) ) ) ;
123+
124+ return [ ...items . values ( ) ] ;
125+ }
126+
122127 provideCompletionItems (
123128 document : TextDocument ,
124129 position : Position ,
125130 token : CancellationToken ,
126- context : CompletionContext )
127- : ProviderResult < CompletionItem [ ] | CompletionList < CompletionItem > > {
131+ context : CompletionContext ) : ProviderResult < CompletionItem [ ] | CompletionList < CompletionItem > > {
128132
129133 return new Promise ( ( resolve , reject ) => {
130- const range = new Range ( this . start , position ) ;
131- const text = document . getText ( range ) ;
132- const canComplete = this . canComplete . test ( text ) ;
133-
134- if ( canComplete ) {
135- const items = this . findDocumentStyles ( text ) ;
136-
137- this . findRemoteStyles ( ) . then ( styles => {
138- this . findDocumentLinks ( text ) . then ( links => {
139- links . forEach ( key => styles . add ( key ) ) ;
140-
141- styles . forEach ( key => this . cache . get ( key )
142- ?. forEach ( ( value , name ) => items . set ( name , value ) ) ) ;
143-
144- resolve ( [ ...items . values ( ) ] ) ;
145- } ) ;
146- } ) ;
147- } else {
134+ if ( token . isCancellationRequested ) {
148135 reject ( ) ;
136+ } else {
137+ const range = new Range ( this . start , position ) ;
138+ const text = document . getText ( range ) ;
139+ const canComplete = this . canComplete . test ( text ) ;
140+
141+ if ( canComplete ) {
142+ const items = this . findDocumentStyles ( text ) ;
143+
144+ this . findRemoteStyles ( ) . then ( styles =>
145+ this . findDocumentLinks ( text ) . then ( links =>
146+ resolve ( this . buildItems ( items , styles , links ) ) ) ) ;
147+ } else {
148+ reject ( ) ;
149+ }
149150 }
150151 } ) ;
151152 }
0 commit comments