diff --git a/src/outline.rs b/src/outline.rs index 0a6c2a6b0..a016e6e0f 100644 --- a/src/outline.rs +++ b/src/outline.rs @@ -279,16 +279,16 @@ impl OutlineContext { fn find_theorem( view: &DocumentView, - table: &latex::SymbolTable, + main_table: &latex::SymbolTable, label: latex::Label, ) -> Option { - let label_range = table.tree.range(label.parent); - let env = table + let label_range = main_table.tree.range(label.parent); + let env = main_table .environments .iter() - .find(|env| env.range(&table.tree).contains(label_range.start))?; + .find(|env| env.range(&main_table.tree).contains(label_range.start))?; - let env_name = env.left.name(&table.tree).map(latex::Token::text)?; + let env_name = env.left.name(&main_table.tree).map(latex::Token::text)?; for doc in &view.related { if let DocumentContent::Latex(table) = &doc.content { @@ -303,15 +303,15 @@ impl OutlineContext { ) .unwrap_or_else(|| titlecase(&env_name)); - let description = table.tree.print_group_content( + let description = main_table.tree.print_group_content( env.left.parent, latex::GroupKind::Options, 0, ); return Some(Self { - range: env.range(&table.tree), - number: Self::find_number(view, table, label), + range: env.range(&main_table.tree), + number: Self::find_number(view, main_table, label), item: Theorem { kind, description }, }); } diff --git a/tests/integration/hover.rs b/tests/integration/hover.rs new file mode 100644 index 000000000..319ebcc5e --- /dev/null +++ b/tests/integration/hover.rs @@ -0,0 +1,86 @@ +use indoc::indoc; +use texlab::{ + protocol::{HoverContents, MarkupContent, MarkupKind}, + test::{TestBedBuilder, PULL_CAPABILITIES}, +}; + +#[tokio::test] +async fn label_theorem_child_file() { + let mut test_bed = TestBedBuilder::new() + .file( + "main.tex", + indoc!( + r#" + \documentclass{article} + \newtheorem{lemma}{Lemma} + \include{child} + \ref{thm:foo} + "# + ), + ) + .file( + "child.tex", + indoc!( + r#" + \begin{lemma}\label{thm:foo} + 1 + 1 = 2 + \end{lemma} + "# + ), + ) + .build() + .await; + test_bed.spawn(); + test_bed.initialize(PULL_CAPABILITIES.clone()).await; + test_bed.open("main.tex").await; + + let actual_hover = test_bed.hover("main.tex", 3, 8).await.unwrap().unwrap(); + assert_eq!( + actual_hover.contents, + HoverContents::Markup(MarkupContent { + kind: MarkupKind::PlainText, + value: "Lemma".into() + }) + ); +} + +#[tokio::test] +async fn label_theorem_child_file_number() { + let mut test_bed = TestBedBuilder::new() + .file( + "main.tex", + indoc!( + r#" + \documentclass{article} + \newtheorem{lemma}{Lemma} + \include{child} + \ref{thm:foo} + "# + ), + ) + .file( + "child.tex", + indoc!( + r#" + \begin{lemma}[Foo]\label{thm:foo} + 1 + 1 = 2 + \end{lemma} + "# + ), + ) + .file("child.aux", r#"\newlabel{thm:foo}{{1}{1}{Foo}{lemma.1}{}}"#) + .build() + .await; + test_bed.spawn(); + test_bed.initialize(PULL_CAPABILITIES.clone()).await; + test_bed.open("main.tex").await; + + let actual_hover = test_bed.hover("main.tex", 3, 8).await.unwrap().unwrap(); + assert_eq!( + actual_hover.contents, + HoverContents::Markup(MarkupContent { + kind: MarkupKind::PlainText, + value: "Lemma 1 (Foo)".into() + }) + ); +} diff --git a/tests/integration/main.rs b/tests/integration/main.rs index b96d3e239..99c0b23a5 100644 --- a/tests/integration/main.rs +++ b/tests/integration/main.rs @@ -3,6 +3,7 @@ mod definition; mod document_symbol; mod folding; mod highlight; +mod hover; mod issues; mod link; mod prepare_rename;