From b39849dde1b1277d14dbc4e2e1604e5d020db43d Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Thu, 22 Oct 2020 14:35:07 +0900 Subject: Refactor: Document type as a wrapper around barebones State. --- helix-view/src/document.rs | 157 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 helix-view/src/document.rs (limited to 'helix-view/src/document.rs') diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs new file mode 100644 index 00000000..c4b9d081 --- /dev/null +++ b/helix-view/src/document.rs @@ -0,0 +1,157 @@ +use anyhow::Error; +use std::path::PathBuf; + +use helix_core::{ + syntax::LOADER, ChangeSet, Diagnostic, History, Position, Range, Rope, RopeSlice, Selection, + State, Syntax, Transaction, +}; + +#[derive(Copy, Clone, PartialEq, Eq, Hash)] +pub enum Mode { + Normal, + Insert, + Goto, +} + +pub struct Document { + pub state: State, // rope + selection + /// File path on disk. + pub path: Option, + + /// Current editing mode. + pub mode: Mode, + pub restore_cursor: bool, + + /// Tree-sitter AST tree + pub syntax: Option, + + /// Pending changes since last history commit. + pub changes: ChangeSet, + pub history: History, + pub version: i64, // should be usize? + pub old_state: Option<(Rope, Selection)>, + + pub diagnostics: Vec, +} + +/// Like std::mem::replace() except it allows the replacement value to be mapped from the +/// original value. +fn take_with(mut_ref: &mut T, closure: F) +where + F: FnOnce(T) -> T, +{ + use std::{panic, ptr}; + + unsafe { + let old_t = ptr::read(mut_ref); + let new_t = panic::catch_unwind(panic::AssertUnwindSafe(|| closure(old_t))) + .unwrap_or_else(|_| ::std::process::abort()); + ptr::write(mut_ref, new_t); + } +} + +use url::Url; + +impl Document { + fn new(state: State) -> Self { + let changes = ChangeSet::new(&state.doc); + let old_state = Some((state.doc.clone(), Selection::single(0, 0))); + + Self { + path: None, + state, + mode: Mode::Normal, + restore_cursor: false, + syntax: None, + changes, + old_state, + diagnostics: Vec::new(), + version: 0, + history: History::default(), + } + } + + // TODO: passing scopes here is awkward + pub fn load(path: PathBuf, scopes: &[String]) -> Result { + use std::{env, fs::File, io::BufReader}; + let _current_dir = env::current_dir()?; + + let doc = Rope::from_reader(BufReader::new(File::open(path.clone())?))?; + + // TODO: create if not found + + let mut doc = Self::new(State::new(doc)); + + if let Some(language_config) = LOADER.language_config_for_file_name(path.as_path()) { + let highlight_config = language_config.highlight_config(scopes).unwrap().unwrap(); + // TODO: config.configure(scopes) is now delayed, is that ok? + + let syntax = Syntax::new(&doc.state.doc, highlight_config.clone()); + + doc.syntax = Some(syntax); + }; + + // canonicalize path to absolute value + doc.path = Some(std::fs::canonicalize(path)?); + + Ok(doc) + } + + pub fn set_language(&mut self, scope: &str, scopes: &[String]) { + if let Some(language_config) = LOADER.language_config_for_scope(scope) { + let highlight_config = language_config.highlight_config(scopes).unwrap().unwrap(); + // TODO: config.configure(scopes) is now delayed, is that ok? + + let syntax = Syntax::new(&self.state.doc, highlight_config.clone()); + + self.syntax = Some(syntax); + }; + } + + // TODO: needs to run on undo/redo + pub fn apply(&mut self, transaction: &Transaction) -> bool { + let old_doc = self.text().clone(); + + let success = transaction.apply(&mut self.state); + + if !transaction.changes().is_empty() { + // Compose this transaction with the previous one + take_with(&mut self.changes, |changes| { + changes.compose(transaction.changes().clone()).unwrap() + }); + + // update tree-sitter syntax tree + if let Some(syntax) = &mut self.syntax { + // TODO: no unwrap + syntax + .update(&old_doc, &self.state.doc, transaction.changes()) + .unwrap(); + } + + // TODO: map state.diagnostics over changes::map_pos too + } + success + } + + #[inline] + pub fn mode(&self) -> Mode { + self.mode + } + + #[inline] + pub fn path(&self) -> Option<&PathBuf> { + self.path.as_ref() + } + + pub fn url(&self) -> Option { + self.path().map(|path| Url::from_file_path(path).unwrap()) + } + + pub fn text(&self) -> &Rope { + &self.state.doc + } + + // pub fn slice(&self, range: R) -> RopeSlice where R: RangeBounds { + // self.state.doc.slice + // } +} -- cgit v1.2.3-70-g09d2 From c0e17dd324f016401d56d66b7c113dada0644155 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 23 Oct 2020 11:32:25 +0900 Subject: Fix undo/redo not updating the syntax tree. --- helix-core/src/history.rs | 46 +++++++++++++++++++++++++--------------------- helix-view/src/commands.rs | 8 ++++++-- helix-view/src/document.rs | 1 - 3 files changed, 31 insertions(+), 24 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/helix-core/src/history.rs b/helix-core/src/history.rs index e6d9a738..66445525 100644 --- a/helix-core/src/history.rs +++ b/helix-core/src/history.rs @@ -57,37 +57,31 @@ impl History { self.cursor == 0 } - pub fn undo(&mut self, state: &mut State) { + // TODO: I'd like to pass Transaction by reference but it fights with the borrowck + + pub fn undo(&mut self) -> Option { if self.at_root() { // We're at the root of undo, nothing to do. - return; + return None; } let current_revision = &self.revisions[self.cursor]; - // TODO: pass the return value through? It should always succeed - let success = current_revision.revert.apply(state); - - if !success { - panic!("Failed to apply undo!"); - } - self.cursor = current_revision.parent; + + Some(current_revision.revert.clone()) } - pub fn redo(&mut self, state: &mut State) { + pub fn redo(&mut self) -> Option { let current_revision = &self.revisions[self.cursor]; // for now, simply pick the latest child (linear undo / redo) if let Some((index, transaction)) = current_revision.children.last() { - let success = transaction.apply(state); - - if !success { - panic!("Failed to apply redo!"); - } - self.cursor = *index; + + return Some(transaction.clone()); } + None } } @@ -120,17 +114,27 @@ mod test { assert_eq!("hello 世界!", state.doc()); // --- + fn undo(history: &mut History, state: &mut State) { + if let Some(transaction) = history.undo() { + transaction.apply(state); + } + } + fn redo(history: &mut History, state: &mut State) { + if let Some(transaction) = history.redo() { + transaction.apply(state); + } + } - history.undo(&mut state); + undo(&mut history, &mut state); assert_eq!("hello world!", state.doc()); - history.redo(&mut state); + redo(&mut history, &mut state); assert_eq!("hello 世界!", state.doc()); - history.undo(&mut state); - history.undo(&mut state); + undo(&mut history, &mut state); + undo(&mut history, &mut state); assert_eq!("hello", state.doc()); // undo at root is a no-op - history.undo(&mut state); + undo(&mut history, &mut state); assert_eq!("hello", state.doc()); } } diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index b5350ff4..6bf89040 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -509,13 +509,17 @@ pub fn insert_char_prompt(prompt: &mut Prompt, c: char) { // Undo / Redo pub fn undo(view: &mut View, _count: usize) { - view.doc.history.undo(&mut view.doc.state); + if let Some(revert) = view.doc.history.undo() { + view.doc.apply(&revert); + } // TODO: each command could simply return a Option, then the higher level handles storing it? } pub fn redo(view: &mut View, _count: usize) { - view.doc.history.redo(&mut view.doc.state); + if let Some(transaction) = view.doc.history.redo() { + view.doc.apply(&transaction); + } } // Yank / Paste diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index c4b9d081..04018ed6 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -108,7 +108,6 @@ impl Document { }; } - // TODO: needs to run on undo/redo pub fn apply(&mut self, transaction: &Transaction) -> bool { let old_doc = self.text().clone(); -- cgit v1.2.3-70-g09d2 From efc5aa2016e56e0721d125a20e3573d25af4dd76 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 23 Oct 2020 11:36:46 +0900 Subject: Simplify old_state handling. --- helix-core/src/state.rs | 1 + helix-view/src/commands.rs | 8 +------- helix-view/src/document.rs | 4 ++-- 3 files changed, 4 insertions(+), 9 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/helix-core/src/state.rs b/helix-core/src/state.rs index 7fd620a5..4d531aa0 100644 --- a/helix-core/src/state.rs +++ b/helix-core/src/state.rs @@ -4,6 +4,7 @@ use crate::{ChangeSet, Diagnostic, Position, Range, Rope, RopeSlice, Selection, use anyhow::Error; /// A state represents the current editor state of a single buffer. +#[derive(Clone)] pub struct State { // TODO: fields should be private but we need to refactor commands.rs first pub doc: Rope, diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index 6bf89040..06c4b9e0 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -411,15 +411,9 @@ fn append_changes_to_history(view: &mut View) { // TODO: trigger lsp/documentDidChange with changes // HAXX: we need to reconstruct the state as it was before the changes.. - let (doc, selection) = view.doc.old_state.take().unwrap(); - let mut old_state = State::new(doc); - old_state.selection = selection; - + let old_state = std::mem::replace(&mut view.doc.old_state, view.doc.state.clone()); // TODO: take transaction by value? view.doc.history.commit_revision(&transaction, &old_state); - - // HAXX - view.doc.old_state = Some((view.doc.text().clone(), view.doc.state.selection.clone())); } pub fn normal_mode(view: &mut View, _count: usize) { diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 04018ed6..22438926 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -27,9 +27,9 @@ pub struct Document { /// Pending changes since last history commit. pub changes: ChangeSet, + pub old_state: State, pub history: History, pub version: i64, // should be usize? - pub old_state: Option<(Rope, Selection)>, pub diagnostics: Vec, } @@ -55,7 +55,7 @@ use url::Url; impl Document { fn new(state: State) -> Self { let changes = ChangeSet::new(&state.doc); - let old_state = Some((state.doc.clone(), Selection::single(0, 0))); + let old_state = state.clone(); Self { path: None, -- cgit v1.2.3-70-g09d2 From 55fa86248c77a01900379ec5bca668978fd5c0d3 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 23 Oct 2020 12:06:33 +0900 Subject: Introduce doc.selection()/set_selection() --- helix-view/src/commands.rs | 142 +++++++++++++++++++++------------------------ helix-view/src/document.rs | 11 ++++ 2 files changed, 78 insertions(+), 75 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index 768a717e..d31aed31 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -19,40 +19,38 @@ use crate::{ pub type Command = fn(view: &mut View, count: usize); pub fn move_char_left(view: &mut View, count: usize) { - // TODO: use a transaction let selection = view.doc .state .move_selection(Direction::Backward, Granularity::Character, count); - view.doc.state.selection = selection; + view.doc.set_selection(selection); } pub fn move_char_right(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = + let selection = view.doc .state .move_selection(Direction::Forward, Granularity::Character, count); + view.doc.set_selection(selection); } pub fn move_line_up(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = - view.doc - .state - .move_selection(Direction::Backward, Granularity::Line, count); + let selection = view + .doc + .state + .move_selection(Direction::Backward, Granularity::Line, count); + view.doc.set_selection(selection); } pub fn move_line_down(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = - view.doc - .state - .move_selection(Direction::Forward, Granularity::Line, count); + let selection = view + .doc + .state + .move_selection(Direction::Forward, Granularity::Line, count); + view.doc.set_selection(selection); } pub fn move_line_end(view: &mut View, _count: usize) { - // TODO: use a transaction let lines = selection_lines(&view.doc.state); let positions = lines @@ -68,9 +66,7 @@ pub fn move_line_end(view: &mut View, _count: usize) { let selection = Selection::new(positions.collect(), 0); - let transaction = Transaction::new(&mut view.doc.state).with_selection(selection); - - view.doc.apply(&transaction); + view.doc.set_selection(selection); } pub fn move_line_start(view: &mut View, _count: usize) { @@ -86,64 +82,58 @@ pub fn move_line_start(view: &mut View, _count: usize) { let selection = Selection::new(positions.collect(), 0); - let transaction = Transaction::new(&mut view.doc.state).with_selection(selection); - - view.doc.apply(&transaction); + view.doc.set_selection(selection); } pub fn move_next_word_start(view: &mut View, count: usize) { let pos = view.doc.state.move_pos( - view.doc.state.selection.cursor(), + view.doc.selection().cursor(), Direction::Forward, Granularity::Word, count, ); - // TODO: use a transaction - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } pub fn move_prev_word_start(view: &mut View, count: usize) { let pos = view.doc.state.move_pos( - view.doc.state.selection.cursor(), + view.doc.selection().cursor(), Direction::Backward, Granularity::Word, count, ); - // TODO: use a transaction - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } pub fn move_next_word_end(view: &mut View, count: usize) { let pos = State::move_next_word_end( &view.doc.text().slice(..), - view.doc.state.selection.cursor(), + view.doc.selection().cursor(), count, ); - // TODO: use a transaction - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } pub fn move_file_start(view: &mut View, _count: usize) { - // TODO: use a transaction - view.doc.state.selection = Selection::single(0, 0); + view.doc.set_selection(Selection::single(0, 0)); view.doc.mode = Mode::Normal; } pub fn move_file_end(view: &mut View, _count: usize) { - // TODO: use a transaction let text = &view.doc.text(); let last_line = text.line_to_char(text.len_lines().saturating_sub(2)); - view.doc.state.selection = Selection::single(last_line, last_line); + view.doc + .set_selection(Selection::single(last_line, last_line)); view.doc.mode = Mode::Normal; } pub fn check_cursor_in_view(view: &mut View) -> bool { - let cursor = view.doc.state.selection().cursor(); + let cursor = view.doc.selection().cursor(); let line = view.doc.text().char_to_line(cursor); let document_end = view.first_line + view.size.1.saturating_sub(1) as usize; @@ -163,7 +153,7 @@ pub fn page_up(view: &mut View, _count: usize) { if !check_cursor_in_view(view) { let text = view.doc.text(); let pos = text.line_to_char(view.last_line().saturating_sub(PADDING)); - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } } @@ -173,7 +163,7 @@ pub fn page_down(view: &mut View, _count: usize) { if view.first_line < view.doc.text().len_lines() { let text = view.doc.text(); let pos = text.line_to_char(view.first_line as usize); - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } } @@ -187,7 +177,7 @@ pub fn half_page_up(view: &mut View, _count: usize) { if !check_cursor_in_view(view) { let text = &view.doc.text(); let pos = text.line_to_char(view.last_line() - PADDING); - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } } @@ -199,42 +189,41 @@ pub fn half_page_down(view: &mut View, _count: usize) { if !check_cursor_in_view(view) { let text = view.doc.text(); let pos = text.line_to_char(view.first_line as usize); - view.doc.state.selection = Selection::single(pos, pos); + view.doc.set_selection(Selection::single(pos, pos)); } } // avoid select by default by having a visual mode switch that makes movements into selects pub fn extend_char_left(view: &mut View, count: usize) { - // TODO: use a transaction let selection = view.doc .state .extend_selection(Direction::Backward, Granularity::Character, count); - view.doc.state.selection = selection; + view.doc.set_selection(selection); } pub fn extend_char_right(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = + let selection = view.doc .state .extend_selection(Direction::Forward, Granularity::Character, count); + view.doc.set_selection(selection); } pub fn extend_line_up(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = - view.doc - .state - .extend_selection(Direction::Backward, Granularity::Line, count); + let selection = view + .doc + .state + .extend_selection(Direction::Backward, Granularity::Line, count); + view.doc.set_selection(selection); } pub fn extend_line_down(view: &mut View, count: usize) { - // TODO: use a transaction - view.doc.state.selection = - view.doc - .state - .extend_selection(Direction::Forward, Granularity::Line, count); + let selection = view + .doc + .state + .extend_selection(Direction::Forward, Granularity::Line, count); + view.doc.set_selection(selection); } pub fn split_selection_on_newline(view: &mut View, _count: usize) { @@ -242,20 +231,19 @@ pub fn split_selection_on_newline(view: &mut View, _count: usize) { // only compile the regex once #[allow(clippy::trivial_regex)] static REGEX: Lazy = Lazy::new(|| Regex::new(r"\n").unwrap()); - // TODO: use a transaction - view.doc.state.selection = selection::split_on_matches(text, view.doc.state.selection(), ®EX) + let selection = selection::split_on_matches(text, view.doc.selection(), ®EX); + view.doc.set_selection(selection); } pub fn select_line(view: &mut View, _count: usize) { // TODO: count - let pos = view.doc.state.selection().primary(); + let pos = view.doc.selection().primary(); let text = view.doc.text(); let line = text.char_to_line(pos.head); let start = text.line_to_char(line); let end = text.line_to_char(line + 1).saturating_sub(1); - // TODO: use a transaction - view.doc.state.selection = Selection::single(start, end); + view.doc.set_selection(Selection::single(start, end)); } pub fn delete_selection(view: &mut View, _count: usize) { @@ -273,19 +261,21 @@ pub fn change_selection(view: &mut View, count: usize) { } pub fn collapse_selection(view: &mut View, _count: usize) { - view.doc.state.selection = view + let selection = view .doc - .state - .selection - .transform(|range| Range::new(range.head, range.head)) + .selection() + .transform(|range| Range::new(range.head, range.head)); + + view.doc.set_selection(selection); } pub fn flip_selections(view: &mut View, _count: usize) { - view.doc.state.selection = view + let selection = view .doc - .state - .selection - .transform(|range| Range::new(range.head, range.anchor)) + .selection() + .transform(|range| Range::new(range.head, range.anchor)); + + view.doc.set_selection(selection); } fn enter_insert_mode(view: &mut View) { @@ -297,11 +287,11 @@ fn enter_insert_mode(view: &mut View) { pub fn insert_mode(view: &mut View, _count: usize) { enter_insert_mode(view); - view.doc.state.selection = view + let selection = view .doc - .state - .selection - .transform(|range| Range::new(range.to(), range.from())) + .selection() + .transform(|range| Range::new(range.to(), range.from())); + view.doc.set_selection(selection); } // inserts at the end of each selection @@ -311,13 +301,14 @@ pub fn append_mode(view: &mut View, _count: usize) { // TODO: as transaction let text = &view.doc.text().slice(..); - view.doc.state.selection = view.doc.state.selection.transform(|range| { + let selection = view.doc.selection().transform(|range| { // TODO: to() + next char Range::new( range.from(), graphemes::next_grapheme_boundary(text, range.to()), ) - }) + }); + view.doc.set_selection(selection); } // TODO: I, A, o and O can share a lot of the primitives. @@ -402,7 +393,7 @@ fn append_changes_to_history(view: &mut View) { let changes = std::mem::replace(&mut view.doc.changes, new_changeset); // Instead of doing this messy merge we could always commit, and based on transaction // annotations either add a new layer or compose into the previous one. - let transaction = Transaction::from(changes).with_selection(view.doc.state.selection().clone()); + let transaction = Transaction::from(changes).with_selection(view.doc.selection().clone()); // increment document version // TODO: needs to happen on undo/redo too @@ -424,12 +415,13 @@ pub fn normal_mode(view: &mut View, _count: usize) { // if leaving append mode, move cursor back by 1 if view.doc.restore_cursor { let text = &view.doc.text().slice(..); - view.doc.state.selection = view.doc.state.selection.transform(|range| { + let selection = view.doc.selection().transform(|range| { Range::new( range.from(), graphemes::prev_grapheme_boundary(text, range.to()), ) }); + view.doc.set_selection(selection); view.doc.restore_cursor = false; } @@ -587,7 +579,7 @@ fn get_lines(view: &View) -> Vec { let mut lines = Vec::new(); // Get all line numbers - for range in view.doc.state.selection.ranges() { + for range in view.doc.selection().ranges() { let start = view.doc.text().char_to_line(range.from()); let end = view.doc.text().char_to_line(range.to()); diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 22438926..a313b281 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -108,6 +108,11 @@ impl Document { }; } + pub fn set_selection(&mut self, selection: Selection) { + // TODO: use a transaction? + self.state.selection = selection; + } + pub fn apply(&mut self, transaction: &Transaction) -> bool { let old_doc = self.text().clone(); @@ -119,6 +124,8 @@ impl Document { changes.compose(transaction.changes().clone()).unwrap() }); + // TODO: when composing, replace transaction.selection too + // update tree-sitter syntax tree if let Some(syntax) = &mut self.syntax { // TODO: no unwrap @@ -150,6 +157,10 @@ impl Document { &self.state.doc } + pub fn selection(&self) -> &Selection { + &self.state.selection + } + // pub fn slice(&self, range: R) -> RopeSlice where R: RangeBounds { // self.state.doc.slice // } -- cgit v1.2.3-70-g09d2 From eff6fac9ece0700f0ed8eb0a230b6816fa7cece7 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 23 Oct 2020 13:51:08 +0900 Subject: clippy lint --- helix-lsp/src/transport.rs | 3 +-- helix-view/src/document.rs | 2 ++ helix-view/src/editor.rs | 6 ++++++ helix-view/src/keymap.rs | 2 +- helix-view/src/view.rs | 40 ++++++++++++++++++++-------------------- 5 files changed, 30 insertions(+), 23 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/helix-lsp/src/transport.rs b/helix-lsp/src/transport.rs index 38c3bb57..b30a8a6e 100644 --- a/helix-lsp/src/transport.rs +++ b/helix-lsp/src/transport.rs @@ -138,11 +138,10 @@ impl Transport { // println!("<- {} {:?}", method, notification); self.incoming.send(notification).await?; } - Message::Call(call) => { + Message::Call(_call) => { // println!("<- {:?}", call); // dispatch } - _ => unreachable!(), }; Ok(()) } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index a313b281..710ea4f8 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -164,4 +164,6 @@ impl Document { // pub fn slice(&self, range: R) -> RopeSlice where R: RangeBounds { // self.state.doc.slice // } + + // TODO: transact(Fn) ? } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index 02199255..9fb2ae36 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -12,6 +12,12 @@ pub struct Editor { pub theme: Theme, // TODO: share one instance } +impl Default for Editor { + fn default() -> Self { + Self::new() + } +} + impl Editor { pub fn new() -> Self { let theme = Theme::default(); diff --git a/helix-view/src/keymap.rs b/helix-view/src/keymap.rs index 347e7d77..aaba34a6 100644 --- a/helix-view/src/keymap.rs +++ b/helix-view/src/keymap.rs @@ -1,6 +1,6 @@ use crate::commands::{self, Command}; use crate::document::Mode; -use helix_core::{hashmap, state}; +use helix_core::hashmap; use std::collections::HashMap; // Kakoune-inspired: diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs index 4cf6a2ee..df41e3ae 100644 --- a/helix-view/src/view.rs +++ b/helix-view/src/view.rs @@ -86,24 +86,24 @@ impl View { Some(Position::new(row, col)) } - pub fn traverse(&self, text: &RopeSlice, start: usize, end: usize, fun: F) - where - F: Fn(usize, usize), - { - let start = self.screen_coords_at_pos(text, start); - let end = self.screen_coords_at_pos(text, end); - - match (start, end) { - // fully on screen - (Some(start), Some(end)) => { - // we want to calculate ends of lines for each char.. - } - // from start to end of screen - (Some(start), None) => {} - // from start of screen to end - (None, Some(end)) => {} - // not on screen - (None, None) => return, - } - } + // pub fn traverse(&self, text: &RopeSlice, start: usize, end: usize, fun: F) + // where + // F: Fn(usize, usize), + // { + // let start = self.screen_coords_at_pos(text, start); + // let end = self.screen_coords_at_pos(text, end); + + // match (start, end) { + // // fully on screen + // (Some(start), Some(end)) => { + // // we want to calculate ends of lines for each char.. + // } + // // from start to end of screen + // (Some(start), None) => {} + // // from start of screen to end + // (None, Some(end)) => {} + // // not on screen + // (None, None) => return, + // } + // } } -- cgit v1.2.3-70-g09d2 From 3f707c19f46284d745568c632a57103eb1be4dd4 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Fri, 30 Oct 2020 17:00:30 +0900 Subject: Save command --- Cargo.lock | 1 + helix-term/src/main.rs | 12 +++--------- helix-view/Cargo.toml | 2 ++ helix-view/src/commands.rs | 12 ++++++++++-- helix-view/src/document.rs | 25 +++++++++++++++++++++++++ 5 files changed, 41 insertions(+), 11 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/Cargo.lock b/Cargo.lock index 28fc503c..e89696ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -523,6 +523,7 @@ dependencies = [ "crossterm", "helix-core", "once_cell", + "smol", "tui", "url", ] diff --git a/helix-term/src/main.rs b/helix-term/src/main.rs index f91c1c8f..9378d3ee 100644 --- a/helix-term/src/main.rs +++ b/helix-term/src/main.rs @@ -70,16 +70,10 @@ fn main() -> Result<(), Error> { std::thread::spawn(move || smol::block_on(EX.run(smol::future::pending::<()>()))); } - // let mut lsp = helix_lsp::Client::start(&EX, "rust-analyzer", &[]); + let mut app = Application::new(args, &EX).unwrap(); - smol::block_on(async { - // let res = lsp.initialize().await; - // let state = helix_core::State::load("test.rs".into(), &[]).unwrap(); - // let res = lsp.text_document_did_open(&state).await; - // loop {} - - Application::new(args, &EX).unwrap().run().await; - }); + // we use the thread local executor to spawn the application task separately from the work pool + smol::block_on(app.run()); Ok(()) } diff --git a/helix-view/Cargo.toml b/helix-view/Cargo.toml index 9d53f929..0a48b721 100644 --- a/helix-view/Cargo.toml +++ b/helix-view/Cargo.toml @@ -20,3 +20,5 @@ tui = { git = "https://github.com/fdehau/tui-rs", default-features = false, feat crossterm = { version = "0.18", features = ["event-stream"], optional = true} once_cell = "1.4" url = "2" + +smol = "1" diff --git a/helix-view/src/commands.rs b/helix-view/src/commands.rs index 26c7a190..c135a3da 100644 --- a/helix-view/src/commands.rs +++ b/helix-view/src/commands.rs @@ -331,8 +331,7 @@ pub fn append_mode(cx: &mut Context) { } // TODO: I, A, o and O can share a lot of the primitives. - -pub fn command_mode(_view: &mut View, _count: usize) { +pub fn command_mode(_cx: &mut Context) { unimplemented!() } @@ -670,3 +669,12 @@ pub fn indent_selection(_cx: &mut Context) { // loop over each line and recompute proper indentation unimplemented!() } + +// + +pub fn save(cx: &mut Context) { + // Spawns an async task to actually do the saving. This way we prevent blocking. + + // TODO: handle save errors somehow? + cx.executor.spawn(cx.view.doc.save()).detach(); +} diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 710ea4f8..1587de8b 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -1,4 +1,5 @@ use anyhow::Error; +use std::future::Future; use std::path::PathBuf; use helix_core::{ @@ -97,6 +98,30 @@ impl Document { Ok(doc) } + pub fn save(&self) -> impl Future> { + // we clone and move text + path into the future so that we asynchronously save the current + // state without blocking any further edits. + + let text = self.text().clone(); + let path = self.path.clone().expect("Can't save with no path set!"); // TODO: handle no path + + // TODO: mark changes up to now as saved + // TODO: mark dirty false + + async move { + use smol::{fs::File, prelude::*}; + let mut file = File::create(path).await?; + + // write all the rope chunks to file + for chunk in text.chunks() { + file.write_all(chunk.as_bytes()).await?; + } + // TODO: flush? + + Ok(()) + } // and_then(// lsp.send_text_saved_notification()) + } + pub fn set_language(&mut self, scope: &str, scopes: &[String]) { if let Some(language_config) = LOADER.language_config_for_scope(scope) { let highlight_config = language_config.highlight_config(scopes).unwrap().unwrap(); -- cgit v1.2.3-70-g09d2 From a7869c728c663f255d5d2544e42f21ccf57b2414 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Thu, 5 Nov 2020 15:15:19 +0900 Subject: wip --- Cargo.lock | 68 ++++++++++++++++++++----------------------- helix-core/src/syntax.rs | 4 +++ helix-lsp/Cargo.toml | 1 + helix-lsp/src/lib.rs | 53 +++++++++++++++++++++++++++++++++ helix-term/src/application.rs | 14 +++++++-- helix-view/src/document.rs | 15 ++++++++++ 6 files changed, 115 insertions(+), 40 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/Cargo.lock b/Cargo.lock index e89696ad..c9e421a2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,24 +2,18 @@ # It is not intended for manual editing. [[package]] name = "aho-corasick" -version = "0.7.14" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b476ce7103678b0c6d3d395dbbae31d48ff910bd28be979ba5d48c6351131d0d" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" dependencies = [ "memchr", ] [[package]] name = "anyhow" -version = "1.0.33" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1fd36ffbb1fb7c834eac128ea8d0e310c5aeb635548f9d58861e1308d46e71c" - -[[package]] -name = "arc-swap" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034" +checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" [[package]] name = "arrayref" @@ -158,9 +152,9 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" [[package]] name = "blake2b_simd" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8fb2d74254a3a0b5cac33ac9f8ed0e44aa50378d9dbb2e5d83bd21ed1dc2c8a" +checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" dependencies = [ "arrayref", "arrayvec", @@ -279,9 +273,9 @@ dependencies = [ [[package]] name = "crossterm" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef9149b29071d44c9fb98fd9c27fcf74405bbdb761889ad6a03f36be93b0b15" +checksum = "4e86d73f2a0b407b5768d10a8c720cf5d2df49a9efc10ca09176d201ead4b7fb" dependencies = [ "bitflags", "crossterm_winapi", @@ -479,6 +473,7 @@ dependencies = [ "jsonrpc-core", "log", "lsp-types", + "once_cell", "pathdiff", "serde", "serde_json", @@ -653,15 +648,15 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "memchr" -version = "2.3.3" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" [[package]] name = "mio" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8f1c83949125de4a582aa2da15ae6324d91cf6a58a70ea407643941ff98f558" +checksum = "8962c171f57fcfffa53f4df1bb15ec4c8cf26a7569459c9ceb62d94aab0d9584" dependencies = [ "libc", "log", @@ -707,9 +702,9 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" dependencies = [ "autocfg", "num-traits", @@ -717,9 +712,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.12" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" dependencies = [ "autocfg", ] @@ -837,9 +832,9 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.18" +version = "0.5.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99c605b9a0adc77b7211c6b1f722dcb613d68d66859a44f3d485a6da332b0598" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" [[package]] name = "proc-macro-nested" @@ -884,9 +879,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8963b85b8ce3074fecffde43b4b0dded83ce2f367dc8d363afc56679f3ee820b" +checksum = "38cf2c13ed4745de91a5eb834e11c00bcc3709e773173b2ce4c56c9fbde04b9c" dependencies = [ "aho-corasick", "memchr", @@ -896,9 +891,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cab7a364d15cde1e505267766a2d3c4e22a843e1a601f0fa7564c0f82ced11c" +checksum = "3b181ba2dcf07aaccad5448e8ead58db5b742cf85dfe035e2227f137a539a189" [[package]] name = "ropey" @@ -997,11 +992,10 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e12110bc539e657a646068aaf5eb5b63af9d0c1f7b29c97113fad80e15f035" +checksum = "ce32ea0c6c56d5eacaeb814fbed9960547021d3edd010ded1425f180536b20ab" dependencies = [ - "arc-swap", "libc", ] @@ -1079,18 +1073,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "318234ffa22e0920fe9a40d7b8369b5f649d490980cf7aadcf1eb91594869b42" +checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cae2447b6282786c3493999f40a9be2a6ad20cb8bd268b0a0dbf5a065535c0ab" +checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56" dependencies = [ "proc-macro2", "quote", @@ -1125,9 +1119,9 @@ checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" [[package]] name = "tree-sitter" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ee7370fec3aecde3862a7d64c571048f70a7298daef1815e8fc68b9de54b5c" +checksum = "d18dcb776d3affaba6db04d11d645946d34a69b3172e588af96ce9fecd20faac" dependencies = [ "cc", "regex", diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index f4826fb4..70d42c47 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -62,6 +62,10 @@ impl LanguageConfiguration { }) .map(Option::as_ref) } + + pub fn scope(&self) -> &str { + &self.scope + } } use once_cell::sync::Lazy; diff --git a/helix-lsp/Cargo.toml b/helix-lsp/Cargo.toml index 0c5d8b91..08216f59 100644 --- a/helix-lsp/Cargo.toml +++ b/helix-lsp/Cargo.toml @@ -9,6 +9,7 @@ edition = "2018" [dependencies] helix-core = { path = "../helix-core" } helix-view = { path = "../helix-view" } +once_cell = "1.4" lsp-types = { version = "0.83", features = ["proposed"] } smol = "1.2" diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index 1ee8199f..8353ef7d 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -4,11 +4,15 @@ mod transport; pub use jsonrpc_core as jsonrpc; pub use lsp_types as lsp; +pub use once_cell::sync::{Lazy, OnceCell}; + pub use client::Client; pub use lsp::{Position, Url}; use thiserror::Error; +use std::{collections::HashMap, sync::Arc}; + #[derive(Error, Debug)] pub enum Error { #[error("protocol error: {0}")] @@ -62,3 +66,52 @@ impl Notification { } pub use jsonrpc::Call; + +type LanguageId = String; + +pub static REGISTRY: Lazy = Lazy::new(Registry::init); + +pub struct Registry { + inner: HashMap>>, +} + +impl Registry { + pub fn init() -> Self { + Self { + inner: HashMap::new(), + } + } + + pub fn get(&self, id: &str, ex: &smol::Executor) -> Option> { + // TODO: use get_or_try_init and propagate the error + self.inner + .get(id) + .map(|cell| { + cell.get_or_init(|| { + // TODO: lookup defaults for id (name, args) + + // initialize a new client + let client = Client::start(&ex, "rust-analyzer", &[]); + // TODO: also call initialize().await() + Arc::new(client) + }) + }) + .cloned() + } +} + +// REGISTRY = HashMap>> +// spawn one server per language type, need to spawn one per workspace if server doesn't support +// workspaces +// +// could also be a client per root dir +// +// storing a copy of Option>> on Document would make the LSP client easily +// accessible during edit/save callbacks +// +// the event loop needs to process all incoming streams, maybe we can just have that be a separate +// task that's continually running and store the state on the client, then use read lock to +// retrieve data during render +// -> PROBLEM: how do you trigger an update on the editor side when data updates? +// +// -> The data updates should pull all events until we run out so we don't frequently re-render diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs index cacfde56..141779ec 100644 --- a/helix-term/src/application.rs +++ b/helix-term/src/application.rs @@ -636,9 +636,17 @@ impl<'a> Application<'a> { } } Some(Call::MethodCall(call)) => { - // TODO: need to make Result - - unimplemented!("{:?}", call) + debug!("Method not found {}", call.method); + + self.language_server.reply( + call.id, + // TODO: make a Into trait that can cast to Err(jsonrpc::Error) + Err(helix_lsp::jsonrpc::Error { + code: helix_lsp::jsonrpc::ErrorCode::MethodNotFound, + message: "Method not found".to_string(), + data: None, + }), + ); } _ => unreachable!(), } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index 1587de8b..e8f311c5 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -25,6 +25,8 @@ pub struct Document { /// Tree-sitter AST tree pub syntax: Option, + /// Corresponding language scope name. Usually `source.`. + pub language: Option, /// Pending changes since last history commit. pub changes: ChangeSet, @@ -64,6 +66,7 @@ impl Document { mode: Mode::Normal, restore_cursor: false, syntax: None, + language: None, changes, old_state, diagnostics: Vec::new(), @@ -73,6 +76,7 @@ impl Document { } // TODO: passing scopes here is awkward + // TODO: async fn? pub fn load(path: PathBuf, scopes: &[String]) -> Result { use std::{env, fs::File, io::BufReader}; let _current_dir = env::current_dir()?; @@ -90,6 +94,15 @@ impl Document { let syntax = Syntax::new(&doc.state.doc, highlight_config.clone()); doc.syntax = Some(syntax); + // TODO: maybe just keep an Arc<> pointer to the language_config? + doc.language = Some(language_config.scope().to_string()); + + // TODO: this ties lsp support to tree-sitter enabled languages for now. Language + // config should use Option to let us have non-tree-sitter configs. + + // TODO: circular dep: view <-> lsp + // helix_lsp::REGISTRY; + // view should probably depend on lsp }; // canonicalize path to absolute value @@ -98,6 +111,8 @@ impl Document { Ok(doc) } + // TODO: do we need some way of ensuring two save operations on the same doc can't run at once? + // or is that handled by the OS/async layer pub fn save(&self) -> impl Future> { // we clone and move text + path into the future so that we asynchronously save the current // state without blocking any further edits. -- cgit v1.2.3-70-g09d2 From 39bf1ca82514e1dc56dfebdce2558cce662367d1 Mon Sep 17 00:00:00 2001 From: Blaž Hrastnik Date: Tue, 1 Dec 2020 09:53:17 +0900 Subject: Update deps. --- Cargo.lock | 150 ++++++++++++++++++++++++++------------------- helix-lsp/Cargo.toml | 2 +- helix-lsp/src/client.rs | 3 +- helix-lsp/src/lib.rs | 2 +- helix-view/src/document.rs | 2 +- 5 files changed, 93 insertions(+), 66 deletions(-) (limited to 'helix-view/src/document.rs') diff --git a/Cargo.lock b/Cargo.lock index c9e421a2..a3e93bd7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -40,9 +40,9 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d373d78ded7d0b3fa8039375718cde0aace493f2e34fb60f51cbf567562ca801" +checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146" dependencies = [ "async-task", "concurrent-queue", @@ -65,9 +65,9 @@ dependencies = [ [[package]] name = "async-io" -version = "1.1.10" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54bc4c1c7292475efb2253227dbcfad8fe1ca4c02bc62c510cc2f3da5c4704e" +checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd" dependencies = [ "concurrent-queue", "fastrand", @@ -144,6 +144,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + [[package]] name = "bitflags" version = "1.2.1" @@ -189,9 +195,9 @@ checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" [[package]] name = "cc" -version = "1.0.61" +version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed67cbde08356238e75fc4656be4749481eeffb09e19f320a25237d5221c985d" +checksum = "95752358c8f7552394baf48cd82695b345628ad3f170d607de3ca03b8dacca15" dependencies = [ "jobserver", ] @@ -262,12 +268,12 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" [[package]] name = "crossbeam-utils" -version = "0.7.2" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" dependencies = [ "autocfg", - "cfg-if 0.1.10", + "cfg-if 1.0.0", "lazy_static", ] @@ -342,6 +348,16 @@ dependencies = [ "log", ] +[[package]] +name = "form_urlencoded" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00" +dependencies = [ + "matches", + "percent-encoding", +] + [[package]] name = "futf" version = "0.1.4" @@ -360,15 +376,15 @@ checksum = "4c7e4c2612746b0df8fed4ce0c69156021b704c9aefa360311c04e6e9e002eed" [[package]] name = "futures-core" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18eaa56102984bed2c88ea39026cff3ce3b4c7f508ca970cedf2450ea10d4e46" +checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748" [[package]] name = "futures-io" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1798854a4727ff944a7b12aa999f58ce7aa81db80d2dfaaf2ba06f065ddd2b" +checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb" [[package]] name = "futures-lite" @@ -387,9 +403,9 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36fccf3fc58563b4a14d265027c627c3b665d7fed489427e88e7cc929559efe" +checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556" dependencies = [ "proc-macro-hack", "proc-macro2", @@ -399,18 +415,18 @@ dependencies = [ [[package]] name = "futures-task" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d502af37186c4fef99453df03e374683f8a1eec9dcc1e66b3b82dc8278ce3c" +checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d" dependencies = [ "once_cell", ] [[package]] name = "futures-util" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abcb44342f62e6f3e8ac427b8aa815f724fd705dfad060b18ac7866c15bb8e34" +checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2" dependencies = [ "futures-core", "futures-macro", @@ -555,9 +571,9 @@ dependencies = [ [[package]] name = "instant" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613" +checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" dependencies = [ "cfg-if 1.0.0", ] @@ -604,9 +620,9 @@ checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" [[package]] name = "lock_api" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +checksum = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" dependencies = [ "scopeguard", ] @@ -622,11 +638,11 @@ dependencies = [ [[package]] name = "lsp-types" -version = "0.83.0" +version = "0.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e0bd4b95038f2c23bda332ba0ca684e8dda765db1f9bdb63dc4c3e01f3b456" +checksum = "3b95be71fe205e44de754185bcf86447b65813ce1ceb298f8d3793ade5fff08d" dependencies = [ - "base64", + "base64 0.12.3", "bitflags", "serde", "serde_json", @@ -654,9 +670,9 @@ checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" [[package]] name = "mio" -version = "0.7.5" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8962c171f57fcfffa53f4df1bb15ec4c8cf26a7569459c9ceb62d94aab0d9584" +checksum = "f33bc887064ef1fd66020c9adfc45bb9f33d75a42096c81e7c56c65b75dd1a8b" dependencies = [ "libc", "log", @@ -667,9 +683,9 @@ dependencies = [ [[package]] name = "miow" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b88fb9795d4d36d62a012dfbf49a8f5cf12751f36d31a9dbe66d528e58979e" +checksum = "5a33c1b55807fbed163481b5ba66db4b2fa6cde694a5027be10fb724206c5897" dependencies = [ "socket2", "winapi", @@ -731,15 +747,15 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.4.1" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" +checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0" [[package]] name = "os_str_bytes" -version = "2.3.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ac6fe3538f701e339953a3ebbe4f39941aababa8a3f6964635b24ab526daeac" +checksum = "afb2e1c3ee07430c2cf76151675e583e0f19985fa6efae47d6848a3e2c824f85" [[package]] name = "parking" @@ -749,9 +765,9 @@ checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" [[package]] name = "parking_lot" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" +checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" dependencies = [ "instant", "lock_api", @@ -787,18 +803,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" [[package]] name = "pin-project" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee41d838744f60d959d7074e3afb6b35c7456d0f61cad38a24e35e6553f73841" +checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81a4ffa594b66bff340084d4081df649a7dc049ac8d7fc458d8e628bfbbb2f86" +checksum = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f" dependencies = [ "proc-macro2", "quote", @@ -906,11 +922,11 @@ dependencies = [ [[package]] name = "rust-argon2" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dab61250775933275e84053ac235621dfb739556d5c54a2f2e9313b7cf43a19" +checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" dependencies = [ - "base64", + "base64 0.13.0", "blake2b_simd", "constant_time_eq", "crossbeam-utils", @@ -1007,15 +1023,15 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +checksum = "7acad6f34eb9e8a259d3283d1e8c1d34d7415943d4895f65cc73813c7396fc85" [[package]] name = "smol" -version = "1.2.4" +version = "1.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf8ded16994c0ae59596c6e4733c76faeb0533c26fd5ca1b1bc89271a049a66" +checksum = "85cf3b5351f3e783c1d79ab5fc604eeed8b8ae9abd36b166e8b87a089efd85e4" dependencies = [ "async-channel", "async-executor", @@ -1031,11 +1047,11 @@ dependencies = [ [[package]] name = "socket2" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1fa70dc5c8104ec096f4fe7ede7a221d35ae13dcd19ba1ad9a81d2cab9a1c44" +checksum = "2c29947abdee2a218277abeca306f25789c938e500ea5a9d4b12a5a504466902" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", "libc", "redox_syscall", "winapi", @@ -1043,9 +1059,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.48" +version = "1.0.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" +checksum = "8833e20724c24de12bbaba5ad230ea61c3eafb05b881c7c9d3cfe8638b187e68" dependencies = [ "proc-macro2", "quote", @@ -1113,9 +1129,18 @@ dependencies = [ [[package]] name = "tinyvec" -version = "0.3.4" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238ce071d267c5710f9d31451efec16c5ee22de34df17cc05e56cbc92e967117" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tree-sitter" @@ -1129,8 +1154,8 @@ dependencies = [ [[package]] name = "tui" -version = "0.12.0" -source = "git+https://github.com/fdehau/tui-rs#25ff2e5e61f8902101e485743992db2412f77aad" +version = "0.13.0" +source = "git+https://github.com/fdehau/tui-rs#efdd6bfb193dafcb5e3bdc75e7d2d314065da1d7" dependencies = [ "bitflags", "cassowary", @@ -1150,18 +1175,18 @@ dependencies = [ [[package]] name = "unicode-normalization" -version = "0.1.13" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb19cf769fa8c6a80a162df694621ebeb4dafb606470b2b2fce0be40a98a977" +checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.6.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" +checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" [[package]] name = "unicode-width" @@ -1177,10 +1202,11 @@ checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] name = "url" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829d4a8476c35c9bf0bbce5a3b23f4106f79728039b726d292bb93bc106787cb" +checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e" dependencies = [ + "form_urlencoded", "idna", "matches", "percent-encoding", diff --git a/helix-lsp/Cargo.toml b/helix-lsp/Cargo.toml index 08216f59..2ecd0cc1 100644 --- a/helix-lsp/Cargo.toml +++ b/helix-lsp/Cargo.toml @@ -11,7 +11,7 @@ helix-core = { path = "../helix-core" } helix-view = { path = "../helix-view" } once_cell = "1.4" -lsp-types = { version = "0.83", features = ["proposed"] } +lsp-types = { version = "0.84", features = ["proposed"] } smol = "1.2" url = "2" pathdiff = "0.2" diff --git a/helix-lsp/src/client.rs b/helix-lsp/src/client.rs index 1583bfb8..1f07cf89 100644 --- a/helix-lsp/src/client.rs +++ b/helix-lsp/src/client.rs @@ -183,7 +183,7 @@ impl Client { #[allow(deprecated)] let params = lsp::InitializeParams { - process_id: Some(u64::from(std::process::id())), + process_id: Some(std::process::id()), root_path: None, // root_uri: Some(lsp_types::Url::parse("file://localhost/")?), root_uri: None, // set to project root in the future @@ -194,6 +194,7 @@ impl Client { trace: None, workspace_folders: None, client_info: None, + locale: None, // TODO }; let response = self.request::(params).await?; diff --git a/helix-lsp/src/lib.rs b/helix-lsp/src/lib.rs index 8353ef7d..eae6fa86 100644 --- a/helix-lsp/src/lib.rs +++ b/helix-lsp/src/lib.rs @@ -38,7 +38,7 @@ pub mod util { let line_start = doc.char_to_utf16_cu(line); let col = doc.char_to_utf16_cu(pos) - line_start; - lsp::Position::new(line as u64, col as u64) + lsp::Position::new(line as u32, col as u32) } } diff --git a/helix-view/src/document.rs b/helix-view/src/document.rs index e8f311c5..7c4596ad 100644 --- a/helix-view/src/document.rs +++ b/helix-view/src/document.rs @@ -32,7 +32,7 @@ pub struct Document { pub changes: ChangeSet, pub old_state: State, pub history: History, - pub version: i64, // should be usize? + pub version: i32, // should be usize? pub diagnostics: Vec, } -- cgit v1.2.3-70-g09d2