Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/browser/mainThreadLanguages.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { URI, UriComponents } from '../../../base/common/uri.js';
7
import { ILanguageService } from '../../../editor/common/languages/language.js';
8
import { IModelService } from '../../../editor/common/services/model.js';
9
import { MainThreadLanguagesShape, MainContext, ExtHostContext, ExtHostLanguagesShape } from '../common/extHost.protocol.js';
10
import { extHostNamedCustomer, IExtHostContext } from '../../services/extensions/common/extHostCustomers.js';
11
import { IPosition } from '../../../editor/common/core/position.js';
12
import { IRange, Range } from '../../../editor/common/core/range.js';
13
import { StandardTokenType } from '../../../editor/common/encodedTokenAttributes.js';
14
import { ITextModelService } from '../../../editor/common/services/resolverService.js';
15
import { ILanguageStatus, ILanguageStatusService } from '../../services/languageStatus/common/languageStatusService.js';
16
import { DisposableMap, DisposableStore } from '../../../base/common/lifecycle.js';
17
18
@extHostNamedCustomer(MainContext.MainThreadLanguages)
19
export class MainThreadLanguages implements MainThreadLanguagesShape {
20
21
private readonly _disposables = new DisposableStore();
22
private readonly _proxy: ExtHostLanguagesShape;
23
24
private readonly _status = new DisposableMap<number>();
25
26
constructor(
27
_extHostContext: IExtHostContext,
28
@ILanguageService private readonly _languageService: ILanguageService,
29
@IModelService private readonly _modelService: IModelService,
30
@ITextModelService private _resolverService: ITextModelService,
31
@ILanguageStatusService private readonly _languageStatusService: ILanguageStatusService,
32
) {
33
this._proxy = _extHostContext.getProxy(ExtHostContext.ExtHostLanguages);
34
35
this._proxy.$acceptLanguageIds(_languageService.getRegisteredLanguageIds());
36
this._disposables.add(_languageService.onDidChange(_ => {
37
this._proxy.$acceptLanguageIds(_languageService.getRegisteredLanguageIds());
38
}));
39
}
40
41
dispose(): void {
42
this._disposables.dispose();
43
this._status.dispose();
44
}
45
46
async $changeLanguage(resource: UriComponents, languageId: string): Promise<void> {
47
48
if (!this._languageService.isRegisteredLanguageId(languageId)) {
49
return Promise.reject(new Error(`Unknown language id: ${languageId}`));
50
}
51
52
const uri = URI.revive(resource);
53
const ref = await this._resolverService.createModelReference(uri);
54
try {
55
ref.object.textEditorModel.setLanguage(this._languageService.createById(languageId));
56
} finally {
57
ref.dispose();
58
}
59
}
60
61
async $tokensAtPosition(resource: UriComponents, position: IPosition): Promise<undefined | { type: StandardTokenType; range: IRange }> {
62
const uri = URI.revive(resource);
63
const model = this._modelService.getModel(uri);
64
if (!model) {
65
return undefined;
66
}
67
model.tokenization.tokenizeIfCheap(position.lineNumber);
68
const tokens = model.tokenization.getLineTokens(position.lineNumber);
69
const idx = tokens.findTokenIndexAtOffset(position.column - 1);
70
return {
71
type: tokens.getStandardTokenType(idx),
72
range: new Range(position.lineNumber, 1 + tokens.getStartOffset(idx), position.lineNumber, 1 + tokens.getEndOffset(idx))
73
};
74
}
75
76
// --- language status
77
78
$setLanguageStatus(handle: number, status: ILanguageStatus): void {
79
this._status.get(handle)?.dispose();
80
this._status.set(handle, this._languageStatusService.addStatus(status));
81
}
82
83
$removeLanguageStatus(handle: number): void {
84
this._status.get(handle)?.dispose();
85
}
86
}
87
88