Use boxed macro inside jsonrpc_client

This commit is contained in:
Eric Förster 2019-06-01 19:14:51 +02:00
parent 45b5f6b455
commit 2f6ad42735
51 changed files with 38 additions and 97 deletions

View file

@ -3,7 +3,7 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use proc_macro::{TokenStream, TokenTree};
use quote::quote;
use quote::ToTokens;
use std::iter::FromIterator;
@ -15,7 +15,11 @@ pub fn boxed(_attr: TokenStream, item: TokenStream) -> TokenStream {
match parse::<ItemFn>(item.clone()) {
Ok(fn_) => boxed_fn(fn_),
Err(_) => {
let item: TokenStream = TokenStream::from_iter(item.into_iter().skip(1));
let item = TokenStream::from_iter(item.into_iter().filter(|x| match x {
TokenTree::Ident(x) if x.to_string() == "async" => false,
_ => true,
}));
let method: TraitItemMethod = parse(item).unwrap();
boxed_trait_method(method)
}
@ -30,6 +34,7 @@ fn boxed_fn(fn_: ItemFn) -> TokenStream {
let tokens = quote! {
#(#attrs)*
#vis #decl {
use futures::future::FutureExt;
let task = async move #block;
task.boxed()
}

View file

@ -1,6 +1,5 @@
use crate::types::*;
use futures::channel::oneshot;
use futures::future::BoxFuture;
use futures::lock::Mutex;
use futures::prelude::*;
use futures_boxed::boxed;
@ -12,8 +11,6 @@ use std::sync::Arc;
pub type Result<T> = std::result::Result<T, Error>;
pub type FutureResult<'a, T> = BoxFuture<'a, Result<T>>;
pub trait ResponseHandler {
#[boxed]
async fn handle(&self, response: Response);

View file

@ -3,7 +3,9 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use std::str::FromStr;
use syn::export::TokenStream2;
use syn::*;
@ -52,18 +54,12 @@ impl MethodMeta {
}
#[proc_macro_attribute]
pub fn jsonrpc_method(
_attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
pub fn jsonrpc_method(_attr: TokenStream, item: TokenStream) -> TokenStream {
item
}
#[proc_macro_attribute]
pub fn jsonrpc_server(
_attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
pub fn jsonrpc_server(_attr: TokenStream, item: TokenStream) -> TokenStream {
let impl_: ItemImpl = parse_macro_input!(item);
let generics = &impl_.generics;
let self_ty = &impl_.self_ty;
@ -75,7 +71,6 @@ pub fn jsonrpc_server(
impl #generics jsonrpc::RequestHandler for #self_ty {
#[boxed]
async fn handle_request(&self, request: jsonrpc::Request) -> jsonrpc::Response {
use futures::prelude::*;
use jsonrpc::*;
match request.method.as_str() {
@ -99,10 +94,8 @@ pub fn jsonrpc_server(
}
#[proc_macro_attribute]
pub fn jsonrpc_client(
attr: proc_macro::TokenStream,
item: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
pub fn jsonrpc_client(attr: TokenStream, item: TokenStream) -> TokenStream {
let item = TokenStream::from_str(&item.to_string().replace("async ", "")).unwrap();
let trait_: ItemTrait = parse_macro_input!(item);
let trait_ident = &trait_.ident;
let stubs = generate_client_stubs(&trait_.items);
@ -113,7 +106,7 @@ pub fn jsonrpc_client(
#trait_
pub struct #struct_ident<O> {
client: std::sync::Arc<jsonrpc::Client<O>>
client: jsonrpc::Client<O>
}
impl<O> #struct_ident<O>
@ -122,7 +115,7 @@ pub fn jsonrpc_client(
{
pub fn new(output: std::sync::Arc<futures::lock::Mutex<O>>) -> Self {
Self {
client: std::sync::Arc::new(jsonrpc::Client::new(output)),
client: jsonrpc::Client::new(output),
}
}
}
@ -138,8 +131,9 @@ pub fn jsonrpc_client(
where
O: jsonrpc::Output,
{
fn handle(&self, response: jsonrpc::Response) -> futures::future::BoxFuture<'_, ()> {
self.client.handle(response)
#[boxed]
async fn handle(&self, response: jsonrpc::Response) -> () {
self.client.handle(response).await
}
}
};
@ -195,36 +189,24 @@ fn generate_client_stubs(items: &Vec<TraitItem>) -> Vec<TokenStream2> {
let mut stubs = Vec::new();
for item in items {
let method = unwrap!(item, TraitItem::Method(x) => x);
let attrs = &method.attrs;
let sig = &method.sig;
let param = unwrap!(&sig.decl.inputs[1], FnArg::Captured(x) => &x.pat);
let meta = MethodMeta::parse(method.attrs.first().unwrap());
let meta = MethodMeta::parse(attrs.first().unwrap());
let name = &meta.name;
let stub = match meta.kind {
MethodKind::Request => quote!(
#[boxed]
#sig {
use futures::prelude::*;
use jsonrpc::*;
let client = std::sync::Arc::clone(&self.client);
let task = async move {
let result = client.send_request(#name.to_owned(), #param).await?;
serde_json::from_value(result).map_err(|_| Error::deserialize_error())
};
task.boxed()
let result = self.client.send_request(#name.to_owned(), #param).await?;
serde_json::from_value(result).map_err(|_| jsonrpc::Error::deserialize_error())
}
),
MethodKind::Notification => quote!(
#[boxed]
#sig {
use futures::prelude::*;
let client = std::sync::Arc::clone(&self.client);
let task = async move {
self.client.send_notification(#name.to_owned(), #param).await;
};
task.boxed()
self.client.send_notification(#name.to_owned(), #param).await
}
),
};

View file

@ -1,6 +1,5 @@
use crate::client::LspClient;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::*;
use serde::{Deserialize, Serialize};

View file

@ -1,10 +1,8 @@
use crate::diagnostics::LatexLintOptions;
use crate::formatting::bibtex::BibtexFormattingOptions;
use futures::future::BoxFuture;
use futures::lock::Mutex;
use futures::prelude::*;
use futures_boxed::boxed;
use jsonrpc::client::{FutureResult, Result};
use jsonrpc::client::Result;
use jsonrpc_derive::{jsonrpc_client, jsonrpc_method};
use lsp_types::*;
use serde::Serialize;
@ -14,22 +12,28 @@ use std::collections::HashMap;
#[jsonrpc_client(LatexLspClient)]
pub trait LspClient {
#[jsonrpc_method("workspace/configuration", kind = "request")]
fn configuration(&self, params: ConfigurationParams) -> FutureResult<'_, serde_json::Value>;
#[boxed]
async fn configuration(&self, params: ConfigurationParams) -> Result<serde_json::Value>;
#[jsonrpc_method("window/showMessage", kind = "notification")]
fn show_message(&self, params: ShowMessageParams) -> BoxFuture<'_, ()>;
#[boxed]
async fn show_message(&self, params: ShowMessageParams);
#[jsonrpc_method("client/registerCapability", kind = "request")]
fn register_capability(&self, params: RegistrationParams) -> FutureResult<'_, ()>;
#[boxed]
async fn register_capability(&self, params: RegistrationParams) -> Result<()>;
#[jsonrpc_method("textDocument/publishDiagnostics", kind = "notification")]
fn publish_diagnostics(&self, params: PublishDiagnosticsParams) -> BoxFuture<'_, ()>;
#[boxed]
async fn publish_diagnostics(&self, params: PublishDiagnosticsParams);
#[jsonrpc_method("window/progress", kind = "notification")]
fn progress(&self, params: ProgressParams) -> BoxFuture<'_, ()>;
#[boxed]
async fn progress(&self, params: ProgressParams) -> ();
#[jsonrpc_method("window/logMessage", kind = "notification")]
fn log_message(&self, params: LogMessageParams) -> BoxFuture<'_, ()>;
#[boxed]
async fn log_message(&self, params: LogMessageParams) -> ();
}
#[derive(Debug, PartialEq, Eq, Clone, Default)]

View file

@ -4,7 +4,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::bibtex::BibtexDeclaration;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -4,7 +4,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::bibtex::BibtexNode;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -5,7 +5,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::bibtex::BibtexNode;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -2,7 +2,6 @@ use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::data::symbols::DATABASE;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -2,7 +2,6 @@ use crate::completion::factory;
use crate::completion::factory::LatexComponentId;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::CITATION_COMMANDS;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -1,7 +1,6 @@
use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::completion::factory::LatexComponentId;
use crate::completion::latex::combinators::LatexCombinators;
use crate::data::symbols::DATABASE;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -2,7 +2,6 @@ use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::LatexCommand;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::path::{Path, PathBuf};

View file

@ -3,7 +3,6 @@ use crate::completion::factory::LatexComponentId;
use crate::completion::latex::combinators::LatexCombinators;
use crate::completion::latex::kernel_primitives::KERNEL_COMMANDS;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::completion::factory::LatexComponentId;
use crate::completion::latex::combinators::LatexCombinators;
use crate::completion::latex::kernel_primitives::KERNEL_ENVIRONMENTS;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::*;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -2,7 +2,6 @@ use crate::completion::factory;
use crate::completion::factory::LatexComponentId;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::completion::factory;
use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams};
use std::borrow::Cow;

View file

@ -4,7 +4,6 @@ use crate::completion::latex::combinators::LatexCombinators;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use itertools::Itertools;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -23,7 +23,6 @@ use self::latex::tikz_library::LatexTikzLibraryCompletionProvider;
use self::latex::user_command::LatexUserCommandCompletionProvider;
use self::quality::OrderByQualityCompletionProvider;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use itertools::Itertools;
use lsp_types::{CompletionItem, CompletionParams};

View file

@ -4,7 +4,6 @@ use crate::syntax::latex::*;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use crate::workspace::Document;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{CompletionItem, CompletionParams, Position};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::syntax::latex::{LatexCitation, LatexToken};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use crate::workspace::Document;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, TextDocumentPositionParams};

View file

@ -3,7 +3,6 @@ use crate::syntax::latex::*;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use crate::workspace::Document;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, TextDocumentPositionParams};

View file

@ -4,7 +4,6 @@ mod latex_label;
use self::latex_citation::LatexCitationDefinitionProvider;
use self::latex_label::LatexLabelDefinitionProvider;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, TextDocumentPositionParams};

View file

@ -3,7 +3,6 @@ use crate::resolver::TexResolver;
#[cfg(test)]
use crate::workspace::WorkspaceBuilder;
use crate::workspace::{Document, Workspace};
use futures::prelude::*;
use futures_boxed::boxed;
#[cfg(test)]
use lsp_types::*;

View file

@ -2,7 +2,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::bibtex::BibtexDeclaration;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams};

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams};

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams};

View file

@ -6,7 +6,6 @@ use self::bibtex_declaration::BibtexDeclarationFoldingProvider;
use self::latex_environment::LatexEnvironmentFoldingProvider;
use self::latex_section::LatexSectionFoldingProvider;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{FoldingRange, FoldingRangeParams};

View file

@ -2,7 +2,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::*;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{DocumentHighlight, DocumentHighlightKind, TextDocumentPositionParams};

View file

@ -2,7 +2,6 @@ mod latex_label;
use self::latex_label::LatexLabelHighlightProvider;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{DocumentHighlight, TextDocumentPositionParams};

View file

@ -2,7 +2,6 @@ use crate::data::bibtex_entry_type;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::*;
use std::borrow::Cow;

View file

@ -2,7 +2,6 @@ use crate::data::bibtex_field;
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::bibtex::*;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::*;
use std::borrow::Cow;

View file

@ -4,7 +4,6 @@ use crate::formatting::bibtex::{BibtexFormattingOptions, BibtexFormattingParams}
use crate::syntax::bibtex::BibtexEntry;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Hover, HoverContents, MarkupContent, MarkupKind, TextDocumentPositionParams};
use std::borrow::Cow;

View file

@ -3,7 +3,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::LatexIncludeKind;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Hover, HoverContents, TextDocumentPositionParams};

View file

@ -8,7 +8,6 @@ use self::bibtex_field::BibtexFieldHoverProvider;
use self::latex_citation::LatexCitationHoverProvider;
use self::latex_component::LatexComponentHoverProvider;
use crate::feature::{ChoiceProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Hover, TextDocumentPositionParams};

View file

@ -2,7 +2,6 @@ use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::*;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{DocumentLink, DocumentLinkParams};

View file

@ -2,7 +2,6 @@ mod latex_include;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use crate::link::latex_include::LatexIncludeLinkProvider;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{DocumentLink, DocumentLinkParams};

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, ReferenceParams};

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::latex::LatexLabelKind;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, ReferenceParams};

View file

@ -4,7 +4,6 @@ mod latex_label;
use self::bibtex_entry::BibtexEntryReferenceProvider;
use self::latex_label::LatexLabelReferenceProvider;
use crate::feature::{ConcatProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{Location, ReferenceParams};

View file

@ -3,7 +3,6 @@ use crate::syntax::bibtex::BibtexSyntaxTree;
use crate::syntax::latex::LatexSyntaxTree;
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::*;
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{RenameParams, TextEdit, WorkspaceEdit};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{RenameParams, TextEdit, WorkspaceEdit};
use std::borrow::Cow;

View file

@ -1,7 +1,6 @@
use crate::feature::{FeatureProvider, FeatureRequest};
use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{RenameParams, TextEdit, WorkspaceEdit};
use std::borrow::Cow;

View file

@ -8,7 +8,6 @@ use self::latex_command::LatexCommandRenameProvider;
use self::latex_environment::LatexEnvironmentRenameProvider;
use self::latex_label::LatexLabelRenameProvider;
use crate::feature::{ChoiceProvider, FeatureProvider, FeatureRequest};
use futures::prelude::*;
use futures_boxed::boxed;
use lsp_types::{RenameParams, WorkspaceEdit};

View file

@ -24,7 +24,6 @@ use crate::syntax::text::SyntaxNode;
use crate::syntax::SyntaxTree;
use crate::workspace::WorkspaceManager;
use futures::lock::Mutex;
use futures::prelude::*;
use futures_boxed::boxed;
use jsonrpc::server::Result;
use jsonrpc_derive::{jsonrpc_method, jsonrpc_server};