diff options
Diffstat (limited to 'support/texlab/src/features/link.rs')
-rw-r--r-- | support/texlab/src/features/link.rs | 54 |
1 files changed, 31 insertions, 23 deletions
diff --git a/support/texlab/src/features/link.rs b/support/texlab/src/features/link.rs index c4ce4413f5..71bba58ba7 100644 --- a/support/texlab/src/features/link.rs +++ b/support/texlab/src/features/link.rs @@ -1,33 +1,41 @@ mod include; -use std::sync::Arc; - -use lsp_types::{DocumentLink, DocumentLinkParams, Url}; +use lsp_types::{DocumentLink, Url}; use rowan::TextRange; -use crate::LineIndexExt; +use crate::{ + db::{Document, Workspace}, + util::{line_index::LineIndex, line_index_ext::LineIndexExt}, + Db, +}; -use self::include::find_include_links; +pub fn find_all(db: &dyn Db, uri: &Url) -> Option<Vec<DocumentLink>> { + let document = Workspace::get(db).lookup_uri(db, uri)?; + let mut builder = LinkBuilder { + db, + line_index: document.contents(db).line_index(db), + links: Vec::new(), + }; -use super::FeatureRequest; + include::find_links(db, document, &mut builder); + Some(builder.links) +} -pub fn find_document_links(request: FeatureRequest<DocumentLinkParams>) -> Vec<DocumentLink> { - let document = request.main_document(); - let mut results = Vec::new(); - find_include_links(&request, &mut results); - results - .into_iter() - .map(|result| DocumentLink { - range: document.line_index.line_col_lsp_range(result.range), - target: Some(result.target.as_ref().clone()), - tooltip: None, - data: None, - }) - .collect() +struct LinkBuilder<'db> { + db: &'db dyn Db, + line_index: &'db LineIndex, + links: Vec<DocumentLink>, } -#[derive(Debug, Clone)] -struct LinkResult { - range: TextRange, - target: Arc<Url>, +impl<'db> LinkBuilder<'db> { + pub fn push(&mut self, range: TextRange, target: Document) { + let range = self.line_index.line_col_lsp_range(range); + let target = Some(target.location(self.db).uri(self.db).clone()); + self.links.push(DocumentLink { + range, + target, + tooltip: None, + data: None, + }); + } } |