mod symbol_index;
mod navigation_target;
+mod status;
mod completion;
mod runnables;
mod goto_definition;
}
impl Analysis {
+ /// Debug info about the current state of the analysis
+ pub fn status(&self) -> String {
+ status::status(&*self.db)
+ }
+
/// Gets the text of the source file.
pub fn file_text(&self, file_id: FileId) -> Arc<String> {
self.db.file_text(file_id)
--- /dev/null
+use ra_db::{
+ LocationIntener, SourceFileQuery,
+ salsa::{Database, debug::DebugQueryTable},
+};
+
+use crate::db::RootDatabase;
+
+pub(crate) fn status(db: &RootDatabase) -> String {
+ let n_parsed_files = db.query(SourceFileQuery).keys::<Vec<_>>().len();
+ let n_defs = {
+ let interner: &LocationIntener<hir::DefLoc, hir::DefId> = db.as_ref();
+ interner.len()
+ };
+ format!("#n_parsed_files {}\n#n_defs {}\n", n_parsed_files, n_defs)
+}
sender,
};
let req = pool_dispatcher
+ .on::<req::AnalyzerStatus>(handlers::handle_analyzer_status)?
.on::<req::SyntaxTree>(handlers::handle_syntax_tree)?
.on::<req::ExtendSelection>(handlers::handle_extend_selection)?
.on::<req::FindMatchingBrace>(handlers::handle_find_matching_brace)?
LspError, Result,
};
+pub fn handle_analyzer_status(world: ServerWorld, _: ()) -> Result<String> {
+ Ok(world.status())
+}
+
pub fn handle_syntax_tree(world: ServerWorld, params: req::SyntaxTreeParams) -> Result<String> {
let id = params.text_document.try_conv_with(&world)?;
let res = world.analysis().syntax_tree(id);
TextDocumentPositionParams, TextEdit, WorkspaceEdit, WorkspaceSymbolParams,
};
+pub enum AnalyzerStatus {}
+
+impl Request for AnalyzerStatus {
+ type Params = ();
+ type Result = String;
+ const METHOD: &'static str = "ra/analyzerStatus";
+}
+
pub enum SyntaxTree {}
impl Request for SyntaxTree {
.map_err(|_| format_err!("can't convert path to url: {}", path.display()))?;
Ok(url)
}
+
+ pub fn status(&self) -> String {
+ let mut res = String::new();
+ if self.workspaces.is_empty() {
+ res.push_str("no workspaces\n")
+ } else {
+ res.push_str("workspaces:\n");
+ for w in self.workspaces.iter() {
+ res += &format!("{} packages loaded\n", w.cargo.packages().count());
+ }
+ }
+ res.push_str("\nanalysis:\n");
+ res.push_str(&self.analysis.status());
+ res
+ }
}
{
"command": "ra-lsp.run",
"title": "Rust Run"
+ },
+ {
+ "command": "ra-lsp.analyzerStatus",
+ "title": "Status of rust-analyzer (debug)"
}
],
"keybindings": [
--- /dev/null
+import * as vscode from 'vscode';
+import { Server } from '../server';
+
+// Shows status of rust-analyzer (for debugging)
+export async function handle() {
+ const status = await Server.client.sendRequest<string>(
+ 'ra/analyzerStatus',
+ null
+ );
+ const doc = await vscode.workspace.openTextDocument({ content: status });
+ await vscode.window.showTextDocument(doc, vscode.ViewColumn.Two);
+}
+import * as analyzerStatus from './analyzer_status';
import * as applySourceChange from './apply_source_change';
import * as extendSelection from './extend_selection';
import * as joinLines from './join_lines';
import * as syntaxTree from './syntaxTree';
export {
+ analyzerStatus,
applySourceChange,
extendSelection,
joinLines,
}
// Commands are requests from vscode to the language server
+ registerCommand('ra-lsp.analyzerStatus', commands.analyzerStatus.handle);
registerCommand('ra-lsp.syntaxTree', commands.syntaxTree.handle);
registerCommand('ra-lsp.extendSelection', commands.extendSelection.handle);
registerCommand('ra-lsp.matchingBrace', commands.matchingBrace.handle);