Skip to content

Commit d0f9b55

Browse files
committed
DependsOn,CompileAfter,PropertyClass,##class,extends,As
Complex suggestion package by package, and class
1 parent fe23b6e commit d0f9b55

File tree

2 files changed

+80
-33
lines changed

2 files changed

+80
-33
lines changed

Diff for: CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
- added export setting "objectscript.export.addCategory" if enabled uses previous behavior, adds category folder to export folder, disabled by default
66
- added Server actions menu, by clicking on server info from status bar. Open Management portal, Class Reference and toggle connection.
7+
- Class Suggestion in ##class, Extends, As, CompileAfter, DependsOn, PropertyClass
8+
- \$SYSTEM suggestion by Classes from %SYSTEM
79

810
## [0.7.10]
911

Diff for: providers/ObjectScriptCompletionItemProvider.ts

+78-33
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
2222
if (document.getWordRangeAtPosition(position, /\$system(\.\b\w+\b)?\./i)) {
2323
return this.system(document, position, token, context);
2424
}
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+
);
2630
}
2731
}
2832
let completions = (
@@ -54,6 +58,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
5458
{
5559
label: '##class()',
5660
insertText: new vscode.SnippetString('##class($0)'),
61+
command: { title: '', command: 'editor.action.triggerSuggest' },
5762
range
5863
},
5964
{
@@ -265,59 +270,97 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
265270
position: vscode.Position,
266271
token: vscode.CancellationToken,
267272
context: vscode.CompletionContext
268-
) {
273+
): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
274+
let curFile = currentFile();
269275
let pattern = /##class\(([^)]*)\)/i
270276
let range = document.getWordRangeAtPosition(position, pattern);
271277
let text = range ? document.getText(range) : '';
272278
let [, className] = range ? text.match(pattern) : '';
273279
if (!range) {
274-
let pattern = /(\b(?:Of|As|Extends)\b (%?\b[a-zA-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*\b)(?! of))/i
280+
pattern = /(\b(?:Of|As)\b (%?\b[a-zA-Z][a-zA-Z0-9]*(?:\.[a-zA-Z][a-zA-Z0-9]+)*\b\.?)?(?! of))/i
275281
range = document.getWordRangeAtPosition(position, pattern);
276282
text = range ? document.getText(range) : '';
277283
className = text.split(' ').pop();
278284
}
285+
pattern = /(?:(Extends |CompileAfter *=|DependsOn *=|PropertyClass *=) *\(? *)((%?[a-zA-Z][a-zA-Z0-9]*(?:\.[a-zA-Z][a-zA-Z0-9]*)*)(, *%?[a-zA-Z][a-zA-Z0-9]*(?:\.[a-zA-Z][a-zA-Z0-9]*)*|, *)*.?)?/i
286+
if ((!range)
287+
// && (!document.getWordRangeAtPosition(position, /\bExtends\b\s*/i))
288+
&& document.getWordRangeAtPosition(position, pattern)) {
289+
range = document.getWordRangeAtPosition(position, /%?[a-zA-Z][a-zA-Z0-9.]*/) || new vscode.Range(position, position);
290+
text = document.getText(range);
291+
className = text.split(/\s|\(/).pop();
292+
}
279293
if (range) {
280294
let percent = (className.startsWith('%'));
281295
let library = (percent && className.indexOf('.') < 0);
282296
className = (className || '');
283297
let searchName = className.replace(/(^%|")/, '').toLowerCase();
298+
let part = className.split('.').length;
299+
let params = [];
284300

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';
295322
}
296323

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}`);
307351
}
352+
sql += ' ORDER BY PartName,AsPackage DESC';
308353

309354
const api = new AtelierAPI();
310-
return api.getDocNames({ category: 'CLS', filter: className }).then(data => {
355+
return api.actionQuery(sql, params).then(data => {
311356
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)
316357
.map(el => ({
317-
label: el,
318-
kind: vscode.CompletionItemKind.Class,
319-
insertText: new vscode.SnippetString(insertText(el)),
320-
range: document.getWordRangeAtPosition(position, /\(%?\b[a-zA-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-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-zA-Z][a-zA-Z0-9]*\b/)
321364
}));
322365
});
323366
}
@@ -345,7 +388,9 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
345388
.filter(onlyUnique)
346389
.map(el => ({
347390
label: el,
348-
kind: vscode.CompletionItemKind.Class
391+
kind: vscode.CompletionItemKind.Class,
392+
insertText: el + '.',
393+
command: { title: '', command: 'editor.action.triggerSuggest' }
349394
}));
350395
});
351396
} else {

0 commit comments

Comments
 (0)