Skip to content

Commit b8735e2

Browse files
committed
fix: browser build problem
1 parent 9bdc08d commit b8735e2

File tree

3 files changed

+736
-592
lines changed

3 files changed

+736
-592
lines changed

server/src/browser/server.ts

Lines changed: 166 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,181 @@
11
// Copyright © 2022, SAS Institute Inc., Cary, NC, USA. All Rights Reserved.
22
// SPDX-License-Identifier: Apache-2.0
3+
import {
4+
Connection,
5+
InitializeResult,
6+
SemanticTokensRequest,
7+
TextDocumentSyncKind,
8+
TextDocuments,
9+
} from "vscode-languageserver";
10+
import { TextDocument } from "vscode-languageserver-textdocument";
311
import {
412
BrowserMessageReader,
513
BrowserMessageWriter,
614
createConnection,
715
} from "vscode-languageserver/browser";
816

9-
import { init } from "../server";
17+
import { CompletionProvider } from "../sas/CompletionProvider";
18+
import {
19+
LanguageServiceProvider,
20+
legend,
21+
} from "../sas/LanguageServiceProvider";
22+
import type { LibCompleteItem } from "../sas/SyntaxDataProvider";
1023

1124
/* browser specific setup code */
1225

1326
const messageReader = new BrowserMessageReader(self);
1427
const messageWriter = new BrowserMessageWriter(self);
1528

16-
const connection = createConnection(messageReader, messageWriter);
29+
const connection: Connection = createConnection(messageReader, messageWriter);
30+
31+
const servicePool: Record<string, LanguageServiceProvider> = {};
32+
const documentPool: Record<string, TextDocument> = {};
33+
34+
let completionProvider: CompletionProvider;
35+
let supportSASGetLibList = false;
36+
37+
// Create a simple text document manager.
38+
const documents: TextDocuments<TextDocument> = new TextDocuments(TextDocument);
39+
40+
connection.onInitialize((params) => {
41+
if (
42+
params.initializationOptions &&
43+
params.initializationOptions.supportSASGetLibList
44+
) {
45+
supportSASGetLibList = true;
46+
}
47+
const result: InitializeResult = {
48+
capabilities: {
49+
textDocumentSync: TextDocumentSyncKind.Incremental,
50+
semanticTokensProvider: {
51+
legend,
52+
full: true,
53+
},
54+
documentSymbolProvider: true,
55+
documentFormattingProvider: true,
56+
foldingRangeProvider: true,
57+
hoverProvider: true,
58+
completionProvider: {
59+
triggerCharacters: [" "],
60+
resolveProvider: true,
61+
},
62+
documentOnTypeFormattingProvider: {
63+
firstTriggerCharacter: "\n",
64+
moreTriggerCharacter: [";"],
65+
},
66+
signatureHelpProvider: {
67+
triggerCharacters: ["(", ","],
68+
},
69+
},
70+
};
71+
return result;
72+
});
73+
74+
connection.onRequest(SemanticTokensRequest.type, (params) => {
75+
const languageService = getLanguageService(params.textDocument.uri);
76+
77+
return { data: languageService.getTokens() };
78+
});
79+
80+
connection.onHover((params) => {
81+
const languageService = getLanguageService(params.textDocument.uri);
82+
83+
return languageService.completionProvider.getHelp(params.position);
84+
});
85+
86+
connection.onCompletion((params) => {
87+
const languageService = getLanguageService(params.textDocument.uri);
88+
completionProvider = languageService.completionProvider;
89+
90+
return completionProvider.getCompleteItems(params.position);
91+
});
92+
93+
connection.onCompletionResolve((params) => {
94+
return completionProvider.getCompleteItemHelp(params);
95+
});
96+
97+
connection.onDocumentSymbol((params) => {
98+
const languageService = getLanguageService(params.textDocument.uri);
99+
return languageService.getDocumentSymbols();
100+
});
101+
102+
connection.onFoldingRanges((params) => {
103+
const languageService = getLanguageService(params.textDocument.uri);
104+
return languageService.getFoldingRanges();
105+
});
106+
107+
connection.onRequest("sas/getFoldingBlock", (params) => {
108+
const languageService = getLanguageService(params.textDocument.uri);
109+
const block = languageService.getFoldingBlock(
110+
params.line,
111+
params.col,
112+
params.strict ?? true,
113+
params.ignoreCustomBlock,
114+
params.ignoreGlobalBlock,
115+
);
116+
if (!block) {
117+
return undefined;
118+
} else {
119+
return { ...block, outerBlock: undefined, innerBlocks: undefined };
120+
}
121+
});
122+
123+
connection.onDocumentOnTypeFormatting((params) => {
124+
const languageService = getLanguageService(params.textDocument.uri);
125+
return languageService.formatOnTypeProvider.getIndentEdit(
126+
params.position.line,
127+
params.position.character,
128+
params.ch,
129+
params.options.tabSize,
130+
params.options.insertSpaces,
131+
);
132+
});
133+
134+
connection.onSignatureHelp((params) => {
135+
const languageService = getLanguageService(params.textDocument.uri);
136+
completionProvider = languageService.completionProvider;
137+
return completionProvider.getSignatureHelp(
138+
params.position,
139+
params.context?.activeSignatureHelp?.activeSignature,
140+
);
141+
});
142+
143+
connection.onDocumentFormatting((params) => {
144+
const languageService = getLanguageService(params.textDocument.uri);
145+
return languageService.formatter.format({
146+
tabWidth: params.options.tabSize,
147+
useTabs: params.options.insertSpaces === false,
148+
});
149+
});
150+
151+
documents.onDidChangeContent((event) => {
152+
if (servicePool[event.document.uri]) {
153+
documentPool[event.document.uri] = event.document;
154+
return;
155+
}
156+
servicePool[event.document.uri] = new LanguageServiceProvider(event.document);
157+
});
158+
159+
// Make the text document manager listen on the connection
160+
// for open, change and close text document events
161+
documents.listen(connection);
162+
163+
// Listen on the connection
164+
connection.listen();
165+
166+
function getLanguageService(uri: string) {
167+
if (documentPool[uri]) {
168+
// re-create LanguageServer if document changed
169+
servicePool[uri] = new LanguageServiceProvider(documentPool[uri]);
17170

18-
/* from here on, all code is non-browser specific and could be shared with a regular extension */
19-
init(connection);
171+
if (supportSASGetLibList) {
172+
servicePool[uri].setLibService((libId, resolve) =>
173+
connection
174+
.sendRequest<LibCompleteItem[]>("sas/getLibList", { libId: libId })
175+
.then(resolve),
176+
);
177+
}
178+
delete documentPool[uri];
179+
}
180+
return servicePool[uri];
181+
}

0 commit comments

Comments
 (0)