parent module request

This commit is contained in:
Aleksey Kladov 2018-08-22 10:18:58 +03:00
parent ecc9df5f00
commit 9909875bfe
5 changed files with 52 additions and 2 deletions

View file

@ -41,6 +41,11 @@
"command": "libsyntax-rust.matchingBrace", "command": "libsyntax-rust.matchingBrace",
"key": "ctrl+shift+m", "key": "ctrl+shift+m",
"title": "Rust Matching Brace" "title": "Rust Matching Brace"
},
{
"command": "libsyntax-rust.parentModule",
"key": "ctrl+u",
"title": "Rust Parent Module"
} }
], ],
"keybindings": [ "keybindings": [

View file

@ -51,6 +51,22 @@ export function activate(context: vscode.ExtensionContext) {
return new vscode.Selection(anchor, active) return new vscode.Selection(anchor, active)
}) })
}) })
registerCommand('libsyntax-rust.parentModule', async () => {
let editor = vscode.window.activeTextEditor
if (editor == null || editor.document.languageId != "rust") return
let request: lc.TextDocumentIdentifier = {
uri: editor.document.uri.toString()
}
let response = await client.sendRequest<lc.TextDocumentIdentifier>("m/parentModule", request)
let loc: lc.Location = response[0]
if (loc == null) return
let uri = client.protocol2CodeConverter.asUri(loc.uri)
let range = client.protocol2CodeConverter.asRange(loc.range)
let doc = await vscode.workspace.openTextDocument(uri)
let e = await vscode.window.showTextDocument(doc)
e.revealRange(range, vscode.TextEditorRevealType.InCenter)
})
dispose(vscode.workspace.registerTextDocumentContentProvider( dispose(vscode.workspace.registerTextDocumentContentProvider(
'libsyntax-rust', 'libsyntax-rust',

View file

@ -3,7 +3,7 @@ use std::collections::HashMap;
use languageserver_types::{ use languageserver_types::{
Diagnostic, DiagnosticSeverity, Url, DocumentSymbol, Diagnostic, DiagnosticSeverity, Url, DocumentSymbol,
Command, TextDocumentIdentifier, WorkspaceEdit, Command, TextDocumentIdentifier, WorkspaceEdit,
SymbolInformation, Position, SymbolInformation, Position, Location,
}; };
use libanalysis::{Query}; use libanalysis::{Query};
use libeditor::{self, CursorPosition}; use libeditor::{self, CursorPosition};
@ -184,6 +184,23 @@ pub fn handle_goto_definition(
Ok(Some(req::GotoDefinitionResponse::Array(res))) Ok(Some(req::GotoDefinitionResponse::Array(res)))
} }
pub fn handle_parent_module(
world: ServerWorld,
params: TextDocumentIdentifier,
) -> Result<Vec<Location>> {
let file_id = params.try_conv_with(&world)?;
let mut res = Vec::new();
for (file_id, symbol) in world.analysis().parent_module(file_id) {
let line_index = world.analysis().file_line_index(file_id)?;
let location = to_location(
file_id, symbol.node_range,
&world, &line_index
)?;
res.push(location);
}
Ok(res)
}
pub fn handle_execute_command( pub fn handle_execute_command(
world: ServerWorld, world: ServerWorld,
mut params: req::ExecuteCommandParams, mut params: req::ExecuteCommandParams,

View file

@ -26,6 +26,7 @@ use {
handle_workspace_symbol, handle_workspace_symbol,
handle_goto_definition, handle_goto_definition,
handle_find_matching_brace, handle_find_matching_brace,
handle_parent_module,
}, },
}; };
@ -141,6 +142,9 @@ fn on_request(
handle_request_on_threadpool::<req::GotoDefinition>( handle_request_on_threadpool::<req::GotoDefinition>(
&mut req, pool, world, sender, handle_goto_definition, &mut req, pool, world, sender, handle_goto_definition,
)?; )?;
handle_request_on_threadpool::<req::ParentModule>(
&mut req, pool, world, sender, handle_parent_module,
)?;
dispatch::handle_request::<req::ExecuteCommand, _>(&mut req, |params, resp| { dispatch::handle_request::<req::ExecuteCommand, _>(&mut req, |params, resp| {
io.send(RawMsg::Response(resp.into_response(Ok(None))?)); io.send(RawMsg::Response(resp.into_response(Ok(None))?));

View file

@ -1,5 +1,5 @@
use serde::{ser::Serialize, de::DeserializeOwned}; use serde::{ser::Serialize, de::DeserializeOwned};
use languageserver_types::{TextDocumentIdentifier, Range, Url, Position}; use languageserver_types::{TextDocumentIdentifier, Range, Url, Position, Location};
use url_serde; use url_serde;
pub use languageserver_types::{ pub use languageserver_types::{
@ -109,3 +109,11 @@ impl Request for MoveCursor {
type Result = (); type Result = ();
const METHOD: &'static str = "m/moveCursor"; const METHOD: &'static str = "m/moveCursor";
} }
pub enum ParentModule {}
impl Request for ParentModule {
type Params = TextDocumentIdentifier;
type Result = Vec<Location>;
const METHOD: &'static str = "m/parentModule";
}