summaryrefslogtreecommitdiff
path: root/support/texlab/src/db/analysis.rs
diff options
context:
space:
mode:
Diffstat (limited to 'support/texlab/src/db/analysis.rs')
-rw-r--r--support/texlab/src/db/analysis.rs62
1 files changed, 37 insertions, 25 deletions
diff --git a/support/texlab/src/db/analysis.rs b/support/texlab/src/db/analysis.rs
index 13b5bb1cb3..1f1bd508a8 100644
--- a/support/texlab/src/db/analysis.rs
+++ b/support/texlab/src/db/analysis.rs
@@ -1,6 +1,6 @@
pub mod label;
-use rowan::{ast::AstNode, TextRange};
+use rowan::{ast::AstNode, NodeOrToken, TextRange};
use crate::{
syntax::latex::{self, HasCurly},
@@ -169,30 +169,42 @@ impl TexAnalysis {
let mut command_name_ranges = Vec::new();
let mut environment_names = Vec::new();
- for node in root.descendants() {
- TexLink::of_include(db, node.clone(), &mut links)
- .or_else(|| TexLink::of_import(db, node.clone(), &mut links))
- .or_else(|| label::Name::of_definition(db, node.clone(), &mut labels))
- .or_else(|| label::Name::of_reference(db, node.clone(), &mut labels))
- .or_else(|| label::Name::of_reference_range(db, node.clone(), &mut labels))
- .or_else(|| label::Number::of_number(db, node.clone(), &mut label_numbers))
- .or_else(|| {
- TheoremEnvironment::of_definition(db, node.clone(), &mut theorem_environments)
- })
- .or_else(|| GraphicsPath::of_command(db, node.clone(), &mut graphics_paths))
- .or_else(|| {
- let range = latex::GenericCommand::cast(node.clone())?
- .name()?
- .text_range();
-
- command_name_ranges.push(range);
- Some(())
- })
- .or_else(|| {
- let begin = latex::Begin::cast(node.clone())?;
- environment_names.push(begin.name()?.key()?.to_string());
- Some(())
- });
+ for element in root.descendants_with_tokens() {
+ match element {
+ NodeOrToken::Token(token) if token.kind() == latex::COMMAND_NAME => {
+ command_name_ranges.push(token.text_range());
+ }
+ NodeOrToken::Token(_) => {}
+ NodeOrToken::Node(node) => {
+ TexLink::of_include(db, node.clone(), &mut links)
+ .or_else(|| TexLink::of_import(db, node.clone(), &mut links))
+ .or_else(|| label::Name::of_definition(db, node.clone(), &mut labels))
+ .or_else(|| label::Name::of_reference(db, node.clone(), &mut labels))
+ .or_else(|| label::Name::of_reference_range(db, node.clone(), &mut labels))
+ .or_else(|| label::Number::of_number(db, node.clone(), &mut label_numbers))
+ .or_else(|| {
+ TheoremEnvironment::of_definition(
+ db,
+ node.clone(),
+ &mut theorem_environments,
+ )
+ })
+ .or_else(|| GraphicsPath::of_command(db, node.clone(), &mut graphics_paths))
+ .or_else(|| {
+ let range = latex::GenericCommand::cast(node.clone())?
+ .name()?
+ .text_range();
+
+ command_name_ranges.push(range);
+ Some(())
+ })
+ .or_else(|| {
+ let begin = latex::Begin::cast(node.clone())?;
+ environment_names.push(begin.name()?.key()?.to_string());
+ Some(())
+ });
+ }
+ };
}
Self::new(