Skip to content

Commit

Permalink
Show full path when hovering over includes
Browse files Browse the repository at this point in the history
  • Loading branch information
pfoerster committed Oct 8, 2019
1 parent 78e8da0 commit 62ef2a3
Show file tree
Hide file tree
Showing 2 changed files with 105 additions and 0 deletions.
102 changes: 102 additions & 0 deletions src/hover/latex_include.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
use crate::range::RangeExt;
use crate::syntax::*;
use crate::workspace::*;
use futures_boxed::boxed;
use lsp_types::*;

#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct LatexIncludeHoverProvider;

impl FeatureProvider for LatexIncludeHoverProvider {
type Params = TextDocumentPositionParams;
type Output = Option<Hover>;

#[boxed]
async fn execute<'a>(
&'a self,
request: &'a FeatureRequest<TextDocumentPositionParams>,
) -> Option<Hover> {
let (range, targets) = Self::find_include(request)?;
for target in targets {
if let Some(document) = request.workspace().find(&target) {
let path = document.uri.to_file_path().ok()?;
return Some(Hover {
range: Some(range),
contents: HoverContents::Markup(MarkupContent {
kind: MarkupKind::PlainText,
value: path.to_string_lossy().into_owned(),
}),
});
}
}
None
}
}

impl LatexIncludeHoverProvider {
fn find_include(
request: &FeatureRequest<TextDocumentPositionParams>,
) -> Option<(Range, &[Uri])> {
if let SyntaxTree::Latex(tree) = &request.document().tree {
for include in &tree.includes {
for (i, path) in include.paths().iter().enumerate() {
let range = path.range();
if range.contains(request.params.position) {
return Some((range, &include.all_targets[i]));
}
}
}
}
None
}
}

#[cfg(test)]
mod tests {
use super::*;
use crate::range::RangeExt;

#[test]
fn test_multiple_paths() {
let hover = test_feature(
LatexIncludeHoverProvider,
FeatureSpec {
files: vec![
FeatureSpec::file("foo.tex", "\\include{bar, baz}"),
FeatureSpec::file("bar.tex", ""),
FeatureSpec::file("baz.tex", ""),
],
main_file: "foo.tex",
position: Position::new(0, 16),
..FeatureSpec::default()
},
);

assert_eq!(
hover,
Some(Hover {
contents: HoverContents::Markup(MarkupContent {
kind: MarkupKind::PlainText,
value: FeatureSpec::uri("baz.tex").to_file_path().unwrap().to_string_lossy().into_owned(),
}),
range: Some(Range::new_simple(0, 14, 0, 17)),
})
);
}

#[test]
fn test_empty() {
let hover = test_feature(
LatexIncludeHoverProvider,
FeatureSpec {
files: vec![
FeatureSpec::file("foo.tex", "")
],
main_file: "foo.tex",
position: Position::new(0, 0),
..FeatureSpec::default()
},
);
assert_eq!(hover, None);
}
}
3 changes: 3 additions & 0 deletions src/hover/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ mod bibtex_field;
mod bibtex_string_reference;
mod latex_citation;
mod latex_component;
mod latex_include;
mod latex_label;
mod latex_preview;

Expand All @@ -11,6 +12,7 @@ use self::bibtex_field::BibtexFieldHoverProvider;
use self::bibtex_string_reference::BibtexStringReferenceHoverProvider;
use self::latex_citation::LatexCitationHoverProvider;
use self::latex_component::LatexComponentHoverProvider;
use self::latex_include::LatexIncludeHoverProvider;
use self::latex_label::LatexLabelHoverProvider;
use self::latex_preview::LatexPreviewHoverProvider;
use crate::workspace::*;
Expand All @@ -30,6 +32,7 @@ impl HoverProvider {
Box::new(BibtexFieldHoverProvider),
Box::new(LatexCitationHoverProvider),
Box::new(LatexComponentHoverProvider),
Box::new(LatexIncludeHoverProvider),
Box::new(LatexLabelHoverProvider),
Box::new(LatexPreviewHoverProvider),
]),
Expand Down

0 comments on commit 62ef2a3

Please sign in to comment.