mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-25 12:33:33 +00:00
Add "view file text" command to debug sync issues
This commit is contained in:
parent
259182b50b
commit
ec2d023383
8 changed files with 89 additions and 1 deletions
|
@ -123,6 +123,14 @@ pub(crate) fn handle_view_hir(
|
||||||
Ok(res)
|
Ok(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn handle_view_file_text(
|
||||||
|
snap: GlobalStateSnapshot,
|
||||||
|
params: lsp_types::TextDocumentIdentifier,
|
||||||
|
) -> Result<String> {
|
||||||
|
let file_id = from_proto::file_id(&snap, ¶ms.uri)?;
|
||||||
|
Ok(snap.analysis.file_text(file_id)?.to_string())
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn handle_view_item_tree(
|
pub(crate) fn handle_view_item_tree(
|
||||||
snap: GlobalStateSnapshot,
|
snap: GlobalStateSnapshot,
|
||||||
params: lsp_ext::ViewItemTreeParams,
|
params: lsp_ext::ViewItemTreeParams,
|
||||||
|
|
|
@ -70,6 +70,14 @@ impl Request for ViewHir {
|
||||||
const METHOD: &'static str = "rust-analyzer/viewHir";
|
const METHOD: &'static str = "rust-analyzer/viewHir";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub enum ViewFileText {}
|
||||||
|
|
||||||
|
impl Request for ViewFileText {
|
||||||
|
type Params = lsp_types::TextDocumentIdentifier;
|
||||||
|
type Result = String;
|
||||||
|
const METHOD: &'static str = "rust-analyzer/viewFileText";
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Serialize, Debug)]
|
#[derive(Deserialize, Serialize, Debug)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct ViewCrateGraphParams {
|
pub struct ViewCrateGraphParams {
|
||||||
|
|
|
@ -590,6 +590,7 @@ impl GlobalState {
|
||||||
.on::<lsp_ext::AnalyzerStatus>(handlers::handle_analyzer_status)
|
.on::<lsp_ext::AnalyzerStatus>(handlers::handle_analyzer_status)
|
||||||
.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::ViewFileText>(handlers::handle_view_file_text)
|
||||||
.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::ViewItemTree>(handlers::handle_view_item_tree)
|
||||||
.on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
|
.on::<lsp_ext::ExpandMacro>(handlers::handle_expand_macro)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<!---
|
<!---
|
||||||
lsp_ext.rs hash: 854109e98d02a780
|
lsp_ext.rs hash: a61de7db4504a4d1
|
||||||
|
|
||||||
If you need to change the above hash to make the test pass, please check if you
|
If you need to change the above hash to make the test pass, please check if you
|
||||||
need to adjust this doc as well and ping this issue:
|
need to adjust this doc as well and ping this issue:
|
||||||
|
@ -494,6 +494,17 @@ Primarily for debugging, but very useful for all people working on rust-analyzer
|
||||||
Returns a textual representation of the HIR of the function containing the cursor.
|
Returns a textual representation of the HIR of the function containing the cursor.
|
||||||
For debugging or when working on rust-analyzer itself.
|
For debugging or when working on rust-analyzer itself.
|
||||||
|
|
||||||
|
## View File Text
|
||||||
|
|
||||||
|
**Method:** `rust-analyzer/viewFileText`
|
||||||
|
|
||||||
|
**Request:** `TextDocumentIdentifier`
|
||||||
|
|
||||||
|
**Response:** `string`
|
||||||
|
|
||||||
|
Returns the text of a file as seen by the server.
|
||||||
|
This is for debugging file sync problems.
|
||||||
|
|
||||||
## View ItemTree
|
## View ItemTree
|
||||||
|
|
||||||
**Method:** `rust-analyzer/viewItemTree`
|
**Method:** `rust-analyzer/viewItemTree`
|
||||||
|
|
|
@ -104,6 +104,11 @@
|
||||||
"title": "View Hir",
|
"title": "View Hir",
|
||||||
"category": "Rust Analyzer"
|
"category": "Rust Analyzer"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"command": "rust-analyzer.viewFileText",
|
||||||
|
"title": "View File Text (as seen by the server)",
|
||||||
|
"category": "Rust Analyzer"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"command": "rust-analyzer.viewItemTree",
|
"command": "rust-analyzer.viewItemTree",
|
||||||
"title": "Debug ItemTree",
|
"title": "Debug ItemTree",
|
||||||
|
@ -1408,6 +1413,10 @@
|
||||||
"command": "rust-analyzer.viewHir",
|
"command": "rust-analyzer.viewHir",
|
||||||
"when": "inRustProject"
|
"when": "inRustProject"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"command": "rust-analyzer.viewFileText",
|
||||||
|
"when": "inRustProject"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"command": "rust-analyzer.expandMacro",
|
"command": "rust-analyzer.expandMacro",
|
||||||
"when": "inRustProject"
|
"when": "inRustProject"
|
||||||
|
|
|
@ -432,6 +432,54 @@ export function viewHir(ctx: Ctx): Cmd {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function viewFileText(ctx: Ctx): Cmd {
|
||||||
|
const tdcp = new class implements vscode.TextDocumentContentProvider {
|
||||||
|
readonly uri = vscode.Uri.parse('rust-analyzer://viewFileText/file.rs');
|
||||||
|
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 = client.code2ProtocolConverter.asTextDocumentIdentifier(rustEditor.document);
|
||||||
|
return client.sendRequest(ra.viewFileText, 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 viewItemTree(ctx: Ctx): Cmd {
|
export function viewItemTree(ctx: Ctx): Cmd {
|
||||||
const tdcp = new class implements vscode.TextDocumentContentProvider {
|
const tdcp = new class implements vscode.TextDocumentContentProvider {
|
||||||
readonly uri = vscode.Uri.parse('rust-analyzer://viewItemTree/itemtree.rs');
|
readonly uri = vscode.Uri.parse('rust-analyzer://viewItemTree/itemtree.rs');
|
||||||
|
|
|
@ -36,6 +36,8 @@ 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 const viewFileText = new lc.RequestType<lc.TextDocumentIdentifier, string, void>("rust-analyzer/viewFileText");
|
||||||
|
|
||||||
export interface ViewItemTreeParams {
|
export interface ViewItemTreeParams {
|
||||||
textDocument: lc.TextDocumentIdentifier;
|
textDocument: lc.TextDocumentIdentifier;
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,6 +114,7 @@ async function initCommonContext(context: vscode.ExtensionContext, ctx: Ctx) {
|
||||||
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('viewFileText', commands.viewFileText);
|
||||||
ctx.registerCommand('viewItemTree', commands.viewItemTree);
|
ctx.registerCommand('viewItemTree', commands.viewItemTree);
|
||||||
ctx.registerCommand('viewCrateGraph', commands.viewCrateGraph);
|
ctx.registerCommand('viewCrateGraph', commands.viewCrateGraph);
|
||||||
ctx.registerCommand('viewFullCrateGraph', commands.viewFullCrateGraph);
|
ctx.registerCommand('viewFullCrateGraph', commands.viewFullCrateGraph);
|
||||||
|
|
Loading…
Reference in a new issue