Skip to content

Commit 2682506

Browse files
Merge pull request #360 from intersystems-community/ls-support
initial support for working together with language-server
2 parents f127027 + ca28ccd commit 2682506

File tree

1 file changed

+69
-31
lines changed

1 file changed

+69
-31
lines changed

src/extension.ts

Lines changed: 69 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ const packageJson = vscode.extensions.getExtension(extensionId).packageJSON;
9999
const extensionVersion = packageJson.version;
100100
const aiKey = packageJson.aiKey;
101101

102+
const _onDidChangeConnection = new vscode.EventEmitter<void>();
103+
102104
export const config = (setting?: string, workspaceFolderName?: string): vscode.WorkspaceConfiguration | any => {
103105
workspaceFolderName = workspaceFolderName || currentWorkspaceFolder();
104106
if (
@@ -192,6 +194,7 @@ export async function checkConnection(clearCookies = false, uri?: vscode.Uri): P
192194
workspaceState.update(configName + ":password", undefined);
193195
workspaceState.update(configName + ":apiVersion", undefined);
194196
workspaceState.update(configName + ":docker", undefined);
197+
_onDidChangeConnection.fire();
195198
}
196199
let api = new AtelierAPI(apiTarget, false);
197200
const { active, host = "", port = 0, ns = "" } = api.config;
@@ -224,6 +227,7 @@ export async function checkConnection(clearCookies = false, uri?: vscode.Uri): P
224227
workspaceState.update(configName + ":port", dockerPort);
225228
}
226229
connInfo = `localhost:${dockerPort}[${ns}]`;
230+
_onDidChangeConnection.fire();
227231
}
228232
} catch (error) {
229233
outputChannel.appendError(error);
@@ -279,6 +283,7 @@ export async function checkConnection(clearCookies = false, uri?: vscode.Uri): P
279283
async (password) => {
280284
if (password) {
281285
workspaceState.update(configName + ":password", password);
286+
_onDidChangeConnection.fire();
282287
await checkConnection(false, uri);
283288
} else if (!api.externalServer) {
284289
disableConnection(configName);
@@ -365,6 +370,13 @@ async function serverManager(): Promise<any> {
365370
}
366371
}
367372

373+
function languageServer(): vscode.Extension<any> {
374+
const extId = "intersystems.language-server";
375+
const extension = vscode.extensions.getExtension(extId);
376+
377+
return extension;
378+
}
379+
368380
export async function activate(context: vscode.ExtensionContext): Promise<any> {
369381
if (!packageJson.version.includes("SNAPSHOT")) {
370382
try {
@@ -500,9 +512,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
500512
["file", ...schemas].reduce((acc, scheme) => acc.concat(list.map((language) => ({ scheme, language }))), []);
501513

502514
const diagnosticProvider = new ObjectScriptDiagnosticProvider();
503-
if (vscode.window.activeTextEditor) {
504-
diagnosticProvider.updateDiagnostics(vscode.window.activeTextEditor.document);
505-
}
506515

507516
// Gather the proposed APIs we will register to use when building with enableProposedApi = true
508517
const proposed = [
@@ -525,10 +534,63 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
525534
outputChannel.show(true);
526535
}
527536

537+
const languageServerExt = languageServer();
538+
const noLSsubscriptions: { dispose(): any }[] = [];
539+
if (!languageServerExt) {
540+
outputChannel.appendLine(`The language-server extension was not found.\n`);
541+
outputChannel.show(true);
542+
543+
if (vscode.window.activeTextEditor) {
544+
diagnosticProvider.updateDiagnostics(vscode.window.activeTextEditor.document);
545+
}
546+
noLSsubscriptions.push(
547+
workspace.onDidChangeTextDocument((event) => {
548+
diagnosticProvider.updateDiagnostics(event.document);
549+
}),
550+
window.onDidChangeActiveTextEditor(async (editor) => {
551+
if (editor) {
552+
diagnosticProvider.updateDiagnostics(editor.document);
553+
}
554+
}),
555+
vscode.languages.registerHoverProvider(
556+
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
557+
new ObjectScriptHoverProvider()
558+
),
559+
vscode.languages.registerDocumentFormattingEditProvider(
560+
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
561+
new DocumentFormattingEditProvider()
562+
),
563+
vscode.languages.registerDocumentRangeFormattingEditProvider(
564+
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
565+
new DocumentRangeFormattingEditProvider()
566+
),
567+
vscode.languages.registerDefinitionProvider(
568+
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
569+
new ObjectScriptDefinitionProvider()
570+
),
571+
vscode.languages.registerCompletionItemProvider(
572+
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
573+
new ObjectScriptCompletionItemProvider(),
574+
"$",
575+
"^",
576+
".",
577+
"#"
578+
)
579+
);
580+
context.subscriptions.push(...noLSsubscriptions);
581+
}
582+
528583
context.subscriptions.push(
529584
reporter,
585+
vscode.extensions.onDidChange(() => {
586+
const languageServerExt2 = languageServer();
587+
if (typeof languageServerExt !== typeof languageServerExt2) {
588+
noLSsubscriptions.forEach((event) => {
589+
event.dispose();
590+
});
591+
}
592+
}),
530593
workspace.onDidChangeTextDocument((event) => {
531-
diagnosticProvider.updateDiagnostics(event.document);
532594
if (
533595
event.contentChanges.length !== 0 &&
534596
event.document.uri.scheme === FILESYSTEM_SCHEMA &&
@@ -541,9 +603,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
541603
}
542604
}),
543605
window.onDidChangeActiveTextEditor(async (editor) => {
544-
if (editor) {
545-
diagnosticProvider.updateDiagnostics(editor.document);
546-
}
547606
if (workspace.workspaceFolders && workspace.workspaceFolders.length > 1) {
548607
const workspaceFolder = currentWorkspaceFolder();
549608
if (workspaceFolder && workspaceFolder !== workspaceState.get<string>("workspaceFolder")) {
@@ -715,30 +774,6 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
715774
documentSelector("objectscript"),
716775
new ObjectScriptFoldingRangeProvider()
717776
),
718-
vscode.languages.registerDefinitionProvider(
719-
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
720-
new ObjectScriptDefinitionProvider()
721-
),
722-
vscode.languages.registerCompletionItemProvider(
723-
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
724-
new ObjectScriptCompletionItemProvider(),
725-
"$",
726-
"^",
727-
".",
728-
"#"
729-
),
730-
vscode.languages.registerHoverProvider(
731-
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
732-
new ObjectScriptHoverProvider()
733-
),
734-
vscode.languages.registerDocumentFormattingEditProvider(
735-
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
736-
new DocumentFormattingEditProvider()
737-
),
738-
vscode.languages.registerDocumentRangeFormattingEditProvider(
739-
documentSelector("objectscript-class", "objectscript", "objectscript-macros"),
740-
new DocumentRangeFormattingEditProvider()
741-
),
742777
vscode.languages.registerWorkspaceSymbolProvider(new WorkspaceSymbolProvider()),
743778
vscode.debug.registerDebugConfigurationProvider("objectscript", new ObjectScriptConfigurationProvider()),
744779
vscode.debug.registerDebugAdapterDescriptorFactory("objectscript", debugAdapterFactory),
@@ -802,6 +837,9 @@ export async function activate(context: vscode.ExtensionContext): Promise<any> {
802837
}
803838
return uri;
804839
},
840+
onDidChangeConnection(): vscode.Event<void> {
841+
return _onDidChangeConnection.event;
842+
},
805843
};
806844

807845
// 'export' our public API

0 commit comments

Comments
 (0)