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;
#[derive(Debug, Serialize, Deserialize)]
pub struct ReferencesResult {
pub references: Vec<LocationInfo>,
pub count: usize,
}
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 })
}