1
0
mirror of https://github.com/golang/go synced 2024-11-18 14:44:41 -07:00
go/internal/lsp/protocol/general.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

850 lines
25 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
// "General" messages part of the LSP specification.
package protocol
import "golang.org/x/tools/internal/jsonrpc2"
type CancelParams struct {
/**
* The request id to cancel.
*/
ID jsonrpc2.ID `json:"id"`
}
type InitializeParams struct {
/**
* The process Id of the parent process that started
* the server. Is null if the process has not been started by another process.
* If the parent process is not alive then the server should exit (see exit notification) its process.
*/
ProcessID *float64 `json:"processId"`
/**
* The rootPath of the workspace. Is null
* if no folder is open.
*
* @deprecated in favour of rootURI.
*/
RootPath *string `json:"rootPath"`
/**
* The rootURI of the workspace. Is null if no
* folder is open. If both `rootPath` and `rootURI` are set
* `rootURI` wins.
*/
RootURI *DocumentURI `json:"rootURI"`
/**
* User provided initialization options.
*/
InitializationOptions interface{} `json:"initializationOptions"`
/**
* The capabilities provided by the client (editor or tool)
*/
Capabilities ClientCapabilities `json:"capabilities"`
/**
* The initial trace setting. If omitted trace is disabled ('off').
*/
Trace string `json:"trace"` // 'off' | 'messages' | 'verbose'
/**
* The workspace folders configured in the client when the server starts.
* This property is only available if the client supports workspace folders.
* It can be `null` if the client supports workspace folders but none are
* configured.
*
* Since 3.6.0
*/
WorkspaceFolders []WorkspaceFolder `json:"workspaceFolders,omitempty"`
}
/**
* Workspace specific client capabilities.
*/
type WorkspaceClientCapabilities struct {
/**
* The client supports applying batch edits to the workspace by supporting
* the request 'workspace/applyEdit'
*/
ApplyEdit bool `json:"applyEdit,omitempty"`
/**
* Capabilities specific to `WorkspaceEdit`s
*/
WorkspaceEdit struct {
/**
* The client supports versioned document changes in `WorkspaceEdit`s
*/
DocumentChanges bool `json:"documentChanges,omitempty"`
} `json:"workspaceEdit,omitempty"`
/**
* Capabilities specific to the `workspace/didChangeConfiguration` notification.
*/
DidChangeConfiguration struct {
/**
* Did change configuration notification supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"didChangeConfiguration,omitempty"`
/**
* Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
*/
DidChangeWatchedFiles struct {
/**
* Did change watched files notification supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"didChangeWatchedFiles,omitempty"`
/**
* Capabilities specific to the `workspace/symbol` request.
*/
Symbol struct {
/**
* Symbol request supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* Specific capabilities for the `SymbolKind` in the `workspace/symbol` request.
*/
SymbolKind struct {
/**
* The symbol kind values the client supports. When this
* property exists the client also guarantees that it will
* handle values outside its set gracefully and falls back
* to a default value when unknown.
*
* If this property is not present the client only supports
* the symbol kinds from `File` to `Array` as defined in
* the initial version of the protocol.
*/
ValueSet []SymbolKind `json:"valueSet,omitempty"`
} `json:"symbolKind,omitempty"`
} `json:"symbol,omitempty"`
/**
* Capabilities specific to the `workspace/executeCommand` request.
*/
ExecuteCommand struct {
/**
* Execute command supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"executeCommand,omitempty"`
/**
* The client has support for workspace folders.
*
* Since 3.6.0
*/
WorkspaceFolders bool `json:"workspaceFolders,omitempty"`
/**
* The client supports `workspace/configuration` requests.
*
* Since 3.6.0
*/
Configuration bool `json:"configuration,omitempty"`
}
/**
* Text document specific client capabilities.
*/
type TextDocumentClientCapabilities struct {
Synchronization struct {
/**
* Whether text document synchronization supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* The client supports sending will save notifications.
*/
WillSave bool `json:"willSave,omitempty"`
/**
* The client supports sending a will save request and
* waits for a response providing text edits which will
* be applied to the document before it is saved.
*/
WillSaveWaitUntil bool `json:"willSaveWaitUntil,omitempty"`
/**
* The client supports did save notifications.
*/
DidSave bool `json:"didSave,omitempty"`
} `json:"synchronization,omitempty"`
/**
* Capabilities specific to the `textDocument/completion`
*/
Completion struct {
/**
* Whether completion supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* The client supports the following `CompletionItem` specific
* capabilities.
*/
CompletionItem struct {
/**
* Client supports snippets as insert text.
*
* 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.
*/
SnippetSupport bool `json:"snippetSupport,omitempty"`
/**
* Client supports commit characters on a completion item.
*/
CommitCharactersSupport bool `json:"commitCharactersSupport,omitempty"`
/**
* Client supports the follow content formats for the documentation
* property. The order describes the preferred format of the client.
*/
DocumentationFormat []MarkupKind `json:"documentationFormat,omitempty"`
/**
* Client supports the deprecated property on a completion item.
*/
DeprecatedSupport bool `json:"deprecatedSupport,omitempty"`
/**
* Client supports the preselect property on a completion item.
*/
PreselectSupport bool `json:"preselectSupport,omitempty"`
} `json:"completionItem,omitempty"`
CompletionItemKind struct {
/**
* The completion item kind values the client supports. When this
* property exists the client also guarantees that it will
* handle values outside its set gracefully and falls back
* to a default value when unknown.
*
* If this property is not present the client only supports
* the completion items kinds from `Text` to `Reference` as defined in
* the initial version of the protocol.
*/
ValueSet []CompletionItemKind `json:"valueSet,omitempty"`
} `json:"completionItemKind,omitempty"`
/**
* The client supports to send additional context information for a
* `textDocument/completion` request.
*/
ContextSupport bool `json:"contextSupport,omitempty"`
} `json:"completion"`
/**
* Capabilities specific to the `textDocument/hover`
*/
Hover struct {
/**
* Whether hover supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* Client supports the follow content formats for the content
* property. The order describes the preferred format of the client.
*/
ContentFormat []MarkupKind `json:"contentFormat,omitempty"`
} `json:"hover,omitempty"`
/**
* Capabilities specific to the `textDocument/signatureHelp`
*/
SignatureHelp struct {
/**
* Whether signature help supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* The client supports the following `SignatureInformation`
* specific properties.
*/
SignatureInformation struct {
/**
* Client supports the follow content formats for the documentation
* property. The order describes the preferred format of the client.
*/
DocumentationFormat []MarkupKind `json:"documentationFormat,omitempty"`
} `json:"signatureInformation,omitempty"`
} `json:"signatureHelp,omitempty"`
/**
* Capabilities specific to the `textDocument/references`
*/
References struct {
/**
* Whether references supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"references,omitempty"`
/**
* Capabilities specific to the `textDocument/documentHighlight`
*/
DocumentHighlight struct {
/**
* Whether document highlight supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"documentHighlight,omitempty"`
/**
* Capabilities specific to the `textDocument/documentSymbol`
*/
DocumentSymbol struct {
/**
* Whether document symbol supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* Specific capabilities for the `SymbolKind`.
*/
SymbolKind struct {
/**
* The symbol kind values the client supports. When this
* property exists the client also guarantees that it will
* handle values outside its set gracefully and falls back
* to a default value when unknown.
*
* If this property is not present the client only supports
* the symbol kinds from `File` to `Array` as defined in
* the initial version of the protocol.
*/
ValueSet []SymbolKind `json:"valueSet,omitempty"`
} `json:"symbolKind,omitempty"`
/**
* The client support hierarchical document symbols.
*/
HierarchicalDocumentSymbolSupport bool `json:"hierarchicalDocumentSymbolSupport,omitempty"`
} `json:"documentSymbol,omitempty"`
/**
* Capabilities specific to the `textDocument/formatting`
*/
Formatting struct {
/**
* Whether formatting supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"formatting,omitempty"`
/**
* Capabilities specific to the `textDocument/rangeFormatting`
*/
RangeFormatting struct {
/**
* Whether range formatting supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"rangeFormatting,omitempty"`
/**
* Capabilities specific to the `textDocument/onTypeFormatting`
*/
OnTypeFormatting struct {
/**
* Whether on type formatting supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"onTypeFormatting,omitempty"`
/**
* Capabilities specific to the `textDocument/definition`
*/
Definition struct {
/**
* Whether definition supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"definition,omitempty"`
/**
* Capabilities specific to the `textDocument/typeDefinition`
*
* Since 3.6.0
*/
TypeDefinition struct {
/**
* Whether typeDefinition supports dynamic registration. If this is set to `true`
* the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
* return value for the corresponding server capability as well.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"typeDefinition,omitempty"`
/**
* Capabilities specific to the `textDocument/implementation`.
*
* Since 3.6.0
*/
Implementation struct {
/**
* Whether implementation supports dynamic registration. If this is set to `true`
* the client supports the new `(TextDocumentRegistrationOptions & StaticRegistrationOptions)`
* return value for the corresponding server capability as well.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"implementation,omitempty"`
/**
* Capabilities specific to the `textDocument/codeAction`
*/
CodeAction struct {
/**
* Whether code action supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* The client support code action literals as a valid
* response of the `textDocument/codeAction` request.
*
* Since 3.8.0
*/
CodeActionLiteralSupport struct {
/**
* The code action kind is support with the following value
* set.
*/
CodeActionKind struct {
/**
* The code action kind values the client supports. When this
* property exists the client also guarantees that it will
* handle values outside its set gracefully and falls back
* to a default value when unknown.
*/
ValueSet []CodeActionKind `json:"valueSet"`
} `json:"codeActionKind"`
} `json:"codeActionLiteralSupport,omitempty"`
} `json:"codeAction,omitempty"`
/**
* Capabilities specific to the `textDocument/codeLens`
*/
CodeLens struct {
/**
* Whether code lens supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"codeLens,omitempty"`
/**
* Capabilities specific to the `textDocument/documentLink`
*/
DocumentLink struct {
/**
* Whether document link supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"documentLink,omitempty"`
/**
* Capabilities specific to the `textDocument/documentColor` and the
* `textDocument/colorPresentation` request.
*
* Since 3.6.0
*/
ColorProvider struct {
/**
* Whether colorProvider supports dynamic registration. If this is set to `true`
* the client supports the new `(ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
* return value for the corresponding server capability as well.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"colorProvider,omitempty"`
/**
* Capabilities specific to the `textDocument/rename`
*/
Rename struct {
/**
* Whether rename supports dynamic registration.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
} `json:"rename,omitempty"`
/**
* Capabilities specific to `textDocument/publishDiagnostics`.
*/
PublishDiagnostics struct {
/**
* Whether the clients accepts diagnostics with related information.
*/
RelatedInformation bool `json:"relatedInformation,omitempty"`
} `json:"publishDiagnostics,omitempty"`
/**
* Capabilities specific to `textDocument/foldingRange` requests.
*
* Since 3.10.0
*/
FoldingRange struct {
/**
* Whether implementation supports dynamic registration for folding range providers. If this is set to `true`
* the client supports the new `(FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)`
* return value for the corresponding server capability as well.
*/
DynamicRegistration bool `json:"dynamicRegistration,omitempty"`
/**
* The maximum number of folding ranges that the client prefers to receive per document. The value serves as a
* hint, servers are free to follow the limit.
*/
RangeLimit float64 `json:"rangeLimit,omitempty"`
/**
* If set, the client signals that it only supports folding complete lines. If set, client will
* ignore specified `startCharacter` and `endCharacter` properties in a FoldingRange.
*/
LineFoldingOnly bool `json:"lineFoldingOnly,omitempty"`
}
}
// ClientCapabilities now define capabilities for dynamic registration, workspace
// and text document features the client supports. The experimental can be used to
// pass experimental capabilities under development. For future compatibility a
// ClientCapabilities object literal can have more properties set than currently
// defined. Servers receiving a ClientCapabilities object literal with unknown
// properties should ignore these properties. A missing property should be
// interpreted as an absence of the capability. If a property is missing that
// defines sub properties all sub properties should be interpreted as an absence
// of the capability.
//
// Client capabilities got introduced with version 3.0 of the protocol. They
// therefore only describe capabilities that got introduced in 3.x or later.
// Capabilities that existed in the 2.x version of the protocol are still
// mandatory for clients. Clients cannot opt out of providing them. So even if a
// client omits the ClientCapabilities.textDocument.synchronization it is still
// required that the client provides text document synchronization (e.g. open,
// changed and close notifications).
type ClientCapabilities struct {
/**
* Workspace specific client capabilities.
*/
Workspace WorkspaceClientCapabilities `json:"workspace,omitempty"`
/**
* Text document specific client capabilities.
*/
TextDocument TextDocumentClientCapabilities `json:"textDocument,omitempty"`
/**
* Experimental client capabilities.
*/
Experimental interface{} `json:"experimental,omitempty"`
}
type InitializeResult struct {
/**
* The capabilities the language server provides.
*/
Capabilities ServerCapabilities `json:"capabilities"`
}
/**
* Defines how the host (editor) should sync document changes to the language server.
*/
type TextDocumentSyncKind float64
const (
/**
* Documents should not be synced at all.
*/
None TextDocumentSyncKind = 0
/**
* Documents are synced by always sending the full content
* of the document.
*/
Full TextDocumentSyncKind = 1
/**
* Documents are synced by sending the full content on open.
* After that only incremental updates to the document are
* send.
*/
Incremental TextDocumentSyncKind = 2
)
/**
* Completion options.
*/
type CompletionOptions struct {
/**
* The server provides support to resolve additional
* information for a completion item.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
/**
* The characters that trigger completion automatically.
*/
TriggerCharacters []string `json:"triggerCharacters,omitempty"`
}
/**
* Signature help options.
*/
type SignatureHelpOptions struct {
/**
* The characters that trigger signature help
* automatically.
*/
TriggerCharacters []string `json:"triggerCharacters,omitempty"`
}
/**
* Code Lens options.
*/
type CodeLensOptions struct {
/**
* Code lens has a resolve provider as well.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
}
/**
* Format document on type options.
*/
type DocumentOnTypeFormattingOptions struct {
/**
* A character on which formatting should be triggered, like `}`.
*/
FirstTriggerCharacter string `json:"firstTriggerCharacter"`
/**
* More trigger characters.
*/
MoreTriggerCharacter []string `json:"moreTriggerCharacter,omitempty"`
}
/**
* Document link options.
*/
type DocumentLinkOptions struct {
/**
* Document links have a resolve provider as well.
*/
ResolveProvider bool `json:"resolveProvider,omitempty"`
}
/**
* Execute command options.
*/
type ExecuteCommandOptions struct {
/**
* The commands to be executed on the server
*/
Commands []string `json:"commands"`
}
/**
* Save options.
*/
type SaveOptions struct {
/**
* The client is supposed to include the content on save.
*/
IncludeText bool `json:"includeText,omitempty"`
}
/**
* Color provider options.
*/
type ColorProviderOptions struct {
}
/**
* Folding range provider options.
*/
type FoldingRangeProviderOptions struct {
}
type TextDocumentSyncOptions struct {
/**
* Open and close notifications are sent to the server.
*/
OpenClose bool `json:"openClose,omitempty"`
/**
* Change notifications are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
* and TextDocumentSyncKind.Incremental. If omitted it defaults to TextDocumentSyncKind.None.
*/
Change float64 `json:"change,omitempty"`
/**
* Will save notifications are sent to the server.
*/
WillSave bool `json:"willSave,omitempty"`
/**
* Will save wait until requests are sent to the server.
*/
WillSaveWaitUntil bool `json:"willSaveWaitUntil,omitempty"`
/**
* Save notifications are sent to the server.
*/
Save SaveOptions `json:"save,omitempty"`
}
/**
* Static registration options to be returned in the initialize request.
*/
type StaticRegistrationOptions struct {
/**
* The id used to register the request. The id can be used to deregister
* the request again. See also Registration#id.
*/
ID string `json:"id,omitempty"`
}
type ServerCapabilities struct {
/**
* Defines how text documents are synced. Is either a detailed structure defining each notification or
* for backwards compatibility the TextDocumentSyncKind number. If omitted it defaults to `TextDocumentSyncKind.None`.
*/
TextDocumentSync interface{} `json:"textDocumentSync,omitempty"` // TextDocumentSyncOptions | number
/**
* The server provides hover support.
*/
HoverProvider bool `json:"hoverProvider,omitempty"`
/**
* The server provides completion support.
*/
CompletionProvider CompletionOptions `json:"completionProvider,omitempty"`
/**
* The server provides signature help support.
*/
SignatureHelpProvider SignatureHelpOptions `json:"signatureHelpProvider,omitempty"`
/**
* The server provides goto definition support.
*/
DefinitionProvider bool `json:"definitionProvider,omitempty"`
/**
* The server provides Goto Type Definition support.
*
* Since 3.6.0
*/
TypeDefinitionProvider interface{} `json:"typeDefinitionProvider,omitempty"` // boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions)
/**
* The server provides Goto Implementation support.
*
* Since 3.6.0
*/
ImplementationProvider interface{} `json:"implementationProvider,omitempty"` // boolean | (TextDocumentRegistrationOptions & StaticRegistrationOptions)
/**
* The server provides find references support.
*/
ReferencesProvider bool `json:"referencesProvider,omitempty"`
/**
* The server provides document highlight support.
*/
DocumentHighlightProvider bool `json:"documentHighlightProvider,omitempty"`
/**
* The server provides document symbol support.
*/
DocumentSymbolProvider bool `json:"documentSymbolProvider,omitempty"`
/**
* The server provides workspace symbol support.
*/
WorkspaceSymbolProvider bool `json:"workspaceSymbolProvider,omitempty"`
/**
* The server provides code actions.
*/
CodeActionProvider bool `json:"codeActionProvider,omitempty"`
/**
* The server provides code lens.
*/
CodeLensProvider CodeLensOptions `json:"codeLensProvider,omitempty"`
/**
* The server provides document formatting.
*/
DocumentFormattingProvider bool `json:"documentFormattingProvider,omitempty"`
/**
* The server provides document range formatting.
*/
DocumentRangeFormattingProvider bool `json:"documentRangeFormattingProvider,omitempty"`
/**
* The server provides document formatting on typing.
*/
DocumentOnTypeFormattingProvider DocumentOnTypeFormattingOptions `json:"documentOnTypeFormattingProvider,omitempty"`
/**
* The server provides rename support.
*/
RenameProvider bool `json:"renameProvider,omitempty"`
/**
* The server provides document link support.
*/
DocumentLinkProvider DocumentLinkOptions `json:"documentLinkProvider,omitempty"`
/**
* The server provides color provider support.
*
* Since 3.6.0
*/
//TODO: complex union type to decode here
ColorProvider interface{} `json:"colorProvider,omitempty"` // boolean | ColorProviderOptions | (ColorProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)
/**
* The server provides folding provider support.
*
* Since 3.10.0
*/
//TODO: complex union type to decode here
FoldingRangeProvider interface{} `json:"foldingRangeProvider,omitempty"` // boolean | FoldingRangeProviderOptions | (FoldingRangeProviderOptions & TextDocumentRegistrationOptions & StaticRegistrationOptions)
/**
* The server provides execute command support.
*/
ExecuteCommandProvider ExecuteCommandOptions `json:"executeCommandProvider,omitempty"`
/**
* Workspace specific server capabilities
*/
Workspace struct {
/**
* The server supports workspace folder.
*
* Since 3.6.0
*/
WorkspaceFolders struct {
/**
* The server has support for workspace folders
*/
Supported bool `json:"supported,omitempty"`
/**
* Whether the server wants to receive workspace folder
* change notifications.
*
* If a strings is provided the string is treated as a ID
* under which the notification is registered on the client
* side. The ID can be used to unregister for these events
* using the `client/unregisterCapability` request.
*/
ChangeNotifications interface{} `json:"changeNotifications,omitempty"` // string | boolean
} `json:"workspaceFolders,omitempty"`
} `json:"workspace,omitempty"`
/**
* Experimental server capabilities.
*/
Experimental interface{} `json:"experimental,omitempty"`
}
type InitializedParams struct {
}