#![feature(proc_macro)]
#![allow(non_upper_case_globals)]
#![allow(non_snake_case)]
#[macro_use]
extern crate enum_primitive;
extern crate serde;
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
extern crate url;
use url::Url;
use std::collections::HashMap;
use serde::Serialize;
use serde::Deserialize;
use serde::de;
use serde::de::Error as Error_;
use serde_json::Value;
#[derive(Debug, PartialEq, Clone)]
pub enum NumberOrString {
Number(u64),
String(String),
}
impl Serialize for NumberOrString {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
match *self {
NumberOrString::Number(number) => serializer.serialize_u64(number),
NumberOrString::String(ref string) => serializer.serialize_str(string),
}
}
}
impl Deserialize for NumberOrString {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
#[allow(non_camel_case_types)]
struct NumberOrString_Visitor;
impl de::Visitor for NumberOrString_Visitor {
type Value = NumberOrString;
fn visit_u64<E>(&mut self, value: u64) -> Result<Self::Value, E> where E: de::Error {
Ok(NumberOrString::Number(value))
}
fn visit_str<E>(&mut self, value: &str) -> Result<Self::Value, E> where E: de::Error {
Ok(NumberOrString::String(value.to_string()))
}
}
deserializer.deserialize(NumberOrString_Visitor)
}
}
#[test]
fn test_NumberOrString() {
test_serialization(
&NumberOrString::Number(123),
r#"123"#
);
test_serialization(
&NumberOrString::String("abcd".into()),
r#""abcd""#
);
}
pub const NOTIFICATION__Cancel: &'static str = "$/cancelRequest";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CancelParams {
pub id: NumberOrString,
}
#[derive(Debug, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
pub struct Position {
pub line: u64,
pub character: u64,
}
impl Position {
pub fn new(line: u64, character: u64) -> Position {
Position { line : line, character : character }
}
}
#[derive(Debug, PartialEq, Copy, Clone, Default, Deserialize, Serialize)]
pub struct Range {
pub start: Position,
pub end: Position,
}
impl Range {
pub fn new(start: Position, end: Position) -> Range {
Range { start : start, end : end }
}
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct Location {
pub uri: Url,
pub range: Range,
}
impl Location {
pub fn new(uri: Url, range: Range) -> Location {
Location { uri : uri, range : range }
}
}
#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
pub struct Diagnostic {
pub range: Range,
pub severity: Option<DiagnosticSeverity>,
pub code: Option<NumberOrString>,
pub source: Option<String>,
pub message: String,
}
impl Diagnostic {
pub fn new(
range: Range,
severity: Option<DiagnosticSeverity>,
code: Option<NumberOrString>,
source: Option<String>,
message: String
) -> Diagnostic
{
Diagnostic {
range : range,
severity : severity,
code : code,
source : source,
message : message
}
}
pub fn new_simple(range: Range, message: String) -> Diagnostic {
Self::new(range, None, None, None, message)
}
pub fn new_with_code_number(
range: Range,
severity: DiagnosticSeverity,
code_number: u64,
source: Option<String>,
message: String
) -> Diagnostic
{
let code = Some(NumberOrString::Number(code_number));
Self::new(range, Some(severity), code, source, message)
}
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum DiagnosticSeverity {
Error = 1,
Warning = 2,
Information = 3,
Hint = 4,
}
impl serde::Deserialize for DiagnosticSeverity {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => DiagnosticSeverity::Error,
2 => DiagnosticSeverity::Warning,
3 => DiagnosticSeverity::Information,
4 => DiagnosticSeverity::Hint,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, 3 or 4 to \
deserialize to DiagnosticSeverity"))
}
})
}
}
impl serde::Serialize for DiagnosticSeverity {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
pub struct Command {
pub title: String,
pub command: String,
#[serde(skip_serializing_if="Option::is_none")]
pub arguments: Option<Vec<Value>>,
}
impl Command {
pub fn new(title: String, command: String, arguments: Option<Vec<Value>>) -> Command {
Command{ title : title, command : command, arguments : arguments }
}
}
#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
pub struct TextEdit {
pub range: Range,
#[serde(rename="newText")]
pub new_text: String,
}
impl TextEdit {
pub fn new(range: Range, new_text: String) -> TextEdit {
TextEdit{ range : range, new_text : new_text }
}
}
#[derive(Debug, PartialEq, Clone, Default, Deserialize, Serialize)]
pub struct WorkspaceEdit {
pub changes: HashMap<Url, Vec<TextEdit>>,
}
impl WorkspaceEdit {
pub fn new(changes: HashMap<Url, Vec<TextEdit>>) -> WorkspaceEdit {
WorkspaceEdit{ changes : changes }
}
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct TextDocumentIdentifier {
pub uri: Url,
}
impl TextDocumentIdentifier {
pub fn new(uri: Url) -> TextDocumentIdentifier {
TextDocumentIdentifier{ uri : uri }
}
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct TextDocumentItem {
pub uri: Url,
#[serde(rename="languageId")]
pub language_id: Option<String>,
pub version: Option<u64>,
pub text: String,
}
impl TextDocumentItem {
pub fn new(uri: Url, language_id: Option<String>, version: Option<u64>, text: String) -> TextDocumentItem {
TextDocumentItem{ uri : uri, language_id : language_id, version : version, text : text,}
}
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct VersionedTextDocumentIdentifier
{
pub uri: Url,
pub version: u64,
}
impl VersionedTextDocumentIdentifier {
pub fn new(uri: Url, version: u64,) -> VersionedTextDocumentIdentifier {
VersionedTextDocumentIdentifier{ uri : uri, version : version}
}
}
#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)]
pub struct TextDocumentPositionParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
}
impl TextDocumentPositionParams {
pub fn new(text_document: TextDocumentIdentifier, position: Position) -> TextDocumentPositionParams {
TextDocumentPositionParams{ text_document : text_document, position : position}
}
}
pub const REQUEST__Initialize: &'static str = "initialize";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct InitializeParams {
#[serde(rename="processId")]
pub process_id: Option<u64>,
#[serde(rename="rootPath")]
pub root_path: Option<String>,
#[serde(rename="initializationOptions")]
pub initialization_options: Option<Value>,
pub capabilities: ClientCapabilities,
}
pub type ClientCapabilities = Value;
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct InitializeResult {
pub capabilities: ServerCapabilities,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct InitializeError {
pub retry: bool,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum TextDocumentSyncKind {
None = 0,
Full = 1,
Incremental = 2,
}
impl serde::Deserialize for TextDocumentSyncKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
0 => TextDocumentSyncKind::None,
1 => TextDocumentSyncKind::Full,
2 => TextDocumentSyncKind::Incremental,
_ => {
return Err(D::Error::invalid_value("Expected a value between 1 and 2 (inclusive) \
to deserialize to TextDocumentSyncKind"))
}
})
}
}
impl serde::Serialize for TextDocumentSyncKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionOptions {
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="resolveProvider")]
pub resolve_provider: Option<bool>,
#[serde(rename="triggerCharacters")]
pub trigger_characters: Vec<String>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct SignatureHelpOptions {
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="triggerCharacters")]
pub trigger_characters: Option<Vec<String>>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLensOptions {
#[serde(rename="resolveProvider")]
pub resolve_provider: Option<bool>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct DocumentOnTypeFormattingOptions {
#[serde(rename="firstTriggerCharacter")]
pub first_trigger_character: String,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="moreTriggerCharacter")]
pub more_trigger_character: Option<Vec<String>>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="textDocumentSync")]
pub text_document_sync: Option<TextDocumentSyncKind>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="hoverProvider")]
pub hover_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="completionProvider")]
pub completion_provider: Option<CompletionOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="signatureHelpProvider")]
pub signature_help_provider: Option<SignatureHelpOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="definitionProvider")]
pub definition_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="referencesProvider")]
pub references_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentHighlightProvider")]
pub document_highlight_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentSymbolProvider")]
pub document_symbol_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="workspaceSymbolProvider")]
pub workspace_symbol_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="codeActionProvider")]
pub code_action_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="codeLensProvider")]
pub code_lens_provider: Option<CodeLensOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentFormattingProvider")]
pub document_formatting_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentRangeFormattingProvider")]
pub document_range_formatting_provider: Option<bool>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="documentOnTypeFormattingProvider")]
pub document_on_type_formatting_provider: Option<DocumentOnTypeFormattingOptions>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="renameProvider")]
pub rename_provider: Option<bool>,
}
pub const REQUEST__Shutdown: &'static str = "shutdown";
pub const NOTIFICATION__Exit: &'static str = "exit";
pub const NOTIFICATION__ShowMessage: &'static str = "window/showMessage";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ShowMessageParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
}
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum MessageType {
Error = 1,
Warning = 2,
Info = 3,
Log = 4,
}
impl serde::Deserialize for MessageType {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => MessageType::Error,
2 => MessageType::Warning,
3 => MessageType::Info,
4 => MessageType::Log,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, 3 or 4 to \
deserialze to MessageType"))
}
})
}
}
impl serde::Serialize for MessageType {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
pub const REQUEST__ShowMessageRequest: &'static str = "window/showMessageRequest";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ShowMessageRequestParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
#[serde(skip_serializing_if="Option::is_none")]
pub actions: Option<Vec<MessageActionItem>>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct MessageActionItem {
pub title: String,
}
pub const NOTIFICATION__LogMessage: &'static str = "window/logMessage";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct LogMessageParams {
#[serde(rename="type")]
pub typ: MessageType,
pub message: String,
}
pub const NOTIFICATION__TelemetryEvent: &'static str = "telemetry/event";
pub const NOTIFICATION__WorkspaceChangeConfiguration: &'static str = "workspace/didChangeConfiguration";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeConfigurationParams {
pub settings: Value,
}
pub const NOTIFICATION__DidOpenTextDocument: &'static str = "textDocument/didOpen";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidOpenTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentItem,
}
pub const NOTIFICATION__DidChangeTextDocument: &'static str = "textDocument/didChange";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: VersionedTextDocumentIdentifier,
#[serde(rename="contentChanges")]
pub content_changes: Vec<TextDocumentContentChangeEvent>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct TextDocumentContentChangeEvent {
pub range: Option<Range>,
#[serde(rename="rangeLength")]
pub range_length: Option<u64>,
pub text: String,
}
pub const NOTIFICATION__DidCloseTextDocument: &'static str = "textDocument/didClose";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidCloseTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
pub const NOTIFICATION__DidSaveTextDocument: &'static str = "textDocument/didSave";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidSaveTextDocumentParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
pub const NOTIFICATION__DidChangeWatchedFiles: &'static str = "workspace/didChangeWatchedFiles";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DidChangeWatchedFilesParams {
pub changes: Vec<FileEvent>,
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum FileChangeType {
Created = 1,
Changed = 2,
Deleted = 3,
}
impl serde::Deserialize for FileChangeType {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => FileChangeType::Created,
2 => FileChangeType::Changed,
3 => FileChangeType::Deleted,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2 or 3 to deserialze \
to FileChangeType"))
}
})
}
}
impl serde::Serialize for FileChangeType {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct FileEvent {
pub uri: Url,
#[serde(rename="type")]
pub typ: FileChangeType,
}
impl FileEvent {
pub fn new(uri: Url, typ: FileChangeType) -> FileEvent {
FileEvent{ uri : uri, typ: typ }
}
}
pub const NOTIFICATION__PublishDiagnostics: &'static str = "textDocument/publishDiagnostics";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct PublishDiagnosticsParams {
pub uri: Url,
pub diagnostics: Vec<Diagnostic>,
}
impl PublishDiagnosticsParams {
pub fn new(uri: Url, diagnostics: Vec<Diagnostic>) -> PublishDiagnosticsParams {
PublishDiagnosticsParams{ uri : uri, diagnostics: diagnostics }
}
}
pub const REQUEST__Completion: &'static str = "textDocument/completion";
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionList {
#[serde(rename="isIncomplete")]
pub is_incomplete: bool,
pub items: Vec<CompletionItem>,
}
#[derive(Debug, PartialEq, Default, Deserialize, Serialize)]
pub struct CompletionItem {
pub label: String,
#[serde(skip_serializing_if="Option::is_none")]
pub kind: Option<CompletionItemKind>,
#[serde(skip_serializing_if="Option::is_none")]
pub detail: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
pub documentation: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="sortText")]
pub sort_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="filterText")]
pub filter_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="insertText")]
pub insert_text: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="textEdit")]
pub text_edit: Option<TextEdit>,
#[serde(skip_serializing_if="Option::is_none")]
#[serde(rename="additionalTextEdits")]
pub additional_text_edits: Option<Vec<TextEdit>>,
#[serde(skip_serializing_if="Option::is_none")]
pub command: Option<Command>,
#[serde(skip_serializing_if="Option::is_none")]
pub data: Option<Value>,
}
impl CompletionItem {
pub fn new_simple(label: String, detail: String) -> CompletionItem {
CompletionItem {
label : label,
detail : Some(detail),
.. Self::default()
}
}
}
enum_from_primitive!{
#[derive(Debug, PartialEq, Clone, Copy)]
pub enum CompletionItemKind {
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,
}
}
impl serde::Deserialize for CompletionItemKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
use enum_primitive::FromPrimitive;
let i = try!(u8::deserialize(deserializer));
CompletionItemKind::from_u8(i).ok_or_else(|| {
D::Error::invalid_value("Expected a value between 1 and 18 (inclusive) to deserialize \
to CompletionItemKind")
})
}
}
impl serde::Serialize for CompletionItemKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
pub const REQUEST__ResolveCompletionItem: &'static str = "completionItem/resolve";
pub const REQUEST__Hover: &'static str = "textDocument/hover";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct Hover {
pub contents: Vec<MarkedString>,
pub range: Option<Range>,
}
#[derive(Debug, PartialEq)]
pub enum MarkedString {
String(String),
LanguageString(LanguageString),
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct LanguageString {
language: String,
value: String,
}
impl MarkedString {
pub fn from_markdown(markdown: String) -> MarkedString {
MarkedString::String(markdown)
}
pub fn from_language_code(language: String, code_block: String) -> MarkedString {
MarkedString::LanguageString(LanguageString{ language: language, value: code_block })
}
}
#[test]
fn test_LanguageString() {
test_serialization(
&LanguageString { language : "LL".into(), value : "VV".into() } ,
r#"{"language":"LL","value":"VV"}"#
);
}
impl Serialize for MarkedString {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
match *self {
MarkedString::String(ref string) => serializer.serialize_str(string),
MarkedString::LanguageString(ref language_string) => language_string.serialize(serializer),
}
}
}
impl Deserialize for MarkedString {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
#[allow(non_camel_case_types)]
struct MarkedString_Visitor;
impl de::Visitor for MarkedString_Visitor {
type Value = MarkedString;
fn visit_str<E>(&mut self, value: &str) -> Result<Self::Value, E> where E: de::Error {
Ok(MarkedString::String(value.to_string()))
}
fn visit_map<V>(&mut self, visitor: V) -> Result<Self::Value, V::Error> where V: de::MapVisitor {
let mut mvd = de::value::MapVisitorDeserializer::new(visitor);
let language_string = try!(LanguageString::deserialize(&mut mvd));
Ok(MarkedString::LanguageString(language_string))
}
}
deserializer.deserialize(MarkedString_Visitor)
}
}
#[test]
fn test_MarkedString() {
test_serialization(
&MarkedString::from_markdown("xxx".into()),
r#""xxx""#
);
test_serialization(
&MarkedString::from_language_code("lang".into(), "code".into()),
r#"{"language":"lang","value":"code"}"#
);
}
pub const REQUEST__SignatureHelp: &'static str = "textDocument/signatureHelp";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SignatureHelp {
pub signatures: Vec<SignatureInformation>,
#[serde(rename="activeSignature")]
pub active_signature: Option<u64>,
#[serde(rename="activeParameter")]
pub active_parameter: Option<u64>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SignatureInformation {
pub label: String,
pub documentation: Option<String>,
#[serde(skip_serializing_if="Option::is_none")]
pub parameters: Option<Vec<ParameterInformation>>,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ParameterInformation {
pub label: String,
#[serde(skip_serializing_if="Option::is_none")]
pub documentation: Option<String>,
}
pub const REQUEST__GotoDefinition: &'static str = "textDocument/definition";
pub const REQUEST__References: &'static str = "textDocument/references";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ReferenceParams
{
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
pub context: ReferenceContext,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct ReferenceContext {
#[serde(rename="includeDeclaration")]
pub include_declaration: bool,
}
pub const REQUEST__DocumentHighlight: &'static str = "textDocument/documentHighlight";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentHighlight {
pub range: Range,
pub kind: Option<DocumentHighlightKind>,
}
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum DocumentHighlightKind {
Text = 1,
Read = 2,
Write = 3,
}
impl serde::Deserialize for DocumentHighlightKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
Ok(match try!(u8::deserialize(deserializer)) {
1 => DocumentHighlightKind::Text,
2 => DocumentHighlightKind::Read,
3 => DocumentHighlightKind::Write,
_ => {
return Err(D::Error::invalid_value("Expected a value of 1, 2, or 3 to \
deserialze to DocumentHighlightKiny"))
}
})
}
}
impl serde::Serialize for DocumentHighlightKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
pub const REQUEST__DocumentSymbols: &'static str = "textDocument/documentSymbol";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentSymbolParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct SymbolInformation {
pub name: String,
pub kind: SymbolKind,
pub location: Location,
#[serde(rename="containerName")]
pub container_name: Option<String>
}
enum_from_primitive!{
#[derive(Debug, PartialEq, Copy, Clone)]
pub enum SymbolKind {
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,
}
}
impl serde::Deserialize for SymbolKind {
fn deserialize<D>(deserializer: &mut D) -> Result<Self, D::Error>
where D: serde::Deserializer
{
use enum_primitive::FromPrimitive;
let i = try!(u8::deserialize(deserializer));
SymbolKind::from_u8(i).ok_or_else(|| {
D::Error::invalid_value("Expected a value between 1 and 18 (inclusive) to deserialize \
to SymbolKind")
})
}
}
impl serde::Serialize for SymbolKind {
fn serialize<S>(&self, serializer: &mut S) -> Result<(), S::Error>
where S: serde::Serializer
{
serializer.serialize_u8(*self as u8)
}
}
pub const REQUEST__WorkspaceSymbols: &'static str = "workspace/symbol";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct WorkspaceSymbolParams {
pub query: String,
}
pub const REQUEST__CodeAction: &'static str = "textDocument/codeAction";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeActionParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub range: Range,
pub context: CodeActionContext,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeActionContext {
pub diagnostics: Vec<Diagnostic>,
}
pub const REQUEST__CodeLens: &'static str = "textDocument/codeLens";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLensParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct CodeLens {
pub range: Range,
pub command: Option<Command>,
pub data: Option<Value>,
}
pub const REQUEST__CodeLensResolve: &'static str = "codeLens/resolve";
pub const REQUEST__DocumentLink: &'static str = "textDocument/documentLink";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentLinkParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentLink {
pub range: Range,
pub target: Url,
}
pub const REQUEST__DocumentLinkResolve: &'static str = "documentLink/resolve";
pub const REQUEST__Formatting: &'static str = "textDocument/formatting";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentFormattingParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub options: FormattingOptions,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct FormattingOptions {
#[serde(rename="tabSize")]
pub tab_size: u64,
#[serde(rename="insertSpaces")]
pub insert_spaces: bool,
}
pub const REQUEST__RangeFormatting: &'static str = "textDocument/rangeFormatting";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentRangeFormattingParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub range: Range,
pub options: FormattingOptions,
}
pub const REQUEST__OnTypeFormatting: &'static str = "textDocument/onTypeFormatting";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct DocumentOnTypeFormattingParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
pub ch: String,
pub options: FormattingOptions,
}
pub const REQUEST__Rename: &'static str = "textDocument/rename";
#[derive(Debug, PartialEq, Deserialize, Serialize)]
pub struct RenameParams {
#[serde(rename="textDocument")]
pub text_document: TextDocumentIdentifier,
pub position: Position,
#[serde(rename="newName")]
pub new_name: String,
}
#[cfg(test)]
fn test_serialization<SER>(ms: &SER, expected: &str)
where SER : Serialize + Deserialize + PartialEq + std::fmt::Debug
{
let json_str = serde_json::to_string(ms).unwrap();
assert_eq!(&json_str, expected);
let deserialized : SER = serde_json::from_str(&json_str).unwrap();
assert_eq!(&deserialized, ms);
}