Skip to content

Commit 79b777e

Browse files
authored
refactor(editor-monaco-language-apidom): use idiomatic language impl (#3978)
Semantic Legend is now obtained via language service worker.
1 parent eb55fd7 commit 79b777e

14 files changed

+213
-129
lines changed
Lines changed: 3 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,11 @@
1-
import { ModesRegistry } from 'monaco-editor/esm/vs/editor/common/languages/modesRegistry.js';
2-
import * as monaco from 'monaco-editor';
3-
4-
import { languageExtensionPoint, monarchLanguage, languageId } from './language/config.js';
5-
import { setupApiDOM } from './language/apidom-mode.js';
1+
import lazyMonacoContribution, { isLanguageRegistered } from './language/monaco.contribution.js';
62

73
const makeAfterLoad =
84
({ createData = {} } = {}) =>
95
() => {
10-
/**
11-
* Parts of this code use ModesRegistry API instead of monaco.languages API.
12-
* The reason is that monaco.languages API is using ModesRegistory under the hood
13-
* but doesn't return disposables produced by ModesRegistry. By using ModesRegistry
14-
* directly we're able to obtain disposables.
15-
*/
16-
17-
// guard for multiple language registration
18-
const languages = ModesRegistry.getLanguages().map(({ id }) => id);
19-
if (languages.includes(languageId)) {
20-
return;
21-
}
22-
23-
// setup monaco environment
24-
globalThis.MonacoEnvironment = {
25-
// expect monaco plugin to have already executed
26-
...globalThis.MonacoEnvironment,
27-
getWorkerUrl(moduleId, label) {
28-
if (label === languageId) {
29-
return new URL('./apidom.worker.js', this.baseUrl).toString();
30-
}
31-
return new URL('./editor.worker.js', this.baseUrl).toString();
32-
},
33-
};
34-
35-
// setting up ApiDOM language
36-
const disposables = [];
37-
disposables.push(ModesRegistry.registerLanguage(languageExtensionPoint));
38-
disposables.push(
39-
monaco.languages.onLanguage(languageId, () => {
40-
disposables.push(monaco.languages.setMonarchTokensProvider(languageId, monarchLanguage)); // enable syntax highlighting
41-
disposables.push(setupApiDOM({ languageId, options: createData }));
6+
if (isLanguageRegistered()) return;
427

43-
// disposing of all allocated disposables
44-
disposables.push(
45-
monaco.editor.onWillDisposeModel((model) => {
46-
if (model.getLanguageId() === languageId) {
47-
disposables.forEach((disposable) => disposable.dispose());
48-
}
49-
})
50-
);
51-
})
52-
);
8+
lazyMonacoContribution({ createData });
539
};
5410

5511
export default makeAfterLoad;

src/plugins/editor-monaco-language-apidom/language/WorkerManager.js

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,13 @@ export default class WorkerManager {
4141
this.#lastUsedTime = Date.now();
4242

4343
if (!this.#client) {
44-
const {
45-
languageId,
46-
options: { customApiDOMWorkerPath, ...createData },
47-
} = this.#defaults;
48-
4944
this.#worker = monaco.editor.createWebWorker({
5045
moduleId: 'ApiDOMWorker',
51-
label: languageId,
46+
label: this.#defaults.getLanguageId(),
5247
createData: {
53-
...createData,
54-
languageId,
55-
customWorkerPath: customApiDOMWorkerPath,
48+
...this.#defaults.getWorkerOptions.data,
49+
languageId: this.#defaults.getLanguageId(),
50+
customWorkerPath: this.#defaults.getWorkerOptions.customWorkerPath,
5651
},
5752
});
5853
this.#client = this.#worker.getProxy();

src/plugins/editor-monaco-language-apidom/language/adapters/CodeActionsAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adapter from './Adapter.js';
22

3-
export default class CodeActionsAdapter extends Adapter {
3+
class CodeActionsAdapter extends Adapter {
44
async #getCodeActionList(vscodeDocument, diagnosticList) {
55
const worker = await this.worker(vscodeDocument.uri);
66

@@ -26,3 +26,5 @@ export default class CodeActionsAdapter extends Adapter {
2626
return this.#maybeConvert(codeActionList);
2727
}
2828
}
29+
30+
export default CodeActionsAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/CompletionItemsAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adapter from './Adapter.js';
22

3-
export default class CompletionItemsAdapter extends Adapter {
3+
class CompletionItemsAdapter extends Adapter {
44
#completionContext = {
55
maxNumberOfItems: 100,
66
};
@@ -25,3 +25,5 @@ export default class CompletionItemsAdapter extends Adapter {
2525
return this.protocolConverter.asCompletionResult(completionList);
2626
}
2727
}
28+
29+
export default CompletionItemsAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/DefinitionAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adapter from './Adapter.js';
22

3-
export default class DefinitionAdapter extends Adapter {
3+
class DefinitionAdapter extends Adapter {
44
async #getLocation(vscodeDocument, position) {
55
const worker = await this.worker(vscodeDocument.uri);
66

@@ -20,3 +20,5 @@ export default class DefinitionAdapter extends Adapter {
2020
return this.protocolConverter.asDefinitionResult(location);
2121
}
2222
}
23+
24+
export default DefinitionAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/DiagnosticsAdapter.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import * as monaco from 'monaco-editor';
22
import { languages } from 'vscode';
33

44
import Adapter from './Adapter.js';
5-
import { languageId } from '../config.js';
5+
import * as apidom from '../apidom.js';
66

7-
export default class DiagnosticsAdapter extends Adapter {
7+
class DiagnosticsAdapter extends Adapter {
88
#listener = [];
99

1010
#disposables = [];
@@ -14,10 +14,10 @@ export default class DiagnosticsAdapter extends Adapter {
1414
constructor(...args) {
1515
super(...args);
1616

17-
this.#diagnosticCollection = languages.createDiagnosticCollection(languageId);
17+
this.#diagnosticCollection = languages.createDiagnosticCollection(apidom.languageId);
1818

1919
const onModelAdd = (model) => {
20-
if (model.getLanguageId() !== languageId) {
20+
if (model.getLanguageId() !== apidom.languageId) {
2121
return;
2222
}
2323

@@ -53,8 +53,6 @@ export default class DiagnosticsAdapter extends Adapter {
5353
this.#disposables.push(monaco.editor.onDidCreateModel(onModelAdd));
5454
this.#disposables.push(monaco.editor.onWillDisposeModel(onModelRemoved));
5555
this.#disposables.push(this.#diagnosticCollection);
56-
// Monaco supports multiple models, though we only use a single model
57-
monaco.editor.getModels().forEach(onModelAdd);
5856
}
5957

6058
async #getDiagnostics(model) {
@@ -87,3 +85,5 @@ export default class DiagnosticsAdapter extends Adapter {
8785
this.#disposables = [];
8886
}
8987
}
88+
89+
export default DiagnosticsAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/LinksAdapter.js renamed to src/plugins/editor-monaco-language-apidom/language/adapters/DocumentLinkAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adapter from './Adapter.js';
22

3-
export default class LinksAdapter extends Adapter {
3+
class DocumentLinkAdapter extends Adapter {
44
async #getLinks(vscodeDocument) {
55
const worker = await this.worker(vscodeDocument.uri);
66

@@ -22,3 +22,5 @@ export default class LinksAdapter extends Adapter {
2222
return link;
2323
}
2424
}
25+
26+
export default DocumentLinkAdapter;
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import Adapter from './Adapter.js';
2+
3+
class DocumentSemanticTokensAdapter extends Adapter {
4+
async #getSemanticTokens(vscodeDocument) {
5+
const worker = await this.worker(vscodeDocument.uri);
6+
7+
try {
8+
return await worker.findSemanticTokens(vscodeDocument.uri.toString());
9+
} catch {
10+
return undefined;
11+
}
12+
}
13+
14+
async provideDocumentSemanticTokens(vscodeDocument) {
15+
const semanticTokens = await this.#getSemanticTokens(vscodeDocument);
16+
17+
return this.protocolConverter.asSemanticTokens(semanticTokens);
18+
}
19+
}
20+
21+
export default DocumentSemanticTokensAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/DocumentSymbolsAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adapter from './Adapter.js';
22

3-
export default class DocumentSymbolAdapter extends Adapter {
3+
class DocumentSymbolAdapter extends Adapter {
44
async #getSymbolInformationList(vscodeDocument) {
55
const worker = await this.worker(vscodeDocument.uri);
66

@@ -17,3 +17,5 @@ export default class DocumentSymbolAdapter extends Adapter {
1717
return this.protocolConverter.asDocumentSymbols(symbolInformationList);
1818
}
1919
}
20+
21+
export default DocumentSymbolAdapter;

src/plugins/editor-monaco-language-apidom/language/adapters/HoverAdapter.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import Adater from './Adapter.js';
22

3-
export default class HoverAdapter extends Adater {
3+
class HoverAdapter extends Adater {
44
async #getHover(vscodeDocument, position) {
55
const worker = await this.worker(vscodeDocument.uri);
66

@@ -20,3 +20,5 @@ export default class HoverAdapter extends Adater {
2020
return this.protocolConverter.asHover(hover);
2121
}
2222
}
23+
24+
export default HoverAdapter;

0 commit comments

Comments
 (0)