on master help sign in
wip
commit8adcf5083ffc12532ecca7594a2192acd954dd3a authorBlaž Hrastnik <blaz@mxxn.io> dateThu 15 Oct 2020, 23:32 (6 years ago) parent2e12fc9
4 files changed+389
Cargo.lock+302 Cargo.toml+1 helix-lsp/Cargo.toml+15 helix-lsp/src/lib.rs+71
Cargo.lock+302
@@ -21,6 +21,18 @@ version = "0.4.7"
2121source = "registry+https://github.com/rust-lang/crates.io-index"
2222checksum = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034"
2323
24+[[package]]
25+name = "arrayref"
26+version = "0.3.6"
27+source = "registry+https://github.com/rust-lang/crates.io-index"
28+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
29+
30+[[package]]
31+name = "arrayvec"
32+version = "0.5.1"
33+source = "registry+https://github.com/rust-lang/crates.io-index"
34+checksum = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
35+
2436[[package]]
2537name = "async-channel"
2638version = "1.5.1"
@@ -132,12 +144,29 @@ version = "1.0.1"
132144source = "registry+https://github.com/rust-lang/crates.io-index"
133145checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
134146
147+[[package]]
148+name = "base64"
149+version = "0.12.3"
150+source = "registry+https://github.com/rust-lang/crates.io-index"
151+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
152+
135153[[package]]
136154name = "bitflags"
137155version = "1.2.1"
138156source = "registry+https://github.com/rust-lang/crates.io-index"
139157checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
140158
159+[[package]]
160+name = "blake2b_simd"
161+version = "0.5.10"
162+source = "registry+https://github.com/rust-lang/crates.io-index"
163+checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a"
164+dependencies = [
165+ "arrayref",
166+ "arrayvec",
167+ "constant_time_eq",
168+]
169+
141170[[package]]
142171name = "blocking"
143172version = "1.0.2"
@@ -212,6 +241,23 @@ dependencies = [
212241 "cache-padded",
213242]
214243
244+[[package]]
245+name = "constant_time_eq"
246+version = "0.1.5"
247+source = "registry+https://github.com/rust-lang/crates.io-index"
248+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
249+
250+[[package]]
251+name = "crossbeam-utils"
252+version = "0.7.2"
253+source = "registry+https://github.com/rust-lang/crates.io-index"
254+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
255+dependencies = [
256+ "autocfg",
257+ "cfg-if",
258+ "lazy_static",
259+]
260+
215261[[package]]
216262name = "crossterm"
217263version = "0.18.0"
@@ -238,6 +284,27 @@ dependencies = [
238284 "winapi",
239285]
240286
287+[[package]]
288+name = "dirs"
289+version = "2.0.2"
290+source = "registry+https://github.com/rust-lang/crates.io-index"
291+checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3"
292+dependencies = [
293+ "cfg-if",
294+ "dirs-sys",
295+]
296+
297+[[package]]
298+name = "dirs-sys"
299+version = "0.3.5"
300+source = "registry+https://github.com/rust-lang/crates.io-index"
301+checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a"
302+dependencies = [
303+ "libc",
304+ "redox_users",
305+ "winapi",
306+]
307+
241308[[package]]
242309name = "event-listener"
243310version = "2.5.1"
@@ -290,6 +357,23 @@ dependencies = [
290357 "waker-fn",
291358]
292359
360+[[package]]
361+name = "getrandom"
362+version = "0.1.15"
363+source = "registry+https://github.com/rust-lang/crates.io-index"
364+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
365+dependencies = [
366+ "cfg-if",
367+ "libc",
368+ "wasi",
369+]
370+
371+[[package]]
372+name = "glob"
373+version = "0.3.0"
374+source = "registry+https://github.com/rust-lang/crates.io-index"
375+checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
376+
293377[[package]]
294378name = "hashbrown"
295379version = "0.9.1"
@@ -312,6 +396,18 @@ dependencies = [
312396 "unicode-width",
313397]
314398
399+[[package]]
400+name = "helix-lsp"
401+version = "0.1.0"
402+dependencies = [
403+ "glob",
404+ "lsp-types",
405+ "pathdiff",
406+ "shellexpand",
407+ "smol",
408+ "url",
409+]
410+
315411[[package]]
316412name = "helix-syntax"
317413version = "0.1.0"
@@ -354,6 +450,17 @@ dependencies = [
354450 "libc",
355451]
356452
453+[[package]]
454+name = "idna"
455+version = "0.2.0"
456+source = "registry+https://github.com/rust-lang/crates.io-index"
457+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
458+dependencies = [
459+ "matches",
460+ "unicode-bidi",
461+ "unicode-normalization",
462+]
463+
357464[[package]]
358465name = "indexmap"
359466version = "1.6.0"
@@ -373,6 +480,12 @@ dependencies = [
373480 "cfg-if",
374481]
375482
483+[[package]]
484+name = "itoa"
485+version = "0.4.6"
486+source = "registry+https://github.com/rust-lang/crates.io-index"
487+checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
488+
376489[[package]]
377490name = "jobserver"
378491version = "0.1.21"
@@ -412,12 +525,32 @@ dependencies = [
412525 "cfg-if",
413526]
414527
528+[[package]]
529+name = "lsp-types"
530+version = "0.82.0"
531+source = "registry+https://github.com/rust-lang/crates.io-index"
532+checksum = "db895abb8527cf59e3de893ab2acf52cf904faeb65e60ea6f373e11fe86464e8"
533+dependencies = [
534+ "base64",
535+ "bitflags",
536+ "serde",
537+ "serde_json",
538+ "serde_repr",
539+ "url",
540+]
541+
415542[[package]]
416543name = "mac"
417544version = "0.1.1"
418545source = "registry+https://github.com/rust-lang/crates.io-index"
419546checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
420547
548+[[package]]
549+name = "matches"
550+version = "0.1.8"
551+source = "registry+https://github.com/rust-lang/crates.io-index"
552+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
553+
421554[[package]]
422555name = "memchr"
423556version = "2.3.3"
@@ -526,6 +659,18 @@ dependencies = [
526659 "winapi",
527660]
528661
662+[[package]]
663+name = "pathdiff"
664+version = "0.2.0"
665+source = "registry+https://github.com/rust-lang/crates.io-index"
666+checksum = "877630b3de15c0b64cc52f659345724fbf6bdad9bd9566699fc53688f3c34a34"
667+
668+[[package]]
669+name = "percent-encoding"
670+version = "2.1.0"
671+source = "registry+https://github.com/rust-lang/crates.io-index"
672+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
673+
529674[[package]]
530675name = "pin-project-lite"
531676version = "0.1.10"
@@ -545,12 +690,41 @@ dependencies = [
545690 "winapi",
546691]
547692
693+[[package]]
694+name = "proc-macro2"
695+version = "1.0.24"
696+source = "registry+https://github.com/rust-lang/crates.io-index"
697+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
698+dependencies = [
699+ "unicode-xid",
700+]
701+
702+[[package]]
703+name = "quote"
704+version = "1.0.7"
705+source = "registry+https://github.com/rust-lang/crates.io-index"
706+checksum = "aa563d17ecb180e500da1cfd2b028310ac758de548efdd203e18f283af693f37"
707+dependencies = [
708+ "proc-macro2",
709+]
710+
548711[[package]]
549712name = "redox_syscall"
550713version = "0.1.57"
551714source = "registry+https://github.com/rust-lang/crates.io-index"
552715checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
553716
717+[[package]]
718+name = "redox_users"
719+version = "0.3.5"
720+source = "registry+https://github.com/rust-lang/crates.io-index"
721+checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d"
722+dependencies = [
723+ "getrandom",
724+ "redox_syscall",
725+ "rust-argon2",
726+]
727+
554728[[package]]
555729name = "regex"
556730version = "1.4.1"
@@ -578,12 +752,81 @@ dependencies = [
578752 "smallvec",
579753]
580754
755+[[package]]
756+name = "rust-argon2"
757+version = "0.8.2"
758+source = "registry+https://github.com/rust-lang/crates.io-index"
759+checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19"
760+dependencies = [
761+ "base64",
762+ "blake2b_simd",
763+ "constant_time_eq",
764+ "crossbeam-utils",
765+]
766+
767+[[package]]
768+name = "ryu"
769+version = "1.0.5"
770+source = "registry+https://github.com/rust-lang/crates.io-index"
771+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
772+
581773[[package]]
582774name = "scopeguard"
583775version = "1.1.0"
584776source = "registry+https://github.com/rust-lang/crates.io-index"
585777checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
586778
779+[[package]]
780+name = "serde"
781+version = "1.0.116"
782+source = "registry+https://github.com/rust-lang/crates.io-index"
783+checksum = "96fe57af81d28386a513cbc6858332abc6117cfdb5999647c6444b8f43a370a5"
784+dependencies = [
785+ "serde_derive",
786+]
787+
788+[[package]]
789+name = "serde_derive"
790+version = "1.0.116"
791+source = "registry+https://github.com/rust-lang/crates.io-index"
792+checksum = "f630a6370fd8e457873b4bd2ffdae75408bc291ba72be773772a4c2a065d9ae8"
793+dependencies = [
794+ "proc-macro2",
795+ "quote",
796+ "syn",
797+]
798+
799+[[package]]
800+name = "serde_json"
801+version = "1.0.59"
802+source = "registry+https://github.com/rust-lang/crates.io-index"
803+checksum = "dcac07dbffa1c65e7f816ab9eba78eb142c6d44410f4eeba1e26e4f5dfa56b95"
804+dependencies = [
805+ "itoa",
806+ "ryu",
807+ "serde",
808+]
809+
810+[[package]]
811+name = "serde_repr"
812+version = "0.1.6"
813+source = "registry+https://github.com/rust-lang/crates.io-index"
814+checksum = "2dc6b7951b17b051f3210b063f12cc17320e2fe30ae05b0fe2a3abb068551c76"
815+dependencies = [
816+ "proc-macro2",
817+ "quote",
818+ "syn",
819+]
820+
821+[[package]]
822+name = "shellexpand"
823+version = "2.0.0"
824+source = "registry+https://github.com/rust-lang/crates.io-index"
825+checksum = "9a2b22262a9aaf9464d356f656fea420634f78c881c5eebd5ef5e66d8b9bc603"
826+dependencies = [
827+ "dirs",
828+]
829+
587830[[package]]
588831name = "signal-hook"
589832version = "0.1.16"
@@ -641,6 +884,17 @@ dependencies = [
641884 "winapi",
642885]
643886
887+[[package]]
888+name = "syn"
889+version = "1.0.44"
890+source = "registry+https://github.com/rust-lang/crates.io-index"
891+checksum = "e03e57e4fcbfe7749842d53e24ccb9aa12b7252dbe5e91d2acad31834c8b8fdd"
892+dependencies = [
893+ "proc-macro2",
894+ "quote",
895+ "unicode-xid",
896+]
897+
644898[[package]]
645899name = "tendril"
646900version = "0.4.1"
@@ -669,6 +923,12 @@ dependencies = [
669923 "lazy_static",
670924]
671925
926+[[package]]
927+name = "tinyvec"
928+version = "0.3.4"
929+source = "registry+https://github.com/rust-lang/crates.io-index"
930+checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117"
931+
672932[[package]]
673933name = "tree-sitter"
674934version = "0.17.0"
@@ -691,6 +951,24 @@ dependencies = [
691951 "unicode-width",
692952]
693953
954+[[package]]
955+name = "unicode-bidi"
956+version = "0.3.4"
957+source = "registry+https://github.com/rust-lang/crates.io-index"
958+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
959+dependencies = [
960+ "matches",
961+]
962+
963+[[package]]
964+name = "unicode-normalization"
965+version = "0.1.13"
966+source = "registry+https://github.com/rust-lang/crates.io-index"
967+checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977"
968+dependencies = [
969+ "tinyvec",
970+]
971+
694972[[package]]
695973name = "unicode-segmentation"
696974version = "1.6.0"
@@ -703,6 +981,24 @@ version = "0.1.8"
703981source = "registry+https://github.com/rust-lang/crates.io-index"
704982checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3"
705983
984+[[package]]
985+name = "unicode-xid"
986+version = "0.2.1"
987+source = "registry+https://github.com/rust-lang/crates.io-index"
988+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
989+
990+[[package]]
991+name = "url"
992+version = "2.1.1"
993+source = "registry+https://github.com/rust-lang/crates.io-index"
994+checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb"
995+dependencies = [
996+ "idna",
997+ "matches",
998+ "percent-encoding",
999+ "serde",
1000+]
1001+
7061002[[package]]
7071003name = "utf-8"
7081004version = "0.7.5"
@@ -727,6 +1023,12 @@ version = "1.1.0"
7271023source = "registry+https://github.com/rust-lang/crates.io-index"
7281024checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
7291025
1026+[[package]]
1027+name = "wasi"
1028+version = "0.9.0+wasi-snapshot-preview1"
1029+source = "registry+https://github.com/rust-lang/crates.io-index"
1030+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
1031+
7301032[[package]]
7311033name = "wepoll-sys"
7321034version = "3.0.0"
Cargo.toml+1
@@ -4,6 +4,7 @@ members = [
44 "helix-view",
55 "helix-term",
66 "helix-syntax",
7+ "helix-lsp",
78]
89
910# Build helix-syntax in release mode to make the code path faster in development.
helix-lsp/Cargo.tomlnew file+15
@@ -0,0 +1,15 @@
1+[package]
2+name = "helix-lsp"
3+version = "0.1.0"
4+authors = ["Blaž Hrastnik <blaz@mxxn.io>"]
5+edition = "2018"
6+
7+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+[dependencies]
10+lsp-types = { version = "0.82", features = ["proposed"] }
11+smol = "1.2"
12+url = "2.1.1"
13+pathdiff = "0.2.0"
14+shellexpand = "2.0.0"
15+glob = "0.3.0"
helix-lsp/src/lib.rsnew file+71
@@ -0,0 +1,71 @@
1+use std::{
2+ collections::HashMap,
3+ process::{ChildStderr, ChildStdin, ChildStdout, Command, Stdio},
4+};
5+
6+use smol::io::{BufReader, BufWriter};
7+use smol::prelude::*;
8+use smol::Unblock;
9+
10+struct Client {
11+ // process: Command,
12+ reader: BufReader<Unblock<ChildStdout>>,
13+}
14+
15+impl Client {
16+ fn start(cmd: &str, args: &[String]) -> Self {
17+ let mut process = Command::new(cmd)
18+ .args(args)
19+ .stdin(Stdio::piped())
20+ .stdout(Stdio::piped())
21+ .stderr(Stdio::piped())
22+ .spawn()
23+ .expect("Failed to start language server");
24+ // TODO: impl drop that kills the process
25+
26+ // TODO: do we need bufreader/writer here? or do we use async wrappers on unblock?
27+ let writer = BufWriter::new(Unblock::new(
28+ process.stdin.take().expect("Failed to open stdin"),
29+ ));
30+ let reader = BufReader::new(Unblock::new(
31+ process.stdout.take().expect("Failed to open stdout"),
32+ ));
33+ let stderr = BufReader::new(Unblock::new(
34+ process.stderr.take().expect("Failed to open stderr"),
35+ ));
36+
37+ Client { reader }
38+ }
39+
40+ async fn receiver(&mut self) -> Result<(), std::io::Error> {
41+ let mut headers: HashMap<String, String> = HashMap::default();
42+ loop {
43+ // read headers
44+ loop {
45+ let mut header = String::new();
46+ // detect pipe closed if 0
47+ self.reader.read_line(&mut header).await?;
48+ let header = header.trim();
49+
50+ if header.is_empty() {
51+ break;
52+ }
53+
54+ let parts: Vec<&str> = header.split(": ").collect();
55+ if parts.len() != 2 {
56+ // return Err(Error::new(ErrorKind::Other, "Failed to parse header"));
57+ panic!()
58+ }
59+ headers.insert(parts[0].to_string(), parts[1].to_string());
60+ }
61+
62+ // find content-length
63+
64+ // read data
65+ // decode via serde_json decoding into jsonrpc_core Output
66+ break;
67+ }
68+
69+ Ok(())
70+ }
71+}