matching brace

This commit is contained in:
Aleksey Kladov 2018-08-16 00:23:22 +03:00
parent aa0d344581
commit c631b585a7
9 changed files with 135 additions and 14 deletions

View file

@ -117,6 +117,14 @@ impl ConvWith for AtomEdit {
}
}
impl<T: ConvWith> ConvWith for Option<T> {
type Ctx = <T as ConvWith>::Ctx;
type Output = Option<<T as ConvWith>::Output>;
fn conv_with(self, ctx: &Self::Ctx) -> Self::Output {
self.map(|x| ConvWith::conv_with(x, ctx))
}
}
impl<'a> TryConvWith for &'a Url {
type Ctx = PathMap;
type Output = FileId;

View file

@ -3,7 +3,7 @@ use std::collections::HashMap;
use languageserver_types::{
Diagnostic, DiagnosticSeverity, Url, DocumentSymbol,
Command, TextDocumentIdentifier, WorkspaceEdit,
SymbolInformation,
SymbolInformation, Position,
};
use libanalysis::{World, Query};
use libeditor;
@ -42,6 +42,25 @@ pub fn handle_extend_selection(
Ok(req::ExtendSelectionResult { selections })
}
pub fn handle_find_matching_brace(
world: World,
path_map: PathMap,
params: req::FindMatchingBraceParams,
) -> Result<Vec<Position>> {
let file_id = params.text_document.try_conv_with(&path_map)?;
let file = world.file_syntax(file_id)?;
let line_index = world.file_line_index(file_id)?;
let res = params.offsets
.into_iter()
.map_conv_with(&line_index)
.map(|offset| {
libeditor::matching_brace(&file, offset).unwrap_or(offset)
})
.map_conv_with(&line_index)
.collect();
Ok(res)
}
pub fn handle_document_symbol(
world: World,
path_map: PathMap,

View file

@ -26,6 +26,7 @@ use {
handle_execute_command,
handle_workspace_symbol,
handle_goto_definition,
handle_find_matching_brace,
},
};
@ -148,6 +149,9 @@ fn on_request(
handle_request_on_threadpool::<req::ExtendSelection>(
&mut req, pool, path_map, world, sender, handle_extend_selection,
)?;
handle_request_on_threadpool::<req::FindMatchingBrace>(
&mut req, pool, path_map, world, sender, handle_find_matching_brace,
)?;
handle_request_on_threadpool::<req::DocumentSymbolRequest>(
&mut req, pool, path_map, world, sender, handle_document_symbol,
)?;

View file

@ -1,5 +1,5 @@
use serde::{ser::Serialize, de::DeserializeOwned};
use languageserver_types::{TextDocumentIdentifier, Range, Url};
use languageserver_types::{TextDocumentIdentifier, Range, Url, Position};
use url_serde;
pub use languageserver_types::{
@ -65,6 +65,21 @@ pub struct ExtendSelectionResult {
pub selections: Vec<Range>,
}
pub enum FindMatchingBrace {}
impl Request for FindMatchingBrace {
type Params = FindMatchingBraceParams;
type Result = Vec<Position>;
const METHOD: &'static str = "m/findMatchingBrace";
}
#[derive(Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct FindMatchingBraceParams {
pub text_document: TextDocumentIdentifier,
pub offsets: Vec<Position>,
}
pub enum PublishDecorations {}
impl Notification for PublishDecorations {