diff options
author | Norbert Preining <norbert@preining.info> | 2019-12-03 03:01:24 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-12-03 03:01:24 +0000 |
commit | b8d4bb76703bcb15578e2b23c5d256532180b894 (patch) | |
tree | bedd1df7a00521a2bd986b3c0289d6556a59e39b /support/texlab/src/folding/latex_environment.rs | |
parent | 02e4625a78a5029e8b5dc2a4ec70193b232f497e (diff) |
CTAN sync 201912030301
Diffstat (limited to 'support/texlab/src/folding/latex_environment.rs')
-rw-r--r-- | support/texlab/src/folding/latex_environment.rs | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/support/texlab/src/folding/latex_environment.rs b/support/texlab/src/folding/latex_environment.rs new file mode 100644 index 0000000000..853ece7a09 --- /dev/null +++ b/support/texlab/src/folding/latex_environment.rs @@ -0,0 +1,74 @@ +use crate::syntax::*; +use crate::workspace::*; +use futures_boxed::boxed; +use lsp_types::{FoldingRange, FoldingRangeKind, FoldingRangeParams}; + +#[derive(Debug, PartialEq, Eq, Clone)] +pub struct LatexEnvironmentFoldingProvider; + +impl FeatureProvider for LatexEnvironmentFoldingProvider { + type Params = FoldingRangeParams; + type Output = Vec<FoldingRange>; + + #[boxed] + async fn execute<'a>( + &'a self, + request: &'a FeatureRequest<FoldingRangeParams>, + ) -> Vec<FoldingRange> { + let mut foldings = Vec::new(); + if let SyntaxTree::Latex(tree) = &request.document().tree { + for environment in &tree.env.environments { + let start = environment.left.command.end(); + let end = environment.right.command.start(); + foldings.push(FoldingRange { + start_line: start.line, + start_character: Some(start.character), + end_line: end.line, + end_character: Some(end.character), + kind: Some(FoldingRangeKind::Region), + }) + } + } + foldings + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_multiline() { + let foldings = test_feature( + LatexEnvironmentFoldingProvider, + FeatureSpec { + files: vec![FeatureSpec::file("foo.tex", "\\begin{foo}\n\\end{foo}")], + main_file: "foo.tex", + ..FeatureSpec::default() + }, + ); + assert_eq!( + foldings, + vec![FoldingRange { + start_line: 0, + start_character: Some(11), + end_line: 1, + end_character: Some(0), + kind: Some(FoldingRangeKind::Region), + }] + ); + } + + #[test] + fn test_bibtex() { + let foldings = test_feature( + LatexEnvironmentFoldingProvider, + FeatureSpec { + files: vec![FeatureSpec::file("foo.bib", "@article{foo, bar = baz}")], + main_file: "foo.bib", + ..FeatureSpec::default() + }, + ); + assert!(foldings.is_empty()); + } +} |