mirror of
https://github.com/golang/go
synced 2024-11-18 23:34:45 -07:00
363 lines
10 KiB
Go
363 lines
10 KiB
Go
|
// Copyright 2018 The Go Authors. All rights reserved.
|
|||
|
// Use of this source code is governed by a BSD-style
|
|||
|
// license that can be found in the LICENSE file.
|
|||
|
|
|||
|
// This file contains the corresponding structures to the
|
|||
|
// "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"`
|
|||
|
}
|