summaryrefslogtreecommitdiff
path: root/support/texlab/src/rename/mod.rs
blob: 40bf8ce1e1132756c9ca7c6b6b8c9b3541ec8257 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
mod bibtex_entry;
mod latex_cmd;
mod latex_env;
mod latex_label;

use self::{
    bibtex_entry::{BibtexEntryPrepareRenameProvider, BibtexEntryRenameProvider},
    latex_cmd::{LatexCommandPrepareRenameProvider, LatexCommandRenameProvider},
    latex_env::{LatexEnvironmentPrepareRenameProvider, LatexEnvironmentRenameProvider},
    latex_label::{LatexLabelPrepareRenameProvider, LatexLabelRenameProvider},
};
use crate::{
    feature::{ChoiceProvider, FeatureProvider, FeatureRequest},
    protocol::{Range, RenameParams, TextDocumentPositionParams, WorkspaceEdit},
};
use async_trait::async_trait;

pub struct PrepareRenameProvider {
    provider: ChoiceProvider<TextDocumentPositionParams, Range>,
}

impl PrepareRenameProvider {
    pub fn new() -> Self {
        Self {
            provider: ChoiceProvider::new(vec![
                Box::new(BibtexEntryPrepareRenameProvider),
                Box::new(LatexCommandPrepareRenameProvider),
                Box::new(LatexEnvironmentPrepareRenameProvider),
                Box::new(LatexLabelPrepareRenameProvider),
            ]),
        }
    }
}

impl Default for PrepareRenameProvider {
    fn default() -> Self {
        Self::new()
    }
}

#[async_trait]
impl FeatureProvider for PrepareRenameProvider {
    type Params = TextDocumentPositionParams;
    type Output = Option<Range>;

    async fn execute<'a>(
        &'a self,
        req: &'a FeatureRequest<TextDocumentPositionParams>,
    ) -> Option<Range> {
        self.provider.execute(req).await
    }
}

pub struct RenameProvider {
    provider: ChoiceProvider<RenameParams, WorkspaceEdit>,
}

impl RenameProvider {
    pub fn new() -> Self {
        Self {
            provider: ChoiceProvider::new(vec![
                Box::new(BibtexEntryRenameProvider),
                Box::new(LatexCommandRenameProvider),
                Box::new(LatexEnvironmentRenameProvider),
                Box::new(LatexLabelRenameProvider),
            ]),
        }
    }
}

impl Default for RenameProvider {
    fn default() -> Self {
        Self::new()
    }
}

#[async_trait]
impl FeatureProvider for RenameProvider {
    type Params = RenameParams;
    type Output = Option<WorkspaceEdit>;

    async fn execute<'a>(
        &'a self,
        request: &'a FeatureRequest<RenameParams>,
    ) -> Option<WorkspaceEdit> {
        self.provider.execute(request).await
    }
}