Skip to content

Commit 791f351

Browse files
committed
new code formatter
1 parent f64223a commit 791f351

7 files changed

+141
-49
lines changed

CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
# Change Log
22

3-
## [0.7.6]
3+
## [0.7.7]
44

55
- Completion for ObjectScript Commands
6+
- Hover documentation for ObjectScript commands
7+
- Text formatter for ObjectScript commands
68

79
## [0.7.4]
810

extension.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { ObjectScriptFoldingRangeProvider } from './providers/ObjectScriptFoldin
1414
import { ObjectScriptDefinitionProvider } from './providers/ObjectScriptDefinitionProvider';
1515
import { ObjectScriptCompletionItemProvider } from './providers/ObjectScriptCompletionItemProvider';
1616
import { ObjectScriptHoverProvider } from './providers/ObjectScriptHoverProvider';
17+
import { DocumentFormattingEditProvider } from './providers/DocumentFormattingEditProvider';
1718

1819
import { ObjectScriptExplorerProvider } from './explorer/explorer';
1920
import { outputChannel } from './utils';
@@ -95,11 +96,16 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
9596
new ObjectScriptCompletionItemProvider(),
9697
'$',
9798
'^',
98-
'.'
99+
'.',
100+
'#'
99101
),
100102
vscode.languages.registerHoverProvider(
101103
['objectscript-class', 'objectscript', 'objectscript-macros'],
102104
new ObjectScriptHoverProvider()
105+
),
106+
vscode.languages.registerDocumentFormattingEditProvider(
107+
['objectscript-class', 'objectscript', 'objectscript-macros'],
108+
new DocumentFormattingEditProvider()
103109
)
104110
);
105111
}

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "vscode-objectscript",
33
"displayName": "InterSystems ObjectScript",
44
"description": "InterSystems ObjectScript language support for Visual Studio Code",
5-
"version": "0.7.6",
5+
"version": "0.7.7",
66
"icon": "images/logo.png",
77
"categories": [
88
"Programming Languages",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import * as vscode from 'vscode';
2+
3+
import commands = require('./completion/commands.json');
4+
5+
export class DocumentFormattingEditProvider implements vscode.DocumentFormattingEditProvider {
6+
provideDocumentFormattingEdits(
7+
document: vscode.TextDocument,
8+
options: vscode.FormattingOptions,
9+
token: vscode.CancellationToken
10+
): vscode.ProviderResult<vscode.TextEdit[]> {
11+
let edits = [];
12+
13+
for (var i = 0; i < document.lineCount; i++) {
14+
var line = document.lineAt(i);
15+
16+
let commandsMatch = line.text.match(/^\s+(?:}\s)?\b([a-z]+)\b/i);
17+
if (commandsMatch) {
18+
let [, found] = commandsMatch;
19+
found = found;
20+
let pos = line.text.indexOf(found);
21+
let command = commands.find(el => el.alias.includes(found.toUpperCase()));
22+
if (command.label !== found) {
23+
let range = new vscode.Range(new vscode.Position(i, pos), new vscode.Position(i, pos + found.length));
24+
edits.push({
25+
range,
26+
newText: command.label
27+
});
28+
}
29+
}
30+
}
31+
32+
return edits;
33+
}
34+
}

providers/ObjectScriptCompletionItemProvider.ts

+37-10
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,37 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
1212
token: vscode.CancellationToken,
1313
context: vscode.CompletionContext
1414
): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
15-
return this.dollarsComplete(document, position) || this.commands(document, position);
15+
if (context.triggerCharacter === '#') return this.macro(document, position, token, context);
16+
return (
17+
this.dollarsComplete(document, position) ||
18+
this.commands(document, position) ||
19+
this.macro(document, position, token, context)
20+
);
21+
}
22+
23+
macro(
24+
document: vscode.TextDocument,
25+
position: vscode.Position,
26+
token: vscode.CancellationToken,
27+
context: vscode.CompletionContext
28+
): vscode.ProviderResult<vscode.CompletionItem[] | vscode.CompletionList> {
29+
let line = document.getText(new vscode.Range(new vscode.Position(position.line, 0), position));
30+
let range = new vscode.Range(new vscode.Position(position.line, line.indexOf('#')), position);
31+
if (!context.triggerCharacter && !line.match(/#+\b\w+\b$/)) {
32+
return null;
33+
}
34+
return [
35+
{
36+
label: '##class()',
37+
insertText: new vscode.SnippetString('##class($0)'),
38+
range
39+
},
40+
{
41+
label: '##super()',
42+
insertText: new vscode.SnippetString('##super($0)'),
43+
range
44+
}
45+
];
1646
}
1747

1848
commands(
@@ -24,7 +54,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
2454
new vscode.Range(new vscode.Position(word.start.line, 0), new vscode.Position(word.end.line, word.end.character))
2555
);
2656

27-
if (line.match(/\s+\b[a-z]+\b/i)) {
57+
if (line.match(/^\s+\b[a-z]+\b$/i)) {
2858
let search = line.trim().toUpperCase();
2959
let items = commands
3060
.filter(el => el.label.startsWith(search) || el.alias.findIndex(el2 => el2.startsWith(search)) >= 0)
@@ -33,7 +63,7 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
3363
kind: vscode.CompletionItemKind.Keyword,
3464
preselect: el.alias.includes(search),
3565
documentation: new vscode.MarkdownString(el.documentation.join('')),
36-
insertText: el.insertText ? new vscode.SnippetString(el.insertText) : el.label
66+
insertText: new vscode.SnippetString(el.insertText || `${el.label} $0`)
3767
}));
3868
return {
3969
isIncomplete: items.length > 0,
@@ -60,12 +90,9 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
6090
if (dollars === '$') {
6191
let range = new vscode.Range(
6292
new vscode.Position(word.start.line, word.start.character - 1),
63-
new vscode.Position(word.end.line, word.end.character + (textAfter.startsWith('(') ? 1 : 0))
93+
new vscode.Position(word.end.line, word.end.character)
6494
);
65-
let items = [
66-
...this.listSystemFunctions(search, textAfter.startsWith('(')),
67-
...this.listSystemVariables(search)
68-
];
95+
let items = [...this.listSystemFunctions(search, textAfter.length > 0), ...this.listSystemVariables(search)];
6996
return {
7097
isIncomplete: items.length > 1,
7198
items: items.map(el => {
@@ -78,9 +105,9 @@ export class ObjectScriptCompletionItemProvider implements vscode.CompletionItem
78105
} else if (dollars === '^$') {
79106
let range = new vscode.Range(
80107
new vscode.Position(word.start.line, word.start.character - 2),
81-
new vscode.Position(word.end.line, word.end.character + (textAfter.startsWith('(') ? 1 : 0))
108+
new vscode.Position(word.end.line, word.end.character)
82109
);
83-
return this.listStructuredSystemVariables(search, textAfter.startsWith('(')).map(el => {
110+
return this.listStructuredSystemVariables(search, textAfter.length > 0).map(el => {
84111
return {
85112
...el,
86113
range

providers/ObjectScriptHoverProvider.ts

+23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as vscode from 'vscode';
22

3+
import commands = require('./completion/commands.json');
34
import systemFunctions = require('./completion/systemFunctions.json');
45
import systemVariables = require('./completion/systemVariables.json');
56
import structuredSystemVariables = require('./completion/structuredSystemVariables.json');
@@ -10,6 +11,10 @@ export class ObjectScriptHoverProvider implements vscode.HoverProvider {
1011
position: vscode.Position,
1112
token: vscode.CancellationToken
1213
): vscode.ProviderResult<vscode.Hover> {
14+
return this.dollars(document, position) || this.commands(document, position);
15+
}
16+
17+
dollars(document: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.Hover> {
1318
let word = document.getWordRangeAtPosition(position);
1419
let text = document.getText(
1520
new vscode.Range(new vscode.Position(position.line, 0), new vscode.Position(position.line, word.end.character))
@@ -38,6 +43,24 @@ export class ObjectScriptHoverProvider implements vscode.HoverProvider {
3843
return null;
3944
}
4045

46+
commands(document: vscode.TextDocument, position: vscode.Position): vscode.ProviderResult<vscode.Hover> {
47+
let word = document.getWordRangeAtPosition(position);
48+
let text = document.getText(
49+
new vscode.Range(new vscode.Position(position.line, 0), new vscode.Position(position.line, word.end.character))
50+
);
51+
let commandMatch = text.match(/^\s+\b[a-z]+\b$/i);
52+
if (commandMatch) {
53+
let search = text.trim().toUpperCase();
54+
let command = commands.find(el => el.label === search || el.alias.includes(search));
55+
if (search) {
56+
return {
57+
range: word,
58+
contents: [command.documentation.join(''), this.documentationLink(command.link)]
59+
};
60+
}
61+
}
62+
}
63+
4164
documentationLink(link): string | null {
4265
if (link) {
4366
return `[Online documenation](https://docs.intersystems.com/irislatest${link})`;

0 commit comments

Comments
 (0)