diff options
Diffstat (limited to 'support/texlab/src/syntax/bibtex/finder.rs')
-rw-r--r-- | support/texlab/src/syntax/bibtex/finder.rs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/support/texlab/src/syntax/bibtex/finder.rs b/support/texlab/src/syntax/bibtex/finder.rs new file mode 100644 index 0000000000..acc46c6f45 --- /dev/null +++ b/support/texlab/src/syntax/bibtex/finder.rs @@ -0,0 +1,110 @@ +use super::ast::*; +use crate::range::RangeExt; +use crate::syntax::text::SyntaxNode; +use lsp_types::Position; + +#[derive(Debug, PartialEq, Eq, Clone, Copy)] +pub enum BibtexNode<'a> { + Root(&'a BibtexRoot), + Preamble(&'a BibtexPreamble), + String(&'a BibtexString), + Entry(&'a BibtexEntry), + Comment(&'a BibtexComment), + Field(&'a BibtexField), + Word(&'a BibtexWord), + Command(&'a BibtexCommand), + QuotedContent(&'a BibtexQuotedContent), + BracedContent(&'a BibtexBracedContent), + Concat(&'a BibtexConcat), +} + +#[derive(Debug)] +pub struct BibtexFinder<'a> { + pub position: Position, + pub results: Vec<BibtexNode<'a>>, +} + +impl<'a> BibtexFinder<'a> { + pub fn new(position: Position) -> Self { + BibtexFinder { + position, + results: Vec::new(), + } + } +} + +impl<'a> BibtexVisitor<'a> for BibtexFinder<'a> { + fn visit_root(&mut self, root: &'a BibtexRoot) { + if root.range().contains(self.position) { + self.results.push(BibtexNode::Root(root)); + BibtexWalker::walk_root(self, root); + } + } + + fn visit_comment(&mut self, comment: &'a BibtexComment) { + if comment.range.contains(self.position) { + self.results.push(BibtexNode::Comment(comment)); + } + } + + fn visit_preamble(&mut self, preamble: &'a BibtexPreamble) { + if preamble.range.contains(self.position) { + self.results.push(BibtexNode::Preamble(preamble)); + BibtexWalker::walk_preamble(self, preamble); + } + } + + fn visit_string(&mut self, string: &'a BibtexString) { + if string.range.contains(self.position) { + self.results.push(BibtexNode::String(string)); + BibtexWalker::walk_string(self, string); + } + } + + fn visit_entry(&mut self, entry: &'a BibtexEntry) { + if entry.range.contains(self.position) { + self.results.push(BibtexNode::Entry(entry)); + BibtexWalker::walk_entry(self, entry); + } + } + + fn visit_field(&mut self, field: &'a BibtexField) { + if field.range.contains(self.position) { + self.results.push(BibtexNode::Field(field)); + BibtexWalker::walk_field(self, field); + } + } + + fn visit_word(&mut self, word: &'a BibtexWord) { + if word.range.contains(self.position) { + self.results.push(BibtexNode::Word(word)); + } + } + + fn visit_command(&mut self, command: &'a BibtexCommand) { + if command.range.contains(self.position) { + self.results.push(BibtexNode::Command(command)); + } + } + + fn visit_quoted_content(&mut self, content: &'a BibtexQuotedContent) { + if content.range.contains(self.position) { + self.results.push(BibtexNode::QuotedContent(content)); + BibtexWalker::walk_quoted_content(self, content); + } + } + + fn visit_braced_content(&mut self, content: &'a BibtexBracedContent) { + if content.range.contains(self.position) { + self.results.push(BibtexNode::BracedContent(content)); + BibtexWalker::walk_braced_content(self, content); + } + } + + fn visit_concat(&mut self, concat: &'a BibtexConcat) { + if concat.range.contains(self.position) { + self.results.push(BibtexNode::Concat(concat)); + BibtexWalker::walk_concat(self, concat); + } + } +} |