2017-03-05 02:16:23 +00:00
|
|
|
#pragma once
|
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
#include "ipc.h"
|
2017-03-25 20:32:44 +00:00
|
|
|
#include "serializer.h"
|
|
|
|
#include "utils.h"
|
|
|
|
|
|
|
|
#include <optional.h>
|
|
|
|
#include <rapidjson/writer.h>
|
|
|
|
|
2017-03-25 21:57:06 +00:00
|
|
|
#include <algorithm>
|
2017-03-05 02:16:23 +00:00
|
|
|
#include <iostream>
|
2017-03-25 19:18:25 +00:00
|
|
|
#include <sstream>
|
2017-03-05 02:16:23 +00:00
|
|
|
#include <unordered_map>
|
|
|
|
#include <unordered_set>
|
|
|
|
|
|
|
|
using std::experimental::optional;
|
|
|
|
using std::experimental::nullopt;
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////// OUTGOING MESSAGES /////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2017-03-12 00:36:00 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
struct lsRequestId {
|
2017-03-10 07:06:01 +00:00
|
|
|
optional<int> id0;
|
|
|
|
optional<std::string> id1;
|
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
void Reflect(Writer& visitor, lsRequestId& value);
|
|
|
|
void Reflect(Reader& visitor, lsRequestId& id);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
///////////////////////////// INCOMING MESSAGES /////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct MessageRegistry {
|
|
|
|
static MessageRegistry* instance_;
|
|
|
|
static MessageRegistry* instance();
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 21:02:45 +00:00
|
|
|
using Allocator = std::function<std::unique_ptr<BaseIpcMessage>(Reader& visitor)>;
|
2017-03-10 07:06:01 +00:00
|
|
|
std::unordered_map<std::string, Allocator> allocators;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
template<typename T>
|
|
|
|
void Register() {
|
2017-03-25 22:13:19 +00:00
|
|
|
std::string method_name = IpcIdToString(T::kIpcId);
|
2017-03-25 19:18:25 +00:00
|
|
|
allocators[method_name] = [](Reader& visitor) {
|
|
|
|
auto result = MakeUnique<T>();
|
|
|
|
Reflect(visitor, *result);
|
|
|
|
return result;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
}
|
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
std::unique_ptr<BaseIpcMessage> ReadMessageFromStdin();
|
|
|
|
std::unique_ptr<BaseIpcMessage> Parse(Reader& visitor);
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
template<typename TDerived>
|
2017-03-25 20:40:04 +00:00
|
|
|
struct lsOutMessage {
|
2017-03-25 21:45:49 +00:00
|
|
|
// All derived types need to reflect on the |jsonrpc| member.
|
|
|
|
std::string jsonrpc = "2.0";
|
2017-03-24 07:59:47 +00:00
|
|
|
|
|
|
|
// Send the message to the language client by writing it to stdout.
|
2017-03-25 21:45:49 +00:00
|
|
|
void Write(std::ostream& out) {
|
2017-03-24 07:59:47 +00:00
|
|
|
rapidjson::StringBuffer output;
|
|
|
|
Writer writer(output);
|
2017-03-25 21:45:49 +00:00
|
|
|
auto that = static_cast<TDerived*>(this);
|
|
|
|
Reflect(writer, *that);
|
2017-03-24 07:59:47 +00:00
|
|
|
|
2017-03-25 19:18:25 +00:00
|
|
|
out << "Content-Length: " << output.GetSize();
|
2017-03-25 21:45:49 +00:00
|
|
|
out << (char)13 << char(10) << char(13) << char(10); // CRLFCRLF
|
2017-03-25 19:18:25 +00:00
|
|
|
out << output.GetString();
|
|
|
|
out.flush();
|
2017-03-24 07:59:47 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
struct lsResponseError {
|
|
|
|
struct Data {
|
|
|
|
virtual void Write(Writer& writer) = 0;
|
|
|
|
};
|
|
|
|
|
|
|
|
enum class lsErrorCodes : int {
|
|
|
|
ParseError = -32700,
|
|
|
|
InvalidRequest = -32600,
|
|
|
|
MethodNotFound = -32601,
|
|
|
|
InvalidParams = -32602,
|
|
|
|
InternalError = -32603,
|
|
|
|
serverErrorStart = -32099,
|
|
|
|
serverErrorEnd = -32000,
|
|
|
|
ServerNotInitialized = -32002,
|
|
|
|
UnknownErrorCode = -32001
|
|
|
|
};
|
|
|
|
|
|
|
|
lsErrorCodes code;
|
|
|
|
// Short description.
|
|
|
|
std::string message;
|
|
|
|
std::unique_ptr<Data> data;
|
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
void Write(Writer& visitor);
|
2017-03-24 07:59:47 +00:00
|
|
|
};
|
|
|
|
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-25 01:27:41 +00:00
|
|
|
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-05 19:48:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////// PRIMITIVE TYPES //////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsDocumentUri {
|
2017-03-25 22:13:19 +00:00
|
|
|
static lsDocumentUri FromPath(const std::string& path);
|
2017-03-11 08:07:32 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsDocumentUri();
|
|
|
|
bool operator==(const lsDocumentUri& other) const;
|
2017-03-25 23:58:11 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
void SetPath(const std::string& path);
|
2017-03-26 21:40:34 +00:00
|
|
|
std::string GetPath() const;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
std::string raw_uri;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-16 07:36:49 +00:00
|
|
|
MAKE_HASHABLE(lsDocumentUri, t.raw_uri);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
template<typename TVisitor>
|
|
|
|
void Reflect(TVisitor& visitor, lsDocumentUri& value) {
|
|
|
|
Reflect(visitor, value.raw_uri);
|
|
|
|
}
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsPosition {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsPosition();
|
|
|
|
lsPosition(int line, int character);
|
|
|
|
|
|
|
|
bool operator==(const lsPosition& other) const;
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Note: these are 0-based.
|
|
|
|
int line = 0;
|
|
|
|
int character = 0;
|
|
|
|
};
|
2017-03-16 07:36:49 +00:00
|
|
|
MAKE_HASHABLE(lsPosition, t.line, t.character);
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsPosition, line, character);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsRange {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRange();
|
2017-04-05 08:06:18 +00:00
|
|
|
lsRange(lsPosition start, lsPosition end);
|
2017-03-15 07:14:44 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
bool operator==(const lsRange& other) const;
|
2017-03-16 07:36:49 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsPosition start;
|
|
|
|
lsPosition end;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-16 07:36:49 +00:00
|
|
|
MAKE_HASHABLE(lsRange, t.start, t.end);
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsRange, start, end);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsLocation {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsLocation();
|
|
|
|
lsLocation(lsDocumentUri uri, lsRange range);
|
2017-03-15 07:14:44 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
bool operator==(const lsLocation& other) const;
|
2017-03-16 07:36:49 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsDocumentUri uri;
|
|
|
|
lsRange range;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_HASHABLE(lsLocation, t.uri, t.range);
|
|
|
|
MAKE_REFLECT_STRUCT(lsLocation, uri, range);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
enum class lsSymbolKind : int {
|
|
|
|
File = 1,
|
|
|
|
Module = 2,
|
|
|
|
Namespace = 3,
|
|
|
|
Package = 4,
|
|
|
|
Class = 5,
|
|
|
|
Method = 6,
|
|
|
|
Property = 7,
|
|
|
|
Field = 8,
|
|
|
|
Constructor = 9,
|
|
|
|
Enum = 10,
|
|
|
|
Interface = 11,
|
|
|
|
Function = 12,
|
|
|
|
Variable = 13,
|
|
|
|
Constant = 14,
|
|
|
|
String = 15,
|
|
|
|
Number = 16,
|
|
|
|
Boolean = 17,
|
|
|
|
Array = 18
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_TYPE_PROXY(lsSymbolKind, int);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsSymbolInformation {
|
|
|
|
std::string name;
|
|
|
|
lsSymbolKind kind;
|
|
|
|
lsLocation location;
|
|
|
|
std::string containerName;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsSymbolInformation, name, kind, location, containerName);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-15 07:14:44 +00:00
|
|
|
template<typename T>
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsCommand {
|
|
|
|
// Title of the command (ie, 'save')
|
|
|
|
std::string title;
|
|
|
|
// Actual command identifier.
|
|
|
|
std::string command;
|
2017-03-15 07:14:44 +00:00
|
|
|
// Arguments to run the command with.
|
|
|
|
T arguments;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-15 07:14:44 +00:00
|
|
|
template<typename TVisitor, typename T>
|
|
|
|
void Reflect(TVisitor& visitor, lsCommand<T>& value) {
|
2017-03-10 07:06:01 +00:00
|
|
|
REFLECT_MEMBER_START();
|
|
|
|
REFLECT_MEMBER(title);
|
|
|
|
REFLECT_MEMBER(command);
|
|
|
|
REFLECT_MEMBER(arguments);
|
|
|
|
REFLECT_MEMBER_END();
|
|
|
|
}
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-15 07:14:44 +00:00
|
|
|
template<typename TData, typename TCommandArguments>
|
|
|
|
struct lsCodeLens {
|
|
|
|
// The range in which this code lens is valid. Should only span a single line.
|
|
|
|
lsRange range;
|
|
|
|
// The command this code lens represents.
|
|
|
|
optional<lsCommand<TCommandArguments>> command;
|
|
|
|
// A data entry field that is preserved on a code lens item between
|
|
|
|
// a code lens and a code lens resolve request.
|
|
|
|
TData data;
|
|
|
|
};
|
|
|
|
template<typename TVisitor, typename TData, typename TCommandArguments>
|
|
|
|
void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) {
|
|
|
|
REFLECT_MEMBER_START();
|
|
|
|
REFLECT_MEMBER(range);
|
|
|
|
REFLECT_MEMBER(command);
|
|
|
|
REFLECT_MEMBER(data);
|
|
|
|
REFLECT_MEMBER_END();
|
|
|
|
}
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsTextDocumentIdentifier {
|
|
|
|
lsDocumentUri uri;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentIdentifier, uri);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
struct lsVersionedTextDocumentIdentifier {
|
|
|
|
lsDocumentUri uri;
|
|
|
|
// The version number of this document.
|
|
|
|
int version;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsVersionedTextDocumentIdentifier, uri, version);
|
|
|
|
|
|
|
|
struct lsTextDocumentPositionParams {
|
|
|
|
// The text document.
|
|
|
|
lsTextDocumentIdentifier textDocument;
|
|
|
|
|
|
|
|
// The position inside the text document.
|
|
|
|
lsPosition position;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentPositionParams, textDocument, position);
|
|
|
|
|
|
|
|
// Defines whether the insert text in a completion item should be interpreted as
|
|
|
|
// plain text or a snippet.
|
|
|
|
enum class lsInsertTextFormat {
|
|
|
|
// The primary text to be inserted is treated as a plain string.
|
|
|
|
PlainText = 1,
|
|
|
|
|
|
|
|
// The primary text to be inserted is treated as a snippet.
|
|
|
|
//
|
|
|
|
// A snippet can define tab stops and placeholders with `$1`, `$2`
|
|
|
|
// and `${3:foo}`. `$0` defines the final tab stop, it defaults to
|
|
|
|
// the end of the snippet. Placeholders with equal identifiers are linked,
|
|
|
|
// that is typing in one will update others too.
|
|
|
|
//
|
|
|
|
// See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md
|
|
|
|
Snippet = 2
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_TYPE_PROXY(lsInsertTextFormat, int);
|
|
|
|
|
|
|
|
// The kind of a completion entry.
|
|
|
|
enum class lsCompletionItemKind {
|
|
|
|
Text = 1,
|
|
|
|
Method = 2,
|
|
|
|
Function = 3,
|
|
|
|
Constructor = 4,
|
|
|
|
Field = 5,
|
|
|
|
Variable = 6,
|
|
|
|
Class = 7,
|
|
|
|
Interface = 8,
|
|
|
|
Module = 9,
|
|
|
|
Property = 10,
|
|
|
|
Unit = 11,
|
|
|
|
Value = 12,
|
|
|
|
Enum = 13,
|
|
|
|
Keyword = 14,
|
|
|
|
Snippet = 15,
|
|
|
|
Color = 16,
|
|
|
|
File = 17,
|
|
|
|
Reference = 18
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_TYPE_PROXY(lsCompletionItemKind, int);
|
|
|
|
|
|
|
|
struct lsCompletionItem {
|
|
|
|
// The label of this completion item. By default
|
|
|
|
// also the text that is inserted when selecting
|
|
|
|
// this completion.
|
|
|
|
std::string label;
|
|
|
|
|
|
|
|
// The kind of this completion item. Based of the kind
|
|
|
|
// an icon is chosen by the editor.
|
|
|
|
lsCompletionItemKind kind = lsCompletionItemKind::Text;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// A human-readable string with additional information
|
|
|
|
// about this item, like type or symbol information.
|
|
|
|
std::string detail;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// A human-readable string that represents a doc-comment.
|
|
|
|
std::string documentation;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// A string that shoud be used when comparing this item
|
|
|
|
// with other items. When `falsy` the label is used.
|
|
|
|
std::string sortText;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// A string that should be used when filtering a set of
|
|
|
|
// completion items. When `falsy` the label is used.
|
2017-03-26 21:40:34 +00:00
|
|
|
//std::string filterText;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// A string that should be inserted a document when selecting
|
|
|
|
// this completion. When `falsy` the label is used.
|
2017-03-26 21:40:34 +00:00
|
|
|
//std::string insertText;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
// The format of the insert text. The format applies to both the `insertText` property
|
|
|
|
// and the `newText` property of a provided `textEdit`.
|
2017-03-26 21:40:34 +00:00
|
|
|
//lsInsertTextFormat insertTextFormat;
|
2017-03-26 06:47:59 +00:00
|
|
|
|
|
|
|
// An edit which is applied to a document when selecting this completion. When an edit is provided the value of
|
|
|
|
// `insertText` is ignored.
|
|
|
|
//
|
|
|
|
// *Note:* The range of the edit must be a single line range and it must contain the position at which completion
|
|
|
|
// has been requested.
|
|
|
|
// TextEdit textEdit;
|
|
|
|
|
|
|
|
// An optional array of additional text edits that are applied when
|
|
|
|
// selecting this completion. Edits must not overlap with the main edit
|
|
|
|
// nor with themselves.
|
|
|
|
// std::vector<TextEdit> additionalTextEdits;
|
|
|
|
|
|
|
|
// An optional command that is executed *after* inserting this completion. *Note* that
|
|
|
|
// additional modifications to the current document should be described with the
|
|
|
|
// additionalTextEdits-property.
|
|
|
|
// Command command;
|
|
|
|
|
|
|
|
// An data entry field that is preserved on a completion item between
|
|
|
|
// a completion and a completion resolve request.
|
|
|
|
// data ? : any
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsCompletionItem,
|
|
|
|
label,
|
|
|
|
kind,
|
|
|
|
detail,
|
|
|
|
documentation,
|
2017-03-26 21:40:34 +00:00
|
|
|
sortText);
|
2017-03-26 06:47:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
struct lsTextDocumentItem {
|
|
|
|
// The text document's URI.
|
|
|
|
lsDocumentUri uri;
|
|
|
|
|
|
|
|
// The text document's language identifier.
|
|
|
|
std::string languageId;
|
|
|
|
|
|
|
|
// The version number of this document (it will strictly increase after each
|
|
|
|
// change, including undo/redo).
|
|
|
|
int version;
|
|
|
|
|
|
|
|
// The content of the opened text document.
|
|
|
|
std::string text;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentItem, uri, languageId, version, text);
|
|
|
|
|
|
|
|
struct lsTextEdit {
|
|
|
|
// The range of the text document to be manipulated. To insert
|
|
|
|
// text into a document create a range where start === end.
|
|
|
|
lsRange range;
|
|
|
|
|
|
|
|
// The string to be inserted. For delete operations use an
|
|
|
|
// empty string.
|
|
|
|
std::string newText;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextEdit, range, newText);
|
|
|
|
|
|
|
|
struct lsTextDocumentEdit {
|
|
|
|
// The text document to change.
|
|
|
|
lsVersionedTextDocumentIdentifier textDocument;
|
|
|
|
|
|
|
|
// The edits to be applied.
|
|
|
|
std::vector<lsTextEdit> edits;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentEdit, textDocument, edits);
|
|
|
|
|
|
|
|
// TODO: WorkspaceEdit
|
|
|
|
// TODO: DocumentFilter
|
|
|
|
// TODO: DocumentSelector
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
////////////////////////////// INITIALIZATION ///////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Workspace specific client capabilities.
|
|
|
|
struct lsWorkspaceClientCapabilites {
|
|
|
|
// The client supports applying batch edits to the workspace.
|
|
|
|
optional<bool> applyEdit;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsWorkspaceEdit {
|
|
|
|
// The client supports versioned document changes in `WorkspaceEdit`s
|
|
|
|
optional<bool> documentChanges;
|
2017-03-05 02:16:23 +00:00
|
|
|
};
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to `WorkspaceEdit`s
|
|
|
|
optional<lsWorkspaceEdit> workspaceEdit;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsGenericDynamicReg {
|
|
|
|
// Did foo notification supports dynamic registration.
|
|
|
|
optional<bool> dynamicRegistration;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-09 06:27:42 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `workspace/didChangeConfiguration` notification.
|
|
|
|
optional<lsGenericDynamicReg> didChangeConfiguration;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `workspace/didChangeWatchedFiles` notification.
|
|
|
|
optional<lsGenericDynamicReg> didChangeWatchedFiles;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `workspace/symbol` request.
|
|
|
|
optional<lsGenericDynamicReg> symbol;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `workspace/executeCommand` request.
|
|
|
|
optional<lsGenericDynamicReg> executeCommand;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites::lsWorkspaceEdit, documentChanges);
|
|
|
|
MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites::lsGenericDynamicReg, dynamicRegistration);
|
|
|
|
MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites,
|
|
|
|
applyEdit,
|
|
|
|
workspaceEdit,
|
|
|
|
didChangeConfiguration,
|
|
|
|
didChangeWatchedFiles,
|
|
|
|
symbol,
|
|
|
|
executeCommand);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Text document specific client capabilities.
|
|
|
|
struct lsTextDocumentClientCapabilities {
|
|
|
|
struct lsSynchronization {
|
|
|
|
// Whether text document synchronization supports dynamic registration.
|
|
|
|
optional<bool> dynamicRegistration;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// The client supports sending will save notifications.
|
|
|
|
optional<bool> willSave;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// 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.
|
|
|
|
optional<bool> willSaveWaitUntil;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// The client supports did save notifications.
|
|
|
|
optional<bool> didSave;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
lsSynchronization synchronization;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsCompletion {
|
|
|
|
// Whether completion supports dynamic registration.
|
|
|
|
optional<bool> dynamicRegistration;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsCompletionItem {
|
|
|
|
// 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.
|
|
|
|
optional<bool> snippetSupport;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// The client supports the following `CompletionItem` specific
|
|
|
|
// capabilities.
|
|
|
|
optional<lsCompletionItem> completionItem;
|
|
|
|
};
|
|
|
|
// Capabilities specific to the `textDocument/completion`
|
|
|
|
optional<lsCompletion> completion;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsGenericDynamicReg {
|
|
|
|
// Whether foo supports dynamic registration.
|
|
|
|
optional<bool> dynamicRegistration;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/hover`
|
|
|
|
optional<lsGenericDynamicReg> hover;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/signatureHelp`
|
|
|
|
optional<lsGenericDynamicReg> signatureHelp;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/references`
|
|
|
|
optional<lsGenericDynamicReg> references;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/documentHighlight`
|
|
|
|
optional<lsGenericDynamicReg> documentHighlight;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/documentSymbol`
|
|
|
|
optional<lsGenericDynamicReg> documentSymbol;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/formatting`
|
|
|
|
optional<lsGenericDynamicReg> formatting;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/rangeFormatting`
|
|
|
|
optional<lsGenericDynamicReg> rangeFormatting;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/onTypeFormatting`
|
|
|
|
optional<lsGenericDynamicReg> onTypeFormatting;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/definition`
|
|
|
|
optional<lsGenericDynamicReg> definition;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/codeAction`
|
|
|
|
optional<lsGenericDynamicReg> codeAction;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-15 07:14:44 +00:00
|
|
|
struct CodeLensRegistrationOptions : public lsGenericDynamicReg {
|
|
|
|
// Code lens has a resolve provider as well.
|
|
|
|
bool resolveProvider;
|
|
|
|
};
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/codeLens`
|
2017-03-15 07:14:44 +00:00
|
|
|
optional<CodeLensRegistrationOptions> codeLens;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/documentLink`
|
|
|
|
optional<lsGenericDynamicReg> documentLink;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Capabilities specific to the `textDocument/rename`
|
|
|
|
optional<lsGenericDynamicReg> rename;
|
|
|
|
};
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsSynchronization, dynamicRegistration, willSave, willSaveWaitUntil, didSave);
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsCompletion, dynamicRegistration, completionItem);
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsCompletion::lsCompletionItem, snippetSupport);
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsGenericDynamicReg, dynamicRegistration);
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::CodeLensRegistrationOptions, dynamicRegistration, resolveProvider);
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities,
|
2017-03-26 06:47:59 +00:00
|
|
|
synchronization,
|
|
|
|
completion,
|
|
|
|
hover,
|
|
|
|
signatureHelp,
|
|
|
|
references,
|
|
|
|
documentHighlight,
|
|
|
|
documentSymbol,
|
|
|
|
formatting,
|
|
|
|
rangeFormatting,
|
|
|
|
onTypeFormatting,
|
|
|
|
definition,
|
|
|
|
codeAction,
|
|
|
|
codeLens,
|
|
|
|
documentLink,
|
|
|
|
rename);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsClientCapabilities {
|
|
|
|
// Workspace specific client capabilities.
|
|
|
|
optional<lsWorkspaceClientCapabilites> workspace;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Text document specific client capabilities.
|
|
|
|
optional<lsTextDocumentClientCapabilities> textDocument;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
/**
|
|
|
|
* Experimental client capabilities.
|
|
|
|
*/
|
|
|
|
// experimental?: any; // TODO
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsClientCapabilities, workspace, textDocument);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsInitializeParams {
|
|
|
|
// 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.
|
|
|
|
optional<int> processId;
|
|
|
|
|
|
|
|
// The rootPath of the workspace. Is null
|
|
|
|
// if no folder is open.
|
|
|
|
//
|
|
|
|
// @deprecated in favour of rootUri.
|
|
|
|
optional<std::string> rootPath;
|
|
|
|
|
|
|
|
// The rootUri of the workspace. Is null if no
|
|
|
|
// folder is open. If both `rootPath` and `rootUri` are set
|
|
|
|
// `rootUri` wins.
|
|
|
|
optional<lsDocumentUri> rootUri;
|
|
|
|
|
|
|
|
// User provided initialization options.
|
|
|
|
// initializationOptions?: any; // TODO
|
|
|
|
|
|
|
|
// The capabilities provided by the client (editor or tool)
|
|
|
|
lsClientCapabilities capabilities;
|
|
|
|
|
|
|
|
enum class lsTrace {
|
|
|
|
// NOTE: serialized as a string, one of 'off' | 'messages' | 'verbose';
|
|
|
|
Off, // off
|
|
|
|
Messages, // messages
|
|
|
|
Verbose // verbose
|
2017-03-05 02:16:23 +00:00
|
|
|
};
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// The initial trace setting. If omitted trace is disabled ('off').
|
|
|
|
lsTrace trace = lsTrace::Off;
|
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
void Reflect(Reader& reader, lsInitializeParams::lsTrace& value);
|
|
|
|
void Reflect(Writer& writer, lsInitializeParams::lsTrace& value);
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsInitializeParams, processId, rootPath, rootUri, capabilities, trace);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsInitializeError {
|
|
|
|
// Indicates whether the client should retry to send the
|
|
|
|
// initilize request after showing the message provided
|
|
|
|
// in the ResponseError.
|
|
|
|
bool retry;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsInitializeError, retry);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Defines how the host (editor) should sync document changes to the language server.
|
|
|
|
enum class lsTextDocumentSyncKind {
|
|
|
|
// Documents should not be synced at all.
|
|
|
|
None = 0,
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Documents are synced by always sending the full content
|
|
|
|
// of the document.
|
|
|
|
Full = 1,
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Documents are synced by sending the full content on open.
|
|
|
|
// After that only incremental updates to the document are
|
|
|
|
// send.
|
|
|
|
Incremental = 2
|
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
MAKE_REFLECT_TYPE_PROXY(lsTextDocumentSyncKind, int)
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Completion options.
|
|
|
|
struct lsCompletionOptions {
|
|
|
|
// The server provides support to resolve additional
|
|
|
|
// information for a completion item.
|
|
|
|
bool resolveProvider = false;
|
|
|
|
|
|
|
|
// The characters that trigger completion automatically.
|
2017-03-26 06:47:59 +00:00
|
|
|
std::vector<std::string> triggerCharacters;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsCompletionOptions, resolveProvider, triggerCharacters);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Signature help options.
|
|
|
|
struct lsSignatureHelpOptions {
|
|
|
|
// The characters that trigger signature help automatically.
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<std::string> triggerCharacters;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, triggerCharacters);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Code Lens options.
|
|
|
|
struct lsCodeLensOptions {
|
|
|
|
// Code lens has a resolve provider as well.
|
|
|
|
bool resolveProvider = false;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsCodeLensOptions, resolveProvider);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Format document on type options
|
|
|
|
struct lsDocumentOnTypeFormattingOptions {
|
|
|
|
// A character on which formatting should be triggered, like `}`.
|
|
|
|
std::string firstTriggerCharacter;
|
|
|
|
|
|
|
|
// More trigger characters.
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<std::string> moreTriggerCharacter;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, firstTriggerCharacter, moreTriggerCharacter);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Document link options
|
|
|
|
struct lsDocumentLinkOptions {
|
|
|
|
// Document links have a resolve provider as well.
|
|
|
|
bool resolveProvider = false;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, resolveProvider);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Execute command options.
|
|
|
|
struct lsExecuteCommandOptions {
|
|
|
|
// The commands to be executed on the server
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<std::string> commands;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsExecuteCommandOptions, commands);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// Save options.
|
|
|
|
struct lsSaveOptions {
|
|
|
|
// The client is supposed to include the content on save.
|
|
|
|
bool includeText = false;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsSaveOptions, includeText);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsTextDocumentSyncOptions {
|
|
|
|
// Open and close notifications are sent to the server.
|
|
|
|
bool openClose = false;
|
|
|
|
// Change notificatins are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full
|
|
|
|
// and TextDocumentSyncKindIncremental.
|
2017-03-26 06:47:59 +00:00
|
|
|
lsTextDocumentSyncKind change = lsTextDocumentSyncKind::Incremental;
|
2017-03-10 07:06:01 +00:00
|
|
|
// Will save notifications are sent to the server.
|
2017-03-26 06:47:59 +00:00
|
|
|
optional<bool> willSave;
|
2017-03-10 07:06:01 +00:00
|
|
|
// Will save wait until requests are sent to the server.
|
2017-03-26 06:47:59 +00:00
|
|
|
optional<bool> willSaveWaitUntil;
|
2017-03-10 07:06:01 +00:00
|
|
|
// Save notifications are sent to the server.
|
|
|
|
optional<lsSaveOptions> save;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsServerCapabilities {
|
|
|
|
// Defines how text documents are synced. Is either a detailed structure defining each notification or
|
|
|
|
// for backwards compatibility the TextDocumentSyncKind number.
|
2017-03-26 06:47:59 +00:00
|
|
|
// TODO: It seems like the new API is broken and doesn't work.
|
|
|
|
// optional<lsTextDocumentSyncOptions> textDocumentSync;
|
|
|
|
lsTextDocumentSyncKind textDocumentSync;
|
|
|
|
|
2017-03-10 07:06:01 +00:00
|
|
|
// The server provides hover support.
|
|
|
|
bool hoverProvider = false;
|
|
|
|
// The server provides completion support.
|
|
|
|
optional<lsCompletionOptions> completionProvider;
|
|
|
|
// The server provides signature help support.
|
|
|
|
optional<lsSignatureHelpOptions> signatureHelpProvider;
|
|
|
|
// The server provides goto definition support.
|
|
|
|
bool definitionProvider = false;
|
|
|
|
// The server provides find references support.
|
|
|
|
bool referencesProvider = false;
|
|
|
|
// The server provides document highlight support.
|
|
|
|
bool documentHighlightProvider = false;
|
|
|
|
// The server provides document symbol support.
|
|
|
|
bool documentSymbolProvider = false;
|
|
|
|
// The server provides workspace symbol support.
|
|
|
|
bool workspaceSymbolProvider = false;
|
|
|
|
// The server provides code actions.
|
|
|
|
bool codeActionProvider = false;
|
|
|
|
// The server provides code lens.
|
|
|
|
optional<lsCodeLensOptions> codeLensProvider;
|
|
|
|
// The server provides document formatting.
|
|
|
|
bool documentFormattingProvider = false;
|
|
|
|
// The server provides document range formatting.
|
|
|
|
bool documentRangeFormattingProvider = false;
|
|
|
|
// The server provides document formatting on typing.
|
|
|
|
optional<lsDocumentOnTypeFormattingOptions> documentOnTypeFormattingProvider;
|
|
|
|
// The server provides rename support.
|
|
|
|
bool renameProvider = false;
|
|
|
|
// The server provides document link support.
|
|
|
|
optional<lsDocumentLinkOptions> documentLinkProvider;
|
|
|
|
// The server provides execute command support.
|
|
|
|
optional<lsExecuteCommandOptions> executeCommandProvider;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsServerCapabilities,
|
2017-03-26 06:47:59 +00:00
|
|
|
textDocumentSync,
|
|
|
|
hoverProvider,
|
|
|
|
completionProvider,
|
|
|
|
signatureHelpProvider,
|
|
|
|
definitionProvider,
|
|
|
|
referencesProvider,
|
|
|
|
documentHighlightProvider,
|
|
|
|
documentSymbolProvider,
|
|
|
|
workspaceSymbolProvider,
|
|
|
|
codeActionProvider,
|
|
|
|
codeLensProvider,
|
|
|
|
documentFormattingProvider,
|
|
|
|
documentRangeFormattingProvider,
|
|
|
|
documentOnTypeFormattingProvider,
|
|
|
|
renameProvider,
|
|
|
|
documentLinkProvider,
|
|
|
|
executeCommandProvider);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_InitializeRequest : public IpcMessage<Ipc_InitializeRequest> {
|
|
|
|
const static IpcId kIpcId = IpcId::Initialize;
|
2017-03-25 19:18:25 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-10 07:06:01 +00:00
|
|
|
lsInitializeParams params;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_InitializeRequest, id, params);
|
2017-03-25 01:27:41 +00:00
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_InitializeResponse : public lsOutMessage<Out_InitializeResponse> {
|
2017-03-26 06:47:59 +00:00
|
|
|
struct InitializeResult {
|
|
|
|
lsServerCapabilities capabilities;
|
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-26 06:47:59 +00:00
|
|
|
InitializeResult result;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-26 06:47:59 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_InitializeResponse::InitializeResult, capabilities);
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_InitializeResponse, jsonrpc, id, result);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_InitializedNotification : public IpcMessage<Ipc_InitializedNotification> {
|
|
|
|
const static IpcId kIpcId = IpcId::Initialized;
|
2017-03-25 20:40:04 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_InitializedNotification, id);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
// Cancel an existing request.
|
2017-03-25 21:02:45 +00:00
|
|
|
struct Ipc_CancelRequest : public IpcMessage<Ipc_CancelRequest> {
|
2017-03-25 21:57:06 +00:00
|
|
|
static const IpcId kIpcId = IpcId::CancelRequest;
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-25 21:02:45 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_CancelRequest, id);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-26 06:47:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Open, update, close file
|
|
|
|
struct Ipc_TextDocumentDidOpen : public IpcMessage<Ipc_TextDocumentDidOpen> {
|
|
|
|
struct Params {
|
|
|
|
lsTextDocumentItem textDocument;
|
|
|
|
};
|
|
|
|
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentDidOpen;
|
|
|
|
Params params;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidOpen::Params, textDocument);
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidOpen, params);
|
|
|
|
struct Ipc_TextDocumentDidChange : public IpcMessage<Ipc_TextDocumentDidChange> {
|
|
|
|
struct lsTextDocumentContentChangeEvent {
|
|
|
|
// The range of the document that changed.
|
|
|
|
lsRange range;
|
|
|
|
// The length of the range that got replaced.
|
2017-03-26 21:40:34 +00:00
|
|
|
int rangeLength = -1;
|
2017-03-26 06:47:59 +00:00
|
|
|
// The new text of the range/document.
|
|
|
|
std::string text;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Params {
|
|
|
|
lsVersionedTextDocumentIdentifier textDocument;
|
|
|
|
std::vector<lsTextDocumentContentChangeEvent> contentChanges;
|
|
|
|
};
|
|
|
|
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentDidChange;
|
|
|
|
Params params;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidChange::lsTextDocumentContentChangeEvent, range, rangeLength, text);
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidChange::Params, textDocument, contentChanges);
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidChange, params);
|
|
|
|
struct Ipc_TextDocumentDidClose : public IpcMessage<Ipc_TextDocumentDidClose> {
|
|
|
|
struct Params {
|
|
|
|
lsTextDocumentItem textDocument;
|
|
|
|
};
|
|
|
|
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentDidClose;
|
|
|
|
Params params;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidClose::Params, textDocument);
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDidClose, params);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Code completion
|
|
|
|
struct Ipc_TextDocumentComplete : public IpcMessage<Ipc_TextDocumentComplete> {
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentCompletion;
|
|
|
|
|
|
|
|
lsRequestId id;
|
|
|
|
lsTextDocumentPositionParams params;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentComplete, id, params);
|
|
|
|
struct lsTextDocumentCompleteResult {
|
|
|
|
// This list it not complete. Further typing should result in recomputing
|
|
|
|
// this list.
|
|
|
|
bool isIncomplete = false;
|
|
|
|
// The completion items.
|
|
|
|
NonElidedVector<lsCompletionItem> items;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(lsTextDocumentCompleteResult, isIncomplete, items);
|
|
|
|
struct Out_TextDocumentComplete : public lsOutMessage<Out_TextDocumentComplete> {
|
|
|
|
lsRequestId id;
|
|
|
|
lsTextDocumentCompleteResult result;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Out_TextDocumentComplete, jsonrpc, id, result);
|
|
|
|
|
2017-04-03 02:21:21 +00:00
|
|
|
// Goto definition
|
|
|
|
struct Ipc_TextDocumentDefinition : public IpcMessage<Ipc_TextDocumentDefinition> {
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentDefinition;
|
|
|
|
|
|
|
|
lsRequestId id;
|
|
|
|
lsTextDocumentPositionParams params;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDefinition, id, params);
|
|
|
|
struct Out_TextDocumentDefinition : public lsOutMessage<Out_TextDocumentDefinition> {
|
|
|
|
lsRequestId id;
|
|
|
|
NonElidedVector<lsLocation> result;
|
|
|
|
};
|
|
|
|
MAKE_REFLECT_STRUCT(Out_TextDocumentDefinition, jsonrpc, id, result);
|
2017-03-26 06:47:59 +00:00
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
// List symbols in a document.
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsDocumentSymbolParams {
|
|
|
|
lsTextDocumentIdentifier textDocument;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsDocumentSymbolParams, textDocument);
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_TextDocumentDocumentSymbol : public IpcMessage<Ipc_TextDocumentDocumentSymbol> {
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentDocumentSymbol;
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-10 07:06:01 +00:00
|
|
|
lsDocumentSymbolParams params;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentDocumentSymbol, id, params);
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Out_TextDocumentDocumentSymbol : public lsOutMessage<Out_TextDocumentDocumentSymbol> {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<lsSymbolInformation> result;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_TextDocumentDocumentSymbol, jsonrpc, id, result);
|
2017-03-05 02:16:23 +00:00
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
// List code lens in a document.
|
2017-03-15 07:14:44 +00:00
|
|
|
struct lsDocumentCodeLensParams {
|
|
|
|
lsTextDocumentIdentifier textDocument;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsDocumentCodeLensParams, textDocument);
|
2017-03-15 07:14:44 +00:00
|
|
|
struct lsCodeLensUserData {};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData);
|
2017-03-15 07:14:44 +00:00
|
|
|
struct lsCodeLensCommandArguments {
|
|
|
|
lsDocumentUri uri;
|
|
|
|
lsPosition position;
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<lsLocation> locations;
|
2017-03-15 07:14:44 +00:00
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
void Reflect(Writer& visitor, lsCodeLensCommandArguments& value);
|
|
|
|
void Reflect(Reader& visitor, lsCodeLensCommandArguments& value);
|
2017-03-15 07:14:44 +00:00
|
|
|
using TCodeLens = lsCodeLens<lsCodeLensUserData, lsCodeLensCommandArguments>;
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_TextDocumentCodeLens : public IpcMessage<Ipc_TextDocumentCodeLens> {
|
|
|
|
const static IpcId kIpcId = IpcId::TextDocumentCodeLens;
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-15 07:14:44 +00:00
|
|
|
lsDocumentCodeLensParams params;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_TextDocumentCodeLens, id, params);
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_TextDocumentCodeLens : public lsOutMessage<Out_TextDocumentCodeLens> {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<lsCodeLens<lsCodeLensUserData, lsCodeLensCommandArguments>> result;
|
2017-03-15 07:14:44 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_TextDocumentCodeLens, jsonrpc, id, result);
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_CodeLensResolve : public IpcMessage<Ipc_CodeLensResolve> {
|
|
|
|
const static IpcId kIpcId = IpcId::CodeLensResolve;
|
2017-03-15 07:14:44 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-15 07:14:44 +00:00
|
|
|
TCodeLens params;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_CodeLensResolve, id, params);
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_CodeLensResolve : public lsOutMessage<Out_CodeLensResolve> {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-15 07:14:44 +00:00
|
|
|
TCodeLens result;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_CodeLensResolve, jsonrpc, id, result);
|
2017-03-15 07:14:44 +00:00
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
// Search for symbols in the workspace.
|
2017-03-10 07:06:01 +00:00
|
|
|
struct lsWorkspaceSymbolParams {
|
|
|
|
std::string query;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(lsWorkspaceSymbolParams, query);
|
2017-03-25 21:57:06 +00:00
|
|
|
struct Ipc_WorkspaceSymbol : public IpcMessage<Ipc_WorkspaceSymbol > {
|
|
|
|
const static IpcId kIpcId = IpcId::WorkspaceSymbol;
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-10 07:06:01 +00:00
|
|
|
lsWorkspaceSymbolParams params;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Ipc_WorkspaceSymbol, id, params);
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_WorkspaceSymbol : public lsOutMessage<Out_WorkspaceSymbol> {
|
2017-03-25 22:13:19 +00:00
|
|
|
lsRequestId id;
|
2017-03-26 00:22:06 +00:00
|
|
|
NonElidedVector<lsSymbolInformation> result;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_WorkspaceSymbol, jsonrpc, id, result);
|
2017-03-06 08:48:51 +00:00
|
|
|
|
2017-03-25 21:45:49 +00:00
|
|
|
// Show a message to the user.
|
2017-03-10 07:06:01 +00:00
|
|
|
enum class lsMessageType : int {
|
|
|
|
Error = 1,
|
|
|
|
Warning = 2,
|
|
|
|
Info = 3,
|
|
|
|
Log = 4
|
|
|
|
};
|
2017-03-25 22:13:19 +00:00
|
|
|
MAKE_REFLECT_TYPE_PROXY(lsMessageType, int)
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_ShowLogMessageParams {
|
2017-03-10 07:06:01 +00:00
|
|
|
lsMessageType type = lsMessageType::Error;
|
|
|
|
std::string message;
|
|
|
|
};
|
2017-03-25 23:58:11 +00:00
|
|
|
MAKE_REFLECT_STRUCT(Out_ShowLogMessageParams, type, message);
|
2017-03-25 21:45:49 +00:00
|
|
|
struct Out_ShowLogMessage : public lsOutMessage<Out_ShowLogMessage> {
|
|
|
|
enum class DisplayType {
|
|
|
|
Show, Log
|
|
|
|
};
|
|
|
|
DisplayType display_type = DisplayType::Show;
|
2017-03-25 23:58:11 +00:00
|
|
|
|
2017-03-25 22:13:19 +00:00
|
|
|
std::string method();
|
2017-03-25 21:45:49 +00:00
|
|
|
Out_ShowLogMessageParams params;
|
2017-03-10 07:06:01 +00:00
|
|
|
};
|
2017-03-25 21:45:49 +00:00
|
|
|
template<typename TVisitor>
|
|
|
|
void Reflect(TVisitor& visitor, Out_ShowLogMessage& value) {
|
|
|
|
REFLECT_MEMBER_START();
|
|
|
|
REFLECT_MEMBER(jsonrpc);
|
|
|
|
REFLECT_MEMBER2("method", value.method());
|
|
|
|
REFLECT_MEMBER(params);
|
|
|
|
REFLECT_MEMBER_END();
|
|
|
|
}
|