@@ -27,7 +27,9 @@ export type Validation = {
2727
2828export type Selectors = {
2929 ids : Map < string , CompletionItem > ,
30- classes : Map < string , CompletionItem >
30+ idRanges : Range [ ] ,
31+ classes : Map < string , CompletionItem > ,
32+ classRanges : Range [ ]
3133} ;
3234
3335export class SelectorCompletionItemProvider implements CompletionItemProvider , Disposable {
@@ -38,7 +40,6 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
3840 readonly selectors = new Map < string , Selectors > ( ) ;
3941 readonly collection = languages . createDiagnosticCollection ( ) ;
4042 readonly isRemote = / ^ h t t p s ? : \/ \/ / i;
41- readonly canComplete = / ( i d | c l a s s | c l a s s N a m e ) \s * = \s * ( " | ' ) (?: (? ! \2) .) * $ / si;
4243 readonly findLinkRel = / r e l \s * = \s * ( " | ' ) ( (?: (? ! \1) .) + ) \1/ si;
4344 readonly findLinkHref = / h r e f \s * = \s * ( " | ' ) ( (?: (? ! \1) .) + ) \1/ si;
4445 readonly findExtended = / (?: { { <| { { > | { % \s * e x t e n d s | @ e x t e n d s \s * \( ) \s * ( " | ' ) ? ( [ . / A - Z a - z _ 0 - 9 \\ \- ] + ) \1\s * (?: \) | % } | } } ) / i;
@@ -224,13 +225,15 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
224225
225226 const ids = new Map < string , CompletionItem > ( ) ;
226227 const classes = new Map < string , CompletionItem > ( ) ;
228+ const idRanges : Range [ ] = [ ] ;
229+ const classRanges : Range [ ] = [ ] ;
227230
228231 keys . forEach ( key => this . cache . get ( key ) ?. forEach ( ( v , k ) =>
229232 ( v . kind === CompletionItemKind . Value ? ids : classes ) . set ( k , v ) ) ) ;
230233
231234 const validation = this . getValidation ( uri ) ;
232235 const diagnostics : Diagnostic [ ] = [ ] ;
233- const findAttribute = / ( i d | c l a s s | c l a s s N a m e ) \s * = \s * ( " | ' ) ( .+ ?) \2/ gsi;
236+ const findAttribute = / ( i d | c l a s s | c l a s s N a m e ) \s * = \s * ( " | ' ) ( .* ?) \2/ gsi;
234237
235238 let attribute ;
236239
@@ -239,6 +242,10 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
239242 - attribute [ 3 ] . length
240243 + attribute [ 3 ] . indexOf ( attribute [ 2 ] ) ;
241244
245+ ( attribute [ 1 ] === "id" ? idRanges : classRanges ) . push ( new Range (
246+ document . positionAt ( offset ) ,
247+ document . positionAt ( findAttribute . lastIndex - 1 ) ) ) ;
248+
242249 const findSelector = / ( [ a - z A - Z 0 - 9 _ \- ] + ) (? ! [ ^ ( \[ { ] * [ } \] ) ] ) / gi;
243250
244251 let value ;
@@ -265,7 +272,7 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
265272 }
266273
267274 this . collection . set ( uri , diagnostics ) ;
268- this . selectors . set ( uri . toString ( ) , { ids, classes } ) ;
275+ this . selectors . set ( uri . toString ( ) , { ids, idRanges , classes, classRanges } ) ;
269276 }
270277
271278 provideCompletionItems (
@@ -275,13 +282,20 @@ export class SelectorCompletionItemProvider implements CompletionItemProvider, D
275282 context : CompletionContext )
276283 : ProviderResult < CompletionItem [ ] | CompletionList < CompletionItem > > {
277284
278- const range = new Range ( this . start , position ) ;
279- const text = document . getText ( range ) ;
280- const canComplete = this . canComplete . exec ( text ) ;
281285 const selector = this . selectors . get ( document . uri . toString ( ) ) ;
282286
283- return canComplete && selector
284- ? [ ...( canComplete [ 1 ] === "id" ? selector . ids : selector . classes ) . values ( ) ]
285- : [ ] ;
287+ if ( selector ) {
288+ for ( const range of selector . classRanges ) {
289+ if ( range . contains ( position ) ) {
290+ return [ ...selector . classes . values ( ) ] ;
291+ }
292+ }
293+
294+ for ( const range of selector . idRanges ) {
295+ if ( range . contains ( position ) ) {
296+ return [ ...selector . ids . values ( ) ] ;
297+ }
298+ }
299+ }
286300 }
287301}
0 commit comments