summaryrefslogtreecommitdiff
path: root/support/texlab/crates/texlab/src/features/reference.rs
blob: 380471e6cfd8446d60eb23b67b4b643ef345a604 (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
use base_db::{FeatureParams, Workspace};
use references::{ReferenceKind, ReferenceParams};

use crate::util::line_index_ext::LineIndexExt;

pub fn find_all(
    workspace: &Workspace,
    params: lsp_types::ReferenceParams,
) -> Option<Vec<lsp_types::Location>> {
    let uri_and_pos = params.text_document_position;
    let include_declaration = params.context.include_declaration;

    let document = workspace.lookup(&uri_and_pos.text_document.uri)?;
    let offset = document.line_index.offset_lsp(uri_and_pos.position)?;

    let feature = FeatureParams::new(workspace, document);
    let mut results = Vec::new();
    for result in references::find_all(ReferenceParams { feature, offset })
        .into_iter()
        .filter(|result| result.kind == ReferenceKind::Reference || include_declaration)
    {
        let document = result.location.document;
        let uri = document.uri.clone();
        if let Some(range) = document
            .line_index
            .line_col_lsp_range(result.location.range)
        {
            let location = lsp_types::Location::new(uri, range);
            results.push(location);
        }
    }

    Some(results)
}