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