mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 04:53:34 +00:00
Add a "Debug ItemTree" LSP request
This commit is contained in:
parent
8d13864440
commit
271ec6b990
9 changed files with 108 additions and 0 deletions
|
@ -50,6 +50,7 @@ mod typing;
|
||||||
mod markdown_remove;
|
mod markdown_remove;
|
||||||
mod doc_links;
|
mod doc_links;
|
||||||
mod view_crate_graph;
|
mod view_crate_graph;
|
||||||
|
mod view_item_tree;
|
||||||
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
@ -288,6 +289,10 @@ impl Analysis {
|
||||||
self.with_db(|db| view_hir::view_hir(&db, position))
|
self.with_db(|db| view_hir::view_hir(&db, position))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn view_item_tree(&self, file_id: FileId) -> Cancelable<String> {
|
||||||
|
self.with_db(|db| view_item_tree::view_item_tree(&db, file_id))
|
||||||
|
}
|
||||||
|
|
||||||
/// Renders the crate graph to GraphViz "dot" syntax.
|
/// Renders the crate graph to GraphViz "dot" syntax.
|
||||||
pub fn view_crate_graph(&self) -> Cancelable<Result<String, String>> {
|
pub fn view_crate_graph(&self) -> Cancelable<Result<String, String>> {
|
||||||
self.with_db(|db| view_crate_graph::view_crate_graph(&db))
|
self.with_db(|db| view_crate_graph::view_crate_graph(&db))
|
||||||
|
|
16
crates/ide/src/view_item_tree.rs
Normal file
16
crates/ide/src/view_item_tree.rs
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
use hir::db::DefDatabase;
|
||||||
|
use ide_db::base_db::FileId;
|
||||||
|
use ide_db::RootDatabase;
|
||||||
|
|
||||||
|
// Feature: Debug ItemTree
|
||||||
|
//
|
||||||
|
// Displays the ItemTree of the currently open file, for debugging.
|
||||||
|
//
|
||||||
|
// |===
|
||||||
|
// | Editor | Action Name
|
||||||
|
//
|
||||||
|
// | VS Code | **Rust Analyzer: Debug ItemTree**
|
||||||
|
// |===
|
||||||
|
pub(crate) fn view_item_tree(db: &RootDatabase, file_id: FileId) -> String {
|
||||||
|
db.file_item_tree(file_id.into()).pretty_print()
|
||||||
|
}
|
|
@ -117,6 +117,16 @@ pub(crate) fn handle_view_hir(
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn handle_view_item_tree(
|
||||||
|
snap: GlobalStateSnapshot,
|
||||||
|
params: lsp_ext::ViewItemTreeParams,
|
||||||
|
) -> Result<String> {
|
||||||
|
let _p = profile::span("handle_view_item_tree");
|
||||||
|
let file_id = from_proto::file_id(&snap, ¶ms.text_document.uri)?;
|
||||||
|
let res = snap.analysis.view_item_tree(file_id)?;
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn handle_view_crate_graph(snap: GlobalStateSnapshot, (): ()) -> Result<String> {
|
pub(crate) fn handle_view_crate_graph(snap: GlobalStateSnapshot, (): ()) -> Result<String> {
|
||||||
let _p = profile::span("handle_view_crate_graph");
|
let _p = profile::span("handle_view_crate_graph");
|
||||||
let dot = snap.analysis.view_crate_graph()??;
|
let dot = snap.analysis.view_crate_graph()??;
|
||||||
|
|
|
@ -70,6 +70,20 @@ impl Request for ViewCrateGraph {
|
||||||
const METHOD: &'static str = "rust-analyzer/viewCrateGraph";
|
const METHOD: &'static str = "rust-analyzer/viewCrateGraph";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct ViewItemTreeParams {
|
||||||
|
pub text_document: TextDocumentIdentifier,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub enum ViewItemTree {}
|
||||||
|
|
||||||
|
impl Request for ViewItemTree {
|
||||||
|
type Params = ViewItemTreeParams;
|
||||||
|
type Result = String;
|
||||||
|
const METHOD: &'static str = "rust-analyzer/viewItemTree";
|
||||||
|
}
|
||||||
|
|
||||||
pub enum ExpandMacro {}
|
pub enum ExpandMacro {}
|
||||||
|
|
||||||
impl Request for ExpandMacro {
|
impl Request for ExpandMacro {
|
||||||
|
|
|
@ -514,6 +514,7 @@ impl GlobalState {
|
||||||
.on::<lsp_ext::SyntaxTree>(handlers::handle_syntax_tree)
|
.on::<lsp_ext::SyntaxTree>(handlers::handle_syntax_tree)
|
||||||
.on::<lsp_ext::ViewHir>(handlers::handle_view_hir)
|
.on::<lsp_ext::ViewHir>(handlers::handle_view_hir)
|
||||||
.on::<lsp_ext::ViewCrateGraph>(handlers::handle_view_crate_graph)
|
.on::<lsp_ext::ViewCrateGraph>(handlers::handle_view_crate_graph)
|
||||||
|
.on::<lsp_ext::ViewItemTree>(handlers::handle_view_item_tree)
|
||||||
.on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
|
.on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
|
||||||
.on::<lsp_ext::ParentModule>(handlers::handle_parent_module)
|
.on::<lsp_ext::ParentModule>(handlers::handle_parent_module)
|
||||||
.on::<lsp_ext::Runnables>(handlers::handle_runnables)
|
.on::<lsp_ext::Runnables>(handlers::handle_runnables)
|
||||||
|
|
|
@ -109,6 +109,11 @@
|
||||||
"title": "View Hir",
|
"title": "View Hir",
|
||||||
"category": "Rust Analyzer"
|
"category": "Rust Analyzer"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"command": "rust-analyzer.viewItemTree",
|
||||||
|
"title": "Debug ItemTree",
|
||||||
|
"category": "Rust Analyzer"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"command": "rust-analyzer.viewCrateGraph",
|
"command": "rust-analyzer.viewCrateGraph",
|
||||||
"title": "View Crate Graph",
|
"title": "View Crate Graph",
|
||||||
|
|
|
@ -429,6 +429,56 @@ export function viewHir(ctx: Ctx): Cmd {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function viewItemTree(ctx: Ctx): Cmd {
|
||||||
|
const tdcp = new class implements vscode.TextDocumentContentProvider {
|
||||||
|
readonly uri = vscode.Uri.parse('rust-analyzer://viewItemTree/itemtree.txt');
|
||||||
|
readonly eventEmitter = new vscode.EventEmitter<vscode.Uri>();
|
||||||
|
constructor() {
|
||||||
|
vscode.workspace.onDidChangeTextDocument(this.onDidChangeTextDocument, this, ctx.subscriptions);
|
||||||
|
vscode.window.onDidChangeActiveTextEditor(this.onDidChangeActiveTextEditor, this, ctx.subscriptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
private onDidChangeTextDocument(event: vscode.TextDocumentChangeEvent) {
|
||||||
|
if (isRustDocument(event.document)) {
|
||||||
|
// We need to order this after language server updates, but there's no API for that.
|
||||||
|
// Hence, good old sleep().
|
||||||
|
void sleep(10).then(() => this.eventEmitter.fire(this.uri));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private onDidChangeActiveTextEditor(editor: vscode.TextEditor | undefined) {
|
||||||
|
if (editor && isRustEditor(editor)) {
|
||||||
|
this.eventEmitter.fire(this.uri);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
provideTextDocumentContent(_uri: vscode.Uri, ct: vscode.CancellationToken): vscode.ProviderResult<string> {
|
||||||
|
const rustEditor = ctx.activeRustEditor;
|
||||||
|
const client = ctx.client;
|
||||||
|
if (!rustEditor || !client) return '';
|
||||||
|
|
||||||
|
const params = {
|
||||||
|
textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(rustEditor.document),
|
||||||
|
};
|
||||||
|
return client.sendRequest(ra.viewItemTree, params, ct);
|
||||||
|
}
|
||||||
|
|
||||||
|
get onDidChange(): vscode.Event<vscode.Uri> {
|
||||||
|
return this.eventEmitter.event;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
ctx.pushCleanup(vscode.workspace.registerTextDocumentContentProvider('rust-analyzer', tdcp));
|
||||||
|
|
||||||
|
return async () => {
|
||||||
|
const document = await vscode.workspace.openTextDocument(tdcp.uri);
|
||||||
|
tdcp.eventEmitter.fire(tdcp.uri);
|
||||||
|
void await vscode.window.showTextDocument(document, {
|
||||||
|
viewColumn: vscode.ViewColumn.Two,
|
||||||
|
preserveFocus: true
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
export function viewCrateGraph(ctx: Ctx): Cmd {
|
export function viewCrateGraph(ctx: Ctx): Cmd {
|
||||||
return async () => {
|
return async () => {
|
||||||
const panel = vscode.window.createWebviewPanel("rust-analyzer.crate-graph", "rust-analyzer crate graph", vscode.ViewColumn.Two);
|
const panel = vscode.window.createWebviewPanel("rust-analyzer.crate-graph", "rust-analyzer crate graph", vscode.ViewColumn.Two);
|
||||||
|
|
|
@ -27,6 +27,12 @@ export const syntaxTree = new lc.RequestType<SyntaxTreeParams, string, void>("ru
|
||||||
|
|
||||||
export const viewHir = new lc.RequestType<lc.TextDocumentPositionParams, string, void>("rust-analyzer/viewHir");
|
export const viewHir = new lc.RequestType<lc.TextDocumentPositionParams, string, void>("rust-analyzer/viewHir");
|
||||||
|
|
||||||
|
export interface ViewItemTreeParams {
|
||||||
|
textDocument: lc.TextDocumentIdentifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
export const viewItemTree = new lc.RequestType<ViewItemTreeParams, string, void>("rust-analyzer/viewItemTree");
|
||||||
|
|
||||||
export const viewCrateGraph = new lc.RequestType0<string, void>("rust-analyzer/viewCrateGraph");
|
export const viewCrateGraph = new lc.RequestType0<string, void>("rust-analyzer/viewCrateGraph");
|
||||||
|
|
||||||
export interface ExpandMacroParams {
|
export interface ExpandMacroParams {
|
||||||
|
|
|
@ -106,6 +106,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
|
||||||
ctx.registerCommand('parentModule', commands.parentModule);
|
ctx.registerCommand('parentModule', commands.parentModule);
|
||||||
ctx.registerCommand('syntaxTree', commands.syntaxTree);
|
ctx.registerCommand('syntaxTree', commands.syntaxTree);
|
||||||
ctx.registerCommand('viewHir', commands.viewHir);
|
ctx.registerCommand('viewHir', commands.viewHir);
|
||||||
|
ctx.registerCommand('viewItemTree', commands.viewItemTree);
|
||||||
ctx.registerCommand('viewCrateGraph', commands.viewCrateGraph);
|
ctx.registerCommand('viewCrateGraph', commands.viewCrateGraph);
|
||||||
ctx.registerCommand('expandMacro', commands.expandMacro);
|
ctx.registerCommand('expandMacro', commands.expandMacro);
|
||||||
ctx.registerCommand('run', commands.run);
|
ctx.registerCommand('run', commands.run);
|
||||||
|
|
Loading…
Reference in a new issue