use std::collections::HashMap;
use anyhow::Result;
use anyhow::bail;
use lsp_types::TextEdit;
use lsp_types::Url;
use lsp_types::WorkspaceEdit;
use wdl_ast::lexer::v1::is_ident;
use crate::SourcePosition;
use crate::SourcePositionEncoding;
use crate::graph::DocumentGraph;
use crate::handlers;
pub fn rename(
graph: &DocumentGraph,
document_uri: Url,
position: SourcePosition,
encoding: SourcePositionEncoding,
new_name: String,
) -> Result<Option<WorkspaceEdit>> {
if !is_ident(&new_name) {
bail!("name `{new_name}` is not a valid WDL identifier");
}
let locations = handlers::find_all_references(graph, document_uri, position, encoding, true)?;
if locations.is_empty() {
return Ok(None);
}
let mut changes: HashMap<Url, Vec<TextEdit>> = HashMap::new();
for location in locations {
let text_edit = TextEdit {
range: location.range,
new_text: new_name.clone(),
};
changes.entry(location.uri).or_default().push(text_edit);
}
Ok(Some(WorkspaceEdit {
changes: Some(changes),
document_changes: None,
change_annotations: None,
}))
}