summaryrefslogtreecommitdiff
path: root/support/texlab/src/syntax/bibtex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-06-04 03:02:48 +0000
committerNorbert Preining <norbert@preining.info>2021-06-04 03:02:48 +0000
commita5ae129f3aa3a3a0aeaa21c55b75a1d543fe4111 (patch)
treefe5e1e212aec203e668df8581a17374cdde352a1 /support/texlab/src/syntax/bibtex
parentd231c6331f53a048d29c2f847254a9f56d5ee2dd (diff)
CTAN sync 202106040302
Diffstat (limited to 'support/texlab/src/syntax/bibtex')
-rw-r--r--support/texlab/src/syntax/bibtex/cst.rs36
-rw-r--r--support/texlab/src/syntax/bibtex/kind.rs1
-rw-r--r--support/texlab/src/syntax/bibtex/parser.rs14
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap3
-rw-r--r--support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap3
11 files changed, 62 insertions, 13 deletions
diff --git a/support/texlab/src/syntax/bibtex/cst.rs b/support/texlab/src/syntax/bibtex/cst.rs
index 7f824681dc..ba860c1ee7 100644
--- a/support/texlab/src/syntax/bibtex/cst.rs
+++ b/support/texlab/src/syntax/bibtex/cst.rs
@@ -1,4 +1,5 @@
use cstree::TextRange;
+use itertools::{EitherOrBoth, Itertools};
use crate::syntax::CstNode;
@@ -159,15 +160,42 @@ impl<'a> HasType<'a> for Entry<'a> {}
impl<'a> HasDelimiters<'a> for Entry<'a> {}
impl<'a> Entry<'a> {
- pub fn key(&self) -> Option<&'a SyntaxToken> {
+ pub fn key(&self) -> Option<Key<'a>> {
+ self.syntax().children().find_map(Key::cast)
+ }
+
+ pub fn fields(&self) -> impl Iterator<Item = Field<'a>> {
+ self.syntax().children().filter_map(Field::cast)
+ }
+}
+
+cst_node!(Key, KEY);
+
+impl<'a> Key<'a> {
+ pub fn words(&self) -> impl Iterator<Item = &'a SyntaxToken> {
self.syntax()
.children_with_tokens()
.filter_map(|node| node.into_token())
- .find(|node| node.kind() == WORD)
+ .filter(|node| node.kind() == WORD)
}
+}
- pub fn fields(&self) -> impl Iterator<Item = Field<'a>> {
- self.syntax().children().filter_map(Field::cast)
+impl<'a> PartialEq for Key<'a> {
+ fn eq(&self, other: &Self) -> bool {
+ self.words()
+ .zip_longest(other.words())
+ .all(|result| match result {
+ EitherOrBoth::Both(left, right) => left.text() == right.text(),
+ EitherOrBoth::Left(_) | EitherOrBoth::Right(_) => false,
+ })
+ }
+}
+
+impl<'a> Eq for Key<'a> {}
+
+impl<'a> ToString for Key<'a> {
+ fn to_string(&self) -> std::string::String {
+ self.words().map(|word| word.text()).join(" ")
}
}
diff --git a/support/texlab/src/syntax/bibtex/kind.rs b/support/texlab/src/syntax/bibtex/kind.rs
index fcb26b69bd..91f62fd3b8 100644
--- a/support/texlab/src/syntax/bibtex/kind.rs
+++ b/support/texlab/src/syntax/bibtex/kind.rs
@@ -26,6 +26,7 @@ pub enum SyntaxKind {
STRING,
COMMENT,
ENTRY,
+ KEY,
FIELD,
VALUE,
TOKEN,
diff --git a/support/texlab/src/syntax/bibtex/parser.rs b/support/texlab/src/syntax/bibtex/parser.rs
index ffdb1c94a0..6e8c4b3b59 100644
--- a/support/texlab/src/syntax/bibtex/parser.rs
+++ b/support/texlab/src/syntax/bibtex/parser.rs
@@ -174,7 +174,7 @@ impl<'a> Parser<'a> {
self.builder.finish_node();
return;
}
- self.eat();
+ self.key();
while let Some(kind) = self.peek() {
match kind {
@@ -190,6 +190,18 @@ impl<'a> Parser<'a> {
self.builder.finish_node();
}
+ fn key(&mut self) {
+ self.builder.start_node(KEY.into());
+ while self
+ .peek()
+ .filter(|&kind| matches!(kind, WORD | WHITESPACE))
+ .is_some()
+ {
+ self.eat();
+ }
+ self.builder.finish_node();
+ }
+
fn field(&mut self) {
self.builder.start_node(FIELD.into());
self.eat();
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap
index cfd469f161..d86d2fb035 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_complete_parens.snap
@@ -7,7 +7,8 @@ ROOT@0..50
ENTRY@0..50
ENTRY_TYPE@0..8 "@article"
L_PAREN@8..9 "("
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
WHITESPACE@13..14 " "
FIELD@14..32
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap
index a98df7e382..e5df412782 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields.snap
@@ -7,7 +7,8 @@ ROOT@0..14
ENTRY@0..14
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
R_CURLY@13..14 "}"
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap
index b83037aae0..b15c871298 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_no_fields_missing_comma.snap
@@ -7,6 +7,7 @@ ROOT@0..13
ENTRY@0..13
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
R_CURLY@12..13 "}"
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap
index 704cbbbd47..0bd43ac612 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field.snap
@@ -7,7 +7,8 @@ ROOT@0..33
ENTRY@0..33
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
WHITESPACE@13..14 " "
FIELD@14..32
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap
index 8f00c5ee1c..09bb00872f 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_number_key.snap
@@ -7,7 +7,8 @@ ROOT@0..37
ENTRY@0..37
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..16 "foo2021"
+ KEY@9..16
+ WORD@9..16 "foo2021"
COMMA@16..17 ","
WHITESPACE@17..18 " "
FIELD@18..36
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap
index af8b1593df..51adbbc275 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_one_field_trailing_comma.snap
@@ -7,7 +7,8 @@ ROOT@0..34
ENTRY@0..34
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
WHITESPACE@13..14 " "
FIELD@14..32
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap
index f47b3b6917..384d582ef9 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields.snap
@@ -7,7 +7,8 @@ ROOT@0..56
ENTRY@0..56
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
WHITESPACE@13..14 " "
FIELD@14..32
diff --git a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap
index 34a9019582..cbe00beff5 100644
--- a/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap
+++ b/support/texlab/src/syntax/bibtex/snapshots/texlab__syntax__bibtex__parser__tests__entry_two_fields_incomplete.snap
@@ -7,7 +7,8 @@ ROOT@0..36
ENTRY@0..36
ENTRY_TYPE@0..8 "@article"
L_CURLY@8..9 "{"
- WORD@9..12 "foo"
+ KEY@9..12
+ WORD@9..12 "foo"
COMMA@12..13 ","
WHITESPACE@13..14 " "
FIELD@14..32