mirror of
https://github.com/latex-lsp/texlab.git
synced 2025-12-23 09:19:21 +00:00
Provide rename support for LaTeX environments
This commit is contained in:
parent
3bea18bc46
commit
bcea11d548
2 changed files with 89 additions and 0 deletions
88
src/rename/latex_environment.rs
Normal file
88
src/rename/latex_environment.rs
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
use crate::feature::FeatureRequest;
|
||||
use crate::range;
|
||||
use crate::syntax::latex::analysis::environment::*;
|
||||
use crate::syntax::latex::ast::LatexVisitor;
|
||||
use crate::syntax::text::SyntaxNode;
|
||||
use crate::workspace::SyntaxTree;
|
||||
use lsp_types::{Position, RenameParams, TextEdit, WorkspaceEdit};
|
||||
use std::collections::HashMap;
|
||||
|
||||
pub struct LatexEnvironmentRenameProvider;
|
||||
|
||||
impl LatexEnvironmentRenameProvider {
|
||||
pub async fn execute(request: &FeatureRequest<RenameParams>) -> Option<WorkspaceEdit> {
|
||||
if let SyntaxTree::Latex(tree) = &request.document.tree {
|
||||
let mut analyzer = LatexEnvironmentAnalyzer::new();
|
||||
analyzer.visit_root(&tree.root);
|
||||
for environment in &analyzer.environments {
|
||||
if let Some(left_name) = environment.left.name {
|
||||
if let Some(right_name) = environment.right.name {
|
||||
if range::contains(left_name.range(), request.params.position)
|
||||
|| range::contains(right_name.range(), request.params.position)
|
||||
{
|
||||
let edits = vec![
|
||||
TextEdit::new(left_name.range(), request.params.new_name.clone()),
|
||||
TextEdit::new(right_name.range(), request.params.new_name.clone()),
|
||||
];
|
||||
let mut changes = HashMap::new();
|
||||
changes.insert(request.document.uri.clone(), edits);
|
||||
return Some(WorkspaceEdit::new(changes));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use crate::feature::FeatureTester;
|
||||
use crate::workspace::WorkspaceBuilder;
|
||||
use futures::executor;
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
let mut builder = WorkspaceBuilder::new();
|
||||
let uri = builder.document("foo.tex", "\\begin{foo}\n\\end{bar}");
|
||||
let request = FeatureTester::new(builder.workspace, uri.clone(), 0, 8, "baz").into();
|
||||
|
||||
let changes = executor::block_on(LatexEnvironmentRenameProvider::execute(&request))
|
||||
.unwrap()
|
||||
.changes
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(1, changes.len());
|
||||
assert_eq!(
|
||||
vec![
|
||||
TextEdit::new(range::create(0, 7, 0, 10), "baz".to_owned()),
|
||||
TextEdit::new(range::create(1, 5, 1, 8), "baz".to_owned())
|
||||
],
|
||||
*changes.get(&uri).unwrap()
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_command() {
|
||||
let mut builder = WorkspaceBuilder::new();
|
||||
let uri = builder.document("foo.tex", "\\begin{foo}\n\\end{bar}");
|
||||
let request = FeatureTester::new(builder.workspace, uri, 0, 5, "baz").into();
|
||||
|
||||
let edit = executor::block_on(LatexEnvironmentRenameProvider::execute(&request));
|
||||
|
||||
assert_eq!(None, edit);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_bibtex() {
|
||||
let mut builder = WorkspaceBuilder::new();
|
||||
let uri = builder.document("foo.bib", "");
|
||||
let request = FeatureTester::new(builder.workspace, uri, 0, 0, "baz").into();
|
||||
|
||||
let edit = executor::block_on(LatexEnvironmentRenameProvider::execute(&request));
|
||||
|
||||
assert_eq!(None, edit);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,2 +1,3 @@
|
|||
mod bibtex_entry;
|
||||
mod latex_command;
|
||||
mod latex_environment;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue