From 7c67612b8a894187fa3b64725531a5459f9211bf Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 10 Aug 2018 22:33:29 +0300 Subject: organizize --- crates/server/src/handlers.rs | 61 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 crates/server/src/handlers.rs (limited to 'crates/server/src/handlers.rs') diff --git a/crates/server/src/handlers.rs b/crates/server/src/handlers.rs new file mode 100644 index 000000000..5ee87a4dd --- /dev/null +++ b/crates/server/src/handlers.rs @@ -0,0 +1,61 @@ +use languageserver_types::{Range, Position}; +use libanalysis::World; +use libeditor::{self, LineIndex, LineCol, TextRange, TextUnit}; +use {req, Result, FilePath}; + +pub fn handle_syntax_tree( + world: World, + params: req::SyntaxTreeParams, +) -> Result { + let path = params.text_document.file_path()?; + let file = world.file_syntax(&path)?; + Ok(libeditor::syntax_tree(&file)) +} + +pub fn handle_extend_selection( + world: World, + params: req::ExtendSelectionParams, +) -> Result { + let path = params.text_document.file_path()?; + let file = world.file_syntax(&path)?; + let line_index = world.file_line_index(&path)?; + let selections = params.selections.into_iter() + .map(|r| { + let r = to_text_range(&line_index, r); + let r = libeditor::extend_selection(&file, r).unwrap_or(r); + to_vs_range(&line_index, r) + }) + .collect(); + Ok(req::ExtendSelectionResult { selections }) +} + + +fn to_text_range(line_index: &LineIndex, range: Range) -> TextRange { + TextRange::from_to( + to_text_unit(line_index, range.start), + to_text_unit(line_index, range.end), + ) +} + +fn to_text_unit(line_index: &LineIndex, position: Position) -> TextUnit { + // TODO: UTF-16 + let line_col = LineCol { + line: position.line as u32, + col: (position.character as u32).into(), + }; + line_index.offset(line_col) +} + + +fn to_vs_range(line_index: &LineIndex, range: TextRange) -> Range { + Range::new( + to_vs_position(line_index, range.start()), + to_vs_position(line_index, range.end()), + ) +} + +fn to_vs_position(line_index: &LineIndex, offset: TextUnit) -> Position { + let line_col = line_index.line_col(offset); + // TODO: UTF-16 + Position::new(line_col.line as u64, u32::from(line_col.col) as u64) +} -- cgit v1.2.3