@codingame/monaco-vscode-standalone-html-language-features 23.1.1 → 23.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/common/initialize.js +11 -0
- package/common/workers.js +69 -0
- package/html.worker.js +8 -0
- package/index.js +21 -58
- package/language/common/lspLanguageFeatures.js +644 -0
- package/language/html/htmlMode.js +141 -0
- package/language/html/htmlWorker.js +126 -0
- package/language/html/workerManager.js +64 -0
- package/package.json +5 -2
- package/worker.js +2 -16155
- package/htmlMode.js +0 -2108
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { WorkerManager } from './workerManager.js';
|
|
2
|
+
import { HoverAdapter, DocumentHighlightAdapter, DocumentLinkAdapter, FoldingRangeAdapter, DocumentSymbolAdapter, SelectionRangeAdapter, RenameAdapter, DocumentFormattingEditProvider, DocumentRangeFormattingEditProvider, CompletionAdapter } from '../common/lspLanguageFeatures.js';
|
|
3
|
+
export { DefinitionAdapter, DiagnosticsAdapter, DocumentColorAdapter, ReferenceAdapter, fromPosition, fromRange, toRange, toTextEdit } from '../common/lspLanguageFeatures.js';
|
|
4
|
+
import { languages } from 'monaco-editor';
|
|
5
|
+
|
|
6
|
+
class HTMLCompletionAdapter extends CompletionAdapter {
|
|
7
|
+
constructor(worker) {
|
|
8
|
+
super(worker, [".", ":", "<", '"', "=", "/"]);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function setupMode1(defaults) {
|
|
12
|
+
const client = new WorkerManager(defaults);
|
|
13
|
+
const worker = (...uris) => {
|
|
14
|
+
return client.getLanguageServiceWorker(...uris);
|
|
15
|
+
};
|
|
16
|
+
let languageId = defaults.languageId;
|
|
17
|
+
languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker));
|
|
18
|
+
languages.registerHoverProvider(languageId, new HoverAdapter(worker));
|
|
19
|
+
languages.registerDocumentHighlightProvider(
|
|
20
|
+
languageId,
|
|
21
|
+
new DocumentHighlightAdapter(worker)
|
|
22
|
+
);
|
|
23
|
+
languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker));
|
|
24
|
+
languages.registerFoldingRangeProvider(
|
|
25
|
+
languageId,
|
|
26
|
+
new FoldingRangeAdapter(worker)
|
|
27
|
+
);
|
|
28
|
+
languages.registerDocumentSymbolProvider(
|
|
29
|
+
languageId,
|
|
30
|
+
new DocumentSymbolAdapter(worker)
|
|
31
|
+
);
|
|
32
|
+
languages.registerSelectionRangeProvider(
|
|
33
|
+
languageId,
|
|
34
|
+
new SelectionRangeAdapter(worker)
|
|
35
|
+
);
|
|
36
|
+
languages.registerRenameProvider(languageId, new RenameAdapter(worker));
|
|
37
|
+
if (languageId === "html") {
|
|
38
|
+
languages.registerDocumentFormattingEditProvider(
|
|
39
|
+
languageId,
|
|
40
|
+
new DocumentFormattingEditProvider(worker)
|
|
41
|
+
);
|
|
42
|
+
languages.registerDocumentRangeFormattingEditProvider(
|
|
43
|
+
languageId,
|
|
44
|
+
new DocumentRangeFormattingEditProvider(worker)
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function setupMode(defaults) {
|
|
49
|
+
const disposables = [];
|
|
50
|
+
const providers = [];
|
|
51
|
+
const client = new WorkerManager(defaults);
|
|
52
|
+
disposables.push(client);
|
|
53
|
+
const worker = (...uris) => {
|
|
54
|
+
return client.getLanguageServiceWorker(...uris);
|
|
55
|
+
};
|
|
56
|
+
function registerProviders() {
|
|
57
|
+
const { languageId, modeConfiguration } = defaults;
|
|
58
|
+
disposeAll(providers);
|
|
59
|
+
if (modeConfiguration.completionItems) {
|
|
60
|
+
providers.push(
|
|
61
|
+
languages.registerCompletionItemProvider(languageId, new HTMLCompletionAdapter(worker))
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
if (modeConfiguration.hovers) {
|
|
65
|
+
providers.push(
|
|
66
|
+
languages.registerHoverProvider(languageId, new HoverAdapter(worker))
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
if (modeConfiguration.documentHighlights) {
|
|
70
|
+
providers.push(
|
|
71
|
+
languages.registerDocumentHighlightProvider(
|
|
72
|
+
languageId,
|
|
73
|
+
new DocumentHighlightAdapter(worker)
|
|
74
|
+
)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
if (modeConfiguration.links) {
|
|
78
|
+
providers.push(
|
|
79
|
+
languages.registerLinkProvider(languageId, new DocumentLinkAdapter(worker))
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
if (modeConfiguration.documentSymbols) {
|
|
83
|
+
providers.push(
|
|
84
|
+
languages.registerDocumentSymbolProvider(
|
|
85
|
+
languageId,
|
|
86
|
+
new DocumentSymbolAdapter(worker)
|
|
87
|
+
)
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (modeConfiguration.rename) {
|
|
91
|
+
providers.push(
|
|
92
|
+
languages.registerRenameProvider(languageId, new RenameAdapter(worker))
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
if (modeConfiguration.foldingRanges) {
|
|
96
|
+
providers.push(
|
|
97
|
+
languages.registerFoldingRangeProvider(
|
|
98
|
+
languageId,
|
|
99
|
+
new FoldingRangeAdapter(worker)
|
|
100
|
+
)
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
if (modeConfiguration.selectionRanges) {
|
|
104
|
+
providers.push(
|
|
105
|
+
languages.registerSelectionRangeProvider(
|
|
106
|
+
languageId,
|
|
107
|
+
new SelectionRangeAdapter(worker)
|
|
108
|
+
)
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
if (modeConfiguration.documentFormattingEdits) {
|
|
112
|
+
providers.push(
|
|
113
|
+
languages.registerDocumentFormattingEditProvider(
|
|
114
|
+
languageId,
|
|
115
|
+
new DocumentFormattingEditProvider(worker)
|
|
116
|
+
)
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
if (modeConfiguration.documentRangeFormattingEdits) {
|
|
120
|
+
providers.push(
|
|
121
|
+
languages.registerDocumentRangeFormattingEditProvider(
|
|
122
|
+
languageId,
|
|
123
|
+
new DocumentRangeFormattingEditProvider(worker)
|
|
124
|
+
)
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
registerProviders();
|
|
129
|
+
disposables.push(asDisposable(providers));
|
|
130
|
+
return asDisposable(disposables);
|
|
131
|
+
}
|
|
132
|
+
function asDisposable(disposables) {
|
|
133
|
+
return { dispose: () => disposeAll(disposables) };
|
|
134
|
+
}
|
|
135
|
+
function disposeAll(disposables) {
|
|
136
|
+
while (disposables.length) {
|
|
137
|
+
disposables.pop().dispose();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export { CompletionAdapter, DocumentFormattingEditProvider, DocumentHighlightAdapter, DocumentLinkAdapter, DocumentRangeFormattingEditProvider, DocumentSymbolAdapter, FoldingRangeAdapter, HoverAdapter, RenameAdapter, SelectionRangeAdapter, WorkerManager, setupMode, setupMode1 };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { newHTMLDataProvider, getLanguageService } from 'vscode-html-languageservice';
|
|
2
|
+
import { TextDocument } from 'vscode-languageserver-textdocument';
|
|
3
|
+
|
|
4
|
+
class HTMLWorker {
|
|
5
|
+
constructor(ctx, createData) {
|
|
6
|
+
this._ctx = ctx;
|
|
7
|
+
this._languageSettings = createData.languageSettings;
|
|
8
|
+
this._languageId = createData.languageId;
|
|
9
|
+
const data = this._languageSettings.data;
|
|
10
|
+
const useDefaultDataProvider = data?.useDefaultDataProvider;
|
|
11
|
+
const customDataProviders = [];
|
|
12
|
+
if (data?.dataProviders) {
|
|
13
|
+
for (const id in data.dataProviders) {
|
|
14
|
+
customDataProviders.push(newHTMLDataProvider(id, data.dataProviders[id]));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
this._languageService = getLanguageService({
|
|
18
|
+
useDefaultDataProvider,
|
|
19
|
+
customDataProviders
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async doComplete(uri, position) {
|
|
23
|
+
let document = this._getTextDocument(uri);
|
|
24
|
+
if (!document) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
let htmlDocument = this._languageService.parseHTMLDocument(document);
|
|
28
|
+
return Promise.resolve(
|
|
29
|
+
this._languageService.doComplete(
|
|
30
|
+
document,
|
|
31
|
+
position,
|
|
32
|
+
htmlDocument,
|
|
33
|
+
this._languageSettings && this._languageSettings.suggest
|
|
34
|
+
)
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
async format(uri, range, options) {
|
|
38
|
+
let document = this._getTextDocument(uri);
|
|
39
|
+
if (!document) {
|
|
40
|
+
return [];
|
|
41
|
+
}
|
|
42
|
+
let formattingOptions = { ...this._languageSettings.format, ...options };
|
|
43
|
+
let textEdits = this._languageService.format(document, range, formattingOptions);
|
|
44
|
+
return Promise.resolve(textEdits);
|
|
45
|
+
}
|
|
46
|
+
async doHover(uri, position) {
|
|
47
|
+
let document = this._getTextDocument(uri);
|
|
48
|
+
if (!document) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
let htmlDocument = this._languageService.parseHTMLDocument(document);
|
|
52
|
+
let hover = this._languageService.doHover(document, position, htmlDocument);
|
|
53
|
+
return Promise.resolve(hover);
|
|
54
|
+
}
|
|
55
|
+
async findDocumentHighlights(uri, position) {
|
|
56
|
+
let document = this._getTextDocument(uri);
|
|
57
|
+
if (!document) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
let htmlDocument = this._languageService.parseHTMLDocument(document);
|
|
61
|
+
let highlights = this._languageService.findDocumentHighlights(document, position, htmlDocument);
|
|
62
|
+
return Promise.resolve(highlights);
|
|
63
|
+
}
|
|
64
|
+
async findDocumentLinks(uri) {
|
|
65
|
+
let document = this._getTextDocument(uri);
|
|
66
|
+
if (!document) {
|
|
67
|
+
return [];
|
|
68
|
+
}
|
|
69
|
+
let links = this._languageService.findDocumentLinks(
|
|
70
|
+
document,
|
|
71
|
+
null
|
|
72
|
+
/*TODO@aeschli*/
|
|
73
|
+
);
|
|
74
|
+
return Promise.resolve(links);
|
|
75
|
+
}
|
|
76
|
+
async findDocumentSymbols(uri) {
|
|
77
|
+
let document = this._getTextDocument(uri);
|
|
78
|
+
if (!document) {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
let htmlDocument = this._languageService.parseHTMLDocument(document);
|
|
82
|
+
let symbols = this._languageService.findDocumentSymbols(document, htmlDocument);
|
|
83
|
+
return Promise.resolve(symbols);
|
|
84
|
+
}
|
|
85
|
+
async getFoldingRanges(uri, context) {
|
|
86
|
+
let document = this._getTextDocument(uri);
|
|
87
|
+
if (!document) {
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
let ranges = this._languageService.getFoldingRanges(document, context);
|
|
91
|
+
return Promise.resolve(ranges);
|
|
92
|
+
}
|
|
93
|
+
async getSelectionRanges(uri, positions) {
|
|
94
|
+
let document = this._getTextDocument(uri);
|
|
95
|
+
if (!document) {
|
|
96
|
+
return [];
|
|
97
|
+
}
|
|
98
|
+
let ranges = this._languageService.getSelectionRanges(document, positions);
|
|
99
|
+
return Promise.resolve(ranges);
|
|
100
|
+
}
|
|
101
|
+
async doRename(uri, position, newName) {
|
|
102
|
+
let document = this._getTextDocument(uri);
|
|
103
|
+
if (!document) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
let htmlDocument = this._languageService.parseHTMLDocument(document);
|
|
107
|
+
let renames = this._languageService.doRename(document, position, newName, htmlDocument);
|
|
108
|
+
return Promise.resolve(renames);
|
|
109
|
+
}
|
|
110
|
+
_getTextDocument(uri) {
|
|
111
|
+
let models = this._ctx.getMirrorModels();
|
|
112
|
+
for (let model of models) {
|
|
113
|
+
if (model.uri.toString() === uri) {
|
|
114
|
+
return TextDocument.create(
|
|
115
|
+
uri,
|
|
116
|
+
this._languageId,
|
|
117
|
+
model.version,
|
|
118
|
+
model.getValue()
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export { HTMLWorker };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { createWebWorker } from '../../common/workers.js';
|
|
2
|
+
|
|
3
|
+
const STOP_WHEN_IDLE_FOR = 2 * 60 * 1e3;
|
|
4
|
+
class WorkerManager {
|
|
5
|
+
constructor(defaults) {
|
|
6
|
+
this._defaults = defaults;
|
|
7
|
+
this._worker = null;
|
|
8
|
+
this._client = null;
|
|
9
|
+
this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3);
|
|
10
|
+
this._lastUsedTime = 0;
|
|
11
|
+
this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker());
|
|
12
|
+
}
|
|
13
|
+
_stopWorker() {
|
|
14
|
+
if (this._worker) {
|
|
15
|
+
this._worker.dispose();
|
|
16
|
+
this._worker = null;
|
|
17
|
+
}
|
|
18
|
+
this._client = null;
|
|
19
|
+
}
|
|
20
|
+
dispose() {
|
|
21
|
+
clearInterval(this._idleCheckInterval);
|
|
22
|
+
this._configChangeListener.dispose();
|
|
23
|
+
this._stopWorker();
|
|
24
|
+
}
|
|
25
|
+
_checkIfIdle() {
|
|
26
|
+
if (!this._worker) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
let timePassedSinceLastUsed = Date.now() - this._lastUsedTime;
|
|
30
|
+
if (timePassedSinceLastUsed > STOP_WHEN_IDLE_FOR) {
|
|
31
|
+
this._stopWorker();
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
_getClient() {
|
|
35
|
+
this._lastUsedTime = Date.now();
|
|
36
|
+
if (!this._client) {
|
|
37
|
+
this._worker = createWebWorker({
|
|
38
|
+
// module that exports the create() method and returns a `HTMLWorker` instance
|
|
39
|
+
moduleId: "vs/language/html/htmlWorker",
|
|
40
|
+
createWorker: () => new Worker(new URL(new URL('../../html.worker.js', import.meta.url).href, import.meta.url), { type: "module" }),
|
|
41
|
+
// passed in to the create() method
|
|
42
|
+
createData: {
|
|
43
|
+
languageSettings: this._defaults.options,
|
|
44
|
+
languageId: this._defaults.languageId
|
|
45
|
+
},
|
|
46
|
+
label: this._defaults.languageId
|
|
47
|
+
});
|
|
48
|
+
this._client = this._worker.getProxy();
|
|
49
|
+
}
|
|
50
|
+
return this._client;
|
|
51
|
+
}
|
|
52
|
+
getLanguageServiceWorker(...resources) {
|
|
53
|
+
let _client;
|
|
54
|
+
return this._getClient().then((client) => {
|
|
55
|
+
_client = client;
|
|
56
|
+
}).then((_) => {
|
|
57
|
+
if (this._worker) {
|
|
58
|
+
return this._worker.withSyncedResources(resources);
|
|
59
|
+
}
|
|
60
|
+
}).then((_) => _client);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { WorkerManager };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-standalone-html-language-features",
|
|
3
|
-
"version": "23.
|
|
3
|
+
"version": "23.2.0",
|
|
4
4
|
"keywords": [],
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "CodinGame",
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
"main": "index.js",
|
|
26
26
|
"module": "index.js",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"monaco-editor": "npm:@codingame/monaco-vscode-editor-api@23.
|
|
28
|
+
"monaco-editor": "npm:@codingame/monaco-vscode-editor-api@23.2.0",
|
|
29
|
+
"vscode-html-languageservice": "5.2.0",
|
|
30
|
+
"vscode-languageserver-textdocument": "1.0.12",
|
|
31
|
+
"vscode-languageserver-types": "3.17.5"
|
|
29
32
|
}
|
|
30
33
|
}
|