lsp: Make base request methods take &self instead of &mut self.

This commit is contained in:
Blaž Hrastnik 2020-10-29 14:06:33 +09:00
parent cc6bdf8f66
commit ae8a9e5bac
5 changed files with 72 additions and 67 deletions

84
Cargo.lock generated
View File

@ -29,9 +29,9 @@ checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
[[package]] [[package]]
name = "arrayvec" name = "arrayvec"
version = "0.5.1" version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
[[package]] [[package]]
name = "async-channel" name = "async-channel"
@ -118,7 +118,7 @@ checksum = "4c8cea09c1fb10a317d1b5af8024eeba256d6554763e85ecd90ff8df31c7bbda"
dependencies = [ dependencies = [
"async-io", "async-io",
"blocking", "blocking",
"cfg-if", "cfg-if 0.1.10",
"event-listener", "event-listener",
"futures-lite", "futures-lite",
"once_cell", "once_cell",
@ -208,6 +208,12 @@ version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
[[package]]
name = "cfg-if"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "chrono" name = "chrono"
version = "0.4.19" version = "0.4.19"
@ -267,15 +273,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
dependencies = [ dependencies = [
"autocfg", "autocfg",
"cfg-if", "cfg-if 0.1.10",
"lazy_static", "lazy_static",
] ]
[[package]] [[package]]
name = "crossterm" name = "crossterm"
version = "0.18.0" version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2fcdc3c9cf8ee446222e8ee8691a6d21b563b8fe1a64b1873080db7b5b23cf0" checksum = "cef9149b29071d44c9fb98fd9c27fcf74405bbdb761889ad6a03f36be93b0b15"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"crossterm_winapi", "crossterm_winapi",
@ -290,9 +296,9 @@ dependencies = [
[[package]] [[package]]
name = "crossterm_winapi" name = "crossterm_winapi"
version = "0.6.1" version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "057b7146d02fb50175fd7dbe5158f6097f33d02831f43b4ee8ae4ddf67b68f5c" checksum = "c2265c3f8e080075d9b6417aa72293fc71662f34b4af2612d8d1b074d29510db"
dependencies = [ dependencies = [
"winapi", "winapi",
] ]
@ -303,7 +309,7 @@ version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
"dirs-sys", "dirs-sys",
] ]
@ -360,15 +366,15 @@ checksum = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed"
[[package]] [[package]]
name = "futures-core" name = "futures-core"
version = "0.3.6" version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d674eaa0056896d5ada519900dbf97ead2e46a7b6621e8160d79e2f2e1e2784b" checksum = "18eaa56102984bed2c88ea39026cff3ce3b4c7f508ca970cedf2450ea10d4e46"
[[package]] [[package]]
name = "futures-io" name = "futures-io"
version = "0.3.6" version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fc94b64bb39543b4e432f1790b6bf18e3ee3b74653c5449f63310e9a74b123c" checksum = "6e1798854a4727ff944a7b12aa999f58ce7aa81db80d2dfaaf2ba06f065ddd2b"
[[package]] [[package]]
name = "futures-lite" name = "futures-lite"
@ -387,9 +393,9 @@ dependencies = [
[[package]] [[package]]
name = "futures-macro" name = "futures-macro"
version = "0.3.6" version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f57ed14da4603b2554682e9f2ff3c65d7567b53188db96cb71538217fc64581b" checksum = "e36fccf3fc58563b4a14d265027c627c3b665d7fed489427e88e7cc929559efe"
dependencies = [ dependencies = [
"proc-macro-hack", "proc-macro-hack",
"proc-macro2", "proc-macro2",
@ -399,18 +405,18 @@ dependencies = [
[[package]] [[package]]
name = "futures-task" name = "futures-task"
version = "0.3.6" version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4dd26820a9f3637f1302da8bceba3ff33adbe53464b54ca24d4e2d4f1db30f94" checksum = "96d502af37186c4fef99453df03e374683f8a1eec9dcc1e66b3b82dc8278ce3c"
dependencies = [ dependencies = [
"once_cell", "once_cell",
] ]
[[package]] [[package]]
name = "futures-util" name = "futures-util"
version = "0.3.6" version = "0.3.7"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8a894a0acddba51a2d49a6f4263b1e64b8c579ece8af50fa86503d52cd1eea34" checksum = "abcb44342f62e6f3e8ac427b8aa815f724fd705dfad060b18ac7866c15bb8e34"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-macro", "futures-macro",
@ -428,7 +434,7 @@ version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
"libc", "libc",
"wasi 0.9.0+wasi-snapshot-preview1", "wasi 0.9.0+wasi-snapshot-preview1",
] ]
@ -553,11 +559,11 @@ dependencies = [
[[package]] [[package]]
name = "instant" name = "instant"
version = "0.1.7" version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63312a18f7ea8760cdd0a7c5aac1a619752a246b833545e3e36d1f81f7cd9e66" checksum = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 1.0.0",
] ]
[[package]] [[package]]
@ -596,9 +602,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.79" version = "0.2.80"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2448f6066e80e3bfc792e9c98bf705b4b0fc6e8ef5b43e5889aff0eaa9c58743" checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614"
[[package]] [[package]]
name = "lock_api" name = "lock_api"
@ -615,14 +621,14 @@ version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b" checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
] ]
[[package]] [[package]]
name = "lsp-types" name = "lsp-types"
version = "0.82.0" version = "0.83.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "db895abb8527cf59e3de893ab2acf52cf904faeb65e60ea6f373e11fe86464e8" checksum = "25e0bd4b95038f2c23bda332ba0ca684e8dda765db1f9bdb63dc4c3e01f3b456"
dependencies = [ dependencies = [
"base64", "base64",
"bitflags", "bitflags",
@ -691,9 +697,9 @@ checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
[[package]] [[package]]
name = "ntapi" name = "ntapi"
version = "0.3.4" version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a31937dea023539c72ddae0e3571deadc1414b300483fa7aaec176168cfa9d2" checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
dependencies = [ dependencies = [
"winapi", "winapi",
] ]
@ -762,7 +768,7 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" checksum = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
"cloudabi", "cloudabi",
"instant", "instant",
"libc", "libc",
@ -785,18 +791,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]] [[package]]
name = "pin-project" name = "pin-project"
version = "0.4.27" version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ffbc8e94b38ea3d2d8ba92aea2983b503cd75d0888d75b86bb37970b5698e15" checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841"
dependencies = [ dependencies = [
"pin-project-internal", "pin-project-internal",
] ]
[[package]] [[package]]
name = "pin-project-internal" name = "pin-project-internal"
version = "0.4.27" version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65ad2ae56b6abe3a1ee25f15ee605bacadb9a764edaba9c2bf4103800d4a1895" checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -821,7 +827,7 @@ version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4" checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
"libc", "libc",
"log", "log",
"wepoll-sys", "wepoll-sys",
@ -1034,7 +1040,7 @@ version = "0.3.15"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44" checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44"
dependencies = [ dependencies = [
"cfg-if", "cfg-if 0.1.10",
"libc", "libc",
"redox_syscall", "redox_syscall",
"winapi", "winapi",
@ -1042,9 +1048,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.46" version = "1.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ad5de3220ea04da322618ded2c42233d02baca219d6f160a3e9c87cda16c942" checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -10,7 +10,7 @@ edition = "2018"
helix-core = { path = "../helix-core" } helix-core = { path = "../helix-core" }
helix-view = { path = "../helix-view" } helix-view = { path = "../helix-view" }
lsp-types = { version = "0.82", features = ["proposed"] } lsp-types = { version = "0.83", features = ["proposed"] }
smol = "1.2" smol = "1.2"
url = "2" url = "2"
pathdiff = "0.2" pathdiff = "0.2"

View File

@ -9,6 +9,7 @@
use helix_view::Document; use helix_view::Document;
// use std::collections::HashMap; // use std::collections::HashMap;
use std::sync::atomic::{AtomicU64, Ordering};
use jsonrpc_core as jsonrpc; use jsonrpc_core as jsonrpc;
use lsp_types as lsp; use lsp_types as lsp;
@ -29,7 +30,7 @@ pub struct Client {
outgoing: Sender<Payload>, outgoing: Sender<Payload>,
pub incoming: Receiver<Call>, pub incoming: Receiver<Call>,
pub request_counter: u64, pub request_counter: AtomicU64,
capabilities: Option<lsp::ServerCapabilities>, capabilities: Option<lsp::ServerCapabilities>,
// TODO: handle PublishDiagnostics Version // TODO: handle PublishDiagnostics Version
@ -61,17 +62,16 @@ pub fn start(ex: &Executor, cmd: &str, args: &[String]) -> Self {
outgoing, outgoing,
incoming, incoming,
request_counter: 0, request_counter: AtomicU64::new(0),
capabilities: None, capabilities: None,
// diagnostics: HashMap::new(), // diagnostics: HashMap::new(),
} }
} }
fn next_request_id(&mut self) -> jsonrpc::Id { fn next_request_id(&self) -> jsonrpc::Id {
let id = jsonrpc::Id::Num(self.request_counter); let id = self.request_counter.fetch_add(1, Ordering::Relaxed);
self.request_counter += 1; jsonrpc::Id::Num(id)
id
} }
fn to_params(value: Value) -> Result<jsonrpc::Params> { fn to_params(value: Value) -> Result<jsonrpc::Params> {
@ -88,10 +88,7 @@ fn to_params(value: Value) -> Result<jsonrpc::Params> {
} }
/// Execute a RPC request on the language server. /// Execute a RPC request on the language server.
pub async fn request<R: lsp::request::Request>( pub async fn request<R: lsp::request::Request>(&self, params: R::Params) -> Result<R::Result>
&mut self,
params: R::Params,
) -> Result<R::Result>
where where
R::Params: serde::Serialize, R::Params: serde::Serialize,
R::Result: core::fmt::Debug, // TODO: temporary R::Result: core::fmt::Debug, // TODO: temporary
@ -128,10 +125,7 @@ pub async fn request<R: lsp::request::Request>(
} }
/// Send a RPC notification to the language server. /// Send a RPC notification to the language server.
pub async fn notify<R: lsp::notification::Notification>( pub async fn notify<R: lsp::notification::Notification>(&self, params: R::Params) -> Result<()>
&mut self,
params: R::Params,
) -> Result<()>
where where
R::Params: serde::Serialize, R::Params: serde::Serialize,
{ {
@ -153,7 +147,7 @@ pub async fn notify<R: lsp::notification::Notification>(
/// Reply to a language server RPC call. /// Reply to a language server RPC call.
pub async fn reply( pub async fn reply(
&mut self, &self,
id: jsonrpc::Id, id: jsonrpc::Id,
result: core::result::Result<Value, jsonrpc::Error>, result: core::result::Result<Value, jsonrpc::Error>,
) -> Result<()> { ) -> Result<()> {
@ -212,11 +206,11 @@ pub async fn initialize(&mut self) -> Result<()> {
Ok(()) Ok(())
} }
pub async fn shutdown(&mut self) -> Result<()> { pub async fn shutdown(&self) -> Result<()> {
self.request::<lsp::request::Shutdown>(()).await self.request::<lsp::request::Shutdown>(()).await
} }
pub async fn exit(&mut self) -> Result<()> { pub async fn exit(&self) -> Result<()> {
self.notify::<lsp::notification::Exit>(()).await self.notify::<lsp::notification::Exit>(()).await
} }

View File

@ -8,6 +8,8 @@
Document, Editor, Theme, View, Document, Editor, Theme, View,
}; };
use log::{debug, info};
use std::{ use std::{
borrow::Cow, borrow::Cow,
io::{self, stdout, Stdout, Write}, io::{self, stdout, Stdout, Write},
@ -46,7 +48,7 @@ pub struct Application<'a> {
keymap: Keymaps, keymap: Keymaps,
executor: &'a smol::Executor<'a>, executor: &'a smol::Executor<'a>,
lsp: helix_lsp::Client, language_server: helix_lsp::Client,
} }
struct Renderer { struct Renderer {
@ -370,7 +372,7 @@ pub fn new(mut args: Args, executor: &'a smol::Executor<'a>) -> Result<Self, Err
editor.open(file, terminal.size)?; editor.open(file, terminal.size)?;
} }
let lsp = helix_lsp::Client::start(&executor, "rust-analyzer", &[]); let language_server = helix_lsp::Client::start(&executor, "rust-analyzer", &[]);
let mut app = Self { let mut app = Self {
editor, editor,
@ -381,7 +383,7 @@ pub fn new(mut args: Args, executor: &'a smol::Executor<'a>) -> Result<Self, Err
// //
keymap: keymap::default(), keymap: keymap::default(),
executor, executor,
lsp, language_server,
}; };
Ok(app) Ok(app)
@ -415,11 +417,11 @@ pub async fn event_loop(&mut self) {
let mut reader = EventStream::new(); let mut reader = EventStream::new();
// initialize lsp // initialize lsp
let res = self.lsp.initialize().await; self.language_server.initialize().await.unwrap();
let res = self self.language_server
.lsp
.text_document_did_open(&self.editor.view().unwrap().doc) .text_document_did_open(&self.editor.view().unwrap().doc)
.await; .await
.unwrap();
self.render(); self.render();
@ -433,8 +435,8 @@ pub async fn event_loop(&mut self) {
event = reader.next().fuse() => { event = reader.next().fuse() => {
self.handle_terminal_events(event).await self.handle_terminal_events(event).await
} }
call = self.lsp.incoming.next().fuse() => { call = self.language_server.incoming.next().fuse() => {
self.handle_lsp_message(call).await self.handle_language_server_message(call).await
} }
} }
} }
@ -566,7 +568,7 @@ pub async fn handle_terminal_events(
}; };
} }
pub async fn handle_lsp_message(&mut self, call: Option<helix_lsp::Call>) { pub async fn handle_language_server_message(&mut self, call: Option<helix_lsp::Call>) {
use helix_lsp::{Call, Notification}; use helix_lsp::{Call, Notification};
match call { match call {
Some(Call::Notification(helix_lsp::jsonrpc::Notification { Some(Call::Notification(helix_lsp::jsonrpc::Notification {
@ -605,6 +607,7 @@ pub async fn handle_lsp_message(&mut self, call: Option<helix_lsp::Call>) {
view.doc.diagnostics = diagnostics; view.doc.diagnostics = diagnostics;
// TODO: we want to process all the events in queue, then render. publishDiagnostic tends to send a whole bunch of events
self.render(); self.render();
} }
} }

View File

@ -404,6 +404,8 @@ fn append_changes_to_history(view: &mut View) {
let old_state = std::mem::replace(&mut view.doc.old_state, view.doc.state.clone()); let old_state = std::mem::replace(&mut view.doc.old_state, view.doc.state.clone());
// TODO: take transaction by value? // TODO: take transaction by value?
view.doc.history.commit_revision(&transaction, &old_state); view.doc.history.commit_revision(&transaction, &old_state);
// TODO: notify LSP of changes
} }
pub fn normal_mode(view: &mut View, _count: usize) { pub fn normal_mode(view: &mut View, _count: usize) {