lsp-mcp 0.1.0

MCP server providing unified access to Language Server Protocol features
Documentation
use crate::error::Result;
use crate::lsp::LanguageServerManager;
use crate::tools::definition::LocationInfo;
use crate::tools::{ensure_document_open, make_position};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;

/// Result of find references
#[derive(Debug, Serialize, Deserialize)]
pub struct ReferencesResult {
    pub references: Vec<LocationInfo>,
    pub count: usize,
}

/// Find all references to a symbol
pub fn find_references(
    manager: &LanguageServerManager,
    file_path: &str,
    line: u32,
    character: u32,
    include_declaration: bool,
) -> Result<ReferencesResult> {
    let path = PathBuf::from(file_path);
    let (client, uri) = ensure_document_open(manager, &path)?;

    let position = make_position(line, character);
    let locations = client.find_references(&uri, position, include_declaration)?;

    let references: Vec<LocationInfo> = locations
        .unwrap_or_default()
        .iter()
        .map(|loc| LocationInfo {
            file: loc
                .uri
                .to_file_path()
                .map(|p| p.to_string_lossy().to_string())
                .unwrap_or_else(|_| loc.uri.to_string()),
            line: loc.range.start.line,
            character: loc.range.start.character,
            end_line: Some(loc.range.end.line),
            end_character: Some(loc.range.end.character),
        })
        .collect();

    let count = references.len();

    Ok(ReferencesResult { references, count })
}