@@ -22,7 +22,11 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
22
22
if ( document . getWordRangeAtPosition ( position , / \$ s y s t e m ( \. \b \w + \b ) ? \. / i) ) {
23
23
return this . system ( document , position , token , context ) ;
24
24
}
25
- return this . entities ( document , position , token , context ) ;
25
+ return (
26
+ this . classes ( document , position , token , context ) ||
27
+ this . entities ( document , position , token , context ) ||
28
+ null
29
+ ) ;
26
30
}
27
31
}
28
32
let completions = (
@@ -54,6 +58,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
54
58
{
55
59
label : '##class()' ,
56
60
insertText : new vscode . SnippetString ( '##class($0)' ) ,
61
+ command : { title : '' , command : 'editor.action.triggerSuggest' } ,
57
62
range
58
63
} ,
59
64
{
@@ -265,59 +270,97 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
265
270
position : vscode . Position ,
266
271
token : vscode . CancellationToken ,
267
272
context : vscode . CompletionContext
268
- ) {
273
+ ) : vscode . ProviderResult < vscode . CompletionItem [ ] | vscode . CompletionList > {
274
+ let curFile = currentFile ( ) ;
269
275
let pattern = / # # c l a s s \( ( [ ^ ) ] * ) \) / i
270
276
let range = document . getWordRangeAtPosition ( position , pattern ) ;
271
277
let text = range ? document . getText ( range ) : '' ;
272
278
let [ , className ] = range ? text . match ( pattern ) : '' ;
273
279
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
280
+ pattern = / ( \b (?: O f | A 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
281
range = document . getWordRangeAtPosition ( position , pattern ) ;
276
282
text = range ? document . getText ( range ) : '' ;
277
283
className = text . split ( ' ' ) . pop ( ) ;
278
284
}
285
+ pattern = / (?: ( E x t e n d s | C o m p i l e A f t e r * = | D e p e n d s O n * = | P r o p e r t y C l a s s * = ) * \( ? * ) ( ( % ? [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * ) * ) ( , * % ? [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * ) * | , * ) * .? ) ? / i
286
+ if ( ( ! range )
287
+ // && (!document.getWordRangeAtPosition(position, /\bExtends\b\s*/i))
288
+ && document . getWordRangeAtPosition ( position , pattern ) ) {
289
+ range = document . getWordRangeAtPosition ( position , / % ? [ a - z A - Z ] [ a - z A - Z 0 - 9 . ] * / ) || new vscode . Range ( position , position ) ;
290
+ text = document . getText ( range ) ;
291
+ className = text . split ( / \s | \( / ) . pop ( ) ;
292
+ }
279
293
if ( range ) {
280
294
let percent = ( className . startsWith ( '%' ) ) ;
281
295
let library = ( percent && className . indexOf ( '.' ) < 0 ) ;
282
296
className = ( className || '' ) ;
283
297
let searchName = className . replace ( / ( ^ % | " ) / , '' ) . toLowerCase ( ) ;
298
+ let part = className . split ( '.' ) . length ;
299
+ let params = [ ] ;
284
300
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
301
+ let sql = '' ;
302
+ /// Classes from the current class's package
303
+ if ( part === 1 && curFile . fileName . endsWith ( 'cls' ) ) {
304
+ let packageName = curFile . name . split ( '.' ) . slice ( 0 , - 2 ) . join ( '.' ) ;
305
+ let className = curFile . name . split ( '.' ) . slice ( 0 , - 1 ) . join ( '.' ) ;
306
+ let part = packageName . split ( '.' ) . length + 1 ;
307
+ sql += `
308
+ SELECT
309
+ DISTINCT
310
+ $Piece(Name, '.', ${ part } ) PartName,
311
+ 0 AsPackage,
312
+ 0 Priority
313
+ FROM %Dictionary.ClassDefinition
314
+ WHERE Hidden=0
315
+ AND Name %STARTSWITH ?
316
+ AND Name <> ?
317
+ AND $Length(Name, '.') = ${ part }
318
+ `
319
+ params . push ( packageName + '.' ) ;
320
+ params . push ( className ) ;
321
+ sql += '\nUNION ALL\n' ;
295
322
}
296
323
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 ;
324
+ sql += `
325
+ SELECT
326
+ DISTINCT
327
+ $Piece(Name, '.', ${ part } ) PartName,
328
+ CASE
329
+ WHEN GREATEST($Length(Name,'.'),${ part } ) > ${ part } THEN 1
330
+ ELSE 0
331
+ END AsPackage,
332
+ 2 Priority
333
+ FROM %Dictionary.ClassDefinition
334
+ WHERE Hidden=0
335
+ AND LOWER(Name) %STARTSWITH ?`
336
+ params . push ( className . toLowerCase ( ) ) ;
337
+
338
+ /// %Library.* classes when entered %*
339
+ if ( library ) {
340
+ sql += `
341
+ UNION ALL
342
+ SELECT
343
+ STRING('%', $PIECE(Name,'.',2)) PartName ,
344
+ 0 AsPackage,
345
+ 1 Priority
346
+ FROM %Dictionary.ClassDefinition
347
+ WHERE Hidden=0
348
+ AND LOWER(Name) %STARTSWITH ?
349
+ `
350
+ params . push ( `%library.${ searchName } ` ) ;
307
351
}
352
+ sql += ' ORDER BY PartName,AsPackage DESC' ;
308
353
309
354
const api = new AtelierAPI ( ) ;
310
- return api . getDocNames ( { category : 'CLS' , filter : className } ) . then ( data => {
355
+ return api . actionQuery ( sql , params ) . then ( data => {
311
356
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
357
. 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 \) / )
358
+ label : el . PartName ,
359
+ sortText : el . Priority + el . PartName + ( el . AsPackage ? '0' : '1' ) ,
360
+ kind : el . AsPackage ? vscode . CompletionItemKind . Folder : vscode . CompletionItemKind . Class ,
361
+ insertText : new vscode . SnippetString ( el . PartName + ( el . AsPackage ? '.' : '' ) ) ,
362
+ command : el . AsPackage ? { title : '' , command : 'editor.action.triggerSuggest' } : null ,
363
+ range : document . getWordRangeAtPosition ( position , / % ? \b [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * \b / )
321
364
} ) ) ;
322
365
} ) ;
323
366
}
@@ -345,7 +388,9 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
345
388
. filter ( onlyUnique )
346
389
. map ( el => ( {
347
390
label : el ,
348
- kind : vscode . CompletionItemKind . Class
391
+ kind : vscode . CompletionItemKind . Class ,
392
+ insertText : el + '.' ,
393
+ command : { title : '' , command : 'editor.action.triggerSuggest' }
349
394
} ) ) ;
350
395
} ) ;
351
396
} else {
0 commit comments