// 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` * 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"` }