diff options
author | Norbert Preining <norbert@preining.info> | 2021-06-04 03:02:48 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2021-06-04 03:02:48 +0000 |
commit | a5ae129f3aa3a3a0aeaa21c55b75a1d543fe4111 (patch) | |
tree | fe5e1e212aec203e668df8581a17374cdde352a1 /support/texlab/src/syntax/bibtex | |
parent | d231c6331f53a048d29c2f847254a9f56d5ee2dd (diff) |
CTAN sync 202106040302
Diffstat (limited to 'support/texlab/src/syntax/bibtex')
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 |