@@ -25,14 +25,17 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
25
25
return this . entities ( document , position , token , context ) ;
26
26
}
27
27
}
28
- return (
28
+ let completions = (
29
+ this . classes ( document , position , token , context ) ||
29
30
this . dollarsComplete ( document , position ) ||
30
31
this . commands ( document , position ) ||
31
32
this . entities ( document , position , token , context ) ||
32
33
this . macro ( document , position , token , context ) ||
33
34
this . constants ( document , position , token , context ) ||
34
- this . system ( document , position , token , context )
35
+ null
35
36
) ;
37
+
38
+ return completions ;
36
39
}
37
40
38
41
macro (
@@ -257,6 +260,71 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
257
260
return null ;
258
261
}
259
262
263
+ classes (
264
+ document : vscode . TextDocument ,
265
+ position : vscode . Position ,
266
+ token : vscode . CancellationToken ,
267
+ context : vscode . CompletionContext
268
+ ) {
269
+ let pattern = / # # c l a s s \( ( [ ^ ) ] * ) \) / i
270
+ let range = document . getWordRangeAtPosition ( position , pattern ) ;
271
+ let text = range ? document . getText ( range ) : '' ;
272
+ let [ , className ] = range ? text . match ( pattern ) : '' ;
273
+ if ( ! range ) {
274
+ let pattern = / ( \b (?: O f | A s | E x t e n d s ) \b ( % ? \b [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + ) * \b ) (? ! o f ) ) / i
275
+ range = document . getWordRangeAtPosition ( position , pattern ) ;
276
+ text = range ? document . getText ( range ) : '' ;
277
+ className = text . split ( ' ' ) . pop ( ) ;
278
+ }
279
+ if ( range ) {
280
+ let percent = ( className . startsWith ( '%' ) ) ;
281
+ let library = ( percent && className . indexOf ( '.' ) < 0 ) ;
282
+ className = ( className || '' ) ;
283
+ let searchName = className . replace ( / ( ^ % | " ) / , '' ) . toLowerCase ( ) ;
284
+
285
+ const filterClass = ( name ) => {
286
+ let ok = false
287
+ if ( percent ) {
288
+ if ( library ) {
289
+ ok = ok || name . startsWith ( '%library.' + searchName ) ;
290
+ }
291
+ ok = ok || name . startsWith ( '%' + searchName ) ;
292
+ }
293
+ ok = ok || name . startsWith ( searchName ) ;
294
+ return ok
295
+ }
296
+
297
+ const insertText = ( name ) => {
298
+ if ( className . indexOf ( '.' ) < 0 ) {
299
+ return name ;
300
+ }
301
+ let pos = className . lastIndexOf ( '.' )
302
+ let part = className . substr ( 0 , pos ) ;
303
+ if ( name . indexOf ( part ) == 0 ) {
304
+ return name . substr ( pos + 1 ) ;
305
+ }
306
+ return name ;
307
+ }
308
+
309
+ const api = new AtelierAPI ( ) ;
310
+ return api . getDocNames ( { category : 'CLS' , filter : className } ) . then ( data => {
311
+ return data . result . content
312
+ . map ( el => el . name )
313
+ . filter ( el => filterClass ( el . toLowerCase ( ) ) )
314
+ . map ( el => el . split ( '.' ) . slice ( 0 , - 1 ) . join ( '.' ) )
315
+ . filter ( onlyUnique )
316
+ . map ( el => ( {
317
+ label : el ,
318
+ kind : vscode . CompletionItemKind . Class ,
319
+ insertText : new vscode . SnippetString ( insertText ( el ) ) ,
320
+ range : document . getWordRangeAtPosition ( position , / \( % ? \b [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + ) * \b \) / )
321
+ } ) ) ;
322
+ } ) ;
323
+ }
324
+
325
+ return null ;
326
+ }
327
+
260
328
system (
261
329
document : vscode . TextDocument ,
262
330
position : vscode . Position ,
@@ -265,7 +333,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
265
333
) {
266
334
let range = document . getWordRangeAtPosition ( position , / \$ s y s t e m ( \. \b \w + \b ) ? ( \. \b \w + \b ) ? \. / i) ;
267
335
let text = range ? document . getText ( range ) : '' ;
268
- let [ , className , method ] = text . match ( / \$ s y s t e m ( \. \b \w + \b ) ? ( \. \b \w + \b ) ? \. / i) ;
336
+ let [ , className ] = text . match ( / \$ s y s t e m ( \. \b \w + \b ) ? ( \. \b \w + \b ) ? \. / i) ;
269
337
270
338
const api = new AtelierAPI ( ) ;
271
339
if ( ! className ) {
@@ -293,6 +361,5 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
293
361
} ) ) ;
294
362
} ) ;
295
363
}
296
- return null ;
297
364
}
298
365
}
0 commit comments