1
0
mirror of https://github.com/golang/go synced 2024-11-18 14:24:44 -07:00
go/internal/lsp/protocol/language.go
Ian Cottrell ff3f684ce0 internal/lsp: the core lsp protocol
This is not intended to be a user friendly package, just the rawest correct
implemenation of the protocol as a building block

Change-Id: Ib672b7f1e2fd8284be422dc7964f1876e94c9578
Reviewed-on: https://go-review.googlesource.com/136676
Reviewed-by: Alan Donovan <adonovan@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
2018-09-25 15:17:08 +00:00

1021 lines
27 KiB
Go

// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This file contains the corresponding structures to the
// "Language Features" part of the LSP specification.
package protocol
type CompletionParams struct {
TextDocumentPositionParams
/**
* The completion context. This is only available if the client specifies
* to send this using `ClientCapabilities.textDocument.completion.contextSupport === true`
*/
Context CompletionContext `json:"context,omitempty"`
}
/**
* How a completion was triggered
*/
type CompletionTriggerKind float64
const (
/**
* Completion was triggered by typing an identifier (24x7 code
* complete), manual invocation (e.g Ctrl+Space) or via API.
*/
Invoked CompletionTriggerKind = 1
/**
* Completion was triggered by a trigger character specified by
* the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
*/
TriggerCharacter CompletionTriggerKind = 2
/**
* Completion was re-triggered as the current completion list is incomplete.
*/
TriggerForIncompleteCompletions CompletionTriggerKind = 3
)
/**
* Contains additional information about the context in which a completion request is triggered.
*/
type CompletionContext struct {
/**
* How the completion was triggered.
*/
TriggerKind CompletionTriggerKind `json:"triggerKind"`
/**
* The trigger character (a single character) that has trigger code complete.
* Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
*/
TriggerCharacter string `json:"triggerCharacter,omitempty"`
}
/**
* Represents a collection of [completion items](#CompletionItem) to be presented
* in the editor.
*/
type CompletionList struct {
/**
* This list it not complete. Further typing should result in recomputing
* this list.
*/
IsIncomplete bool `json:"isIncomplete"`
/**
* The completion items.
*/
Items []CompletionItem `json:"items"`
}
/**
* Defines whether the insert text in a completion item should be interpreted as
* plain text or a snippet.
*/
type InsertTextFormat float64
const (
/**
* The primary text to be inserted is treated as a plain string.
*/
PlainTextFormat InsertTextFormat = 1
/**
* The primary text to be inserted is treated as a snippet.
*
* A snippet can define tab stops and placeholders with `$1`, `$2`
* and `${3:foo}`. `$0` defines the final tab stop, it defaults to
* the end of the snippet. Placeholders with equal identifiers are linked,
* that is typing in one will update others too.
*/
SnippetTextFormat InsertTextFormat = 2
)
type CompletionItem struct {
/**
* The label of this completion item. By default
* also the text that is inserted when selecting
* this completion.
*/
Label string `json:"label"`
/**
* The kind of this completion item. Based of the kind
* an icon is chosen by the editor.
*/
Kind float64 `json:"kind,omitempty"`
/**
* A human-readable string with additional information
* about this item, like type or symbol information.
*/
Detail string `json:"detail,omitempty"`
/**
* A human-readable string that represents a doc-comment.
*/
Documentation interface{} `json:"documentation,omitempty"` // string | MarkupContent
/**
* Indicates if this item is deprecated.
*/
Deprecated bool `json:"deprecated,omitempty"`
/**
* Select this item when showing.
*
* *Note* that only one completion item can be selected and that the
* tool / client decides which item that is. The rule is that the *first*
* item of those that match best is selected.
*/
Preselect bool `json:"preselect,omitempty"`
/**
* A string that should be used when comparing this item
* with other items. When `falsy` the label is used.
*/
SortText string `json:"sortText,omitempty"`
/**
* A string that should be used when filtering a set of
* completion items. When `falsy` the label is used.
*/
FilterText string `json:"filterText,omitempty"`
/**
* A string that should be inserted into a document when selecting
* this completion. When `falsy` the label is used.
*
* The `insertText` is subject to interpretation by the client side.
* Some tools might not take the string literally. For example
* VS Code when code complete is requested in this example `con<cursor position>`
* and a completion item with an `insertText` of `console` is provided it
* will only insert `sole`. Therefore it is recommended to use `textEdit` instead
* since it avoids additional client side interpretation.
*
* @deprecated Use textEdit instead.
*/
InsertText string `json:"insertText,omitempty"`
/**
* The format of the insert text. The format applies to both the `insertText` property
* and the `newText` property of a provided `textEdit`.
*/
InsertTextFormat InsertTextFormat `json:"insertTextFormat,omitempty"`
/**
* An edit which is applied to a document when selecting this completion. When an edit is provided the value of
* `insertText` is ignored.
*
* *Note:* The range of the edit must be a single line range and it must contain the position at which completion
* has been requested.
*/
TextEdit TextEdit `json:"textEdit,omitempty"`
/**
* An optional array of additional text edits that are applied when
* selecting this completion. Edits must not overlap (including the same insert position)
* with the main edit nor with themselves.
*
* Additional text edits should be used to change text unrelated to the current cursor position
* (for example adding an import statement at the top of the file if the completion item will
* insert an unqualified type).
*/
AdditionalTextEdits []TextEdit `json:"additionalTextEdits,omitempty"`
/**
* An optional set of characters that when pressed while this completion is active will accept it first and
* then type that character. *Note* that all commit characters should have `length=1` and that superfluous
* characters will be ignored.
*/
CommitCharacters []string `json:"commitCharacters,omitempty"`
/**
* An optional command that is executed *after* inserting this completion. *Note* that
* additional modifications to the current document should be described with the
* additionalTextEdits-property.
*/
Command Command `json:"command,omitempty"`
/**
* An data entry field that is preserved on a completion item between
* a completion and a completion resolve request.
*/
Data interface{} `json:"data"`
}
/**
* The kind of a completion entry.
*/
type CompletionItemKind float64
const (
TextCompletion CompletionItemKind = 1
MethodCompletion CompletionItemKind = 2
FunctionCompletion CompletionItemKind = 3
ConstructorCompletion CompletionItemKind = 4
FieldCompletion CompletionItemKind = 5
VariableCompletion CompletionItemKind = 6
ClassCompletion CompletionItemKind = 7
InterfaceCompletion CompletionItemKind = 8
ModuleCompletion CompletionItemKind = 9
PropertyCompletion CompletionItemKind = 10
UnitCompletion CompletionItemKind = 11
ValueCompletion CompletionItemKind = 12
EnumCompletion CompletionItemKind = 13
KeywordCompletion CompletionItemKind = 14
SnippetCompletion CompletionItemKind = 15
ColorCompletion CompletionItemKind = 16
FileCompletion CompletionItemKind = 17
ReferenceCompletion CompletionItemKind = 18
FolderCompletion CompletionItemKind = 19
EnumMemberCompletion CompletionItemKind = 20
ConstantCompletion CompletionItemKind = 21
StructCompletion CompletionItemKind = 22
EventCompletion CompletionItemKind = 23
OperatorCompletion CompletionItemKind = 24
TypeParameterCompletion CompletionItemKind = 25
)
type CompletionRegistrationOptions struct {
TextDocumentRegistrationOptions
/**
* Most tools trigger completion request automatically without explicitly requesting
* it using a keyboard shortcut (e.g. Ctrl+Space). Typically they do so when the user
* starts to type an identifier. For example if the user types `c` in a JavaScript file
* code complete will automatically pop up present `console` besides others as a
* completion item. Characters that make up identifiers don't need to be listed here.
*
* If code complete should automatically be trigger on characters not being valid inside
* an identifier (for example `.` in JavaScript) list them in `triggerCharacters`.
*/
TriggerCharacters []string `json:"triggerCharacters,omitempty"`
/**
* The server provides support to resolve additional
* information for a completion item.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
}
/**
* The result of a hover request.
*/
type Hover struct {
/**
* The hover's content
*/
Contents MarkupContent `json:"contents"`
/**
* An optional range is a range inside a text document
* that is used to visualize a hover, e.g. by changing the background color.
*/
Range Range `json:"range,omitempty"`
}
/**
* Signature help represents the signature of something
* callable. There can be multiple signature but only one
* active and only one active parameter.
*/
type SignatureHelp struct {
/**
* One or more signatures.
*/
Signatures []SignatureInformation `json:"signatures"`
/**
* The active signature. If omitted or the value lies outside the
* range of `signatures` the value defaults to zero or is ignored if
* `signatures.length === 0`. Whenever possible implementors should
* make an active decision about the active signature and shouldn't
* rely on a default value.
* In future version of the protocol this property might become
* mandatory to better express this.
*/
ActiveSignature float64 `json:"activeSignature,omitempty"`
/**
* The active parameter of the active signature. If omitted or the value
* lies outside the range of `signatures[activeSignature].parameters`
* defaults to 0 if the active signature has parameters. If
* the active signature has no parameters it is ignored.
* In future version of the protocol this property might become
* mandatory to better express the active parameter if the
* active signature does have any.
*/
ActiveParameter float64 `json:"activeParameter,omitempty"`
}
/**
* Represents the signature of something callable. A signature
* can have a label, like a function-name, a doc-comment, and
* a set of parameters.
*/
type SignatureInformation struct {
/**
* The label of this signature. Will be shown in
* the UI.
*/
Label string `json:"label"`
/**
* The human-readable doc-comment of this signature. Will be shown
* in the UI but can be omitted.
*/
Documentation interface{} `json:"documentation,omitempty"` // string | MarkupContent
/**
* The parameters of this signature.
*/
Parameters []ParameterInformation `json:"parameters,omitempty"`
}
/**
* Represents a parameter of a callable-signature. A parameter can
* have a label and a doc-comment.
*/
type ParameterInformation struct {
/**
* The label of this parameter. Will be shown in
* the UI.
*/
Label string `json:"label"`
/**
* The human-readable doc-comment of this parameter. Will be shown
* in the UI but can be omitted.
*/
Documentation interface{} `json:"documentation,omitempty"` // string | MarkupContent
}
type SignatureHelpRegistrationOptions struct {
TextDocumentRegistrationOptions
/**
* The characters that trigger signature help
* automatically.
*/
TriggerCharacters []string `json:"triggerCharacters,omitempty"`
}
type ReferenceParams struct {
TextDocumentPositionParams
Context ReferenceContext
}
type ReferenceContext struct {
/**
* Include the declaration of the current symbol.
*/
IncludeDeclaration bool `json:"includeDeclaration"`
}
/**
* A document highlight is a range inside a text document which deserves
* special attention. Usually a document highlight is visualized by changing
* the background color of its range.
*
*/
type DocumentHighlight struct {
/**
* The range this highlight applies to.
*/
Range Range `json:"range"`
/**
* The highlight kind, default is DocumentHighlightKind.Text.
*/
Kind float64 `json:"kind,omitempty"`
}
/**
* A document highlight kind.
*/
type DocumentHighlightKind float64
const (
/**
* A textual occurrence.
*/
TextHighlight DocumentHighlightKind = 1
/**
* Read-access of a symbol, like reading a variable.
*/
ReadHighlight DocumentHighlightKind = 2
/**
* Write-access of a symbol, like writing to a variable.
*/
WriteHighlight DocumentHighlightKind = 3
)
type DocumentSymbolParams struct {
/**
* The text document.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
}
/**
* A symbol kind.
*/
type SymbolKind float64
const (
FileSymbol SymbolKind = 1
ModuleSymbol SymbolKind = 2
NamespaceSymbol SymbolKind = 3
PackageSymbol SymbolKind = 4
ClassSymbol SymbolKind = 5
MethodSymbol SymbolKind = 6
PropertySymbol SymbolKind = 7
FieldSymbol SymbolKind = 8
ConstructorSymbol SymbolKind = 9
EnumSymbol SymbolKind = 10
InterfaceSymbol SymbolKind = 11
FunctionSymbol SymbolKind = 12
VariableSymbol SymbolKind = 13
ConstantSymbol SymbolKind = 14
StringSymbol SymbolKind = 15
NumberSymbol SymbolKind = 16
BooleanSymbol SymbolKind = 17
ArraySymbol SymbolKind = 18
ObjectSymbol SymbolKind = 19
KeySymbol SymbolKind = 20
NullSymbol SymbolKind = 21
EnumMemberSymbol SymbolKind = 22
StructSymbol SymbolKind = 23
EventSymbol SymbolKind = 24
OperatorSymbol SymbolKind = 25
TypeParameterSymbol SymbolKind = 26
)
/**
* Represents programming constructs like variables, classes, interfaces etc. that appear in a document. Document symbols can be
* hierarchical and they have two ranges: one that encloses its definition and one that points to its most interesting range,
* e.g. the range of an identifier.
*/
type DocumentSymbol struct {
/**
* The name of this symbol.
*/
Name string `json:"name"`
/**
* More detail for this symbol, e.g the signature of a function. If not provided the
* name is used.
*/
Detail string `json:"detail,omitempty"`
/**
* The kind of this symbol.
*/
Kind SymbolKind `json:"kind"`
/**
* Indicates if this symbol is deprecated.
*/
Deprecated bool `json:"deprecated,omitempty"`
/**
* The range enclosing this symbol not including leading/trailing whitespace but everything else
* like comments. This information is typically used to determine if the clients cursor is
* inside the symbol to reveal in the symbol in the UI.
*/
Range Range `json:"range"`
/**
* The range that should be selected and revealed when this symbol is being picked, e.g the name of a function.
* Must be contained by the `range`.
*/
SelectionRange Range `json:"selectionRange"`
/**
* Children of this symbol, e.g. properties of a class.
*/
Children []DocumentSymbol `json:"children,omitempty"`
}
/**
* Represents information about programming constructs like variables, classes,
* interfaces etc.
*/
type SymbolInformation struct {
/**
* The name of this symbol.
*/
Name string `json:"name"`
/**
* The kind of this symbol.
*/
Kind float64 `json:"kind"`
/**
* Indicates if this symbol is deprecated.
*/
Deprecated bool `json:"deprecated,omitempty"`
/**
* The location of this symbol. The location's range is used by a tool
* to reveal the location in the editor. If the symbol is selected in the
* tool the range's start information is used to position the cursor. So
* the range usually spans more then the actual symbol's name and does
* normally include things like visibility modifiers.
*
* The range doesn't have to denote a node range in the sense of a abstract
* syntax tree. It can therefore not be used to re-construct a hierarchy of
* the symbols.
*/
Location Location `json:"location"`
/**
* The name of the symbol containing this symbol. This information is for
* user interface purposes (e.g. to render a qualifier in the user interface
* if necessary). It can't be used to re-infer a hierarchy for the document
* symbols.
*/
ContainerName string `json:"containerName,omitempty"`
}
/**
* Params for the CodeActionRequest
*/
type CodeActionParams struct {
/**
* The document in which the command was invoked.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The range for which the command was invoked.
*/
Range Range `json:"range"`
/**
* Context carrying additional information.
*/
Context CodeActionContext `json:"context"`
}
/**
* The kind of a code action.
*
* Kinds are a hierarchical list of identifiers separated by `.`, e.g. `"refactor.extract.function"`.
*
* The set of kinds is open and client needs to announce the kinds it supports to the server during
* initialization.
*/
type CodeActionKind string
/**
* A set of predefined code action kinds
*/
const (
/**
* Base kind for quickfix actions: 'quickfix'
*/
QuickFix CodeActionKind = "quickfix"
/**
* Base kind for refactoring actions: 'refactor'
*/
Refactor CodeActionKind = "refactor"
/**
* Base kind for refactoring extraction actions: 'refactor.extract'
*
* Example extract actions:
*
* - Extract method
* - Extract function
* - Extract variable
* - Extract interface from class
* - ...
*/
RefactorExtract CodeActionKind = "refactor.extract"
/**
* Base kind for refactoring inline actions: 'refactor.inline'
*
* Example inline actions:
*
* - Inline function
* - Inline variable
* - Inline constant
* - ...
*/
RefactorInline CodeActionKind = "refactor.inline"
/**
* Base kind for refactoring rewrite actions: 'refactor.rewrite'
*
* Example rewrite actions:
*
* - Convert JavaScript function to class
* - Add or remove parameter
* - Encapsulate field
* - Make method static
* - Move method to base class
* - ...
*/
RefactorRewrite CodeActionKind = "refactor.rewrite"
/**
* Base kind for source actions: `source`
*
* Source code actions apply to the entire file.
*/
Source CodeActionKind = "source"
/**
* Base kind for an organize imports source action: `source.organizeImports`
*/
SourceOrganizeImports CodeActionKind = "source.organizeImports"
)
/**
* Contains additional diagnostic information about the context in which
* a code action is run.
*/
type CodeActionContext struct {
/**
* An array of diagnostics.
*/
Diagnostics []Diagnostic `json:"diagnostics"`
/**
* Requested kind of actions to return.
*
* Actions not of this kind are filtered out by the client before being shown. So servers
* can omit computing them.
*/
Only []CodeActionKind `json:"only,omitempty"`
}
/**
* A code action represents a change that can be performed in code, e.g. to fix a problem or
* to refactor code.
*
* A CodeAction must set either `edit` and/or a `command`. If both are supplied, the `edit` is applied first, then the `command` is executed.
*/
type CodeAction struct {
/**
* A short, human-readable, title for this code action.
*/
Title string `json:"title"`
/**
* The kind of the code action.
*
* Used to filter code actions.
*/
Kind CodeActionKind `json:"kind,omitempty"`
/**
* The diagnostics that this code action resolves.
*/
Diagnostics []Diagnostic `json:"diagnostics,omitempty"`
/**
* The workspace edit this code action performs.
*/
Edit WorkspaceEdit `json:"edit,omitempty"`
/**
* A command this code action executes. If a code action
* provides an edit and a command, first the edit is
* executed and then the command.
*/
Command Command `json:"command,omitempty"`
}
type CodeLensParams struct {
/**
* The document to request code lens for.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
}
/**
* A code lens represents a command that should be shown along with
* source text, like the number of references, a way to run tests, etc.
*
* A code lens is _unresolved_ when no command is associated to it. For performance
* reasons the creation of a code lens and resolving should be done in two stages.
*/
type CodeLens struct {
/**
* The range in which this code lens is valid. Should only span a single line.
*/
Range Range `json:"range"`
/**
* The command this code lens represents.
*/
Command Command `json:"command,omitempty"`
/**
* A data entry field that is preserved on a code lens item between
* a code lens and a code lens resolve request.
*/
Data interface{} `json:"data"`
}
type CodeLensRegistrationOptions struct {
TextDocumentRegistrationOptions
/**
* Code lens has a resolve provider as well.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
}
type DocumentLinkParams struct {
/**
* The document to provide document links for.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
}
/**
* A document link is a range in a text document that links to an internal or external resource, like another
* text document or a web site.
*/
type DocumentLink struct {
/**
* The range this link applies to.
*/
Range Range `json:"range"`
/**
* The uri this link points to. If missing a resolve request is sent later.
*/
Target DocumentURI `json:"target,omitempty"`
/**
* A data entry field that is preserved on a document link between a
* DocumentLinkRequest and a DocumentLinkResolveRequest.
*/
Data interface{} `json:"data,omitempty"`
}
type DocumentLinkRegistrationOptions struct {
TextDocumentRegistrationOptions
/**
* Document links have a resolve provider as well.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
}
type DocumentColorParams struct {
/**
* The text document.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
}
type ColorInformation struct {
/**
* The range in the document where this color appears.
*/
Range Range `json:"range"`
/**
* The actual color value for this color range.
*/
Color Color `json:"color"`
}
/**
* Represents a color in RGBA space.
*/
type Color struct {
/**
* The red component of this color in the range [0-1].
*/
Red float64 `json:"red"`
/**
* The green component of this color in the range [0-1].
*/
Green float64 `json:"green"`
/**
* The blue component of this color in the range [0-1].
*/
Blue float64 `json:"blue"`
/**
* The alpha component of this color in the range [0-1].
*/
Alpha float64 `json:"alpha"`
}
type ColorPresentationParams struct {
/**
* The text document.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The color information to request presentations for.
*/
Color Color `json:"color"`
/**
* The range where the color would be inserted. Serves as a context.
*/
Range Range `json:"range"`
}
type ColorPresentation struct {
/**
* The label of this color presentation. It will be shown on the color
* picker header. By default this is also the text that is inserted when selecting
* this color presentation.
*/
Label string `json:"label"`
/**
* An [edit](#TextEdit) which is applied to a document when selecting
* this presentation for the color. When `falsy` the [label](#ColorPresentation.label)
* is used.
*/
TextEdit TextEdit `json:"textEdit,omitempty"`
/**
* An optional array of additional [text edits](#TextEdit) that are applied when
* selecting this color presentation. Edits must not overlap with the main [edit](#ColorPresentation.textEdit) nor with themselves.
*/
AdditionalTextEdits []TextEdit `json:"additionalTextEdits,omitempty"`
}
type DocumentFormattingParams struct {
/**
* The document to format.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The format options.
*/
Options FormattingOptions `json:"options"`
}
/**
* Value-object describing what options formatting should use.
*/
type FormattingOptions struct {
/**
* Size of a tab in spaces.
*/
TabSize float64 `json:"tabSize"`
/**
* Prefer spaces over tabs.
*/
InsertSpaces bool `json:"insertSpaces"`
/**
* Signature for further properties.
*/
// TODO: [key: string]: boolean | number | string;
}
type DocumentRangeFormattingParams struct {
/**
* The document to format.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The range to format
*/
Range Range `json:"range"`
/**
* The format options
*/
Options FormattingOptions `json:"options"`
}
type DocumentOnTypeFormattingParams struct {
/**
* The document to format.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The position at which this request was sent.
*/
Position Position `json:"position"`
/**
* The character that has been typed.
*/
Ch string `json:"ch"`
/**
* The format options.
*/
Options FormattingOptions `json:"options"`
}
type DocumentOnTypeFormattingRegistrationOptions struct {
TextDocumentRegistrationOptions
/**
* A character on which formatting should be triggered, like `}`.
*/
FirstTriggerCharacter string `json:"firstTriggerCharacter"`
/**
* More trigger characters.
*/
MoreTriggerCharacter []string `json:"moreTriggerCharacter"`
}
type RenameParams struct {
/**
* The document to rename.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
/**
* The position at which this request was sent.
*/
Position Position `json:"position"`
/**
* The new name of the symbol. If the given name is not valid the
* request must return a [ResponseError](#ResponseError) with an
* appropriate message set.
*/
NewName string `json:"newName"`
}
type FoldingRangeRequestParam struct {
/**
* The text document.
*/
TextDocument TextDocumentIdentifier `json:"textDocument"`
}
/**
* Enum of known range kinds
*/
type FoldingRangeKind string
const (
/**
* Folding range for a comment
*/
Comment FoldingRangeKind = "comment"
/**
* Folding range for a imports or includes
*/
Imports FoldingRangeKind = "imports"
/**
* Folding range for a region (e.g. `#region`)
*/
Region FoldingRangeKind = "region"
)
/**
* Represents a folding range.
*/
type FoldingRange struct {
/**
* The zero-based line number from where the folded range starts.
*/
StartLine float64 `json:"startLine"`
/**
* The zero-based character offset from where the folded range starts. If not defined, defaults to the length of the start line.
*/
StartCharacter float64 `json:"startCharacter,omitempty"`
/**
* The zero-based line number where the folded range ends.
*/
EndLine float64 `json:"endLine"`
/**
* The zero-based character offset before the folded range ends. If not defined, defaults to the length of the end line.
*/
EndCharacter float64 `json:"endCharacter,omitempty"`
/**
* Describes the kind of the folding range such as `comment' or 'region'. The kind
* is used to categorize folding ranges and used by commands like 'Fold all comments'. See
* [FoldingRangeKind](#FoldingRangeKind) for an enumeration of standardized kinds.
*/
Kind string `json:"kind,omitempty"`
}