Path: blob/main/src/vs/editor/standalone/browser/standaloneLanguages.ts
3294 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';2728/**29* Register information about a new language.30*/31export function register(language: ILanguageExtensionPoint): void {32// Intentionally using the `ModesRegistry` here to avoid33// instantiating services too quickly in the standalone editor.34ModesRegistry.registerLanguage(language);35}3637/**38* Get the information of all the registered languages.39*/40export function getLanguages(): ILanguageExtensionPoint[] {41let result: ILanguageExtensionPoint[] = [];42result = result.concat(ModesRegistry.getLanguages());43return result;44}4546export function getEncodedLanguageId(languageId: string): number {47const languageService = StandaloneServices.get(ILanguageService);48return languageService.languageIdCodec.encodeLanguageId(languageId);49}5051/**52* An event emitted when a language is associated for the first time with a text model.53* @event54*/55export function onLanguage(languageId: string, callback: () => void): IDisposable {56return StandaloneServices.withServices(() => {57const languageService = StandaloneServices.get(ILanguageService);58const disposable = languageService.onDidRequestRichLanguageFeatures((encounteredLanguageId) => {59if (encounteredLanguageId === languageId) {60// stop listening61disposable.dispose();62// invoke actual listener63callback();64}65});66return disposable;67});68}6970/**71* An event emitted when a language is associated for the first time with a text model or72* when a language is encountered during the tokenization of another language.73* @event74*/75export function onLanguageEncountered(languageId: string, callback: () => void): IDisposable {76return StandaloneServices.withServices(() => {77const languageService = StandaloneServices.get(ILanguageService);78const disposable = languageService.onDidRequestBasicLanguageFeatures((encounteredLanguageId) => {79if (encounteredLanguageId === languageId) {80// stop listening81disposable.dispose();82// invoke actual listener83callback();84}85});86return disposable;87});88}8990/**91* Set the editing configuration for a language.92*/93export function setLanguageConfiguration(languageId: string, configuration: LanguageConfiguration): IDisposable {94const languageService = StandaloneServices.get(ILanguageService);95if (!languageService.isRegisteredLanguageId(languageId)) {96throw new Error(`Cannot set configuration for unknown language ${languageId}`);97}98const languageConfigurationService = StandaloneServices.get(ILanguageConfigurationService);99return languageConfigurationService.register(languageId, configuration, 100);100}101102/**103* @internal104*/105export class EncodedTokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {106107private readonly _languageId: string;108private readonly _actual: EncodedTokensProvider;109110constructor(languageId: string, actual: EncodedTokensProvider) {111this._languageId = languageId;112this._actual = actual;113}114115dispose(): void {116// NOOP117}118119public getInitialState(): languages.IState {120return this._actual.getInitialState();121}122123public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {124if (typeof this._actual.tokenize === 'function') {125return TokenizationSupportAdapter.adaptTokenize(this._languageId, <{ tokenize(line: string, state: languages.IState): ILineTokens }>this._actual, line, state);126}127throw new Error('Not supported!');128}129130public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {131const result = this._actual.tokenizeEncoded(line, state);132return new languages.EncodedTokenizationResult(result.tokens, result.endState);133}134}135136/**137* @internal138*/139export class TokenizationSupportAdapter implements languages.ITokenizationSupport, IDisposable {140141constructor(142private readonly _languageId: string,143private readonly _actual: TokensProvider,144private readonly _languageService: ILanguageService,145private readonly _standaloneThemeService: IStandaloneThemeService,146) {147}148149dispose(): void {150// NOOP151}152153public getInitialState(): languages.IState {154return this._actual.getInitialState();155}156157private static _toClassicTokens(tokens: IToken[], language: string): languages.Token[] {158const result: languages.Token[] = [];159let previousStartIndex: number = 0;160for (let i = 0, len = tokens.length; i < len; i++) {161const t = tokens[i];162let startIndex = t.startIndex;163164// Prevent issues stemming from a buggy external tokenizer.165if (i === 0) {166// Force first token to start at first index!167startIndex = 0;168} else if (startIndex < previousStartIndex) {169// Force tokens to be after one another!170startIndex = previousStartIndex;171}172173result[i] = new languages.Token(startIndex, t.scopes, language);174175previousStartIndex = startIndex;176}177return result;178}179180public static adaptTokenize(language: string, actual: { tokenize(line: string, state: languages.IState): ILineTokens }, line: string, state: languages.IState): languages.TokenizationResult {181const actualResult = actual.tokenize(line, state);182const tokens = TokenizationSupportAdapter._toClassicTokens(actualResult.tokens, language);183184let endState: languages.IState;185// try to save an object if possible186if (actualResult.endState.equals(state)) {187endState = state;188} else {189endState = actualResult.endState;190}191192return new languages.TokenizationResult(tokens, endState);193}194195public tokenize(line: string, hasEOL: boolean, state: languages.IState): languages.TokenizationResult {196return TokenizationSupportAdapter.adaptTokenize(this._languageId, this._actual, line, state);197}198199private _toBinaryTokens(languageIdCodec: languages.ILanguageIdCodec, tokens: IToken[]): Uint32Array {200const languageId = languageIdCodec.encodeLanguageId(this._languageId);201const tokenTheme = this._standaloneThemeService.getColorTheme().tokenTheme;202203const result: number[] = [];204let resultLen = 0;205let previousStartIndex: number = 0;206for (let i = 0, len = tokens.length; i < len; i++) {207const t = tokens[i];208const metadata = tokenTheme.match(languageId, t.scopes) | MetadataConsts.BALANCED_BRACKETS_MASK;209if (resultLen > 0 && result[resultLen - 1] === metadata) {210// same metadata211continue;212}213214let startIndex = t.startIndex;215216// Prevent issues stemming from a buggy external tokenizer.217if (i === 0) {218// Force first token to start at first index!219startIndex = 0;220} else if (startIndex < previousStartIndex) {221// Force tokens to be after one another!222startIndex = previousStartIndex;223}224225result[resultLen++] = startIndex;226result[resultLen++] = metadata;227228previousStartIndex = startIndex;229}230231const actualResult = new Uint32Array(resultLen);232for (let i = 0; i < resultLen; i++) {233actualResult[i] = result[i];234}235return actualResult;236}237238public tokenizeEncoded(line: string, hasEOL: boolean, state: languages.IState): languages.EncodedTokenizationResult {239const actualResult = this._actual.tokenize(line, state);240const tokens = this._toBinaryTokens(this._languageService.languageIdCodec, actualResult.tokens);241242let endState: languages.IState;243// try to save an object if possible244if (actualResult.endState.equals(state)) {245endState = state;246} else {247endState = actualResult.endState;248}249250return new languages.EncodedTokenizationResult(tokens, endState);251}252}253254/**255* A token.256*/257export interface IToken {258startIndex: number;259scopes: string;260}261262/**263* The result of a line tokenization.264*/265export interface ILineTokens {266/**267* The list of tokens on the line.268*/269tokens: IToken[];270/**271* The tokenization end state.272* A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.273*/274endState: languages.IState;275}276277/**278* The result of a line tokenization.279*/280export interface IEncodedLineTokens {281/**282* The tokens on the line in a binary, encoded format. Each token occupies two array indices. For token i:283* - at offset 2*i => startIndex284* - at offset 2*i + 1 => metadata285* Meta data is in binary format:286* - -------------------------------------------287* 3322 2222 2222 1111 1111 1100 0000 0000288* 1098 7654 3210 9876 5432 1098 7654 3210289* - -------------------------------------------290* bbbb bbbb bfff ffff ffFF FFTT LLLL LLLL291* - -------------------------------------------292* - L = EncodedLanguageId (8 bits): Use `getEncodedLanguageId` to get the encoded ID of a language.293* - T = StandardTokenType (2 bits): Other = 0, Comment = 1, String = 2, RegEx = 3.294* - F = FontStyle (4 bits): None = 0, Italic = 1, Bold = 2, Underline = 4, Strikethrough = 8.295* - f = foreground ColorId (9 bits)296* - b = background ColorId (9 bits)297* - The color value for each colorId is defined in IStandaloneThemeData.customTokenColors:298* e.g. colorId = 1 is stored in IStandaloneThemeData.customTokenColors[1]. Color id = 0 means no color,299* id = 1 is for the default foreground color, id = 2 for the default background.300*/301tokens: Uint32Array;302/**303* The tokenization end state.304* A pointer will be held to this and the object should not be modified by the tokenizer after the pointer is returned.305*/306endState: languages.IState;307}308309/**310* A factory for token providers.311*/312export interface TokensProviderFactory {313create(): languages.ProviderResult<TokensProvider | EncodedTokensProvider | IMonarchLanguage>;314}315316/**317* A "manual" provider of tokens.318*/319export interface TokensProvider {320/**321* The initial state of a language. Will be the state passed in to tokenize the first line.322*/323getInitialState(): languages.IState;324/**325* Tokenize a line given the state at the beginning of the line.326*/327tokenize(line: string, state: languages.IState): ILineTokens;328}329330/**331* A "manual" provider of tokens, returning tokens in a binary form.332*/333export interface EncodedTokensProvider {334/**335* The initial state of a language. Will be the state passed in to tokenize the first line.336*/337getInitialState(): languages.IState;338/**339* Tokenize a line given the state at the beginning of the line.340*/341tokenizeEncoded(line: string, state: languages.IState): IEncodedLineTokens;342/**343* Tokenize a line given the state at the beginning of the line.344*/345tokenize?(line: string, state: languages.IState): ILineTokens;346}347348function isATokensProvider(provider: TokensProvider | EncodedTokensProvider | IMonarchLanguage): provider is TokensProvider | EncodedTokensProvider {349return (typeof provider.getInitialState === 'function');350}351352function isEncodedTokensProvider(provider: TokensProvider | EncodedTokensProvider): provider is EncodedTokensProvider {353return 'tokenizeEncoded' in provider;354}355356function isThenable<T>(obj: any): obj is Thenable<T> {357return obj && typeof obj.then === 'function';358}359360/**361* Change the color map that is used for token colors.362* Supported formats (hex): #RRGGBB, $RRGGBBAA, #RGB, #RGBA363*/364export function setColorMap(colorMap: string[] | null): void {365const standaloneThemeService = StandaloneServices.get(IStandaloneThemeService);366if (colorMap) {367const result: Color[] = [null!];368for (let i = 1, len = colorMap.length; i < len; i++) {369result[i] = Color.fromHex(colorMap[i]);370}371standaloneThemeService.setColorMapOverride(result);372} else {373standaloneThemeService.setColorMapOverride(null);374}375}376377/**378* @internal379*/380function createTokenizationSupportAdapter(languageId: string, provider: TokensProvider | EncodedTokensProvider) {381if (isEncodedTokensProvider(provider)) {382return new EncodedTokenizationSupportAdapter(languageId, provider);383} else {384return new TokenizationSupportAdapter(385languageId,386provider,387StandaloneServices.get(ILanguageService),388StandaloneServices.get(IStandaloneThemeService),389);390}391}392393/**394* Register a tokens provider factory for a language. This tokenizer will be exclusive with a tokenizer395* set using `setTokensProvider` or one created using `setMonarchTokensProvider`, but will work together396* with a tokens provider set using `registerDocumentSemanticTokensProvider` or `registerDocumentRangeSemanticTokensProvider`.397*/398export function registerTokensProviderFactory(languageId: string, factory: TokensProviderFactory): IDisposable {399const adaptedFactory = new languages.LazyTokenizationSupport(async () => {400const result = await Promise.resolve(factory.create());401if (!result) {402return null;403}404if (isATokensProvider(result)) {405return createTokenizationSupportAdapter(languageId, result);406}407return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, result), StandaloneServices.get(IConfigurationService));408});409return languages.TokenizationRegistry.registerFactory(languageId, adaptedFactory);410}411412/**413* Set the tokens provider for a language (manual implementation). This tokenizer will be exclusive414* with a tokenizer created using `setMonarchTokensProvider`, or with `registerTokensProviderFactory`,415* but will work together with a tokens provider set using `registerDocumentSemanticTokensProvider`416* or `registerDocumentRangeSemanticTokensProvider`.417*/418export function setTokensProvider(languageId: string, provider: TokensProvider | EncodedTokensProvider | Thenable<TokensProvider | EncodedTokensProvider>): IDisposable {419const languageService = StandaloneServices.get(ILanguageService);420if (!languageService.isRegisteredLanguageId(languageId)) {421throw new Error(`Cannot set tokens provider for unknown language ${languageId}`);422}423if (isThenable<TokensProvider | EncodedTokensProvider>(provider)) {424return registerTokensProviderFactory(languageId, { create: () => provider });425}426return languages.TokenizationRegistry.register(languageId, createTokenizationSupportAdapter(languageId, provider));427}428429/**430* Set the tokens provider for a language (monarch implementation). This tokenizer will be exclusive431* with a tokenizer set using `setTokensProvider`, or with `registerTokensProviderFactory`, but will432* work together with a tokens provider set using `registerDocumentSemanticTokensProvider` or433* `registerDocumentRangeSemanticTokensProvider`.434*/435export function setMonarchTokensProvider(languageId: string, languageDef: IMonarchLanguage | Thenable<IMonarchLanguage>): IDisposable {436const create = (languageDef: IMonarchLanguage) => {437return new MonarchTokenizer(StandaloneServices.get(ILanguageService), StandaloneServices.get(IStandaloneThemeService), languageId, compile(languageId, languageDef), StandaloneServices.get(IConfigurationService));438};439if (isThenable<IMonarchLanguage>(languageDef)) {440return registerTokensProviderFactory(languageId, { create: () => languageDef });441}442return languages.TokenizationRegistry.register(languageId, create(languageDef));443}444445/**446* Register a reference provider (used by e.g. reference search).447*/448export function registerReferenceProvider(languageSelector: LanguageSelector, provider: languages.ReferenceProvider): IDisposable {449const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);450return languageFeaturesService.referenceProvider.register(languageSelector, provider);451}452453/**454* Register a rename provider (used by e.g. rename symbol).455*/456export function registerRenameProvider(languageSelector: LanguageSelector, provider: languages.RenameProvider): IDisposable {457const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);458return languageFeaturesService.renameProvider.register(languageSelector, provider);459}460461/**462* Register a new symbol-name provider (e.g., when a symbol is being renamed, show new possible symbol-names)463*/464export function registerNewSymbolNameProvider(languageSelector: LanguageSelector, provider: languages.NewSymbolNamesProvider): IDisposable {465const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);466return languageFeaturesService.newSymbolNamesProvider.register(languageSelector, provider);467}468469/**470* Register a signature help provider (used by e.g. parameter hints).471*/472export function registerSignatureHelpProvider(languageSelector: LanguageSelector, provider: languages.SignatureHelpProvider): IDisposable {473const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);474return languageFeaturesService.signatureHelpProvider.register(languageSelector, provider);475}476477/**478* Register a hover provider (used by e.g. editor hover).479*/480export function registerHoverProvider(languageSelector: LanguageSelector, provider: languages.HoverProvider): IDisposable {481const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);482return languageFeaturesService.hoverProvider.register(languageSelector, {483provideHover: async (model: model.ITextModel, position: Position, token: CancellationToken, context?: languages.HoverContext<languages.Hover>): Promise<languages.Hover | undefined> => {484const word = model.getWordAtPosition(position);485486return Promise.resolve<languages.Hover | null | undefined>(provider.provideHover(model, position, token, context)).then((value): languages.Hover | undefined => {487if (!value) {488return undefined;489}490if (!value.range && word) {491value.range = new Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn);492}493if (!value.range) {494value.range = new Range(position.lineNumber, position.column, position.lineNumber, position.column);495}496return value;497});498}499});500}501502/**503* Register a document symbol provider (used by e.g. outline).504*/505export function registerDocumentSymbolProvider(languageSelector: LanguageSelector, provider: languages.DocumentSymbolProvider): IDisposable {506const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);507return languageFeaturesService.documentSymbolProvider.register(languageSelector, provider);508}509510/**511* Register a document highlight provider (used by e.g. highlight occurrences).512*/513export function registerDocumentHighlightProvider(languageSelector: LanguageSelector, provider: languages.DocumentHighlightProvider): IDisposable {514const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);515return languageFeaturesService.documentHighlightProvider.register(languageSelector, provider);516}517518/**519* Register an linked editing range provider.520*/521export function registerLinkedEditingRangeProvider(languageSelector: LanguageSelector, provider: languages.LinkedEditingRangeProvider): IDisposable {522const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);523return languageFeaturesService.linkedEditingRangeProvider.register(languageSelector, provider);524}525526/**527* Register a definition provider (used by e.g. go to definition).528*/529export function registerDefinitionProvider(languageSelector: LanguageSelector, provider: languages.DefinitionProvider): IDisposable {530const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);531return languageFeaturesService.definitionProvider.register(languageSelector, provider);532}533534/**535* Register a implementation provider (used by e.g. go to implementation).536*/537export function registerImplementationProvider(languageSelector: LanguageSelector, provider: languages.ImplementationProvider): IDisposable {538const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);539return languageFeaturesService.implementationProvider.register(languageSelector, provider);540}541542/**543* Register a type definition provider (used by e.g. go to type definition).544*/545export function registerTypeDefinitionProvider(languageSelector: LanguageSelector, provider: languages.TypeDefinitionProvider): IDisposable {546const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);547return languageFeaturesService.typeDefinitionProvider.register(languageSelector, provider);548}549550/**551* Register a code lens provider (used by e.g. inline code lenses).552*/553export function registerCodeLensProvider(languageSelector: LanguageSelector, provider: languages.CodeLensProvider): IDisposable {554const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);555return languageFeaturesService.codeLensProvider.register(languageSelector, provider);556}557558/**559* Register a code action provider (used by e.g. quick fix).560*/561export function registerCodeActionProvider(languageSelector: LanguageSelector, provider: CodeActionProvider, metadata?: CodeActionProviderMetadata): IDisposable {562const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);563return languageFeaturesService.codeActionProvider.register(languageSelector, {564providedCodeActionKinds: metadata?.providedCodeActionKinds,565documentation: metadata?.documentation,566provideCodeActions: (model: model.ITextModel, range: Range, context: languages.CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList> => {567const markerService = StandaloneServices.get(IMarkerService);568const markers = markerService.read({ resource: model.uri }).filter(m => {569return Range.areIntersectingOrTouching(m, range);570});571return provider.provideCodeActions(model, range, { markers, only: context.only, trigger: context.trigger }, token);572},573resolveCodeAction: provider.resolveCodeAction574});575}576577/**578* Register a formatter that can handle only entire models.579*/580export function registerDocumentFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentFormattingEditProvider): IDisposable {581const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);582return languageFeaturesService.documentFormattingEditProvider.register(languageSelector, provider);583}584585/**586* Register a formatter that can handle a range inside a model.587*/588export function registerDocumentRangeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeFormattingEditProvider): IDisposable {589const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);590return languageFeaturesService.documentRangeFormattingEditProvider.register(languageSelector, provider);591}592593/**594* Register a formatter than can do formatting as the user types.595*/596export function registerOnTypeFormattingEditProvider(languageSelector: LanguageSelector, provider: languages.OnTypeFormattingEditProvider): IDisposable {597const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);598return languageFeaturesService.onTypeFormattingEditProvider.register(languageSelector, provider);599}600601/**602* Register a link provider that can find links in text.603*/604export function registerLinkProvider(languageSelector: LanguageSelector, provider: languages.LinkProvider): IDisposable {605const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);606return languageFeaturesService.linkProvider.register(languageSelector, provider);607}608609/**610* Register a completion item provider (use by e.g. suggestions).611*/612export function registerCompletionItemProvider(languageSelector: LanguageSelector, provider: languages.CompletionItemProvider): IDisposable {613const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);614return languageFeaturesService.completionProvider.register(languageSelector, provider);615}616617/**618* Register a document color provider (used by Color Picker, Color Decorator).619*/620export function registerColorProvider(languageSelector: LanguageSelector, provider: languages.DocumentColorProvider): IDisposable {621const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);622return languageFeaturesService.colorProvider.register(languageSelector, provider);623}624625/**626* Register a folding range provider627*/628export function registerFoldingRangeProvider(languageSelector: LanguageSelector, provider: languages.FoldingRangeProvider): IDisposable {629const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);630return languageFeaturesService.foldingRangeProvider.register(languageSelector, provider);631}632633/**634* Register a declaration provider635*/636export function registerDeclarationProvider(languageSelector: LanguageSelector, provider: languages.DeclarationProvider): IDisposable {637const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);638return languageFeaturesService.declarationProvider.register(languageSelector, provider);639}640641/**642* Register a selection range provider643*/644export function registerSelectionRangeProvider(languageSelector: LanguageSelector, provider: languages.SelectionRangeProvider): IDisposable {645const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);646return languageFeaturesService.selectionRangeProvider.register(languageSelector, provider);647}648649/**650* Register a document semantic tokens provider. A semantic tokens provider will complement and enhance a651* simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`652* or `setTokensProvider`.653*654* For the best user experience, register both a semantic tokens provider and a top-down tokenizer.655*/656export function registerDocumentSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentSemanticTokensProvider): IDisposable {657const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);658return languageFeaturesService.documentSemanticTokensProvider.register(languageSelector, provider);659}660661/**662* Register a document range semantic tokens provider. A semantic tokens provider will complement and enhance a663* simple top-down tokenizer. Simple top-down tokenizers can be set either via `setMonarchTokensProvider`664* or `setTokensProvider`.665*666* For the best user experience, register both a semantic tokens provider and a top-down tokenizer.667*/668export function registerDocumentRangeSemanticTokensProvider(languageSelector: LanguageSelector, provider: languages.DocumentRangeSemanticTokensProvider): IDisposable {669const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);670return languageFeaturesService.documentRangeSemanticTokensProvider.register(languageSelector, provider);671}672673/**674* Register an inline completions provider.675*/676export function registerInlineCompletionsProvider(languageSelector: LanguageSelector, provider: languages.InlineCompletionsProvider): IDisposable {677const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);678return languageFeaturesService.inlineCompletionsProvider.register(languageSelector, provider);679}680681/**682* Register an inlay hints provider.683*/684export function registerInlayHintsProvider(languageSelector: LanguageSelector, provider: languages.InlayHintsProvider): IDisposable {685const languageFeaturesService = StandaloneServices.get(ILanguageFeaturesService);686return languageFeaturesService.inlayHintsProvider.register(languageSelector, provider);687}688689/**690* Contains additional diagnostic information about the context in which691* a [code action](#CodeActionProvider.provideCodeActions) is run.692*/693export interface CodeActionContext {694695/**696* An array of diagnostics.697*/698readonly markers: IMarkerData[];699700/**701* Requested kind of actions to return.702*/703readonly only?: string;704705/**706* The reason why code actions were requested.707*/708readonly trigger: languages.CodeActionTriggerType;709}710711/**712* The code action interface defines the contract between extensions and713* the [light bulb](https://code.visualstudio.com/docs/editor/editingevolved#_code-action) feature.714*/715export interface CodeActionProvider {716/**717* Provide commands for the given document and range.718*/719provideCodeActions(model: model.ITextModel, range: Range, context: CodeActionContext, token: CancellationToken): languages.ProviderResult<languages.CodeActionList>;720721/**722* Given a code action fill in the edit. Will only invoked when missing.723*/724resolveCodeAction?(codeAction: languages.CodeAction, token: CancellationToken): languages.ProviderResult<languages.CodeAction>;725}726727728729/**730* Metadata about the type of code actions that a {@link CodeActionProvider} provides.731*/732export interface CodeActionProviderMetadata {733/**734* List of code action kinds that a {@link CodeActionProvider} may return.735*736* This list is used to determine if a given `CodeActionProvider` should be invoked or not.737* To avoid unnecessary computation, every `CodeActionProvider` should list use `providedCodeActionKinds`. The738* list of kinds may either be generic, such as `["quickfix", "refactor", "source"]`, or list out every kind provided,739* such as `["quickfix.removeLine", "source.fixAll" ...]`.740*/741readonly providedCodeActionKinds?: readonly string[];742743readonly documentation?: ReadonlyArray<{ readonly kind: string; readonly command: languages.Command }>;744}745746/**747* @internal748*/749export function createMonacoLanguagesAPI(): typeof monaco.languages {750return {751register: <any>register,752getLanguages: <any>getLanguages,753onLanguage: <any>onLanguage,754onLanguageEncountered: <any>onLanguageEncountered,755getEncodedLanguageId: <any>getEncodedLanguageId,756757// provider methods758setLanguageConfiguration: <any>setLanguageConfiguration,759setColorMap: setColorMap,760registerTokensProviderFactory: <any>registerTokensProviderFactory,761setTokensProvider: <any>setTokensProvider,762setMonarchTokensProvider: <any>setMonarchTokensProvider,763registerReferenceProvider: <any>registerReferenceProvider,764registerRenameProvider: <any>registerRenameProvider,765registerNewSymbolNameProvider: <any>registerNewSymbolNameProvider,766registerCompletionItemProvider: <any>registerCompletionItemProvider,767registerSignatureHelpProvider: <any>registerSignatureHelpProvider,768registerHoverProvider: <any>registerHoverProvider,769registerDocumentSymbolProvider: <any>registerDocumentSymbolProvider,770registerDocumentHighlightProvider: <any>registerDocumentHighlightProvider,771registerLinkedEditingRangeProvider: <any>registerLinkedEditingRangeProvider,772registerDefinitionProvider: <any>registerDefinitionProvider,773registerImplementationProvider: <any>registerImplementationProvider,774registerTypeDefinitionProvider: <any>registerTypeDefinitionProvider,775registerCodeLensProvider: <any>registerCodeLensProvider,776registerCodeActionProvider: <any>registerCodeActionProvider,777registerDocumentFormattingEditProvider: <any>registerDocumentFormattingEditProvider,778registerDocumentRangeFormattingEditProvider: <any>registerDocumentRangeFormattingEditProvider,779registerOnTypeFormattingEditProvider: <any>registerOnTypeFormattingEditProvider,780registerLinkProvider: <any>registerLinkProvider,781registerColorProvider: <any>registerColorProvider,782registerFoldingRangeProvider: <any>registerFoldingRangeProvider,783registerDeclarationProvider: <any>registerDeclarationProvider,784registerSelectionRangeProvider: <any>registerSelectionRangeProvider,785registerDocumentSemanticTokensProvider: <any>registerDocumentSemanticTokensProvider,786registerDocumentRangeSemanticTokensProvider: <any>registerDocumentRangeSemanticTokensProvider,787registerInlineCompletionsProvider: <any>registerInlineCompletionsProvider,788registerInlayHintsProvider: <any>registerInlayHintsProvider,789790// enums791DocumentHighlightKind: standaloneEnums.DocumentHighlightKind,792CompletionItemKind: standaloneEnums.CompletionItemKind,793CompletionItemTag: standaloneEnums.CompletionItemTag,794CompletionItemInsertTextRule: standaloneEnums.CompletionItemInsertTextRule,795SymbolKind: standaloneEnums.SymbolKind,796SymbolTag: standaloneEnums.SymbolTag,797IndentAction: standaloneEnums.IndentAction,798CompletionTriggerKind: standaloneEnums.CompletionTriggerKind,799SignatureHelpTriggerKind: standaloneEnums.SignatureHelpTriggerKind,800InlayHintKind: standaloneEnums.InlayHintKind,801InlineCompletionTriggerKind: standaloneEnums.InlineCompletionTriggerKind,802CodeActionTriggerType: standaloneEnums.CodeActionTriggerType,803NewSymbolNameTag: standaloneEnums.NewSymbolNameTag,804NewSymbolNameTriggerKind: standaloneEnums.NewSymbolNameTriggerKind,805PartialAcceptTriggerKind: standaloneEnums.PartialAcceptTriggerKind,806HoverVerbosityAction: standaloneEnums.HoverVerbosityAction,807InlineCompletionEndOfLifeReasonKind: standaloneEnums.InlineCompletionEndOfLifeReasonKind,808InlineCompletionDisplayLocationKind: standaloneEnums.InlineCompletionDisplayLocationKind,809810// classes811FoldingRangeKind: languages.FoldingRangeKind,812SelectedSuggestionInfo: <any>languages.SelectedSuggestionInfo,813};814}815816817