Path: blob/main/src/vs/editor/standalone/browser/standaloneLanguages.ts
5241 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { CancellationToken } from '../../../base/common/cancellation.js';6import { Color } from '../../../base/common/color.js';7import { IDisposable } from '../../../base/common/lifecycle.js';8import { Position } from '../../common/core/position.js';9import { Range } from '../../common/core/range.js';10import { MetadataConsts } from '../../common/encodedTokenAttributes.js';11import * as languages from '../../common/languages.js';12import { ILanguageExtensionPoint, ILanguageService } from '../../common/languages/language.js';13import { LanguageConfiguration } from '../../common/languages/languageConfiguration.js';14import { ILanguageConfigurationService } from '../../common/languages/languageConfigurationRegistry.js';15import { ModesRegistry } from '../../common/languages/modesRegistry.js';16import { LanguageSelector } from '../../common/languageSelector.js';17import * as model from '../../common/model.js';18import { ILanguageFeaturesService } from '../../common/services/languageFeatures.js';19import * as standaloneEnums from '../../common/standalone/standaloneEnums.js';20import { StandaloneServices } from './standaloneServices.js';21import { compile } from '../common/monarch/monarchCompile.js';22import { MonarchTokenizer } from '../common/monarch/monarchLexer.js';23import { IMonarchLanguage } from '../common/monarch/monarchTypes.js';24import { IStandaloneThemeService } from '../common/standaloneTheme.js';25import { IConfigurationService } from '../../../platform/configuration/common/configuration.js';26import { IMarkerData, IMarkerService } from '../../../platform/markers/common/markers.js';27import { EditDeltaInfo } from '../../common/textModelEditSource.js';2829/**30* Register information about a new language.31*/32export function register(language: ILanguageExtensionPoint): void {33// Intentionally using the `ModesRegistry` here to avoid34// instantiating services too quickly in the standalone editor.35ModesRegistry.registerLanguage(language);36}3738/**39* Get the information of all the registered languages.40*/41export function getLanguages(): ILanguageExtensionPoint[] {42let result: ILanguageExtensionPoint[] = [];43result = result.concat(ModesRegistry.getLanguages());44return result;45}4647export function getEncodedLanguageId(languageId: string): number {48const languageService = StandaloneServices.get(ILanguageService);49return languageService.languageIdCodec.encodeLanguageId(languageId);50}5152/**53* An event emitted when a language is associated for the first time with a text model.54* @event55*/56export function onLanguage(languageId: string, callback: () => void): IDisposable {57return StandaloneServices.withServices(() => {58const languageService = StandaloneServices.get(ILanguageService);59const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {60if (encounteredLanguageId === languageId) {61// stop listening62disposable.dispose();63// invoke actual listener64callback();65}66});67return disposable;68});69}7071/**72* An event emitted when a language is associated for the first time with a text model or73* when a language is encountered during the tokenization of another language.74* @event75*/76export function onLanguageEncountered(languageId: string, callback: () => void): IDisposable {77return StandaloneServices.withServices(() => {78const languageService = StandaloneServices.get(ILanguageService);79const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {80if (encounteredLanguageId === languageId) {81// stop listening82disposable.dispose();83// invoke actual listener84callback();85}86});87return disposable;88});89}9091/**92* Set the editing configuration for a language.93*/94export function setLanguageConfiguration(languageId: string, configuration: LanguageConfiguration): IDisposable {95const languageService = StandaloneServices.get(ILanguageService);96if (!languageService.isRegisteredLanguageId(languageId)) {97throw new Error(`Cannot set configuration for unknown language ${languageId}`);98}99const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService);100return languageConfigurationService.register(languageId, configuration, 100);101}102103/**104* @internal105*/106export class EncodedTokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {107108private readonly _languageId: string;109private readonly _actual: EncodedTokensProvider;110111constructor(languageId: string, actual: EncodedTokensProvider) {112this._languageId = languageId;113this._actual = actual;114}115116dispose(): void {117// NOOP118}119120public getInitialState(): languages.IState {121return this._actual.getInitialState();122}123124public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {125if (typeof this._actual.tokenize === 'function') {126return TokenizationSupportAdapter.adaptTokenize(this._languageId, <{ tokenize(line: string, state: languages.IState): ILineTokens }>this._actual, line, state);127}128throw new Error('Not supported!');129}130131public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {132const result = this._actual.tokenizeEncoded(line, state);133return new languages.EncodedTokenizationResult(result.tokens, [], result.endState);134}135}136137/**138* @internal139*/140export class TokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {141142constructor(143private readonly _languageId: string,144private readonly _actual: TokensProvider,145private readonly _languageService: ILanguageService,146private readonly _standaloneThemeService: IStandaloneThemeService,147) {148}149150dispose(): void {151// NOOP152}153154public getInitialState(): languages.IState {155return this._actual.getInitialState();156}157158private static _toClassicTokens(tokens: IToken[], language: string): languages.Token[] {159const result: languages.Token[] = [];160let previousStartIndex: number = 0;161for (let i = 0, len = tokens.length; i < len; i++) {162const t = tokens[i];163let startIndex = t.startIndex;164165// Prevent issues stemming from a buggy external tokenizer.166if (i === 0) {167// Force first token to start at first index!168startIndex = 0;169} else if (startIndex < previousStartIndex) {170// Force tokens to be after one another!171startIndex = previousStartIndex;172}173174result[i] = new languages.Token(startIndex, t.scopes, language);175176previousStartIndex = startIndex;177}178return result;179}180181public static adaptTokenize(language: string, actual: { tokenize(line: string, state: languages.IState): ILineTokens }, line: string, state: languages.IState): languages.TokenizationResult {182const actualResult = actual.tokenize(line, state);183const tokens = TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language);184185let endState: languages.IState;186// try to save an object if possible187if (actualResult.endState.equals(state)) {188endState = state;189} else {190endState = actualResult.endState;191}192193return new languages.TokenizationResult(tokens, endState);194}195196public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {197return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state);198}199200private _toBinaryTokens(languageIdCodec: languages.ILanguageIdCodec, tokens: IToken[]): Uint32Array {201const languageId = languageIdCodec.encodeLanguageId(this._languageId);202const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme;203204const result: number[] = [];205let resultLen = 0;206let previousStartIndex: number = 0;207for (let i = 0, len = tokens.length; i < len; i++) {208const t = tokens[i];209const metadata = tokenTheme.match(languageId, t.scopes) | MetadataConsts.BALANCED_BRACKETS_MASK;210if (resultLen > 0 && result[resultLen - 1] === metadata) {211// same metadata212continue;213}214215let startIndex = t.startIndex;216217// Prevent issues stemming from a buggy external tokenizer.218if (i === 0) {219// Force first token to start at first index!220startIndex = 0;221} else if (startIndex < previousStartIndex) {222// Force tokens to be after one another!223startIndex = previousStartIndex;224}225226result[resultLen++] = startIndex;227result[resultLen++] = metadata;228229previousStartIndex = startIndex;230}231232const actualResult = new Uint32Array(resultLen);233for (let i = 0; i < resultLen; i++) {234actualResult[i] = result[i];235}236return actualResult;237}238239public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {240const actualResult = this._actual.tokenize(line, state);241const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens);242243let endState: languages.IState;244// try to save an object if possible245if (actualResult.endState.equals(state)) {246endState = state;247} else {248endState = actualResult.endState;249}250251return new languages.EncodedTokenizationResult(tokens, [], endState);252}253}254255/**256* A token.257*/258export interface IToken {259startIndex: number;260scopes: string;261}262263/**264* The result of a line tokenization.265*/266export interface ILineTokens {267/**268* The list of tokens on the line.269*/270tokens: 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*/275endState: languages.IState;276}277278/**279* The result of a line tokenization.280*/281export 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 => startIndex285* - at offset 2*i + 1 => metadata286* Meta data is in binary format:287* - -------------------------------------------288* 3322 2222 2222 1111 1111 1100 0000 0000289* 1098 7654 3210 9876 5432 1098 7654 3210290* - -------------------------------------------291* bbbb bbbb bfff ffff ffFF FFTT LLLL LLLL292* - -------------------------------------------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*/302tokens: 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*/307endState: languages.IState;308}309310/**311* A factory for token providers.312*/313export interface TokensProviderFactory {314create(): languages.ProviderResult<TokensProvider | EncodedTokensProvider | IMonarchLanguage>;315}316317/**318* A "manual" provider of tokens.319*/320export interface TokensProvider {321/**322* The initial state of a language. Will be the state passed in to tokenize the first line.323*/324getInitialState(): languages.IState;325/**326* Tokenize a line given the state at the beginning of the line.327*/328tokenize(line: string, state: languages.IState): ILineTokens;329}330331/**332* A "manual" provider of tokens, returning tokens in a binary form.333*/334export interface EncodedTokensProvider {335/**336* The initial state of a language. Will be the state passed in to tokenize the first line.337*/338getInitialState(): languages.IState;339/**340* Tokenize a line given the state at the beginning of the line.341*/342tokenizeEncoded(line: string, state: languages.IState): IEncodedLineTokens;343/**344* Tokenize a line given the state at the beginning of the line.345*/346tokenize?(line: string, state: languages.IState): ILineTokens;347}348349function isATokensProvider(provider: TokensProvider | EncodedTokensProvider | IMonarchLanguage): provider is TokensProvider | EncodedTokensProvider {350return (typeof provider.getInitialState === 'function');351}352353function isEncodedTokensProvider(provider: TokensProvider | EncodedTokensProvider): provider is EncodedTokensProvider {354return 'tokenizeEncoded' in provider;355}356357function isThenable<T>(obj: any): obj is Thenable<T> {358return obj && typeof obj.then === 'function';359}360361/**362* Change the color map that is used for token colors.363* Supported formats (hex): #RRGGBB, $RRGGBBAA, #RGB, #RGBA364*/365export function setColorMap(colorMap: string[] | null): void {366const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);367if (colorMap) {368const result: Color[] = [null!];369for (let i = 1, len = colorMap.length; i < len; i++) {370result[i] = Color.fromHex(colorMap[i]);371}372standaloneThemeService.setColorMapOverride(result);373} else {374standaloneThemeService.setColorMapOverride(null);375}376}377378/**379* @internal380*/381function createTokenizationSupportAdapter(languageId: string, provider: TokensProvider | EncodedTokensProvider) {382if (isEncodedTokensProvider(provider)) {383return new EncodedTokenizationSupportAdapter(languageId, provider);384} else {385return new TokenizationSupportAdapter(386languageId,387provider,388StandaloneServices.get(ILanguageService),389StandaloneServices.get(IStandaloneThemeService),390);391}392}393394/**395* Register a tokens provider factory for a language. This tokenizer will be exclusive with a tokenizer396* set using `setTokensProvider` or one created using `setMonarchTokensProvider`, but will work together397* with a tokens provider set using `registerDocumentSemanticTokensProvider` or `registerDocumentRangeSemanticTokensProvider`.398*/399export function registerTokensProviderFactory(languageId: string, factory: TokensProviderFactory): IDisposable {400const adaptedFactory = new languages.LazyTokenizationSupport(async () => {401const result = await Promise.resolve(factory.create());402if (!result) {403return null;404}405if (isATokensProvider(result)) {406return createTokenizationSupportAdapter(languageId, result);407}408return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result), StandaloneServices.get(IConfigurationService));409});410return languages.TokenizationRegistry.registerFactory(languageId, adaptedFactory);411}412413/**414* Set the tokens provider for a language (manual implementation). This tokenizer will be exclusive415* 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*/419export function setTokensProvider(languageId: string, provider: TokensProvider | EncodedTokensProvider | Thenable<TokensProvider | EncodedTokensProvider>): IDisposable {420const languageService = StandaloneServices.get(ILanguageService);421if (!languageService.isRegisteredLanguageId(languageId)) {422throw new Error(`Cannot set tokens provider for unknown language ${languageId}`);423}424if (isThenable<TokensProvider | EncodedTokensProvider>(provider)) {425return registerTokensProviderFactory(languageId, { create: () => provider });426}427return languages.TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider));428}429430/**431* Set the tokens provider for a language (monarch implementation). This tokenizer will be exclusive432* with a tokenizer set using `setTokensProvider`, or with `registerTokensProviderFactory`, but will433* work together with a tokens provider set using `registerDocumentSemanticTokensProvider` or434* `registerDocumentRangeSemanticTokensProvider`.435*/436export function setMonarchTokensProvider(languageId: string, languageDef: IMonarchLanguage | Thenable<IMonarchLanguage>): IDisposable {437const create = (languageDef: IMonarchLanguage) => {438return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, languageDef), StandaloneServices.get(IConfigurationService));439};440if (isThenable<IMonarchLanguage>(languageDef)) {441return registerTokensProviderFactory(languageId, { create: () => languageDef });442}443return languages.TokenizationRegistry.register(languageId, create(languageDef));444}445446/**447* Register a reference provider (used by e.g. reference search).448*/449export function registerReferenceProvider(languageSelector: LanguageSelector, provider: languages.ReferenceProvider): IDisposable {450const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);451return languageFeaturesService.referenceProvider.register(languageSelector, provider);452}453454/**455* Register a rename provider (used by e.g. rename symbol).456*/457export function registerRenameProvider(languageSelector: LanguageSelector, provider: languages.RenameProvider): IDisposable {458const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);459return languageFeaturesService.renameProvider.register(languageSelector, provider);460}461462/**463* Register a new symbol-name provider (e.g., when a symbol is being renamed, show new possible symbol-names)464*/465export function registerNewSymbolNameProvider(languageSelector: LanguageSelector, provider: languages.NewSymbolNamesProvider): IDisposable {466const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);467return languageFeaturesService.newSymbolNamesProvider.register(languageSelector, provider);468}469470/**471* Register a signature help provider (used by e.g. parameter hints).472*/473export function registerSignatureHelpProvider(languageSelector: LanguageSelector, provider: languages.SignatureHelpProvider): IDisposable {474const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);475return languageFeaturesService.signatureHelpProvider.register(languageSelector, provider);476}477478/**479* Register a hover provider (used by e.g. editor hover).480*/481export function registerHoverProvider(languageSelector: LanguageSelector, provider: languages.HoverProvider): IDisposable {482const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);483return languageFeaturesService.hoverProvider.register(languageSelector, {484provideHover: async (model: model.ITextModel, position: Position, token: CancellationToken, context?: languages.HoverContext<languages.Hover>): Promise<languages.Hover | undefined> => {485const word = model.getWordAtPosition(position);486487return Promise.resolve<languages.Hover | null | undefined>(provider.provideHover(model, position, token, context)).then((value): languages.Hover | undefined => {488if (!value) {489return undefined;490}491if (!value.range && word) {492value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);493}494if (!value.range) {495value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);496}497return value;498});499}500});501}502503/**504* Register a document symbol provider (used by e.g. outline).505*/506export function registerDocumentSymbolProvider(languageSelector: LanguageSelector, provider: languages.DocumentSymbolProvider): IDisposable {507const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);508return languageFeaturesService.documentSymbolProvider.register(languageSelector, provider);509}510511/**512* Register a document highlight provider (used by e.g. highlight occurrences).513*/514export function registerDocumentHighlightProvider(languageSelector: LanguageSelector, provider: languages.DocumentHighlightProvider): IDisposable {515const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);516return languageFeaturesService.documentHighlightProvider.register(languageSelector, provider);517}518519/**520* Register an linked editing range provider.521*/522export function registerLinkedEditingRangeProvider(languageSelector: LanguageSelector, provider: languages.LinkedEditingRangeProvider): IDisposable {523const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);524return languageFeaturesService.linkedEditingRangeProvider.register(languageSelector, provider);525}526527/**528* Register a definition provider (used by e.g. go to definition).529*/530export function registerDefinitionProvider(languageSelector: LanguageSelector, provider: languages.DefinitionProvider): IDisposable {531const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);532return languageFeaturesService.definitionProvider.register(languageSelector, provider);533}534535/**536* Register a implementation provider (used by e.g. go to implementation).537*/538export function registerImplementationProvider(languageSelector: LanguageSelector, provider: languages.ImplementationProvider): IDisposable {539const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);540return languageFeaturesService.implementationProvider.register(languageSelector, provider);541}542543/**544* Register a type definition provider (used by e.g. go to type definition).545*/546export function registerTypeDefinitionProvider(languageSelector: LanguageSelector, provider: languages.TypeDefinitionProvider): IDisposable {547const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);548return languageFeaturesService.typeDefinitionProvider.register(languageSelector, provider);549}550551/**552* Register a code lens provider (used by e.g. inline code lenses).553*/554export function registerCodeLensProvider(languageSelector: LanguageSelector, provider: languages.CodeLensProvider): IDisposable {555const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);556return languageFeaturesService.codeLensProvider.register(languageSelector, provider);557}558559/**560* Register a code action provider (used by e.g. quick fix).561*/562export function registerCodeActionProvider(languageSelector: LanguageSelector, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): IDisposable {563const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);564return languageFeaturesService.codeActionProvider.register(languageSelector, {565providedCodeActionKinds: metadata?.providedCodeActionKinds,566documentation: metadata?.documentation,567provideCodeActions: (model: model.ITextModel, range: Range, context: languages.CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList> => {568const markerService = StandaloneServices.get(IMarkerService);569const markers = markerService.read({ resource: model.uri }).filter(m => {570return Range.areIntersectingOrTouching(m, range);571});572return provider.provideCodeActions(model, range, { markers, only: context.only, trigger: context.trigger }, token);573},574resolveCodeAction: provider.resolveCodeAction575});576}577578/**579* Register a formatter that can handle only entire models.580*/581export function registerDocumentFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentFormattingEditProvider): IDisposable {582const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);583return languageFeaturesService.documentFormattingEditProvider.register(languageSelector, provider);584}585586/**587* Register a formatter that can handle a range inside a model.588*/589export function registerDocumentRangeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeFormattingEditProvider): IDisposable {590const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);591return languageFeaturesService.documentRangeFormattingEditProvider.register(languageSelector, provider);592}593594/**595* Register a formatter than can do formatting as the user types.596*/597export function registerOnTypeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.OnTypeFormattingEditProvider): IDisposable {598const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);599return languageFeaturesService.onTypeFormattingEditProvider.register(languageSelector, provider);600}601602/**603* Register a link provider that can find links in text.604*/605export function registerLinkProvider(languageSelector: LanguageSelector, provider: languages.LinkProvider): IDisposable {606const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);607return languageFeaturesService.linkProvider.register(languageSelector, provider);608}609610/**611* Register a completion item provider (use by e.g. suggestions).612*/613export function registerCompletionItemProvider(languageSelector: LanguageSelector, provider: languages.CompletionItemProvider): IDisposable {614const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);615return languageFeaturesService.completionProvider.register(languageSelector, provider);616}617618/**619* Register a document color provider (used by Color Picker, Color Decorator).620*/621export function registerColorProvider(languageSelector: LanguageSelector, provider: languages.DocumentColorProvider): IDisposable {622const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);623return languageFeaturesService.colorProvider.register(languageSelector, provider);624}625626/**627* Register a folding range provider628*/629export function registerFoldingRangeProvider(languageSelector: LanguageSelector, provider: languages.FoldingRangeProvider): IDisposable {630const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);631return languageFeaturesService.foldingRangeProvider.register(languageSelector, provider);632}633634/**635* Register a declaration provider636*/637export function registerDeclarationProvider(languageSelector: LanguageSelector, provider: languages.DeclarationProvider): IDisposable {638const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);639return languageFeaturesService.declarationProvider.register(languageSelector, provider);640}641642/**643* Register a selection range provider644*/645export function registerSelectionRangeProvider(languageSelector: LanguageSelector, provider: languages.SelectionRangeProvider): IDisposable {646const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);647return languageFeaturesService.selectionRangeProvider.register(languageSelector, provider);648}649650/**651* Register a document semantic tokens provider. A semantic tokens provider will complement and enhance a652* 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*/657export function registerDocumentSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentSemanticTokensProvider): IDisposable {658const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);659return languageFeaturesService.documentSemanticTokensProvider.register(languageSelector, provider);660}661662/**663* Register a document range semantic tokens provider. A semantic tokens provider will complement and enhance a664* 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*/669export function registerDocumentRangeSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeSemanticTokensProvider): IDisposable {670const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);671return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageSelector, provider);672}673674/**675* Register an inline completions provider.676*/677export function registerInlineCompletionsProvider(languageSelector: LanguageSelector, provider: languages.InlineCompletionsProvider): IDisposable {678const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);679return languageFeaturesService.inlineCompletionsProvider.register(languageSelector, provider);680}681682/**683* Register an inlay hints provider.684*/685export function registerInlayHintsProvider(languageSelector: LanguageSelector, provider: languages.InlayHintsProvider): IDisposable {686const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);687return languageFeaturesService.inlayHintsProvider.register(languageSelector, provider);688}689690/**691* Contains additional diagnostic information about the context in which692* a [code action](#CodeActionProvider.provideCodeActions) is run.693*/694export interface CodeActionContext {695696/**697* An array of diagnostics.698*/699readonly markers: IMarkerData[];700701/**702* Requested kind of actions to return.703*/704readonly only?: string;705706/**707* The reason why code actions were requested.708*/709readonly trigger: languages.CodeActionTriggerType;710}711712/**713* The code action interface defines the contract between extensions and714* the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature.715*/716export interface CodeActionProvider {717/**718* Provide commands for the given document and range.719*/720provideCodeActions(model: model.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList>;721722/**723* Given a code action fill in the edit. Will only invoked when missing.724*/725resolveCodeAction?(codeAction: languages.CodeAction, token: CancellationToken): languages.ProviderResult<languages.CodeAction>;726}727728729730/**731* Metadata about the type of code actions that a {@link CodeActionProvider} provides.732*/733export 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`. The739* 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*/742readonly providedCodeActionKinds?: readonly string[];743744readonly documentation?: ReadonlyArray<{ readonly kind: string; readonly command: languages.Command }>;745}746747/**748* @internal749*/750export function createMonacoLanguagesAPI(): typeof monaco.languages {751return {752// eslint-disable-next-line local/code-no-any-casts753register: <any>register,754// eslint-disable-next-line local/code-no-any-casts755getLanguages: <any>getLanguages,756// eslint-disable-next-line local/code-no-any-casts757onLanguage: <any>onLanguage,758// eslint-disable-next-line local/code-no-any-casts759onLanguageEncountered: <any>onLanguageEncountered,760// eslint-disable-next-line local/code-no-any-casts761getEncodedLanguageId: <any>getEncodedLanguageId,762763// provider methods764// eslint-disable-next-line local/code-no-any-casts765setLanguageConfiguration: <any>setLanguageConfiguration,766setColorMap: setColorMap,767// eslint-disable-next-line local/code-no-any-casts768registerTokensProviderFactory: <any>registerTokensProviderFactory,769// eslint-disable-next-line local/code-no-any-casts770setTokensProvider: <any>setTokensProvider,771// eslint-disable-next-line local/code-no-any-casts772setMonarchTokensProvider: <any>setMonarchTokensProvider,773// eslint-disable-next-line local/code-no-any-casts774registerReferenceProvider: <any>registerReferenceProvider,775// eslint-disable-next-line local/code-no-any-casts776registerRenameProvider: <any>registerRenameProvider,777// eslint-disable-next-line local/code-no-any-casts778registerNewSymbolNameProvider: <any>registerNewSymbolNameProvider,779// eslint-disable-next-line local/code-no-any-casts780registerCompletionItemProvider: <any>registerCompletionItemProvider,781// eslint-disable-next-line local/code-no-any-casts782registerSignatureHelpProvider: <any>registerSignatureHelpProvider,783// eslint-disable-next-line local/code-no-any-casts784registerHoverProvider: <any>registerHoverProvider,785// eslint-disable-next-line local/code-no-any-casts786registerDocumentSymbolProvider: <any>registerDocumentSymbolProvider,787// eslint-disable-next-line local/code-no-any-casts788registerDocumentHighlightProvider: <any>registerDocumentHighlightProvider,789// eslint-disable-next-line local/code-no-any-casts790registerLinkedEditingRangeProvider: <any>registerLinkedEditingRangeProvider,791// eslint-disable-next-line local/code-no-any-casts792registerDefinitionProvider: <any>registerDefinitionProvider,793// eslint-disable-next-line local/code-no-any-casts794registerImplementationProvider: <any>registerImplementationProvider,795// eslint-disable-next-line local/code-no-any-casts796registerTypeDefinitionProvider: <any>registerTypeDefinitionProvider,797// eslint-disable-next-line local/code-no-any-casts798registerCodeLensProvider: <any>registerCodeLensProvider,799// eslint-disable-next-line local/code-no-any-casts800registerCodeActionProvider: <any>registerCodeActionProvider,801// eslint-disable-next-line local/code-no-any-casts802registerDocumentFormattingEditProvider: <any>registerDocumentFormattingEditProvider,803// eslint-disable-next-line local/code-no-any-casts804registerDocumentRangeFormattingEditProvider: <any>registerDocumentRangeFormattingEditProvider,805// eslint-disable-next-line local/code-no-any-casts806registerOnTypeFormattingEditProvider: <any>registerOnTypeFormattingEditProvider,807// eslint-disable-next-line local/code-no-any-casts808registerLinkProvider: <any>registerLinkProvider,809// eslint-disable-next-line local/code-no-any-casts810registerColorProvider: <any>registerColorProvider,811// eslint-disable-next-line local/code-no-any-casts812registerFoldingRangeProvider: <any>registerFoldingRangeProvider,813// eslint-disable-next-line local/code-no-any-casts814registerDeclarationProvider: <any>registerDeclarationProvider,815// eslint-disable-next-line local/code-no-any-casts816registerSelectionRangeProvider: <any>registerSelectionRangeProvider,817// eslint-disable-next-line local/code-no-any-casts818registerDocumentSemanticTokensProvider: <any>registerDocumentSemanticTokensProvider,819// eslint-disable-next-line local/code-no-any-casts820registerDocumentRangeSemanticTokensProvider: <any>registerDocumentRangeSemanticTokensProvider,821// eslint-disable-next-line local/code-no-any-casts822registerInlineCompletionsProvider: <any>registerInlineCompletionsProvider,823// eslint-disable-next-line local/code-no-any-casts824registerInlayHintsProvider: <any>registerInlayHintsProvider,825826// enums827DocumentHighlightKind: standaloneEnums.DocumentHighlightKind,828CompletionItemKind: standaloneEnums.CompletionItemKind,829CompletionItemTag: standaloneEnums.CompletionItemTag,830CompletionItemInsertTextRule: standaloneEnums.CompletionItemInsertTextRule,831SymbolKind: standaloneEnums.SymbolKind,832SymbolTag: standaloneEnums.SymbolTag,833IndentAction: standaloneEnums.IndentAction,834CompletionTriggerKind: standaloneEnums.CompletionTriggerKind,835SignatureHelpTriggerKind: standaloneEnums.SignatureHelpTriggerKind,836InlayHintKind: standaloneEnums.InlayHintKind,837InlineCompletionTriggerKind: standaloneEnums.InlineCompletionTriggerKind,838CodeActionTriggerType: standaloneEnums.CodeActionTriggerType,839NewSymbolNameTag: standaloneEnums.NewSymbolNameTag,840NewSymbolNameTriggerKind: standaloneEnums.NewSymbolNameTriggerKind,841PartialAcceptTriggerKind: standaloneEnums.PartialAcceptTriggerKind,842HoverVerbosityAction: standaloneEnums.HoverVerbosityAction,843InlineCompletionEndOfLifeReasonKind: standaloneEnums.InlineCompletionEndOfLifeReasonKind,844InlineCompletionHintStyle: standaloneEnums.InlineCompletionHintStyle,845846// classes847FoldingRangeKind: languages.FoldingRangeKind,848// eslint-disable-next-line local/code-no-any-casts849SelectedSuggestionInfo: <any>languages.SelectedSuggestionInfo,850// eslint-disable-next-line local/code-no-any-casts851EditDeltaInfo: <any>EditDeltaInfo,852};853}854855856