-
Notifications
You must be signed in to change notification settings - Fork 8
/
webworker.ts
86 lines (81 loc) · 2.62 KB
/
webworker.ts
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
import {
createProtocolConnection,
BrowserMessageReader,
BrowserMessageWriter,
} from "vscode-languageserver-protocol/browser";
import {
CompletionRequest,
CompletionResolveRequest,
DidChangeTextDocumentNotification,
DidOpenTextDocumentNotification,
HoverRequest,
HoverParams,
InitializeRequest,
InitializeResult,
TextDocumentSyncKind,
CompletionItem,
DidOpenTextDocumentParams,
DidChangeTextDocumentParams,
CompletionParams,
DocumentRangeFormattingRequest,
DocumentRangeFormattingParams,
PublishDiagnosticsNotification,
Diagnostic,
TextDocument
} from "vscode-languageserver-protocol";
import {JsonService} from "ace-linters/build/json-service";
const worker: Worker = self as any;
const conn = createProtocolConnection(
new BrowserMessageReader(worker),
new BrowserMessageWriter(worker)
);
let jsonService = new JsonService("json");
conn.onRequest(InitializeRequest.type, (_params): InitializeResult => {
return {
capabilities: {
textDocumentSync: TextDocumentSyncKind.Incremental,
completionProvider: {
resolveProvider: true,
},
hoverProvider: true,
},
};
});
conn.onNotification(
DidOpenTextDocumentNotification.type,
(params: DidOpenTextDocumentParams) => {
jsonService.addDocument(params.textDocument);
doValidation(params.textDocument);
}
);
conn.onNotification(
DidChangeTextDocumentNotification.type,
(params: DidChangeTextDocumentParams) => {
jsonService.applyDeltas(params.textDocument, params.contentChanges);
doValidation(params.textDocument);
}
);
conn.onRequest(CompletionRequest.type, async (params: CompletionParams) => {
return jsonService.doComplete(
params.textDocument, params.position
);
});
conn.onRequest(HoverRequest.type, async (params: HoverParams) => {
return jsonService.doHover(params.textDocument, params.position);
});
conn.onRequest(CompletionResolveRequest.type, async (item: CompletionItem) => {
return jsonService.doResolve(item);
});
conn.onRequest(DocumentRangeFormattingRequest.type, async (params: DocumentRangeFormattingParams) => {
return jsonService.format(params.textDocument, params.range, params.options);
});
conn.listen();
async function doValidation(document) {
let diagnostics = await jsonService.doValidation(document);
sendDiagnostics(document, diagnostics);
}
function sendDiagnostics(document: TextDocument, diagnostics: Diagnostic[]): void {
conn.sendNotification(PublishDiagnosticsNotification.type, {
uri: document.uri, diagnostics
})
}