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