Skip to content

Commit fe23b6e

Browse files
committed
##class, as, extends completions for classes
1 parent 64a3a97 commit fe23b6e

File tree

1 file changed

+71
-4
lines changed

1 file changed

+71
-4
lines changed

providers/ObjectScriptCompletionItemProvider.ts

Lines changed: 71 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,17 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
2525
return this.entities(document, position, token, context);
2626
}
2727
}
28-
return (
28+
let completions = (
29+
this.classes(document, position, token, context) ||
2930
this.dollarsComplete(document, position) ||
3031
this.commands(document, position) ||
3132
this.entities(document, position, token, context) ||
3233
this.macro(document, position, token, context) ||
3334
this.constants(document, position, token, context) ||
34-
this.system(document, position, token, context)
35+
null
3536
);
37+
38+
return completions;
3639
}
3740

3841
macro(
@@ -257,6 +260,71 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
257260
return null;
258261
}
259262

263+
classes(
264+
document: vscode.TextDocument,
265+
position: vscode.Position,
266+
token: vscode.CancellationToken,
267+
context: vscode.CompletionContext
268+
) {
269+
let pattern = /##class\(([^)]*)\)/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(?:Of|As|Extends)\b (%?\b[a-zA-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*\b)(?! of))/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-zA-Z][a-zA-Z0-9]+(?:\.[a-zA-Z][a-zA-Z0-9]+)*\b\)/)
321+
}));
322+
});
323+
}
324+
325+
return null;
326+
}
327+
260328
system(
261329
document: vscode.TextDocument,
262330
position: vscode.Position,
@@ -265,7 +333,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
265333
) {
266334
let range = document.getWordRangeAtPosition(position, /\$system(\.\b\w+\b)?(\.\b\w+\b)?\./i);
267335
let text = range ? document.getText(range) : '';
268-
let [, className, method] = text.match(/\$system(\.\b\w+\b)?(\.\b\w+\b)?\./i);
336+
let [, className] = text.match(/\$system(\.\b\w+\b)?(\.\b\w+\b)?\./i);
269337

270338
const api = new AtelierAPI();
271339
if (!className) {
@@ -293,6 +361,5 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
293361
}));
294362
});
295363
}
296-
return null;
297364
}
298365
}

0 commit comments

Comments
 (0)