use std::path::PathBuf;
use std::sync::Arc;
use matrixcode_core::lsp::{LspClientRegistry, LspServerConfig, lsp_tools};
use matrixcode_core::tools::Tool;
#[tokio::main]
async fn main() {
println!("=== LSP Integration Demo ===\n");
let registry = Arc::new(LspClientRegistry::new());
println!("✓ LSP Client Registry created");
let config = LspServerConfig::new("rust-analyzer", "rust");
let project_root = std::env::current_dir()
.expect("Failed to get current directory")
.parent()
.expect("Failed to get parent directory")
.to_path_buf();
println!("📁 Project root: {}", project_root.display());
println!("⏳ Starting rust-analyzer...");
println!("⏳ Starting rust-analyzer...");
let start = std::time::Instant::now();
match registry.register(&config, &project_root).await {
Ok(_) => {
let elapsed = start.elapsed();
println!("✓ rust-analyzer started successfully in {:.2}s", elapsed.as_secs_f64());
}
Err(e) => {
println!("✗ Failed to start rust-analyzer: {}", e);
println!(" 提示:确保 rust-analyzer 已安装");
return;
}
}
let tools: Vec<Box<dyn Tool>> = lsp_tools(registry.clone());
println!("✓ Created {} LSP tools", tools.len());
println!("⏳ Waiting for rust-analyzer to initialize...");
tokio::time::sleep(tokio::time::Duration::from_secs(3)).await;
println!("\n=== Test 1: lsp_hover ===");
test_hover(®istry).await;
println!("\n=== Test 2: lsp_definition ===");
test_definition(®istry).await;
println!("\n=== Test 3: lsp_references ===");
test_references(®istry).await;
println!("\n=== Test 4: lsp_diagnostics ===");
test_diagnostics(®istry).await;
println!("\n=== Cleanup ===");
match registry.shutdown_all().await {
Ok(_) => println!("✓ All LSP clients shutdown"),
Err(e) => println!("✗ Shutdown error: {}", e),
}
println!("\n=== Demo Complete ===");
}
async fn test_hover(registry: &Arc<LspClientRegistry>) {
use matrixcode_core::lsp::LspHoverTool;
use matrixcode_core::tools::Tool;
use serde_json::json;
let tool = LspHoverTool::new(registry.clone());
let file = PathBuf::from("core/src/lib.rs");
let params = json!({
"file": file.to_string_lossy(),
"line": 33, "column": 8 });
println!(" Querying hover info for Agent in core/src/lib.rs:33:8");
match tool.execute(params).await {
Ok(result) => {
println!(" ✓ Hover result:");
println!(" {}", result);
}
Err(e) => {
println!(" ✗ Hover failed: {}", e);
println!(" 可能原因:LSP 还在初始化或位置无效");
}
}
}
async fn test_definition(registry: &Arc<LspClientRegistry>) {
use matrixcode_core::lsp::LspDefinitionTool;
use serde_json::json;
let tool = LspDefinitionTool::new(registry.clone());
let file = PathBuf::from("core/src/lib.rs");
let params = json!({
"file": file.to_string_lossy(),
"line": 33,
"column": 8
});
println!(" Finding definition of Agent in core/src/lib.rs:33:8");
match tool.execute(params).await {
Ok(result) => {
println!(" ✓ Definition location:");
println!(" {}", result);
}
Err(e) => {
println!(" ✗ Definition failed: {}", e);
}
}
}
async fn test_references(registry: &Arc<LspClientRegistry>) {
use matrixcode_core::lsp::LspReferencesTool;
use serde_json::json;
let tool = LspReferencesTool::new(registry.clone());
let file = PathBuf::from("core/src/agent/mod.rs");
let params = json!({
"file": file.to_string_lossy(),
"line": 45, "column": 12,
"include_declaration": true
});
println!(" Finding all references to Agent");
match tool.execute(params).await {
Ok(result) => {
println!(" ✓ References found:");
println!(" {}", result);
}
Err(e) => {
println!(" ✗ References failed: {}", e);
}
}
}
async fn test_diagnostics(registry: &Arc<LspClientRegistry>) {
use matrixcode_core::lsp::LspDiagnosticsTool;
use serde_json::json;
let tool = LspDiagnosticsTool::new(registry.clone());
let file = PathBuf::from("core/src/lib.rs");
let params = json!({
"file": file.to_string_lossy()
});
println!(" Getting diagnostics for core/src/lib.rs");
match tool.execute(params).await {
Ok(result) => {
println!(" ✓ Diagnostics:");
println!(" {}", result);
}
Err(e) => {
println!(" ✗ Diagnostics failed: {}", e);
}
}
}