Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/standalone/browser/standaloneLanguages.ts
5241 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 { CancellationToken } from '../../../base/common/cancellation.js';
7
import { Color } from '../../../base/common/color.js';
8
import { IDisposable } from '../../../base/common/lifecycle.js';
9
import { Position } from '../../common/core/position.js';
10
import { Range } from '../../common/core/range.js';
11
import { MetadataConsts } from '../../common/encodedTokenAttributes.js';
12
import * as languages from '../../common/languages.js';
13
import { ILanguageExtensionPoint, ILanguageService } from '../../common/languages/language.js';
14
import { LanguageConfiguration } from '../../common/languages/languageConfiguration.js';
15
import { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';
16
import { ModesRegistry } from '../../common/languages/modesRegistry.js';
17
import { LanguageSelector } from '../../common/languageSelector.js';
18
import * as model from '../../common/model.js';
19
import { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';
20
import * as standaloneEnums from '../../common/standalone/standaloneEnums.js';
21
import { StandaloneServices } from './standaloneServices.js';
22
import { compile } from '../common/monarch/monarchCompile.js';
23
import { MonarchTokenizer } from '../common/monarch/monarchLexer.js';
24
import { IMonarchLanguage } from '../common/monarch/monarchTypes.js';
25
import { IStandaloneThemeService } from '../common/standaloneTheme.js';
26
import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';
27
import { IMarkerData, IMarkerService } from '../../../platform/markers/common/markers.js';
28
import { EditDeltaInfo } from '../../common/textModelEditSource.js';
29
30
/**
31
* Register information about a new language.
32
*/
33
export function register(language: ILanguageExtensionPoint): void {
34
// Intentionally using the `ModesRegistry` here to avoid
35
// instantiating services too quickly in the standalone editor.
36
ModesRegistry.registerLanguage(language);
37
}
38
39
/**
40
* Get the information of all the registered languages.
41
*/
42
export function getLanguages(): ILanguageExtensionPoint[] {
43
let result: ILanguageExtensionPoint[] = [];
44
result = result.concat(ModesRegistry.getLanguages());
45
return result;
46
}
47
48
export function getEncodedLanguageId(languageId: string): number {
49
const languageService = StandaloneServices.get(ILanguageService);
50
return languageService.languageIdCodec.encodeLanguageId(languageId);
51
}
52
53
/**
54
* An event emitted when a language is associated for the first time with a text model.
55
* @event
56
*/
57
export function onLanguage(languageId: string, callback: () => void): IDisposable {
58
return StandaloneServices.withServices(() => {
59
const languageService = StandaloneServices.get(ILanguageService);
60
const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {
61
if (encounteredLanguageId === languageId) {
62
// stop listening
63
disposable.dispose();
64
// invoke actual listener
65
callback();
66
}
67
});
68
return disposable;
69
});
70
}
71
72
/**
73
* An event emitted when a language is associated for the first time with a text model or
74
* when a language is encountered during the tokenization of another language.
75
* @event
76
*/
77
export function onLanguageEncountered(languageId: string, callback: () => void): IDisposable {
78
return StandaloneServices.withServices(() => {
79
const languageService = StandaloneServices.get(ILanguageService);
80
const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {
81
if (encounteredLanguageId === languageId) {
82
// stop listening
83
disposable.dispose();
84
// invoke actual listener
85
callback();
86
}
87
});
88
return disposable;
89
});
90
}
91
92
/**
93
* Set the editing configuration for a language.
94
*/
95
export function setLanguageConfiguration(languageId: string, configuration: LanguageConfiguration): IDisposable {
96
const languageService = StandaloneServices.get(ILanguageService);
97
if (!languageService.isRegisteredLanguageId(languageId)) {
98
throw new Error(`Cannot set configuration for unknown language ${languageId}`);
99
}
100
const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService);
101
return languageConfigurationService.register(languageId, configuration, 100);
102
}
103
104
/**
105
* @internal
106
*/
107
export class EncodedTokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {
108
109
private readonly _languageId: string;
110
private readonly _actual: EncodedTokensProvider;
111
112
constructor(languageId: string, actual: EncodedTokensProvider) {
113
this._languageId = languageId;
114
this._actual = actual;
115
}
116
117
dispose(): void {
118
// NOOP
119
}
120
121
public getInitialState(): languages.IState {
122
return this._actual.getInitialState();
123
}
124
125
public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {
126
if (typeof this._actual.tokenize === 'function') {
127
return TokenizationSupportAdapter.adaptTokenize(this._languageId, <{ tokenize(line: string, state: languages.IState): ILineTokens }>this._actual, line, state);
128
}
129
throw new Error('Not supported!');
130
}
131
132
public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {
133
const result = this._actual.tokenizeEncoded(line, state);
134
return new languages.EncodedTokenizationResult(result.tokens, [], result.endState);
135
}
136
}
137
138
/**
139
* @internal
140
*/
141
export class TokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {
142
143
constructor(
144
private readonly _languageId: string,
145
private readonly _actual: TokensProvider,
146
private readonly _languageService: ILanguageService,
147
private readonly _standaloneThemeService: IStandaloneThemeService,
148
) {
149
}
150
151
dispose(): void {
152
// NOOP
153
}
154
155
public getInitialState(): languages.IState {
156
return this._actual.getInitialState();
157
}
158
159
private static _toClassicTokens(tokens: IToken[], language: string): languages.Token[] {
160
const result: languages.Token[] = [];
161
let previousStartIndex: number = 0;
162
for (let i = 0, len = tokens.length; i < len; i++) {
163
const t = tokens[i];
164
let startIndex = t.startIndex;
165
166
// Prevent issues stemming from a buggy external tokenizer.
167
if (i === 0) {
168
// Force first token to start at first index!
169
startIndex = 0;
170
} else if (startIndex < previousStartIndex) {
171
// Force tokens to be after one another!
172
startIndex = previousStartIndex;
173
}
174
175
result[i] = new languages.Token(startIndex, t.scopes, language);
176
177
previousStartIndex = startIndex;
178
}
179
return result;
180
}
181
182
public static adaptTokenize(language: string, actual: { tokenize(line: string, state: languages.IState): ILineTokens }, line: string, state: languages.IState): languages.TokenizationResult {
183
const actualResult = actual.tokenize(line, state);
184
const tokens = TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language);
185
186
let endState: languages.IState;
187
// try to save an object if possible
188
if (actualResult.endState.equals(state)) {
189
endState = state;
190
} else {
191
endState = actualResult.endState;
192
}
193
194
return new languages.TokenizationResult(tokens, endState);
195
}
196
197
public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {
198
return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state);
199
}
200
201
private _toBinaryTokens(languageIdCodec: languages.ILanguageIdCodec, tokens: IToken[]): Uint32Array {
202
const languageId = languageIdCodec.encodeLanguageId(this._languageId);
203
const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme;
204
205
const result: number[] = [];
206
let resultLen = 0;
207
let previousStartIndex: number = 0;
208
for (let i = 0, len = tokens.length; i < len; i++) {
209
const t = tokens[i];
210
const metadata = tokenTheme.match(languageId, t.scopes) | MetadataConsts.BALANCED_BRACKETS_MASK;
211
if (resultLen > 0 && result[resultLen - 1] === metadata) {
212
// same metadata
213
continue;
214
}
215
216
let startIndex = t.startIndex;
217
218
// Prevent issues stemming from a buggy external tokenizer.
219
if (i === 0) {
220
// Force first token to start at first index!
221
startIndex = 0;
222
} else if (startIndex < previousStartIndex) {
223
// Force tokens to be after one another!
224
startIndex = previousStartIndex;
225
}
226
227
result[resultLen++] = startIndex;
228
result[resultLen++] = metadata;
229
230
previousStartIndex = startIndex;
231
}
232
233
const actualResult = new Uint32Array(resultLen);
234
for (let i = 0; i < resultLen; i++) {
235
actualResult[i] = result[i];
236
}
237
return actualResult;
238
}
239
240
public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {
241
const actualResult = this._actual.tokenize(line, state);
242
const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens);
243
244
let endState: languages.IState;
245
// try to save an object if possible
246
if (actualResult.endState.equals(state)) {
247
endState = state;
248
} else {
249
endState = actualResult.endState;
250
}
251
252
return new languages.EncodedTokenizationResult(tokens, [], endState);
253
}
254
}
255
256
/**
257
* A token.
258
*/
259
export interface IToken {
260
startIndex: number;
261
scopes: string;
262
}
263
264
/**
265
* The result of a line tokenization.
266
*/
267
export interface ILineTokens {
268
/**
269
* The list of tokens on the line.
270
*/
271
tokens: IToken[];
272
/**
273
* The tokenization end state.
274
* A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.
275
*/
276
endState: languages.IState;
277
}
278
279
/**
280
* The result of a line tokenization.
281
*/
282
export interface IEncodedLineTokens {
283
/**
284
* The tokens on the line in a binary, encoded format. Each token occupies two array indices. For token i:
285
* - at offset 2*i => startIndex
286
* - at offset 2*i + 1 => metadata
287
* Meta data is in binary format:
288
* - -------------------------------------------
289
* 3322 2222 2222 1111 1111 1100 0000 0000
290
* 1098 7654 3210 9876 5432 1098 7654 3210
291
* - -------------------------------------------
292
* bbbb bbbb bfff ffff ffFF FFTT LLLL LLLL
293
* - -------------------------------------------
294
* - L = EncodedLanguageId (8 bits): Use `getEncodedLanguageId` to get the encoded ID of a language.
295
* - T = StandardTokenType (2 bits): Other = 0, Comment = 1, String = 2, RegEx = 3.
296
* - F = FontStyle (4 bits): None = 0, Italic = 1, Bold = 2, Underline = 4, Strikethrough = 8.
297
* - f = foreground ColorId (9 bits)
298
* - b = background ColorId (9 bits)
299
* - The color value for each colorId is defined in IStandaloneThemeData.customTokenColors:
300
* e.g. colorId = 1 is stored in IStandaloneThemeData.customTokenColors[1]. Color id = 0 means no color,
301
* id = 1 is for the default foreground color, id = 2 for the default background.
302
*/
303
tokens: Uint32Array;
304
/**
305
* The tokenization end state.
306
* A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.
307
*/
308
endState: languages.IState;
309
}
310
311
/**
312
* A factory for token providers.
313
*/
314
export interface TokensProviderFactory {
315
create(): languages.ProviderResult<TokensProvider | EncodedTokensProvider | IMonarchLanguage>;
316
}
317
318
/**
319
* A "manual" provider of tokens.
320
*/
321
export interface TokensProvider {
322
/**
323
* The initial state of a language. Will be the state passed in to tokenize the first line.
324
*/
325
getInitialState(): languages.IState;
326
/**
327
* Tokenize a line given the state at the beginning of the line.
328
*/
329
tokenize(line: string, state: languages.IState): ILineTokens;
330
}
331
332
/**
333
* A "manual" provider of tokens, returning tokens in a binary form.
334
*/
335
export interface EncodedTokensProvider {
336
/**
337
* The initial state of a language. Will be the state passed in to tokenize the first line.
338
*/
339
getInitialState(): languages.IState;
340
/**
341
* Tokenize a line given the state at the beginning of the line.
342
*/
343
tokenizeEncoded(line: string, state: languages.IState): IEncodedLineTokens;
344
/**
345
* Tokenize a line given the state at the beginning of the line.
346
*/
347
tokenize?(line: string, state: languages.IState): ILineTokens;
348
}
349
350
function isATokensProvider(provider: TokensProvider | EncodedTokensProvider | IMonarchLanguage): provider is TokensProvider | EncodedTokensProvider {
351
return (typeof provider.getInitialState === 'function');
352
}
353
354
function isEncodedTokensProvider(provider: TokensProvider | EncodedTokensProvider): provider is EncodedTokensProvider {
355
return 'tokenizeEncoded' in provider;
356
}
357
358
function isThenable<T>(obj: any): obj is Thenable<T> {
359
return obj && typeof obj.then === 'function';
360
}
361
362
/**
363
* Change the color map that is used for token colors.
364
* Supported formats (hex): #RRGGBB, $RRGGBBAA, #RGB, #RGBA
365
*/
366
export function setColorMap(colorMap: string[] | null): void {
367
const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);
368
if (colorMap) {
369
const result: Color[] = [null!];
370
for (let i = 1, len = colorMap.length; i < len; i++) {
371
result[i] = Color.fromHex(colorMap[i]);
372
}
373
standaloneThemeService.setColorMapOverride(result);
374
} else {
375
standaloneThemeService.setColorMapOverride(null);
376
}
377
}
378
379
/**
380
* @internal
381
*/
382
function createTokenizationSupportAdapter(languageId: string, provider: TokensProvider | EncodedTokensProvider) {
383
if (isEncodedTokensProvider(provider)) {
384
return new EncodedTokenizationSupportAdapter(languageId, provider);
385
} else {
386
return new TokenizationSupportAdapter(
387
languageId,
388
provider,
389
StandaloneServices.get(ILanguageService),
390
StandaloneServices.get(IStandaloneThemeService),
391
);
392
}
393
}
394
395
/**
396
* Register a tokens provider factory for a language. This tokenizer will be exclusive with a tokenizer
397
* set using `setTokensProvider` or one created using `setMonarchTokensProvider`, but will work together
398
* with a tokens provider set using `registerDocumentSemanticTokensProvider` or `registerDocumentRangeSemanticTokensProvider`.
399
*/
400
export function registerTokensProviderFactory(languageId: string, factory: TokensProviderFactory): IDisposable {
401
const adaptedFactory = new languages.LazyTokenizationSupport(async () => {
402
const result = await Promise.resolve(factory.create());
403
if (!result) {
404
return null;
405
}
406
if (isATokensProvider(result)) {
407
return createTokenizationSupportAdapter(languageId, result);
408
}
409
return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result), StandaloneServices.get(IConfigurationService));
410
});
411
return languages.TokenizationRegistry.registerFactory(languageId, adaptedFactory);
412
}
413
414
/**
415
* Set the tokens provider for a language (manual implementation). This tokenizer will be exclusive
416
* with a tokenizer created using `setMonarchTokensProvider`, or with `registerTokensProviderFactory`,
417
* but will work together with a tokens provider set using `registerDocumentSemanticTokensProvider`
418
* or `registerDocumentRangeSemanticTokensProvider`.
419
*/
420
export function setTokensProvider(languageId: string, provider: TokensProvider | EncodedTokensProvider | Thenable<TokensProvider | EncodedTokensProvider>): IDisposable {
421
const languageService = StandaloneServices.get(ILanguageService);
422
if (!languageService.isRegisteredLanguageId(languageId)) {
423
throw new Error(`Cannot set tokens provider for unknown language ${languageId}`);
424
}
425
if (isThenable<TokensProvider | EncodedTokensProvider>(provider)) {
426
return registerTokensProviderFactory(languageId, { create: () => provider });
427
}
428
return languages.TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider));
429
}
430
431
/**
432
* Set the tokens provider for a language (monarch implementation). This tokenizer will be exclusive
433
* with a tokenizer set using `setTokensProvider`, or with `registerTokensProviderFactory`, but will
434
* work together with a tokens provider set using `registerDocumentSemanticTokensProvider` or
435
* `registerDocumentRangeSemanticTokensProvider`.
436
*/
437
export function setMonarchTokensProvider(languageId: string, languageDef: IMonarchLanguage | Thenable<IMonarchLanguage>): IDisposable {
438
const create = (languageDef: IMonarchLanguage) => {
439
return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, languageDef), StandaloneServices.get(IConfigurationService));
440
};
441
if (isThenable<IMonarchLanguage>(languageDef)) {
442
return registerTokensProviderFactory(languageId, { create: () => languageDef });
443
}
444
return languages.TokenizationRegistry.register(languageId, create(languageDef));
445
}
446
447
/**
448
* Register a reference provider (used by e.g. reference search).
449
*/
450
export function registerReferenceProvider(languageSelector: LanguageSelector, provider: languages.ReferenceProvider): IDisposable {
451
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
452
return languageFeaturesService.referenceProvider.register(languageSelector, provider);
453
}
454
455
/**
456
* Register a rename provider (used by e.g. rename symbol).
457
*/
458
export function registerRenameProvider(languageSelector: LanguageSelector, provider: languages.RenameProvider): IDisposable {
459
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
460
return languageFeaturesService.renameProvider.register(languageSelector, provider);
461
}
462
463
/**
464
* Register a new symbol-name provider (e.g., when a symbol is being renamed, show new possible symbol-names)
465
*/
466
export function registerNewSymbolNameProvider(languageSelector: LanguageSelector, provider: languages.NewSymbolNamesProvider): IDisposable {
467
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
468
return languageFeaturesService.newSymbolNamesProvider.register(languageSelector, provider);
469
}
470
471
/**
472
* Register a signature help provider (used by e.g. parameter hints).
473
*/
474
export function registerSignatureHelpProvider(languageSelector: LanguageSelector, provider: languages.SignatureHelpProvider): IDisposable {
475
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
476
return languageFeaturesService.signatureHelpProvider.register(languageSelector, provider);
477
}
478
479
/**
480
* Register a hover provider (used by e.g. editor hover).
481
*/
482
export function registerHoverProvider(languageSelector: LanguageSelector, provider: languages.HoverProvider): IDisposable {
483
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
484
return languageFeaturesService.hoverProvider.register(languageSelector, {
485
provideHover: async (model: model.ITextModel, position: Position, token: CancellationToken, context?: languages.HoverContext<languages.Hover>): Promise<languages.Hover | undefined> => {
486
const word = model.getWordAtPosition(position);
487
488
return Promise.resolve<languages.Hover | null | undefined>(provider.provideHover(model, position, token, context)).then((value): languages.Hover | undefined => {
489
if (!value) {
490
return undefined;
491
}
492
if (!value.range && word) {
493
value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);
494
}
495
if (!value.range) {
496
value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);
497
}
498
return value;
499
});
500
}
501
});
502
}
503
504
/**
505
* Register a document symbol provider (used by e.g. outline).
506
*/
507
export function registerDocumentSymbolProvider(languageSelector: LanguageSelector, provider: languages.DocumentSymbolProvider): IDisposable {
508
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
509
return languageFeaturesService.documentSymbolProvider.register(languageSelector, provider);
510
}
511
512
/**
513
* Register a document highlight provider (used by e.g. highlight occurrences).
514
*/
515
export function registerDocumentHighlightProvider(languageSelector: LanguageSelector, provider: languages.DocumentHighlightProvider): IDisposable {
516
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
517
return languageFeaturesService.documentHighlightProvider.register(languageSelector, provider);
518
}
519
520
/**
521
* Register an linked editing range provider.
522
*/
523
export function registerLinkedEditingRangeProvider(languageSelector: LanguageSelector, provider: languages.LinkedEditingRangeProvider): IDisposable {
524
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
525
return languageFeaturesService.linkedEditingRangeProvider.register(languageSelector, provider);
526
}
527
528
/**
529
* Register a definition provider (used by e.g. go to definition).
530
*/
531
export function registerDefinitionProvider(languageSelector: LanguageSelector, provider: languages.DefinitionProvider): IDisposable {
532
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
533
return languageFeaturesService.definitionProvider.register(languageSelector, provider);
534
}
535
536
/**
537
* Register a implementation provider (used by e.g. go to implementation).
538
*/
539
export function registerImplementationProvider(languageSelector: LanguageSelector, provider: languages.ImplementationProvider): IDisposable {
540
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
541
return languageFeaturesService.implementationProvider.register(languageSelector, provider);
542
}
543
544
/**
545
* Register a type definition provider (used by e.g. go to type definition).
546
*/
547
export function registerTypeDefinitionProvider(languageSelector: LanguageSelector, provider: languages.TypeDefinitionProvider): IDisposable {
548
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
549
return languageFeaturesService.typeDefinitionProvider.register(languageSelector, provider);
550
}
551
552
/**
553
* Register a code lens provider (used by e.g. inline code lenses).
554
*/
555
export function registerCodeLensProvider(languageSelector: LanguageSelector, provider: languages.CodeLensProvider): IDisposable {
556
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
557
return languageFeaturesService.codeLensProvider.register(languageSelector, provider);
558
}
559
560
/**
561
* Register a code action provider (used by e.g. quick fix).
562
*/
563
export function registerCodeActionProvider(languageSelector: LanguageSelector, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): IDisposable {
564
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
565
return languageFeaturesService.codeActionProvider.register(languageSelector, {
566
providedCodeActionKinds: metadata?.providedCodeActionKinds,
567
documentation: metadata?.documentation,
568
provideCodeActions: (model: model.ITextModel, range: Range, context: languages.CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList> => {
569
const markerService = StandaloneServices.get(IMarkerService);
570
const markers = markerService.read({ resource: model.uri }).filter(m => {
571
return Range.areIntersectingOrTouching(m, range);
572
});
573
return provider.provideCodeActions(model, range, { markers, only: context.only, trigger: context.trigger }, token);
574
},
575
resolveCodeAction: provider.resolveCodeAction
576
});
577
}
578
579
/**
580
* Register a formatter that can handle only entire models.
581
*/
582
export function registerDocumentFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentFormattingEditProvider): IDisposable {
583
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
584
return languageFeaturesService.documentFormattingEditProvider.register(languageSelector, provider);
585
}
586
587
/**
588
* Register a formatter that can handle a range inside a model.
589
*/
590
export function registerDocumentRangeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeFormattingEditProvider): IDisposable {
591
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
592
return languageFeaturesService.documentRangeFormattingEditProvider.register(languageSelector, provider);
593
}
594
595
/**
596
* Register a formatter than can do formatting as the user types.
597
*/
598
export function registerOnTypeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.OnTypeFormattingEditProvider): IDisposable {
599
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
600
return languageFeaturesService.onTypeFormattingEditProvider.register(languageSelector, provider);
601
}
602
603
/**
604
* Register a link provider that can find links in text.
605
*/
606
export function registerLinkProvider(languageSelector: LanguageSelector, provider: languages.LinkProvider): IDisposable {
607
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
608
return languageFeaturesService.linkProvider.register(languageSelector, provider);
609
}
610
611
/**
612
* Register a completion item provider (use by e.g. suggestions).
613
*/
614
export function registerCompletionItemProvider(languageSelector: LanguageSelector, provider: languages.CompletionItemProvider): IDisposable {
615
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
616
return languageFeaturesService.completionProvider.register(languageSelector, provider);
617
}
618
619
/**
620
* Register a document color provider (used by Color Picker, Color Decorator).
621
*/
622
export function registerColorProvider(languageSelector: LanguageSelector, provider: languages.DocumentColorProvider): IDisposable {
623
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
624
return languageFeaturesService.colorProvider.register(languageSelector, provider);
625
}
626
627
/**
628
* Register a folding range provider
629
*/
630
export function registerFoldingRangeProvider(languageSelector: LanguageSelector, provider: languages.FoldingRangeProvider): IDisposable {
631
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
632
return languageFeaturesService.foldingRangeProvider.register(languageSelector, provider);
633
}
634
635
/**
636
* Register a declaration provider
637
*/
638
export function registerDeclarationProvider(languageSelector: LanguageSelector, provider: languages.DeclarationProvider): IDisposable {
639
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
640
return languageFeaturesService.declarationProvider.register(languageSelector, provider);
641
}
642
643
/**
644
* Register a selection range provider
645
*/
646
export function registerSelectionRangeProvider(languageSelector: LanguageSelector, provider: languages.SelectionRangeProvider): IDisposable {
647
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
648
return languageFeaturesService.selectionRangeProvider.register(languageSelector, provider);
649
}
650
651
/**
652
* Register a document semantic tokens provider. A semantic tokens provider will complement and enhance a
653
* simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`
654
* or `setTokensProvider`.
655
*
656
* For the best user experience, register both a semantic tokens provider and a top-down tokenizer.
657
*/
658
export function registerDocumentSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentSemanticTokensProvider): IDisposable {
659
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
660
return languageFeaturesService.documentSemanticTokensProvider.register(languageSelector, provider);
661
}
662
663
/**
664
* Register a document range semantic tokens provider. A semantic tokens provider will complement and enhance a
665
* simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`
666
* or `setTokensProvider`.
667
*
668
* For the best user experience, register both a semantic tokens provider and a top-down tokenizer.
669
*/
670
export function registerDocumentRangeSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeSemanticTokensProvider): IDisposable {
671
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
672
return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageSelector, provider);
673
}
674
675
/**
676
* Register an inline completions provider.
677
*/
678
export function registerInlineCompletionsProvider(languageSelector: LanguageSelector, provider: languages.InlineCompletionsProvider): IDisposable {
679
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
680
return languageFeaturesService.inlineCompletionsProvider.register(languageSelector, provider);
681
}
682
683
/**
684
* Register an inlay hints provider.
685
*/
686
export function registerInlayHintsProvider(languageSelector: LanguageSelector, provider: languages.InlayHintsProvider): IDisposable {
687
const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);
688
return languageFeaturesService.inlayHintsProvider.register(languageSelector, provider);
689
}
690
691
/**
692
* Contains additional diagnostic information about the context in which
693
* a [code action](#CodeActionProvider.provideCodeActions) is run.
694
*/
695
export interface CodeActionContext {
696
697
/**
698
* An array of diagnostics.
699
*/
700
readonly markers: IMarkerData[];
701
702
/**
703
* Requested kind of actions to return.
704
*/
705
readonly only?: string;
706
707
/**
708
* The reason why code actions were requested.
709
*/
710
readonly trigger: languages.CodeActionTriggerType;
711
}
712
713
/**
714
* The code action interface defines the contract between extensions and
715
* the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature.
716
*/
717
export interface CodeActionProvider {
718
/**
719
* Provide commands for the given document and range.
720
*/
721
provideCodeActions(model: model.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList>;
722
723
/**
724
* Given a code action fill in the edit. Will only invoked when missing.
725
*/
726
resolveCodeAction?(codeAction: languages.CodeAction, token: CancellationToken): languages.ProviderResult<languages.CodeAction>;
727
}
728
729
730
731
/**
732
* Metadata about the type of code actions that a {@link CodeActionProvider} provides.
733
*/
734
export interface CodeActionProviderMetadata {
735
/**
736
* List of code action kinds that a {@link CodeActionProvider} may return.
737
*
738
* This list is used to determine if a given `CodeActionProvider` should be invoked or not.
739
* To avoid unnecessary computation, every `CodeActionProvider` should list use `providedCodeActionKinds`. The
740
* list of kinds may either be generic, such as `["quickfix", "refactor", "source"]`, or list out every kind provided,
741
* such as `["quickfix.removeLine", "source.fixAll" ...]`.
742
*/
743
readonly providedCodeActionKinds?: readonly string[];
744
745
readonly documentation?: ReadonlyArray<{ readonly kind: string; readonly command: languages.Command }>;
746
}
747
748
/**
749
* @internal
750
*/
751
export function createMonacoLanguagesAPI(): typeof monaco.languages {
752
return {
753
// eslint-disable-next-line local/code-no-any-casts
754
register: <any>register,
755
// eslint-disable-next-line local/code-no-any-casts
756
getLanguages: <any>getLanguages,
757
// eslint-disable-next-line local/code-no-any-casts
758
onLanguage: <any>onLanguage,
759
// eslint-disable-next-line local/code-no-any-casts
760
onLanguageEncountered: <any>onLanguageEncountered,
761
// eslint-disable-next-line local/code-no-any-casts
762
getEncodedLanguageId: <any>getEncodedLanguageId,
763
764
// provider methods
765
// eslint-disable-next-line local/code-no-any-casts
766
setLanguageConfiguration: <any>setLanguageConfiguration,
767
setColorMap: setColorMap,
768
// eslint-disable-next-line local/code-no-any-casts
769
registerTokensProviderFactory: <any>registerTokensProviderFactory,
770
// eslint-disable-next-line local/code-no-any-casts
771
setTokensProvider: <any>setTokensProvider,
772
// eslint-disable-next-line local/code-no-any-casts
773
setMonarchTokensProvider: <any>setMonarchTokensProvider,
774
// eslint-disable-next-line local/code-no-any-casts
775
registerReferenceProvider: <any>registerReferenceProvider,
776
// eslint-disable-next-line local/code-no-any-casts
777
registerRenameProvider: <any>registerRenameProvider,
778
// eslint-disable-next-line local/code-no-any-casts
779
registerNewSymbolNameProvider: <any>registerNewSymbolNameProvider,
780
// eslint-disable-next-line local/code-no-any-casts
781
registerCompletionItemProvider: <any>registerCompletionItemProvider,
782
// eslint-disable-next-line local/code-no-any-casts
783
registerSignatureHelpProvider: <any>registerSignatureHelpProvider,
784
// eslint-disable-next-line local/code-no-any-casts
785
registerHoverProvider: <any>registerHoverProvider,
786
// eslint-disable-next-line local/code-no-any-casts
787
registerDocumentSymbolProvider: <any>registerDocumentSymbolProvider,
788
// eslint-disable-next-line local/code-no-any-casts
789
registerDocumentHighlightProvider: <any>registerDocumentHighlightProvider,
790
// eslint-disable-next-line local/code-no-any-casts
791
registerLinkedEditingRangeProvider: <any>registerLinkedEditingRangeProvider,
792
// eslint-disable-next-line local/code-no-any-casts
793
registerDefinitionProvider: <any>registerDefinitionProvider,
794
// eslint-disable-next-line local/code-no-any-casts
795
registerImplementationProvider: <any>registerImplementationProvider,
796
// eslint-disable-next-line local/code-no-any-casts
797
registerTypeDefinitionProvider: <any>registerTypeDefinitionProvider,
798
// eslint-disable-next-line local/code-no-any-casts
799
registerCodeLensProvider: <any>registerCodeLensProvider,
800
// eslint-disable-next-line local/code-no-any-casts
801
registerCodeActionProvider: <any>registerCodeActionProvider,
802
// eslint-disable-next-line local/code-no-any-casts
803
registerDocumentFormattingEditProvider: <any>registerDocumentFormattingEditProvider,
804
// eslint-disable-next-line local/code-no-any-casts
805
registerDocumentRangeFormattingEditProvider: <any>registerDocumentRangeFormattingEditProvider,
806
// eslint-disable-next-line local/code-no-any-casts
807
registerOnTypeFormattingEditProvider: <any>registerOnTypeFormattingEditProvider,
808
// eslint-disable-next-line local/code-no-any-casts
809
registerLinkProvider: <any>registerLinkProvider,
810
// eslint-disable-next-line local/code-no-any-casts
811
registerColorProvider: <any>registerColorProvider,
812
// eslint-disable-next-line local/code-no-any-casts
813
registerFoldingRangeProvider: <any>registerFoldingRangeProvider,
814
// eslint-disable-next-line local/code-no-any-casts
815
registerDeclarationProvider: <any>registerDeclarationProvider,
816
// eslint-disable-next-line local/code-no-any-casts
817
registerSelectionRangeProvider: <any>registerSelectionRangeProvider,
818
// eslint-disable-next-line local/code-no-any-casts
819
registerDocumentSemanticTokensProvider: <any>registerDocumentSemanticTokensProvider,
820
// eslint-disable-next-line local/code-no-any-casts
821
registerDocumentRangeSemanticTokensProvider: <any>registerDocumentRangeSemanticTokensProvider,
822
// eslint-disable-next-line local/code-no-any-casts
823
registerInlineCompletionsProvider: <any>registerInlineCompletionsProvider,
824
// eslint-disable-next-line local/code-no-any-casts
825
registerInlayHintsProvider: <any>registerInlayHintsProvider,
826
827
// enums
828
DocumentHighlightKind: standaloneEnums.DocumentHighlightKind,
829
CompletionItemKind: standaloneEnums.CompletionItemKind,
830
CompletionItemTag: standaloneEnums.CompletionItemTag,
831
CompletionItemInsertTextRule: standaloneEnums.CompletionItemInsertTextRule,
832
SymbolKind: standaloneEnums.SymbolKind,
833
SymbolTag: standaloneEnums.SymbolTag,
834
IndentAction: standaloneEnums.IndentAction,
835
CompletionTriggerKind: standaloneEnums.CompletionTriggerKind,
836
SignatureHelpTriggerKind: standaloneEnums.SignatureHelpTriggerKind,
837
InlayHintKind: standaloneEnums.InlayHintKind,
838
InlineCompletionTriggerKind: standaloneEnums.InlineCompletionTriggerKind,
839
CodeActionTriggerType: standaloneEnums.CodeActionTriggerType,
840
NewSymbolNameTag: standaloneEnums.NewSymbolNameTag,
841
NewSymbolNameTriggerKind: standaloneEnums.NewSymbolNameTriggerKind,
842
PartialAcceptTriggerKind: standaloneEnums.PartialAcceptTriggerKind,
843
HoverVerbosityAction: standaloneEnums.HoverVerbosityAction,
844
InlineCompletionEndOfLifeReasonKind: standaloneEnums.InlineCompletionEndOfLifeReasonKind,
845
InlineCompletionHintStyle: standaloneEnums.InlineCompletionHintStyle,
846
847
// classes
848
FoldingRangeKind: languages.FoldingRangeKind,
849
// eslint-disable-next-line local/code-no-any-casts
850
SelectedSuggestionInfo: <any>languages.SelectedSuggestionInfo,
851
// eslint-disable-next-line local/code-no-any-casts
852
EditDeltaInfo: <any>EditDeltaInfo,
853
};
854
}
855
856