Skip to main content

lsp_workspace_symbols/
lsp_workspace_symbols.rs

1use std::{env, path::PathBuf, time::Duration};
2
3use anyhow::{Context, Result, anyhow};
4use cgraph::fetch::lsp::{LspConfig, LspProvider};
5
6#[tokio::main]
7async fn main() -> Result<()> {
8    let mut args = env::args_os().skip(1);
9    let program = args
10        .next()
11        .context("usage: lsp_workspace_symbols <SERVER> <QUERY> [WORKSPACE]")?;
12    let query = args
13        .next()
14        .context("usage: lsp_workspace_symbols <SERVER> <QUERY> [WORKSPACE]")?
15        .into_string()
16        .map_err(|_| anyhow!("query must be valid UTF-8"))?;
17    let workspace_root = match args.next() {
18        Some(path) => PathBuf::from(path),
19        None => env::current_dir().context("failed to determine current directory")?,
20    };
21
22    let lsp = LspProvider::start(LspConfig::new(program, workspace_root)).await?;
23    tokio::time::sleep(Duration::from_secs(2)).await;
24    let symbols = lsp.workspace_symbols(&query).await?;
25
26    for symbol in symbols {
27        let line = symbol
28            .range
29            .map(|range| (range.start.line + 1).to_string())
30            .unwrap_or_else(|| "?".to_owned());
31        println!("{}\t{}:{line}", symbol.name, symbol.uri);
32    }
33
34    lsp.shutdown().await
35}