This repository was archived by the owner on Mar 26, 2026. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 25
Expand file tree
/
Copy pathlanguageClientManager.ts
More file actions
144 lines (126 loc) · 4.96 KB
/
languageClientManager.ts
File metadata and controls
144 lines (126 loc) · 4.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
import { ILEObject, ImpactedObject } from "@ibm/sourceorbit/dist/src/targets";
import * as path from 'path';
import { ExtensionContext, Uri, WorkspaceFolder } from 'vscode';
import { LanguageClient, LanguageClientOptions, ServerOptions, TransportKind } from 'vscode-languageclient/node';
export class LanguageClientManager {
private static client: LanguageClient;
public static async getLanguageClient(context?: ExtensionContext): Promise<LanguageClient> {
if (!LanguageClientManager.client) {
const serverModule = context!.asAbsolutePath(
path.join('out', 'server.js')
);
const debugOptions = { execArgv: ['--nolazy', '--inspect=8720'] };
// If the extension is launched in debug mode then the debug server options are used, otherwise the run options are used
const serverOptions: ServerOptions = {
run: { module: serverModule, transport: TransportKind.ipc },
debug: {
module: serverModule,
transport: TransportKind.ipc,
options: debugOptions
}
};
// Options to control the language client
const clientOptions: LanguageClientOptions = {
documentSelector: [
{ scheme: 'file', language: 'rpgle' },
{ scheme: 'file', language: 'bnd' },
{ scheme: 'file', language: 'cl' },
{ scheme: 'file', language: 'dds.pf' },
{ scheme: 'file', language: 'dds.lf' },
{ scheme: 'file', language: 'dds.dspf' },
{ scheme: 'file', language: 'dds.prtf' },
{ scheme: 'file', language: 'sql' },
],
};
// Create the language client and start the client.
LanguageClientManager.client = new LanguageClient(
'source-orbit-server',
'Source Orbit Server',
serverOptions,
clientOptions
);
// Start the client which will also start the server
try {
await LanguageClientManager.client.start();
} catch (error) {
console.log(error);
}
}
return LanguageClientManager.client;
}
public static stop(): Promise<void> | undefined {
if (LanguageClientManager.client) {
return LanguageClientManager.client.stop();
}
}
public static async isReady(workspaceFolder: WorkspaceFolder): Promise<boolean> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<boolean>(`isReady`, [workspaceFolder.uri.toString()]);
} else {
return false;
}
}
public static async getResolvedObjects(workspaceFolder: WorkspaceFolder): Promise<ILEObject[]> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<ILEObject[]>(`getResolvedObjects`, [workspaceFolder.uri.toString()]);
} else {
return [];
}
}
public static async resolvePathToObject(workspaceFolder: WorkspaceFolder, localPath: string): Promise<ILEObject | undefined> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<ILEObject | undefined>(`resolvePathToObject`, [workspaceFolder.uri.toString(), localPath]);
} else {
return undefined;
}
}
public static async getDeps(workspaceFolder: WorkspaceFolder, ileObject: ILEObject): Promise<ILEObject[]> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<ILEObject[]>(`getDeps`, [workspaceFolder.uri.toString(), ileObject]);
} else {
return [];
}
}
public static async getImpactsToUris(workspaceFolder: WorkspaceFolder, fileUris: Uri[]): Promise<ImpactedObject[]> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<ImpactedObject[]>(`getImpactsToUris`, [workspaceFolder.uri.toString(), fileUris.map(uri => uri.toString())]);
} else {
return [];
}
}
public static async getImpactsToObjects(workspaceFolder: WorkspaceFolder, ileObjects: ILEObject[]): Promise<ImpactedObject[]> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<ImpactedObject[]>(`getImpactsToObjects`, [workspaceFolder.uri.toString(), ileObjects]);
} else {
return [];
}
}
public static async getExports(workspaceFolder: WorkspaceFolder): Promise<{ [key: string]: ILEObject }> {
if (LanguageClientManager.client) {
return await LanguageClientManager.client.sendRequest<{ [key: string]: ILEObject }>(`getExports`, [workspaceFolder.uri.toString()]);
} else {
return {};
}
}
public static reloadProject(workspaceFolder: WorkspaceFolder) {
if (LanguageClientManager.client) {
return LanguageClientManager.client.sendRequest(`reloadProject`, [workspaceFolder.uri.toString()]);
} else {
return Promise.reject();
}
}
public static fixProject(workspaceFolder: WorkspaceFolder, suggestion: string) {
if (LanguageClientManager.client) {
return LanguageClientManager.client.sendRequest(`fixProject`, [workspaceFolder.uri.toString(), suggestion]);
} else {
return;
}
}
public static generateBuildFile(workspaceFolder: WorkspaceFolder, type: string) {
if (LanguageClientManager.client) {
return LanguageClientManager.client.sendRequest(`generateBuildFile`, [workspaceFolder.uri.toString(), type]);
} else {
return;
}
}
}