mirror of
https://github.com/golang/go.git
synced 2025-05-05 23:53:05 +00:00
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>
This commit is contained in:
parent
e93be7f42f
commit
ff3f684ce0
362
internal/lsp/protocol/basic.go
Normal file
362
internal/lsp/protocol/basic.go
Normal file
@ -0,0 +1,362 @@
|
||||
// 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
|
||||
// "Basic JSON Structures" part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
const (
|
||||
// CodeRequestCancelled is the error code that is returned when a request is
|
||||
// cancelled early.
|
||||
CodeRequestCancelled = -32800
|
||||
)
|
||||
|
||||
// DocumentURI represents the URI of a document.
|
||||
// Many of the interfaces contain fields that correspond to the URI of a document.
|
||||
// For clarity, the type of such a field is declared as a DocumentURI.
|
||||
// Over the wire, it will still be transferred as a string, but this guarantees
|
||||
// that the contents of that string can be parsed as a valid URI.
|
||||
type DocumentURI string
|
||||
|
||||
// Position in a text document expressed as zero-based line and zero-based character offset.
|
||||
// A position is between two characters like an ‘insert’ cursor in a editor.
|
||||
type Position struct {
|
||||
/**
|
||||
* Line position in a document (zero-based).
|
||||
*/
|
||||
Line float64 `json:"line"`
|
||||
|
||||
/**
|
||||
* Character offset on a line in a document (zero-based). Assuming that the line is
|
||||
* represented as a string, the `character` value represents the gap between the
|
||||
* `character` and `character + 1`.
|
||||
*
|
||||
* If the character value is greater than the line length it defaults back to the
|
||||
* line length.
|
||||
*/
|
||||
Character float64 `json:"character"`
|
||||
}
|
||||
|
||||
// Range in a text document expressed as (zero-based) start and end positions.
|
||||
// A range is comparable to a selection in an editor.
|
||||
// Therefore the end position is exclusive.
|
||||
// If you want to specify a range that contains a line including the line
|
||||
// ending character(s) then use an end position denoting the start of the next
|
||||
// line.
|
||||
type Range struct {
|
||||
/**
|
||||
* The range's start position.
|
||||
*/
|
||||
Start Position `json:"start"`
|
||||
|
||||
/**
|
||||
* The range's end position.
|
||||
*/
|
||||
End Position `json:"end"`
|
||||
}
|
||||
|
||||
// Location represents a location inside a resource, such as a line inside a text file.
|
||||
type Location struct {
|
||||
URI DocumentURI `json:"uri"`
|
||||
Range Range `json:"range"`
|
||||
}
|
||||
|
||||
// Diagnostic represents a diagnostic, such as a compiler error or warning.
|
||||
// Diagnostic objects are only valid in the scope of a resource.
|
||||
type Diagnostic struct {
|
||||
/**
|
||||
* The range at which the message applies.
|
||||
*/
|
||||
Range Range `json:"range"`
|
||||
|
||||
/**
|
||||
* The diagnostic's severity. Can be omitted. If omitted it is up to the
|
||||
* client to interpret diagnostics as error, warning, info or hint.
|
||||
*/
|
||||
Severity DiagnosticSeverity `json:"severity,omitempty"`
|
||||
|
||||
/**
|
||||
* The diagnostic's code, which might appear in the user interface.
|
||||
*/
|
||||
Code string `json:"code,omitempty"` // number | string
|
||||
|
||||
/**
|
||||
* A human-readable string describing the source of this
|
||||
* diagnostic, e.g. 'typescript' or 'super lint'.
|
||||
*/
|
||||
Source string `json:"source,omitempty"`
|
||||
|
||||
/**
|
||||
* The diagnostic's message.
|
||||
*/
|
||||
Message string `json:"message"`
|
||||
|
||||
/**
|
||||
* An array of related diagnostic information, e.g. when symbol-names within
|
||||
* a scope collide all definitions can be marked via this property.
|
||||
*/
|
||||
Related []DiagnosticRelatedInformation `json:"relatedInformation,omitempty"`
|
||||
}
|
||||
|
||||
// DiagnosticSeverity indicates the severity of a Diagnostic message.
|
||||
type DiagnosticSeverity float64
|
||||
|
||||
const (
|
||||
/**
|
||||
* Reports an error.
|
||||
*/
|
||||
SeverityError DiagnosticSeverity = 1
|
||||
/**
|
||||
* Reports a warning.
|
||||
*/
|
||||
SeverityWarning DiagnosticSeverity = 2
|
||||
/**
|
||||
* Reports an information.
|
||||
*/
|
||||
SeverityInformation DiagnosticSeverity = 3
|
||||
/**
|
||||
* Reports a hint.
|
||||
*/
|
||||
SeverityHint DiagnosticSeverity = 4
|
||||
)
|
||||
|
||||
// DiagnosticRelatedInformation represents a related message and source code
|
||||
// location for a diagnostic.
|
||||
// This should be used to point to code locations that cause or related to a
|
||||
// diagnostics, e.g when duplicating a symbol in a scope.
|
||||
type DiagnosticRelatedInformation struct {
|
||||
/**
|
||||
* The location of this related diagnostic information.
|
||||
*/
|
||||
Location Location `json:"location"`
|
||||
|
||||
/**
|
||||
* The message of this related diagnostic information.
|
||||
*/
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
// Command represents a reference to a command.
|
||||
// Provides a title which will be used to represent a command in the UI.
|
||||
// Commands are identified by a string identifier.
|
||||
// The protocol currently doesn’t specify a set of well-known commands.
|
||||
// So executing a command requires some tool extension code.
|
||||
type Command struct {
|
||||
/**
|
||||
* Title of the command, like `save`.
|
||||
*/
|
||||
Title string `json:"title"`
|
||||
|
||||
/**
|
||||
* The identifier of the actual command handler.
|
||||
*/
|
||||
Command string `json:"command"`
|
||||
|
||||
/**
|
||||
* Arguments that the command handler should be
|
||||
* invoked with.
|
||||
*/
|
||||
Arguments []interface{} `json:"arguments,omitempty"`
|
||||
}
|
||||
|
||||
// TextEdit is a textual edit applicable to a text document.
|
||||
type TextEdit struct {
|
||||
/**
|
||||
* The range of the text document to be manipulated. To insert
|
||||
* text into a document create a range where start === end.
|
||||
*/
|
||||
Range Range `json:"range"`
|
||||
|
||||
/**
|
||||
* The string to be inserted. For delete operations use an
|
||||
* empty string.
|
||||
*/
|
||||
NewText string `json:"newText"`
|
||||
}
|
||||
|
||||
// TextDocumentEdit describes textual changes on a single text document.
|
||||
// The text document is referred to as a VersionedTextDocumentIdentifier to
|
||||
// allow clients to check the text document version before an edit is applied.
|
||||
// A TextDocumentEdit describes all changes on a version Si and after they are
|
||||
// applied move the document to version Si+1.
|
||||
// So the creator of a TextDocumentEdit doesn’t need to sort the array or do
|
||||
// any kind of ordering.
|
||||
// However the edits must be non overlapping.
|
||||
type TextDocumentEdit struct {
|
||||
/**
|
||||
* The text document to change.
|
||||
*/
|
||||
TextDocument VersionedTextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
/**
|
||||
* The edits to be applied.
|
||||
*/
|
||||
Edits []TextEdit `json:"edits"`
|
||||
}
|
||||
|
||||
// WorkspaceEdit represents changes to many resources managed in the workspace.
|
||||
// The edit should either provide Changes or DocumentChanges.
|
||||
// If the client can handle versioned document edits and if DocumentChanges are
|
||||
// present, the latter are preferred over Changes.
|
||||
type WorkspaceEdit struct {
|
||||
/**
|
||||
* Holds changes to existing resources.
|
||||
*/
|
||||
Changes map[DocumentURI][]TextEdit `json:"changes,omitempty"`
|
||||
|
||||
/**
|
||||
* An array of `TextDocumentEdit`s to express changes to n different text documents
|
||||
* where each text document edit addresses a specific version of a text document.
|
||||
* Whether a client supports versioned document edits is expressed via
|
||||
* `WorkspaceClientCapabilities.workspaceEdit.documentChanges`.
|
||||
*/
|
||||
DocumentChanges []TextDocumentEdit `json:"documentChanges,omitempty"`
|
||||
}
|
||||
|
||||
// TextDocumentIdentifier identifies a document using a URI.
|
||||
// On the protocol level, URIs are passed as strings.
|
||||
// The corresponding JSON structure looks like this.
|
||||
type TextDocumentIdentifier struct {
|
||||
/**
|
||||
* The text document's URI.
|
||||
*/
|
||||
URI DocumentURI `json:"uri"`
|
||||
}
|
||||
|
||||
// TextDocumentItem is an item to transfer a text document from the client to
|
||||
// the server.
|
||||
type TextDocumentItem struct {
|
||||
/**
|
||||
* The text document's URI.
|
||||
*/
|
||||
URI DocumentURI `json:"uri"`
|
||||
|
||||
/**
|
||||
* The text document's language identifier.
|
||||
*/
|
||||
LanguageID string `json:"languageId"`
|
||||
|
||||
/**
|
||||
* The version number of this document (it will increase after each
|
||||
* change, including undo/redo).
|
||||
*/
|
||||
Version float64 `json:"version"`
|
||||
|
||||
/**
|
||||
* The content of the opened text document.
|
||||
*/
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
// VersionedTextDocumentIdentifier is an identifier to denote a specific version of a text document.
|
||||
type VersionedTextDocumentIdentifier struct {
|
||||
TextDocumentIdentifier
|
||||
|
||||
/**
|
||||
* The version number of this document. If a versioned text document identifier
|
||||
* is sent from the server to the client and the file is not open in the editor
|
||||
* (the server has not received an open notification before) the server can send
|
||||
* `null` to indicate that the version is known and the content on disk is the
|
||||
* truth (as speced with document content ownership)
|
||||
*/
|
||||
Version *uint64 `json:"version"`
|
||||
}
|
||||
|
||||
// TextDocumentPositionParams is a parameter literal used in requests to pass
|
||||
// a text document and a position inside that document.
|
||||
type TextDocumentPositionParams struct {
|
||||
/**
|
||||
* The text document.
|
||||
*/
|
||||
TextDocument TextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
/**
|
||||
* The position inside the text document.
|
||||
*/
|
||||
Position Position `json:"position"`
|
||||
}
|
||||
|
||||
// DocumentFilter is a document filter denotes a document through properties
|
||||
// like language, scheme or pattern.
|
||||
// An example is a filter that applies to TypeScript files on disk.
|
||||
// Another example is a filter the applies to JSON files with name package.json:
|
||||
// { language: 'typescript', scheme: 'file' }
|
||||
// { language: 'json', pattern: '**/package.json' }
|
||||
type DocumentFilter struct {
|
||||
/**
|
||||
* A language id, like `typescript`.
|
||||
*/
|
||||
Language string `json:"language,omitempty"`
|
||||
|
||||
/**
|
||||
* A URI [scheme](#URI.scheme), like `file` or `untitled`.
|
||||
*/
|
||||
Scheme string `json:"scheme,omitempty"`
|
||||
|
||||
/**
|
||||
* A glob pattern, like `*.{ts,js}`.
|
||||
*/
|
||||
Pattern string `json:"pattern,omitempty"`
|
||||
}
|
||||
|
||||
// A document selector is the combination of one or more document filters.
|
||||
type DocumentSelector []DocumentFilter
|
||||
|
||||
/**
|
||||
* Describes the content type that a client supports in various
|
||||
* result literals like `Hover`, `ParameterInfo` or `CompletionItem`.
|
||||
*
|
||||
* Please note that `MarkupKinds` must not start with a `$`. This kinds
|
||||
* are reserved for internal usage.
|
||||
*/
|
||||
type MarkupKind string
|
||||
|
||||
const (
|
||||
/**
|
||||
* Plain text is supported as a content format
|
||||
*/
|
||||
PlainText MarkupKind = "plaintext"
|
||||
|
||||
/**
|
||||
* Markdown is supported as a content format
|
||||
*/
|
||||
Markdown MarkupKind = "markdown"
|
||||
)
|
||||
|
||||
/**
|
||||
* A `MarkupContent` literal represents a string value which content is interpreted base on its
|
||||
* kind flag. Currently the protocol supports `plaintext` and `markdown` as markup kinds.
|
||||
*
|
||||
* If the kind is `markdown` then the value can contain fenced code blocks like in GitHub issues.
|
||||
* See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting
|
||||
*
|
||||
* Here is an example how such a string can be constructed using JavaScript / TypeScript:
|
||||
* ```ts
|
||||
* let markdown: MarkdownContent = {
|
||||
* kind: MarkupKind.Markdown,
|
||||
* value: [
|
||||
* '# Header',
|
||||
* 'Some text',
|
||||
* '```typescript',
|
||||
* 'someCode();',
|
||||
* '```'
|
||||
* ].join('\n')
|
||||
* };
|
||||
* ```
|
||||
*
|
||||
* *Please Note* that clients might sanitize the return markdown. A client could decide to
|
||||
* remove HTML from the markdown to avoid script execution.
|
||||
*/
|
||||
type MarkupContent struct {
|
||||
/**
|
||||
* The type of the Markup
|
||||
*/
|
||||
Kind MarkupKind `json:"kind"`
|
||||
|
||||
/**
|
||||
* The content itself
|
||||
*/
|
||||
Value string `json:"value"`
|
||||
}
|
205
internal/lsp/protocol/client.go
Normal file
205
internal/lsp/protocol/client.go
Normal file
@ -0,0 +1,205 @@
|
||||
// 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.
|
||||
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"golang.org/x/tools/internal/jsonrpc2"
|
||||
)
|
||||
|
||||
type Client interface {
|
||||
ShowMessage(context.Context, *ShowMessageParams) error
|
||||
ShowMessageRequest(context.Context, *ShowMessageRequestParams) (*MessageActionItem, error)
|
||||
LogMessage(context.Context, *LogMessageParams) error
|
||||
Telemetry(context.Context, interface{}) error
|
||||
RegisterCapability(context.Context, *RegistrationParams) error
|
||||
UnregisterCapability(context.Context, *UnregistrationParams) error
|
||||
WorkspaceFolders(context.Context) ([]WorkspaceFolder, error)
|
||||
Configuration(context.Context, *ConfigurationParams) ([]interface{}, error)
|
||||
ApplyEdit(context.Context, *ApplyWorkspaceEditParams) (bool, error)
|
||||
PublishDiagnostics(context.Context, *PublishDiagnosticsParams) error
|
||||
}
|
||||
|
||||
func clientHandler(client Client) jsonrpc2.Handler {
|
||||
return func(ctx context.Context, conn *jsonrpc2.Conn, r *jsonrpc2.Request) (interface{}, *jsonrpc2.Error) {
|
||||
switch r.Method {
|
||||
case "$/cancelRequest":
|
||||
var params CancelParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
conn.Cancel(params.ID)
|
||||
return nil, nil
|
||||
|
||||
case "window/showMessage":
|
||||
var params ShowMessageParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.ShowMessage(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "window/showMessageRequest":
|
||||
var params ShowMessageRequestParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := client.ShowMessageRequest(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "window/logMessage":
|
||||
var params LogMessageParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.LogMessage(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "telemetry/event":
|
||||
var params interface{}
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.Telemetry(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "client/registerCapability":
|
||||
var params RegistrationParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.RegisterCapability(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "client/unregisterCapability":
|
||||
var params UnregistrationParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.UnregisterCapability(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "workspace/workspaceFolders":
|
||||
if r.Params != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidParams, "Expected no params")
|
||||
}
|
||||
resp, err := client.WorkspaceFolders(ctx)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "workspace/configuration":
|
||||
var params ConfigurationParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := client.Configuration(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "workspace/applyEdit":
|
||||
var params ApplyWorkspaceEditParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := client.ApplyEdit(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/publishDiagnostics":
|
||||
var params PublishDiagnosticsParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := client.PublishDiagnostics(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
default:
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeMethodNotFound, "method %q not found", r.Method)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type clientDispatcher struct {
|
||||
*jsonrpc2.Conn
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) ShowMessage(ctx context.Context, params *ShowMessageParams) error {
|
||||
return c.Conn.Notify(ctx, "window/showMessage", params)
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) ShowMessageRequest(ctx context.Context, params *ShowMessageRequestParams) (*MessageActionItem, error) {
|
||||
var result MessageActionItem
|
||||
if err := c.Conn.Call(ctx, "window/showMessageRequest", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) LogMessage(ctx context.Context, params *LogMessageParams) error {
|
||||
return c.Conn.Notify(ctx, "window/logMessage", params)
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) Telemetry(ctx context.Context, params interface{}) error {
|
||||
return c.Conn.Notify(ctx, "telemetry/event", params)
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) RegisterCapability(ctx context.Context, params *RegistrationParams) error {
|
||||
return c.Conn.Notify(ctx, "client/registerCapability", params)
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) UnregisterCapability(ctx context.Context, params *UnregistrationParams) error {
|
||||
return c.Conn.Notify(ctx, "client/unregisterCapability", params)
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) WorkspaceFolders(ctx context.Context) ([]WorkspaceFolder, error) {
|
||||
var result []WorkspaceFolder
|
||||
if err := c.Conn.Call(ctx, "workspace/workspaceFolders", nil, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) Configuration(ctx context.Context, params *ConfigurationParams) ([]interface{}, error) {
|
||||
var result []interface{}
|
||||
if err := c.Conn.Call(ctx, "workspace/configuration", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) ApplyEdit(ctx context.Context, params *ApplyWorkspaceEditParams) (bool, error) {
|
||||
var result bool
|
||||
if err := c.Conn.Call(ctx, "workspace/applyEdit", params, &result); err != nil {
|
||||
return false, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (c *clientDispatcher) PublishDiagnostics(ctx context.Context, params *PublishDiagnosticsParams) error {
|
||||
return c.Conn.Notify(ctx, "textDocument/publishDiagnostics", params)
|
||||
}
|
20
internal/lsp/protocol/diagnostics.go
Normal file
20
internal/lsp/protocol/diagnostics.go
Normal file
@ -0,0 +1,20 @@
|
||||
// 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
|
||||
// "Diagnostics" part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
type PublishDiagnosticsParams struct {
|
||||
/**
|
||||
* The URI for which diagnostic information is reported.
|
||||
*/
|
||||
URI DocumentURI `json:"uri"`
|
||||
|
||||
/**
|
||||
* An array of diagnostic information items.
|
||||
*/
|
||||
Diagnostics []Diagnostic `json:"diagnostics"`
|
||||
}
|
16
internal/lsp/protocol/doc.go
Normal file
16
internal/lsp/protocol/doc.go
Normal file
@ -0,0 +1,16 @@
|
||||
// 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.
|
||||
|
||||
// Package protocol contains the structs that map directly to the wire format
|
||||
// of the "Language Server Protocol".
|
||||
//
|
||||
// It is a literal transcription, with unmodified comments, and only the changes
|
||||
// required to make it go code.
|
||||
// Names are uppercased to export them.
|
||||
// All fields have JSON tags added to correct the names.
|
||||
// Fields marked with a ? are also marked as "omitempty"
|
||||
// Fields that are "|| null" are made pointers
|
||||
// Fields that are string or number are left as string
|
||||
// Fields that are type "number" are made float64
|
||||
package protocol
|
849
internal/lsp/protocol/general.go
Normal file
849
internal/lsp/protocol/general.go
Normal file
@ -0,0 +1,849 @@
|
||||
// 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 {
|
||||
}
|
1020
internal/lsp/protocol/language.go
Normal file
1020
internal/lsp/protocol/language.go
Normal file
File diff suppressed because it is too large
Load Diff
34
internal/lsp/protocol/protocol.go
Normal file
34
internal/lsp/protocol/protocol.go
Normal file
@ -0,0 +1,34 @@
|
||||
// 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.
|
||||
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"golang.org/x/tools/internal/jsonrpc2"
|
||||
)
|
||||
|
||||
func canceller(ctx context.Context, conn *jsonrpc2.Conn, req *jsonrpc2.Request) {
|
||||
conn.Notify(context.Background(), "$/cancelRequest", &CancelParams{ID: *req.ID})
|
||||
}
|
||||
|
||||
func RunClient(ctx context.Context, stream jsonrpc2.Stream, client Client, opts ...interface{}) (*jsonrpc2.Conn, Server) {
|
||||
opts = append([]interface{}{clientHandler(client), canceller}, opts...)
|
||||
conn := jsonrpc2.NewConn(ctx, stream, opts...)
|
||||
return conn, &serverDispatcher{Conn: conn}
|
||||
}
|
||||
|
||||
func RunServer(ctx context.Context, stream jsonrpc2.Stream, server Server, opts ...interface{}) (*jsonrpc2.Conn, Client) {
|
||||
opts = append([]interface{}{serverHandler(server), canceller}, opts...)
|
||||
conn := jsonrpc2.NewConn(ctx, stream, opts...)
|
||||
return conn, &clientDispatcher{Conn: conn}
|
||||
}
|
||||
|
||||
func toJSONError(err error) *jsonrpc2.Error {
|
||||
if jsonError, ok := err.(*jsonrpc2.Error); ok {
|
||||
return jsonError
|
||||
}
|
||||
return jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
61
internal/lsp/protocol/registration.go
Normal file
61
internal/lsp/protocol/registration.go
Normal file
@ -0,0 +1,61 @@
|
||||
// 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
|
||||
// "Client" part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
/**
|
||||
* General parameters to register for a capability.
|
||||
*/
|
||||
type Registration struct {
|
||||
/**
|
||||
* The id used to register the request. The id can be used to deregister
|
||||
* the request again.
|
||||
*/
|
||||
ID string `json:"id"`
|
||||
|
||||
/**
|
||||
* The method / capability to register for.
|
||||
*/
|
||||
Method string `json:"method"`
|
||||
|
||||
/**
|
||||
* Options necessary for the registration.
|
||||
*/
|
||||
RegisterOptions interface{} `json:"registerOptions,omitempty"`
|
||||
}
|
||||
|
||||
type RegistrationParams struct {
|
||||
Registrations []Registration `json:"registrations"`
|
||||
}
|
||||
|
||||
type TextDocumentRegistrationOptions struct {
|
||||
/**
|
||||
* A document selector to identify the scope of the registration. If set to null
|
||||
* the document selector provided on the client side will be used.
|
||||
*/
|
||||
DocumentSelector *DocumentSelector `json:"documentSelector"`
|
||||
}
|
||||
|
||||
/**
|
||||
* General parameters to unregister a capability.
|
||||
*/
|
||||
type Unregistration struct {
|
||||
/**
|
||||
* The id used to unregister the request or notification. Usually an id
|
||||
* provided during the register request.
|
||||
*/
|
||||
ID string `json:"id"`
|
||||
|
||||
/**
|
||||
* The method / capability to unregister for.
|
||||
*/
|
||||
Method string `json:"method"`
|
||||
}
|
||||
|
||||
type UnregistrationParams struct {
|
||||
Unregisterations []Unregistration `json:"unregisterations"`
|
||||
}
|
718
internal/lsp/protocol/server.go
Normal file
718
internal/lsp/protocol/server.go
Normal file
@ -0,0 +1,718 @@
|
||||
// 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.
|
||||
|
||||
package protocol
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
|
||||
"golang.org/x/tools/internal/jsonrpc2"
|
||||
)
|
||||
|
||||
type Server interface {
|
||||
Initialize(context.Context, *InitializeParams) (*InitializeResult, error)
|
||||
Initialized(context.Context, *InitializedParams) error
|
||||
Shutdown(context.Context) error
|
||||
Exit(context.Context) error
|
||||
DidChangeWorkspaceFolders(context.Context, *DidChangeWorkspaceFoldersParams) error
|
||||
DidChangeConfiguration(context.Context, *DidChangeConfigurationParams) error
|
||||
DidChangeWatchedFiles(context.Context, *DidChangeWatchedFilesParams) error
|
||||
Symbols(context.Context, *WorkspaceSymbolParams) ([]SymbolInformation, error)
|
||||
ExecuteCommand(context.Context, *ExecuteCommandParams) (interface{}, error)
|
||||
DidOpen(context.Context, *DidOpenTextDocumentParams) error
|
||||
DidChange(context.Context, *DidChangeTextDocumentParams) error
|
||||
WillSave(context.Context, *WillSaveTextDocumentParams) error
|
||||
WillSaveWaitUntil(context.Context, *WillSaveTextDocumentParams) ([]TextEdit, error)
|
||||
DidSave(context.Context, *DidSaveTextDocumentParams) error
|
||||
DidClose(context.Context, *DidCloseTextDocumentParams) error
|
||||
Completion(context.Context, *CompletionParams) (*CompletionList, error)
|
||||
CompletionResolve(context.Context, *CompletionItem) (*CompletionItem, error)
|
||||
Hover(context.Context, *TextDocumentPositionParams) (*Hover, error)
|
||||
SignatureHelp(context.Context, *TextDocumentPositionParams) (*SignatureHelp, error)
|
||||
Definition(context.Context, *TextDocumentPositionParams) ([]Location, error)
|
||||
TypeDefinition(context.Context, *TextDocumentPositionParams) ([]Location, error)
|
||||
Implementation(context.Context, *TextDocumentPositionParams) ([]Location, error)
|
||||
References(context.Context, *ReferenceParams) ([]Location, error)
|
||||
DocumentHighlight(context.Context, *TextDocumentPositionParams) ([]DocumentHighlight, error)
|
||||
DocumentSymbol(context.Context, *DocumentSymbolParams) ([]DocumentSymbol, error)
|
||||
CodeAction(context.Context, *CodeActionParams) ([]CodeAction, error)
|
||||
CodeLens(context.Context, *CodeLensParams) ([]CodeLens, error)
|
||||
CodeLensResolve(context.Context, *CodeLens) (*CodeLens, error)
|
||||
DocumentLink(context.Context, *DocumentLinkParams) ([]DocumentLink, error)
|
||||
DocumentLinkResolve(context.Context, *DocumentLink) (*DocumentLink, error)
|
||||
DocumentColor(context.Context, *DocumentColorParams) ([]ColorInformation, error)
|
||||
ColorPresentation(context.Context, *ColorPresentationParams) ([]ColorPresentation, error)
|
||||
Formatting(context.Context, *DocumentFormattingParams) ([]TextEdit, error)
|
||||
RangeFormatting(context.Context, *DocumentRangeFormattingParams) ([]TextEdit, error)
|
||||
OnTypeFormatting(context.Context, *DocumentOnTypeFormattingParams) ([]TextEdit, error)
|
||||
Rename(context.Context, *RenameParams) ([]WorkspaceEdit, error)
|
||||
FoldingRanges(context.Context, *FoldingRangeRequestParam) ([]FoldingRange, error)
|
||||
}
|
||||
|
||||
func serverHandler(server Server) jsonrpc2.Handler {
|
||||
return func(ctx context.Context, conn *jsonrpc2.Conn, r *jsonrpc2.Request) (interface{}, *jsonrpc2.Error) {
|
||||
switch r.Method {
|
||||
case "initialize":
|
||||
var params InitializeParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Initialize(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "initialized":
|
||||
var params InitializedParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.Initialized(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "shutdown":
|
||||
if r.Params != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidParams, "Expected no params")
|
||||
}
|
||||
if err := server.Shutdown(ctx); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "exit":
|
||||
if r.Params != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeInvalidParams, "Expected no params")
|
||||
}
|
||||
if err := server.Exit(ctx); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "$/cancelRequest":
|
||||
var params CancelParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
conn.Cancel(params.ID)
|
||||
return nil, nil
|
||||
|
||||
case "workspace/didChangeWorkspaceFolders":
|
||||
var params DidChangeWorkspaceFoldersParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidChangeWorkspaceFolders(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "workspace/didChangeConfiguration":
|
||||
var params DidChangeConfigurationParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidChangeConfiguration(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "workspace/didChangeWatchedFiles":
|
||||
var params DidChangeWatchedFilesParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidChangeWatchedFiles(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "workspace/symbol":
|
||||
var params WorkspaceSymbolParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Symbols(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "workspace/executeCommand":
|
||||
var params ExecuteCommandParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.ExecuteCommand(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/didOpen":
|
||||
var params DidOpenTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidOpen(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "textDocument/didChange":
|
||||
var params DidChangeTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidChange(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "textDocument/willSave":
|
||||
var params WillSaveTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.WillSave(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "textDocument/willSaveWaitUntil":
|
||||
var params WillSaveTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.WillSaveWaitUntil(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/didSave":
|
||||
var params DidSaveTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidSave(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "textDocument/didClose":
|
||||
var params DidCloseTextDocumentParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
if err := server.DidClose(ctx, ¶ms); err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return nil, nil
|
||||
|
||||
case "textDocument/completion":
|
||||
var params CompletionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Completion(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "completionItem/resolve":
|
||||
var params CompletionItem
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.CompletionResolve(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/hover":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Hover(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/signatureHelp":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.SignatureHelp(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/definition":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Definition(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/typeDefinition":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.TypeDefinition(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/implementation":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Implementation(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/references":
|
||||
var params ReferenceParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.References(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/documentHighlight":
|
||||
var params TextDocumentPositionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.DocumentHighlight(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/documentSymbol":
|
||||
var params DocumentSymbolParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.DocumentSymbol(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/codeAction":
|
||||
var params CodeActionParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.CodeAction(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/codeLens":
|
||||
var params CodeLensParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.CodeLens(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "codeLens/resolve":
|
||||
var params CodeLens
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.CodeLensResolve(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/documentLink":
|
||||
var params DocumentLinkParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.DocumentLink(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "documentLink/resolve":
|
||||
var params DocumentLink
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.DocumentLinkResolve(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/documentColor":
|
||||
var params DocumentColorParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.DocumentColor(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/colorPresentation":
|
||||
var params ColorPresentationParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.ColorPresentation(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/formatting":
|
||||
var params DocumentFormattingParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Formatting(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/rangeFormatting":
|
||||
var params DocumentRangeFormattingParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.RangeFormatting(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/onTypeFormatting":
|
||||
var params DocumentOnTypeFormattingParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.OnTypeFormatting(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/rename":
|
||||
var params RenameParams
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.Rename(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
|
||||
case "textDocument/foldingRanges":
|
||||
var params FoldingRangeRequestParam
|
||||
if err := json.Unmarshal(*r.Params, ¶ms); err != nil {
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeParseError, "%v", err)
|
||||
}
|
||||
resp, err := server.FoldingRanges(ctx, ¶ms)
|
||||
if err != nil {
|
||||
return nil, toJSONError(err)
|
||||
}
|
||||
return resp, nil
|
||||
default:
|
||||
return nil, jsonrpc2.NewErrorf(jsonrpc2.CodeMethodNotFound, "method %q not found", r.Method)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type serverDispatcher struct {
|
||||
*jsonrpc2.Conn
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Initialize(ctx context.Context, params *InitializeParams) (*InitializeResult, error) {
|
||||
var result InitializeResult
|
||||
if err := s.Conn.Call(ctx, "initialize", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Initialized(ctx context.Context, params *InitializedParams) error {
|
||||
return s.Conn.Notify(ctx, "initialized", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Shutdown(ctx context.Context) error {
|
||||
return s.Conn.Call(ctx, "shutdown", nil, nil)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Exit(ctx context.Context) error {
|
||||
return s.Conn.Notify(ctx, "exit", nil)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidChangeWorkspaceFolders(ctx context.Context, params *DidChangeWorkspaceFoldersParams) error {
|
||||
return s.Conn.Notify(ctx, "workspace/didChangeWorkspaceFolders", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidChangeConfiguration(ctx context.Context, params *DidChangeConfigurationParams) error {
|
||||
return s.Conn.Notify(ctx, "workspace/didChangeConfiguration", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidChangeWatchedFiles(ctx context.Context, params *DidChangeWatchedFilesParams) error {
|
||||
return s.Conn.Notify(ctx, "workspace/didChangeWatchedFiles", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Symbols(ctx context.Context, params *WorkspaceSymbolParams) ([]SymbolInformation, error) {
|
||||
var result []SymbolInformation
|
||||
if err := s.Conn.Call(ctx, "workspace/symbol", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) ExecuteCommand(ctx context.Context, params *ExecuteCommandParams) (interface{}, error) {
|
||||
var result interface{}
|
||||
if err := s.Conn.Call(ctx, "workspace/executeCommand", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidOpen(ctx context.Context, params *DidOpenTextDocumentParams) error {
|
||||
return s.Conn.Notify(ctx, "textDocument/didOpen", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidChange(ctx context.Context, params *DidChangeTextDocumentParams) error {
|
||||
return s.Conn.Notify(ctx, "textDocument/didChange", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) WillSave(ctx context.Context, params *WillSaveTextDocumentParams) error {
|
||||
return s.Conn.Notify(ctx, "textDocument/willSave", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) WillSaveWaitUntil(ctx context.Context, params *WillSaveTextDocumentParams) ([]TextEdit, error) {
|
||||
var result []TextEdit
|
||||
if err := s.Conn.Call(ctx, "textDocument/willSaveWaitUntil", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidSave(ctx context.Context, params *DidSaveTextDocumentParams) error {
|
||||
return s.Conn.Notify(ctx, "textDocument/didSave", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DidClose(ctx context.Context, params *DidCloseTextDocumentParams) error {
|
||||
return s.Conn.Notify(ctx, "textDocument/didClose", params)
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Completion(ctx context.Context, params *CompletionParams) (*CompletionList, error) {
|
||||
var result CompletionList
|
||||
if err := s.Conn.Call(ctx, "textDocument/completion", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) CompletionResolve(ctx context.Context, params *CompletionItem) (*CompletionItem, error) {
|
||||
var result CompletionItem
|
||||
if err := s.Conn.Call(ctx, "completionItem/resolve", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Hover(ctx context.Context, params *TextDocumentPositionParams) (*Hover, error) {
|
||||
var result Hover
|
||||
if err := s.Conn.Call(ctx, "textDocument/hover", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) SignatureHelp(ctx context.Context, params *TextDocumentPositionParams) (*SignatureHelp, error) {
|
||||
var result SignatureHelp
|
||||
if err := s.Conn.Call(ctx, "textDocument/signatureHelp", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Definition(ctx context.Context, params *TextDocumentPositionParams) ([]Location, error) {
|
||||
var result []Location
|
||||
if err := s.Conn.Call(ctx, "textDocument/definition", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) TypeDefinition(ctx context.Context, params *TextDocumentPositionParams) ([]Location, error) {
|
||||
var result []Location
|
||||
if err := s.Conn.Call(ctx, "textDocument/typeDefinition", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Implementation(ctx context.Context, params *TextDocumentPositionParams) ([]Location, error) {
|
||||
var result []Location
|
||||
if err := s.Conn.Call(ctx, "textDocument/implementation", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) References(ctx context.Context, params *ReferenceParams) ([]Location, error) {
|
||||
var result []Location
|
||||
if err := s.Conn.Call(ctx, "textDocument/references", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DocumentHighlight(ctx context.Context, params *TextDocumentPositionParams) ([]DocumentHighlight, error) {
|
||||
var result []DocumentHighlight
|
||||
if err := s.Conn.Call(ctx, "textDocument/documentHighlight", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DocumentSymbol(ctx context.Context, params *DocumentSymbolParams) ([]DocumentSymbol, error) {
|
||||
var result []DocumentSymbol
|
||||
if err := s.Conn.Call(ctx, "textDocument/documentSymbol", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) CodeAction(ctx context.Context, params *CodeActionParams) ([]CodeAction, error) {
|
||||
var result []CodeAction
|
||||
if err := s.Conn.Call(ctx, "textDocument/codeAction", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) CodeLens(ctx context.Context, params *CodeLensParams) ([]CodeLens, error) {
|
||||
var result []CodeLens
|
||||
if err := s.Conn.Call(ctx, "textDocument/codeLens", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) CodeLensResolve(ctx context.Context, params *CodeLens) (*CodeLens, error) {
|
||||
var result CodeLens
|
||||
if err := s.Conn.Call(ctx, "codeLens/resolve", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DocumentLink(ctx context.Context, params *DocumentLinkParams) ([]DocumentLink, error) {
|
||||
var result []DocumentLink
|
||||
if err := s.Conn.Call(ctx, "textDocument/documentLink", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DocumentLinkResolve(ctx context.Context, params *DocumentLink) (*DocumentLink, error) {
|
||||
var result DocumentLink
|
||||
if err := s.Conn.Call(ctx, "documentLink/resolve", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) DocumentColor(ctx context.Context, params *DocumentColorParams) ([]ColorInformation, error) {
|
||||
var result []ColorInformation
|
||||
if err := s.Conn.Call(ctx, "textDocument/documentColor", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) ColorPresentation(ctx context.Context, params *ColorPresentationParams) ([]ColorPresentation, error) {
|
||||
var result []ColorPresentation
|
||||
if err := s.Conn.Call(ctx, "textDocument/colorPresentation", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Formatting(ctx context.Context, params *DocumentFormattingParams) ([]TextEdit, error) {
|
||||
var result []TextEdit
|
||||
if err := s.Conn.Call(ctx, "textDocument/formatting", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) RangeFormatting(ctx context.Context, params *DocumentRangeFormattingParams) ([]TextEdit, error) {
|
||||
var result []TextEdit
|
||||
if err := s.Conn.Call(ctx, "textDocument/rangeFormatting", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) OnTypeFormatting(ctx context.Context, params *DocumentOnTypeFormattingParams) ([]TextEdit, error) {
|
||||
var result []TextEdit
|
||||
if err := s.Conn.Call(ctx, "textDocument/onTypeFormatting", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) Rename(ctx context.Context, params *RenameParams) ([]WorkspaceEdit, error) {
|
||||
var result []WorkspaceEdit
|
||||
if err := s.Conn.Call(ctx, "textDocument/rename", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *serverDispatcher) FoldingRanges(ctx context.Context, params *FoldingRangeRequestParam) ([]FoldingRange, error) {
|
||||
var result []FoldingRange
|
||||
if err := s.Conn.Call(ctx, "textDocument/foldingRanges", params, &result); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
130
internal/lsp/protocol/text.go
Normal file
130
internal/lsp/protocol/text.go
Normal file
@ -0,0 +1,130 @@
|
||||
// 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
|
||||
// "Text Synchronization" part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
type DidOpenTextDocumentParams struct {
|
||||
/**
|
||||
* The document that was opened.
|
||||
*/
|
||||
TextDocument TextDocumentItem `json:"textDocument"`
|
||||
}
|
||||
|
||||
type DidChangeTextDocumentParams struct {
|
||||
/**
|
||||
* The document that did change. The version number points
|
||||
* to the version after all provided content changes have
|
||||
* been applied.
|
||||
*/
|
||||
TextDocument VersionedTextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
/**
|
||||
* The actual content changes. The content changes describe single state changes
|
||||
* to the document. So if there are two content changes c1 and c2 for a document
|
||||
* in state S10 then c1 move the document to S11 and c2 to S12.
|
||||
*/
|
||||
ContentChanges []TextDocumentContentChangeEvent `json:"contentChanges"`
|
||||
}
|
||||
|
||||
/**
|
||||
* An event describing a change to a text document. If range and rangeLength are omitted
|
||||
* the new text is considered to be the full content of the document.
|
||||
*/
|
||||
type TextDocumentContentChangeEvent struct {
|
||||
/**
|
||||
* The range of the document that changed.
|
||||
*/
|
||||
Range Range `json:"range,omitempty"`
|
||||
|
||||
/**
|
||||
* The length of the range that got replaced.
|
||||
*/
|
||||
RangeLength float64 `json:"rangeLength,omitempty"`
|
||||
|
||||
/**
|
||||
* The new text of the range/document.
|
||||
*/
|
||||
Text string `json:"text"`
|
||||
}
|
||||
|
||||
/**
|
||||
* Describe options to be used when registering for text document change events.
|
||||
*/
|
||||
type TextDocumentChangeRegistrationOptions struct {
|
||||
TextDocumentRegistrationOptions
|
||||
/**
|
||||
* How documents are synced to the server. See TextDocumentSyncKind.Full
|
||||
* and TextDocumentSyncKind.Incremental.
|
||||
*/
|
||||
SyncKind float64 `json:"syncKind"`
|
||||
}
|
||||
|
||||
/**
|
||||
* The parameters send in a will save text document notification.
|
||||
*/
|
||||
type WillSaveTextDocumentParams struct {
|
||||
/**
|
||||
* The document that will be saved.
|
||||
*/
|
||||
TextDocument TextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
/**
|
||||
* The 'TextDocumentSaveReason'.
|
||||
*/
|
||||
Reason TextDocumentSaveReason `json:"reason"`
|
||||
}
|
||||
|
||||
/**
|
||||
* Represents reasons why a text document is saved.
|
||||
*/
|
||||
type TextDocumentSaveReason float64
|
||||
|
||||
const (
|
||||
/**
|
||||
* Manually triggered, e.g. by the user pressing save, by starting debugging,
|
||||
* or by an API call.
|
||||
*/
|
||||
Manual TextDocumentSaveReason = 1
|
||||
|
||||
/**
|
||||
* Automatic after a delay.
|
||||
*/
|
||||
AfterDelay TextDocumentSaveReason = 2
|
||||
|
||||
/**
|
||||
* When the editor lost focus.
|
||||
*/
|
||||
FocusOut TextDocumentSaveReason = 3
|
||||
)
|
||||
|
||||
type DidSaveTextDocumentParams struct {
|
||||
/**
|
||||
* The document that was saved.
|
||||
*/
|
||||
TextDocument TextDocumentIdentifier `json:"textDocument"`
|
||||
|
||||
/**
|
||||
* Optional the content when saved. Depends on the includeText value
|
||||
* when the save notification was requested.
|
||||
*/
|
||||
Text string `json:"text,omitempty"`
|
||||
}
|
||||
|
||||
type TextDocumentSaveRegistrationOptions struct {
|
||||
TextDocumentRegistrationOptions
|
||||
/**
|
||||
* The client is supposed to include the content on save.
|
||||
*/
|
||||
IncludeText bool `json:"includeText,omitempty"`
|
||||
}
|
||||
|
||||
type DidCloseTextDocumentParams struct {
|
||||
/**
|
||||
* The document that was closed.
|
||||
*/
|
||||
TextDocument TextDocumentIdentifier `json:"textDocument"`
|
||||
}
|
77
internal/lsp/protocol/window.go
Normal file
77
internal/lsp/protocol/window.go
Normal file
@ -0,0 +1,77 @@
|
||||
// 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
|
||||
// "Window" messages part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
type ShowMessageParams struct {
|
||||
/**
|
||||
* The message type. See {@link MessageType}.
|
||||
*/
|
||||
Type MessageType `json:"type"`
|
||||
|
||||
/**
|
||||
* The actual message.
|
||||
*/
|
||||
Message string `json:"message"`
|
||||
}
|
||||
|
||||
type MessageType float64
|
||||
|
||||
const (
|
||||
/**
|
||||
* An error message.
|
||||
*/
|
||||
Error MessageType = 1
|
||||
/**
|
||||
* A warning message.
|
||||
*/
|
||||
Warning MessageType = 2
|
||||
/**
|
||||
* An information message.
|
||||
*/
|
||||
Info MessageType = 3
|
||||
/**
|
||||
* A log message.
|
||||
*/
|
||||
Log MessageType = 4
|
||||
)
|
||||
|
||||
type ShowMessageRequestParams struct {
|
||||
/**
|
||||
* The message type. See {@link MessageType}.
|
||||
*/
|
||||
Type MessageType `json:"type"`
|
||||
|
||||
/**
|
||||
* The actual message.
|
||||
*/
|
||||
Message string `json:"message"`
|
||||
|
||||
/**
|
||||
* The message action items to present.
|
||||
*/
|
||||
Actions []MessageActionItem `json:"actions,omitempty"`
|
||||
}
|
||||
|
||||
type MessageActionItem struct {
|
||||
/**
|
||||
* A short title like 'Retry', 'Open Log' etc.
|
||||
*/
|
||||
Title string
|
||||
}
|
||||
|
||||
type LogMessageParams struct {
|
||||
/**
|
||||
* The message type. See {@link MessageType}.
|
||||
*/
|
||||
Type MessageType `json:"type"`
|
||||
|
||||
/**
|
||||
* The actual message.
|
||||
*/
|
||||
Message string `json:"message"`
|
||||
}
|
203
internal/lsp/protocol/workspace.go
Normal file
203
internal/lsp/protocol/workspace.go
Normal file
@ -0,0 +1,203 @@
|
||||
// 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
|
||||
// "Workspace" part of the LSP specification.
|
||||
|
||||
package protocol
|
||||
|
||||
type WorkspaceFolder struct {
|
||||
/**
|
||||
* The associated URI for this workspace folder.
|
||||
*/
|
||||
URI string `json:"uri"`
|
||||
|
||||
/**
|
||||
* The name of the workspace folder. Defaults to the
|
||||
* uri's basename.
|
||||
*/
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
type DidChangeWorkspaceFoldersParams struct {
|
||||
/**
|
||||
* The actual workspace folder change event.
|
||||
*/
|
||||
Event WorkspaceFoldersChangeEvent `json:"event"`
|
||||
}
|
||||
|
||||
/**
|
||||
* The workspace folder change event.
|
||||
*/
|
||||
type WorkspaceFoldersChangeEvent struct {
|
||||
/**
|
||||
* The array of added workspace folders
|
||||
*/
|
||||
Added []WorkspaceFolder `json:"added"`
|
||||
|
||||
/**
|
||||
* The array of the removed workspace folders
|
||||
*/
|
||||
Removed []WorkspaceFolder `json:"removed"`
|
||||
}
|
||||
|
||||
type DidChangeConfigurationParams struct {
|
||||
/**
|
||||
* The actual changed settings
|
||||
*/
|
||||
Settings interface{} `json:"settings"`
|
||||
}
|
||||
|
||||
type ConfigurationParams struct {
|
||||
Items []ConfigurationItem `json:"items"`
|
||||
}
|
||||
|
||||
type ConfigurationItem struct {
|
||||
/**
|
||||
* The scope to get the configuration section for.
|
||||
*/
|
||||
ScopeURI string `json:"scopeURI,omitempty"`
|
||||
|
||||
/**
|
||||
* The configuration section asked for.
|
||||
*/
|
||||
Section string `json:"section,omitempty"`
|
||||
}
|
||||
|
||||
type DidChangeWatchedFilesParams struct {
|
||||
/**
|
||||
* The actual file events.
|
||||
*/
|
||||
Changes []FileEvent `json:"changes"`
|
||||
}
|
||||
|
||||
/**
|
||||
* An event describing a file change.
|
||||
*/
|
||||
type FileEvent struct {
|
||||
/**
|
||||
* The file's URI.
|
||||
*/
|
||||
URI DocumentURI `json:"uri"`
|
||||
/**
|
||||
* The change type.
|
||||
*/
|
||||
Type float64 `json:"type"`
|
||||
}
|
||||
|
||||
/**
|
||||
* The file event type.
|
||||
*/
|
||||
type FileChangeType float64
|
||||
|
||||
const (
|
||||
/**
|
||||
* The file got created.
|
||||
*/
|
||||
Created FileChangeType = 1
|
||||
/**
|
||||
* The file got changed.
|
||||
*/
|
||||
Changed FileChangeType = 2
|
||||
/**
|
||||
* The file got deleted.
|
||||
*/
|
||||
Deleted FileChangeType = 3
|
||||
)
|
||||
|
||||
/**
|
||||
* Describe options to be used when registering for text document change events.
|
||||
*/
|
||||
type DidChangeWatchedFilesRegistrationOptions struct {
|
||||
/**
|
||||
* The watchers to register.
|
||||
*/
|
||||
Watchers []FileSystemWatcher `json:"watchers"`
|
||||
}
|
||||
|
||||
type FileSystemWatcher struct {
|
||||
/**
|
||||
* The glob pattern to watch
|
||||
*/
|
||||
GlobPattern string `json:"globPattern"`
|
||||
|
||||
/**
|
||||
* The kind of events of interest. If omitted it defaults
|
||||
* to WatchKind.Create | WatchKind.Change | WatchKind.Delete
|
||||
* which is 7.
|
||||
*/
|
||||
Kind float64 `json:"kind,omitempty"`
|
||||
}
|
||||
|
||||
type WatchKind float64
|
||||
|
||||
const (
|
||||
/**
|
||||
* Interested in create events.
|
||||
*/
|
||||
Create WatchKind = 1
|
||||
|
||||
/**
|
||||
* Interested in change events
|
||||
*/
|
||||
Change WatchKind = 2
|
||||
|
||||
/**
|
||||
* Interested in delete events
|
||||
*/
|
||||
Delete WatchKind = 4
|
||||
)
|
||||
|
||||
/**
|
||||
* The parameters of a Workspace Symbol Request.
|
||||
*/
|
||||
type WorkspaceSymbolParams struct {
|
||||
/**
|
||||
* A non-empty query string
|
||||
*/
|
||||
Query string `json:"query"`
|
||||
}
|
||||
|
||||
type ExecuteCommandParams struct {
|
||||
|
||||
/**
|
||||
* The identifier of the actual command handler.
|
||||
*/
|
||||
Command string `json:"command"`
|
||||
/**
|
||||
* Arguments that the command should be invoked with.
|
||||
*/
|
||||
Arguments []interface{} `json:"arguments,omitempty"`
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute command registration options.
|
||||
*/
|
||||
type ExecuteCommandRegistrationOptions struct {
|
||||
/**
|
||||
* The commands to be executed on the server
|
||||
*/
|
||||
Commands []string `json:"commands"`
|
||||
}
|
||||
|
||||
type ApplyWorkspaceEditParams struct {
|
||||
/**
|
||||
* An optional label of the workspace edit. This label is
|
||||
* presented in the user interface for example on an undo
|
||||
* stack to undo the workspace edit.
|
||||
*/
|
||||
Label string `json:"label,omitempty"`
|
||||
|
||||
/**
|
||||
* The edits to apply.
|
||||
*/
|
||||
Edit WorkspaceEdit `json:"edit"`
|
||||
}
|
||||
|
||||
type ApplyWorkspaceEditResponse struct {
|
||||
/**
|
||||
* Indicates whether the edit was applied or not.
|
||||
*/
|
||||
Applied bool `json:"applied"`
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user