summaryrefslogtreecommitdiff
path: root/support
diff options
context:
space:
mode:
Diffstat (limited to 'support')
-rw-r--r--support/texlab/CHANGELOG.md12
-rw-r--r--support/texlab/Cargo.lock527
-rw-r--r--support/texlab/crates/base-db/Cargo.toml11
-rw-r--r--support/texlab/crates/base-db/src/document.rs40
-rw-r--r--support/texlab/crates/base-db/src/graph.rs5
-rw-r--r--support/texlab/crates/base-db/src/util.rs2
-rw-r--r--support/texlab/crates/base-db/src/workspace.rs72
-rw-r--r--support/texlab/crates/bibfmt/Cargo.toml19
-rw-r--r--support/texlab/crates/bibfmt/src/lib.rs193
-rw-r--r--support/texlab/crates/bibfmt/src/tests.rs144
-rw-r--r--support/texlab/crates/bibtex-utils/Cargo.toml4
-rw-r--r--support/texlab/crates/citeproc/Cargo.toml6
-rw-r--r--support/texlab/crates/commands/Cargo.toml12
-rw-r--r--support/texlab/crates/commands/src/clean.rs11
-rw-r--r--support/texlab/crates/commands/src/fwd_search.rs3
-rw-r--r--support/texlab/crates/completion-data/Cargo.toml8
-rw-r--r--support/texlab/crates/completion/Cargo.toml9
-rw-r--r--support/texlab/crates/completion/benches/bench_main.rs3
-rw-r--r--support/texlab/crates/definition/Cargo.toml4
-rw-r--r--support/texlab/crates/definition/src/citation.rs5
-rw-r--r--support/texlab/crates/definition/src/command.rs5
-rw-r--r--support/texlab/crates/definition/src/include.rs7
-rw-r--r--support/texlab/crates/definition/src/label.rs7
-rw-r--r--support/texlab/crates/definition/src/lib.rs16
-rw-r--r--support/texlab/crates/definition/src/string_ref.rs5
-rw-r--r--support/texlab/crates/definition/src/tests.rs35
-rw-r--r--support/texlab/crates/diagnostics/Cargo.toml7
-rw-r--r--support/texlab/crates/diagnostics/src/build_log.rs22
-rw-r--r--support/texlab/crates/diagnostics/src/citations.rs3
-rw-r--r--support/texlab/crates/diagnostics/src/tests.rs4
-rw-r--r--support/texlab/crates/distro/src/language.rs5
-rw-r--r--support/texlab/crates/folding/Cargo.toml2
-rw-r--r--support/texlab/crates/folding/src/tests.rs3
-rw-r--r--support/texlab/crates/highlights/Cargo.toml18
-rw-r--r--support/texlab/crates/highlights/src/label.rs26
-rw-r--r--support/texlab/crates/highlights/src/lib.rs31
-rw-r--r--support/texlab/crates/highlights/src/tests.rs41
-rw-r--r--support/texlab/crates/hover/Cargo.toml2
-rw-r--r--support/texlab/crates/hover/src/citation.rs12
-rw-r--r--support/texlab/crates/hover/src/entry_type.rs4
-rw-r--r--support/texlab/crates/hover/src/field_type.rs4
-rw-r--r--support/texlab/crates/hover/src/label.rs9
-rw-r--r--support/texlab/crates/hover/src/lib.rs34
-rw-r--r--support/texlab/crates/hover/src/package.rs4
-rw-r--r--support/texlab/crates/hover/src/string_ref.rs4
-rw-r--r--support/texlab/crates/hover/src/tests.rs9
-rw-r--r--support/texlab/crates/inlay-hints/Cargo.toml4
-rw-r--r--support/texlab/crates/inlay-hints/src/lib.rs3
-rw-r--r--support/texlab/crates/inlay-hints/src/tests.rs108
-rw-r--r--support/texlab/crates/line-index/Cargo.toml14
-rw-r--r--support/texlab/crates/line-index/src/lib.rs (renamed from support/texlab/crates/base-db/src/util/line_index.rs)18
-rw-r--r--support/texlab/crates/links/Cargo.toml17
-rw-r--r--support/texlab/crates/links/src/include.rs26
-rw-r--r--support/texlab/crates/links/src/lib.rs12
-rw-r--r--support/texlab/crates/links/src/tests.rs57
-rw-r--r--support/texlab/crates/parser/Cargo.toml7
-rw-r--r--support/texlab/crates/parser/src/bibtex.rs15
-rw-r--r--support/texlab/crates/parser/src/bibtex/tests.rs3994
-rw-r--r--support/texlab/crates/parser/src/build_log.rs12
-rw-r--r--support/texlab/crates/parser/src/build_log/tests.rs1228
-rw-r--r--support/texlab/crates/parser/src/latex.rs17
-rw-r--r--support/texlab/crates/parser/src/latex/tests.rs3523
-rw-r--r--support/texlab/crates/parser/src/latexmkrc.rs52
-rw-r--r--support/texlab/crates/parser/src/lib.rs6
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap32
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_945.txt.snap27
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap17
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap132
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap258
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap246
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap351
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap208
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap223
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap251
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap239
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap267
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap302
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap320
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap176
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap368
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap232
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap27
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap25
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap31
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap69
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap25
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap21
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap13
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap14
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap25
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap17
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap29
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap33
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap23
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap18
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap38
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap14
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap13
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap29
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap25
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap39
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap14
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap41
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap40
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap35
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap41
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap42
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap29
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap17
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap32
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap50
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap47
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap29
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap34
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap33
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap18
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap23
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap23
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap14
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap32
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap18
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap12
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap12
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap12
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap31
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap13
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap38
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap31
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap14
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap17
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap13
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap38
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap26
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_568.txt.snap28
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap131
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_828.txt.snap22
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap62
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap33
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap28
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_919.txt.snap61
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_931.txt.snap16
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap23
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap32
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap19
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap10
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__paragraphs.txt.snap67
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap47
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap23
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap57
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap29
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap30
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap20
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap25
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap15
-rw-r--r--support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_thmtools.txt.snap35
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/comment.txt6
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt3
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/issue_945.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/preamble.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt8
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt16
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt14
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt21
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt16
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt20
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt16
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt14
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt18
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt20
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt22
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt14
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt24
-rw-r--r--support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt17
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/001.txt83
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/002.txt64
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/003.txt65
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/004.txt83
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/005.txt385
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/006.txt122
-rw-r--r--support/texlab/crates/parser/src/test_data/build_log/007.txt176
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/block_comments.txt9
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt3
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/equation.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/hello_world.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/inline.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_568.txt2
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_745.txt21
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_789.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_828.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_853.txt8
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_857.txt3
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_874.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_919.txt11
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/issue_931.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt2
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_number.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/parameter.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/parameter_error.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/paragraphs.txt11
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt1
-rw-r--r--support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_thmtools.txt1
-rw-r--r--support/texlab/crates/references/Cargo.toml2
-rw-r--r--support/texlab/crates/references/src/entry.rs15
-rw-r--r--support/texlab/crates/references/src/label.rs9
-rw-r--r--support/texlab/crates/references/src/lib.rs23
-rw-r--r--support/texlab/crates/references/src/string_def.rs9
-rw-r--r--support/texlab/crates/references/src/tests.rs25
-rw-r--r--support/texlab/crates/rename/Cargo.toml2
-rw-r--r--support/texlab/crates/rename/src/command.rs4
-rw-r--r--support/texlab/crates/rename/src/entry.rs4
-rw-r--r--support/texlab/crates/rename/src/label.rs4
-rw-r--r--support/texlab/crates/rename/src/lib.rs16
-rw-r--r--support/texlab/crates/rename/src/tests.rs20
-rw-r--r--support/texlab/crates/symbols/Cargo.toml9
-rw-r--r--support/texlab/crates/symbols/src/document.rs1
-rw-r--r--support/texlab/crates/symbols/src/workspace/sort.rs3
-rw-r--r--support/texlab/crates/symbols/src/workspace/tests.rs10
-rw-r--r--support/texlab/crates/syntax/Cargo.toml4
-rw-r--r--support/texlab/crates/syntax/src/latexmkrc.rs5
-rw-r--r--support/texlab/crates/syntax/src/lib.rs1
-rw-r--r--support/texlab/crates/test-utils/Cargo.toml5
-rw-r--r--support/texlab/crates/test-utils/src/fixture.rs46
-rw-r--r--support/texlab/crates/texlab/Cargo.toml25
-rw-r--r--support/texlab/crates/texlab/benches/bench_main.rs5
-rw-r--r--support/texlab/crates/texlab/src/features/completion.rs18
-rw-r--r--support/texlab/crates/texlab/src/features/definition.rs57
-rw-r--r--support/texlab/crates/texlab/src/features/folding.rs40
-rw-r--r--support/texlab/crates/texlab/src/features/formatting.rs6
-rw-r--r--support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs199
-rw-r--r--support/texlab/crates/texlab/src/features/formatting/latexindent.rs2
-rw-r--r--support/texlab/crates/texlab/src/features/highlight.rs25
-rw-r--r--support/texlab/crates/texlab/src/features/highlight/label.rs37
-rw-r--r--support/texlab/crates/texlab/src/features/hover.rs19
-rw-r--r--support/texlab/crates/texlab/src/features/inlay_hint.rs4
-rw-r--r--support/texlab/crates/texlab/src/features/inlay_hint/label.rs41
-rw-r--r--support/texlab/crates/texlab/src/features/link.rs40
-rw-r--r--support/texlab/crates/texlab/src/features/link/include.rs22
-rw-r--r--support/texlab/crates/texlab/src/features/reference.rs35
-rw-r--r--support/texlab/crates/texlab/src/features/rename.rs19
-rw-r--r--support/texlab/crates/texlab/src/features/symbols.rs21
-rw-r--r--support/texlab/crates/texlab/src/server.rs43
-rw-r--r--support/texlab/crates/texlab/src/util/diagnostics.rs15
-rw-r--r--support/texlab/crates/texlab/src/util/line_index_ext.rs44
-rw-r--r--support/texlab/crates/texlab/tests/lsp/fixture.rs271
-rw-r--r--support/texlab/crates/texlab/tests/lsp/main.rs3
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document.rs5
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs51
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs52
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs45
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs135
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs57
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap16
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap10
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap21
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_883.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_885.snap18
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap36
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap31
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap26
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap11
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap16
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap19
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap19
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__smoke.snap103
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap7
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap7
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap7
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap15
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap6
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap5
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap5
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap7
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap9
-rw-r--r--support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap38
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace.rs1
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__smoke.snap78
-rw-r--r--support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs48
-rw-r--r--support/texlab/texlab.14
-rw-r--r--support/texlab/texlab.pdfbin26718 -> 26374 bytes
479 files changed, 10233 insertions, 11604 deletions
diff --git a/support/texlab/CHANGELOG.md b/support/texlab/CHANGELOG.md
index f36aed1950..a8bae12b05 100644
--- a/support/texlab/CHANGELOG.md
+++ b/support/texlab/CHANGELOG.md
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [5.12.0] - 2023-12-03
+
+### Added
+
+- Infer `texlab.build.auxDirectory`, `texlab.build.logDirectory` and `texlab.build.pdfDirectory` from `latexmkrc` if available ([#907](https://github.com/latex-lsp/texlab/issues/907))
+
+### Fixed
+
+- Do not report `undefined reference` errors when using `\nocite{*}` ([#964](https://github.com/latex-lsp/texlab/issues/964))
+- Fix potential crash when parsing build log files ([#973](https://github.com/latex-lsp/texlab/issues/973))
+- Set the final tab stop of the `\begin` snippet inside the environment ([#963](https://github.com/latex-lsp/texlab/issues/963))
+
## [5.11.0] - 2023-11-05
### Added
diff --git a/support/texlab/Cargo.lock b/support/texlab/Cargo.lock
index 1b4136224c..347193badd 100644
--- a/support/texlab/Cargo.lock
+++ b/support/texlab/Cargo.lock
@@ -24,19 +24,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
[[package]]
-name = "ansi_term"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
-dependencies = [
- "winapi",
-]
-
-[[package]]
name = "anstream"
-version = "0.5.0"
+version = "0.6.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c"
+checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -67,17 +58,17 @@ version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
name = "anstyle-wincon"
-version = "2.1.0"
+version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd"
+checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628"
dependencies = [
"anstyle",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -87,15 +78,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
[[package]]
-name = "assert_unordered"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1c74323b7881323eb351134e08ee5331594826789557afef8e309baf481b2264"
-dependencies = [
- "ansi_term",
-]
-
-[[package]]
name = "autocfg"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -108,7 +90,8 @@ dependencies = [
"bibtex-utils",
"dirs",
"distro",
- "itertools 0.11.0",
+ "itertools 0.12.0",
+ "line-index",
"log",
"notify",
"once_cell",
@@ -128,13 +111,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3a8241f3ebb85c056b509d4327ad0358fbbba6ffb340bf388f26350aeda225b1"
[[package]]
+name = "bibfmt"
+version = "0.0.0"
+dependencies = [
+ "expect-test",
+ "line-index",
+ "parser",
+ "rowan",
+ "syntax",
+]
+
+[[package]]
name = "bibtex-utils"
version = "0.0.0"
dependencies = [
"chrono",
"expect-test",
"human_name",
- "itertools 0.11.0",
+ "itertools 0.12.0",
"parser",
"rowan",
"rustc-hash",
@@ -155,19 +149,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
name = "bstr"
-version = "1.6.2"
+version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a"
+checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
dependencies = [
"memchr",
"regex-automata",
@@ -244,7 +229,7 @@ dependencies = [
"bibtex-utils",
"expect-test",
"isocountry",
- "itertools 0.11.0",
+ "itertools 0.12.0",
"parser",
"rowan",
"rustc-hash",
@@ -256,9 +241,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.4.4"
+version = "4.4.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1d7b8d5ec32af0fadc644bf1fd509a688c2103b185644bb1e29d164e0703136"
+checksum = "41fffed7514f420abec6d183b1d3acfd9099c79c3a10a06ade4f8203f1411272"
dependencies = [
"clap_builder",
"clap_derive",
@@ -266,9 +251,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.4.4"
+version = "4.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5179bb514e4d7c2051749d8fcefa2ed6d06a9f4e6d69faf3805f5d80b8cf8d56"
+checksum = "63361bae7eef3771745f02d8d892bec2fee5f6e34af316ba556e7f97a7069ff1"
dependencies = [
"anstream",
"anstyle",
@@ -278,9 +263,9 @@ dependencies = [
[[package]]
name = "clap_derive"
-version = "4.4.2"
+version = "4.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873"
+checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442"
dependencies = [
"heck",
"proc-macro2",
@@ -290,9 +275,9 @@ dependencies = [
[[package]]
name = "clap_lex"
-version = "0.5.1"
+version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961"
+checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1"
[[package]]
name = "colorchoice"
@@ -310,7 +295,7 @@ dependencies = [
"crossbeam-channel",
"distro",
"expect-test",
- "itertools 0.11.0",
+ "itertools 0.12.0",
"libc",
"log",
"rowan",
@@ -331,8 +316,7 @@ dependencies = [
"distro",
"expect-test",
"fuzzy-matcher",
- "itertools 0.11.0",
- "log",
+ "line-index",
"rayon",
"rowan",
"rustc-hash",
@@ -346,7 +330,7 @@ name = "completion-data"
version = "0.0.0"
dependencies = [
"flate2",
- "itertools 0.11.0",
+ "itertools 0.12.0",
"once_cell",
"rustc-hash",
"serde",
@@ -354,33 +338,12 @@ dependencies = [
]
[[package]]
-name = "console"
-version = "0.15.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8"
-dependencies = [
- "encode_unicode",
- "lazy_static",
- "libc",
- "windows-sys 0.45.0",
-]
-
-[[package]]
name = "countme"
version = "3.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636"
[[package]]
-name = "cpufeatures"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1"
-dependencies = [
- "libc",
-]
-
-[[package]]
name = "crc32fast"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -455,7 +418,7 @@ dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
- "memoffset 0.9.0",
+ "memoffset",
"scopeguard",
]
@@ -469,21 +432,11 @@ dependencies = [
]
[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
name = "definition"
version = "0.0.0"
dependencies = [
"base-db",
- "itertools 0.11.0",
+ "itertools 0.12.0",
"rowan",
"rustc-hash",
"syntax",
@@ -495,7 +448,8 @@ name = "diagnostics"
version = "0.0.0"
dependencies = [
"base-db",
- "itertools 0.11.0",
+ "itertools 0.12.0",
+ "line-index",
"rowan",
"rustc-hash",
"syntax",
@@ -504,16 +458,6 @@ dependencies = [
]
[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
-]
-
-[[package]]
name = "dirs"
version = "5.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -531,7 +475,7 @@ dependencies = [
"libc",
"option-ext",
"redox_users",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -555,12 +499,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
[[package]]
-name = "encode_unicode"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
-
-[[package]]
name = "encoding_rs"
version = "0.8.33"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -586,7 +524,7 @@ checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd"
dependencies = [
"errno-dragonfly",
"libc",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -630,7 +568,7 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6584280525fb2059cba3db2c04abf947a1a29a45ddae89f3870f8281704fafc9"
dependencies = [
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -642,14 +580,14 @@ dependencies = [
"cfg-if",
"libc",
"redox_syscall 0.3.5",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
name = "flate2"
-version = "1.0.27"
+version = "1.0.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6c98ee8095e9d1dcbf2fcc6d95acccb90d1c81db1e44725c6a984b1dbdfb010"
+checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -674,9 +612,9 @@ dependencies = [
[[package]]
name = "form_urlencoded"
-version = "1.2.0"
+version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652"
+checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
dependencies = [
"percent-encoding",
]
@@ -700,16 +638,6 @@ dependencies = [
]
[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
name = "getrandom"
version = "0.2.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -721,19 +649,6 @@ dependencies = [
]
[[package]]
-name = "globset"
-version = "0.4.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
-dependencies = [
- "aho-corasick",
- "bstr",
- "fnv",
- "log",
- "regex",
-]
-
-[[package]]
name = "half"
version = "1.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -758,6 +673,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
[[package]]
+name = "highlights"
+version = "0.0.0"
+dependencies = [
+ "base-db",
+ "expect-test",
+ "rowan",
+ "test-utils",
+]
+
+[[package]]
name = "hover"
version = "0.0.0"
dependencies = [
@@ -792,9 +717,9 @@ dependencies = [
[[package]]
name = "idna"
-version = "0.3.0"
+version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
dependencies = [
"unicode-bidi",
"unicode-normalization",
@@ -805,9 +730,9 @@ name = "inlay-hints"
version = "0.0.0"
dependencies = [
"base-db",
+ "expect-test",
"rowan",
"rustc-hash",
- "syntax",
"test-utils",
]
@@ -832,24 +757,6 @@ dependencies = [
]
[[package]]
-name = "insta"
-version = "1.32.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3e02c584f4595792d09509a94cdb92a3cef7592b1eb2d9877ee6f527062d0ea"
-dependencies = [
- "console",
- "globset",
- "lazy_static",
- "linked-hash-map",
- "pest",
- "pest_derive",
- "serde",
- "similar",
- "walkdir",
- "yaml-rust",
-]
-
-[[package]]
name = "is-terminal"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -857,7 +764,7 @@ checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b"
dependencies = [
"hermit-abi",
"rustix",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -881,9 +788,9 @@ dependencies = [
[[package]]
name = "itertools"
-version = "0.11.0"
+version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
+checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0"
dependencies = [
"either",
]
@@ -937,21 +844,32 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.148"
+version = "0.2.150"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9cdc71e17332e86d2e1d38c1f99edcb6288ee11b815fb1a4b049eaa2114d369b"
+checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
[[package]]
-name = "linked-hash-map"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+name = "line-index"
+version = "0.0.0"
+dependencies = [
+ "rustc-hash",
+ "text-size",
+]
+
+[[package]]
+name = "links"
+version = "0.0.0"
+dependencies = [
+ "base-db",
+ "expect-test",
+ "test-utils",
+]
[[package]]
name = "linux-raw-sys"
-version = "0.4.7"
+version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128"
+checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829"
[[package]]
name = "lock_api"
@@ -1034,15 +952,6 @@ checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c"
[[package]]
name = "memoffset"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "memoffset"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
@@ -1068,7 +977,7 @@ dependencies = [
"libc",
"log",
"wasi",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1087,7 +996,7 @@ dependencies = [
"log",
"mio",
"walkdir",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1161,72 +1070,28 @@ dependencies = [
"libc",
"redox_syscall 0.3.5",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-targets",
]
[[package]]
name = "parser"
version = "0.0.0"
dependencies = [
- "insta",
+ "expect-test",
"logos",
"once_cell",
"regex",
"rowan",
"rustc-hash",
"syntax",
+ "tempfile",
]
[[package]]
name = "percent-encoding"
-version = "2.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94"
-
-[[package]]
-name = "pest"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33"
-dependencies = [
- "memchr",
- "thiserror",
- "ucd-trie",
-]
-
-[[package]]
-name = "pest_derive"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a"
-dependencies = [
- "pest",
- "pest_generator",
-]
-
-[[package]]
-name = "pest_generator"
-version = "2.7.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141"
-dependencies = [
- "pest",
- "pest_meta",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "pest_meta"
-version = "2.7.3"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f"
-dependencies = [
- "once_cell",
- "pest",
- "sha2",
-]
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
[[package]]
name = "phf"
@@ -1366,6 +1231,15 @@ dependencies = [
]
[[package]]
+name = "redox_syscall"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
name = "redox_users"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1388,25 +1262,25 @@ dependencies = [
[[package]]
name = "regex"
-version = "1.9.5"
+version = "1.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47"
+checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
- "regex-syntax 0.7.5",
+ "regex-syntax 0.8.2",
]
[[package]]
name = "regex-automata"
-version = "0.3.8"
+version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795"
+checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
dependencies = [
"aho-corasick",
"memchr",
- "regex-syntax 0.7.5",
+ "regex-syntax 0.8.2",
]
[[package]]
@@ -1417,9 +1291,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
[[package]]
name = "regex-syntax"
-version = "0.7.5"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
name = "rename"
@@ -1434,13 +1308,13 @@ dependencies = [
[[package]]
name = "rowan"
-version = "0.15.11"
+version = "0.15.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64449cfef9483a475ed56ae30e2da5ee96448789fb2aa240a04beb6a055078bf"
+checksum = "906057e449592587bf6724f00155bf82a6752c868d78a8fb3aa41f4e6357cfe8"
dependencies = [
"countme",
"hashbrown",
- "memoffset 0.8.0",
+ "memoffset",
"rustc-hash",
"text-size",
]
@@ -1453,15 +1327,15 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
-version = "0.38.14"
+version = "0.38.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "747c788e9ce8e92b12cd485c49ddf90723550b654b32508f979b71a7b1ecda4f"
+checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3"
dependencies = [
"bitflags 2.4.0",
"errno",
"libc",
"linux-raw-sys",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1487,18 +1361,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
-version = "1.0.188"
+version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e"
+checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.188"
+version = "1.0.193"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2"
+checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
dependencies = [
"proc-macro2",
"quote",
@@ -1507,9 +1381,9 @@ dependencies = [
[[package]]
name = "serde_json"
-version = "1.0.107"
+version = "1.0.108"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65"
+checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
dependencies = [
"itoa",
"ryu",
@@ -1528,9 +1402,9 @@ dependencies = [
[[package]]
name = "serde_repr"
-version = "0.1.16"
+version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8725e1dfadb3a50f7e5ce0b1a540466f6ed3fe7a0fca2ac2b8b831d31316bd00"
+checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
dependencies = [
"proc-macro2",
"quote",
@@ -1538,23 +1412,6 @@ dependencies = [
]
[[package]]
-name = "sha2"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "similar"
-version = "2.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf"
-
-[[package]]
name = "siphasher"
version = "0.3.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1588,7 +1445,8 @@ dependencies = [
"base-db",
"distro",
"expect-test",
- "itertools 0.11.0",
+ "itertools 0.12.0",
+ "line-index",
"regex",
"rowan",
"syntax",
@@ -1612,21 +1470,21 @@ dependencies = [
name = "syntax"
version = "0.0.0"
dependencies = [
- "itertools 0.11.0",
+ "itertools 0.12.0",
"rowan",
]
[[package]]
name = "tempfile"
-version = "3.8.0"
+version = "3.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef"
+checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5"
dependencies = [
"cfg-if",
"fastrand",
- "redox_syscall 0.3.5",
+ "redox_syscall 0.4.1",
"rustix",
- "windows-sys 0.48.0",
+ "windows-sys",
]
[[package]]
@@ -1635,17 +1493,18 @@ version = "0.0.0"
dependencies = [
"base-db",
"distro",
+ "line-index",
"rowan",
"url",
]
[[package]]
name = "texlab"
-version = "5.11.0"
+version = "5.12.0"
dependencies = [
"anyhow",
- "assert_unordered",
"base-db",
+ "bibfmt",
"citeproc",
"clap",
"commands",
@@ -1660,11 +1519,11 @@ dependencies = [
"encoding_rs_io",
"fern",
"folding",
- "fuzzy-matcher",
+ "highlights",
"hover",
"inlay-hints",
- "insta",
- "itertools 0.11.0",
+ "line-index",
+ "links",
"log",
"lsp-server",
"lsp-types",
@@ -1673,7 +1532,6 @@ dependencies = [
"once_cell",
"parking_lot",
"parser",
- "rayon",
"references",
"regex",
"rename",
@@ -1697,18 +1555,18 @@ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233"
[[package]]
name = "thiserror"
-version = "1.0.48"
+version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7"
+checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.48"
+version = "1.0.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35"
+checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
dependencies = [
"proc-macro2",
"quote",
@@ -1771,18 +1629,6 @@ dependencies = [
]
[[package]]
-name = "typenum"
-version = "1.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
-
-[[package]]
-name = "ucd-trie"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
-
-[[package]]
name = "unicode-bidi"
version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1823,9 +1669,9 @@ checksum = "402bb19d8e03f1d1a7450e2bd613980869438e0666331be3e073089124aa1adc"
[[package]]
name = "url"
-version = "2.3.1"
+version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
dependencies = [
"form_urlencoded",
"idna",
@@ -1840,12 +1686,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
name = "walkdir"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1958,35 +1798,11 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
-version = "0.45.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
-dependencies = [
- "windows-targets 0.42.2",
-]
-
-[[package]]
-name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
-dependencies = [
- "windows_aarch64_gnullvm 0.42.2",
- "windows_aarch64_msvc 0.42.2",
- "windows_i686_gnu 0.42.2",
- "windows_i686_msvc 0.42.2",
- "windows_x86_64_gnu 0.42.2",
- "windows_x86_64_gnullvm 0.42.2",
- "windows_x86_64_msvc 0.42.2",
+ "windows-targets",
]
[[package]]
@@ -1995,104 +1811,53 @@ version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
+ "windows_aarch64_gnullvm",
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_gnullvm",
+ "windows_x86_64_msvc",
]
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
-
-[[package]]
-name = "windows_aarch64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_i686_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
-
-[[package]]
-name = "windows_i686_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
-
-[[package]]
-name = "windows_i686_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
-
-[[package]]
-name = "windows_x86_64_gnu"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.42.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
-
-[[package]]
-name = "windows_x86_64_msvc"
version = "0.48.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "yaml-rust"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
-dependencies = [
- "linked-hash-map",
-]
diff --git a/support/texlab/crates/base-db/Cargo.toml b/support/texlab/crates/base-db/Cargo.toml
index b440ff5c61..f5e2c07829 100644
--- a/support/texlab/crates/base-db/Cargo.toml
+++ b/support/texlab/crates/base-db/Cargo.toml
@@ -7,20 +7,21 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
+bibtex-utils = { path = "../bibtex-utils" }
dirs = "5.0.1"
distro = { path = "../distro" }
-itertools = "0.11.0"
+itertools = "0.12.0"
+line-index = { path = "../line-index" }
log = "0.4.20"
notify = "6.0.1"
once_cell = "1.18.0"
parser = { path = "../parser" }
percent-encoding = "2.3.0"
-regex = "1.9.5"
-rowan = "0.15.11"
+regex = "1.10.2"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
-url = "=2.3.1"
-bibtex-utils = { path = "../bibtex-utils" }
+url = "2.5.0"
[lib]
doctest = false
diff --git a/support/texlab/crates/base-db/src/document.rs b/support/texlab/crates/base-db/src/document.rs
index 8642694811..9f45876d7e 100644
--- a/support/texlab/crates/base-db/src/document.rs
+++ b/support/texlab/crates/base-db/src/document.rs
@@ -1,15 +1,12 @@
use std::path::PathBuf;
use distro::Language;
+use line_index::{LineCol, LineIndex};
use rowan::TextRange;
-use syntax::{bibtex, latex, BuildError};
+use syntax::{bibtex, latex, latexmkrc::LatexmkrcData, BuildError};
use url::Url;
-use crate::{
- semantics,
- util::{LineCol, LineIndex},
- Config,
-};
+use crate::{semantics, Config};
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
pub enum Owner {
@@ -78,6 +75,10 @@ impl Document {
DocumentData::Log(LogDocumentData { errors })
}
Language::Root => DocumentData::Root,
+ Language::Latexmkrc => {
+ let data = parser::parse_latexmkrc(&text).unwrap_or_default();
+ DocumentData::Latexmkrc(data)
+ }
Language::Tectonic => DocumentData::Tectonic,
};
@@ -134,6 +135,7 @@ pub enum DocumentData {
Aux(AuxDocumentData),
Log(LogDocumentData),
Root,
+ Latexmkrc(LatexmkrcData),
Tectonic,
}
@@ -169,6 +171,14 @@ impl DocumentData {
None
}
}
+
+ pub fn as_latexmkrc(&self) -> Option<&LatexmkrcData> {
+ if let DocumentData::Latexmkrc(data) = self {
+ Some(data)
+ } else {
+ None
+ }
+ }
}
#[derive(Debug, Clone)]
@@ -216,4 +226,22 @@ impl<'a> DocumentLocation<'a> {
pub fn new(document: &'a Document, range: TextRange) -> Self {
Self { document, range }
}
+
+ fn eq_key(&self) -> (&Url, TextRange) {
+ (&self.document.uri, self.range)
+ }
+}
+
+impl<'a> PartialEq for DocumentLocation<'a> {
+ fn eq(&self, other: &Self) -> bool {
+ self.eq_key() == other.eq_key()
+ }
+}
+
+impl<'a> Eq for DocumentLocation<'a> {}
+
+impl<'a> std::hash::Hash for DocumentLocation<'a> {
+ fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
+ self.eq_key().hash(state)
+ }
}
diff --git a/support/texlab/crates/base-db/src/graph.rs b/support/texlab/crates/base-db/src/graph.rs
index 46b9038de8..088e0828b7 100644
--- a/support/texlab/crates/base-db/src/graph.rs
+++ b/support/texlab/crates/base-db/src/graph.rs
@@ -138,9 +138,8 @@ impl<'a> Graph<'a> {
fn add_implicit_edges(&mut self, source: &'a Document, base_dir: &Url) {
if source.language == Language::Tex {
- let config = &self.workspace.config().build;
- let aux_dir = self.workspace.output_dir(base_dir, config.aux_dir.clone());
- let log_dir = self.workspace.output_dir(base_dir, config.log_dir.clone());
+ let aux_dir = self.workspace.aux_dir(base_dir);
+ let log_dir = self.workspace.log_dir(base_dir);
let relative_path = base_dir.make_relative(&source.uri).unwrap();
diff --git a/support/texlab/crates/base-db/src/util.rs b/support/texlab/crates/base-db/src/util.rs
index 6d6d6897a6..068a0c9b2a 100644
--- a/support/texlab/crates/base-db/src/util.rs
+++ b/support/texlab/crates/base-db/src/util.rs
@@ -1,10 +1,8 @@
mod label;
-mod line_index;
pub mod queries;
mod regex_filter;
pub use self::{
label::{render_label, FloatKind, RenderedLabel, RenderedObject},
- line_index::{LineCol, LineColUtf16, LineIndex},
regex_filter::filter_regex_patterns,
};
diff --git a/support/texlab/crates/base-db/src/workspace.rs b/support/texlab/crates/base-db/src/workspace.rs
index b4a524ad4a..330ed5a493 100644
--- a/support/texlab/crates/base-db/src/workspace.rs
+++ b/support/texlab/crates/base-db/src/workspace.rs
@@ -5,11 +5,13 @@ use std::{
use distro::{Distro, Language};
use itertools::Itertools;
+use line_index::LineCol;
use rowan::{TextLen, TextRange};
use rustc_hash::FxHashSet;
+use syntax::latexmkrc::LatexmkrcData;
use url::Url;
-use crate::{graph, util::LineCol, Config, Document, DocumentData, DocumentParams, Owner};
+use crate::{graph, Config, Document, DocumentData, DocumentParams, Owner};
#[derive(Debug, Default)]
pub struct Workspace {
@@ -114,22 +116,11 @@ impl Workspace {
self.iter()
.filter(|document| document.uri.scheme() == "file")
.flat_map(|document| {
- let dir1 = self.output_dir(
- &self.current_dir(&document.dir),
- self.config.build.aux_dir.clone(),
- );
-
- let dir2 = self.output_dir(
- &self.current_dir(&document.dir),
- self.config.build.log_dir.clone(),
- );
-
- let dir3 = &document.dir;
- [
- dir1.to_file_path(),
- dir2.to_file_path(),
- dir3.to_file_path(),
- ]
+ let current_dir = &self.current_dir(&document.dir);
+ let doc_dir = document.dir.to_file_path();
+ let aux_dir = self.aux_dir(current_dir).to_file_path();
+ let log_dir = self.log_dir(current_dir).to_file_path();
+ [aux_dir, log_dir, doc_dir]
})
.flatten()
.for_each(|path| {
@@ -153,13 +144,45 @@ impl Workspace {
.unwrap_or_else(|| base_dir.clone())
}
- pub fn output_dir(&self, base_dir: &Url, relative_path: String) -> Url {
- let mut path = relative_path;
- if !path.ends_with('/') {
- path.push('/');
+ pub fn aux_dir(&self, base_dir: &Url) -> Url {
+ self.output_dir(base_dir, &self.config.build.aux_dir, |data| {
+ data.aux_dir.as_deref()
+ })
+ }
+
+ pub fn log_dir(&self, base_dir: &Url) -> Url {
+ self.output_dir(base_dir, &self.config.build.log_dir, |_| None)
+ }
+
+ pub fn pdf_dir(&self, base_dir: &Url) -> Url {
+ self.output_dir(base_dir, &self.config.build.pdf_dir, |_| None)
+ }
+
+ fn current_latexmkrc(&self, base_dir: &Url) -> Option<&LatexmkrcData> {
+ self.documents
+ .iter()
+ .filter(|document| document.language == Language::Latexmkrc)
+ .find(|document| document.uri.join(".").as_ref() == Ok(base_dir))
+ .and_then(|document| document.data.as_latexmkrc())
+ }
+
+ fn output_dir(
+ &self,
+ base_dir: &Url,
+ config: &str,
+ extract_latexmkrc: impl FnOnce(&LatexmkrcData) -> Option<&str>,
+ ) -> Url {
+ let mut dir: String = self
+ .current_latexmkrc(base_dir)
+ .and_then(|data| extract_latexmkrc(data).or_else(|| data.out_dir.as_deref()))
+ .unwrap_or(config)
+ .into();
+
+ if !dir.ends_with('/') {
+ dir.push('/');
}
- base_dir.join(&path).unwrap_or_else(|_| base_dir.clone())
+ base_dir.join(&dir).unwrap_or_else(|_| base_dir.clone())
}
pub fn contains(&self, path: &Path) -> bool {
@@ -298,7 +321,10 @@ impl Workspace {
continue;
};
- if !matches!(lang, Language::Tex | Language::Root | Language::Tectonic) {
+ if !matches!(
+ lang,
+ Language::Tex | Language::Root | Language::Tectonic | Language::Latexmkrc
+ ) {
continue;
}
diff --git a/support/texlab/crates/bibfmt/Cargo.toml b/support/texlab/crates/bibfmt/Cargo.toml
new file mode 100644
index 0000000000..18a4eb6dca
--- /dev/null
+++ b/support/texlab/crates/bibfmt/Cargo.toml
@@ -0,0 +1,19 @@
+[package]
+name = "bibfmt"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+rowan = "0.15.13"
+syntax = { path = "../syntax" }
+line-index = { path = "../line-index" }
+
+[lib]
+doctest = false
+
+[dev-dependencies]
+expect-test = "1.4.1"
+parser = { path = "../parser" }
diff --git a/support/texlab/crates/bibfmt/src/lib.rs b/support/texlab/crates/bibfmt/src/lib.rs
new file mode 100644
index 0000000000..cfce131f2c
--- /dev/null
+++ b/support/texlab/crates/bibfmt/src/lib.rs
@@ -0,0 +1,193 @@
+use line_index::LineIndex;
+use rowan::{ast::AstNode, NodeOrToken};
+use syntax::bibtex::{self, HasName, HasType, HasValue};
+
+pub struct Options {
+ pub insert_spaces: bool,
+ pub tab_size: usize,
+ pub line_length: usize,
+}
+
+impl Options {
+ fn indent(&self) -> String {
+ if self.insert_spaces {
+ std::iter::repeat(' ').take(self.tab_size).collect()
+ } else {
+ String::from("\t")
+ }
+ }
+}
+
+impl Default for Options {
+ fn default() -> Self {
+ Self {
+ insert_spaces: true,
+ tab_size: 4,
+ line_length: 80,
+ }
+ }
+}
+
+pub fn format(root: &bibtex::SyntaxNode, line_index: &LineIndex, options: &Options) -> String {
+ let indent = options.indent();
+ let mut output = String::new();
+ for elem in root.children_with_tokens() {
+ match elem {
+ NodeOrToken::Token(token) => {
+ output.push_str(token.text());
+ }
+ NodeOrToken::Node(node) => {
+ let mut fmt = Formatter {
+ indent: &indent,
+ output: &mut output,
+ options,
+ align: Vec::new(),
+ line_index,
+ };
+
+ fmt.visit_node(node);
+ }
+ }
+ }
+
+ output
+}
+
+struct Formatter<'a> {
+ output: &'a mut String,
+ indent: &'a str,
+ options: &'a Options,
+ align: Vec<usize>,
+ line_index: &'a LineIndex,
+}
+
+impl<'a> Formatter<'a> {
+ fn visit_token_lowercase(&mut self, token: &bibtex::SyntaxToken) {
+ self.output.push_str(&token.text().to_lowercase());
+ }
+
+ fn should_insert_space(
+ &self,
+ previous: &bibtex::SyntaxToken,
+ current: &bibtex::SyntaxToken,
+ ) -> bool {
+ let previous = self.line_index.line_col(previous.text_range().end());
+ let current = self.line_index.line_col(current.text_range().start());
+ previous.line != current.line || previous.col < current.col
+ }
+
+ fn base_align(&self) -> usize {
+ self.output[self.output.rfind('\n').unwrap_or(0)..]
+ .chars()
+ .count()
+ }
+
+ fn visit_node(&mut self, parent: bibtex::SyntaxNode) {
+ match parent.kind() {
+ bibtex::PREAMBLE => {
+ let preamble = bibtex::Preamble::cast(parent).unwrap();
+ self.visit_token_lowercase(&preamble.type_token().unwrap());
+ self.output.push('{');
+ if preamble.syntax().children().next().is_some() {
+ self.align.push(self.base_align());
+ for node in preamble.syntax().children() {
+ self.visit_node(node);
+ }
+ self.output.push('}');
+ }
+ }
+ bibtex::STRING => {
+ let string = bibtex::StringDef::cast(parent).unwrap();
+ self.visit_token_lowercase(&string.type_token().unwrap());
+ self.output.push('{');
+ if let Some(name) = string.name_token() {
+ self.output.push_str(name.text());
+ self.output.push_str(" = ");
+ if let Some(value) = string.value() {
+ self.align.push(self.base_align());
+ self.visit_node(value.syntax().clone());
+ self.output.push('}');
+ }
+ }
+ }
+ bibtex::ENTRY => {
+ let entry = bibtex::Entry::cast(parent).unwrap();
+ self.visit_token_lowercase(&entry.type_token().unwrap());
+ self.output.push('{');
+ if let Some(key) = entry.name_token() {
+ self.output.push_str(&key.to_string());
+ self.output.push(',');
+ self.output.push('\n');
+ for field in entry.fields() {
+ self.visit_node(field.syntax().clone());
+ }
+ self.output.push('}');
+ }
+ }
+ bibtex::FIELD => {
+ let field = bibtex::Field::cast(parent).unwrap();
+ self.output.push_str(&self.indent);
+ let name = field.name_token().unwrap();
+ self.output.push_str(name.text());
+ self.output.push_str(" = ");
+ if let Some(value) = field.value() {
+ let count = name.text().chars().count();
+ self.align.push(self.options.tab_size + count + 3);
+ self.visit_node(value.syntax().clone());
+ self.output.push(',');
+ self.output.push('\n');
+ }
+ }
+ kind if bibtex::Value::can_cast(kind) => {
+ let tokens: Vec<_> = parent
+ .descendants_with_tokens()
+ .filter_map(|element| element.into_token())
+ .filter(|token| token.kind() != bibtex::WHITESPACE)
+ .collect();
+
+ self.output.push_str(tokens[0].text());
+
+ let align = self.align.pop().unwrap_or_default();
+ let mut length = align + tokens[0].text().chars().count();
+ for i in 1..tokens.len() {
+ let previous = &tokens[i - 1];
+ let current = &tokens[i];
+ let current_length = current.text().chars().count();
+
+ let insert_space = self.should_insert_space(previous, current);
+ let space_length = if insert_space { 1 } else { 0 };
+
+ if length + current_length + space_length > self.options.line_length {
+ self.output.push('\n');
+ self.output.push_str(self.indent.as_ref());
+ for _ in 0..=align - self.options.tab_size as usize {
+ self.output.push(' ');
+ }
+ length = align;
+ } else if insert_space {
+ self.output.push(' ');
+ length += 1;
+ }
+ self.output.push_str(current.text());
+ length += current_length;
+ }
+ }
+ bibtex::ROOT | bibtex::JUNK => {
+ for element in parent.children_with_tokens() {
+ match element {
+ NodeOrToken::Token(token) => {
+ self.output.push_str(token.text());
+ }
+ NodeOrToken::Node(node) => {
+ self.visit_node(node);
+ }
+ }
+ }
+ }
+ _ => unreachable!(),
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/support/texlab/crates/bibfmt/src/tests.rs b/support/texlab/crates/bibfmt/src/tests.rs
new file mode 100644
index 0000000000..c081a15eca
--- /dev/null
+++ b/support/texlab/crates/bibfmt/src/tests.rs
@@ -0,0 +1,144 @@
+use expect_test::{expect, Expect};
+use line_index::LineIndex;
+use syntax::bibtex;
+
+use crate::Options;
+
+fn check(input: &str, expect: Expect) {
+ let green = parser::parse_bibtex(input);
+ let root = bibtex::SyntaxNode::new_root(green);
+ let line_index = LineIndex::new(input);
+ let output = crate::format(&root, &line_index, &Options::default());
+ expect.assert_eq(&output);
+}
+
+#[test]
+fn test_wrap_long_lines() {
+ check(
+ r#"@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ Lorem ipsum dolor sit amet,
+ consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}"#,
+ expect![[r#"
+ @article{foo,
+ bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
+ dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
+ amet, consectetur adipiscing elit.},
+ }"#]],
+ );
+}
+
+#[test]
+fn test_multiple_entries() {
+ check(
+ r#"@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ Lorem ipsum dolor sit amet,
+consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}
+
+@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ Lorem ipsum dolor sit amet,
+consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}"#,
+ expect![[r#"
+ @article{foo,
+ bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
+ dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
+ amet, consectetur adipiscing elit.},
+ }
+
+ @article{foo,
+ bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
+ dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
+ amet, consectetur adipiscing elit.},
+ }"#]],
+ );
+}
+
+#[test]
+fn test_trailing_comma() {
+ check(
+ r#"@article{foo, bar = baz}"#,
+ expect![[r#"
+ @article{foo,
+ bar = baz,
+ }"#]],
+ );
+}
+
+#[test]
+fn test_insert_braces() {
+ check(
+ r#"@article{foo, bar = baz,"#,
+ expect![[r#"
+ @article{foo,
+ bar = baz,
+ }"#]],
+ );
+}
+
+#[test]
+fn test_comment() {
+ check(
+ r#"Foo Bar
+@article{foo, bar = "\baz",}
+Baz
+@article{f,}
+Qux"#,
+ expect![[r#"
+ Foo Bar
+ @article{foo,
+ bar = "\baz",
+ }
+ Baz
+ @article{f,
+ }
+ Qux"#]],
+ );
+}
+
+#[test]
+fn test_command() {
+ check(
+ r#"@article{foo, bar = "\baz",}"#,
+ expect![[r#"
+ @article{foo,
+ bar = "\baz",
+ }"#]],
+ );
+}
+
+#[test]
+fn test_join_strings() {
+ check(
+ r#"@article{foo, bar = "baz" # "qux"}"#,
+ expect![[r#"
+ @article{foo,
+ bar = "baz" # "qux",
+ }"#]],
+ );
+}
+
+#[test]
+fn test_parens() {
+ check(
+ r#"@article(foo,)"#,
+ expect![[r#"
+ @article{foo,
+ }"#]],
+ );
+}
+
+#[test]
+fn test_string() {
+ check(
+ r#"@string{foo="bar"}"#,
+ expect![[r#"@string{foo = "bar"}"#]],
+ );
+}
+
+#[test]
+fn test_preamble() {
+ check(
+ r#"@preamble{
+ "foo bar baz" }"#,
+ expect![[r#"@preamble{"foo bar baz"}"#]],
+ );
+}
diff --git a/support/texlab/crates/bibtex-utils/Cargo.toml b/support/texlab/crates/bibtex-utils/Cargo.toml
index 7dd75ff738..1789a9747b 100644
--- a/support/texlab/crates/bibtex-utils/Cargo.toml
+++ b/support/texlab/crates/bibtex-utils/Cargo.toml
@@ -9,8 +9,8 @@ rust-version.workspace = true
[dependencies]
chrono = { version = "0.4.26", default-features = false, features = ["std"] }
human_name = "2.0.2"
-itertools = "0.11.0"
-rowan = "0.15.11"
+itertools = "0.12.0"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
unicode-normalization = "0.1.22"
diff --git a/support/texlab/crates/citeproc/Cargo.toml b/support/texlab/crates/citeproc/Cargo.toml
index c298c6f7d1..cccbd002c4 100644
--- a/support/texlab/crates/citeproc/Cargo.toml
+++ b/support/texlab/crates/citeproc/Cargo.toml
@@ -9,13 +9,13 @@ rust-version.workspace = true
[dependencies]
bibtex-utils = { path = "../bibtex-utils" }
isocountry = "0.3.2"
-itertools = "0.11.0"
-rowan = "0.15.11"
+itertools = "0.12.0"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
titlecase = "2.2.1"
unicode-normalization = "0.1.22"
-url = "=2.3.1"
+url = "2.5.0"
[lib]
doctest = false
diff --git a/support/texlab/crates/commands/Cargo.toml b/support/texlab/crates/commands/Cargo.toml
index cf395e5bf8..2b010ec126 100644
--- a/support/texlab/crates/commands/Cargo.toml
+++ b/support/texlab/crates/commands/Cargo.toml
@@ -9,16 +9,16 @@ rust-version.workspace = true
[dependencies]
anyhow = "1.0.72"
base-db = { path = "../base-db" }
-bstr = "1.6.0"
+bstr = "1.8.0"
crossbeam-channel = "0.5.8"
-itertools = "0.11.0"
-libc = "0.2.147"
+itertools = "0.12.0"
+libc = "0.2.150"
log = "0.4.19"
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
-thiserror = "1.0.43"
-url = "2.3.1"
+thiserror = "1.0.50"
+url = "2.5.0"
[dev-dependencies]
distro = { path = "../distro" }
diff --git a/support/texlab/crates/commands/src/clean.rs b/support/texlab/crates/commands/src/clean.rs
index 562d9c49b6..706e7dfaf1 100644
--- a/support/texlab/crates/commands/src/clean.rs
+++ b/support/texlab/crates/commands/src/clean.rs
@@ -29,18 +29,15 @@ impl CleanCommand {
};
let out_dir = match target {
- CleanTarget::Auxiliary => &workspace.config().build.aux_dir,
- CleanTarget::Artifacts => &workspace.config().build.pdf_dir,
+ CleanTarget::Auxiliary => workspace.aux_dir(&base_dir),
+ CleanTarget::Artifacts => workspace.pdf_dir(&base_dir),
};
- let out_dir = workspace
- .output_dir(&base_dir, out_dir.clone())
- .to_file_path()
- .unwrap();
+ let out_dir_path = out_dir.to_file_path().unwrap();
let executable = String::from("latexmk");
let args = vec![
- format!("-outdir={}", out_dir.display()),
+ format!("-outdir={}", out_dir_path.display()),
String::from(flag),
path.display().to_string(),
];
diff --git a/support/texlab/crates/commands/src/fwd_search.rs b/support/texlab/crates/commands/src/fwd_search.rs
index 9004ef9b09..7e82f38487 100644
--- a/support/texlab/crates/commands/src/fwd_search.rs
+++ b/support/texlab/crates/commands/src/fwd_search.rs
@@ -58,9 +58,8 @@ impl ForwardSearch {
return Err(ForwardSearchError::NotLocal(parent.uri.clone()));
}
- let dir = workspace.current_dir(&parent.dir);
let dir = workspace
- .output_dir(&dir, workspace.config().build.pdf_dir.clone())
+ .pdf_dir(&workspace.current_dir(&parent.dir))
.to_file_path()
.unwrap();
diff --git a/support/texlab/crates/completion-data/Cargo.toml b/support/texlab/crates/completion-data/Cargo.toml
index b0053c7701..56f78314b0 100644
--- a/support/texlab/crates/completion-data/Cargo.toml
+++ b/support/texlab/crates/completion-data/Cargo.toml
@@ -7,12 +7,12 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
-flate2 = "1.0.27"
-itertools = "0.11.0"
+flate2 = "1.0.28"
+itertools = "0.12.0"
once_cell = "1.18.0"
rustc-hash = "1.1.0"
-serde = { version = "1.0.188", features = ["derive"] }
-serde_json = "1.0.107"
+serde = { version = "1.0.193", features = ["derive"] }
+serde_json = "1.0.108"
[lib]
doctest = false
diff --git a/support/texlab/crates/completion/Cargo.toml b/support/texlab/crates/completion/Cargo.toml
index 671728aea8..d44e87db1e 100644
--- a/support/texlab/crates/completion/Cargo.toml
+++ b/support/texlab/crates/completion/Cargo.toml
@@ -10,19 +10,18 @@ rust-version.workspace = true
base-db = { path = "../base-db" }
completion-data = { path = "../completion-data" }
fuzzy-matcher = { version = "0.3.7", features = ["compact"] }
-itertools = "0.11.0"
-log = "0.4.20"
+line-index = { path = "../line-index" }
rayon = "1.7.0"
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
-url = "=2.3.1"
+url = "2.5.0"
[dev-dependencies]
criterion = "0.5.1"
distro = { path = "../distro" }
-test-utils = { path = "../test-utils" }
expect-test = "1.4.1"
+test-utils = { path = "../test-utils" }
[lib]
doctest = false
diff --git a/support/texlab/crates/completion/benches/bench_main.rs b/support/texlab/crates/completion/benches/bench_main.rs
index 66c7a3a726..24427969d7 100644
--- a/support/texlab/crates/completion/benches/bench_main.rs
+++ b/support/texlab/crates/completion/benches/bench_main.rs
@@ -1,7 +1,8 @@
-use base_db::{util::LineCol, FeatureParams, Owner, Workspace};
+use base_db::{FeatureParams, Owner, Workspace};
use completion::CompletionParams;
use criterion::{criterion_group, criterion_main, Criterion};
use distro::Language;
+use line_index::LineCol;
use rowan::TextSize;
use url::Url;
diff --git a/support/texlab/crates/definition/Cargo.toml b/support/texlab/crates/definition/Cargo.toml
index 800ca7f6da..c3549495ed 100644
--- a/support/texlab/crates/definition/Cargo.toml
+++ b/support/texlab/crates/definition/Cargo.toml
@@ -8,12 +8,12 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
[dev-dependencies]
-itertools = "0.11.0"
+itertools = "0.12.0"
test-utils = { path = "../test-utils" }
[lib]
diff --git a/support/texlab/crates/definition/src/citation.rs b/support/texlab/crates/definition/src/citation.rs
index 509b008b26..52c0636e2d 100644
--- a/support/texlab/crates/definition/src/citation.rs
+++ b/support/texlab/crates/definition/src/citation.rs
@@ -8,7 +8,8 @@ use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
- let data = context.params.document.data.as_tex()?;
+ let feature = &context.params.feature;
+ let data = feature.document.data.as_tex()?;
let citation = queries::object_at_cursor(
&data.semantics.citations,
@@ -17,7 +18,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
)?;
let name = citation.object.name_text();
- for (document, entry) in queries::objects_with_name::<bib::Entry>(&context.project, name) {
+ for (document, entry) in queries::objects_with_name::<bib::Entry>(&feature.project, name) {
context.results.insert(DefinitionResult {
origin_selection_range: citation.object.name_range(),
target: document,
diff --git a/support/texlab/crates/definition/src/command.rs b/support/texlab/crates/definition/src/command.rs
index 661f953212..d618ca9ddf 100644
--- a/support/texlab/crates/definition/src/command.rs
+++ b/support/texlab/crates/definition/src/command.rs
@@ -7,7 +7,8 @@ use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
- let data = context.params.document.data.as_tex()?;
+ let feature = &context.params.feature;
+ let data = feature.document.data.as_tex()?;
let root = data.root_node();
let name = root
.token_at_offset(context.params.offset)
@@ -15,7 +16,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
let origin_selection_range = name.text_range();
- for document in &context.project.documents {
+ for document in &feature.project.documents {
let DocumentData::Tex(data) = &document.data else {
continue;
};
diff --git a/support/texlab/crates/definition/src/include.rs b/support/texlab/crates/definition/src/include.rs
index df2c5c763c..bc9311ba01 100644
--- a/support/texlab/crates/definition/src/include.rs
+++ b/support/texlab/crates/definition/src/include.rs
@@ -5,12 +5,13 @@ use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
- let start = context.params.document;
- let parents = context.params.workspace.parents(start);
+ let feature = &context.params.feature;
+ let start = feature.document;
+ let parents = feature.workspace.parents(start);
let results = parents
.into_iter()
.chain(std::iter::once(start))
- .flat_map(|parent| base_db::graph::Graph::new(context.params.workspace, parent).edges)
+ .flat_map(|parent| base_db::graph::Graph::new(feature.workspace, parent).edges)
.filter(|edge| edge.source == start)
.flat_map(|edge| {
let origin_selection_range = edge.weight?.link.path.range;
diff --git a/support/texlab/crates/definition/src/label.rs b/support/texlab/crates/definition/src/label.rs
index 80f1442daf..e32c0a93d0 100644
--- a/support/texlab/crates/definition/src/label.rs
+++ b/support/texlab/crates/definition/src/label.rs
@@ -11,7 +11,8 @@ use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
- let data = context.params.document.data.as_tex()?;
+ let feature = &context.params.feature;
+ let data = feature.document.data.as_tex()?;
let reference = queries::object_at_cursor(
&data.semantics.labels,
context.params.offset,
@@ -19,10 +20,10 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
)?;
let name = reference.object.name_text();
- let labels = queries::objects_with_name::<tex::Label>(&context.project, name);
+ let labels = queries::objects_with_name::<tex::Label>(&feature.project, name);
for (document, label) in labels.filter(|(_, label)| label.kind == tex::LabelKind::Definition) {
let target_selection_range = label.name.range;
- let target_range = render_label(context.params.workspace, &context.project, label)
+ let target_range = render_label(feature.workspace, &feature.project, label)
.map_or(target_selection_range, |label| label.range);
context.results.insert(DefinitionResult {
diff --git a/support/texlab/crates/definition/src/lib.rs b/support/texlab/crates/definition/src/lib.rs
index 2c1614f04e..55319b7fe4 100644
--- a/support/texlab/crates/definition/src/lib.rs
+++ b/support/texlab/crates/definition/src/lib.rs
@@ -4,14 +4,13 @@ mod include;
mod label;
mod string_ref;
-use base_db::{Document, Project, Workspace};
+use base_db::{Document, FeatureParams};
use rowan::{TextRange, TextSize};
use rustc_hash::FxHashSet;
#[derive(Debug)]
-pub struct DefinitionParams<'db> {
- pub workspace: &'db Workspace,
- pub document: &'db Document,
+pub struct DefinitionParams<'a> {
+ pub feature: FeatureParams<'a>,
pub offset: TextSize,
}
@@ -24,17 +23,14 @@ pub struct DefinitionResult<'a> {
}
#[derive(Debug)]
-struct DefinitionContext<'db> {
- params: DefinitionParams<'db>,
- project: Project<'db>,
- results: FxHashSet<DefinitionResult<'db>>,
+struct DefinitionContext<'a> {
+ params: DefinitionParams<'a>,
+ results: FxHashSet<DefinitionResult<'a>>,
}
pub fn goto_definition(params: DefinitionParams) -> FxHashSet<DefinitionResult> {
- let project = params.workspace.project(params.document);
let mut context = DefinitionContext {
params,
- project,
results: FxHashSet::default(),
};
diff --git a/support/texlab/crates/definition/src/string_ref.rs b/support/texlab/crates/definition/src/string_ref.rs
index 678fc5911e..48af5c725e 100644
--- a/support/texlab/crates/definition/src/string_ref.rs
+++ b/support/texlab/crates/definition/src/string_ref.rs
@@ -6,7 +6,8 @@ use crate::DefinitionContext;
use super::DefinitionResult;
pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
- let data = context.params.document.data.as_bib()?;
+ let feature = &context.params.feature;
+ let data = feature.document.data.as_bib()?;
let root = data.root_node();
let name = root
.token_at_offset(context.params.offset)
@@ -25,7 +26,7 @@ pub(super) fn goto_definition(context: &mut DefinitionContext) -> Option<()> {
{
context.results.insert(DefinitionResult {
origin_selection_range,
- target: context.params.document,
+ target: feature.document,
target_range: string.full_range,
target_selection_range: string.name.range,
});
diff --git a/support/texlab/crates/definition/src/tests.rs b/support/texlab/crates/definition/src/tests.rs
index 8c08be72d1..8d81927d32 100644
--- a/support/texlab/crates/definition/src/tests.rs
+++ b/support/texlab/crates/definition/src/tests.rs
@@ -1,35 +1,22 @@
+use rowan::TextRange;
use rustc_hash::FxHashSet;
use crate::{DefinitionParams, DefinitionResult};
fn check(input: &str) {
let fixture = test_utils::fixture::Fixture::parse(input);
- let workspace = &fixture.workspace;
-
- let mut origin_selection_range = None;
- let mut origin_document = None;
- let mut origin_cursor = None;
- for document in &fixture.documents {
- if let Some(cursor) = document.cursor {
- origin_document = Some(document);
- origin_cursor = Some(cursor);
- origin_selection_range = document
- .ranges
- .iter()
- .find(|range| range.contains_inclusive(cursor))
- .copied();
-
- break;
- }
- }
-
- let origin_document = origin_document.unwrap();
+ let (feature, offset) = fixture.make_params().unwrap();
+ let origin_document = feature.document;
+ let origin_selection_range = fixture
+ .locations()
+ .filter(|location| location.document == origin_document)
+ .find(|location| location.range.contains_inclusive(offset))
+ .map_or_else(|| TextRange::default(), |location| location.range);
let mut expected = FxHashSet::default();
for document in &fixture.documents {
let mut ranges = document.ranges.iter();
while let Some(target_selection_range) = ranges.next().copied() {
- let origin_selection_range = origin_selection_range.unwrap();
if (&origin_document.uri, origin_selection_range)
!= (&document.uri, target_selection_range)
{
@@ -43,11 +30,7 @@ fn check(input: &str) {
}
}
- let actual = crate::goto_definition(DefinitionParams {
- workspace,
- document: workspace.lookup(&origin_document.uri).unwrap(),
- offset: origin_cursor.unwrap(),
- });
+ let actual = crate::goto_definition(DefinitionParams { feature, offset });
assert_eq!(actual, expected);
}
diff --git a/support/texlab/crates/diagnostics/Cargo.toml b/support/texlab/crates/diagnostics/Cargo.toml
index 3f87c8c879..490bee32f3 100644
--- a/support/texlab/crates/diagnostics/Cargo.toml
+++ b/support/texlab/crates/diagnostics/Cargo.toml
@@ -8,11 +8,12 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-itertools = "0.11.0"
-rowan = "0.15.11"
+itertools = "0.12.0"
+line-index = { path = "../line-index" }
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
-url = "=2.3.1"
+url = "2.5.0"
[dev-dependencies]
test-utils = { path = "../test-utils" }
diff --git a/support/texlab/crates/diagnostics/src/build_log.rs b/support/texlab/crates/diagnostics/src/build_log.rs
index 525bd982ff..4c53a35ff8 100644
--- a/support/texlab/crates/diagnostics/src/build_log.rs
+++ b/support/texlab/crates/diagnostics/src/build_log.rs
@@ -1,6 +1,7 @@
use std::borrow::Cow;
use base_db::{Document, Workspace};
+use line_index::LineCol;
use rowan::{TextLen, TextRange, TextSize};
use rustc_hash::FxHashMap;
use syntax::BuildError;
@@ -43,15 +44,15 @@ impl DiagnosticSource for BuildErrors {
let Ok(full_path_uri) = Url::from_file_path(&full_path) else {
continue;
};
+
let tex_document = workspace.lookup(&full_path_uri).unwrap_or(root_document);
let range = find_range_of_hint(tex_document, error).unwrap_or_else(|| {
let line = error.line.unwrap_or(0);
- let offset = *tex_document
+ let offset = tex_document
.line_index
- .newlines
- .get(line as usize)
- .unwrap_or(&TextSize::from(0));
+ .offset(LineCol { line, col: 0 })
+ .unwrap_or(TextSize::from(0));
TextRange::empty(offset)
});
@@ -91,16 +92,17 @@ impl DiagnosticSource for BuildErrors {
}
fn find_range_of_hint(document: &Document, error: &BuildError) -> Option<TextRange> {
- let line = error.line? as usize;
+ let line = error.line?;
let hint = error.hint.as_deref()?;
let line_index = &document.line_index;
- let line_start = line_index.newlines.get(line).copied()?;
+ let line_start = line_index.offset(LineCol { line, col: 0 })?;
let line_end = line_index
- .newlines
- .get(line + 1)
- .copied()
- .unwrap_or((&document.text).text_len());
+ .offset(LineCol {
+ line: line + 1,
+ col: 0,
+ })
+ .unwrap_or_else(|| document.text.text_len());
let line_text = &document.text[line_start.into()..line_end.into()];
let hint_start = line_start + TextSize::try_from(line_text.find(hint)?).unwrap();
diff --git a/support/texlab/crates/diagnostics/src/citations.rs b/support/texlab/crates/diagnostics/src/citations.rs
index 1ab7b6db30..0b750aaadb 100644
--- a/support/texlab/crates/diagnostics/src/citations.rs
+++ b/support/texlab/crates/diagnostics/src/citations.rs
@@ -47,7 +47,8 @@ fn detect_undefined_citations<'db>(
.collect();
for citation in &data.semantics.citations {
- if !entries.contains(citation.name.text.as_str()) {
+ let name = citation.name_text();
+ if name != "*" && !entries.contains(name) {
let diagnostic = Diagnostic {
range: citation.name.range,
data: DiagnosticData::Tex(TexError::UndefinedCitation),
diff --git a/support/texlab/crates/diagnostics/src/tests.rs b/support/texlab/crates/diagnostics/src/tests.rs
index b9eafc0284..539e3ba765 100644
--- a/support/texlab/crates/diagnostics/src/tests.rs
+++ b/support/texlab/crates/diagnostics/src/tests.rs
@@ -1,14 +1,12 @@
use std::borrow::Cow;
-use test_utils::fixture::Fixture;
-
use crate::{
types::{BibError, Diagnostic, DiagnosticData, TexError},
DiagnosticBuilder, DiagnosticManager, DiagnosticSource,
};
fn check(input: &str, expected_data: &[DiagnosticData]) {
- let fixture = Fixture::parse(input);
+ let fixture = test_utils::fixture::Fixture::parse(input);
let mut manager = DiagnosticManager::default();
let mut expected = DiagnosticBuilder::default();
diff --git a/support/texlab/crates/distro/src/language.rs b/support/texlab/crates/distro/src/language.rs
index 207b700581..201ed0702b 100644
--- a/support/texlab/crates/distro/src/language.rs
+++ b/support/texlab/crates/distro/src/language.rs
@@ -7,6 +7,7 @@ pub enum Language {
Aux,
Log,
Root,
+ Latexmkrc,
Tectonic,
}
@@ -21,6 +22,10 @@ impl Language {
return Some(Self::Tectonic);
}
+ if name.eq_ignore_ascii_case(".latexmkrc") || name.eq_ignore_ascii_case("latexmkrc") {
+ return Some(Self::Latexmkrc);
+ }
+
let extname = path.extension()?.to_str()?;
match extname.to_lowercase().as_str() {
"tex" | "sty" | "cls" | "def" | "lco" | "rnw" => Some(Self::Tex),
diff --git a/support/texlab/crates/folding/Cargo.toml b/support/texlab/crates/folding/Cargo.toml
index 2cf82699ea..e7646b61a8 100644
--- a/support/texlab/crates/folding/Cargo.toml
+++ b/support/texlab/crates/folding/Cargo.toml
@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-rowan = "0.15.11"
+rowan = "0.15.13"
syntax = { path = "../syntax" }
[dev-dependencies]
diff --git a/support/texlab/crates/folding/src/tests.rs b/support/texlab/crates/folding/src/tests.rs
index 405b56bda1..1e86b30088 100644
--- a/support/texlab/crates/folding/src/tests.rs
+++ b/support/texlab/crates/folding/src/tests.rs
@@ -2,8 +2,7 @@ use expect_test::{expect, Expect};
fn check(input: &str, expect: Expect) {
let fixture = test_utils::fixture::Fixture::parse(input);
- let workspace = &fixture.workspace;
- let document = workspace.lookup(&fixture.documents[0].uri).unwrap();
+ let document = fixture.make_params().unwrap().0.document;
let data = crate::find_all(document);
expect.assert_debug_eq(&data);
}
diff --git a/support/texlab/crates/highlights/Cargo.toml b/support/texlab/crates/highlights/Cargo.toml
new file mode 100644
index 0000000000..e3247e50fd
--- /dev/null
+++ b/support/texlab/crates/highlights/Cargo.toml
@@ -0,0 +1,18 @@
+[package]
+name = "highlights"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+base-db = { path = "../base-db" }
+rowan = "0.15.13"
+
+[dev-dependencies]
+expect-test = "1.4.1"
+test-utils = { path = "../test-utils" }
+
+[lib]
+doctest = false
diff --git a/support/texlab/crates/highlights/src/label.rs b/support/texlab/crates/highlights/src/label.rs
new file mode 100644
index 0000000000..ee606c175b
--- /dev/null
+++ b/support/texlab/crates/highlights/src/label.rs
@@ -0,0 +1,26 @@
+use base_db::semantics::tex::LabelKind;
+
+use crate::{Highlight, HighlightKind, HighlightParams};
+
+pub fn find_highlights(params: &HighlightParams, results: &mut Vec<Highlight>) -> Option<()> {
+ let data = params.feature.document.data.as_tex()?;
+ let labels = &data.semantics.labels;
+ let cursor = labels
+ .iter()
+ .find(|label| label.name.range.contains(params.offset))?;
+
+ for label in labels
+ .iter()
+ .filter(|label| label.name.text == cursor.name.text)
+ {
+ let range = label.name.range;
+ let kind = match label.kind {
+ LabelKind::Definition => HighlightKind::Write,
+ LabelKind::Reference | LabelKind::ReferenceRange => HighlightKind::Read,
+ };
+
+ results.push(Highlight { range, kind });
+ }
+
+ Some(())
+}
diff --git a/support/texlab/crates/highlights/src/lib.rs b/support/texlab/crates/highlights/src/lib.rs
new file mode 100644
index 0000000000..1845da3907
--- /dev/null
+++ b/support/texlab/crates/highlights/src/lib.rs
@@ -0,0 +1,31 @@
+use base_db::FeatureParams;
+use rowan::{TextRange, TextSize};
+
+mod label;
+
+#[derive(Debug, PartialEq, Eq, Clone)]
+pub struct Highlight {
+ pub range: TextRange,
+ pub kind: HighlightKind,
+}
+
+#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
+pub enum HighlightKind {
+ Write,
+ Read,
+}
+
+#[derive(Debug)]
+pub struct HighlightParams<'a> {
+ pub feature: FeatureParams<'a>,
+ pub offset: TextSize,
+}
+
+pub fn find_all(params: HighlightParams) -> Vec<Highlight> {
+ let mut results = Vec::new();
+ label::find_highlights(&params, &mut results);
+ results
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/support/texlab/crates/highlights/src/tests.rs b/support/texlab/crates/highlights/src/tests.rs
new file mode 100644
index 0000000000..74c3cc0c18
--- /dev/null
+++ b/support/texlab/crates/highlights/src/tests.rs
@@ -0,0 +1,41 @@
+use crate::{HighlightKind, HighlightParams};
+
+fn check(input: &str, expected_kinds: &[HighlightKind]) {
+ let fixture = test_utils::fixture::Fixture::parse(input);
+
+ let (feature, offset) = fixture.make_params().unwrap();
+
+ let expected_ranges = fixture
+ .locations()
+ .map(|location| location.range)
+ .collect::<Vec<_>>();
+
+ let results = crate::find_all(HighlightParams { feature, offset });
+
+ let actual_ranges = results
+ .iter()
+ .map(|result| result.range)
+ .collect::<Vec<_>>();
+ assert_eq!(actual_ranges, expected_ranges);
+
+ assert_eq!(
+ results.iter().map(|result| result.kind).collect::<Vec<_>>(),
+ expected_kinds
+ );
+}
+
+#[test]
+fn test_label() {
+ check(
+ r#"
+%! main.tex
+\label{foo}
+ |
+ ^^^
+\ref{foo}
+ ^^^
+\label{bar}
+"#,
+ &[HighlightKind::Write, HighlightKind::Read],
+ )
+}
diff --git a/support/texlab/crates/hover/Cargo.toml b/support/texlab/crates/hover/Cargo.toml
index 0db19b8189..af8f4f566b 100644
--- a/support/texlab/crates/hover/Cargo.toml
+++ b/support/texlab/crates/hover/Cargo.toml
@@ -11,7 +11,7 @@ base-db = { path = "../base-db" }
bibtex-utils = { path = "../bibtex-utils" }
citeproc = { path = "../citeproc" }
completion-data = { path = "../completion-data" }
-rowan = "0.15.11"
+rowan = "0.15.13"
syntax = { path = "../syntax" }
[dev-dependencies]
diff --git a/support/texlab/crates/hover/src/citation.rs b/support/texlab/crates/hover/src/citation.rs
index 49e5359bba..372668997e 100644
--- a/support/texlab/crates/hover/src/citation.rs
+++ b/support/texlab/crates/hover/src/citation.rs
@@ -4,14 +4,14 @@ use syntax::bibtex;
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
- let offset = params.offset;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let HoverParams { feature, offset } = params;
- let (name, range) = match &params.document.data {
+ let (name, range) = match &feature.document.data {
DocumentData::Tex(data) => {
let result = queries::object_at_cursor(
&data.semantics.citations,
- offset,
+ *offset,
queries::SearchMode::Full,
)?;
(&result.object.name.text, result.range)
@@ -19,7 +19,7 @@ pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
DocumentData::Bib(data) => {
let result = queries::object_at_cursor(
&data.semantics.entries,
- offset,
+ *offset,
queries::SearchMode::Name,
)?;
(&result.object.name.text, result.range)
@@ -27,7 +27,7 @@ pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
_ => return None,
};
- let text = params.project.documents.iter().find_map(|document| {
+ let text = feature.project.documents.iter().find_map(|document| {
let data = document.data.as_bib()?;
let root = bibtex::Root::cast(data.root_node())?;
let entry = root.find_entry(name)?;
diff --git a/support/texlab/crates/hover/src/entry_type.rs b/support/texlab/crates/hover/src/entry_type.rs
index f4941b4ee0..f3417e960d 100644
--- a/support/texlab/crates/hover/src/entry_type.rs
+++ b/support/texlab/crates/hover/src/entry_type.rs
@@ -3,8 +3,8 @@ use syntax::bibtex;
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &'db HoverParams) -> Option<Hover<'db>> {
- let data = params.document.data.as_bib()?;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let data = params.feature.document.data.as_bib()?;
let root = data.root_node();
let name = root
.token_at_offset(params.offset)
diff --git a/support/texlab/crates/hover/src/field_type.rs b/support/texlab/crates/hover/src/field_type.rs
index 18ebe6b78f..ec9078410a 100644
--- a/support/texlab/crates/hover/src/field_type.rs
+++ b/support/texlab/crates/hover/src/field_type.rs
@@ -4,8 +4,8 @@ use syntax::bibtex;
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
- let data = params.document.data.as_bib()?;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let data = params.feature.document.data.as_bib()?;
let root = data.root_node();
let name = root
.token_at_offset(params.offset)
diff --git a/support/texlab/crates/hover/src/label.rs b/support/texlab/crates/hover/src/label.rs
index fc9694fc6c..fc944aeaed 100644
--- a/support/texlab/crates/hover/src/label.rs
+++ b/support/texlab/crates/hover/src/label.rs
@@ -8,19 +8,20 @@ use base_db::{
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &'db HoverParams<'db>) -> Option<Hover<'db>> {
- let data = params.document.data.as_tex()?;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let feature = &params.feature;
+ let data = feature.document.data.as_tex()?;
let cursor = queries::object_at_cursor(
&data.semantics.labels,
params.offset,
queries::SearchMode::Full,
)?;
- let (_, definition) = tex::Label::find_all(&params.project)
+ let (_, definition) = tex::Label::find_all(&feature.project)
.filter(|(_, label)| label.kind == tex::LabelKind::Definition)
.find(|(_, label)| label.name_text() == cursor.object.name_text())?;
- let label = render_label(params.workspace, &params.project, definition)?;
+ let label = render_label(feature.workspace, &feature.project, definition)?;
Some(Hover {
range: cursor.range,
data: HoverData::Label(label),
diff --git a/support/texlab/crates/hover/src/lib.rs b/support/texlab/crates/hover/src/lib.rs
index 88be3b919a..bd16be3282 100644
--- a/support/texlab/crates/hover/src/lib.rs
+++ b/support/texlab/crates/hover/src/lib.rs
@@ -8,30 +8,16 @@ mod string_ref;
use base_db::{
data::{BibtexEntryType, BibtexFieldType},
util::RenderedLabel,
- Document, Project, Workspace,
+ FeatureParams,
};
use rowan::{TextRange, TextSize};
#[derive(Debug)]
-pub struct HoverParams<'db> {
- pub document: &'db Document,
- pub project: Project<'db>,
- pub workspace: &'db Workspace,
+pub struct HoverParams<'a> {
+ pub feature: FeatureParams<'a>,
pub offset: TextSize,
}
-impl<'db> HoverParams<'db> {
- pub fn new(workspace: &'db Workspace, document: &'db Document, offset: TextSize) -> Self {
- let project = workspace.project(document);
- Self {
- document,
- project,
- workspace,
- offset,
- }
- }
-}
-
#[derive(Debug, Clone)]
pub struct Hover<'db> {
pub range: TextRange,
@@ -48,13 +34,13 @@ pub enum HoverData<'db> {
StringRef(String),
}
-pub fn find<'db>(params: &'db HoverParams<'db>) -> Option<Hover<'db>> {
- citation::find_hover(params)
- .or_else(|| package::find_hover(params))
- .or_else(|| entry_type::find_hover(params))
- .or_else(|| field_type::find_hover(params))
- .or_else(|| label::find_hover(params))
- .or_else(|| string_ref::find_hover(params))
+pub fn find(params: HoverParams) -> Option<Hover> {
+ citation::find_hover(&params)
+ .or_else(|| package::find_hover(&params))
+ .or_else(|| entry_type::find_hover(&params))
+ .or_else(|| field_type::find_hover(&params))
+ .or_else(|| label::find_hover(&params))
+ .or_else(|| string_ref::find_hover(&params))
}
#[cfg(test)]
diff --git a/support/texlab/crates/hover/src/package.rs b/support/texlab/crates/hover/src/package.rs
index 1d6b328860..1dfc86573d 100644
--- a/support/texlab/crates/hover/src/package.rs
+++ b/support/texlab/crates/hover/src/package.rs
@@ -2,8 +2,8 @@ use base_db::semantics::tex::LinkKind;
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
- let data = params.document.data.as_tex()?;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let data = params.feature.document.data.as_tex()?;
data.semantics
.links
.iter()
diff --git a/support/texlab/crates/hover/src/string_ref.rs b/support/texlab/crates/hover/src/string_ref.rs
index 7ea84113e0..6726041af2 100644
--- a/support/texlab/crates/hover/src/string_ref.rs
+++ b/support/texlab/crates/hover/src/string_ref.rs
@@ -4,8 +4,8 @@ use syntax::bibtex::{self, HasName, HasValue};
use crate::{Hover, HoverData, HoverParams};
-pub(super) fn find_hover<'db>(params: &HoverParams<'db>) -> Option<Hover<'db>> {
- let data = params.document.data.as_bib()?;
+pub(super) fn find_hover<'a>(params: &HoverParams<'a>) -> Option<Hover<'a>> {
+ let data = params.feature.document.data.as_bib()?;
let root = bibtex::Root::cast(data.root_node())?;
let name = root
.syntax()
diff --git a/support/texlab/crates/hover/src/tests.rs b/support/texlab/crates/hover/src/tests.rs
index 0db913d0b5..bbe33fa2db 100644
--- a/support/texlab/crates/hover/src/tests.rs
+++ b/support/texlab/crates/hover/src/tests.rs
@@ -4,12 +4,9 @@ use crate::HoverParams;
fn check(input: &str, expect: Expect) {
let fixture = test_utils::fixture::Fixture::parse(input);
- let workspace = &fixture.workspace;
- let document = workspace.lookup(&fixture.documents[0].uri).unwrap();
- let offset = fixture.documents[0].cursor.unwrap();
- let params = HoverParams::new(workspace, document, offset);
-
- let data = crate::find(&params).map(|hover| {
+ let (feature, offset) = fixture.make_params().unwrap();
+ let params = HoverParams { feature, offset };
+ let data = crate::find(params).map(|hover| {
assert_eq!(fixture.documents[0].ranges[0], hover.range);
hover.data
});
diff --git a/support/texlab/crates/inlay-hints/Cargo.toml b/support/texlab/crates/inlay-hints/Cargo.toml
index 82b1c729b9..06a525a2f3 100644
--- a/support/texlab/crates/inlay-hints/Cargo.toml
+++ b/support/texlab/crates/inlay-hints/Cargo.toml
@@ -8,12 +8,12 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
-syntax = { path = "../syntax" }
[dev-dependencies]
test-utils = { path = "../test-utils" }
+expect-test = "1.4.1"
[lib]
doctest = false
diff --git a/support/texlab/crates/inlay-hints/src/lib.rs b/support/texlab/crates/inlay-hints/src/lib.rs
index 48373d305b..e3c80751f0 100644
--- a/support/texlab/crates/inlay-hints/src/lib.rs
+++ b/support/texlab/crates/inlay-hints/src/lib.rs
@@ -34,3 +34,6 @@ struct InlayHintBuilder<'a> {
params: InlayHintParams<'a>,
hints: Vec<InlayHint<'a>>,
}
+
+#[cfg(test)]
+mod tests;
diff --git a/support/texlab/crates/inlay-hints/src/tests.rs b/support/texlab/crates/inlay-hints/src/tests.rs
new file mode 100644
index 0000000000..5b8a43d614
--- /dev/null
+++ b/support/texlab/crates/inlay-hints/src/tests.rs
@@ -0,0 +1,108 @@
+use expect_test::{expect, Expect};
+use rowan::{TextLen, TextRange};
+
+fn check(input: &str, expect: Expect) {
+ let fixture = test_utils::fixture::Fixture::parse(input);
+
+ let (feature, _) = fixture.make_params().unwrap();
+ let range = TextRange::new(0.into(), feature.document.text.text_len());
+ let params = crate::InlayHintParams { range, feature };
+ let actual = crate::find_all(params).unwrap_or_default();
+
+ let expected_offsets = fixture.locations().map(|location| location.range.start());
+ for (hint, offset) in actual.iter().zip(expected_offsets) {
+ assert_eq!(hint.offset, offset);
+ }
+
+ let data = actual.into_iter().map(|hint| hint.data).collect::<Vec<_>>();
+ expect.assert_debug_eq(&data);
+}
+
+#[test]
+fn test_label_definition() {
+ check(
+ r#"
+%! main.tex
+\documentclass{article}
+\usepackage{caption}
+\begin{document}
+\section{Foo}\label{sec:foo}
+ !
+\section{Bar}\label{sec:bar}
+ !
+\subsection{Baz}\label{sec:baz}
+ !
+\begin{figure}
+ Test
+ \label{fig:qux}
+ !
+ \caption{Qux}
+\end{figure}
+\end{document}
+
+%! main.aux
+\relax
+\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}}
+\newlabel{fig:qux}{{\caption@xref {fig:qux}{ on input line 15}}{1}}
+\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Qux\relax }}{1}{}\protected@file@percent }
+\@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}{}\protected@file@percent }
+\newlabel{sec:foo}{{1}{1}}
+\@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}{}\protected@file@percent }
+\newlabel{sec:bar}{{2}{1}}
+\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Baz}{1}{}\protected@file@percent }
+\newlabel{sec:baz}{{2.1}{1}}
+\gdef \@abspage@last{1}"#,
+ expect![[r#"
+ [
+ LabelDefinition(
+ RenderedLabel {
+ range: 62..90,
+ number: Some(
+ "1",
+ ),
+ object: Section {
+ prefix: "Section",
+ text: "Foo",
+ },
+ },
+ ),
+ LabelDefinition(
+ RenderedLabel {
+ range: 91..226,
+ number: Some(
+ "2",
+ ),
+ object: Section {
+ prefix: "Section",
+ text: "Bar",
+ },
+ },
+ ),
+ LabelDefinition(
+ RenderedLabel {
+ range: 120..226,
+ number: Some(
+ "2.1",
+ ),
+ object: Section {
+ prefix: "Subsection",
+ text: "Baz",
+ },
+ },
+ ),
+ LabelDefinition(
+ RenderedLabel {
+ range: 152..226,
+ number: Some(
+ "fig:qux",
+ ),
+ object: Float {
+ kind: Figure,
+ caption: "Qux",
+ },
+ },
+ ),
+ ]
+ "#]],
+ );
+}
diff --git a/support/texlab/crates/line-index/Cargo.toml b/support/texlab/crates/line-index/Cargo.toml
new file mode 100644
index 0000000000..73d2766d60
--- /dev/null
+++ b/support/texlab/crates/line-index/Cargo.toml
@@ -0,0 +1,14 @@
+[package]
+name = "line-index"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+rustc-hash = "1.1.0"
+text-size = "1.1.1"
+
+[lib]
+doctest = false
diff --git a/support/texlab/crates/base-db/src/util/line_index.rs b/support/texlab/crates/line-index/src/lib.rs
index 3c5907782a..f604825d07 100644
--- a/support/texlab/crates/base-db/src/util/line_index.rs
+++ b/support/texlab/crates/line-index/src/lib.rs
@@ -4,8 +4,8 @@
//! representation.
use std::iter;
-use rowan::{TextRange, TextSize};
use rustc_hash::FxHashMap;
+use text_size::{TextRange, TextSize};
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LineIndex {
@@ -113,24 +113,24 @@ impl LineIndex {
}
}
- pub fn offset(&self, line_col: LineCol) -> TextSize {
- self.newlines[line_col.line as usize] + TextSize::from(line_col.col)
+ pub fn offset(&self, line_col: LineCol) -> Option<TextSize> {
+ Some(self.newlines.get(line_col.line as usize)? + TextSize::from(line_col.col))
}
- pub fn to_utf16(&self, line_col: LineCol) -> LineColUtf16 {
+ pub fn to_utf16(&self, line_col: LineCol) -> Option<LineColUtf16> {
let col = self.utf8_to_utf16_col(line_col.line, line_col.col.into());
- LineColUtf16 {
+ Some(LineColUtf16 {
line: line_col.line,
col: col as u32,
- }
+ })
}
- pub fn to_utf8(&self, line_col: LineColUtf16) -> LineCol {
+ pub fn to_utf8(&self, line_col: LineColUtf16) -> Option<LineCol> {
let col = self.utf16_to_utf8_col(line_col.line, line_col.col);
- LineCol {
+ Some(LineCol {
line: line_col.line,
col: col.into(),
- }
+ })
}
pub fn lines(&self, range: TextRange) -> impl Iterator<Item = TextRange> + '_ {
diff --git a/support/texlab/crates/links/Cargo.toml b/support/texlab/crates/links/Cargo.toml
new file mode 100644
index 0000000000..d3df0c95f8
--- /dev/null
+++ b/support/texlab/crates/links/Cargo.toml
@@ -0,0 +1,17 @@
+[package]
+name = "links"
+version = "0.0.0"
+license.workspace = true
+authors.workspace = true
+edition.workspace = true
+rust-version.workspace = true
+
+[dependencies]
+base-db = { path = "../base-db" }
+
+[dev-dependencies]
+test-utils = { path = "../test-utils" }
+expect-test = "1.4.1"
+
+[lib]
+doctest = false
diff --git a/support/texlab/crates/links/src/include.rs b/support/texlab/crates/links/src/include.rs
new file mode 100644
index 0000000000..374e0089df
--- /dev/null
+++ b/support/texlab/crates/links/src/include.rs
@@ -0,0 +1,26 @@
+use base_db::{DocumentLocation, FeatureParams};
+
+pub(super) fn find_links<'a>(
+ params: FeatureParams<'a>,
+ results: &mut Vec<DocumentLocation<'a>>,
+) -> Option<()> {
+ let document = params.document;
+ let parent = *params
+ .workspace
+ .parents(document)
+ .iter()
+ .next()
+ .unwrap_or(&document);
+
+ let graph = base_db::graph::Graph::new(params.workspace, parent);
+
+ for edge in &graph.edges {
+ if edge.source == document {
+ if let Some(weight) = &edge.weight {
+ results.push(DocumentLocation::new(edge.target, weight.link.path.range));
+ }
+ }
+ }
+
+ Some(())
+}
diff --git a/support/texlab/crates/links/src/lib.rs b/support/texlab/crates/links/src/lib.rs
new file mode 100644
index 0000000000..67e48cf930
--- /dev/null
+++ b/support/texlab/crates/links/src/lib.rs
@@ -0,0 +1,12 @@
+use base_db::{DocumentLocation, FeatureParams};
+
+mod include;
+
+pub fn find_links(params: FeatureParams) -> Vec<DocumentLocation> {
+ let mut results = Vec::new();
+ include::find_links(params, &mut results);
+ results
+}
+
+#[cfg(test)]
+mod tests;
diff --git a/support/texlab/crates/links/src/tests.rs b/support/texlab/crates/links/src/tests.rs
new file mode 100644
index 0000000000..d083b33be6
--- /dev/null
+++ b/support/texlab/crates/links/src/tests.rs
@@ -0,0 +1,57 @@
+use expect_test::{expect, Expect};
+
+fn check(input: &str, expect: Expect) {
+ let fixture = test_utils::fixture::Fixture::parse(input);
+ let (params, _) = fixture.make_params().unwrap();
+ let links = crate::find_links(params);
+
+ let actual_ranges = links.iter().map(|link| link.range).collect::<Vec<_>>();
+
+ let expected_ranges = fixture
+ .locations()
+ .map(|location| location.range)
+ .collect::<Vec<_>>();
+
+ assert_eq!(actual_ranges, expected_ranges);
+
+ let actual_targets = links
+ .iter()
+ .map(|link| link.document.uri.as_str())
+ .collect::<Vec<_>>();
+
+ expect.assert_debug_eq(&actual_targets);
+}
+
+#[test]
+fn test_document_include() {
+ check(
+ r#"
+%! foo.tex
+\input{bar.tex}
+ ^^^^^^^
+
+%! bar.tex"#,
+ expect![[r#"
+ [
+ "file:///texlab/bar.tex",
+ ]
+ "#]],
+ );
+}
+
+#[test]
+fn test_document_import() {
+ check(
+ r#"
+%! foo.tex
+\import{.}{bar/baz}
+ ^^^^^^^
+
+%! bar/baz.tex"#,
+ expect![[r#"
+ [
+ "file:///texlab/bar/baz.tex",
+ ]
+ "#]],
+ );
+}
diff --git a/support/texlab/crates/parser/Cargo.toml b/support/texlab/crates/parser/Cargo.toml
index 989569d0b6..47ab9bc721 100644
--- a/support/texlab/crates/parser/Cargo.toml
+++ b/support/texlab/crates/parser/Cargo.toml
@@ -9,13 +9,14 @@ rust-version.workspace = true
[dependencies]
logos = "0.13.0"
once_cell = "1.18.0"
-regex = "1.9.1"
-rowan = "0.15.11"
+regex = "1.10.2"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
+tempfile = "3.8.1"
[dev-dependencies]
-insta = { version = "1.32.0", features = ["glob", "redactions", "json"] }
+expect-test = "1.4.1"
[lib]
doctest = false
diff --git a/support/texlab/crates/parser/src/bibtex.rs b/support/texlab/crates/parser/src/bibtex.rs
index d74254b2c5..fda0d4a0ad 100644
--- a/support/texlab/crates/parser/src/bibtex.rs
+++ b/support/texlab/crates/parser/src/bibtex.rs
@@ -436,17 +436,4 @@ impl From<ContentToken> for SyntaxKind {
}
#[cfg(test)]
-mod tests {
- use syntax::bibtex;
-
- use super::parse_bibtex;
-
- #[test]
- fn test_parse() {
- insta::glob!("test_data/bibtex/{,**/}*.txt", |path| {
- let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n");
- let root = bibtex::SyntaxNode::new_root(parse_bibtex(&text));
- insta::assert_debug_snapshot!(root);
- });
- }
-}
+mod tests;
diff --git a/support/texlab/crates/parser/src/bibtex/tests.rs b/support/texlab/crates/parser/src/bibtex/tests.rs
new file mode 100644
index 0000000000..e2bb1314d8
--- /dev/null
+++ b/support/texlab/crates/parser/src/bibtex/tests.rs
@@ -0,0 +1,3994 @@
+use expect_test::{expect, Expect};
+
+use crate::parse_bibtex;
+
+fn check(input: &str, expect: Expect) {
+ let root = syntax::bibtex::SyntaxNode::new_root(parse_bibtex(input));
+ expect.assert_debug_eq(&root);
+}
+
+#[test]
+fn test_smoke() {
+ check(
+ r#""#,
+ expect![[r#"
+ ROOT@0..0
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_preamble() {
+ check(
+ r#"@article{test, author = {\"{\i}}}"#,
+ expect![[r#"
+ ROOT@0..33
+ ENTRY@0..33
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..13 "test"
+ COMMA@13..14 ","
+ WHITESPACE@14..15 " "
+ FIELD@15..32
+ NAME@15..21 "author"
+ WHITESPACE@21..22 " "
+ EQ@22..23 "="
+ WHITESPACE@23..24 " "
+ CURLY_GROUP@24..32
+ L_CURLY@24..25 "{"
+ ACCENT@25..31
+ ACCENT_NAME@25..27 "\\\""
+ L_CURLY@27..28 "{"
+ COMMAND_NAME@28..30 "\\i"
+ R_CURLY@30..31 "}"
+ R_CURLY@31..32 "}"
+ R_DELIM@32..33 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_comment() {
+ check(
+ r#"Some junk here
+
+@comment{foo,
+ author = {Foo Bar},
+ title = {Some Title},
+}
+"#,
+ expect![[r#"
+ ROOT@0..82
+ JUNK@0..16 "Some junk here\n\n"
+ TYPE@16..24 "@comment"
+ JUNK@24..82 "{foo,\n author = {F ..."
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_809() {
+ check(
+ r#"@article{issue_809,
+ title = {foo (" bar) baz},
+}"#,
+ expect![[r#"
+ ROOT@0..50
+ ENTRY@0..50
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..18 "issue_809"
+ COMMA@18..19 ","
+ WHITESPACE@19..22 "\n "
+ FIELD@22..48
+ NAME@22..27 "title"
+ WHITESPACE@27..28 " "
+ EQ@28..29 "="
+ WHITESPACE@29..30 " "
+ CURLY_GROUP@30..47
+ L_CURLY@30..31 "{"
+ WORD@31..34 "foo"
+ WHITESPACE@34..35 " "
+ WORD@35..36 "("
+ QUOTE@36..37 "\""
+ WHITESPACE@37..38 " "
+ WORD@38..42 "bar)"
+ WHITESPACE@42..43 " "
+ WORD@43..46 "baz"
+ R_CURLY@46..47 "}"
+ COMMA@47..48 ","
+ WHITESPACE@48..49 "\n"
+ R_DELIM@49..50 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_945() {
+ check(
+ r#"@article{test, author = {\"{\i}}}"#,
+ expect![[r#"
+ ROOT@0..33
+ ENTRY@0..33
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..13 "test"
+ COMMA@13..14 ","
+ WHITESPACE@14..15 " "
+ FIELD@15..32
+ NAME@15..21 "author"
+ WHITESPACE@21..22 " "
+ EQ@22..23 "="
+ WHITESPACE@23..24 " "
+ CURLY_GROUP@24..32
+ L_CURLY@24..25 "{"
+ ACCENT@25..31
+ ACCENT_NAME@25..27 "\\\""
+ L_CURLY@27..28 "{"
+ COMMAND_NAME@28..30 "\\i"
+ R_CURLY@30..31 "}"
+ R_CURLY@31..32 "}"
+ R_DELIM@32..33 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_aho_2006() {
+ check(
+ r#"@book{10.5555/1177220,
+ author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.},
+ title = {Compilers: Principles, Techniques, and Tools (2nd Edition)},
+ year = {2006},
+ isbn = {0321486811},
+ publisher = {Addison-Wesley Longman Publishing Co., Inc.},
+ address = {USA}
+}"#,
+ expect![[r#"
+ ROOT@0..314
+ ENTRY@0..314
+ TYPE@0..5 "@book"
+ L_DELIM@5..6 "{"
+ NAME@6..21 "10.5555/1177220"
+ COMMA@21..22 ","
+ WHITESPACE@22..27 "\n "
+ FIELD@27..111
+ NAME@27..33 "author"
+ WHITESPACE@33..34 " "
+ EQ@34..35 "="
+ WHITESPACE@35..36 " "
+ CURLY_GROUP@36..110
+ L_CURLY@36..37 "{"
+ WORD@37..40 "Aho"
+ COMMA@40..41 ","
+ WHITESPACE@41..42 " "
+ WORD@42..48 "Alfred"
+ WHITESPACE@48..49 " "
+ WORD@49..51 "V."
+ WHITESPACE@51..52 " "
+ WORD@52..55 "and"
+ WHITESPACE@55..56 " "
+ WORD@56..59 "Lam"
+ COMMA@59..60 ","
+ WHITESPACE@60..61 " "
+ WORD@61..67 "Monica"
+ WHITESPACE@67..68 " "
+ WORD@68..70 "S."
+ WHITESPACE@70..71 " "
+ WORD@71..74 "and"
+ WHITESPACE@74..75 " "
+ WORD@75..80 "Sethi"
+ COMMA@80..81 ","
+ WHITESPACE@81..82 " "
+ WORD@82..86 "Ravi"
+ WHITESPACE@86..87 " "
+ WORD@87..90 "and"
+ WHITESPACE@90..91 " "
+ WORD@91..97 "Ullman"
+ COMMA@97..98 ","
+ WHITESPACE@98..99 " "
+ WORD@99..106 "Jeffrey"
+ WHITESPACE@106..107 " "
+ WORD@107..109 "D."
+ R_CURLY@109..110 "}"
+ COMMA@110..111 ","
+ WHITESPACE@111..116 "\n "
+ FIELD@116..185
+ NAME@116..121 "title"
+ WHITESPACE@121..122 " "
+ EQ@122..123 "="
+ WHITESPACE@123..124 " "
+ CURLY_GROUP@124..184
+ L_CURLY@124..125 "{"
+ WORD@125..135 "Compilers:"
+ WHITESPACE@135..136 " "
+ WORD@136..146 "Principles"
+ COMMA@146..147 ","
+ WHITESPACE@147..148 " "
+ WORD@148..158 "Techniques"
+ COMMA@158..159 ","
+ WHITESPACE@159..160 " "
+ WORD@160..163 "and"
+ WHITESPACE@163..164 " "
+ WORD@164..169 "Tools"
+ WHITESPACE@169..170 " "
+ WORD@170..174 "(2nd"
+ WHITESPACE@174..175 " "
+ WORD@175..183 "Edition)"
+ R_CURLY@183..184 "}"
+ COMMA@184..185 ","
+ WHITESPACE@185..190 "\n "
+ FIELD@190..204
+ NAME@190..194 "year"
+ WHITESPACE@194..195 " "
+ EQ@195..196 "="
+ WHITESPACE@196..197 " "
+ CURLY_GROUP@197..203
+ L_CURLY@197..198 "{"
+ INTEGER@198..202 "2006"
+ R_CURLY@202..203 "}"
+ COMMA@203..204 ","
+ WHITESPACE@204..209 "\n "
+ FIELD@209..229
+ NAME@209..213 "isbn"
+ WHITESPACE@213..214 " "
+ EQ@214..215 "="
+ WHITESPACE@215..216 " "
+ CURLY_GROUP@216..228
+ L_CURLY@216..217 "{"
+ INTEGER@217..227 "0321486811"
+ R_CURLY@227..228 "}"
+ COMMA@228..229 ","
+ WHITESPACE@229..234 "\n "
+ FIELD@234..292
+ NAME@234..243 "publisher"
+ WHITESPACE@243..244 " "
+ EQ@244..245 "="
+ WHITESPACE@245..246 " "
+ CURLY_GROUP@246..291
+ L_CURLY@246..247 "{"
+ WORD@247..261 "Addison-Wesley"
+ WHITESPACE@261..262 " "
+ WORD@262..269 "Longman"
+ WHITESPACE@269..270 " "
+ WORD@270..280 "Publishing"
+ WHITESPACE@280..281 " "
+ WORD@281..284 "Co."
+ COMMA@284..285 ","
+ WHITESPACE@285..286 " "
+ WORD@286..290 "Inc."
+ R_CURLY@290..291 "}"
+ COMMA@291..292 ","
+ WHITESPACE@292..297 "\n "
+ FIELD@297..313
+ NAME@297..304 "address"
+ WHITESPACE@304..305 " "
+ EQ@305..306 "="
+ WHITESPACE@306..307 " "
+ CURLY_GROUP@307..312
+ L_CURLY@307..308 "{"
+ WORD@308..311 "USA"
+ R_CURLY@311..312 "}"
+ WHITESPACE@312..313 "\n"
+ R_DELIM@313..314 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_aksin_2006() {
+ check(
+ r#"@string{jomch = {J.~Organomet. Chem.}}
+
+@article{aksin,
+ author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent
+ and {\c{C}}etinkaya, Bekir and Ni, Chaoying and
+ B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan},
+ title = {Effect of immobilization on catalytic characteristics of
+ saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}
+ reactions},
+ journaltitle = jomch,
+ date = 2006,
+ volume = 691,
+ number = 13,
+ pages = {3027-3036},
+ indextitle = {Effect of immobilization on catalytic characteristics},
+}"#,
+ expect![[r#"
+ ROOT@0..679
+ STRING@0..40
+ TYPE@0..7 "@string"
+ L_DELIM@7..8 "{"
+ NAME@8..13 "jomch"
+ WHITESPACE@13..16 " "
+ EQ@16..17 "="
+ WHITESPACE@17..18 " "
+ CURLY_GROUP@18..39
+ L_CURLY@18..19 "{"
+ WORD@19..21 "J."
+ NBSP@21..22 "~"
+ WORD@22..32 "Organomet."
+ WHITESPACE@32..33 " "
+ WORD@33..38 "Chem."
+ R_CURLY@38..39 "}"
+ R_DELIM@39..40 "}"
+ JUNK@40..42 "\n\n"
+ ENTRY@42..679
+ TYPE@42..50 "@article"
+ L_DELIM@50..51 "{"
+ NAME@51..56 "aksin"
+ COMMA@56..57 ","
+ WHITESPACE@57..62 "\n "
+ FIELD@62..284
+ NAME@62..68 "author"
+ WHITESPACE@68..75 " "
+ EQ@75..76 "="
+ WHITESPACE@76..77 " "
+ CURLY_GROUP@77..283
+ L_CURLY@77..78 "{"
+ WORD@78..81 "Aks"
+ CURLY_GROUP@81..85
+ L_CURLY@81..82 "{"
+ COMMAND@82..84
+ COMMAND_NAME@82..84 "\\i"
+ R_CURLY@84..85 "}"
+ WORD@85..86 "n"
+ COMMA@86..87 ","
+ WHITESPACE@87..88 " "
+ CURLY_GROUP@88..93
+ L_CURLY@88..89 "{"
+ ACCENT@89..92
+ ACCENT_NAME@89..91 "\\\""
+ WORD@91..92 "O"
+ R_CURLY@92..93 "}"
+ WORD@93..96 "zge"
+ WHITESPACE@96..97 " "
+ WORD@97..100 "and"
+ WHITESPACE@100..101 " "
+ WORD@101..102 "T"
+ CURLY_GROUP@102..107
+ L_CURLY@102..103 "{"
+ ACCENT@103..106
+ ACCENT_NAME@103..105 "\\\""
+ WORD@105..106 "u"
+ R_CURLY@106..107 "}"
+ WORD@107..112 "rkmen"
+ COMMA@112..113 ","
+ WHITESPACE@113..114 " "
+ WORD@114..120 "Hayati"
+ WHITESPACE@120..121 " "
+ WORD@121..124 "and"
+ WHITESPACE@124..125 " "
+ WORD@125..130 "Artok"
+ COMMA@130..131 ","
+ WHITESPACE@131..132 " "
+ WORD@132..138 "Levent"
+ WHITESPACE@138..159 "\n "
+ WORD@159..162 "and"
+ WHITESPACE@162..163 " "
+ CURLY_GROUP@163..170
+ L_CURLY@163..164 "{"
+ ACCENT@164..169
+ ACCENT_NAME@164..166 "\\c"
+ L_CURLY@166..167 "{"
+ WORD@167..168 "C"
+ R_CURLY@168..169 "}"
+ R_CURLY@169..170 "}"
+ WORD@170..178 "etinkaya"
+ COMMA@178..179 ","
+ WHITESPACE@179..180 " "
+ WORD@180..185 "Bekir"
+ WHITESPACE@185..186 " "
+ WORD@186..189 "and"
+ WHITESPACE@189..190 " "
+ WORD@190..192 "Ni"
+ COMMA@192..193 ","
+ WHITESPACE@193..194 " "
+ WORD@194..202 "Chaoying"
+ WHITESPACE@202..203 " "
+ WORD@203..206 "and"
+ WHITESPACE@206..227 "\n "
+ WORD@227..228 "B"
+ CURLY_GROUP@228..233
+ L_CURLY@228..229 "{"
+ ACCENT@229..232
+ ACCENT_NAME@229..231 "\\\""
+ WORD@231..232 "u"
+ R_CURLY@232..233 "}"
+ WORD@233..234 "y"
+ CURLY_GROUP@234..239
+ L_CURLY@234..235 "{"
+ ACCENT@235..238
+ ACCENT_NAME@235..237 "\\\""
+ WORD@237..238 "u"
+ R_CURLY@238..239 "}"
+ WORD@239..241 "kg"
+ CURLY_GROUP@241..246
+ L_CURLY@241..242 "{"
+ ACCENT@242..245
+ ACCENT_NAME@242..244 "\\\""
+ WORD@244..245 "u"
+ R_CURLY@245..246 "}"
+ WORD@246..248 "ng"
+ CURLY_GROUP@248..253
+ L_CURLY@248..249 "{"
+ ACCENT@249..252
+ ACCENT_NAME@249..251 "\\\""
+ WORD@251..252 "o"
+ R_CURLY@252..253 "}"
+ WORD@253..254 "r"
+ COMMA@254..255 ","
+ WHITESPACE@255..256 " "
+ WORD@256..261 "Orhan"
+ WHITESPACE@261..262 " "
+ WORD@262..265 "and"
+ WHITESPACE@265..266 " "
+ CURLY_GROUP@266..271
+ L_CURLY@266..267 "{"
+ ACCENT@267..270
+ ACCENT_NAME@267..269 "\\\""
+ WORD@269..270 "O"
+ R_CURLY@270..271 "}"
+ WORD@271..275 "zkal"
+ COMMA@275..276 ","
+ WHITESPACE@276..277 " "
+ WORD@277..282 "Erhan"
+ R_CURLY@282..283 "}"
+ COMMA@283..284 ","
+ WHITESPACE@284..289 "\n "
+ FIELD@289..471
+ NAME@289..294 "title"
+ WHITESPACE@294..302 " "
+ EQ@302..303 "="
+ WHITESPACE@303..304 " "
+ CURLY_GROUP@304..470
+ L_CURLY@304..305 "{"
+ WORD@305..311 "Effect"
+ WHITESPACE@311..312 " "
+ WORD@312..314 "of"
+ WHITESPACE@314..315 " "
+ WORD@315..329 "immobilization"
+ WHITESPACE@329..330 " "
+ WORD@330..332 "on"
+ WHITESPACE@332..333 " "
+ WORD@333..342 "catalytic"
+ WHITESPACE@342..343 " "
+ WORD@343..358 "characteristics"
+ WHITESPACE@358..359 " "
+ WORD@359..361 "of"
+ WHITESPACE@361..382 "\n "
+ WORD@382..391 "saturated"
+ WHITESPACE@391..392 " "
+ CURLY_GROUP@392..398
+ L_CURLY@392..393 "{"
+ WORD@393..397 "Pd-N"
+ R_CURLY@397..398 "}"
+ WORD@398..411 "-heterocyclic"
+ WHITESPACE@411..412 " "
+ WORD@412..420 "carbenes"
+ WHITESPACE@420..421 " "
+ WORD@421..423 "in"
+ WHITESPACE@423..424 " "
+ CURLY_GROUP@424..439
+ L_CURLY@424..425 "{"
+ WORD@425..438 "Mizoroki-Heck"
+ R_CURLY@438..439 "}"
+ WHITESPACE@439..460 "\n "
+ WORD@460..469 "reactions"
+ R_CURLY@469..470 "}"
+ COMMA@470..471 ","
+ WHITESPACE@471..476 "\n "
+ FIELD@476..497
+ NAME@476..488 "journaltitle"
+ WHITESPACE@488..489 " "
+ EQ@489..490 "="
+ WHITESPACE@490..491 " "
+ LITERAL@491..496
+ NAME@491..496 "jomch"
+ COMMA@496..497 ","
+ WHITESPACE@497..502 "\n "
+ FIELD@502..522
+ NAME@502..506 "date"
+ WHITESPACE@506..515 " "
+ EQ@515..516 "="
+ WHITESPACE@516..517 " "
+ LITERAL@517..521
+ INTEGER@517..521 "2006"
+ COMMA@521..522 ","
+ WHITESPACE@522..527 "\n "
+ FIELD@527..546
+ NAME@527..533 "volume"
+ WHITESPACE@533..540 " "
+ EQ@540..541 "="
+ WHITESPACE@541..542 " "
+ LITERAL@542..545
+ INTEGER@542..545 "691"
+ COMMA@545..546 ","
+ WHITESPACE@546..551 "\n "
+ FIELD@551..569
+ NAME@551..557 "number"
+ WHITESPACE@557..564 " "
+ EQ@564..565 "="
+ WHITESPACE@565..566 " "
+ LITERAL@566..568
+ INTEGER@566..568 "13"
+ COMMA@568..569 ","
+ WHITESPACE@569..574 "\n "
+ FIELD@574..601
+ NAME@574..579 "pages"
+ WHITESPACE@579..587 " "
+ EQ@587..588 "="
+ WHITESPACE@588..589 " "
+ CURLY_GROUP@589..600
+ L_CURLY@589..590 "{"
+ WORD@590..599 "3027-3036"
+ R_CURLY@599..600 "}"
+ COMMA@600..601 ","
+ WHITESPACE@601..606 "\n "
+ FIELD@606..677
+ NAME@606..616 "indextitle"
+ WHITESPACE@616..619 " "
+ EQ@619..620 "="
+ WHITESPACE@620..621 " "
+ CURLY_GROUP@621..676
+ L_CURLY@621..622 "{"
+ WORD@622..628 "Effect"
+ WHITESPACE@628..629 " "
+ WORD@629..631 "of"
+ WHITESPACE@631..632 " "
+ WORD@632..646 "immobilization"
+ WHITESPACE@646..647 " "
+ WORD@647..649 "on"
+ WHITESPACE@649..650 " "
+ WORD@650..659 "catalytic"
+ WHITESPACE@659..660 " "
+ WORD@660..675 "characteristics"
+ R_CURLY@675..676 "}"
+ COMMA@676..677 ","
+ WHITESPACE@677..678 "\n"
+ R_DELIM@678..679 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_almendro_1998() {
+ check(
+ r#"@patent{almendro,
+ author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez,
+ Alberto and Nozal, Fernando},
+ title = {Elektromagnetisches Signalhorn},
+ number = {EU-29702195U},
+ date = 1998,
+ location = {countryfr and countryuk and countryde},
+ langid = {german},
+ annotation = {This is a \texttt{patent} entry with a \texttt{location}
+ field. The number is given in the \texttt{number} field. Note
+ the format of the \texttt{location} field in the database
+ file. Compare \texttt{laufenberg}, \texttt{sorace}, and
+ \texttt{kowalik}},
+}"#,
+ expect![[r#"
+ ROOT@0..706
+ ENTRY@0..706
+ TYPE@0..7 "@patent"
+ L_DELIM@7..8 "{"
+ NAME@8..16 "almendro"
+ COMMA@16..17 ","
+ WHITESPACE@17..22 "\n "
+ FIELD@22..150
+ NAME@22..28 "author"
+ WHITESPACE@28..35 " "
+ EQ@35..36 "="
+ WHITESPACE@36..37 " "
+ CURLY_GROUP@37..149
+ L_CURLY@37..38 "{"
+ WORD@38..46 "Almendro"
+ COMMA@46..47 ","
+ WHITESPACE@47..48 " "
+ WORD@48..51 "Jos"
+ CURLY_GROUP@51..56
+ L_CURLY@51..52 "{"
+ ACCENT@52..55
+ ACCENT_NAME@52..54 "\\'"
+ WORD@54..55 "e"
+ R_CURLY@55..56 "}"
+ WHITESPACE@56..57 " "
+ WORD@57..59 "L."
+ WHITESPACE@59..60 " "
+ WORD@60..63 "and"
+ WHITESPACE@63..64 " "
+ WORD@64..68 "Mart"
+ CURLY_GROUP@68..73
+ L_CURLY@68..69 "{"
+ ACCENT@69..72
+ ACCENT_NAME@69..71 "\\'"
+ WORD@71..72 "i"
+ R_CURLY@72..73 "}"
+ WORD@73..74 "n"
+ COMMA@74..75 ","
+ WHITESPACE@75..76 " "
+ WORD@76..83 "Jacinto"
+ WHITESPACE@83..84 " "
+ WORD@84..87 "and"
+ WHITESPACE@87..88 " "
+ WORD@88..89 "S"
+ CURLY_GROUP@89..94
+ L_CURLY@89..90 "{"
+ ACCENT@90..93
+ ACCENT_NAME@90..92 "\\'"
+ WORD@92..93 "a"
+ R_CURLY@93..94 "}"
+ WORD@94..99 "nchez"
+ COMMA@99..100 ","
+ WHITESPACE@100..121 "\n "
+ WORD@121..128 "Alberto"
+ WHITESPACE@128..129 " "
+ WORD@129..132 "and"
+ WHITESPACE@132..133 " "
+ WORD@133..138 "Nozal"
+ COMMA@138..139 ","
+ WHITESPACE@139..140 " "
+ WORD@140..148 "Fernando"
+ R_CURLY@148..149 "}"
+ COMMA@149..150 ","
+ WHITESPACE@150..155 "\n "
+ FIELD@155..203
+ NAME@155..160 "title"
+ WHITESPACE@160..168 " "
+ EQ@168..169 "="
+ WHITESPACE@169..170 " "
+ CURLY_GROUP@170..202
+ L_CURLY@170..171 "{"
+ WORD@171..190 "Elektromagnetisches"
+ WHITESPACE@190..191 " "
+ WORD@191..201 "Signalhorn"
+ R_CURLY@201..202 "}"
+ COMMA@202..203 ","
+ WHITESPACE@203..208 "\n "
+ FIELD@208..238
+ NAME@208..214 "number"
+ WHITESPACE@214..221 " "
+ EQ@221..222 "="
+ WHITESPACE@222..223 " "
+ CURLY_GROUP@223..237
+ L_CURLY@223..224 "{"
+ WORD@224..236 "EU-29702195U"
+ R_CURLY@236..237 "}"
+ COMMA@237..238 ","
+ WHITESPACE@238..243 "\n "
+ FIELD@243..263
+ NAME@243..247 "date"
+ WHITESPACE@247..256 " "
+ EQ@256..257 "="
+ WHITESPACE@257..258 " "
+ LITERAL@258..262
+ INTEGER@258..262 "1998"
+ COMMA@262..263 ","
+ WHITESPACE@263..268 "\n "
+ FIELD@268..323
+ NAME@268..276 "location"
+ WHITESPACE@276..281 " "
+ EQ@281..282 "="
+ WHITESPACE@282..283 " "
+ CURLY_GROUP@283..322
+ L_CURLY@283..284 "{"
+ WORD@284..293 "countryfr"
+ WHITESPACE@293..294 " "
+ WORD@294..297 "and"
+ WHITESPACE@297..298 " "
+ WORD@298..307 "countryuk"
+ WHITESPACE@307..308 " "
+ WORD@308..311 "and"
+ WHITESPACE@311..312 " "
+ WORD@312..321 "countryde"
+ R_CURLY@321..322 "}"
+ COMMA@322..323 ","
+ WHITESPACE@323..328 "\n "
+ FIELD@328..352
+ NAME@328..334 "langid"
+ WHITESPACE@334..341 " "
+ EQ@341..342 "="
+ WHITESPACE@342..343 " "
+ CURLY_GROUP@343..351
+ L_CURLY@343..344 "{"
+ WORD@344..350 "german"
+ R_CURLY@350..351 "}"
+ COMMA@351..352 ","
+ WHITESPACE@352..357 "\n "
+ FIELD@357..704
+ NAME@357..367 "annotation"
+ WHITESPACE@367..370 " "
+ EQ@370..371 "="
+ WHITESPACE@371..372 " "
+ CURLY_GROUP@372..703
+ L_CURLY@372..373 "{"
+ WORD@373..377 "This"
+ WHITESPACE@377..378 " "
+ WORD@378..380 "is"
+ WHITESPACE@380..381 " "
+ WORD@381..382 "a"
+ WHITESPACE@382..383 " "
+ COMMAND@383..390
+ COMMAND_NAME@383..390 "\\texttt"
+ CURLY_GROUP@390..398
+ L_CURLY@390..391 "{"
+ WORD@391..397 "patent"
+ R_CURLY@397..398 "}"
+ WHITESPACE@398..399 " "
+ WORD@399..404 "entry"
+ WHITESPACE@404..405 " "
+ WORD@405..409 "with"
+ WHITESPACE@409..410 " "
+ WORD@410..411 "a"
+ WHITESPACE@411..412 " "
+ COMMAND@412..419
+ COMMAND_NAME@412..419 "\\texttt"
+ CURLY_GROUP@419..429
+ L_CURLY@419..420 "{"
+ WORD@420..428 "location"
+ R_CURLY@428..429 "}"
+ WHITESPACE@429..450 "\n "
+ WORD@450..456 "field."
+ WHITESPACE@456..457 " "
+ WORD@457..460 "The"
+ WHITESPACE@460..461 " "
+ WORD@461..467 "number"
+ WHITESPACE@467..468 " "
+ WORD@468..470 "is"
+ WHITESPACE@470..471 " "
+ WORD@471..476 "given"
+ WHITESPACE@476..477 " "
+ WORD@477..479 "in"
+ WHITESPACE@479..480 " "
+ WORD@480..483 "the"
+ WHITESPACE@483..484 " "
+ COMMAND@484..491
+ COMMAND_NAME@484..491 "\\texttt"
+ CURLY_GROUP@491..499
+ L_CURLY@491..492 "{"
+ WORD@492..498 "number"
+ R_CURLY@498..499 "}"
+ WHITESPACE@499..500 " "
+ WORD@500..506 "field."
+ WHITESPACE@506..507 " "
+ WORD@507..511 "Note"
+ WHITESPACE@511..532 "\n "
+ WORD@532..535 "the"
+ WHITESPACE@535..536 " "
+ WORD@536..542 "format"
+ WHITESPACE@542..543 " "
+ WORD@543..545 "of"
+ WHITESPACE@545..546 " "
+ WORD@546..549 "the"
+ WHITESPACE@549..550 " "
+ COMMAND@550..557
+ COMMAND_NAME@550..557 "\\texttt"
+ CURLY_GROUP@557..567
+ L_CURLY@557..558 "{"
+ WORD@558..566 "location"
+ R_CURLY@566..567 "}"
+ WHITESPACE@567..568 " "
+ WORD@568..573 "field"
+ WHITESPACE@573..574 " "
+ WORD@574..576 "in"
+ WHITESPACE@576..577 " "
+ WORD@577..580 "the"
+ WHITESPACE@580..581 " "
+ WORD@581..589 "database"
+ WHITESPACE@589..610 "\n "
+ WORD@610..615 "file."
+ WHITESPACE@615..616 " "
+ WORD@616..623 "Compare"
+ WHITESPACE@623..624 " "
+ COMMAND@624..631
+ COMMAND_NAME@624..631 "\\texttt"
+ CURLY_GROUP@631..643
+ L_CURLY@631..632 "{"
+ WORD@632..642 "laufenberg"
+ R_CURLY@642..643 "}"
+ COMMA@643..644 ","
+ WHITESPACE@644..645 " "
+ COMMAND@645..652
+ COMMAND_NAME@645..652 "\\texttt"
+ CURLY_GROUP@652..660
+ L_CURLY@652..653 "{"
+ WORD@653..659 "sorace"
+ R_CURLY@659..660 "}"
+ COMMA@660..661 ","
+ WHITESPACE@661..662 " "
+ WORD@662..665 "and"
+ WHITESPACE@665..686 "\n "
+ COMMAND@686..693
+ COMMAND_NAME@686..693 "\\texttt"
+ CURLY_GROUP@693..702
+ L_CURLY@693..694 "{"
+ WORD@694..701 "kowalik"
+ R_CURLY@701..702 "}"
+ R_CURLY@702..703 "}"
+ COMMA@703..704 ","
+ WHITESPACE@704..705 "\n"
+ R_DELIM@705..706 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_averroes_1998() {
+ check(
+ r#"@book{averroes/bland,
+ author = {Averroes},
+ title = {The Epistle on the Possibility of Conjunction with the Active
+ Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},
+ date = 1982,
+ editor = {Bland, Kalman P.},
+ translator = {Bland, Kalman P.},
+ series = {Moreshet: Studies in {Jewish} History, Literature and Thought},
+ number = 7,
+ publisher = {Jewish Theological Seminary of America},
+ location = {New York},
+ keywords = {primary},
+ langid = {english},
+ langidopts = {variant=american},
+ indextitle = {Epistle on the Possibility of Conjunction, The},
+ shorttitle = {Possibility of Conjunction},
+ annotation = {A \texttt{book} entry with a \texttt{series} and a
+ \texttt{number}. Note the concatenation of the \texttt{editor}
+ and \texttt{translator} fields as well as the
+ \texttt{indextitle} field},
+}"#,
+ expect![[r#"
+ ROOT@0..1008
+ ENTRY@0..1008
+ TYPE@0..5 "@book"
+ L_DELIM@5..6 "{"
+ NAME@6..20 "averroes/bland"
+ COMMA@20..21 ","
+ WHITESPACE@21..26 "\n "
+ FIELD@26..52
+ NAME@26..32 "author"
+ WHITESPACE@32..39 " "
+ EQ@39..40 "="
+ WHITESPACE@40..41 " "
+ CURLY_GROUP@41..51
+ L_CURLY@41..42 "{"
+ WORD@42..50 "Averroes"
+ R_CURLY@50..51 "}"
+ COMMA@51..52 ","
+ WHITESPACE@52..57 "\n "
+ FIELD@57..220
+ NAME@57..62 "title"
+ WHITESPACE@62..70 " "
+ EQ@70..71 "="
+ WHITESPACE@71..72 " "
+ CURLY_GROUP@72..219
+ L_CURLY@72..73 "{"
+ WORD@73..76 "The"
+ WHITESPACE@76..77 " "
+ WORD@77..84 "Epistle"
+ WHITESPACE@84..85 " "
+ WORD@85..87 "on"
+ WHITESPACE@87..88 " "
+ WORD@88..91 "the"
+ WHITESPACE@91..92 " "
+ WORD@92..103 "Possibility"
+ WHITESPACE@103..104 " "
+ WORD@104..106 "of"
+ WHITESPACE@106..107 " "
+ WORD@107..118 "Conjunction"
+ WHITESPACE@118..119 " "
+ WORD@119..123 "with"
+ WHITESPACE@123..124 " "
+ WORD@124..127 "the"
+ WHITESPACE@127..128 " "
+ WORD@128..134 "Active"
+ WHITESPACE@134..155 "\n "
+ WORD@155..164 "Intellect"
+ WHITESPACE@164..165 " "
+ WORD@165..167 "by"
+ WHITESPACE@167..168 " "
+ CURLY_GROUP@168..179
+ L_CURLY@168..169 "{"
+ WORD@169..172 "Ibn"
+ WHITESPACE@172..173 " "
+ WORD@173..178 "Rushd"
+ R_CURLY@178..179 "}"
+ WHITESPACE@179..180 " "
+ WORD@180..184 "with"
+ WHITESPACE@184..185 " "
+ WORD@185..188 "the"
+ WHITESPACE@188..189 " "
+ WORD@189..199 "Commentary"
+ WHITESPACE@199..200 " "
+ WORD@200..202 "of"
+ WHITESPACE@202..203 " "
+ CURLY_GROUP@203..218
+ L_CURLY@203..204 "{"
+ WORD@204..209 "Moses"
+ WHITESPACE@209..210 " "
+ WORD@210..217 "Narboni"
+ R_CURLY@217..218 "}"
+ R_CURLY@218..219 "}"
+ COMMA@219..220 ","
+ WHITESPACE@220..225 "\n "
+ FIELD@225..245
+ NAME@225..229 "date"
+ WHITESPACE@229..238 " "
+ EQ@238..239 "="
+ WHITESPACE@239..240 " "
+ LITERAL@240..244
+ INTEGER@240..244 "1982"
+ COMMA@244..245 ","
+ WHITESPACE@245..250 "\n "
+ FIELD@250..284
+ NAME@250..256 "editor"
+ WHITESPACE@256..263 " "
+ EQ@263..264 "="
+ WHITESPACE@264..265 " "
+ CURLY_GROUP@265..283
+ L_CURLY@265..266 "{"
+ WORD@266..271 "Bland"
+ COMMA@271..272 ","
+ WHITESPACE@272..273 " "
+ WORD@273..279 "Kalman"
+ WHITESPACE@279..280 " "
+ WORD@280..282 "P."
+ R_CURLY@282..283 "}"
+ COMMA@283..284 ","
+ WHITESPACE@284..289 "\n "
+ FIELD@289..323
+ NAME@289..299 "translator"
+ WHITESPACE@299..302 " "
+ EQ@302..303 "="
+ WHITESPACE@303..304 " "
+ CURLY_GROUP@304..322
+ L_CURLY@304..305 "{"
+ WORD@305..310 "Bland"
+ COMMA@310..311 ","
+ WHITESPACE@311..312 " "
+ WORD@312..318 "Kalman"
+ WHITESPACE@318..319 " "
+ WORD@319..321 "P."
+ R_CURLY@321..322 "}"
+ COMMA@322..323 ","
+ WHITESPACE@323..328 "\n "
+ FIELD@328..407
+ NAME@328..334 "series"
+ WHITESPACE@334..341 " "
+ EQ@341..342 "="
+ WHITESPACE@342..343 " "
+ CURLY_GROUP@343..406
+ L_CURLY@343..344 "{"
+ WORD@344..353 "Moreshet:"
+ WHITESPACE@353..354 " "
+ WORD@354..361 "Studies"
+ WHITESPACE@361..362 " "
+ WORD@362..364 "in"
+ WHITESPACE@364..365 " "
+ CURLY_GROUP@365..373
+ L_CURLY@365..366 "{"
+ WORD@366..372 "Jewish"
+ R_CURLY@372..373 "}"
+ WHITESPACE@373..374 " "
+ WORD@374..381 "History"
+ COMMA@381..382 ","
+ WHITESPACE@382..383 " "
+ WORD@383..393 "Literature"
+ WHITESPACE@393..394 " "
+ WORD@394..397 "and"
+ WHITESPACE@397..398 " "
+ WORD@398..405 "Thought"
+ R_CURLY@405..406 "}"
+ COMMA@406..407 ","
+ WHITESPACE@407..412 "\n "
+ FIELD@412..429
+ NAME@412..418 "number"
+ WHITESPACE@418..425 " "
+ EQ@425..426 "="
+ WHITESPACE@426..427 " "
+ LITERAL@427..428
+ INTEGER@427..428 "7"
+ COMMA@428..429 ","
+ WHITESPACE@429..434 "\n "
+ FIELD@434..490
+ NAME@434..443 "publisher"
+ WHITESPACE@443..447 " "
+ EQ@447..448 "="
+ WHITESPACE@448..449 " "
+ CURLY_GROUP@449..489
+ L_CURLY@449..450 "{"
+ WORD@450..456 "Jewish"
+ WHITESPACE@456..457 " "
+ WORD@457..468 "Theological"
+ WHITESPACE@468..469 " "
+ WORD@469..477 "Seminary"
+ WHITESPACE@477..478 " "
+ WORD@478..480 "of"
+ WHITESPACE@480..481 " "
+ WORD@481..488 "America"
+ R_CURLY@488..489 "}"
+ COMMA@489..490 ","
+ WHITESPACE@490..495 "\n "
+ FIELD@495..521
+ NAME@495..503 "location"
+ WHITESPACE@503..508 " "
+ EQ@508..509 "="
+ WHITESPACE@509..510 " "
+ CURLY_GROUP@510..520
+ L_CURLY@510..511 "{"
+ WORD@511..514 "New"
+ WHITESPACE@514..515 " "
+ WORD@515..519 "York"
+ R_CURLY@519..520 "}"
+ COMMA@520..521 ","
+ WHITESPACE@521..526 "\n "
+ FIELD@526..551
+ NAME@526..534 "keywords"
+ WHITESPACE@534..539 " "
+ EQ@539..540 "="
+ WHITESPACE@540..541 " "
+ CURLY_GROUP@541..550
+ L_CURLY@541..542 "{"
+ WORD@542..549 "primary"
+ R_CURLY@549..550 "}"
+ COMMA@550..551 ","
+ WHITESPACE@551..556 "\n "
+ FIELD@556..581
+ NAME@556..562 "langid"
+ WHITESPACE@562..569 " "
+ EQ@569..570 "="
+ WHITESPACE@570..571 " "
+ CURLY_GROUP@571..580
+ L_CURLY@571..572 "{"
+ WORD@572..579 "english"
+ R_CURLY@579..580 "}"
+ COMMA@580..581 ","
+ WHITESPACE@581..586 "\n "
+ FIELD@586..620
+ NAME@586..596 "langidopts"
+ WHITESPACE@596..599 " "
+ EQ@599..600 "="
+ WHITESPACE@600..601 " "
+ CURLY_GROUP@601..619
+ L_CURLY@601..602 "{"
+ WORD@602..618 "variant=american"
+ R_CURLY@618..619 "}"
+ COMMA@619..620 ","
+ WHITESPACE@620..625 "\n "
+ FIELD@625..689
+ NAME@625..635 "indextitle"
+ WHITESPACE@635..638 " "
+ EQ@638..639 "="
+ WHITESPACE@639..640 " "
+ CURLY_GROUP@640..688
+ L_CURLY@640..641 "{"
+ WORD@641..648 "Epistle"
+ WHITESPACE@648..649 " "
+ WORD@649..651 "on"
+ WHITESPACE@651..652 " "
+ WORD@652..655 "the"
+ WHITESPACE@655..656 " "
+ WORD@656..667 "Possibility"
+ WHITESPACE@667..668 " "
+ WORD@668..670 "of"
+ WHITESPACE@670..671 " "
+ WORD@671..682 "Conjunction"
+ COMMA@682..683 ","
+ WHITESPACE@683..684 " "
+ WORD@684..687 "The"
+ R_CURLY@687..688 "}"
+ COMMA@688..689 ","
+ WHITESPACE@689..694 "\n "
+ FIELD@694..738
+ NAME@694..704 "shorttitle"
+ WHITESPACE@704..707 " "
+ EQ@707..708 "="
+ WHITESPACE@708..709 " "
+ CURLY_GROUP@709..737
+ L_CURLY@709..710 "{"
+ WORD@710..721 "Possibility"
+ WHITESPACE@721..722 " "
+ WORD@722..724 "of"
+ WHITESPACE@724..725 " "
+ WORD@725..736 "Conjunction"
+ R_CURLY@736..737 "}"
+ COMMA@737..738 ","
+ WHITESPACE@738..743 "\n "
+ FIELD@743..1006
+ NAME@743..753 "annotation"
+ WHITESPACE@753..756 " "
+ EQ@756..757 "="
+ WHITESPACE@757..758 " "
+ CURLY_GROUP@758..1005
+ L_CURLY@758..759 "{"
+ WORD@759..760 "A"
+ WHITESPACE@760..761 " "
+ COMMAND@761..768
+ COMMAND_NAME@761..768 "\\texttt"
+ CURLY_GROUP@768..774
+ L_CURLY@768..769 "{"
+ WORD@769..773 "book"
+ R_CURLY@773..774 "}"
+ WHITESPACE@774..775 " "
+ WORD@775..780 "entry"
+ WHITESPACE@780..781 " "
+ WORD@781..785 "with"
+ WHITESPACE@785..786 " "
+ WORD@786..787 "a"
+ WHITESPACE@787..788 " "
+ COMMAND@788..795
+ COMMAND_NAME@788..795 "\\texttt"
+ CURLY_GROUP@795..803
+ L_CURLY@795..796 "{"
+ WORD@796..802 "series"
+ R_CURLY@802..803 "}"
+ WHITESPACE@803..804 " "
+ WORD@804..807 "and"
+ WHITESPACE@807..808 " "
+ WORD@808..809 "a"
+ WHITESPACE@809..830 "\n "
+ COMMAND@830..837
+ COMMAND_NAME@830..837 "\\texttt"
+ CURLY_GROUP@837..845
+ L_CURLY@837..838 "{"
+ WORD@838..844 "number"
+ R_CURLY@844..845 "}"
+ WORD@845..846 "."
+ WHITESPACE@846..847 " "
+ WORD@847..851 "Note"
+ WHITESPACE@851..852 " "
+ WORD@852..855 "the"
+ WHITESPACE@855..856 " "
+ WORD@856..869 "concatenation"
+ WHITESPACE@869..870 " "
+ WORD@870..872 "of"
+ WHITESPACE@872..873 " "
+ WORD@873..876 "the"
+ WHITESPACE@876..877 " "
+ COMMAND@877..884
+ COMMAND_NAME@877..884 "\\texttt"
+ CURLY_GROUP@884..892
+ L_CURLY@884..885 "{"
+ WORD@885..891 "editor"
+ R_CURLY@891..892 "}"
+ WHITESPACE@892..913 "\n "
+ WORD@913..916 "and"
+ WHITESPACE@916..917 " "
+ COMMAND@917..924
+ COMMAND_NAME@917..924 "\\texttt"
+ CURLY_GROUP@924..936
+ L_CURLY@924..925 "{"
+ WORD@925..935 "translator"
+ R_CURLY@935..936 "}"
+ WHITESPACE@936..937 " "
+ WORD@937..943 "fields"
+ WHITESPACE@943..944 " "
+ WORD@944..946 "as"
+ WHITESPACE@946..947 " "
+ WORD@947..951 "well"
+ WHITESPACE@951..952 " "
+ WORD@952..954 "as"
+ WHITESPACE@954..955 " "
+ WORD@955..958 "the"
+ WHITESPACE@958..979 "\n "
+ COMMAND@979..986
+ COMMAND_NAME@979..986 "\\texttt"
+ CURLY_GROUP@986..998
+ L_CURLY@986..987 "{"
+ WORD@987..997 "indextitle"
+ R_CURLY@997..998 "}"
+ WHITESPACE@998..999 " "
+ WORD@999..1004 "field"
+ R_CURLY@1004..1005 "}"
+ COMMA@1005..1006 ","
+ WHITESPACE@1006..1007 "\n"
+ R_DELIM@1007..1008 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_betram_1996() {
+ check(
+ r#"@string{jams = {J.~Amer. Math. Soc.}}
+
+@article{bertram,
+ author = {Bertram, Aaron and Wentworth, Richard},
+ title = {Gromov invariants for holomorphic maps on {Riemann} surfaces},
+ journaltitle = jams,
+ date = 1996,
+ volume = 9,
+ number = 2,
+ pages = {529-571},
+ langid = {english},
+ langidopts = {variant=american},
+ shorttitle = {Gromov invariants},
+ annotation = {An \texttt{article} entry with a \texttt{volume} and a
+ \texttt{number} field},
+}"#,
+ expect![[r#"
+ ROOT@0..556
+ STRING@0..40
+ TYPE@0..7 "@string"
+ L_DELIM@7..8 "{"
+ NAME@8..12 "jams"
+ WHITESPACE@12..16 " "
+ EQ@16..17 "="
+ WHITESPACE@17..18 " "
+ CURLY_GROUP@18..39
+ L_CURLY@18..19 "{"
+ WORD@19..21 "J."
+ NBSP@21..22 "~"
+ WORD@22..27 "Amer."
+ WHITESPACE@27..28 " "
+ WORD@28..33 "Math."
+ WHITESPACE@33..34 " "
+ WORD@34..38 "Soc."
+ R_CURLY@38..39 "}"
+ R_DELIM@39..40 "}"
+ JUNK@40..42 "\n\n"
+ ENTRY@42..556
+ TYPE@42..50 "@article"
+ L_DELIM@50..51 "{"
+ NAME@51..58 "bertram"
+ COMMA@58..59 ","
+ WHITESPACE@59..64 "\n "
+ FIELD@64..119
+ NAME@64..70 "author"
+ WHITESPACE@70..77 " "
+ EQ@77..78 "="
+ WHITESPACE@78..79 " "
+ CURLY_GROUP@79..118
+ L_CURLY@79..80 "{"
+ WORD@80..87 "Bertram"
+ COMMA@87..88 ","
+ WHITESPACE@88..89 " "
+ WORD@89..94 "Aaron"
+ WHITESPACE@94..95 " "
+ WORD@95..98 "and"
+ WHITESPACE@98..99 " "
+ WORD@99..108 "Wentworth"
+ COMMA@108..109 ","
+ WHITESPACE@109..110 " "
+ WORD@110..117 "Richard"
+ R_CURLY@117..118 "}"
+ COMMA@118..119 ","
+ WHITESPACE@119..124 "\n "
+ FIELD@124..202
+ NAME@124..129 "title"
+ WHITESPACE@129..137 " "
+ EQ@137..138 "="
+ WHITESPACE@138..139 " "
+ CURLY_GROUP@139..201
+ L_CURLY@139..140 "{"
+ WORD@140..146 "Gromov"
+ WHITESPACE@146..147 " "
+ WORD@147..157 "invariants"
+ WHITESPACE@157..158 " "
+ WORD@158..161 "for"
+ WHITESPACE@161..162 " "
+ WORD@162..173 "holomorphic"
+ WHITESPACE@173..174 " "
+ WORD@174..178 "maps"
+ WHITESPACE@178..179 " "
+ WORD@179..181 "on"
+ WHITESPACE@181..182 " "
+ CURLY_GROUP@182..191
+ L_CURLY@182..183 "{"
+ WORD@183..190 "Riemann"
+ R_CURLY@190..191 "}"
+ WHITESPACE@191..192 " "
+ WORD@192..200 "surfaces"
+ R_CURLY@200..201 "}"
+ COMMA@201..202 ","
+ WHITESPACE@202..207 "\n "
+ FIELD@207..227
+ NAME@207..219 "journaltitle"
+ WHITESPACE@219..220 " "
+ EQ@220..221 "="
+ WHITESPACE@221..222 " "
+ LITERAL@222..226
+ NAME@222..226 "jams"
+ COMMA@226..227 ","
+ WHITESPACE@227..232 "\n "
+ FIELD@232..252
+ NAME@232..236 "date"
+ WHITESPACE@236..245 " "
+ EQ@245..246 "="
+ WHITESPACE@246..247 " "
+ LITERAL@247..251
+ INTEGER@247..251 "1996"
+ COMMA@251..252 ","
+ WHITESPACE@252..257 "\n "
+ FIELD@257..274
+ NAME@257..263 "volume"
+ WHITESPACE@263..270 " "
+ EQ@270..271 "="
+ WHITESPACE@271..272 " "
+ LITERAL@272..273
+ INTEGER@272..273 "9"
+ COMMA@273..274 ","
+ WHITESPACE@274..279 "\n "
+ FIELD@279..296
+ NAME@279..285 "number"
+ WHITESPACE@285..292 " "
+ EQ@292..293 "="
+ WHITESPACE@293..294 " "
+ LITERAL@294..295
+ INTEGER@294..295 "2"
+ COMMA@295..296 ","
+ WHITESPACE@296..301 "\n "
+ FIELD@301..326
+ NAME@301..306 "pages"
+ WHITESPACE@306..314 " "
+ EQ@314..315 "="
+ WHITESPACE@315..316 " "
+ CURLY_GROUP@316..325
+ L_CURLY@316..317 "{"
+ WORD@317..324 "529-571"
+ R_CURLY@324..325 "}"
+ COMMA@325..326 ","
+ WHITESPACE@326..331 "\n "
+ FIELD@331..356
+ NAME@331..337 "langid"
+ WHITESPACE@337..344 " "
+ EQ@344..345 "="
+ WHITESPACE@345..346 " "
+ CURLY_GROUP@346..355
+ L_CURLY@346..347 "{"
+ WORD@347..354 "english"
+ R_CURLY@354..355 "}"
+ COMMA@355..356 ","
+ WHITESPACE@356..361 "\n "
+ FIELD@361..395
+ NAME@361..371 "langidopts"
+ WHITESPACE@371..374 " "
+ EQ@374..375 "="
+ WHITESPACE@375..376 " "
+ CURLY_GROUP@376..394
+ L_CURLY@376..377 "{"
+ WORD@377..393 "variant=american"
+ R_CURLY@393..394 "}"
+ COMMA@394..395 ","
+ WHITESPACE@395..400 "\n "
+ FIELD@400..435
+ NAME@400..410 "shorttitle"
+ WHITESPACE@410..413 " "
+ EQ@413..414 "="
+ WHITESPACE@414..415 " "
+ CURLY_GROUP@415..434
+ L_CURLY@415..416 "{"
+ WORD@416..422 "Gromov"
+ WHITESPACE@422..423 " "
+ WORD@423..433 "invariants"
+ R_CURLY@433..434 "}"
+ COMMA@434..435 ","
+ WHITESPACE@435..440 "\n "
+ FIELD@440..554
+ NAME@440..450 "annotation"
+ WHITESPACE@450..453 " "
+ EQ@453..454 "="
+ WHITESPACE@454..455 " "
+ CURLY_GROUP@455..553
+ L_CURLY@455..456 "{"
+ WORD@456..458 "An"
+ WHITESPACE@458..459 " "
+ COMMAND@459..466
+ COMMAND_NAME@459..466 "\\texttt"
+ CURLY_GROUP@466..475
+ L_CURLY@466..467 "{"
+ WORD@467..474 "article"
+ R_CURLY@474..475 "}"
+ WHITESPACE@475..476 " "
+ WORD@476..481 "entry"
+ WHITESPACE@481..482 " "
+ WORD@482..486 "with"
+ WHITESPACE@486..487 " "
+ WORD@487..488 "a"
+ WHITESPACE@488..489 " "
+ COMMAND@489..496
+ COMMAND_NAME@489..496 "\\texttt"
+ CURLY_GROUP@496..504
+ L_CURLY@496..497 "{"
+ WORD@497..503 "volume"
+ R_CURLY@503..504 "}"
+ WHITESPACE@504..505 " "
+ WORD@505..508 "and"
+ WHITESPACE@508..509 " "
+ WORD@509..510 "a"
+ WHITESPACE@510..531 "\n "
+ COMMAND@531..538
+ COMMAND_NAME@531..538 "\\texttt"
+ CURLY_GROUP@538..546
+ L_CURLY@538..539 "{"
+ WORD@539..545 "number"
+ R_CURLY@545..546 "}"
+ WHITESPACE@546..547 " "
+ WORD@547..552 "field"
+ R_CURLY@552..553 "}"
+ COMMA@553..554 ","
+ WHITESPACE@554..555 "\n"
+ R_DELIM@555..556 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_blom_2021() {
+ check(
+ r#"@article{DBLP:journals/corr/abs-2107-11903,
+ author = {Michelle L. Blom and
+ Jurlind Budurushi and
+ Ronald L. Rivest and
+ Philip B. Stark and
+ Peter J. Stuckey and
+ Vanessa Teague and
+ Damjan Vukcevic},
+ title = {Assertion-based Approaches to Auditing Complex Elections, with application
+ to party-list proportional elections},
+ journal = {CoRR},
+ volume = {abs/2107.11903},
+ year = {2021},
+ url = {https://arxiv.org/abs/2107.11903},
+ eprinttype = {arXiv},
+ eprint = {2107.11903},
+ timestamp = {Thu, 29 Jul 2021 16:14:15 +0200},
+ biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib},
+ bibsource = {dblp computer science bibliography, https://dblp.org}
+}"#,
+ expect![[r#"
+ ROOT@0..860
+ ENTRY@0..860
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..42 "DBLP:journals/corr/ab ..."
+ COMMA@42..43 ","
+ WHITESPACE@43..48 "\n "
+ FIELD@48..322
+ NAME@48..54 "author"
+ WHITESPACE@54..58 " "
+ EQ@58..59 "="
+ WHITESPACE@59..60 " "
+ CURLY_GROUP@60..321
+ L_CURLY@60..61 "{"
+ WORD@61..69 "Michelle"
+ WHITESPACE@69..70 " "
+ WORD@70..72 "L."
+ WHITESPACE@72..73 " "
+ WORD@73..77 "Blom"
+ WHITESPACE@77..78 " "
+ WORD@78..81 "and"
+ WHITESPACE@81..102 "\n "
+ WORD@102..109 "Jurlind"
+ WHITESPACE@109..110 " "
+ WORD@110..119 "Budurushi"
+ WHITESPACE@119..120 " "
+ WORD@120..123 "and"
+ WHITESPACE@123..144 "\n "
+ WORD@144..150 "Ronald"
+ WHITESPACE@150..151 " "
+ WORD@151..153 "L."
+ WHITESPACE@153..154 " "
+ WORD@154..160 "Rivest"
+ WHITESPACE@160..161 " "
+ WORD@161..164 "and"
+ WHITESPACE@164..185 "\n "
+ WORD@185..191 "Philip"
+ WHITESPACE@191..192 " "
+ WORD@192..194 "B."
+ WHITESPACE@194..195 " "
+ WORD@195..200 "Stark"
+ WHITESPACE@200..201 " "
+ WORD@201..204 "and"
+ WHITESPACE@204..225 "\n "
+ WORD@225..230 "Peter"
+ WHITESPACE@230..231 " "
+ WORD@231..233 "J."
+ WHITESPACE@233..234 " "
+ WORD@234..241 "Stuckey"
+ WHITESPACE@241..242 " "
+ WORD@242..245 "and"
+ WHITESPACE@245..266 "\n "
+ WORD@266..273 "Vanessa"
+ WHITESPACE@273..274 " "
+ WORD@274..280 "Teague"
+ WHITESPACE@280..281 " "
+ WORD@281..284 "and"
+ WHITESPACE@284..305 "\n "
+ WORD@305..311 "Damjan"
+ WHITESPACE@311..312 " "
+ WORD@312..320 "Vukcevic"
+ R_CURLY@320..321 "}"
+ COMMA@321..322 ","
+ WHITESPACE@322..327 "\n "
+ FIELD@327..473
+ NAME@327..332 "title"
+ WHITESPACE@332..337 " "
+ EQ@337..338 "="
+ WHITESPACE@338..339 " "
+ CURLY_GROUP@339..472
+ L_CURLY@339..340 "{"
+ WORD@340..355 "Assertion-based"
+ WHITESPACE@355..356 " "
+ WORD@356..366 "Approaches"
+ WHITESPACE@366..367 " "
+ WORD@367..369 "to"
+ WHITESPACE@369..370 " "
+ WORD@370..378 "Auditing"
+ WHITESPACE@378..379 " "
+ WORD@379..386 "Complex"
+ WHITESPACE@386..387 " "
+ WORD@387..396 "Elections"
+ COMMA@396..397 ","
+ WHITESPACE@397..398 " "
+ WORD@398..402 "with"
+ WHITESPACE@402..403 " "
+ WORD@403..414 "application"
+ WHITESPACE@414..435 "\n "
+ WORD@435..437 "to"
+ WHITESPACE@437..438 " "
+ WORD@438..448 "party-list"
+ WHITESPACE@448..449 " "
+ WORD@449..461 "proportional"
+ WHITESPACE@461..462 " "
+ WORD@462..471 "elections"
+ R_CURLY@471..472 "}"
+ COMMA@472..473 ","
+ WHITESPACE@473..478 "\n "
+ FIELD@478..497
+ NAME@478..485 "journal"
+ WHITESPACE@485..488 " "
+ EQ@488..489 "="
+ WHITESPACE@489..490 " "
+ CURLY_GROUP@490..496
+ L_CURLY@490..491 "{"
+ WORD@491..495 "CoRR"
+ R_CURLY@495..496 "}"
+ COMMA@496..497 ","
+ WHITESPACE@497..502 "\n "
+ FIELD@502..531
+ NAME@502..508 "volume"
+ WHITESPACE@508..512 " "
+ EQ@512..513 "="
+ WHITESPACE@513..514 " "
+ CURLY_GROUP@514..530
+ L_CURLY@514..515 "{"
+ WORD@515..529 "abs/2107.11903"
+ R_CURLY@529..530 "}"
+ COMMA@530..531 ","
+ WHITESPACE@531..536 "\n "
+ FIELD@536..555
+ NAME@536..540 "year"
+ WHITESPACE@540..546 " "
+ EQ@546..547 "="
+ WHITESPACE@547..548 " "
+ CURLY_GROUP@548..554
+ L_CURLY@548..549 "{"
+ INTEGER@549..553 "2021"
+ R_CURLY@553..554 "}"
+ COMMA@554..555 ","
+ WHITESPACE@555..560 "\n "
+ FIELD@560..607
+ NAME@560..563 "url"
+ WHITESPACE@563..570 " "
+ EQ@570..571 "="
+ WHITESPACE@571..572 " "
+ CURLY_GROUP@572..606
+ L_CURLY@572..573 "{"
+ WORD@573..605 "https://arxiv.org/abs ..."
+ R_CURLY@605..606 "}"
+ COMMA@606..607 ","
+ WHITESPACE@607..612 "\n "
+ FIELD@612..633
+ NAME@612..622 "eprinttype"
+ WHITESPACE@622..623 " "
+ EQ@623..624 "="
+ WHITESPACE@624..625 " "
+ CURLY_GROUP@625..632
+ L_CURLY@625..626 "{"
+ WORD@626..631 "arXiv"
+ R_CURLY@631..632 "}"
+ COMMA@632..633 ","
+ WHITESPACE@633..638 "\n "
+ FIELD@638..663
+ NAME@638..644 "eprint"
+ WHITESPACE@644..648 " "
+ EQ@648..649 "="
+ WHITESPACE@649..650 " "
+ CURLY_GROUP@650..662
+ L_CURLY@650..651 "{"
+ WORD@651..661 "2107.11903"
+ R_CURLY@661..662 "}"
+ COMMA@662..663 ","
+ WHITESPACE@663..668 "\n "
+ FIELD@668..714
+ NAME@668..677 "timestamp"
+ WHITESPACE@677..678 " "
+ EQ@678..679 "="
+ WHITESPACE@679..680 " "
+ CURLY_GROUP@680..713
+ L_CURLY@680..681 "{"
+ WORD@681..684 "Thu"
+ COMMA@684..685 ","
+ WHITESPACE@685..686 " "
+ INTEGER@686..688 "29"
+ WHITESPACE@688..689 " "
+ WORD@689..692 "Jul"
+ WHITESPACE@692..693 " "
+ INTEGER@693..697 "2021"
+ WHITESPACE@697..698 " "
+ WORD@698..706 "16:14:15"
+ WHITESPACE@706..707 " "
+ WORD@707..712 "+0200"
+ R_CURLY@712..713 "}"
+ COMMA@713..714 ","
+ WHITESPACE@714..719 "\n "
+ FIELD@719..787
+ NAME@719..725 "biburl"
+ WHITESPACE@725..729 " "
+ EQ@729..730 "="
+ WHITESPACE@730..731 " "
+ CURLY_GROUP@731..786
+ L_CURLY@731..732 "{"
+ WORD@732..785 "https://dblp.org/rec/ ..."
+ R_CURLY@785..786 "}"
+ COMMA@786..787 ","
+ WHITESPACE@787..792 "\n "
+ FIELD@792..859
+ NAME@792..801 "bibsource"
+ WHITESPACE@801..802 " "
+ EQ@802..803 "="
+ WHITESPACE@803..804 " "
+ CURLY_GROUP@804..858
+ L_CURLY@804..805 "{"
+ WORD@805..809 "dblp"
+ WHITESPACE@809..810 " "
+ WORD@810..818 "computer"
+ WHITESPACE@818..819 " "
+ WORD@819..826 "science"
+ WHITESPACE@826..827 " "
+ WORD@827..839 "bibliography"
+ COMMA@839..840 ","
+ WHITESPACE@840..841 " "
+ WORD@841..857 "https://dblp.org"
+ R_CURLY@857..858 "}"
+ WHITESPACE@858..859 "\n"
+ R_DELIM@859..860 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_combi_2004() {
+ check(
+ r#"@inproceedings{10.1145/967900.968040,
+ author = {Combi, Carlo and Pozzi, Giuseppe},
+ title = {Architectures for a Temporal Workflow Management System},
+ year = {2004},
+ isbn = {1581138121},
+ publisher = {Association for Computing Machinery},
+ address = {New York, NY, USA},
+ url = {https://doi.org/10.1145/967900.968040},
+ doi = {10.1145/967900.968040},
+ booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing},
+ pages = {659-666},
+ numpages = {8},
+ keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system},
+ location = {Nicosia, Cyprus},
+ series = {SAC '04}
+}"#,
+ expect![[r#"
+ ROOT@0..674
+ ENTRY@0..674
+ TYPE@0..14 "@inproceedings"
+ L_DELIM@14..15 "{"
+ NAME@15..36 "10.1145/967900.968040"
+ COMMA@36..37 ","
+ WHITESPACE@37..42 "\n "
+ FIELD@42..86
+ NAME@42..48 "author"
+ WHITESPACE@48..49 " "
+ EQ@49..50 "="
+ WHITESPACE@50..51 " "
+ CURLY_GROUP@51..85
+ L_CURLY@51..52 "{"
+ WORD@52..57 "Combi"
+ COMMA@57..58 ","
+ WHITESPACE@58..59 " "
+ WORD@59..64 "Carlo"
+ WHITESPACE@64..65 " "
+ WORD@65..68 "and"
+ WHITESPACE@68..69 " "
+ WORD@69..74 "Pozzi"
+ COMMA@74..75 ","
+ WHITESPACE@75..76 " "
+ WORD@76..84 "Giuseppe"
+ R_CURLY@84..85 "}"
+ COMMA@85..86 ","
+ WHITESPACE@86..91 "\n "
+ FIELD@91..157
+ NAME@91..96 "title"
+ WHITESPACE@96..97 " "
+ EQ@97..98 "="
+ WHITESPACE@98..99 " "
+ CURLY_GROUP@99..156
+ L_CURLY@99..100 "{"
+ WORD@100..113 "Architectures"
+ WHITESPACE@113..114 " "
+ WORD@114..117 "for"
+ WHITESPACE@117..118 " "
+ WORD@118..119 "a"
+ WHITESPACE@119..120 " "
+ WORD@120..128 "Temporal"
+ WHITESPACE@128..129 " "
+ WORD@129..137 "Workflow"
+ WHITESPACE@137..138 " "
+ WORD@138..148 "Management"
+ WHITESPACE@148..149 " "
+ WORD@149..155 "System"
+ R_CURLY@155..156 "}"
+ COMMA@156..157 ","
+ WHITESPACE@157..162 "\n "
+ FIELD@162..176
+ NAME@162..166 "year"
+ WHITESPACE@166..167 " "
+ EQ@167..168 "="
+ WHITESPACE@168..169 " "
+ CURLY_GROUP@169..175
+ L_CURLY@169..170 "{"
+ INTEGER@170..174 "2004"
+ R_CURLY@174..175 "}"
+ COMMA@175..176 ","
+ WHITESPACE@176..181 "\n "
+ FIELD@181..201
+ NAME@181..185 "isbn"
+ WHITESPACE@185..186 " "
+ EQ@186..187 "="
+ WHITESPACE@187..188 " "
+ CURLY_GROUP@188..200
+ L_CURLY@188..189 "{"
+ INTEGER@189..199 "1581138121"
+ R_CURLY@199..200 "}"
+ COMMA@200..201 ","
+ WHITESPACE@201..206 "\n "
+ FIELD@206..256
+ NAME@206..215 "publisher"
+ WHITESPACE@215..216 " "
+ EQ@216..217 "="
+ WHITESPACE@217..218 " "
+ CURLY_GROUP@218..255
+ L_CURLY@218..219 "{"
+ WORD@219..230 "Association"
+ WHITESPACE@230..231 " "
+ WORD@231..234 "for"
+ WHITESPACE@234..235 " "
+ WORD@235..244 "Computing"
+ WHITESPACE@244..245 " "
+ WORD@245..254 "Machinery"
+ R_CURLY@254..255 "}"
+ COMMA@255..256 ","
+ WHITESPACE@256..261 "\n "
+ FIELD@261..291
+ NAME@261..268 "address"
+ WHITESPACE@268..269 " "
+ EQ@269..270 "="
+ WHITESPACE@270..271 " "
+ CURLY_GROUP@271..290
+ L_CURLY@271..272 "{"
+ WORD@272..275 "New"
+ WHITESPACE@275..276 " "
+ WORD@276..280 "York"
+ COMMA@280..281 ","
+ WHITESPACE@281..282 " "
+ WORD@282..284 "NY"
+ COMMA@284..285 ","
+ WHITESPACE@285..286 " "
+ WORD@286..289 "USA"
+ R_CURLY@289..290 "}"
+ COMMA@290..291 ","
+ WHITESPACE@291..296 "\n "
+ FIELD@296..342
+ NAME@296..299 "url"
+ WHITESPACE@299..300 " "
+ EQ@300..301 "="
+ WHITESPACE@301..302 " "
+ CURLY_GROUP@302..341
+ L_CURLY@302..303 "{"
+ WORD@303..340 "https://doi.org/10.11 ..."
+ R_CURLY@340..341 "}"
+ COMMA@341..342 ","
+ WHITESPACE@342..347 "\n "
+ FIELD@347..377
+ NAME@347..350 "doi"
+ WHITESPACE@350..351 " "
+ EQ@351..352 "="
+ WHITESPACE@352..353 " "
+ CURLY_GROUP@353..376
+ L_CURLY@353..354 "{"
+ WORD@354..375 "10.1145/967900.968040"
+ R_CURLY@375..376 "}"
+ COMMA@376..377 ","
+ WHITESPACE@377..382 "\n "
+ FIELD@382..455
+ NAME@382..391 "booktitle"
+ WHITESPACE@391..392 " "
+ EQ@392..393 "="
+ WHITESPACE@393..394 " "
+ CURLY_GROUP@394..454
+ L_CURLY@394..395 "{"
+ WORD@395..406 "Proceedings"
+ WHITESPACE@406..407 " "
+ WORD@407..409 "of"
+ WHITESPACE@409..410 " "
+ WORD@410..413 "the"
+ WHITESPACE@413..414 " "
+ INTEGER@414..418 "2004"
+ WHITESPACE@418..419 " "
+ WORD@419..422 "ACM"
+ WHITESPACE@422..423 " "
+ WORD@423..432 "Symposium"
+ WHITESPACE@432..433 " "
+ WORD@433..435 "on"
+ WHITESPACE@435..436 " "
+ WORD@436..443 "Applied"
+ WHITESPACE@443..444 " "
+ WORD@444..453 "Computing"
+ R_CURLY@453..454 "}"
+ COMMA@454..455 ","
+ WHITESPACE@455..460 "\n "
+ FIELD@460..478
+ NAME@460..465 "pages"
+ WHITESPACE@465..466 " "
+ EQ@466..467 "="
+ WHITESPACE@467..468 " "
+ CURLY_GROUP@468..477
+ L_CURLY@468..469 "{"
+ WORD@469..476 "659-666"
+ R_CURLY@476..477 "}"
+ COMMA@477..478 ","
+ WHITESPACE@478..483 "\n "
+ FIELD@483..498
+ NAME@483..491 "numpages"
+ WHITESPACE@491..492 " "
+ EQ@492..493 "="
+ WHITESPACE@493..494 " "
+ CURLY_GROUP@494..497
+ L_CURLY@494..495 "{"
+ INTEGER@495..496 "8"
+ R_CURLY@496..497 "}"
+ COMMA@497..498 ","
+ WHITESPACE@498..503 "\n "
+ FIELD@503..615
+ NAME@503..511 "keywords"
+ WHITESPACE@511..512 " "
+ EQ@512..513 "="
+ WHITESPACE@513..514 " "
+ CURLY_GROUP@514..614
+ L_CURLY@514..515 "{"
+ WORD@515..521 "active"
+ WHITESPACE@521..522 " "
+ WORD@522..526 "DBMS"
+ COMMA@526..527 ","
+ WHITESPACE@527..528 " "
+ WORD@528..536 "temporal"
+ WHITESPACE@536..537 " "
+ WORD@537..541 "DBMS"
+ COMMA@541..542 ","
+ WHITESPACE@542..543 " "
+ WORD@543..551 "workflow"
+ WHITESPACE@551..552 " "
+ WORD@552..562 "management"
+ WHITESPACE@562..563 " "
+ WORD@563..569 "system"
+ WHITESPACE@569..570 " "
+ WORD@570..571 "-"
+ WHITESPACE@571..572 " "
+ WORD@572..576 "WfMS"
+ COMMA@576..577 ","
+ WHITESPACE@577..578 " "
+ WORD@578..586 "temporal"
+ WHITESPACE@586..587 " "
+ WORD@587..595 "workflow"
+ WHITESPACE@595..596 " "
+ WORD@596..606 "management"
+ WHITESPACE@606..607 " "
+ WORD@607..613 "system"
+ R_CURLY@613..614 "}"
+ COMMA@614..615 ","
+ WHITESPACE@615..620 "\n "
+ FIELD@620..649
+ NAME@620..628 "location"
+ WHITESPACE@628..629 " "
+ EQ@629..630 "="
+ WHITESPACE@630..631 " "
+ CURLY_GROUP@631..648
+ L_CURLY@631..632 "{"
+ WORD@632..639 "Nicosia"
+ COMMA@639..640 ","
+ WHITESPACE@640..641 " "
+ WORD@641..647 "Cyprus"
+ R_CURLY@647..648 "}"
+ COMMA@648..649 ","
+ WHITESPACE@649..654 "\n "
+ FIELD@654..673
+ NAME@654..660 "series"
+ WHITESPACE@660..661 " "
+ EQ@661..662 "="
+ WHITESPACE@662..663 " "
+ CURLY_GROUP@663..672
+ L_CURLY@663..664 "{"
+ WORD@664..667 "SAC"
+ WHITESPACE@667..668 " "
+ WORD@668..671 "'04"
+ R_CURLY@671..672 "}"
+ WHITESPACE@672..673 "\n"
+ R_DELIM@673..674 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_erwin_2007() {
+ check(
+ r#"@inproceedings{10.5555/1386993.1386994,
+ author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.},
+ title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets},
+ year = {2007},
+ isbn = {9781920682651},
+ publisher = {Australian Computer Society, Inc.},
+ address = {AUS},
+ booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84},
+ pages = {3-11},
+ numpages = {9},
+ keywords = {pattern growth, high utility itemset mining},
+ location = {Gold Coast, Australia},
+ series = {AIDM '07}
+}"#,
+ expect![[r#"
+ ROOT@0..615
+ ENTRY@0..615
+ TYPE@0..14 "@inproceedings"
+ L_DELIM@14..15 "{"
+ NAME@15..38 "10.5555/1386993.1386994"
+ COMMA@38..39 ","
+ WHITESPACE@39..44 "\n "
+ FIELD@44..107
+ NAME@44..50 "author"
+ WHITESPACE@50..51 " "
+ EQ@51..52 "="
+ WHITESPACE@52..53 " "
+ CURLY_GROUP@53..106
+ L_CURLY@53..54 "{"
+ WORD@54..59 "Erwin"
+ COMMA@59..60 ","
+ WHITESPACE@60..61 " "
+ WORD@61..65 "Alva"
+ WHITESPACE@65..66 " "
+ WORD@66..69 "and"
+ WHITESPACE@69..70 " "
+ WORD@70..77 "Gopalan"
+ COMMA@77..78 ","
+ WHITESPACE@78..79 " "
+ WORD@79..82 "Raj"
+ WHITESPACE@82..83 " "
+ WORD@83..85 "P."
+ WHITESPACE@85..86 " "
+ WORD@86..89 "and"
+ WHITESPACE@89..90 " "
+ WORD@90..98 "Achuthan"
+ COMMA@98..99 ","
+ WHITESPACE@99..100 " "
+ WORD@100..102 "N."
+ WHITESPACE@102..103 " "
+ WORD@103..105 "R."
+ R_CURLY@105..106 "}"
+ COMMA@106..107 ","
+ WHITESPACE@107..112 "\n "
+ FIELD@112..194
+ NAME@112..117 "title"
+ WHITESPACE@117..118 " "
+ EQ@118..119 "="
+ WHITESPACE@119..120 " "
+ CURLY_GROUP@120..193
+ L_CURLY@120..121 "{"
+ WORD@121..122 "A"
+ WHITESPACE@122..123 " "
+ WORD@123..132 "Bottom-up"
+ WHITESPACE@132..133 " "
+ WORD@133..143 "Projection"
+ WHITESPACE@143..144 " "
+ WORD@144..149 "Based"
+ WHITESPACE@149..150 " "
+ WORD@150..159 "Algorithm"
+ WHITESPACE@159..160 " "
+ WORD@160..163 "for"
+ WHITESPACE@163..164 " "
+ WORD@164..170 "Mining"
+ WHITESPACE@170..171 " "
+ WORD@171..175 "High"
+ WHITESPACE@175..176 " "
+ WORD@176..183 "Utility"
+ WHITESPACE@183..184 " "
+ WORD@184..192 "Itemsets"
+ R_CURLY@192..193 "}"
+ COMMA@193..194 ","
+ WHITESPACE@194..199 "\n "
+ FIELD@199..213
+ NAME@199..203 "year"
+ WHITESPACE@203..204 " "
+ EQ@204..205 "="
+ WHITESPACE@205..206 " "
+ CURLY_GROUP@206..212
+ L_CURLY@206..207 "{"
+ INTEGER@207..211 "2007"
+ R_CURLY@211..212 "}"
+ COMMA@212..213 ","
+ WHITESPACE@213..218 "\n "
+ FIELD@218..241
+ NAME@218..222 "isbn"
+ WHITESPACE@222..223 " "
+ EQ@223..224 "="
+ WHITESPACE@224..225 " "
+ CURLY_GROUP@225..240
+ L_CURLY@225..226 "{"
+ INTEGER@226..239 "9781920682651"
+ R_CURLY@239..240 "}"
+ COMMA@240..241 ","
+ WHITESPACE@241..246 "\n "
+ FIELD@246..294
+ NAME@246..255 "publisher"
+ WHITESPACE@255..256 " "
+ EQ@256..257 "="
+ WHITESPACE@257..258 " "
+ CURLY_GROUP@258..293
+ L_CURLY@258..259 "{"
+ WORD@259..269 "Australian"
+ WHITESPACE@269..270 " "
+ WORD@270..278 "Computer"
+ WHITESPACE@278..279 " "
+ WORD@279..286 "Society"
+ COMMA@286..287 ","
+ WHITESPACE@287..288 " "
+ WORD@288..292 "Inc."
+ R_CURLY@292..293 "}"
+ COMMA@293..294 ","
+ WHITESPACE@294..299 "\n "
+ FIELD@299..315
+ NAME@299..306 "address"
+ WHITESPACE@306..307 " "
+ EQ@307..308 "="
+ WHITESPACE@308..309 " "
+ CURLY_GROUP@309..314
+ L_CURLY@309..310 "{"
+ WORD@310..313 "AUS"
+ R_CURLY@313..314 "}"
+ COMMA@314..315 ","
+ WHITESPACE@315..320 "\n "
+ FIELD@320..447
+ NAME@320..329 "booktitle"
+ WHITESPACE@329..330 " "
+ EQ@330..331 "="
+ WHITESPACE@331..332 " "
+ CURLY_GROUP@332..446
+ L_CURLY@332..333 "{"
+ WORD@333..344 "Proceedings"
+ WHITESPACE@344..345 " "
+ WORD@345..347 "of"
+ WHITESPACE@347..348 " "
+ WORD@348..351 "the"
+ WHITESPACE@351..352 " "
+ WORD@352..355 "2nd"
+ WHITESPACE@355..356 " "
+ WORD@356..369 "International"
+ WHITESPACE@369..370 " "
+ WORD@370..378 "Workshop"
+ WHITESPACE@378..379 " "
+ WORD@379..381 "on"
+ WHITESPACE@381..382 " "
+ WORD@382..393 "Integrating"
+ WHITESPACE@393..394 " "
+ WORD@394..404 "Artificial"
+ WHITESPACE@404..405 " "
+ WORD@405..417 "Intelligence"
+ WHITESPACE@417..418 " "
+ WORD@418..421 "and"
+ WHITESPACE@421..422 " "
+ WORD@422..426 "Data"
+ WHITESPACE@426..427 " "
+ WORD@427..433 "Mining"
+ WHITESPACE@433..434 " "
+ WORD@434..435 "-"
+ WHITESPACE@435..436 " "
+ WORD@436..442 "Volume"
+ WHITESPACE@442..443 " "
+ INTEGER@443..445 "84"
+ R_CURLY@445..446 "}"
+ COMMA@446..447 ","
+ WHITESPACE@447..452 "\n "
+ FIELD@452..467
+ NAME@452..457 "pages"
+ WHITESPACE@457..458 " "
+ EQ@458..459 "="
+ WHITESPACE@459..460 " "
+ CURLY_GROUP@460..466
+ L_CURLY@460..461 "{"
+ WORD@461..465 "3-11"
+ R_CURLY@465..466 "}"
+ COMMA@466..467 ","
+ WHITESPACE@467..472 "\n "
+ FIELD@472..487
+ NAME@472..480 "numpages"
+ WHITESPACE@480..481 " "
+ EQ@481..482 "="
+ WHITESPACE@482..483 " "
+ CURLY_GROUP@483..486
+ L_CURLY@483..484 "{"
+ INTEGER@484..485 "9"
+ R_CURLY@485..486 "}"
+ COMMA@486..487 ","
+ WHITESPACE@487..492 "\n "
+ FIELD@492..549
+ NAME@492..500 "keywords"
+ WHITESPACE@500..501 " "
+ EQ@501..502 "="
+ WHITESPACE@502..503 " "
+ CURLY_GROUP@503..548
+ L_CURLY@503..504 "{"
+ WORD@504..511 "pattern"
+ WHITESPACE@511..512 " "
+ WORD@512..518 "growth"
+ COMMA@518..519 ","
+ WHITESPACE@519..520 " "
+ WORD@520..524 "high"
+ WHITESPACE@524..525 " "
+ WORD@525..532 "utility"
+ WHITESPACE@532..533 " "
+ WORD@533..540 "itemset"
+ WHITESPACE@540..541 " "
+ WORD@541..547 "mining"
+ R_CURLY@547..548 "}"
+ COMMA@548..549 ","
+ WHITESPACE@549..554 "\n "
+ FIELD@554..589
+ NAME@554..562 "location"
+ WHITESPACE@562..563 " "
+ EQ@563..564 "="
+ WHITESPACE@564..565 " "
+ CURLY_GROUP@565..588
+ L_CURLY@565..566 "{"
+ WORD@566..570 "Gold"
+ WHITESPACE@570..571 " "
+ WORD@571..576 "Coast"
+ COMMA@576..577 ","
+ WHITESPACE@577..578 " "
+ WORD@578..587 "Australia"
+ R_CURLY@587..588 "}"
+ COMMA@588..589 ","
+ WHITESPACE@589..594 "\n "
+ FIELD@594..614
+ NAME@594..600 "series"
+ WHITESPACE@600..601 " "
+ EQ@601..602 "="
+ WHITESPACE@602..603 " "
+ CURLY_GROUP@603..613
+ L_CURLY@603..604 "{"
+ WORD@604..608 "AIDM"
+ WHITESPACE@608..609 " "
+ WORD@609..612 "'07"
+ R_CURLY@612..613 "}"
+ WHITESPACE@613..614 "\n"
+ R_DELIM@614..615 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_jain_1999() {
+ check(
+ r#"@article{10.1145/331499.331504,
+ author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.},
+ title = {Data Clustering: A Review},
+ year = {1999},
+ issue_date = {Sept. 1999},
+ publisher = {Association for Computing Machinery},
+ address = {New York, NY, USA},
+ volume = {31},
+ number = {3},
+ issn = {0360-0300},
+ url = {https://doi.org/10.1145/331499.331504},
+ doi = {10.1145/331499.331504},
+ journal = {ACM Comput. Surv.},
+ month = {sep},
+ pages = {264-323},
+ numpages = {60},
+ keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning}
+}"#,
+ expect![[r#"
+ ROOT@0..674
+ ENTRY@0..674
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..30 "10.1145/331499.331504"
+ COMMA@30..31 ","
+ WHITESPACE@31..36 "\n "
+ FIELD@36..93
+ NAME@36..42 "author"
+ WHITESPACE@42..43 " "
+ EQ@43..44 "="
+ WHITESPACE@44..45 " "
+ CURLY_GROUP@45..92
+ L_CURLY@45..46 "{"
+ WORD@46..50 "Jain"
+ COMMA@50..51 ","
+ WHITESPACE@51..52 " "
+ WORD@52..54 "A."
+ WHITESPACE@54..55 " "
+ WORD@55..57 "K."
+ WHITESPACE@57..58 " "
+ WORD@58..61 "and"
+ WHITESPACE@61..62 " "
+ WORD@62..67 "Murty"
+ COMMA@67..68 ","
+ WHITESPACE@68..69 " "
+ WORD@69..71 "M."
+ WHITESPACE@71..72 " "
+ WORD@72..74 "N."
+ WHITESPACE@74..75 " "
+ WORD@75..78 "and"
+ WHITESPACE@78..79 " "
+ WORD@79..84 "Flynn"
+ COMMA@84..85 ","
+ WHITESPACE@85..86 " "
+ WORD@86..88 "P."
+ WHITESPACE@88..89 " "
+ WORD@89..91 "J."
+ R_CURLY@91..92 "}"
+ COMMA@92..93 ","
+ WHITESPACE@93..98 "\n "
+ FIELD@98..134
+ NAME@98..103 "title"
+ WHITESPACE@103..104 " "
+ EQ@104..105 "="
+ WHITESPACE@105..106 " "
+ CURLY_GROUP@106..133
+ L_CURLY@106..107 "{"
+ WORD@107..111 "Data"
+ WHITESPACE@111..112 " "
+ WORD@112..123 "Clustering:"
+ WHITESPACE@123..124 " "
+ WORD@124..125 "A"
+ WHITESPACE@125..126 " "
+ WORD@126..132 "Review"
+ R_CURLY@132..133 "}"
+ COMMA@133..134 ","
+ WHITESPACE@134..139 "\n "
+ FIELD@139..153
+ NAME@139..143 "year"
+ WHITESPACE@143..144 " "
+ EQ@144..145 "="
+ WHITESPACE@145..146 " "
+ CURLY_GROUP@146..152
+ L_CURLY@146..147 "{"
+ INTEGER@147..151 "1999"
+ R_CURLY@151..152 "}"
+ COMMA@152..153 ","
+ WHITESPACE@153..158 "\n "
+ FIELD@158..184
+ NAME@158..168 "issue_date"
+ WHITESPACE@168..169 " "
+ EQ@169..170 "="
+ WHITESPACE@170..171 " "
+ CURLY_GROUP@171..183
+ L_CURLY@171..172 "{"
+ WORD@172..177 "Sept."
+ WHITESPACE@177..178 " "
+ INTEGER@178..182 "1999"
+ R_CURLY@182..183 "}"
+ COMMA@183..184 ","
+ WHITESPACE@184..189 "\n "
+ FIELD@189..239
+ NAME@189..198 "publisher"
+ WHITESPACE@198..199 " "
+ EQ@199..200 "="
+ WHITESPACE@200..201 " "
+ CURLY_GROUP@201..238
+ L_CURLY@201..202 "{"
+ WORD@202..213 "Association"
+ WHITESPACE@213..214 " "
+ WORD@214..217 "for"
+ WHITESPACE@217..218 " "
+ WORD@218..227 "Computing"
+ WHITESPACE@227..228 " "
+ WORD@228..237 "Machinery"
+ R_CURLY@237..238 "}"
+ COMMA@238..239 ","
+ WHITESPACE@239..244 "\n "
+ FIELD@244..274
+ NAME@244..251 "address"
+ WHITESPACE@251..252 " "
+ EQ@252..253 "="
+ WHITESPACE@253..254 " "
+ CURLY_GROUP@254..273
+ L_CURLY@254..255 "{"
+ WORD@255..258 "New"
+ WHITESPACE@258..259 " "
+ WORD@259..263 "York"
+ COMMA@263..264 ","
+ WHITESPACE@264..265 " "
+ WORD@265..267 "NY"
+ COMMA@267..268 ","
+ WHITESPACE@268..269 " "
+ WORD@269..272 "USA"
+ R_CURLY@272..273 "}"
+ COMMA@273..274 ","
+ WHITESPACE@274..279 "\n "
+ FIELD@279..293
+ NAME@279..285 "volume"
+ WHITESPACE@285..286 " "
+ EQ@286..287 "="
+ WHITESPACE@287..288 " "
+ CURLY_GROUP@288..292
+ L_CURLY@288..289 "{"
+ INTEGER@289..291 "31"
+ R_CURLY@291..292 "}"
+ COMMA@292..293 ","
+ WHITESPACE@293..298 "\n "
+ FIELD@298..311
+ NAME@298..304 "number"
+ WHITESPACE@304..305 " "
+ EQ@305..306 "="
+ WHITESPACE@306..307 " "
+ CURLY_GROUP@307..310
+ L_CURLY@307..308 "{"
+ INTEGER@308..309 "3"
+ R_CURLY@309..310 "}"
+ COMMA@310..311 ","
+ WHITESPACE@311..316 "\n "
+ FIELD@316..335
+ NAME@316..320 "issn"
+ WHITESPACE@320..321 " "
+ EQ@321..322 "="
+ WHITESPACE@322..323 " "
+ CURLY_GROUP@323..334
+ L_CURLY@323..324 "{"
+ WORD@324..333 "0360-0300"
+ R_CURLY@333..334 "}"
+ COMMA@334..335 ","
+ WHITESPACE@335..340 "\n "
+ FIELD@340..386
+ NAME@340..343 "url"
+ WHITESPACE@343..344 " "
+ EQ@344..345 "="
+ WHITESPACE@345..346 " "
+ CURLY_GROUP@346..385
+ L_CURLY@346..347 "{"
+ WORD@347..384 "https://doi.org/10.11 ..."
+ R_CURLY@384..385 "}"
+ COMMA@385..386 ","
+ WHITESPACE@386..391 "\n "
+ FIELD@391..421
+ NAME@391..394 "doi"
+ WHITESPACE@394..395 " "
+ EQ@395..396 "="
+ WHITESPACE@396..397 " "
+ CURLY_GROUP@397..420
+ L_CURLY@397..398 "{"
+ WORD@398..419 "10.1145/331499.331504"
+ R_CURLY@419..420 "}"
+ COMMA@420..421 ","
+ WHITESPACE@421..426 "\n "
+ FIELD@426..456
+ NAME@426..433 "journal"
+ WHITESPACE@433..434 " "
+ EQ@434..435 "="
+ WHITESPACE@435..436 " "
+ CURLY_GROUP@436..455
+ L_CURLY@436..437 "{"
+ WORD@437..440 "ACM"
+ WHITESPACE@440..441 " "
+ WORD@441..448 "Comput."
+ WHITESPACE@448..449 " "
+ WORD@449..454 "Surv."
+ R_CURLY@454..455 "}"
+ COMMA@455..456 ","
+ WHITESPACE@456..461 "\n "
+ FIELD@461..475
+ NAME@461..466 "month"
+ WHITESPACE@466..467 " "
+ EQ@467..468 "="
+ WHITESPACE@468..469 " "
+ CURLY_GROUP@469..474
+ L_CURLY@469..470 "{"
+ WORD@470..473 "sep"
+ R_CURLY@473..474 "}"
+ COMMA@474..475 ","
+ WHITESPACE@475..480 "\n "
+ FIELD@480..498
+ NAME@480..485 "pages"
+ WHITESPACE@485..486 " "
+ EQ@486..487 "="
+ WHITESPACE@487..488 " "
+ CURLY_GROUP@488..497
+ L_CURLY@488..489 "{"
+ WORD@489..496 "264-323"
+ R_CURLY@496..497 "}"
+ COMMA@497..498 ","
+ WHITESPACE@498..503 "\n "
+ FIELD@503..519
+ NAME@503..511 "numpages"
+ WHITESPACE@511..512 " "
+ EQ@512..513 "="
+ WHITESPACE@513..514 " "
+ CURLY_GROUP@514..518
+ L_CURLY@514..515 "{"
+ INTEGER@515..517 "60"
+ R_CURLY@517..518 "}"
+ COMMA@518..519 ","
+ WHITESPACE@519..524 "\n "
+ FIELD@524..673
+ NAME@524..532 "keywords"
+ WHITESPACE@532..533 " "
+ EQ@533..534 "="
+ WHITESPACE@534..535 " "
+ CURLY_GROUP@535..672
+ L_CURLY@535..536 "{"
+ WORD@536..547 "incremental"
+ WHITESPACE@547..548 " "
+ WORD@548..558 "clustering"
+ COMMA@558..559 ","
+ WHITESPACE@559..560 " "
+ WORD@560..570 "clustering"
+ WHITESPACE@570..571 " "
+ WORD@571..583 "applications"
+ COMMA@583..584 ","
+ WHITESPACE@584..585 " "
+ WORD@585..596 "exploratory"
+ WHITESPACE@596..597 " "
+ WORD@597..601 "data"
+ WHITESPACE@601..602 " "
+ WORD@602..610 "analysis"
+ COMMA@610..611 ","
+ WHITESPACE@611..612 " "
+ WORD@612..619 "cluster"
+ WHITESPACE@619..620 " "
+ WORD@620..628 "analysis"
+ COMMA@628..629 ","
+ WHITESPACE@629..630 " "
+ WORD@630..640 "similarity"
+ WHITESPACE@640..641 " "
+ WORD@641..648 "indices"
+ COMMA@648..649 ","
+ WHITESPACE@649..650 " "
+ WORD@650..662 "unsupervised"
+ WHITESPACE@662..663 " "
+ WORD@663..671 "learning"
+ R_CURLY@671..672 "}"
+ WHITESPACE@672..673 "\n"
+ R_DELIM@673..674 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_kastenholz_2006() {
+ check(
+ r#"@string{jchph = {J.~Chem. Phys.}}
+
+@article{kastenholz,
+ author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
+ title = {Computation of methodology\hyphen independent ionic solvation
+ free energies from molecular simulations},
+ journaltitle = jchph,
+ date = 2006,
+ subtitle = {{I}. {The} electrostatic potential in molecular liquids},
+ volume = 124,
+ eid = 124106,
+ doi = {10.1063/1.2172593},
+ langid = {english},
+ langidopts = {variant=american},
+ indextitle = {Computation of ionic solvation free energies},
+ annotation = {An \texttt{article} entry with an \texttt{eid} and a
+ \texttt{doi} field. Note that the \textsc{doi} is transformed
+ into a clickable link if \texttt{hyperref} support has been
+ enabled},
+}"#,
+ expect![[r#"
+ ROOT@0..898
+ STRING@0..35
+ TYPE@0..7 "@string"
+ L_DELIM@7..8 "{"
+ NAME@8..13 "jchph"
+ WHITESPACE@13..16 " "
+ EQ@16..17 "="
+ WHITESPACE@17..18 " "
+ CURLY_GROUP@18..34
+ L_CURLY@18..19 "{"
+ WORD@19..21 "J."
+ NBSP@21..22 "~"
+ WORD@22..27 "Chem."
+ WHITESPACE@27..28 " "
+ WORD@28..33 "Phys."
+ R_CURLY@33..34 "}"
+ R_DELIM@34..35 "}"
+ JUNK@35..37 "\n\n"
+ ENTRY@37..898
+ TYPE@37..45 "@article"
+ L_DELIM@45..46 "{"
+ NAME@46..56 "kastenholz"
+ COMMA@56..57 ","
+ WHITESPACE@57..62 "\n "
+ FIELD@62..130
+ NAME@62..68 "author"
+ WHITESPACE@68..75 " "
+ EQ@75..76 "="
+ WHITESPACE@76..77 " "
+ CURLY_GROUP@77..129
+ L_CURLY@77..78 "{"
+ WORD@78..88 "Kastenholz"
+ COMMA@88..89 ","
+ WHITESPACE@89..90 " "
+ WORD@90..92 "M."
+ WHITESPACE@92..93 " "
+ WORD@93..95 "A."
+ WHITESPACE@95..96 " "
+ WORD@96..99 "and"
+ WHITESPACE@99..100 " "
+ WORD@100..101 "H"
+ CURLY_GROUP@101..106
+ L_CURLY@101..102 "{"
+ ACCENT@102..105
+ ACCENT_NAME@102..104 "\\\""
+ WORD@104..105 "u"
+ R_CURLY@105..106 "}"
+ WORD@106..115 "nenberger"
+ COMMA@115..116 ","
+ WHITESPACE@116..117 " "
+ WORD@117..125 "Philippe"
+ WHITESPACE@125..126 " "
+ WORD@126..128 "H."
+ R_CURLY@128..129 "}"
+ COMMA@129..130 ","
+ WHITESPACE@130..135 "\n "
+ FIELD@135..275
+ NAME@135..140 "title"
+ WHITESPACE@140..148 " "
+ EQ@148..149 "="
+ WHITESPACE@149..150 " "
+ CURLY_GROUP@150..274
+ L_CURLY@150..151 "{"
+ WORD@151..162 "Computation"
+ WHITESPACE@162..163 " "
+ WORD@163..165 "of"
+ WHITESPACE@165..166 " "
+ WORD@166..177 "methodology"
+ COMMAND@177..184
+ COMMAND_NAME@177..184 "\\hyphen"
+ WHITESPACE@184..185 " "
+ WORD@185..196 "independent"
+ WHITESPACE@196..197 " "
+ WORD@197..202 "ionic"
+ WHITESPACE@202..203 " "
+ WORD@203..212 "solvation"
+ WHITESPACE@212..233 "\n "
+ WORD@233..237 "free"
+ WHITESPACE@237..238 " "
+ WORD@238..246 "energies"
+ WHITESPACE@246..247 " "
+ WORD@247..251 "from"
+ WHITESPACE@251..252 " "
+ WORD@252..261 "molecular"
+ WHITESPACE@261..262 " "
+ WORD@262..273 "simulations"
+ R_CURLY@273..274 "}"
+ COMMA@274..275 ","
+ WHITESPACE@275..280 "\n "
+ FIELD@280..301
+ NAME@280..292 "journaltitle"
+ WHITESPACE@292..293 " "
+ EQ@293..294 "="
+ WHITESPACE@294..295 " "
+ LITERAL@295..300
+ NAME@295..300 "jchph"
+ COMMA@300..301 ","
+ WHITESPACE@301..306 "\n "
+ FIELD@306..326
+ NAME@306..310 "date"
+ WHITESPACE@310..319 " "
+ EQ@319..320 "="
+ WHITESPACE@320..321 " "
+ LITERAL@321..325
+ INTEGER@321..325 "2006"
+ COMMA@325..326 ","
+ WHITESPACE@326..331 "\n "
+ FIELD@331..404
+ NAME@331..339 "subtitle"
+ WHITESPACE@339..344 " "
+ EQ@344..345 "="
+ WHITESPACE@345..346 " "
+ CURLY_GROUP@346..403
+ L_CURLY@346..347 "{"
+ CURLY_GROUP@347..350
+ L_CURLY@347..348 "{"
+ WORD@348..349 "I"
+ R_CURLY@349..350 "}"
+ WORD@350..351 "."
+ WHITESPACE@351..352 " "
+ CURLY_GROUP@352..357
+ L_CURLY@352..353 "{"
+ WORD@353..356 "The"
+ R_CURLY@356..357 "}"
+ WHITESPACE@357..358 " "
+ WORD@358..371 "electrostatic"
+ WHITESPACE@371..372 " "
+ WORD@372..381 "potential"
+ WHITESPACE@381..382 " "
+ WORD@382..384 "in"
+ WHITESPACE@384..385 " "
+ WORD@385..394 "molecular"
+ WHITESPACE@394..395 " "
+ WORD@395..402 "liquids"
+ R_CURLY@402..403 "}"
+ COMMA@403..404 ","
+ WHITESPACE@404..409 "\n "
+ FIELD@409..428
+ NAME@409..415 "volume"
+ WHITESPACE@415..422 " "
+ EQ@422..423 "="
+ WHITESPACE@423..424 " "
+ LITERAL@424..427
+ INTEGER@424..427 "124"
+ COMMA@427..428 ","
+ WHITESPACE@428..433 "\n "
+ FIELD@433..455
+ NAME@433..436 "eid"
+ WHITESPACE@436..446 " "
+ EQ@446..447 "="
+ WHITESPACE@447..448 " "
+ LITERAL@448..454
+ INTEGER@448..454 "124106"
+ COMMA@454..455 ","
+ WHITESPACE@455..460 "\n "
+ FIELD@460..495
+ NAME@460..463 "doi"
+ WHITESPACE@463..473 " "
+ EQ@473..474 "="
+ WHITESPACE@474..475 " "
+ CURLY_GROUP@475..494
+ L_CURLY@475..476 "{"
+ WORD@476..493 "10.1063/1.2172593"
+ R_CURLY@493..494 "}"
+ COMMA@494..495 ","
+ WHITESPACE@495..500 "\n "
+ FIELD@500..525
+ NAME@500..506 "langid"
+ WHITESPACE@506..513 " "
+ EQ@513..514 "="
+ WHITESPACE@514..515 " "
+ CURLY_GROUP@515..524
+ L_CURLY@515..516 "{"
+ WORD@516..523 "english"
+ R_CURLY@523..524 "}"
+ COMMA@524..525 ","
+ WHITESPACE@525..530 "\n "
+ FIELD@530..564
+ NAME@530..540 "langidopts"
+ WHITESPACE@540..543 " "
+ EQ@543..544 "="
+ WHITESPACE@544..545 " "
+ CURLY_GROUP@545..563
+ L_CURLY@545..546 "{"
+ WORD@546..562 "variant=american"
+ R_CURLY@562..563 "}"
+ COMMA@563..564 ","
+ WHITESPACE@564..569 "\n "
+ FIELD@569..631
+ NAME@569..579 "indextitle"
+ WHITESPACE@579..582 " "
+ EQ@582..583 "="
+ WHITESPACE@583..584 " "
+ CURLY_GROUP@584..630
+ L_CURLY@584..585 "{"
+ WORD@585..596 "Computation"
+ WHITESPACE@596..597 " "
+ WORD@597..599 "of"
+ WHITESPACE@599..600 " "
+ WORD@600..605 "ionic"
+ WHITESPACE@605..606 " "
+ WORD@606..615 "solvation"
+ WHITESPACE@615..616 " "
+ WORD@616..620 "free"
+ WHITESPACE@620..621 " "
+ WORD@621..629 "energies"
+ R_CURLY@629..630 "}"
+ COMMA@630..631 ","
+ WHITESPACE@631..636 "\n "
+ FIELD@636..896
+ NAME@636..646 "annotation"
+ WHITESPACE@646..649 " "
+ EQ@649..650 "="
+ WHITESPACE@650..651 " "
+ CURLY_GROUP@651..895
+ L_CURLY@651..652 "{"
+ WORD@652..654 "An"
+ WHITESPACE@654..655 " "
+ COMMAND@655..662
+ COMMAND_NAME@655..662 "\\texttt"
+ CURLY_GROUP@662..671
+ L_CURLY@662..663 "{"
+ WORD@663..670 "article"
+ R_CURLY@670..671 "}"
+ WHITESPACE@671..672 " "
+ WORD@672..677 "entry"
+ WHITESPACE@677..678 " "
+ WORD@678..682 "with"
+ WHITESPACE@682..683 " "
+ WORD@683..685 "an"
+ WHITESPACE@685..686 " "
+ COMMAND@686..693
+ COMMAND_NAME@686..693 "\\texttt"
+ CURLY_GROUP@693..698
+ L_CURLY@693..694 "{"
+ WORD@694..697 "eid"
+ R_CURLY@697..698 "}"
+ WHITESPACE@698..699 " "
+ WORD@699..702 "and"
+ WHITESPACE@702..703 " "
+ WORD@703..704 "a"
+ WHITESPACE@704..725 "\n "
+ COMMAND@725..732
+ COMMAND_NAME@725..732 "\\texttt"
+ CURLY_GROUP@732..737
+ L_CURLY@732..733 "{"
+ WORD@733..736 "doi"
+ R_CURLY@736..737 "}"
+ WHITESPACE@737..738 " "
+ WORD@738..744 "field."
+ WHITESPACE@744..745 " "
+ WORD@745..749 "Note"
+ WHITESPACE@749..750 " "
+ WORD@750..754 "that"
+ WHITESPACE@754..755 " "
+ WORD@755..758 "the"
+ WHITESPACE@758..759 " "
+ COMMAND@759..766
+ COMMAND_NAME@759..766 "\\textsc"
+ CURLY_GROUP@766..771
+ L_CURLY@766..767 "{"
+ WORD@767..770 "doi"
+ R_CURLY@770..771 "}"
+ WHITESPACE@771..772 " "
+ WORD@772..774 "is"
+ WHITESPACE@774..775 " "
+ WORD@775..786 "transformed"
+ WHITESPACE@786..807 "\n "
+ WORD@807..811 "into"
+ WHITESPACE@811..812 " "
+ WORD@812..813 "a"
+ WHITESPACE@813..814 " "
+ WORD@814..823 "clickable"
+ WHITESPACE@823..824 " "
+ WORD@824..828 "link"
+ WHITESPACE@828..829 " "
+ WORD@829..831 "if"
+ WHITESPACE@831..832 " "
+ COMMAND@832..839
+ COMMAND_NAME@832..839 "\\texttt"
+ CURLY_GROUP@839..849
+ L_CURLY@839..840 "{"
+ WORD@840..848 "hyperref"
+ R_CURLY@848..849 "}"
+ WHITESPACE@849..850 " "
+ WORD@850..857 "support"
+ WHITESPACE@857..858 " "
+ WORD@858..861 "has"
+ WHITESPACE@861..862 " "
+ WORD@862..866 "been"
+ WHITESPACE@866..887 "\n "
+ WORD@887..894 "enabled"
+ R_CURLY@894..895 "}"
+ COMMA@895..896 ","
+ WHITESPACE@896..897 "\n"
+ R_DELIM@897..898 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_knuth_1984() {
+ check(
+ r#"@book{knuth:ct:a,
+ author = {Knuth, Donald E.},
+ title = {The {\TeX book}},
+ date = 1984,
+ maintitle = {Computers \& Typesetting},
+ volume = {A},
+ publisher = {Addison-Wesley},
+ location = {Reading, Mass.},
+ langid = {english},
+ langidopts = {variant=american},
+ sorttitle = {Computers & Typesetting A},
+ indexsorttitle= {The TeXbook},
+ indextitle = {\protect\TeX book, The},
+ shorttitle = {\TeX book},
+ annotation = {The first volume of a five-volume book. Note the
+ \texttt{sorttitle} field. We want this
+ volume to be listed after the entry referring to the entire
+ five-volume set. Also note the \texttt{indextitle} and
+ \texttt{indexsorttitle} fields. Indexing packages that don't
+ generate robust index entries require some control sequences
+ to be protected from expansion},
+}"#,
+ expect![[r#"
+ ROOT@0..993
+ ENTRY@0..993
+ TYPE@0..5 "@book"
+ L_DELIM@5..6 "{"
+ NAME@6..16 "knuth:ct:a"
+ COMMA@16..17 ","
+ WHITESPACE@17..22 "\n "
+ FIELD@22..56
+ NAME@22..28 "author"
+ WHITESPACE@28..35 " "
+ EQ@35..36 "="
+ WHITESPACE@36..37 " "
+ CURLY_GROUP@37..55
+ L_CURLY@37..38 "{"
+ WORD@38..43 "Knuth"
+ COMMA@43..44 ","
+ WHITESPACE@44..45 " "
+ WORD@45..51 "Donald"
+ WHITESPACE@51..52 " "
+ WORD@52..54 "E."
+ R_CURLY@54..55 "}"
+ COMMA@55..56 ","
+ WHITESPACE@56..61 "\n "
+ FIELD@61..94
+ NAME@61..66 "title"
+ WHITESPACE@66..74 " "
+ EQ@74..75 "="
+ WHITESPACE@75..76 " "
+ CURLY_GROUP@76..93
+ L_CURLY@76..77 "{"
+ WORD@77..80 "The"
+ WHITESPACE@80..81 " "
+ CURLY_GROUP@81..92
+ L_CURLY@81..82 "{"
+ COMMAND@82..86
+ COMMAND_NAME@82..86 "\\TeX"
+ WHITESPACE@86..87 " "
+ WORD@87..91 "book"
+ R_CURLY@91..92 "}"
+ R_CURLY@92..93 "}"
+ COMMA@93..94 ","
+ WHITESPACE@94..99 "\n "
+ FIELD@99..119
+ NAME@99..103 "date"
+ WHITESPACE@103..112 " "
+ EQ@112..113 "="
+ WHITESPACE@113..114 " "
+ LITERAL@114..118
+ INTEGER@114..118 "1984"
+ COMMA@118..119 ","
+ WHITESPACE@119..124 "\n "
+ FIELD@124..166
+ NAME@124..133 "maintitle"
+ WHITESPACE@133..137 " "
+ EQ@137..138 "="
+ WHITESPACE@138..139 " "
+ CURLY_GROUP@139..165
+ L_CURLY@139..140 "{"
+ WORD@140..149 "Computers"
+ WHITESPACE@149..150 " "
+ COMMAND@150..152
+ COMMAND_NAME@150..152 "\\&"
+ WHITESPACE@152..153 " "
+ WORD@153..164 "Typesetting"
+ R_CURLY@164..165 "}"
+ COMMA@165..166 ","
+ WHITESPACE@166..171 "\n "
+ FIELD@171..190
+ NAME@171..177 "volume"
+ WHITESPACE@177..184 " "
+ EQ@184..185 "="
+ WHITESPACE@185..186 " "
+ CURLY_GROUP@186..189
+ L_CURLY@186..187 "{"
+ WORD@187..188 "A"
+ R_CURLY@188..189 "}"
+ COMMA@189..190 ","
+ WHITESPACE@190..195 "\n "
+ FIELD@195..227
+ NAME@195..204 "publisher"
+ WHITESPACE@204..208 " "
+ EQ@208..209 "="
+ WHITESPACE@209..210 " "
+ CURLY_GROUP@210..226
+ L_CURLY@210..211 "{"
+ WORD@211..225 "Addison-Wesley"
+ R_CURLY@225..226 "}"
+ COMMA@226..227 ","
+ WHITESPACE@227..232 "\n "
+ FIELD@232..264
+ NAME@232..240 "location"
+ WHITESPACE@240..245 " "
+ EQ@245..246 "="
+ WHITESPACE@246..247 " "
+ CURLY_GROUP@247..263
+ L_CURLY@247..248 "{"
+ WORD@248..255 "Reading"
+ COMMA@255..256 ","
+ WHITESPACE@256..257 " "
+ WORD@257..262 "Mass."
+ R_CURLY@262..263 "}"
+ COMMA@263..264 ","
+ WHITESPACE@264..269 "\n "
+ FIELD@269..294
+ NAME@269..275 "langid"
+ WHITESPACE@275..282 " "
+ EQ@282..283 "="
+ WHITESPACE@283..284 " "
+ CURLY_GROUP@284..293
+ L_CURLY@284..285 "{"
+ WORD@285..292 "english"
+ R_CURLY@292..293 "}"
+ COMMA@293..294 ","
+ WHITESPACE@294..299 "\n "
+ FIELD@299..333
+ NAME@299..309 "langidopts"
+ WHITESPACE@309..312 " "
+ EQ@312..313 "="
+ WHITESPACE@313..314 " "
+ CURLY_GROUP@314..332
+ L_CURLY@314..315 "{"
+ WORD@315..331 "variant=american"
+ R_CURLY@331..332 "}"
+ COMMA@332..333 ","
+ WHITESPACE@333..338 "\n "
+ FIELD@338..381
+ NAME@338..347 "sorttitle"
+ WHITESPACE@347..351 " "
+ EQ@351..352 "="
+ WHITESPACE@352..353 " "
+ CURLY_GROUP@353..380
+ L_CURLY@353..354 "{"
+ WORD@354..363 "Computers"
+ WHITESPACE@363..364 " "
+ WORD@364..365 "&"
+ WHITESPACE@365..366 " "
+ WORD@366..377 "Typesetting"
+ WHITESPACE@377..378 " "
+ WORD@378..379 "A"
+ R_CURLY@379..380 "}"
+ COMMA@380..381 ","
+ WHITESPACE@381..386 "\n "
+ FIELD@386..416
+ NAME@386..400 "indexsorttitle"
+ EQ@400..401 "="
+ WHITESPACE@401..402 " "
+ CURLY_GROUP@402..415
+ L_CURLY@402..403 "{"
+ WORD@403..406 "The"
+ WHITESPACE@406..407 " "
+ WORD@407..414 "TeXbook"
+ R_CURLY@414..415 "}"
+ COMMA@415..416 ","
+ WHITESPACE@416..421 "\n "
+ FIELD@421..461
+ NAME@421..431 "indextitle"
+ WHITESPACE@431..434 " "
+ EQ@434..435 "="
+ WHITESPACE@435..436 " "
+ CURLY_GROUP@436..460
+ L_CURLY@436..437 "{"
+ COMMAND@437..445
+ COMMAND_NAME@437..445 "\\protect"
+ COMMAND@445..449
+ COMMAND_NAME@445..449 "\\TeX"
+ WHITESPACE@449..450 " "
+ WORD@450..454 "book"
+ COMMA@454..455 ","
+ WHITESPACE@455..456 " "
+ WORD@456..459 "The"
+ R_CURLY@459..460 "}"
+ COMMA@460..461 ","
+ WHITESPACE@461..466 "\n "
+ FIELD@466..493
+ NAME@466..476 "shorttitle"
+ WHITESPACE@476..479 " "
+ EQ@479..480 "="
+ WHITESPACE@480..481 " "
+ CURLY_GROUP@481..492
+ L_CURLY@481..482 "{"
+ COMMAND@482..486
+ COMMAND_NAME@482..486 "\\TeX"
+ WHITESPACE@486..487 " "
+ WORD@487..491 "book"
+ R_CURLY@491..492 "}"
+ COMMA@492..493 ","
+ WHITESPACE@493..498 "\n "
+ FIELD@498..991
+ NAME@498..508 "annotation"
+ WHITESPACE@508..511 " "
+ EQ@511..512 "="
+ WHITESPACE@512..513 " "
+ CURLY_GROUP@513..990
+ L_CURLY@513..514 "{"
+ WORD@514..517 "The"
+ WHITESPACE@517..518 " "
+ WORD@518..523 "first"
+ WHITESPACE@523..524 " "
+ WORD@524..530 "volume"
+ WHITESPACE@530..531 " "
+ WORD@531..533 "of"
+ WHITESPACE@533..534 " "
+ WORD@534..535 "a"
+ WHITESPACE@535..536 " "
+ WORD@536..547 "five-volume"
+ WHITESPACE@547..548 " "
+ WORD@548..553 "book."
+ WHITESPACE@553..554 " "
+ WORD@554..558 "Note"
+ WHITESPACE@558..559 " "
+ WORD@559..562 "the"
+ WHITESPACE@562..583 "\n "
+ COMMAND@583..590
+ COMMAND_NAME@583..590 "\\texttt"
+ CURLY_GROUP@590..601
+ L_CURLY@590..591 "{"
+ WORD@591..600 "sorttitle"
+ R_CURLY@600..601 "}"
+ WHITESPACE@601..602 " "
+ WORD@602..608 "field."
+ WHITESPACE@608..609 " "
+ WORD@609..611 "We"
+ WHITESPACE@611..612 " "
+ WORD@612..616 "want"
+ WHITESPACE@616..617 " "
+ WORD@617..621 "this"
+ WHITESPACE@621..642 "\n "
+ WORD@642..648 "volume"
+ WHITESPACE@648..649 " "
+ WORD@649..651 "to"
+ WHITESPACE@651..652 " "
+ WORD@652..654 "be"
+ WHITESPACE@654..655 " "
+ WORD@655..661 "listed"
+ WHITESPACE@661..662 " "
+ WORD@662..667 "after"
+ WHITESPACE@667..668 " "
+ WORD@668..671 "the"
+ WHITESPACE@671..672 " "
+ WORD@672..677 "entry"
+ WHITESPACE@677..678 " "
+ WORD@678..687 "referring"
+ WHITESPACE@687..688 " "
+ WORD@688..690 "to"
+ WHITESPACE@690..691 " "
+ WORD@691..694 "the"
+ WHITESPACE@694..695 " "
+ WORD@695..701 "entire"
+ WHITESPACE@701..722 "\n "
+ WORD@722..733 "five-volume"
+ WHITESPACE@733..734 " "
+ WORD@734..738 "set."
+ WHITESPACE@738..739 " "
+ WORD@739..743 "Also"
+ WHITESPACE@743..744 " "
+ WORD@744..748 "note"
+ WHITESPACE@748..749 " "
+ WORD@749..752 "the"
+ WHITESPACE@752..753 " "
+ COMMAND@753..760
+ COMMAND_NAME@753..760 "\\texttt"
+ CURLY_GROUP@760..772
+ L_CURLY@760..761 "{"
+ WORD@761..771 "indextitle"
+ R_CURLY@771..772 "}"
+ WHITESPACE@772..773 " "
+ WORD@773..776 "and"
+ WHITESPACE@776..797 "\n "
+ COMMAND@797..804
+ COMMAND_NAME@797..804 "\\texttt"
+ CURLY_GROUP@804..820
+ L_CURLY@804..805 "{"
+ WORD@805..819 "indexsorttitle"
+ R_CURLY@819..820 "}"
+ WHITESPACE@820..821 " "
+ WORD@821..828 "fields."
+ WHITESPACE@828..829 " "
+ WORD@829..837 "Indexing"
+ WHITESPACE@837..838 " "
+ WORD@838..846 "packages"
+ WHITESPACE@846..847 " "
+ WORD@847..851 "that"
+ WHITESPACE@851..852 " "
+ WORD@852..857 "don't"
+ WHITESPACE@857..878 "\n "
+ WORD@878..886 "generate"
+ WHITESPACE@886..887 " "
+ WORD@887..893 "robust"
+ WHITESPACE@893..894 " "
+ WORD@894..899 "index"
+ WHITESPACE@899..900 " "
+ WORD@900..907 "entries"
+ WHITESPACE@907..908 " "
+ WORD@908..915 "require"
+ WHITESPACE@915..916 " "
+ WORD@916..920 "some"
+ WHITESPACE@920..921 " "
+ WORD@921..928 "control"
+ WHITESPACE@928..929 " "
+ WORD@929..938 "sequences"
+ WHITESPACE@938..959 "\n "
+ WORD@959..961 "to"
+ WHITESPACE@961..962 " "
+ WORD@962..964 "be"
+ WHITESPACE@964..965 " "
+ WORD@965..974 "protected"
+ WHITESPACE@974..975 " "
+ WORD@975..979 "from"
+ WHITESPACE@979..980 " "
+ WORD@980..989 "expansion"
+ R_CURLY@989..990 "}"
+ COMMA@990..991 ","
+ WHITESPACE@991..992 "\n"
+ R_DELIM@992..993 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_matuz_1990() {
+ check(
+ r#"@collection{matuz:doody,
+ editor = {Matuz, Roger},
+ title = {Contemporary Literary Criticism},
+ year = 1990,
+ volume = 61,
+ publisher = {Gale},
+ location = {Detroit},
+ pages = {204-208},
+ langid = {english},
+ langidopts = {variant=american},
+ annotation = {A \texttt{collection} entry providing the excerpt information
+ for the \texttt{doody} entry. Note the format of the
+ \texttt{pages} field},
+}"#,
+ expect![[r#"
+ ROOT@0..517
+ ENTRY@0..517
+ TYPE@0..11 "@collection"
+ L_DELIM@11..12 "{"
+ NAME@12..23 "matuz:doody"
+ COMMA@23..24 ","
+ WHITESPACE@24..29 "\n "
+ FIELD@29..59
+ NAME@29..35 "editor"
+ WHITESPACE@35..42 " "
+ EQ@42..43 "="
+ WHITESPACE@43..44 " "
+ CURLY_GROUP@44..58
+ L_CURLY@44..45 "{"
+ WORD@45..50 "Matuz"
+ COMMA@50..51 ","
+ WHITESPACE@51..52 " "
+ WORD@52..57 "Roger"
+ R_CURLY@57..58 "}"
+ COMMA@58..59 ","
+ WHITESPACE@59..64 "\n "
+ FIELD@64..113
+ NAME@64..69 "title"
+ WHITESPACE@69..77 " "
+ EQ@77..78 "="
+ WHITESPACE@78..79 " "
+ CURLY_GROUP@79..112
+ L_CURLY@79..80 "{"
+ WORD@80..92 "Contemporary"
+ WHITESPACE@92..93 " "
+ WORD@93..101 "Literary"
+ WHITESPACE@101..102 " "
+ WORD@102..111 "Criticism"
+ R_CURLY@111..112 "}"
+ COMMA@112..113 ","
+ WHITESPACE@113..118 "\n "
+ FIELD@118..138
+ NAME@118..122 "year"
+ WHITESPACE@122..131 " "
+ EQ@131..132 "="
+ WHITESPACE@132..133 " "
+ LITERAL@133..137
+ INTEGER@133..137 "1990"
+ COMMA@137..138 ","
+ WHITESPACE@138..143 "\n "
+ FIELD@143..161
+ NAME@143..149 "volume"
+ WHITESPACE@149..156 " "
+ EQ@156..157 "="
+ WHITESPACE@157..158 " "
+ LITERAL@158..160
+ INTEGER@158..160 "61"
+ COMMA@160..161 ","
+ WHITESPACE@161..166 "\n "
+ FIELD@166..188
+ NAME@166..175 "publisher"
+ WHITESPACE@175..179 " "
+ EQ@179..180 "="
+ WHITESPACE@180..181 " "
+ CURLY_GROUP@181..187
+ L_CURLY@181..182 "{"
+ WORD@182..186 "Gale"
+ R_CURLY@186..187 "}"
+ COMMA@187..188 ","
+ WHITESPACE@188..193 "\n "
+ FIELD@193..218
+ NAME@193..201 "location"
+ WHITESPACE@201..206 " "
+ EQ@206..207 "="
+ WHITESPACE@207..208 " "
+ CURLY_GROUP@208..217
+ L_CURLY@208..209 "{"
+ WORD@209..216 "Detroit"
+ R_CURLY@216..217 "}"
+ COMMA@217..218 ","
+ WHITESPACE@218..223 "\n "
+ FIELD@223..248
+ NAME@223..228 "pages"
+ WHITESPACE@228..236 " "
+ EQ@236..237 "="
+ WHITESPACE@237..238 " "
+ CURLY_GROUP@238..247
+ L_CURLY@238..239 "{"
+ WORD@239..246 "204-208"
+ R_CURLY@246..247 "}"
+ COMMA@247..248 ","
+ WHITESPACE@248..253 "\n "
+ FIELD@253..278
+ NAME@253..259 "langid"
+ WHITESPACE@259..266 " "
+ EQ@266..267 "="
+ WHITESPACE@267..268 " "
+ CURLY_GROUP@268..277
+ L_CURLY@268..269 "{"
+ WORD@269..276 "english"
+ R_CURLY@276..277 "}"
+ COMMA@277..278 ","
+ WHITESPACE@278..283 "\n "
+ FIELD@283..317
+ NAME@283..293 "langidopts"
+ WHITESPACE@293..296 " "
+ EQ@296..297 "="
+ WHITESPACE@297..298 " "
+ CURLY_GROUP@298..316
+ L_CURLY@298..299 "{"
+ WORD@299..315 "variant=american"
+ R_CURLY@315..316 "}"
+ COMMA@316..317 ","
+ WHITESPACE@317..322 "\n "
+ FIELD@322..515
+ NAME@322..332 "annotation"
+ WHITESPACE@332..335 " "
+ EQ@335..336 "="
+ WHITESPACE@336..337 " "
+ CURLY_GROUP@337..514
+ L_CURLY@337..338 "{"
+ WORD@338..339 "A"
+ WHITESPACE@339..340 " "
+ COMMAND@340..347
+ COMMAND_NAME@340..347 "\\texttt"
+ CURLY_GROUP@347..359
+ L_CURLY@347..348 "{"
+ WORD@348..358 "collection"
+ R_CURLY@358..359 "}"
+ WHITESPACE@359..360 " "
+ WORD@360..365 "entry"
+ WHITESPACE@365..366 " "
+ WORD@366..375 "providing"
+ WHITESPACE@375..376 " "
+ WORD@376..379 "the"
+ WHITESPACE@379..380 " "
+ WORD@380..387 "excerpt"
+ WHITESPACE@387..388 " "
+ WORD@388..399 "information"
+ WHITESPACE@399..420 "\n "
+ WORD@420..423 "for"
+ WHITESPACE@423..424 " "
+ WORD@424..427 "the"
+ WHITESPACE@427..428 " "
+ COMMAND@428..435
+ COMMAND_NAME@428..435 "\\texttt"
+ CURLY_GROUP@435..442
+ L_CURLY@435..436 "{"
+ WORD@436..441 "doody"
+ R_CURLY@441..442 "}"
+ WHITESPACE@442..443 " "
+ WORD@443..449 "entry."
+ WHITESPACE@449..450 " "
+ WORD@450..454 "Note"
+ WHITESPACE@454..455 " "
+ WORD@455..458 "the"
+ WHITESPACE@458..459 " "
+ WORD@459..465 "format"
+ WHITESPACE@465..466 " "
+ WORD@466..468 "of"
+ WHITESPACE@468..469 " "
+ WORD@469..472 "the"
+ WHITESPACE@472..493 "\n "
+ COMMAND@493..500
+ COMMAND_NAME@493..500 "\\texttt"
+ CURLY_GROUP@500..507
+ L_CURLY@500..501 "{"
+ WORD@501..506 "pages"
+ R_CURLY@506..507 "}"
+ WHITESPACE@507..508 " "
+ WORD@508..513 "field"
+ R_CURLY@513..514 "}"
+ COMMA@514..515 ","
+ WHITESPACE@515..516 "\n"
+ R_DELIM@516..517 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_nietzsche_1998() {
+ check(
+ r#"@string{dtv = {Deutscher Taschenbuch-Verlag}}
+
+@mvbook{nietzsche:ksa,
+ author = {Nietzsche, Friedrich},
+ title = {S{\"a}mtliche Werke},
+ date = 1988,
+ editor = {Colli, Giorgio and Montinari, Mazzino},
+ edition = 2,
+ volumes = 15,
+ publisher = dtv # { and Walter de Gruyter},
+ location = {M{\"u}nchen and Berlin and New York},
+ langid = {german},
+ sorttitle = {Werke-00-000},
+ indexsorttitle= {Samtliche Werke},
+ subtitle = {Kritische Studienausgabe},
+ annotation = {The critical edition of Nietzsche's works. This is a
+ \texttt{mvbook} entry referring to a 15-volume work as a
+ whole. Note the \texttt{volumes} field and the format of the
+ \texttt{publisher} and \texttt{location} fields in the
+ database file. Also note the \texttt{sorttitle} and
+ field which is used to fine-tune the
+ sorting order of the bibliography. We want this item listed
+ first in the bibliography},
+}"#,
+ expect![[r##"
+ ROOT@0..1112
+ STRING@0..49
+ TYPE@0..7 "@string"
+ L_DELIM@7..8 "{"
+ NAME@8..11 "dtv"
+ WHITESPACE@11..16 " "
+ EQ@16..17 "="
+ WHITESPACE@17..18 " "
+ CURLY_GROUP@18..48
+ L_CURLY@18..19 "{"
+ WORD@19..28 "Deutscher"
+ WHITESPACE@28..29 " "
+ WORD@29..47 "Taschenbuch-Verlag"
+ R_CURLY@47..48 "}"
+ R_DELIM@48..49 "}"
+ JUNK@49..51 "\n\n"
+ ENTRY@51..1112
+ TYPE@51..58 "@mvbook"
+ L_DELIM@58..59 "{"
+ NAME@59..72 "nietzsche:ksa"
+ COMMA@72..73 ","
+ WHITESPACE@73..78 "\n "
+ FIELD@78..116
+ NAME@78..84 "author"
+ WHITESPACE@84..91 " "
+ EQ@91..92 "="
+ WHITESPACE@92..93 " "
+ CURLY_GROUP@93..115
+ L_CURLY@93..94 "{"
+ WORD@94..103 "Nietzsche"
+ COMMA@103..104 ","
+ WHITESPACE@104..105 " "
+ WORD@105..114 "Friedrich"
+ R_CURLY@114..115 "}"
+ COMMA@115..116 ","
+ WHITESPACE@116..121 "\n "
+ FIELD@121..158
+ NAME@121..126 "title"
+ WHITESPACE@126..134 " "
+ EQ@134..135 "="
+ WHITESPACE@135..136 " "
+ CURLY_GROUP@136..157
+ L_CURLY@136..137 "{"
+ WORD@137..138 "S"
+ CURLY_GROUP@138..143
+ L_CURLY@138..139 "{"
+ ACCENT@139..142
+ ACCENT_NAME@139..141 "\\\""
+ WORD@141..142 "a"
+ R_CURLY@142..143 "}"
+ WORD@143..150 "mtliche"
+ WHITESPACE@150..151 " "
+ WORD@151..156 "Werke"
+ R_CURLY@156..157 "}"
+ COMMA@157..158 ","
+ WHITESPACE@158..163 "\n "
+ FIELD@163..183
+ NAME@163..167 "date"
+ WHITESPACE@167..176 " "
+ EQ@176..177 "="
+ WHITESPACE@177..178 " "
+ LITERAL@178..182
+ INTEGER@178..182 "1988"
+ COMMA@182..183 ","
+ WHITESPACE@183..188 "\n "
+ FIELD@188..243
+ NAME@188..194 "editor"
+ WHITESPACE@194..201 " "
+ EQ@201..202 "="
+ WHITESPACE@202..203 " "
+ CURLY_GROUP@203..242
+ L_CURLY@203..204 "{"
+ WORD@204..209 "Colli"
+ COMMA@209..210 ","
+ WHITESPACE@210..211 " "
+ WORD@211..218 "Giorgio"
+ WHITESPACE@218..219 " "
+ WORD@219..222 "and"
+ WHITESPACE@222..223 " "
+ WORD@223..232 "Montinari"
+ COMMA@232..233 ","
+ WHITESPACE@233..234 " "
+ WORD@234..241 "Mazzino"
+ R_CURLY@241..242 "}"
+ COMMA@242..243 ","
+ WHITESPACE@243..248 "\n "
+ FIELD@248..265
+ NAME@248..255 "edition"
+ WHITESPACE@255..261 " "
+ EQ@261..262 "="
+ WHITESPACE@262..263 " "
+ LITERAL@263..264
+ INTEGER@263..264 "2"
+ COMMA@264..265 ","
+ WHITESPACE@265..270 "\n "
+ FIELD@270..288
+ NAME@270..277 "volumes"
+ WHITESPACE@277..283 " "
+ EQ@283..284 "="
+ WHITESPACE@284..285 " "
+ LITERAL@285..287
+ INTEGER@285..287 "15"
+ COMMA@287..288 ","
+ WHITESPACE@288..293 "\n "
+ FIELD@293..339
+ NAME@293..302 "publisher"
+ WHITESPACE@302..306 " "
+ EQ@306..307 "="
+ WHITESPACE@307..308 " "
+ JOIN@308..338
+ LITERAL@308..311
+ NAME@308..311 "dtv"
+ WHITESPACE@311..312 " "
+ POUND@312..313 "#"
+ WHITESPACE@313..314 " "
+ CURLY_GROUP@314..338
+ L_CURLY@314..315 "{"
+ WHITESPACE@315..316 " "
+ WORD@316..319 "and"
+ WHITESPACE@319..320 " "
+ WORD@320..326 "Walter"
+ WHITESPACE@326..327 " "
+ WORD@327..329 "de"
+ WHITESPACE@329..330 " "
+ WORD@330..337 "Gruyter"
+ R_CURLY@337..338 "}"
+ COMMA@338..339 ","
+ WHITESPACE@339..344 "\n "
+ FIELD@344..397
+ NAME@344..352 "location"
+ WHITESPACE@352..357 " "
+ EQ@357..358 "="
+ WHITESPACE@358..359 " "
+ CURLY_GROUP@359..396
+ L_CURLY@359..360 "{"
+ WORD@360..361 "M"
+ CURLY_GROUP@361..366
+ L_CURLY@361..362 "{"
+ ACCENT@362..365
+ ACCENT_NAME@362..364 "\\\""
+ WORD@364..365 "u"
+ R_CURLY@365..366 "}"
+ WORD@366..371 "nchen"
+ WHITESPACE@371..372 " "
+ WORD@372..375 "and"
+ WHITESPACE@375..376 " "
+ WORD@376..382 "Berlin"
+ WHITESPACE@382..383 " "
+ WORD@383..386 "and"
+ WHITESPACE@386..387 " "
+ WORD@387..390 "New"
+ WHITESPACE@390..391 " "
+ WORD@391..395 "York"
+ R_CURLY@395..396 "}"
+ COMMA@396..397 ","
+ WHITESPACE@397..402 "\n "
+ FIELD@402..426
+ NAME@402..408 "langid"
+ WHITESPACE@408..415 " "
+ EQ@415..416 "="
+ WHITESPACE@416..417 " "
+ CURLY_GROUP@417..425
+ L_CURLY@417..418 "{"
+ WORD@418..424 "german"
+ R_CURLY@424..425 "}"
+ COMMA@425..426 ","
+ WHITESPACE@426..431 "\n "
+ FIELD@431..461
+ NAME@431..440 "sorttitle"
+ WHITESPACE@440..444 " "
+ EQ@444..445 "="
+ WHITESPACE@445..446 " "
+ CURLY_GROUP@446..460
+ L_CURLY@446..447 "{"
+ WORD@447..459 "Werke-00-000"
+ R_CURLY@459..460 "}"
+ COMMA@460..461 ","
+ WHITESPACE@461..466 "\n "
+ FIELD@466..500
+ NAME@466..480 "indexsorttitle"
+ EQ@480..481 "="
+ WHITESPACE@481..482 " "
+ CURLY_GROUP@482..499
+ L_CURLY@482..483 "{"
+ WORD@483..492 "Samtliche"
+ WHITESPACE@492..493 " "
+ WORD@493..498 "Werke"
+ R_CURLY@498..499 "}"
+ COMMA@499..500 ","
+ WHITESPACE@500..505 "\n "
+ FIELD@505..547
+ NAME@505..513 "subtitle"
+ WHITESPACE@513..518 " "
+ EQ@518..519 "="
+ WHITESPACE@519..520 " "
+ CURLY_GROUP@520..546
+ L_CURLY@520..521 "{"
+ WORD@521..530 "Kritische"
+ WHITESPACE@530..531 " "
+ WORD@531..545 "Studienausgabe"
+ R_CURLY@545..546 "}"
+ COMMA@546..547 ","
+ WHITESPACE@547..552 "\n "
+ FIELD@552..1110
+ NAME@552..562 "annotation"
+ WHITESPACE@562..565 " "
+ EQ@565..566 "="
+ WHITESPACE@566..567 " "
+ CURLY_GROUP@567..1109
+ L_CURLY@567..568 "{"
+ WORD@568..571 "The"
+ WHITESPACE@571..572 " "
+ WORD@572..580 "critical"
+ WHITESPACE@580..581 " "
+ WORD@581..588 "edition"
+ WHITESPACE@588..589 " "
+ WORD@589..591 "of"
+ WHITESPACE@591..592 " "
+ WORD@592..603 "Nietzsche's"
+ WHITESPACE@603..604 " "
+ WORD@604..610 "works."
+ WHITESPACE@610..611 " "
+ WORD@611..615 "This"
+ WHITESPACE@615..616 " "
+ WORD@616..618 "is"
+ WHITESPACE@618..619 " "
+ WORD@619..620 "a"
+ WHITESPACE@620..641 "\n "
+ COMMAND@641..648
+ COMMAND_NAME@641..648 "\\texttt"
+ CURLY_GROUP@648..656
+ L_CURLY@648..649 "{"
+ WORD@649..655 "mvbook"
+ R_CURLY@655..656 "}"
+ WHITESPACE@656..657 " "
+ WORD@657..662 "entry"
+ WHITESPACE@662..663 " "
+ WORD@663..672 "referring"
+ WHITESPACE@672..673 " "
+ WORD@673..675 "to"
+ WHITESPACE@675..676 " "
+ WORD@676..677 "a"
+ WHITESPACE@677..678 " "
+ WORD@678..687 "15-volume"
+ WHITESPACE@687..688 " "
+ WORD@688..692 "work"
+ WHITESPACE@692..693 " "
+ WORD@693..695 "as"
+ WHITESPACE@695..696 " "
+ WORD@696..697 "a"
+ WHITESPACE@697..718 "\n "
+ WORD@718..724 "whole."
+ WHITESPACE@724..725 " "
+ WORD@725..729 "Note"
+ WHITESPACE@729..730 " "
+ WORD@730..733 "the"
+ WHITESPACE@733..734 " "
+ COMMAND@734..741
+ COMMAND_NAME@734..741 "\\texttt"
+ CURLY_GROUP@741..750
+ L_CURLY@741..742 "{"
+ WORD@742..749 "volumes"
+ R_CURLY@749..750 "}"
+ WHITESPACE@750..751 " "
+ WORD@751..756 "field"
+ WHITESPACE@756..757 " "
+ WORD@757..760 "and"
+ WHITESPACE@760..761 " "
+ WORD@761..764 "the"
+ WHITESPACE@764..765 " "
+ WORD@765..771 "format"
+ WHITESPACE@771..772 " "
+ WORD@772..774 "of"
+ WHITESPACE@774..775 " "
+ WORD@775..778 "the"
+ WHITESPACE@778..799 "\n "
+ COMMAND@799..806
+ COMMAND_NAME@799..806 "\\texttt"
+ CURLY_GROUP@806..817
+ L_CURLY@806..807 "{"
+ WORD@807..816 "publisher"
+ R_CURLY@816..817 "}"
+ WHITESPACE@817..818 " "
+ WORD@818..821 "and"
+ WHITESPACE@821..822 " "
+ COMMAND@822..829
+ COMMAND_NAME@822..829 "\\texttt"
+ CURLY_GROUP@829..839
+ L_CURLY@829..830 "{"
+ WORD@830..838 "location"
+ R_CURLY@838..839 "}"
+ WHITESPACE@839..840 " "
+ WORD@840..846 "fields"
+ WHITESPACE@846..847 " "
+ WORD@847..849 "in"
+ WHITESPACE@849..850 " "
+ WORD@850..853 "the"
+ WHITESPACE@853..874 "\n "
+ WORD@874..882 "database"
+ WHITESPACE@882..883 " "
+ WORD@883..888 "file."
+ WHITESPACE@888..889 " "
+ WORD@889..893 "Also"
+ WHITESPACE@893..894 " "
+ WORD@894..898 "note"
+ WHITESPACE@898..899 " "
+ WORD@899..902 "the"
+ WHITESPACE@902..903 " "
+ COMMAND@903..910
+ COMMAND_NAME@903..910 "\\texttt"
+ CURLY_GROUP@910..921
+ L_CURLY@910..911 "{"
+ WORD@911..920 "sorttitle"
+ R_CURLY@920..921 "}"
+ WHITESPACE@921..922 " "
+ WORD@922..925 "and"
+ WHITESPACE@925..946 "\n "
+ WORD@946..951 "field"
+ WHITESPACE@951..952 " "
+ WORD@952..957 "which"
+ WHITESPACE@957..958 " "
+ WORD@958..960 "is"
+ WHITESPACE@960..961 " "
+ WORD@961..965 "used"
+ WHITESPACE@965..966 " "
+ WORD@966..968 "to"
+ WHITESPACE@968..969 " "
+ WORD@969..978 "fine-tune"
+ WHITESPACE@978..979 " "
+ WORD@979..982 "the"
+ WHITESPACE@982..1003 "\n "
+ WORD@1003..1010 "sorting"
+ WHITESPACE@1010..1011 " "
+ WORD@1011..1016 "order"
+ WHITESPACE@1016..1017 " "
+ WORD@1017..1019 "of"
+ WHITESPACE@1019..1020 " "
+ WORD@1020..1023 "the"
+ WHITESPACE@1023..1024 " "
+ WORD@1024..1037 "bibliography."
+ WHITESPACE@1037..1038 " "
+ WORD@1038..1040 "We"
+ WHITESPACE@1040..1041 " "
+ WORD@1041..1045 "want"
+ WHITESPACE@1045..1046 " "
+ WORD@1046..1050 "this"
+ WHITESPACE@1050..1051 " "
+ WORD@1051..1055 "item"
+ WHITESPACE@1055..1056 " "
+ WORD@1056..1062 "listed"
+ WHITESPACE@1062..1083 "\n "
+ WORD@1083..1088 "first"
+ WHITESPACE@1088..1089 " "
+ WORD@1089..1091 "in"
+ WHITESPACE@1091..1092 " "
+ WORD@1092..1095 "the"
+ WHITESPACE@1095..1096 " "
+ WORD@1096..1108 "bibliography"
+ R_CURLY@1108..1109 "}"
+ COMMA@1109..1110 ","
+ WHITESPACE@1110..1111 "\n"
+ R_DELIM@1111..1112 "}"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_rivest_1978() {
+ check(
+ r#"@article{10.1145/359340.359342,
+ author = {Rivest, R. L. and Shamir, A. and Adleman, L.},
+ title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems},
+ year = {1978},
+ issue_date = {Feb. 1978},
+ publisher = {Association for Computing Machinery},
+ address = {New York, NY, USA},
+ volume = {21},
+ number = {2},
+ issn = {0001-0782},
+ url = {https://doi.org/10.1145/359340.359342},
+ doi = {10.1145/359340.359342},
+ journal = {Commun. ACM},
+ month = {feb},
+ pages = {120-126},
+ numpages = {7},
+}"#,
+ expect![[r#"
+ ROOT@0..557
+ ENTRY@0..557
+ TYPE@0..8 "@article"
+ L_DELIM@8..9 "{"
+ NAME@9..30 "10.1145/359340.359342"
+ COMMA@30..31 ","
+ WHITESPACE@31..36 "\n "
+ FIELD@36..92
+ NAME@36..42 "author"
+ WHITESPACE@42..43 " "
+ EQ@43..44 "="
+ WHITESPACE@44..45 " "
+ CURLY_GROUP@45..91
+ L_CURLY@45..46 "{"
+ WORD@46..52 "Rivest"
+ COMMA@52..53 ","
+ WHITESPACE@53..54 " "
+ WORD@54..56 "R."
+ WHITESPACE@56..57 " "
+ WORD@57..59 "L."
+ WHITESPACE@59..60 " "
+ WORD@60..63 "and"
+ WHITESPACE@63..64 " "
+ WORD@64..70 "Shamir"
+ COMMA@70..71 ","
+ WHITESPACE@71..72 " "
+ WORD@72..74 "A."
+ WHITESPACE@74..75 " "
+ WORD@75..78 "and"
+ WHITESPACE@78..79 " "
+ WORD@79..86 "Adleman"
+ COMMA@86..87 ","
+ WHITESPACE@87..88 " "
+ WORD@88..90 "L."
+ R_CURLY@90..91 "}"
+ COMMA@91..92 ","
+ WHITESPACE@92..97 "\n "
+ FIELD@97..178
+ NAME@97..102 "title"
+ WHITESPACE@102..103 " "
+ EQ@103..104 "="
+ WHITESPACE@104..105 " "
+ CURLY_GROUP@105..177
+ L_CURLY@105..106 "{"
+ WORD@106..107 "A"
+ WHITESPACE@107..108 " "
+ WORD@108..114 "Method"
+ WHITESPACE@114..115 " "
+ WORD@115..118 "for"
+ WHITESPACE@118..119 " "
+ WORD@119..128 "Obtaining"
+ WHITESPACE@128..129 " "
+ WORD@129..136 "Digital"
+ WHITESPACE@136..137 " "
+ WORD@137..147 "Signatures"
+ WHITESPACE@147..148 " "
+ WORD@148..151 "and"
+ WHITESPACE@151..152 " "
+ WORD@152..162 "Public-Key"
+ WHITESPACE@162..163 " "
+ WORD@163..176 "Cryptosystems"
+ R_CURLY@176..177 "}"
+ COMMA@177..178 ","
+ WHITESPACE@178..183 "\n "
+ FIELD@183..197
+ NAME@183..187 "year"
+ WHITESPACE@187..188 " "
+ EQ@188..189 "="
+ WHITESPACE@189..190 " "
+ CURLY_GROUP@190..196
+ L_CURLY@190..191 "{"
+ INTEGER@191..195 "1978"
+ R_CURLY@195..196 "}"
+ COMMA@196..197 ","
+ WHITESPACE@197..202 "\n "
+ FIELD@202..227
+ NAME@202..212 "issue_date"
+ WHITESPACE@212..213 " "
+ EQ@213..214 "="
+ WHITESPACE@214..215 " "
+ CURLY_GROUP@215..226
+ L_CURLY@215..216 "{"
+ WORD@216..220 "Feb."
+ WHITESPACE@220..221 " "
+ INTEGER@221..225 "1978"
+ R_CURLY@225..226 "}"
+ COMMA@226..227 ","
+ WHITESPACE@227..232 "\n "
+ FIELD@232..282
+ NAME@232..241 "publisher"
+ WHITESPACE@241..242 " "
+ EQ@242..243 "="
+ WHITESPACE@243..244 " "
+ CURLY_GROUP@244..281
+ L_CURLY@244..245 "{"
+ WORD@245..256 "Association"
+ WHITESPACE@256..257 " "
+ WORD@257..260 "for"
+ WHITESPACE@260..261 " "
+ WORD@261..270 "Computing"
+ WHITESPACE@270..271 " "
+ WORD@271..280 "Machinery"
+ R_CURLY@280..281 "}"
+ COMMA@281..282 ","
+ WHITESPACE@282..287 "\n "
+ FIELD@287..317
+ NAME@287..294 "address"
+ WHITESPACE@294..295 " "
+ EQ@295..296 "="
+ WHITESPACE@296..297 " "
+ CURLY_GROUP@297..316
+ L_CURLY@297..298 "{"
+ WORD@298..301 "New"
+ WHITESPACE@301..302 " "
+ WORD@302..306 "York"
+ COMMA@306..307 ","
+ WHITESPACE@307..308 " "
+ WORD@308..310 "NY"
+ COMMA@310..311 ","
+ WHITESPACE@311..312 " "
+ WORD@312..315 "USA"
+ R_CURLY@315..316 "}"
+ COMMA@316..317 ","
+ WHITESPACE@317..322 "\n "
+ FIELD@322..336
+ NAME@322..328 "volume"
+ WHITESPACE@328..329 " "
+ EQ@329..330 "="
+ WHITESPACE@330..331 " "
+ CURLY_GROUP@331..335
+ L_CURLY@331..332 "{"
+ INTEGER@332..334 "21"
+ R_CURLY@334..335 "}"
+ COMMA@335..336 ","
+ WHITESPACE@336..341 "\n "
+ FIELD@341..354
+ NAME@341..347 "number"
+ WHITESPACE@347..348 " "
+ EQ@348..349 "="
+ WHITESPACE@349..350 " "
+ CURLY_GROUP@350..353
+ L_CURLY@350..351 "{"
+ INTEGER@351..352 "2"
+ R_CURLY@352..353 "}"
+ COMMA@353..354 ","
+ WHITESPACE@354..359 "\n "
+ FIELD@359..378
+ NAME@359..363 "issn"
+ WHITESPACE@363..364 " "
+ EQ@364..365 "="
+ WHITESPACE@365..366 " "
+ CURLY_GROUP@366..377
+ L_CURLY@366..367 "{"
+ WORD@367..376 "0001-0782"
+ R_CURLY@376..377 "}"
+ COMMA@377..378 ","
+ WHITESPACE@378..383 "\n "
+ FIELD@383..429
+ NAME@383..386 "url"
+ WHITESPACE@386..387 " "
+ EQ@387..388 "="
+ WHITESPACE@388..389 " "
+ CURLY_GROUP@389..428
+ L_CURLY@389..390 "{"
+ WORD@390..427 "https://doi.org/10.11 ..."
+ R_CURLY@427..428 "}"
+ COMMA@428..429 ","
+ WHITESPACE@429..434 "\n "
+ FIELD@434..464
+ NAME@434..437 "doi"
+ WHITESPACE@437..438 " "
+ EQ@438..439 "="
+ WHITESPACE@439..440 " "
+ CURLY_GROUP@440..463
+ L_CURLY@440..441 "{"
+ WORD@441..462 "10.1145/359340.359342"
+ R_CURLY@462..463 "}"
+ COMMA@463..464 ","
+ WHITESPACE@464..469 "\n "
+ FIELD@469..493
+ NAME@469..476 "journal"
+ WHITESPACE@476..477 " "
+ EQ@477..478 "="
+ WHITESPACE@478..479 " "
+ CURLY_GROUP@479..492
+ L_CURLY@479..480 "{"
+ WORD@480..487 "Commun."
+ WHITESPACE@487..488 " "
+ WORD@488..491 "ACM"
+ R_CURLY@491..492 "}"
+ COMMA@492..493 ","
+ WHITESPACE@493..498 "\n "
+ FIELD@498..512
+ NAME@498..503 "month"
+ WHITESPACE@503..504 " "
+ EQ@504..505 "="
+ WHITESPACE@505..506 " "
+ CURLY_GROUP@506..511
+ L_CURLY@506..507 "{"
+ WORD@507..510 "feb"
+ R_CURLY@510..511 "}"
+ COMMA@511..512 ","
+ WHITESPACE@512..517 "\n "
+ FIELD@517..535
+ NAME@517..522 "pages"
+ WHITESPACE@522..523 " "
+ EQ@523..524 "="
+ WHITESPACE@524..525 " "
+ CURLY_GROUP@525..534
+ L_CURLY@525..526 "{"
+ WORD@526..533 "120-126"
+ R_CURLY@533..534 "}"
+ COMMA@534..535 ","
+ WHITESPACE@535..540 "\n "
+ FIELD@540..555
+ NAME@540..548 "numpages"
+ WHITESPACE@548..549 " "
+ EQ@549..550 "="
+ WHITESPACE@550..551 " "
+ CURLY_GROUP@551..554
+ L_CURLY@551..552 "{"
+ INTEGER@552..553 "7"
+ R_CURLY@553..554 "}"
+ COMMA@554..555 ","
+ WHITESPACE@555..556 "\n"
+ R_DELIM@556..557 "}"
+
+ "#]],
+ );
+}
diff --git a/support/texlab/crates/parser/src/build_log.rs b/support/texlab/crates/parser/src/build_log.rs
index 27f3699a66..420d2dda20 100644
--- a/support/texlab/crates/parser/src/build_log.rs
+++ b/support/texlab/crates/parser/src/build_log.rs
@@ -174,14 +174,4 @@ impl PartialOrd for FileRange {
}
#[cfg(test)]
-mod tests {
- use super::parse_build_log;
-
- #[test]
- fn test_parse() {
- insta::glob!("test_data/build_log/*.txt", |path| {
- let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n");
- insta::assert_debug_snapshot!(parse_build_log(&text));
- });
- }
-}
+mod tests;
diff --git a/support/texlab/crates/parser/src/build_log/tests.rs b/support/texlab/crates/parser/src/build_log/tests.rs
new file mode 100644
index 0000000000..20d165e008
--- /dev/null
+++ b/support/texlab/crates/parser/src/build_log/tests.rs
@@ -0,0 +1,1228 @@
+use expect_test::{expect, Expect};
+
+use crate::parse_build_log;
+
+fn check(input: &str, expect: Expect) {
+ expect.assert_debug_eq(&parse_build_log(input));
+}
+
+#[test]
+fn test_001() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:50
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/TexLive/texmf-dist/tex/latex/multirow/bigstrut.sty
+Package: bigstrut 2016/11/25 v2.2 Provide larger struts in tabulars
+\bigstrutjot=\dimen103
+)
+(/TexLive/texmf-dist/tex/latex/multirow/multirow.sty
+Package: multirow 2016/11/25 v2.2 Span multiple rows of a table
+\multirow@colwidth=\skip43
+\multirow@cntb=\count87
+\multirow@dima=\skip44
+) (./parent.aux)
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+
+Overfull \hbox (200.00162pt too wide) in paragraph at lines 8--9
+[]\OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+[]
+
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <7> on input line 11.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <5> on input line 11.
+
+Overfull \vbox (3.19998pt too high) detected at line 23
+[]
+
+[1
+
+{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) )
+Here is how much of TeX's memory you used:
+265 strings out of 492995
+3121 string characters out of 6138727
+55074 words of memory out of 5000000
+3896 multiletter control sequences out of 15000+600000
+3640 words of font info for 14 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+23i,20n,20p,124b,282s stack positions out of 5000i,500n,10000p,200000b,80000s
+</
+TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></TexLive/texmf-d
+ist/fonts/type1/public/amsfonts/cm/cmr7.pfb>
+Output written on parent.pdf (1 page, 17505 bytes).
+PDF statistics:
+16 PDF objects out of 1000 (max. 8388607)
+10 compressed objects within 1 object stream
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "Overfull \\hbox (200.00162pt too wide) in paragraph at lines 8--9",
+ hint: None,
+ line: Some(
+ 7,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "Overfull \\vbox (3.19998pt too high) detected at line 23",
+ hint: None,
+ line: Some(
+ 22,
+ ),
+ },
+ ],
+ }
+ "#]],
+ );
+}
+
+#[test]
+fn test_002() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:52
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+) (./parent.aux (./child.aux))
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+(./child.tex
+! Undefined control sequence.
+l.1 \foo
+
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+
+) (./parent.aux) )
+Here is how much of TeX's memory you used:
+205 strings out of 492995
+2149 string characters out of 6138727
+54074 words of memory out of 5000000
+3841 multiletter control sequences out of 15000+600000
+3640 words of font info for 14 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s
+
+No pages of output.
+PDF statistics:
+0 PDF objects out of 1000 (max. 8388607)
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "./child.tex",
+ level: Error,
+ message: "Undefined control sequence.",
+ hint: Some(
+ "\\foo",
+ ),
+ line: Some(
+ 0,
+ ),
+ },
+ ],
+ }
+ "#]],
+ );
+}
+
+#[test]
+fn test_003() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:51
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+) (./parent.aux)
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4.
+LaTeX Font Info: ... okay on input line 4.
+
+LaTeX Warning: Citation `foo' on page 1 undefined on input line 6.
+
+[1
+
+{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux)
+
+LaTeX Warning: There were undefined references.
+
+)
+Here is how much of TeX's memory you used:
+204 strings out of 492995
+2142 string characters out of 6138727
+54074 words of memory out of 5000000
+3842 multiletter control sequences out of 15000+600000
+3948 words of font info for 15 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+23i,4n,21p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s
+</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></TexLive/
+texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
+Output written on parent.pdf (1 page, 17339 bytes).
+PDF statistics:
+16 PDF objects out of 1000 (max. 8388607)
+10 compressed objects within 1 object stream
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "LaTeX Warning: Citation `foo' on page 1 undefined on input line 6.",
+ hint: None,
+ line: Some(
+ 5,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "LaTeX Warning: There were undefined references.",
+ hint: None,
+ line: None,
+ },
+ ],
+ }
+ "#]],
+ );
+}
+
+#[test]
+fn test_004() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:40
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/TexLive/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2017/05/19 3.10 The Babel package
+
+! Package babel Error: Unknown option `foo'. Either you misspelled it
+(babel) or the language definition file foo.ldf was not found.
+
+See the babel package documentation for explanation.
+Type H <return> for immediate help.
+...
+
+l.393 \ProcessOptions*
+
+Valid options are: shorthands=, KeepShorthandsActive,
+activeacute, activegrave, noconfigs, safe=, main=, math=
+headfoot=, strings=, config=, hyphenmap=, or a language name.
+
+! Package babel Error: You haven't specified a language option.
+
+See the babel package documentation for explanation.
+Type H <return> for immediate help.
+...
+
+l.426 ...ry to proceed from here, type x to quit.}
+
+You need to specify a language, either as a global option
+or as an optional argument to the \usepackage command;
+You shouldn't try to proceed from here, type x to quit.
+
+) (./parent.aux)
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5.
+LaTeX Font Info: ... okay on input line 5.
+(./parent.aux) )
+Here is how much of TeX's memory you used:
+304 strings out of 492995
+3421 string characters out of 6138727
+56035 words of memory out of 5000000
+3938 multiletter control sequences out of 15000+600000
+3640 words of font info for 14 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s
+
+No pages of output.
+PDF statistics:
+0 PDF objects out of 1000 (max. 8388607)
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty",
+ level: Error,
+ message: "Package babel Error: Unknown option `foo'. Either you misspelled it or the language definition file foo.ldf was not found.",
+ hint: Some(
+ "\\ProcessOptions*",
+ ),
+ line: Some(
+ 392,
+ ),
+ },
+ BuildError {
+ relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty",
+ level: Error,
+ message: "Package babel Error: You haven't specified a language option.",
+ hint: Some(
+ "ry to proceed from here, type x to quit.}",
+ ),
+ line: Some(
+ 425,
+ ),
+ },
+ ],
+ }
+ "#]],
+ )
+}
+
+#[test]
+fn test_005() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:45
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+)
+(/TexLive/texmf-dist/tex/generic/babel/babel.sty
+Package: babel 2017/05/19 3.10 The Babel package
+
+(/TexLive/texmf-dist/tex/generic/babel-spanish/spanish.ldf
+Language: spanish.ldf 2016/03/03 v5.0p Spanish support from the babel system
+
+(/TexLive/texmf-dist/tex/generic/babel/babel.def
+File: babel.def 2017/05/19 3.10 Babel common definitions
+\babel@savecnt=\count87
+\U@D=\dimen103
+)
+\es@quottoks=\toks14
+\es@quotdepth=\count88
+Package babel Info: Making " an active character on input line 561.
+Package babel Info: Making . an active character on input line 662.
+Package babel Info: Making < an active character on input line 707.
+Package babel Info: Making > an active character on input line 707.
+))
+(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.sty
+Package: biblatex 2016/12/05 v3.7 programmable bibliographies (PK/JW/AB)
+
+(/TexLive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
+Package: pdftexcmds 2017/03/19 v0.25 Utility functions of pdfTeX for LuaTeX (HO
+)
+
+(/TexLive/texmf-dist/tex/generic/oberdiek/infwarerr.sty
+Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO)
+)
+(/TexLive/texmf-dist/tex/generic/oberdiek/ifluatex.sty
+Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO)
+Package ifluatex Info: LuaTeX not detected.
+)
+(/TexLive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty
+Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
+)
+(/TexLive/texmf-dist/tex/generic/oberdiek/ifpdf.sty
+Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch
+)
+Package pdftexcmds Info: LuaTeX not detected.
+Package pdftexcmds Info: \pdf@primitive is available.
+Package pdftexcmds Info: \pdf@ifprimitive is available.
+Package pdftexcmds Info: \pdfdraftmode found.
+)
+(/TexLive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
+Package: etoolbox 2017/01/02 v2.4 e-TeX tools for LaTeX (JAW)
+\etb@tempcnta=\count89
+)
+(/TexLive/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
+\KV@toks@=\toks15
+)
+(/TexLive/texmf-dist/tex/latex/oberdiek/kvoptions.sty
+Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO)
+
+(/TexLive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty
+Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO)
+
+(/TexLive/texmf-dist/tex/generic/oberdiek/etexcmds.sty
+Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
+Package etexcmds Info: Could not find \expanded.
+(etexcmds) That can mean that you are not using pdfTeX 1.50 or
+(etexcmds) that some package has redefined \expanded.
+(etexcmds) In the latter case, load this package earlier.
+)))
+(/TexLive/texmf-dist/tex/latex/logreq/logreq.sty
+Package: logreq 2010/08/04 v1.0 xml request logger
+\lrq@indent=\count90
+
+(/TexLive/texmf-dist/tex/latex/logreq/logreq.def
+File: logreq.def 2010/08/04 v1.0 logreq spec v1.0
+))
+(/TexLive/texmf-dist/tex/latex/base/ifthen.sty
+Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)
+)
+(/TexLive/texmf-dist/tex/latex/url/url.sty
+\Urlmuskip=\muskip10
+Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
+)
+(/TexLive/texmf-dist/tex/generic/xstring/xstring.sty
+(/TexLive/texmf-dist/tex/generic/xstring/xstring.tex
+\@xs@message=\write3
+\integerpart=\count91
+\decimalpart=\count92
+)
+Package: xstring 2013/10/13 v1.7c String manipulations (C Tellechea)
+)
+\c@tabx@nest=\count93
+\c@listtotal=\count94
+\c@listcount=\count95
+\c@liststart=\count96
+\c@liststop=\count97
+\c@citecount=\count98
+\c@citetotal=\count99
+\c@multicitecount=\count100
+\c@multicitetotal=\count101
+\c@instcount=\count102
+\c@maxnames=\count103
+\c@minnames=\count104
+\c@maxitems=\count105
+\c@minitems=\count106
+\c@citecounter=\count107
+\c@savedcitecounter=\count108
+\c@uniquelist=\count109
+\c@uniquename=\count110
+\c@refsection=\count111
+\c@refsegment=\count112
+\c@maxextratitle=\count113
+\c@maxextratitleyear=\count114
+\c@maxextrayear=\count115
+\c@maxextraalpha=\count116
+\c@abbrvpenalty=\count117
+\c@highnamepenalty=\count118
+\c@lownamepenalty=\count119
+\c@maxparens=\count120
+\c@parenlevel=\count121
+\blx@tempcnta=\count122
+\blx@tempcntb=\count123
+\blx@tempcntc=\count124
+\blx@maxsection=\count125
+\blx@maxsegment@0=\count126
+\blx@notetype=\count127
+\blx@parenlevel@text=\count128
+\blx@parenlevel@foot=\count129
+\blx@sectionciteorder@0=\count130
+\labelnumberwidth=\skip43
+\labelalphawidth=\skip44
+\biblabelsep=\skip45
+\bibitemsep=\skip46
+\bibnamesep=\skip47
+\bibinitsep=\skip48
+\bibparsep=\skip49
+\bibhang=\skip50
+\blx@bcfin=\read1
+\blx@bcfout=\write4
+\c@mincomprange=\count131
+\c@maxcomprange=\count132
+\c@mincompwidth=\count133
+Package biblatex Info: Trying to load biblatex default data model...
+Package biblatex Info: ... file 'blx-dm.def' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/blx-dm.def)
+Package biblatex Info: Trying to load biblatex style data model...
+Package biblatex Info: ... file 'ieee.dbx' not found.
+Package biblatex Info: Trying to load biblatex custom data model...
+Package biblatex Info: ... file 'biblatex-dm.cfg' not found.
+\c@afterword=\count134
+\c@savedafterword=\count135
+\c@annotator=\count136
+\c@savedannotator=\count137
+\c@author=\count138
+\c@savedauthor=\count139
+\c@bookauthor=\count140
+\c@savedbookauthor=\count141
+\c@commentator=\count142
+\c@savedcommentator=\count143
+\c@editor=\count144
+\c@savededitor=\count145
+\c@editora=\count146
+\c@savededitora=\count147
+\c@editorb=\count148
+\c@savededitorb=\count149
+\c@editorc=\count150
+\c@savededitorc=\count151
+\c@foreword=\count152
+\c@savedforeword=\count153
+\c@holder=\count154
+\c@savedholder=\count155
+\c@introduction=\count156
+\c@savedintroduction=\count157
+\c@namea=\count158
+\c@savednamea=\count159
+\c@nameb=\count160
+\c@savednameb=\count161
+\c@namec=\count162
+\c@savednamec=\count163
+\c@translator=\count164
+\c@savedtranslator=\count165
+\c@shortauthor=\count166
+\c@savedshortauthor=\count167
+\c@shorteditor=\count168
+\c@savedshorteditor=\count169
+\c@labelname=\count170
+\c@savedlabelname=\count171
+\c@institution=\count172
+\c@savedinstitution=\count173
+\c@lista=\count174
+\c@savedlista=\count175
+\c@listb=\count176
+\c@savedlistb=\count177
+\c@listc=\count178
+\c@savedlistc=\count179
+\c@listd=\count180
+\c@savedlistd=\count181
+\c@liste=\count182
+\c@savedliste=\count183
+\c@listf=\count184
+\c@savedlistf=\count185
+\c@location=\count186
+\c@savedlocation=\count187
+\c@organization=\count188
+\c@savedorganization=\count189
+\c@origlocation=\count190
+\c@savedoriglocation=\count191
+\c@origpublisher=\count192
+\c@savedorigpublisher=\count193
+\c@publisher=\count194
+\c@savedpublisher=\count195
+\c@language=\count196
+\c@savedlanguage=\count197
+\c@pageref=\count198
+\c@savedpageref=\count199
+\shorthandwidth=\skip51
+\shortjournalwidth=\skip52
+\shortserieswidth=\skip53
+\shorttitlewidth=\skip54
+\shortauthorwidth=\skip55
+\shorteditorwidth=\skip56
+Package biblatex Info: Trying to load compatibility code...
+Package biblatex Info: ... file 'blx-compat.def' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/blx-compat.def
+File: blx-compat.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB)
+)
+Package biblatex Info: Trying to load generic definitions...
+Package biblatex Info: ... file 'biblatex.def' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.def
+File: biblatex.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB)
+\c@textcitecount=\count266
+\c@textcitetotal=\count267
+\c@textcitemaxnames=\count268
+\c@biburlnumpenalty=\count269
+\c@biburlucpenalty=\count270
+\c@biburllcpenalty=\count271
+\c@smartand=\count272
+)
+Package biblatex Info: Trying to load bibliography style 'ieee'...
+Package biblatex Info: ... file 'ieee.bbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.bbx
+File: ieee.bbx 2017/03/27 v1.2d biblatex bibliography style
+Package biblatex Info: Trying to load bibliography style 'numeric-comp'...
+Package biblatex Info: ... file 'numeric-comp.bbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric-comp.bbx
+File: numeric-comp.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
+Package biblatex Info: Trying to load bibliography style 'numeric'...
+Package biblatex Info: ... file 'numeric.bbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx
+File: numeric.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
+Package biblatex Info: Trying to load bibliography style 'standard'...
+Package biblatex Info: ... file 'standard.bbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/bbx/standard.bbx
+File: standard.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
+\c@bbx:relatedcount=\count273
+\c@bbx:relatedtotal=\count274
+))))
+Package biblatex Info: Trying to load citation style 'ieee'...
+Package biblatex Info: ... file 'ieee.cbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.cbx
+File: ieee.cbx 2017/03/27 v1.2d biblatex citation style
+Package biblatex Info: Trying to load citation style 'numeric-comp'...
+Package biblatex Info: ... file 'numeric-comp.cbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/cbx/numeric-comp.cbx
+File: numeric-comp.cbx 2016/12/05 v3.7 biblatex citation style (PK/JW/AB)
+\c@cbx@tempcnta=\count275
+\c@cbx@tempcntb=\count276
+Package biblatex Info: Redefining '\cite'.
+Package biblatex Info: Redefining '\parencite'.
+Package biblatex Info: Redefining '\footcite'.
+Package biblatex Info: Redefining '\footcitetext'.
+Package biblatex Info: Redefining '\smartcite'.
+Package biblatex Info: Redefining '\supercite'.
+Package biblatex Info: Redefining '\textcite'.
+Package biblatex Info: Redefining '\textcites'.
+Package biblatex Info: Redefining '\cites'.
+Package biblatex Info: Redefining '\parencites'.
+Package biblatex Info: Redefining '\smartcites'.
+)
+Package biblatex Info: Redefining '\cite'.
+Package biblatex Info: Redefining '\cites'.
+)
+Package biblatex Info: Trying to load configuration file...
+Package biblatex Info: ... file 'biblatex.cfg' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.cfg
+File: biblatex.cfg
+))
+Package biblatex Info: Trying to load language 'spanish'...
+Package biblatex Info: ... file 'spanish.lbx' found.
+
+(/TexLive/texmf-dist/tex/latex/biblatex/lbx/spanish.lbx
+File: spanish.lbx 2016/12/05 v3.7 biblatex localization (PK/JW/AB)
+)
+
+Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing.
+(biblatex) Loading 'csquotes' recommended.
+
+\@quotelevel=\count277
+\@quotereset=\count278
+(./parent.aux)
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6.
+LaTeX Font Info: ... okay on input line 6.
+LaTeX Info: Redefining \sptext on input line 6.
+LaTeX Info: Redefining \. on input line 6.
+LaTeX Info: Redefining \% on input line 6.
+Package biblatex Info: No input encoding detected.
+(biblatex) Assuming 'ascii'.
+Package biblatex Info: Automatic encoding selection.
+(biblatex) Assuming data encoding 'ascii'.
+\openout4 = `parent.bcf'.
+
+Package biblatex Info: Trying to load bibliographic data...
+Package biblatex Info: ... file 'parent.bbl' not found.
+
+No file parent.bbl.
+Package biblatex Info: Reference section=0 on input line 6.
+Package biblatex Info: Reference segment=0 on input line 6.
+(./parent.aux)
+
+LaTeX Warning: There were undefined references.
+
+Package biblatex Warning: Please (re)run Biber on the file:
+(biblatex) parent
+(biblatex) and rerun LaTeX afterwards.
+
+Package logreq Info: Writing requests to 'parent.run.xml'.
+\openout1 = `parent.run.xml'.
+
+)
+Here is how much of TeX's memory you used:
+7717 strings out of 492995
+133301 string characters out of 6138727
+557258 words of memory out of 5000000
+11248 multiletter control sequences out of 15000+600000
+3640 words of font info for 14 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+35i,1n,30p,856b,700s stack positions out of 5000i,500n,10000p,200000b,80000s
+
+No pages of output.
+PDF statistics:
+0 PDF objects out of 1000 (max. 8388607)
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing. Loading 'csquotes' recommended.",
+ hint: None,
+ line: None,
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "LaTeX Warning: There were undefined references.",
+ hint: None,
+ line: None,
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Warning,
+ message: "Package biblatex Warning: Please (re)run Biber on the file: parent and rerun LaTeX afterwards.",
+ hint: None,
+ line: None,
+ },
+ ],
+ }
+ "#]],
+ )
+}
+
+#[test]
+fn test_006() {
+ check(
+ r#"This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:33
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**./parent.tex
+(./parent.tex
+LaTeX2e <2017-04-15>
+Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
+(/TexLive/texmf-dist/tex/latex/base/article.cls
+Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
+(/TexLive/texmf-dist/tex/latex/base/size10.clo
+File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
+)
+\c@part=\count79
+\c@section=\count80
+\c@subsection=\count81
+\c@subsubsection=\count82
+\c@paragraph=\count83
+\c@subparagraph=\count84
+\c@figure=\count85
+\c@table=\count86
+\abovecaptionskip=\skip41
+\belowcaptionskip=\skip42
+\bibindent=\dimen102
+) (./parent.aux
+(./child.tex.aux))
+\openout1 = `parent.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+\openout2 = `child.aux'.
+
+(./child.tex)
+! Undefined control sequence.
+l.7 \foo
+
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+
+! Missing $ inserted.
+<inserted text>
+ $
+l.8 \bar
+
+I've inserted a begin-math/end-math symbol since I think
+you left one out. Proceed, with fingers crossed.
+
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <7> on input line 8.
+LaTeX Font Info: External font `cmex10' loaded for size
+(Font) <5> on input line 8.
+! Undefined control sequence.
+l.9 \baz
+
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+
+! Missing { inserted.
+<to be read again>
+ \par
+l.10
+
+A left brace was mandatory here, so I've put one in.
+You might want to delete and/or insert some corrections
+so that I will find a matching right brace soon.
+(If you're confused by all this, try typing `I}' now.)
+
+! Missing $ inserted.
+<inserted text>
+ $
+l.10
+
+I've inserted a begin-math/end-math symbol since I think
+you left one out. Proceed, with fingers crossed.
+
+! Missing } inserted.
+<inserted text>
+ }
+l.10
+
+I've inserted something that you may have forgotten.
+(See the <inserted text> above.)
+With luck, this will get me unwedged. But if you
+really didn't forget anything, try typing `2' now; then
+my insertion and my current dilemma will both disappear.
+
+[1
+
+{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux
+(./child.aux)) )
+Here is how much of TeX's memory you used:
+212 strings out of 492995
+2238 string characters out of 6138727
+54074 words of memory out of 5000000
+3843 multiletter control sequences out of 15000+600000
+3640 words of font info for 14 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+23i,4n,17p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s
+</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb
+>
+Output written on parent.pdf (1 page, 8329 bytes).
+PDF statistics:
+12 PDF objects out of 1000 (max. 8388607)
+7 compressed objects within 1 object stream
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Undefined control sequence.",
+ hint: Some(
+ "\\foo",
+ ),
+ line: Some(
+ 6,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Missing $ inserted.",
+ hint: Some(
+ "\\bar",
+ ),
+ line: Some(
+ 7,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Undefined control sequence.",
+ hint: Some(
+ "\\baz",
+ ),
+ line: Some(
+ 8,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Missing { inserted.",
+ hint: None,
+ line: Some(
+ 9,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Missing $ inserted.",
+ hint: None,
+ line: Some(
+ 9,
+ ),
+ },
+ BuildError {
+ relative_path: "./parent.tex",
+ level: Error,
+ message: "Missing } inserted.",
+ hint: None,
+ line: Some(
+ 9,
+ ),
+ },
+ ],
+ }
+ "#]],
+ );
+}
+
+#[test]
+fn test_007() {
+ check(
+ r#"This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/W32TeX) (preloaded format=pdflatex 2021.6.19) 5 NOV 2021 19:10
+entering extended mode
+restricted \write18 enabled.
+%&-line parsing enabled.
+**/some/folder/a.tex
+(/some/folder/a.tex
+LaTeX2e <2021-06-01> patch level 1
+L3 programming layer <2021-06-18>
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrartcl.cls
+Document Class: scrartcl 2021/03/17 v3.33 KOMA-Script document class (article)
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrkbase.sty
+Package: scrkbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-dependent b
+asics and keyval usage)
+
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrbase.sty
+Package: scrbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-independent
+basics and keyval usage)
+
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile.sty
+Package: scrlfile 2021/03/17 v3.33 KOMA-Script package (file load hooks)
+
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
+Package: scrlfile-hook 2021/03/17 v3.33 KOMA-Script package (using LaTeX hooks)
+
+
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlogo.sty
+Package: scrlogo 2021/03/17 v3.33 KOMA-Script package (logo)
+)))
+(/texlive/2021/texmf-dist/tex/latex/graphics/keyval.sty
+Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
+\KV@toks@=\toks16
+)
+Applying: [2021/05/01] Usage of raw option list on input line 252.
+Already applied: [0000/00/00] compatibility for LaTeX before 2021/05/01 on inpu
+t line 337.
+))
+==> First Aid for scrkbase.sty no longer applied!
+(/texlive/2021/texmf-dist/tex/latex/koma-script/tocbasic.sty
+Package: tocbasic 2021/03/17 v3.33 KOMA-Script package (handling toc-files)
+\scr@dte@tocline@numberwidth=\skip47
+\scr@dte@tocline@numbox=\box50
+)
+Package tocbasic Info: babel extension for `toc' omitted
+(tocbasic) because of missing \bbl@set@language on input line 135.
+Class scrartcl Info: File `scrsize11pt.clo' used instead of
+(scrartcl) file `scrsize11.clo' to setup font sizes on input line 223
+9.
+
+(/texlive/2021/texmf-dist/tex/latex/koma-script/scrsize11pt.clo
+File: scrsize11pt.clo 2021/03/17 v3.33 KOMA-Script font size class option (11pt
+)
+)
+(/texlive/2021/texmf-dist/tex/latex/koma-script/typearea.sty
+Package: typearea 2021/03/17 v3.33 KOMA-Script package (type area)
+\ta@bcor=\skip48
+\ta@div=\count182
+\ta@hblk=\skip49
+\ta@vblk=\skip50
+\ta@temp=\skip51
+\footheight=\skip52
+Package typearea Info: These are the values describing the layout:
+(typearea) DIV = 10
+(typearea) BCOR = 0.0pt
+(typearea) \paperwidth = 597.50793pt
+(typearea) \textwidth = 418.25555pt
+(typearea) DIV departure = -6%
+(typearea) \evensidemargin = 17.3562pt
+(typearea) \oddsidemargin = 17.3562pt
+(typearea) \paperheight = 845.04694pt
+(typearea) \textheight = 595.80026pt
+(typearea) \topmargin = -25.16531pt
+(typearea) \headheight = 17.0pt
+(typearea) \headsep = 20.40001pt
+(typearea) \topskip = 11.0pt
+(typearea) \footskip = 47.6pt
+(typearea) \baselineskip = 13.6pt
+(typearea) on input line 1741.
+)
+\c@part=\count183
+\c@section=\count184
+\c@subsection=\count185
+\c@subsubsection=\count186
+\c@paragraph=\count187
+\c@subparagraph=\count188
+\scr@dte@section@maxnumwidth=\skip53
+Class scrartcl Info: using compatibility default `runin=bysign'
+(scrartcl) for `\section on input line 4846.
+Class scrartcl Info: using compatibility default `afterindent=bysign'
+(scrartcl) for `\section on input line 4846.
+\scr@dte@part@maxnumwidth=\skip54
+Class scrartcl Info: using compatibility default `afterindent=false'
+(scrartcl) for `\part on input line 4854.
+\scr@dte@subsection@maxnumwidth=\skip55
+Class scrartcl Info: using compatibility default `runin=bysign'
+(scrartcl) for `\subsection on input line 4864.
+Class scrartcl Info: using compatibility default `afterindent=bysign'
+(scrartcl) for `\subsection on input line 4864.
+\scr@dte@subsubsection@maxnumwidth=\skip56
+Class scrartcl Info: using compatibility default `runin=bysign'
+(scrartcl) for `\subsubsection on input line 4874.
+Class scrartcl Info: using compatibility default `afterindent=bysign'
+(scrartcl) for `\subsubsection on input line 4874.
+\scr@dte@paragraph@maxnumwidth=\skip57
+Class scrartcl Info: using compatibility default `runin=bysign'
+(scrartcl) for `\paragraph on input line 4885.
+Class scrartcl Info: using compatibility default `afterindent=bysign'
+(scrartcl) for `\paragraph on input line 4885.
+\scr@dte@subparagraph@maxnumwidth=\skip58
+Class scrartcl Info: using compatibility default `runin=bysign'
+(scrartcl) for `\subparagraph on input line 4895.
+Class scrartcl Info: using compatibility default `afterindent=bysign'
+(scrartcl) for `\subparagraph on input line 4895.
+\abovecaptionskip=\skip59
+\belowcaptionskip=\skip60
+\c@pti@nb@sid@b@x=\box51
+Package tocbasic Info: babel extension for `lof' omitted
+(tocbasic) because of missing \bbl@set@language on input line 6127.
+
+\scr@dte@figure@maxnumwidth=\skip61
+\c@figure=\count189
+Package tocbasic Info: babel extension for `lot' omitted
+(tocbasic) because of missing \bbl@set@language on input line 6139.
+
+\scr@dte@table@maxnumwidth=\skip62
+\c@table=\count190
+Class scrartcl Info: Redefining `\numberline' on input line 6303.
+\bibindent=\dimen138
+)
+(/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
+File: l3backend-pdftex.def 2021-05-07 L3 backend support: PDF output (pdfTeX)
+\l__color_backend_stack_int=\count191
+\l__pdf_internal_box=\box52
+) (./a.aux)
+\openout1 = `a.aux'.
+
+LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3.
+LaTeX Font Info: ... okay on input line 3.
+Package scrbase Info: activating english \contentsname on input line 3.
+Package scrbase Info: activating english \listfigurename on input line 3.
+Package scrbase Info: activating english \listtablename on input line 3.
+! Undefined control sequence.
+l.4 \lsdkfjlskdfj
+
+The control sequence at the end of the top line
+of your error message was never \def'ed. If you have
+misspelled it (e.g., `\hobx'), type `I' and the correct
+spelling (e.g., `I\hbox'). Otherwise just continue,
+and I'll forget about whatever was undefined.
+
+(./a.aux) )
+Here is how much of TeX's memory you used:
+3199 strings out of 478510
+74549 string characters out of 5853586
+510929 words of memory out of 5000000
+21227 multiletter control sequences out of 15000+600000
+403730 words of font info for 28 fonts, out of 8000000 for 9000
+1141 hyphenation exceptions out of 8191
+108i,1n,108p,10625b,270s stack positions out of 5000i,500n,10000p,200000b,80000s
+
+No pages of output.
+PDF statistics:
+0 PDF objects out of 1000 (max. 8388607)
+0 named destinations out of 1000 (max. 500000)
+1 words of extra memory for PDF output out of 10000 (max. 10000000)"#,
+ expect![[r#"
+ BuildLog {
+ errors: [
+ BuildError {
+ relative_path: "/some/folder/a.tex",
+ level: Error,
+ message: "Undefined control sequence.",
+ hint: Some(
+ "\\lsdkfjlskdfj",
+ ),
+ line: Some(
+ 3,
+ ),
+ },
+ ],
+ }
+ "#]],
+ );
+}
diff --git a/support/texlab/crates/parser/src/latex.rs b/support/texlab/crates/parser/src/latex.rs
index f96d41a722..d88eb39556 100644
--- a/support/texlab/crates/parser/src/latex.rs
+++ b/support/texlab/crates/parser/src/latex.rs
@@ -1201,19 +1201,4 @@ pub fn parse_latex(text: &str, config: &SyntaxConfig) -> GreenNode {
}
#[cfg(test)]
-mod tests {
- use syntax::latex;
-
- use crate::SyntaxConfig;
-
- use super::parse_latex;
-
- #[test]
- fn test_parse() {
- insta::glob!("test_data/latex/{,**/}*.txt", |path| {
- let text = std::fs::read_to_string(path).unwrap().replace("\r\n", "\n");
- let root = latex::SyntaxNode::new_root(parse_latex(&text, &SyntaxConfig::default()));
- insta::assert_debug_snapshot!(root);
- });
- }
-}
+mod tests;
diff --git a/support/texlab/crates/parser/src/latex/tests.rs b/support/texlab/crates/parser/src/latex/tests.rs
new file mode 100644
index 0000000000..a907efc6c3
--- /dev/null
+++ b/support/texlab/crates/parser/src/latex/tests.rs
@@ -0,0 +1,3523 @@
+use expect_test::{expect, Expect};
+
+use crate::{parse_latex, SyntaxConfig};
+
+fn check(input: &str, expect: Expect) {
+ let root = syntax::latex::SyntaxNode::new_root(parse_latex(input, &SyntaxConfig::default()));
+ expect.assert_debug_eq(&root);
+}
+
+#[test]
+fn test_block_comments() {
+ check(
+ r#"Foo
+\iffalse
+Test1
+\fi
+Bar
+\iffalse
+\fii
+\fi
+Baz"#,
+ expect![[r#"
+ ROOT@0..48
+ PREAMBLE@0..48
+ TEXT@0..4
+ WORD@0..3 "Foo"
+ LINE_BREAK@3..4 "\n"
+ BLOCK_COMMENT@4..22
+ COMMAND_NAME@4..12 "\\iffalse"
+ LINE_BREAK@12..13 "\n"
+ WORD@13..18 "Test1"
+ LINE_BREAK@18..19 "\n"
+ COMMAND_NAME@19..22 "\\fi"
+ LINE_BREAK@22..23 "\n"
+ TEXT@23..27
+ WORD@23..26 "Bar"
+ LINE_BREAK@26..27 "\n"
+ BLOCK_COMMENT@27..44
+ COMMAND_NAME@27..35 "\\iffalse"
+ LINE_BREAK@35..36 "\n"
+ COMMAND_NAME@36..40 "\\fii"
+ LINE_BREAK@40..41 "\n"
+ COMMAND_NAME@41..44 "\\fi"
+ LINE_BREAK@44..45 "\n"
+ TEXT@45..48
+ WORD@45..48 "Baz"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_caption_default() {
+ check(
+ r#"\caption[qux]{Foo \Bar Baz}"#,
+ expect![[r#"
+ ROOT@0..27
+ PREAMBLE@0..27
+ CAPTION@0..27
+ COMMAND_NAME@0..8 "\\caption"
+ BRACK_GROUP@8..13
+ L_BRACK@8..9 "["
+ TEXT@9..12
+ WORD@9..12 "qux"
+ R_BRACK@12..13 "]"
+ CURLY_GROUP@13..27
+ L_CURLY@13..14 "{"
+ TEXT@14..18
+ WORD@14..17 "Foo"
+ WHITESPACE@17..18 " "
+ GENERIC_COMMAND@18..23
+ COMMAND_NAME@18..22 "\\Bar"
+ WHITESPACE@22..23 " "
+ TEXT@23..26
+ WORD@23..26 "Baz"
+ R_CURLY@26..27 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_caption_default_error() {
+ check(
+ r#"\caption[qux]{Foo \Bar Baz"#,
+ expect![[r#"
+ ROOT@0..26
+ PREAMBLE@0..26
+ CAPTION@0..26
+ COMMAND_NAME@0..8 "\\caption"
+ BRACK_GROUP@8..13
+ L_BRACK@8..9 "["
+ TEXT@9..12
+ WORD@9..12 "qux"
+ R_BRACK@12..13 "]"
+ CURLY_GROUP@13..26
+ L_CURLY@13..14 "{"
+ TEXT@14..18
+ WORD@14..17 "Foo"
+ WHITESPACE@17..18 " "
+ GENERIC_COMMAND@18..23
+ COMMAND_NAME@18..22 "\\Bar"
+ WHITESPACE@22..23 " "
+ TEXT@23..26
+ WORD@23..26 "Baz"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_caption_figure() {
+ check(
+ r#"\begin{figure}\caption{Foo}\end{figure}"#,
+ expect![[r#"
+ ROOT@0..39
+ PREAMBLE@0..39
+ ENVIRONMENT@0..39
+ BEGIN@0..14
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..14
+ L_CURLY@6..7 "{"
+ KEY@7..13
+ WORD@7..13 "figure"
+ R_CURLY@13..14 "}"
+ CAPTION@14..27
+ COMMAND_NAME@14..22 "\\caption"
+ CURLY_GROUP@22..27
+ L_CURLY@22..23 "{"
+ TEXT@23..26
+ WORD@23..26 "Foo"
+ R_CURLY@26..27 "}"
+ END@27..39
+ COMMAND_NAME@27..31 "\\end"
+ CURLY_GROUP_WORD@31..39
+ L_CURLY@31..32 "{"
+ KEY@32..38
+ WORD@32..38 "figure"
+ R_CURLY@38..39 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_caption_minimal() {
+ check(
+ r#"\caption{Foo \Bar Baz}"#,
+ expect![[r#"
+ ROOT@0..22
+ PREAMBLE@0..22
+ CAPTION@0..22
+ COMMAND_NAME@0..8 "\\caption"
+ CURLY_GROUP@8..22
+ L_CURLY@8..9 "{"
+ TEXT@9..13
+ WORD@9..12 "Foo"
+ WHITESPACE@12..13 " "
+ GENERIC_COMMAND@13..18
+ COMMAND_NAME@13..17 "\\Bar"
+ WHITESPACE@17..18 " "
+ TEXT@18..21
+ WORD@18..21 "Baz"
+ R_CURLY@21..22 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_caption_minimal_error() {
+ check(
+ r#"\caption{Foo \Bar Baz"#,
+ expect![[r#"
+ ROOT@0..21
+ PREAMBLE@0..21
+ CAPTION@0..21
+ COMMAND_NAME@0..8 "\\caption"
+ CURLY_GROUP@8..21
+ L_CURLY@8..9 "{"
+ TEXT@9..13
+ WORD@9..12 "Foo"
+ WHITESPACE@12..13 " "
+ GENERIC_COMMAND@13..18
+ COMMAND_NAME@13..17 "\\Bar"
+ WHITESPACE@17..18 " "
+ TEXT@18..21
+ WORD@18..21 "Baz"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_empty() {
+ check(
+ r#"\cite{}"#,
+ expect![[r#"
+ ROOT@0..7
+ PREAMBLE@0..7
+ CITATION@0..7
+ COMMAND_NAME@0..5 "\\cite"
+ CURLY_GROUP_WORD_LIST@5..7
+ L_CURLY@5..6 "{"
+ R_CURLY@6..7 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_missing_brace() {
+ check(
+ r#"\cite{foo"#,
+ expect![[r#"
+ ROOT@0..9
+ PREAMBLE@0..9
+ CITATION@0..9
+ COMMAND_NAME@0..5 "\\cite"
+ CURLY_GROUP_WORD_LIST@5..9
+ L_CURLY@5..6 "{"
+ KEY@6..9
+ WORD@6..9 "foo"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_multiple_keys() {
+ check(
+ r#"\cite{foo, bar}"#,
+ expect![[r#"
+ ROOT@0..15
+ PREAMBLE@0..15
+ CITATION@0..15
+ COMMAND_NAME@0..5 "\\cite"
+ CURLY_GROUP_WORD_LIST@5..15
+ L_CURLY@5..6 "{"
+ KEY@6..9
+ WORD@6..9 "foo"
+ COMMA@9..10 ","
+ WHITESPACE@10..11 " "
+ KEY@11..14
+ WORD@11..14 "bar"
+ R_CURLY@14..15 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_prenote() {
+ check(
+ r#"\cite[foo]{bar}"#,
+ expect![[r#"
+ ROOT@0..15
+ PREAMBLE@0..15
+ CITATION@0..15
+ COMMAND_NAME@0..5 "\\cite"
+ BRACK_GROUP@5..10
+ L_BRACK@5..6 "["
+ TEXT@6..9
+ WORD@6..9 "foo"
+ R_BRACK@9..10 "]"
+ CURLY_GROUP_WORD_LIST@10..15
+ L_CURLY@10..11 "{"
+ KEY@11..14
+ WORD@11..14 "bar"
+ R_CURLY@14..15 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_prenote_postnote() {
+ check(
+ r#"\cite[foo][bar]{baz}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ CITATION@0..20
+ COMMAND_NAME@0..5 "\\cite"
+ BRACK_GROUP@5..10
+ L_BRACK@5..6 "["
+ TEXT@6..9
+ WORD@6..9 "foo"
+ R_BRACK@9..10 "]"
+ BRACK_GROUP@10..15
+ L_BRACK@10..11 "["
+ TEXT@11..14
+ WORD@11..14 "bar"
+ R_BRACK@14..15 "]"
+ CURLY_GROUP_WORD_LIST@15..20
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "baz"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_redundant_comma() {
+ check(
+ r#"\cite{,foo,}"#,
+ expect![[r#"
+ ROOT@0..12
+ PREAMBLE@0..12
+ CITATION@0..12
+ COMMAND_NAME@0..5 "\\cite"
+ CURLY_GROUP_WORD_LIST@5..12
+ L_CURLY@5..6 "{"
+ COMMA@6..7 ","
+ KEY@7..10
+ WORD@7..10 "foo"
+ COMMA@10..11 ","
+ R_CURLY@11..12 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_simple() {
+ check(
+ r#"\cite{foo}"#,
+ expect![[r#"
+ ROOT@0..10
+ PREAMBLE@0..10
+ CITATION@0..10
+ COMMAND_NAME@0..5 "\\cite"
+ CURLY_GROUP_WORD_LIST@5..10
+ L_CURLY@5..6 "{"
+ KEY@6..9
+ WORD@6..9 "foo"
+ R_CURLY@9..10 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_citation_star() {
+ check(
+ r#"\nocite{*}"#,
+ expect![[r#"
+ ROOT@0..10
+ PREAMBLE@0..10
+ CITATION@0..10
+ COMMAND_NAME@0..7 "\\nocite"
+ CURLY_GROUP_WORD_LIST@7..10
+ L_CURLY@7..8 "{"
+ KEY@8..9
+ WORD@8..9 "*"
+ R_CURLY@9..10 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_definition_simple() {
+ check(
+ r#"\definecolor{foo}{rgb}{255,168,0}"#,
+ expect![[r#"
+ ROOT@0..33
+ PREAMBLE@0..33
+ COLOR_DEFINITION@0..33
+ COMMAND_NAME@0..12 "\\definecolor"
+ CURLY_GROUP_WORD@12..17
+ L_CURLY@12..13 "{"
+ KEY@13..16
+ WORD@13..16 "foo"
+ R_CURLY@16..17 "}"
+ CURLY_GROUP_WORD@17..22
+ L_CURLY@17..18 "{"
+ KEY@18..21
+ WORD@18..21 "rgb"
+ R_CURLY@21..22 "}"
+ CURLY_GROUP@22..33
+ L_CURLY@22..23 "{"
+ TEXT@23..32
+ WORD@23..26 "255"
+ COMMA@26..27 ","
+ WORD@27..30 "168"
+ COMMA@30..31 ","
+ WORD@31..32 "0"
+ R_CURLY@32..33 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_reference_simple() {
+ check(
+ r#"\color{black}"#,
+ expect![[r#"
+ ROOT@0..13
+ PREAMBLE@0..13
+ COLOR_REFERENCE@0..13
+ COMMAND_NAME@0..6 "\\color"
+ CURLY_GROUP_WORD@6..13
+ L_CURLY@6..7 "{"
+ KEY@7..12
+ WORD@7..12 "black"
+ R_CURLY@12..13 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_set_definition_error1() {
+ check(
+ r#"\definecolorset[ty]{rgb,HTML}{foo}{bar}"#,
+ expect![[r#"
+ ROOT@0..39
+ PREAMBLE@0..39
+ COLOR_SET_DEFINITION@0..39
+ COMMAND_NAME@0..15 "\\definecolorset"
+ BRACK_GROUP_WORD@15..19
+ L_BRACK@15..16 "["
+ KEY@16..18
+ WORD@16..18 "ty"
+ R_BRACK@18..19 "]"
+ CURLY_GROUP_WORD_LIST@19..29
+ L_CURLY@19..20 "{"
+ KEY@20..23
+ WORD@20..23 "rgb"
+ COMMA@23..24 ","
+ KEY@24..28
+ WORD@24..28 "HTML"
+ R_CURLY@28..29 "}"
+ CURLY_GROUP_WORD@29..34
+ L_CURLY@29..30 "{"
+ KEY@30..33
+ WORD@30..33 "foo"
+ R_CURLY@33..34 "}"
+ CURLY_GROUP_WORD@34..39
+ L_CURLY@34..35 "{"
+ KEY@35..38
+ WORD@35..38 "bar"
+ R_CURLY@38..39 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_set_definition_error2() {
+ check(
+ r#"\definecolorset{rgb,HTML}{foo}"#,
+ expect![[r#"
+ ROOT@0..30
+ PREAMBLE@0..30
+ COLOR_SET_DEFINITION@0..30
+ COMMAND_NAME@0..15 "\\definecolorset"
+ CURLY_GROUP_WORD_LIST@15..25
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "rgb"
+ COMMA@19..20 ","
+ KEY@20..24
+ WORD@20..24 "HTML"
+ R_CURLY@24..25 "}"
+ CURLY_GROUP_WORD@25..30
+ L_CURLY@25..26 "{"
+ KEY@26..29
+ WORD@26..29 "foo"
+ R_CURLY@29..30 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_set_definition_error3() {
+ check(
+ r#"\definecolorset{rgb,HTML}"#,
+ expect![[r#"
+ ROOT@0..25
+ PREAMBLE@0..25
+ COLOR_SET_DEFINITION@0..25
+ COMMAND_NAME@0..15 "\\definecolorset"
+ CURLY_GROUP_WORD_LIST@15..25
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "rgb"
+ COMMA@19..20 ","
+ KEY@20..24
+ WORD@20..24 "HTML"
+ R_CURLY@24..25 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_set_definition_error4() {
+ check(
+ r#"\definecolorset"#,
+ expect![[r#"
+ ROOT@0..15
+ PREAMBLE@0..15
+ COLOR_SET_DEFINITION@0..15
+ COMMAND_NAME@0..15 "\\definecolorset"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_color_set_definition_simple() {
+ check(
+ r#"\definecolorset[ty]{rgb,HTML}{foo}{bar}{baz}"#,
+ expect![[r#"
+ ROOT@0..44
+ PREAMBLE@0..44
+ COLOR_SET_DEFINITION@0..44
+ COMMAND_NAME@0..15 "\\definecolorset"
+ BRACK_GROUP_WORD@15..19
+ L_BRACK@15..16 "["
+ KEY@16..18
+ WORD@16..18 "ty"
+ R_BRACK@18..19 "]"
+ CURLY_GROUP_WORD_LIST@19..29
+ L_CURLY@19..20 "{"
+ KEY@20..23
+ WORD@20..23 "rgb"
+ COMMA@23..24 ","
+ KEY@24..28
+ WORD@24..28 "HTML"
+ R_CURLY@28..29 "}"
+ CURLY_GROUP_WORD@29..34
+ L_CURLY@29..30 "{"
+ KEY@30..33
+ WORD@30..33 "foo"
+ R_CURLY@33..34 "}"
+ CURLY_GROUP_WORD@34..39
+ L_CURLY@34..35 "{"
+ KEY@35..38
+ WORD@35..38 "bar"
+ R_CURLY@38..39 "}"
+ CURLY_GROUP_WORD@39..44
+ L_CURLY@39..40 "{"
+ KEY@40..43
+ WORD@40..43 "baz"
+ R_CURLY@43..44 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_command_definition_no_argc() {
+ check(
+ r#"\newcommand{\foo}{foo}"#,
+ expect![[r#"
+ ROOT@0..22
+ PREAMBLE@0..22
+ COMMAND_DEFINITION@0..22
+ COMMAND_NAME@0..11 "\\newcommand"
+ CURLY_GROUP_COMMAND@11..17
+ L_CURLY@11..12 "{"
+ COMMAND_NAME@12..16 "\\foo"
+ R_CURLY@16..17 "}"
+ CURLY_GROUP@17..22
+ L_CURLY@17..18 "{"
+ TEXT@18..21
+ WORD@18..21 "foo"
+ R_CURLY@21..22 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_command_definition_no_impl() {
+ check(
+ r#"\newcommand{\foo}"#,
+ expect![[r#"
+ ROOT@0..17
+ PREAMBLE@0..17
+ COMMAND_DEFINITION@0..17
+ COMMAND_NAME@0..11 "\\newcommand"
+ CURLY_GROUP_COMMAND@11..17
+ L_CURLY@11..12 "{"
+ COMMAND_NAME@12..16 "\\foo"
+ R_CURLY@16..17 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_command_definition_no_impl_error() {
+ check(
+ r#"\newcommand{\foo"#,
+ expect![[r#"
+ ROOT@0..16
+ PREAMBLE@0..16
+ COMMAND_DEFINITION@0..16
+ COMMAND_NAME@0..11 "\\newcommand"
+ CURLY_GROUP_COMMAND@11..16
+ L_CURLY@11..12 "{"
+ COMMAND_NAME@12..16 "\\foo"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_command_definition_optional() {
+ check(
+ r#"\newcommand{\foo}[1][def]{#1}"#,
+ expect![[r##"
+ ROOT@0..29
+ PREAMBLE@0..29
+ COMMAND_DEFINITION@0..29
+ COMMAND_NAME@0..11 "\\newcommand"
+ CURLY_GROUP_COMMAND@11..17
+ L_CURLY@11..12 "{"
+ COMMAND_NAME@12..16 "\\foo"
+ R_CURLY@16..17 "}"
+ BRACK_GROUP_WORD@17..20
+ L_BRACK@17..18 "["
+ KEY@18..19
+ WORD@18..19 "1"
+ R_BRACK@19..20 "]"
+ BRACK_GROUP@20..25
+ L_BRACK@20..21 "["
+ TEXT@21..24
+ WORD@21..24 "def"
+ R_BRACK@24..25 "]"
+ CURLY_GROUP@25..29
+ L_CURLY@25..26 "{"
+ TEXT@26..28
+ WORD@26..28 "#1"
+ R_CURLY@28..29 "}"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_command_definition_simple() {
+ check(
+ r#"\newcommand[1]{\id}{#1}"#,
+ expect![[r##"
+ ROOT@0..23
+ PREAMBLE@0..23
+ COMMAND_DEFINITION@0..19
+ COMMAND_NAME@0..11 "\\newcommand"
+ BRACK_GROUP_WORD@11..14
+ L_BRACK@11..12 "["
+ KEY@12..13
+ WORD@12..13 "1"
+ R_BRACK@13..14 "]"
+ CURLY_GROUP@14..19
+ L_CURLY@14..15 "{"
+ GENERIC_COMMAND@15..18
+ COMMAND_NAME@15..18 "\\id"
+ R_CURLY@18..19 "}"
+ CURLY_GROUP@19..23
+ L_CURLY@19..20 "{"
+ TEXT@20..22
+ WORD@20..22 "#1"
+ R_CURLY@22..23 "}"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_command_definition_with_begin() {
+ check(
+ r#"\newcommand{\CVSubHeadingListStart}{\begin{itemize}[leftmargin=0.5cm, label={}]}"#,
+ expect![[r#"
+ ROOT@0..80
+ PREAMBLE@0..80
+ COMMAND_DEFINITION@0..80
+ COMMAND_NAME@0..11 "\\newcommand"
+ CURLY_GROUP_COMMAND@11..35
+ L_CURLY@11..12 "{"
+ COMMAND_NAME@12..34 "\\CVSubHeadingListStart"
+ R_CURLY@34..35 "}"
+ CURLY_GROUP@35..80
+ L_CURLY@35..36 "{"
+ BEGIN@36..79
+ COMMAND_NAME@36..42 "\\begin"
+ CURLY_GROUP_WORD@42..51
+ L_CURLY@42..43 "{"
+ KEY@43..50
+ WORD@43..50 "itemize"
+ R_CURLY@50..51 "}"
+ BRACK_GROUP@51..79
+ L_BRACK@51..52 "["
+ TEXT@52..62
+ WORD@52..62 "leftmargin"
+ EQUALITY_SIGN@62..63 "="
+ TEXT@63..75
+ WORD@63..68 "0.5cm"
+ COMMA@68..69 ","
+ WHITESPACE@69..70 " "
+ WORD@70..75 "label"
+ EQUALITY_SIGN@75..76 "="
+ CURLY_GROUP@76..78
+ L_CURLY@76..77 "{"
+ R_CURLY@77..78 "}"
+ R_BRACK@78..79 "]"
+ R_CURLY@79..80 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_math_operator_no_impl() {
+ check(
+ r#"\DeclareMathOperator{\foo}"#,
+ expect![[r#"
+ ROOT@0..26
+ PREAMBLE@0..26
+ MATH_OPERATOR@0..26
+ COMMAND_NAME@0..20 "\\DeclareMathOperator"
+ CURLY_GROUP_COMMAND@20..26
+ L_CURLY@20..21 "{"
+ COMMAND_NAME@21..25 "\\foo"
+ R_CURLY@25..26 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_math_operator_simple() {
+ check(
+ r#"\DeclareMathOperator{\foo}{foo}"#,
+ expect![[r#"
+ ROOT@0..31
+ PREAMBLE@0..31
+ MATH_OPERATOR@0..31
+ COMMAND_NAME@0..20 "\\DeclareMathOperator"
+ CURLY_GROUP_COMMAND@20..26
+ L_CURLY@20..21 "{"
+ COMMAND_NAME@21..25 "\\foo"
+ R_CURLY@25..26 "}"
+ CURLY_GROUP@26..31
+ L_CURLY@26..27 "{"
+ TEXT@27..30
+ WORD@27..30 "foo"
+ R_CURLY@30..31 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_asymptote() {
+ check(
+ r#"\begin{asy}
+ printf("Hello World\n");
+\end{asy}"#,
+ expect![[r#"
+ ROOT@0..50
+ PREAMBLE@0..50
+ ENVIRONMENT@0..50
+ BEGIN@0..16
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..16
+ L_CURLY@6..7 "{"
+ KEY@7..10
+ WORD@7..10 "asy"
+ R_CURLY@10..11 "}"
+ LINE_BREAK@11..12 "\n"
+ WHITESPACE@12..16 " "
+ TEXT@16..22
+ WORD@16..22 "printf"
+ MIXED_GROUP@22..39
+ L_PAREN@22..23 "("
+ TEXT@23..35
+ WORD@23..29 "\"Hello"
+ WHITESPACE@29..30 " "
+ WORD@30..35 "World"
+ GENERIC_COMMAND@35..37
+ COMMAND_NAME@35..37 "\\n"
+ TEXT@37..38
+ WORD@37..38 "\""
+ R_PAREN@38..39 ")"
+ TEXT@39..41
+ WORD@39..40 ";"
+ LINE_BREAK@40..41 "\n"
+ END@41..50
+ COMMAND_NAME@41..45 "\\end"
+ CURLY_GROUP_WORD@45..50
+ L_CURLY@45..46 "{"
+ KEY@46..49
+ WORD@46..49 "asy"
+ R_CURLY@49..50 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_definition() {
+ check(
+ r#"\newenvironment{bar}[1]{\begin{foo}}{\end{foo}}"#,
+ expect![[r#"
+ ROOT@0..47
+ PREAMBLE@0..47
+ ENVIRONMENT_DEFINITION@0..47
+ COMMAND_NAME@0..15 "\\newenvironment"
+ CURLY_GROUP_WORD@15..20
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "bar"
+ R_CURLY@19..20 "}"
+ BRACK_GROUP_WORD@20..23
+ L_BRACK@20..21 "["
+ KEY@21..22
+ WORD@21..22 "1"
+ R_BRACK@22..23 "]"
+ CURLY_GROUP@23..36
+ L_CURLY@23..24 "{"
+ GENERIC_COMMAND@24..35
+ COMMAND_NAME@24..30 "\\begin"
+ CURLY_GROUP@30..35
+ L_CURLY@30..31 "{"
+ TEXT@31..34
+ WORD@31..34 "foo"
+ R_CURLY@34..35 "}"
+ R_CURLY@35..36 "}"
+ CURLY_GROUP@36..47
+ L_CURLY@36..37 "{"
+ GENERIC_COMMAND@37..46
+ COMMAND_NAME@37..41 "\\end"
+ CURLY_GROUP@41..46
+ L_CURLY@41..42 "{"
+ TEXT@42..45
+ WORD@42..45 "foo"
+ R_CURLY@45..46 "}"
+ R_CURLY@46..47 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_definition_optional_arg() {
+ check(
+ r#"\newenvironment{foo}[1][default]{begin}{end}"#,
+ expect![[r#"
+ ROOT@0..44
+ PREAMBLE@0..44
+ ENVIRONMENT_DEFINITION@0..44
+ COMMAND_NAME@0..15 "\\newenvironment"
+ CURLY_GROUP_WORD@15..20
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "foo"
+ R_CURLY@19..20 "}"
+ BRACK_GROUP_WORD@20..23
+ L_BRACK@20..21 "["
+ KEY@21..22
+ WORD@21..22 "1"
+ R_BRACK@22..23 "]"
+ BRACK_GROUP@23..32
+ L_BRACK@23..24 "["
+ TEXT@24..31
+ WORD@24..31 "default"
+ R_BRACK@31..32 "]"
+ CURLY_GROUP@32..39
+ L_CURLY@32..33 "{"
+ TEXT@33..38
+ WORD@33..38 "begin"
+ R_CURLY@38..39 "}"
+ CURLY_GROUP@39..44
+ L_CURLY@39..40 "{"
+ TEXT@40..43
+ WORD@40..43 "end"
+ R_CURLY@43..44 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_nested() {
+ check(
+ r#"\begin{foo} \begin{qux} \end{baz} \end{bar}"#,
+ expect![[r#"
+ ROOT@0..43
+ PREAMBLE@0..43
+ ENVIRONMENT@0..43
+ BEGIN@0..12
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..12
+ L_CURLY@6..7 "{"
+ KEY@7..10
+ WORD@7..10 "foo"
+ R_CURLY@10..11 "}"
+ WHITESPACE@11..12 " "
+ ENVIRONMENT@12..34
+ BEGIN@12..24
+ COMMAND_NAME@12..18 "\\begin"
+ CURLY_GROUP_WORD@18..24
+ L_CURLY@18..19 "{"
+ KEY@19..22
+ WORD@19..22 "qux"
+ R_CURLY@22..23 "}"
+ WHITESPACE@23..24 " "
+ END@24..34
+ COMMAND_NAME@24..28 "\\end"
+ CURLY_GROUP_WORD@28..34
+ L_CURLY@28..29 "{"
+ KEY@29..32
+ WORD@29..32 "baz"
+ R_CURLY@32..33 "}"
+ WHITESPACE@33..34 " "
+ END@34..43
+ COMMAND_NAME@34..38 "\\end"
+ CURLY_GROUP_WORD@38..43
+ L_CURLY@38..39 "{"
+ KEY@39..42
+ WORD@39..42 "bar"
+ R_CURLY@42..43 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_nested_missing_braces() {
+ check(
+ r#"\begin{foo \begin{qux Hello World \end{baz} \end{bar"#,
+ expect![[r#"
+ ROOT@0..52
+ PREAMBLE@0..52
+ ENVIRONMENT@0..52
+ BEGIN@0..11
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..11
+ L_CURLY@6..7 "{"
+ KEY@7..11
+ WORD@7..10 "foo"
+ WHITESPACE@10..11 " "
+ ENVIRONMENT@11..44
+ BEGIN@11..34
+ COMMAND_NAME@11..17 "\\begin"
+ CURLY_GROUP_WORD@17..34
+ L_CURLY@17..18 "{"
+ KEY@18..34
+ WORD@18..21 "qux"
+ WHITESPACE@21..22 " "
+ WORD@22..27 "Hello"
+ WHITESPACE@27..28 " "
+ WORD@28..33 "World"
+ WHITESPACE@33..34 " "
+ END@34..44
+ COMMAND_NAME@34..38 "\\end"
+ CURLY_GROUP_WORD@38..44
+ L_CURLY@38..39 "{"
+ KEY@39..42
+ WORD@39..42 "baz"
+ R_CURLY@42..43 "}"
+ WHITESPACE@43..44 " "
+ END@44..52
+ COMMAND_NAME@44..48 "\\end"
+ CURLY_GROUP_WORD@48..52
+ L_CURLY@48..49 "{"
+ KEY@49..52
+ WORD@49..52 "bar"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_environment_simple() {
+ check(
+ r#"\begin{foo} Hello World \end{bar}"#,
+ expect![[r#"
+ ROOT@0..33
+ PREAMBLE@0..33
+ ENVIRONMENT@0..33
+ BEGIN@0..12
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..12
+ L_CURLY@6..7 "{"
+ KEY@7..10
+ WORD@7..10 "foo"
+ R_CURLY@10..11 "}"
+ WHITESPACE@11..12 " "
+ TEXT@12..24
+ WORD@12..17 "Hello"
+ WHITESPACE@17..18 " "
+ WORD@18..23 "World"
+ WHITESPACE@23..24 " "
+ END@24..33
+ COMMAND_NAME@24..28 "\\end"
+ CURLY_GROUP_WORD@28..33
+ L_CURLY@28..29 "{"
+ KEY@29..32
+ WORD@29..32 "bar"
+ R_CURLY@32..33 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_equation() {
+ check(
+ r#"\[ foo bar \]"#,
+ expect![[r#"
+ ROOT@0..13
+ PREAMBLE@0..13
+ EQUATION@0..13
+ COMMAND_NAME@0..2 "\\["
+ WHITESPACE@2..3 " "
+ TEXT@3..11
+ WORD@3..6 "foo"
+ WHITESPACE@6..7 " "
+ WORD@7..10 "bar"
+ WHITESPACE@10..11 " "
+ COMMAND_NAME@11..13 "\\]"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_equation_missing_begin() {
+ check(
+ r#"\begin{a} foo bar \] \end{b}"#,
+ expect![[r#"
+ ROOT@0..28
+ PREAMBLE@0..28
+ ENVIRONMENT@0..28
+ BEGIN@0..10
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..10
+ L_CURLY@6..7 "{"
+ KEY@7..8
+ WORD@7..8 "a"
+ R_CURLY@8..9 "}"
+ WHITESPACE@9..10 " "
+ TEXT@10..18
+ WORD@10..13 "foo"
+ WHITESPACE@13..14 " "
+ WORD@14..17 "bar"
+ WHITESPACE@17..18 " "
+ GENERIC_COMMAND@18..21
+ COMMAND_NAME@18..20 "\\]"
+ WHITESPACE@20..21 " "
+ END@21..28
+ COMMAND_NAME@21..25 "\\end"
+ CURLY_GROUP_WORD@25..28
+ L_CURLY@25..26 "{"
+ KEY@26..27
+ WORD@26..27 "b"
+ R_CURLY@27..28 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_generic_command_args() {
+ check(
+ r#"\foo{bar}[qux]"#,
+ expect![[r#"
+ ROOT@0..14
+ PREAMBLE@0..14
+ GENERIC_COMMAND@0..14
+ COMMAND_NAME@0..4 "\\foo"
+ CURLY_GROUP@4..9
+ L_CURLY@4..5 "{"
+ TEXT@5..8
+ WORD@5..8 "bar"
+ R_CURLY@8..9 "}"
+ MIXED_GROUP@9..14
+ L_BRACK@9..10 "["
+ TEXT@10..13
+ WORD@10..13 "qux"
+ R_BRACK@13..14 "]"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_generic_command_empty() {
+ check(
+ r#"\foo"#,
+ expect![[r#"
+ ROOT@0..4
+ PREAMBLE@0..4
+ GENERIC_COMMAND@0..4
+ COMMAND_NAME@0..4 "\\foo"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_generic_command_escape() {
+ check(
+ r#"\#"#,
+ expect![[r#"
+ ROOT@0..2
+ PREAMBLE@0..2
+ GENERIC_COMMAND@0..2
+ COMMAND_NAME@0..2 "\\#"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_declaration() {
+ check(
+ r#"\DeclareAcronym{eg}{short = e.g,long = for example,tag = abbrev}"#,
+ expect![[r#"
+ ROOT@0..64
+ PREAMBLE@0..64
+ ACRONYM_DECLARATION@0..64
+ COMMAND_NAME@0..15 "\\DeclareAcronym"
+ CURLY_GROUP_WORD@15..19
+ L_CURLY@15..16 "{"
+ KEY@16..18
+ WORD@16..18 "eg"
+ R_CURLY@18..19 "}"
+ CURLY_GROUP_KEY_VALUE@19..64
+ L_CURLY@19..20 "{"
+ KEY_VALUE_BODY@20..63
+ KEY_VALUE_PAIR@20..31
+ KEY@20..26
+ WORD@20..25 "short"
+ WHITESPACE@25..26 " "
+ EQUALITY_SIGN@26..27 "="
+ WHITESPACE@27..28 " "
+ VALUE@28..31
+ TEXT@28..31
+ WORD@28..31 "e.g"
+ COMMA@31..32 ","
+ KEY_VALUE_PAIR@32..50
+ KEY@32..37
+ WORD@32..36 "long"
+ WHITESPACE@36..37 " "
+ EQUALITY_SIGN@37..38 "="
+ WHITESPACE@38..39 " "
+ VALUE@39..50
+ TEXT@39..50
+ WORD@39..42 "for"
+ WHITESPACE@42..43 " "
+ WORD@43..50 "example"
+ COMMA@50..51 ","
+ KEY_VALUE_PAIR@51..63
+ KEY@51..55
+ WORD@51..54 "tag"
+ WHITESPACE@54..55 " "
+ EQUALITY_SIGN@55..56 "="
+ WHITESPACE@56..57 " "
+ VALUE@57..63
+ TEXT@57..63
+ WORD@57..63 "abbrev"
+ R_CURLY@63..64 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_definition_options() {
+ check(
+ r#"\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}"#,
+ expect![[r#"
+ ROOT@0..76
+ PREAMBLE@0..76
+ ACRONYM_DEFINITION@0..76
+ COMMAND_NAME@0..11 "\\newacronym"
+ BRACK_GROUP_KEY_VALUE@11..43
+ L_BRACK@11..12 "["
+ KEY_VALUE_BODY@12..42
+ KEY_VALUE_PAIR@12..42
+ KEY@12..22
+ WORD@12..22 "longplural"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..42
+ CURLY_GROUP@23..42
+ L_CURLY@23..24 "{"
+ TEXT@24..41
+ WORD@24..30 "Frames"
+ WHITESPACE@30..31 " "
+ WORD@31..34 "per"
+ WHITESPACE@34..35 " "
+ WORD@35..41 "Second"
+ R_CURLY@41..42 "}"
+ R_BRACK@42..43 "]"
+ CURLY_GROUP_WORD@43..53
+ L_CURLY@43..44 "{"
+ KEY@44..52
+ WORD@44..52 "fpsLabel"
+ R_CURLY@52..53 "}"
+ CURLY_GROUP@53..58
+ L_CURLY@53..54 "{"
+ TEXT@54..57
+ WORD@54..57 "FPS"
+ R_CURLY@57..58 "}"
+ CURLY_GROUP@58..76
+ L_CURLY@58..59 "{"
+ TEXT@59..75
+ WORD@59..64 "Frame"
+ WHITESPACE@64..65 " "
+ WORD@65..68 "per"
+ WHITESPACE@68..69 " "
+ WORD@69..75 "Second"
+ R_CURLY@75..76 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_definition_simple() {
+ check(
+ r#"\newacronym{fpsLabel}{FPS}{Frame per Second}"#,
+ expect![[r#"
+ ROOT@0..44
+ PREAMBLE@0..44
+ ACRONYM_DEFINITION@0..44
+ COMMAND_NAME@0..11 "\\newacronym"
+ CURLY_GROUP_WORD@11..21
+ L_CURLY@11..12 "{"
+ KEY@12..20
+ WORD@12..20 "fpsLabel"
+ R_CURLY@20..21 "}"
+ CURLY_GROUP@21..26
+ L_CURLY@21..22 "{"
+ TEXT@22..25
+ WORD@22..25 "FPS"
+ R_CURLY@25..26 "}"
+ CURLY_GROUP@26..44
+ L_CURLY@26..27 "{"
+ TEXT@27..43
+ WORD@27..32 "Frame"
+ WHITESPACE@32..33 " "
+ WORD@33..36 "per"
+ WHITESPACE@36..37 " "
+ WORD@37..43 "Second"
+ R_CURLY@43..44 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_package() {
+ check(
+ r#"\acro{fps}[FPS]{Frames per Second}
+"#,
+ expect![[r#"
+ ROOT@0..35
+ PREAMBLE@0..35
+ ACRONYM_DEFINITION@0..35
+ COMMAND_NAME@0..5 "\\acro"
+ CURLY_GROUP_WORD@5..10
+ L_CURLY@5..6 "{"
+ KEY@6..9
+ WORD@6..9 "fps"
+ R_CURLY@9..10 "}"
+ BRACK_GROUP@10..15
+ L_BRACK@10..11 "["
+ TEXT@11..14
+ WORD@11..14 "FPS"
+ R_BRACK@14..15 "]"
+ CURLY_GROUP@15..35
+ L_CURLY@15..16 "{"
+ TEXT@16..33
+ WORD@16..22 "Frames"
+ WHITESPACE@22..23 " "
+ WORD@23..26 "per"
+ WHITESPACE@26..27 " "
+ WORD@27..33 "Second"
+ R_CURLY@33..34 "}"
+ LINE_BREAK@34..35 "\n"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_reference_options() {
+ check(
+ r#"\acrshort[foo=bar,baz]{fpsLabel}"#,
+ expect![[r#"
+ ROOT@0..32
+ PREAMBLE@0..32
+ ACRONYM_REFERENCE@0..32
+ COMMAND_NAME@0..9 "\\acrshort"
+ BRACK_GROUP_KEY_VALUE@9..22
+ L_BRACK@9..10 "["
+ KEY_VALUE_BODY@10..21
+ KEY_VALUE_PAIR@10..17
+ KEY@10..13
+ WORD@10..13 "foo"
+ EQUALITY_SIGN@13..14 "="
+ VALUE@14..17
+ TEXT@14..17
+ WORD@14..17 "bar"
+ COMMA@17..18 ","
+ KEY_VALUE_PAIR@18..21
+ KEY@18..21
+ WORD@18..21 "baz"
+ R_BRACK@21..22 "]"
+ CURLY_GROUP_WORD@22..32
+ L_CURLY@22..23 "{"
+ KEY@23..31
+ WORD@23..31 "fpsLabel"
+ R_CURLY@31..32 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_acronym_reference_simple() {
+ check(
+ r#"\acrshort{fpsLabel}"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ ACRONYM_REFERENCE@0..19
+ COMMAND_NAME@0..9 "\\acrshort"
+ CURLY_GROUP_WORD@9..19
+ L_CURLY@9..10 "{"
+ KEY@10..18
+ WORD@10..18 "fpsLabel"
+ R_CURLY@18..19 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_glossary_entry_definition_simple() {
+ check(
+ r#"\newglossaryentry{foo}{bar = baz, qux,}"#,
+ expect![[r#"
+ ROOT@0..39
+ PREAMBLE@0..39
+ GLOSSARY_ENTRY_DEFINITION@0..39
+ COMMAND_NAME@0..17 "\\newglossaryentry"
+ CURLY_GROUP_WORD@17..22
+ L_CURLY@17..18 "{"
+ KEY@18..21
+ WORD@18..21 "foo"
+ R_CURLY@21..22 "}"
+ CURLY_GROUP_KEY_VALUE@22..39
+ L_CURLY@22..23 "{"
+ KEY_VALUE_BODY@23..38
+ KEY_VALUE_PAIR@23..32
+ KEY@23..27
+ WORD@23..26 "bar"
+ WHITESPACE@26..27 " "
+ EQUALITY_SIGN@27..28 "="
+ WHITESPACE@28..29 " "
+ VALUE@29..32
+ TEXT@29..32
+ WORD@29..32 "baz"
+ COMMA@32..33 ","
+ WHITESPACE@33..34 " "
+ KEY_VALUE_PAIR@34..37
+ KEY@34..37
+ WORD@34..37 "qux"
+ COMMA@37..38 ","
+ R_CURLY@38..39 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_glossary_entry_reference_options() {
+ check(
+ r#"\gls[foo = bar, qux]{baz}"#,
+ expect![[r#"
+ ROOT@0..25
+ PREAMBLE@0..25
+ GLOSSARY_ENTRY_REFERENCE@0..25
+ COMMAND_NAME@0..4 "\\gls"
+ BRACK_GROUP_KEY_VALUE@4..20
+ L_BRACK@4..5 "["
+ KEY_VALUE_BODY@5..19
+ KEY_VALUE_PAIR@5..14
+ KEY@5..9
+ WORD@5..8 "foo"
+ WHITESPACE@8..9 " "
+ EQUALITY_SIGN@9..10 "="
+ WHITESPACE@10..11 " "
+ VALUE@11..14
+ TEXT@11..14
+ WORD@11..14 "bar"
+ COMMA@14..15 ","
+ WHITESPACE@15..16 " "
+ KEY_VALUE_PAIR@16..19
+ KEY@16..19
+ WORD@16..19 "qux"
+ R_BRACK@19..20 "]"
+ CURLY_GROUP_WORD@20..25
+ L_CURLY@20..21 "{"
+ KEY@21..24
+ WORD@21..24 "baz"
+ R_CURLY@24..25 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_glossary_entry_reference_simple() {
+ check(
+ r#"\gls{foo}"#,
+ expect![[r#"
+ ROOT@0..9
+ PREAMBLE@0..9
+ GLOSSARY_ENTRY_REFERENCE@0..9
+ COMMAND_NAME@0..4 "\\gls"
+ CURLY_GROUP_WORD@4..9
+ L_CURLY@4..5 "{"
+ KEY@5..8
+ WORD@5..8 "foo"
+ R_CURLY@8..9 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_path() {
+ check(
+ r#"\graphicspath{{../figures/}}"#,
+ expect![[r#"
+ ROOT@0..28
+ PREAMBLE@0..28
+ GRAPHICS_PATH@0..28
+ COMMAND_NAME@0..13 "\\graphicspath"
+ CURLY_GROUP@13..28
+ L_CURLY@13..14 "{"
+ CURLY_GROUP_WORD@14..27
+ L_CURLY@14..15 "{"
+ KEY@15..26
+ WORD@15..26 "../figures/"
+ R_CURLY@26..27 "}"
+ R_CURLY@27..28 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_path_command() {
+ check(
+ r#"\graphicspath{{\subfix{./img/}}}"#,
+ expect![[r#"
+ ROOT@0..32
+ PREAMBLE@0..32
+ GRAPHICS_PATH@0..32
+ COMMAND_NAME@0..13 "\\graphicspath"
+ CURLY_GROUP@13..32
+ L_CURLY@13..14 "{"
+ CURLY_GROUP_WORD@14..31
+ L_CURLY@14..15 "{"
+ KEY@15..30
+ COMMAND_NAME@15..22 "\\subfix"
+ CURLY_GROUP_WORD@22..30
+ L_CURLY@22..23 "{"
+ KEY@23..29
+ WORD@23..29 "./img/"
+ R_CURLY@29..30 "}"
+ R_CURLY@30..31 "}"
+ R_CURLY@31..32 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_path_options() {
+ check(
+ r#"\graphicspath[foo]{{../figures/}}"#,
+ expect![[r#"
+ ROOT@0..33
+ PREAMBLE@0..33
+ GRAPHICS_PATH@0..13
+ COMMAND_NAME@0..13 "\\graphicspath"
+ MIXED_GROUP@13..18
+ L_BRACK@13..14 "["
+ TEXT@14..17
+ WORD@14..17 "foo"
+ R_BRACK@17..18 "]"
+ CURLY_GROUP@18..33
+ L_CURLY@18..19 "{"
+ CURLY_GROUP@19..32
+ L_CURLY@19..20 "{"
+ TEXT@20..31
+ WORD@20..31 "../figures/"
+ R_CURLY@31..32 "}"
+ R_CURLY@32..33 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_curly_group_missing_end() {
+ check(
+ r#"{hello world"#,
+ expect![[r#"
+ ROOT@0..12
+ PREAMBLE@0..12
+ CURLY_GROUP@0..12
+ L_CURLY@0..1 "{"
+ TEXT@1..12
+ WORD@1..6 "hello"
+ WHITESPACE@6..7 " "
+ WORD@7..12 "world"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_curly_group_simple() {
+ check(
+ r#"{hello world}"#,
+ expect![[r#"
+ ROOT@0..13
+ PREAMBLE@0..13
+ CURLY_GROUP@0..13
+ L_CURLY@0..1 "{"
+ TEXT@1..12
+ WORD@1..6 "hello"
+ WHITESPACE@6..7 " "
+ WORD@7..12 "world"
+ R_CURLY@12..13 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_equation_missing_end() {
+ check(
+ r#"\begin{a} \[ foo bar \end{b}"#,
+ expect![[r#"
+ ROOT@0..28
+ PREAMBLE@0..28
+ ENVIRONMENT@0..28
+ BEGIN@0..10
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..10
+ L_CURLY@6..7 "{"
+ KEY@7..8
+ WORD@7..8 "a"
+ R_CURLY@8..9 "}"
+ WHITESPACE@9..10 " "
+ EQUATION@10..21
+ COMMAND_NAME@10..12 "\\["
+ WHITESPACE@12..13 " "
+ TEXT@13..21
+ WORD@13..16 "foo"
+ WHITESPACE@16..17 " "
+ WORD@17..20 "bar"
+ WHITESPACE@20..21 " "
+ END@21..28
+ COMMAND_NAME@21..25 "\\end"
+ CURLY_GROUP_WORD@25..28
+ L_CURLY@25..26 "{"
+ KEY@26..27
+ WORD@26..27 "b"
+ R_CURLY@27..28 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_escaped_brackets() {
+ check(
+ r#"{[}{]}"#,
+ expect![[r#"
+ ROOT@0..6
+ PREAMBLE@0..6
+ CURLY_GROUP@0..3
+ L_CURLY@0..1 "{"
+ MIXED_GROUP@1..2
+ L_BRACK@1..2 "["
+ R_CURLY@2..3 "}"
+ CURLY_GROUP@3..6
+ L_CURLY@3..4 "{"
+ ERROR@4..5
+ R_BRACK@4..5 "]"
+ R_CURLY@5..6 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_unmatched_braces() {
+ check(
+ r#"}{"#,
+ expect![[r#"
+ ROOT@0..2
+ PREAMBLE@0..2
+ ERROR@0..1
+ R_CURLY@0..1 "}"
+ CURLY_GROUP@1..2
+ L_CURLY@1..2 "{"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_unmatched_brackets() {
+ check(
+ r#"]["#,
+ expect![[r#"
+ ROOT@0..2
+ PREAMBLE@0..2
+ ERROR@0..1
+ R_BRACK@0..1 "]"
+ MIXED_GROUP@1..2
+ L_BRACK@1..2 "["
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_unmatched_brackets_with_group() {
+ check(
+ r#"{][}"#,
+ expect![[r#"
+ ROOT@0..4
+ PREAMBLE@0..4
+ CURLY_GROUP@0..4
+ L_CURLY@0..1 "{"
+ ERROR@1..2
+ R_BRACK@1..2 "]"
+ MIXED_GROUP@2..3
+ L_BRACK@2..3 "["
+ R_CURLY@3..4 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_hello_world() {
+ check(
+ r#"Hello World!"#,
+ expect![[r#"
+ ROOT@0..12
+ PREAMBLE@0..12
+ TEXT@0..12
+ WORD@0..5 "Hello"
+ WHITESPACE@5..6 " "
+ WORD@6..12 "World!"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_biblatex_include_options() {
+ check(
+ r#"\addbibresource[foo=bar, baz]{foo/bar.bib}"#,
+ expect![[r#"
+ ROOT@0..42
+ PREAMBLE@0..42
+ BIBLATEX_INCLUDE@0..42
+ COMMAND_NAME@0..15 "\\addbibresource"
+ BRACK_GROUP_KEY_VALUE@15..29
+ L_BRACK@15..16 "["
+ KEY_VALUE_BODY@16..28
+ KEY_VALUE_PAIR@16..23
+ KEY@16..19
+ WORD@16..19 "foo"
+ EQUALITY_SIGN@19..20 "="
+ VALUE@20..23
+ TEXT@20..23
+ WORD@20..23 "bar"
+ COMMA@23..24 ","
+ WHITESPACE@24..25 " "
+ KEY_VALUE_PAIR@25..28
+ KEY@25..28
+ WORD@25..28 "baz"
+ R_BRACK@28..29 "]"
+ CURLY_GROUP_WORD_LIST@29..42
+ L_CURLY@29..30 "{"
+ KEY@30..41
+ WORD@30..41 "foo/bar.bib"
+ R_CURLY@41..42 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_biblatex_include_simple() {
+ check(
+ r#"\addbibresource{foo/bar.bib}"#,
+ expect![[r#"
+ ROOT@0..28
+ PREAMBLE@0..28
+ BIBLATEX_INCLUDE@0..28
+ COMMAND_NAME@0..15 "\\addbibresource"
+ CURLY_GROUP_WORD_LIST@15..28
+ L_CURLY@15..16 "{"
+ KEY@16..27
+ WORD@16..27 "foo/bar.bib"
+ R_CURLY@27..28 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_bibtex_include_simple() {
+ check(
+ r#"\bibliography{foo/bar}"#,
+ expect![[r#"
+ ROOT@0..22
+ PREAMBLE@0..22
+ BIBTEX_INCLUDE@0..22
+ COMMAND_NAME@0..13 "\\bibliography"
+ CURLY_GROUP_WORD_LIST@13..22
+ L_CURLY@13..14 "{"
+ KEY@14..21
+ WORD@14..21 "foo/bar"
+ R_CURLY@21..22 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_class_include_empty() {
+ check(
+ r#"\documentclass{}"#,
+ expect![[r#"
+ ROOT@0..16
+ PREAMBLE@0..16
+ CLASS_INCLUDE@0..16
+ COMMAND_NAME@0..14 "\\documentclass"
+ CURLY_GROUP_WORD_LIST@14..16
+ L_CURLY@14..15 "{"
+ R_CURLY@15..16 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_class_include_options() {
+ check(
+ r#"\documentclass[foo = bar, baz, qux]{article}"#,
+ expect![[r#"
+ ROOT@0..44
+ PREAMBLE@0..44
+ CLASS_INCLUDE@0..44
+ COMMAND_NAME@0..14 "\\documentclass"
+ BRACK_GROUP_KEY_VALUE@14..35
+ L_BRACK@14..15 "["
+ KEY_VALUE_BODY@15..34
+ KEY_VALUE_PAIR@15..24
+ KEY@15..19
+ WORD@15..18 "foo"
+ WHITESPACE@18..19 " "
+ EQUALITY_SIGN@19..20 "="
+ WHITESPACE@20..21 " "
+ VALUE@21..24
+ TEXT@21..24
+ WORD@21..24 "bar"
+ COMMA@24..25 ","
+ WHITESPACE@25..26 " "
+ KEY_VALUE_PAIR@26..29
+ KEY@26..29
+ WORD@26..29 "baz"
+ COMMA@29..30 ","
+ WHITESPACE@30..31 " "
+ KEY_VALUE_PAIR@31..34
+ KEY@31..34
+ WORD@31..34 "qux"
+ R_BRACK@34..35 "]"
+ CURLY_GROUP_WORD_LIST@35..44
+ L_CURLY@35..36 "{"
+ KEY@36..43
+ WORD@36..43 "article"
+ R_CURLY@43..44 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_class_include_simple() {
+ check(
+ r#"\documentclass{article}"#,
+ expect![[r#"
+ ROOT@0..23
+ PREAMBLE@0..23
+ CLASS_INCLUDE@0..23
+ COMMAND_NAME@0..14 "\\documentclass"
+ CURLY_GROUP_WORD_LIST@14..23
+ L_CURLY@14..15 "{"
+ KEY@15..22
+ WORD@15..22 "article"
+ R_CURLY@22..23 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_include_command() {
+ check(
+ r#"\includegraphics[width=0.5\textwidth]{\foo.\bar.pdf}"#,
+ expect![[r#"
+ ROOT@0..52
+ PREAMBLE@0..52
+ GRAPHICS_INCLUDE@0..52
+ COMMAND_NAME@0..16 "\\includegraphics"
+ BRACK_GROUP_KEY_VALUE@16..37
+ L_BRACK@16..17 "["
+ KEY_VALUE_BODY@17..36
+ KEY_VALUE_PAIR@17..36
+ KEY@17..22
+ WORD@17..22 "width"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..36
+ TEXT@23..26
+ WORD@23..26 "0.5"
+ GENERIC_COMMAND@26..36
+ COMMAND_NAME@26..36 "\\textwidth"
+ R_BRACK@36..37 "]"
+ CURLY_GROUP_WORD_LIST@37..52
+ L_CURLY@37..38 "{"
+ KEY@38..51
+ COMMAND_NAME@38..42 "\\foo"
+ WORD@42..43 "."
+ COMMAND_NAME@43..47 "\\bar"
+ WORD@47..51 ".pdf"
+ R_CURLY@51..52 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_include_complicated_options() {
+ check(
+ r#"\includegraphics[width=0.5\textwidth]{}"#,
+ expect![[r#"
+ ROOT@0..39
+ PREAMBLE@0..39
+ GRAPHICS_INCLUDE@0..39
+ COMMAND_NAME@0..16 "\\includegraphics"
+ BRACK_GROUP_KEY_VALUE@16..37
+ L_BRACK@16..17 "["
+ KEY_VALUE_BODY@17..36
+ KEY_VALUE_PAIR@17..36
+ KEY@17..22
+ WORD@17..22 "width"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..36
+ TEXT@23..26
+ WORD@23..26 "0.5"
+ GENERIC_COMMAND@26..36
+ COMMAND_NAME@26..36 "\\textwidth"
+ R_BRACK@36..37 "]"
+ CURLY_GROUP_WORD_LIST@37..39
+ L_CURLY@37..38 "{"
+ R_CURLY@38..39 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_include_options() {
+ check(
+ r#"\includegraphics[scale=.5]{foo/bar.pdf}"#,
+ expect![[r#"
+ ROOT@0..39
+ PREAMBLE@0..39
+ GRAPHICS_INCLUDE@0..39
+ COMMAND_NAME@0..16 "\\includegraphics"
+ BRACK_GROUP_KEY_VALUE@16..26
+ L_BRACK@16..17 "["
+ KEY_VALUE_BODY@17..25
+ KEY_VALUE_PAIR@17..25
+ KEY@17..22
+ WORD@17..22 "scale"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..25
+ TEXT@23..25
+ WORD@23..25 ".5"
+ R_BRACK@25..26 "]"
+ CURLY_GROUP_WORD_LIST@26..39
+ L_CURLY@26..27 "{"
+ KEY@27..38
+ WORD@27..38 "foo/bar.pdf"
+ R_CURLY@38..39 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_graphics_include_simple() {
+ check(
+ r#"\includegraphics{foo/bar.pdf}"#,
+ expect![[r#"
+ ROOT@0..29
+ PREAMBLE@0..29
+ GRAPHICS_INCLUDE@0..29
+ COMMAND_NAME@0..16 "\\includegraphics"
+ CURLY_GROUP_WORD_LIST@16..29
+ L_CURLY@16..17 "{"
+ KEY@17..28
+ WORD@17..28 "foo/bar.pdf"
+ R_CURLY@28..29 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_import_incomplete() {
+ check(
+ r#"\import{foo"#,
+ expect![[r#"
+ ROOT@0..11
+ PREAMBLE@0..11
+ IMPORT@0..11
+ COMMAND_NAME@0..7 "\\import"
+ CURLY_GROUP_WORD@7..11
+ L_CURLY@7..8 "{"
+ KEY@8..11
+ WORD@8..11 "foo"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_import_simple() {
+ check(
+ r#"\import{foo}{bar}"#,
+ expect![[r#"
+ ROOT@0..17
+ PREAMBLE@0..17
+ IMPORT@0..17
+ COMMAND_NAME@0..7 "\\import"
+ CURLY_GROUP_WORD@7..12
+ L_CURLY@7..8 "{"
+ KEY@8..11
+ WORD@8..11 "foo"
+ R_CURLY@11..12 "}"
+ CURLY_GROUP_WORD@12..17
+ L_CURLY@12..13 "{"
+ KEY@13..16
+ WORD@13..16 "bar"
+ R_CURLY@16..17 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_inkscape_include_options() {
+ check(
+ r#"\includesvg[scale=.5]{foo/bar}"#,
+ expect![[r#"
+ ROOT@0..30
+ PREAMBLE@0..30
+ SVG_INCLUDE@0..30
+ COMMAND_NAME@0..11 "\\includesvg"
+ BRACK_GROUP_KEY_VALUE@11..21
+ L_BRACK@11..12 "["
+ KEY_VALUE_BODY@12..20
+ KEY_VALUE_PAIR@12..20
+ KEY@12..17
+ WORD@12..17 "scale"
+ EQUALITY_SIGN@17..18 "="
+ VALUE@18..20
+ TEXT@18..20
+ WORD@18..20 ".5"
+ R_BRACK@20..21 "]"
+ CURLY_GROUP_WORD_LIST@21..30
+ L_CURLY@21..22 "{"
+ KEY@22..29
+ WORD@22..29 "foo/bar"
+ R_CURLY@29..30 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_inkscape_include_simple() {
+ check(
+ r#"\includesvg{foo/bar}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ SVG_INCLUDE@0..20
+ COMMAND_NAME@0..11 "\\includesvg"
+ CURLY_GROUP_WORD_LIST@11..20
+ L_CURLY@11..12 "{"
+ KEY@12..19
+ WORD@12..19 "foo/bar"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_latex_include_equality_sign() {
+ check(
+ r#"\include{foo=bar}"#,
+ expect![[r#"
+ ROOT@0..17
+ PREAMBLE@0..17
+ LATEX_INCLUDE@0..17
+ COMMAND_NAME@0..8 "\\include"
+ CURLY_GROUP_WORD_LIST@8..17
+ L_CURLY@8..9 "{"
+ KEY@9..16
+ WORD@9..12 "foo"
+ EQUALITY_SIGN@12..13 "="
+ WORD@13..16 "bar"
+ R_CURLY@16..17 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_latex_include_simple() {
+ check(
+ r#"\include{foo/bar}"#,
+ expect![[r#"
+ ROOT@0..17
+ PREAMBLE@0..17
+ LATEX_INCLUDE@0..17
+ COMMAND_NAME@0..8 "\\include"
+ CURLY_GROUP_WORD_LIST@8..17
+ L_CURLY@8..9 "{"
+ KEY@9..16
+ WORD@9..16 "foo/bar"
+ R_CURLY@16..17 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_latex_input_path_brackets() {
+ check(
+ r#"\input{foo[bar].tex}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ LATEX_INCLUDE@0..20
+ COMMAND_NAME@0..6 "\\input"
+ CURLY_GROUP_WORD_LIST@6..20
+ L_CURLY@6..7 "{"
+ KEY@7..19
+ WORD@7..10 "foo"
+ L_BRACK@10..11 "["
+ WORD@11..14 "bar"
+ R_BRACK@14..15 "]"
+ WORD@15..19 ".tex"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_package_include_empty() {
+ check(
+ r#"\usepackage{}"#,
+ expect![[r#"
+ ROOT@0..13
+ PREAMBLE@0..13
+ PACKAGE_INCLUDE@0..13
+ COMMAND_NAME@0..11 "\\usepackage"
+ CURLY_GROUP_WORD_LIST@11..13
+ L_CURLY@11..12 "{"
+ R_CURLY@12..13 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_package_include_multiple() {
+ check(
+ r#"\usepackage{amsmath, lipsum}"#,
+ expect![[r#"
+ ROOT@0..28
+ PREAMBLE@0..28
+ PACKAGE_INCLUDE@0..28
+ COMMAND_NAME@0..11 "\\usepackage"
+ CURLY_GROUP_WORD_LIST@11..28
+ L_CURLY@11..12 "{"
+ KEY@12..19
+ WORD@12..19 "amsmath"
+ COMMA@19..20 ","
+ WHITESPACE@20..21 " "
+ KEY@21..27
+ WORD@21..27 "lipsum"
+ R_CURLY@27..28 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_package_include_options() {
+ check(
+ r#"\usepackage[foo = bar, baz, qux]{amsmath}"#,
+ expect![[r#"
+ ROOT@0..41
+ PREAMBLE@0..41
+ PACKAGE_INCLUDE@0..41
+ COMMAND_NAME@0..11 "\\usepackage"
+ BRACK_GROUP_KEY_VALUE@11..32
+ L_BRACK@11..12 "["
+ KEY_VALUE_BODY@12..31
+ KEY_VALUE_PAIR@12..21
+ KEY@12..16
+ WORD@12..15 "foo"
+ WHITESPACE@15..16 " "
+ EQUALITY_SIGN@16..17 "="
+ WHITESPACE@17..18 " "
+ VALUE@18..21
+ TEXT@18..21
+ WORD@18..21 "bar"
+ COMMA@21..22 ","
+ WHITESPACE@22..23 " "
+ KEY_VALUE_PAIR@23..26
+ KEY@23..26
+ WORD@23..26 "baz"
+ COMMA@26..27 ","
+ WHITESPACE@27..28 " "
+ KEY_VALUE_PAIR@28..31
+ KEY@28..31
+ WORD@28..31 "qux"
+ R_BRACK@31..32 "]"
+ CURLY_GROUP_WORD_LIST@32..41
+ L_CURLY@32..33 "{"
+ KEY@33..40
+ WORD@33..40 "amsmath"
+ R_CURLY@40..41 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_package_include_simple() {
+ check(
+ r#"\usepackage{amsmath}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ PACKAGE_INCLUDE@0..20
+ COMMAND_NAME@0..11 "\\usepackage"
+ CURLY_GROUP_WORD_LIST@11..20
+ L_CURLY@11..12 "{"
+ KEY@12..19
+ WORD@12..19 "amsmath"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_pgf_library_import_simple() {
+ check(
+ r#"\usepgflibrary{foo}"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ TIKZ_LIBRARY_IMPORT@0..19
+ COMMAND_NAME@0..14 "\\usepgflibrary"
+ CURLY_GROUP_WORD_LIST@14..19
+ L_CURLY@14..15 "{"
+ KEY@15..18
+ WORD@15..18 "foo"
+ R_CURLY@18..19 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_svg_include_options() {
+ check(
+ r#"\includesvg[scale=.5]{foo/bar.svg}"#,
+ expect![[r#"
+ ROOT@0..34
+ PREAMBLE@0..34
+ SVG_INCLUDE@0..34
+ COMMAND_NAME@0..11 "\\includesvg"
+ BRACK_GROUP_KEY_VALUE@11..21
+ L_BRACK@11..12 "["
+ KEY_VALUE_BODY@12..20
+ KEY_VALUE_PAIR@12..20
+ KEY@12..17
+ WORD@12..17 "scale"
+ EQUALITY_SIGN@17..18 "="
+ VALUE@18..20
+ TEXT@18..20
+ WORD@18..20 ".5"
+ R_BRACK@20..21 "]"
+ CURLY_GROUP_WORD_LIST@21..34
+ L_CURLY@21..22 "{"
+ KEY@22..33
+ WORD@22..33 "foo/bar.svg"
+ R_CURLY@33..34 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_svg_include_simple() {
+ check(
+ r#"\includesvg{foo/bar.svg}"#,
+ expect![[r#"
+ ROOT@0..24
+ PREAMBLE@0..24
+ SVG_INCLUDE@0..24
+ COMMAND_NAME@0..11 "\\includesvg"
+ CURLY_GROUP_WORD_LIST@11..24
+ L_CURLY@11..12 "{"
+ KEY@12..23
+ WORD@12..23 "foo/bar.svg"
+ R_CURLY@23..24 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_tikz_library_import_simple() {
+ check(
+ r#"\usetikzlibrary{foo}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ TIKZ_LIBRARY_IMPORT@0..20
+ COMMAND_NAME@0..15 "\\usetikzlibrary"
+ CURLY_GROUP_WORD_LIST@15..20
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "foo"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_verbatim_include_simple() {
+ check(
+ r#"\verbatiminput{foo/bar.txt}"#,
+ expect![[r#"
+ ROOT@0..27
+ PREAMBLE@0..27
+ VERBATIM_INCLUDE@0..27
+ COMMAND_NAME@0..14 "\\verbatiminput"
+ CURLY_GROUP_WORD_LIST@14..27
+ L_CURLY@14..15 "{"
+ KEY@15..26
+ WORD@15..26 "foo/bar.txt"
+ R_CURLY@26..27 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_inline() {
+ check(
+ r#"$x \in [0, \infty)$"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ FORMULA@0..19
+ DOLLAR@0..1 "$"
+ TEXT@1..3
+ WORD@1..2 "x"
+ WHITESPACE@2..3 " "
+ GENERIC_COMMAND@3..18
+ COMMAND_NAME@3..6 "\\in"
+ WHITESPACE@6..7 " "
+ MIXED_GROUP@7..18
+ L_BRACK@7..8 "["
+ TEXT@8..11
+ WORD@8..9 "0"
+ COMMA@9..10 ","
+ WHITESPACE@10..11 " "
+ GENERIC_COMMAND@11..17
+ COMMAND_NAME@11..17 "\\infty"
+ R_PAREN@17..18 ")"
+ DOLLAR@18..19 "$"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_inline_double_dollar() {
+ check(
+ r#"$$x \in [0, \infty)$$"#,
+ expect![[r#"
+ ROOT@0..21
+ PREAMBLE@0..21
+ FORMULA@0..21
+ DOLLAR@0..2 "$$"
+ TEXT@2..4
+ WORD@2..3 "x"
+ WHITESPACE@3..4 " "
+ GENERIC_COMMAND@4..19
+ COMMAND_NAME@4..7 "\\in"
+ WHITESPACE@7..8 " "
+ MIXED_GROUP@8..19
+ L_BRACK@8..9 "["
+ TEXT@9..12
+ WORD@9..10 "0"
+ COMMA@10..11 ","
+ WHITESPACE@11..12 " "
+ GENERIC_COMMAND@12..18
+ COMMAND_NAME@12..18 "\\infty"
+ R_PAREN@18..19 ")"
+ DOLLAR@19..21 "$$"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_568() {
+ check(
+ r#"\input{|ipython scripts/test.ipynb}
+\label{fig:x=2}"#,
+ expect![[r#"
+ ROOT@0..51
+ PREAMBLE@0..51
+ LATEX_INCLUDE@0..36
+ COMMAND_NAME@0..6 "\\input"
+ CURLY_GROUP_WORD_LIST@6..36
+ L_CURLY@6..7 "{"
+ WORD@7..8 "|"
+ KEY@8..34
+ WORD@8..15 "ipython"
+ WHITESPACE@15..16 " "
+ WORD@16..34 "scripts/test.ipynb"
+ R_CURLY@34..35 "}"
+ LINE_BREAK@35..36 "\n"
+ LABEL_DEFINITION@36..51
+ COMMAND_NAME@36..42 "\\label"
+ CURLY_GROUP_WORD@42..51
+ L_CURLY@42..43 "{"
+ KEY@43..50
+ WORD@43..48 "fig:x"
+ EQUALITY_SIGN@48..49 "="
+ WORD@49..50 "2"
+ R_CURLY@50..51 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_745() {
+ check(
+ r#"\documentclass{article}
+\usepackage{tabularray}
+
+\ExplSyntaxOn
+\NewDocumentEnvironment{exptblr}{O{}m}
+ {
+ \use:x
+ {
+ \exp_not:N \begin{tblr}
+ [\exp_not:n{#1}]
+ {#2}
+ }
+ }
+ {
+ \end{tblr}
+ }
+\ExplSyntaxOff
+
+\begin{document}
+
+\end{document}"#,
+ expect![[r##"
+ ROOT@0..271
+ PREAMBLE@0..271
+ CLASS_INCLUDE@0..24
+ COMMAND_NAME@0..14 "\\documentclass"
+ CURLY_GROUP_WORD_LIST@14..24
+ L_CURLY@14..15 "{"
+ KEY@15..22
+ WORD@15..22 "article"
+ R_CURLY@22..23 "}"
+ LINE_BREAK@23..24 "\n"
+ PACKAGE_INCLUDE@24..50
+ COMMAND_NAME@24..35 "\\usepackage"
+ CURLY_GROUP_WORD_LIST@35..50
+ L_CURLY@35..36 "{"
+ KEY@36..46
+ WORD@36..46 "tabularray"
+ R_CURLY@46..47 "}"
+ WHITESPACE@47..48 " "
+ LINE_BREAK@48..50 "\n\n"
+ GENERIC_COMMAND@50..64
+ COMMAND_NAME@50..63 "\\ExplSyntaxOn"
+ LINE_BREAK@63..64 "\n"
+ GENERIC_COMMAND@64..223
+ COMMAND_NAME@64..87 "\\NewDocumentEnvironment"
+ CURLY_GROUP@87..96
+ L_CURLY@87..88 "{"
+ TEXT@88..95
+ WORD@88..95 "exptblr"
+ R_CURLY@95..96 "}"
+ CURLY_GROUP@96..107
+ L_CURLY@96..97 "{"
+ TEXT@97..98
+ WORD@97..98 "O"
+ CURLY_GROUP@98..100
+ L_CURLY@98..99 "{"
+ R_CURLY@99..100 "}"
+ TEXT@100..101
+ WORD@100..101 "m"
+ R_CURLY@101..102 "}"
+ LINE_BREAK@102..103 "\n"
+ WHITESPACE@103..107 " "
+ CURLY_GROUP@107..200
+ L_CURLY@107..108 "{"
+ LINE_BREAK@108..109 "\n"
+ WHITESPACE@109..113 " "
+ GENERIC_COMMAND@113..194
+ COMMAND_NAME@113..119 "\\use:x"
+ LINE_BREAK@119..120 "\n"
+ WHITESPACE@120..124 " "
+ CURLY_GROUP@124..194
+ L_CURLY@124..125 "{"
+ LINE_BREAK@125..126 "\n"
+ WHITESPACE@126..130 " "
+ GENERIC_COMMAND@130..141
+ COMMAND_NAME@130..140 "\\exp_not:N"
+ WHITESPACE@140..141 " "
+ ENVIRONMENT@141..188
+ BEGIN@141..179
+ COMMAND_NAME@141..147 "\\begin"
+ CURLY_GROUP_WORD@147..158
+ L_CURLY@147..148 "{"
+ KEY@148..152
+ WORD@148..152 "tblr"
+ R_CURLY@152..153 "}"
+ LINE_BREAK@153..154 "\n"
+ WHITESPACE@154..158 " "
+ BRACK_GROUP@158..179
+ L_BRACK@158..159 "["
+ GENERIC_COMMAND@159..173
+ COMMAND_NAME@159..169 "\\exp_not:n"
+ CURLY_GROUP@169..173
+ L_CURLY@169..170 "{"
+ TEXT@170..172
+ WORD@170..172 "#1"
+ R_CURLY@172..173 "}"
+ R_BRACK@173..174 "]"
+ LINE_BREAK@174..175 "\n"
+ WHITESPACE@175..179 " "
+ CURLY_GROUP@179..188
+ L_CURLY@179..180 "{"
+ TEXT@180..182
+ WORD@180..182 "#2"
+ R_CURLY@182..183 "}"
+ LINE_BREAK@183..184 "\n"
+ WHITESPACE@184..188 " "
+ R_CURLY@188..189 "}"
+ LINE_BREAK@189..190 "\n"
+ WHITESPACE@190..194 " "
+ R_CURLY@194..195 "}"
+ LINE_BREAK@195..196 "\n"
+ WHITESPACE@196..200 " "
+ CURLY_GROUP@200..223
+ L_CURLY@200..201 "{"
+ LINE_BREAK@201..202 "\n"
+ WHITESPACE@202..206 " "
+ GENERIC_COMMAND@206..221
+ COMMAND_NAME@206..210 "\\end"
+ CURLY_GROUP@210..221
+ L_CURLY@210..211 "{"
+ TEXT@211..215
+ WORD@211..215 "tblr"
+ R_CURLY@215..216 "}"
+ LINE_BREAK@216..217 "\n"
+ WHITESPACE@217..221 " "
+ R_CURLY@221..222 "}"
+ LINE_BREAK@222..223 "\n"
+ GENERIC_COMMAND@223..239
+ COMMAND_NAME@223..237 "\\ExplSyntaxOff"
+ LINE_BREAK@237..239 "\n\n"
+ ENVIRONMENT@239..271
+ BEGIN@239..257
+ COMMAND_NAME@239..245 "\\begin"
+ CURLY_GROUP_WORD@245..257
+ L_CURLY@245..246 "{"
+ KEY@246..254
+ WORD@246..254 "document"
+ R_CURLY@254..255 "}"
+ LINE_BREAK@255..257 "\n\n"
+ END@257..271
+ COMMAND_NAME@257..261 "\\end"
+ CURLY_GROUP_WORD@261..271
+ L_CURLY@261..262 "{"
+ KEY@262..270
+ WORD@262..270 "document"
+ R_CURLY@270..271 "}"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_issue_789() {
+ check(
+ r#"\graphicspath{test}"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ GRAPHICS_PATH@0..19
+ COMMAND_NAME@0..13 "\\graphicspath"
+ CURLY_GROUP_WORD@13..19
+ L_CURLY@13..14 "{"
+ KEY@14..18
+ WORD@14..18 "test"
+ R_CURLY@18..19 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_828() {
+ check(
+ r#"\verb|<STATEMENT> if(<expr>){<body>else{<body>|"#,
+ expect![[r#"
+ ROOT@0..51
+ PREAMBLE@0..51
+ GENERIC_COMMAND@0..5
+ COMMAND_NAME@0..5 "\\verb"
+ VERBATIM@5..6 "|"
+ VERBATIM@6..17 "<STATEMENT>"
+ VERBATIM@17..22 " "
+ VERBATIM@22..24 "if"
+ VERBATIM@24..25 "("
+ VERBATIM@25..31 "<expr>"
+ VERBATIM@31..32 ")"
+ VERBATIM@32..33 "{"
+ VERBATIM@33..43 "<body>else"
+ VERBATIM@43..44 "{"
+ VERBATIM@44..50 "<body>"
+ VERBATIM@50..51 "|"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_853() {
+ check(
+ r#"\documentclass{minimal}
+\begin{document}
+This is an asdf undefined command
+\iffalse
+ \iffalse\fi
+ \end{enumerate}
+\fi
+\end{document}"#,
+ expect![[r#"
+ ROOT@0..135
+ PREAMBLE@0..135
+ CLASS_INCLUDE@0..24
+ COMMAND_NAME@0..14 "\\documentclass"
+ CURLY_GROUP_WORD_LIST@14..24
+ L_CURLY@14..15 "{"
+ KEY@15..22
+ WORD@15..22 "minimal"
+ R_CURLY@22..23 "}"
+ LINE_BREAK@23..24 "\n"
+ ENVIRONMENT@24..135
+ BEGIN@24..41
+ COMMAND_NAME@24..30 "\\begin"
+ CURLY_GROUP_WORD@30..41
+ L_CURLY@30..31 "{"
+ KEY@31..39
+ WORD@31..39 "document"
+ R_CURLY@39..40 "}"
+ LINE_BREAK@40..41 "\n"
+ TEXT@41..75
+ WORD@41..45 "This"
+ WHITESPACE@45..46 " "
+ WORD@46..48 "is"
+ WHITESPACE@48..49 " "
+ WORD@49..51 "an"
+ WHITESPACE@51..52 " "
+ WORD@52..56 "asdf"
+ WHITESPACE@56..57 " "
+ WORD@57..66 "undefined"
+ WHITESPACE@66..67 " "
+ WORD@67..74 "command"
+ LINE_BREAK@74..75 "\n"
+ BLOCK_COMMENT@75..120
+ COMMAND_NAME@75..83 "\\iffalse"
+ LINE_BREAK@83..84 "\n"
+ WHITESPACE@84..86 " "
+ BLOCK_COMMENT@86..97
+ COMMAND_NAME@86..94 "\\iffalse"
+ COMMAND_NAME@94..97 "\\fi"
+ LINE_BREAK@97..98 "\n"
+ WHITESPACE@98..100 " "
+ COMMAND_NAME@100..104 "\\end"
+ L_CURLY@104..105 "{"
+ WORD@105..114 "enumerate"
+ R_CURLY@114..115 "}"
+ WHITESPACE@115..116 " "
+ LINE_BREAK@116..117 "\n"
+ COMMAND_NAME@117..120 "\\fi"
+ LINE_BREAK@120..121 "\n"
+ END@121..135
+ COMMAND_NAME@121..125 "\\end"
+ CURLY_GROUP_WORD@125..135
+ L_CURLY@125..126 "{"
+ KEY@126..134
+ WORD@126..134 "document"
+ R_CURLY@134..135 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_857() {
+ check(
+ r#"\newcommand\ö{}
+\newcommand{\öö}{}
+\newcommand\123{}"#,
+ expect![[r#"
+ ROOT@0..55
+ PREAMBLE@0..55
+ COMMAND_DEFINITION@0..11
+ COMMAND_NAME@0..11 "\\newcommand"
+ GENERIC_COMMAND@11..17
+ COMMAND_NAME@11..14 "\\ö"
+ CURLY_GROUP@14..17
+ L_CURLY@14..15 "{"
+ R_CURLY@15..16 "}"
+ LINE_BREAK@16..17 "\n"
+ COMMAND_DEFINITION@17..38
+ COMMAND_NAME@17..28 "\\newcommand"
+ CURLY_GROUP_COMMAND@28..35
+ L_CURLY@28..29 "{"
+ COMMAND_NAME@29..34 "\\öö"
+ R_CURLY@34..35 "}"
+ CURLY_GROUP@35..38
+ L_CURLY@35..36 "{"
+ R_CURLY@36..37 "}"
+ LINE_BREAK@37..38 "\n"
+ COMMAND_DEFINITION@38..49
+ COMMAND_NAME@38..49 "\\newcommand"
+ GENERIC_COMMAND@49..55
+ COMMAND_NAME@49..53 "\\123"
+ CURLY_GROUP@53..55
+ L_CURLY@53..54 "{"
+ R_CURLY@54..55 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_874() {
+ check(
+ r#"\includegraphics[scale=0.2]{7.4).jpg}"#,
+ expect![[r#"
+ ROOT@0..37
+ PREAMBLE@0..37
+ GRAPHICS_INCLUDE@0..37
+ COMMAND_NAME@0..16 "\\includegraphics"
+ BRACK_GROUP_KEY_VALUE@16..27
+ L_BRACK@16..17 "["
+ KEY_VALUE_BODY@17..26
+ KEY_VALUE_PAIR@17..26
+ KEY@17..22
+ WORD@17..22 "scale"
+ EQUALITY_SIGN@22..23 "="
+ VALUE@23..26
+ TEXT@23..26
+ WORD@23..26 "0.2"
+ R_BRACK@26..27 "]"
+ CURLY_GROUP_WORD_LIST@27..37
+ L_CURLY@27..28 "{"
+ KEY@28..36
+ WORD@28..31 "7.4"
+ R_PAREN@31..32 ")"
+ WORD@32..36 ".jpg"
+ R_CURLY@36..37 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_919() {
+ check(
+ r#"\documentclass{article}
+
+\usepackage{
+ lipsum, % provides blindtext
+ booktabs, % better rules for tables
+ %xcolor % easily define colors with \definecolor{}{}{}
+}
+
+\begin{document}
+ \lipsum
+\end{document}
+"#,
+ expect![[r#"
+ ROOT@0..217
+ PREAMBLE@0..217
+ CLASS_INCLUDE@0..25
+ COMMAND_NAME@0..14 "\\documentclass"
+ CURLY_GROUP_WORD_LIST@14..25
+ L_CURLY@14..15 "{"
+ KEY@15..22
+ WORD@15..22 "article"
+ R_CURLY@22..23 "}"
+ LINE_BREAK@23..25 "\n\n"
+ PACKAGE_INCLUDE@25..173
+ COMMAND_NAME@25..36 "\\usepackage"
+ CURLY_GROUP_WORD_LIST@36..173
+ L_CURLY@36..37 "{"
+ LINE_BREAK@37..38 "\n"
+ WHITESPACE@38..42 " "
+ KEY@42..48
+ WORD@42..48 "lipsum"
+ COMMA@48..49 ","
+ WHITESPACE@49..50 " "
+ COMMENT@50..70 "% provides blindtext"
+ LINE_BREAK@70..71 "\n"
+ WHITESPACE@71..75 " "
+ KEY@75..83
+ WORD@75..83 "booktabs"
+ COMMA@83..84 ","
+ WHITESPACE@84..85 " "
+ COMMENT@85..110 "% better rules for ta ..."
+ LINE_BREAK@110..111 "\n"
+ WHITESPACE@111..115 " "
+ COMMENT@115..169 "%xcolor % easily defi ..."
+ LINE_BREAK@169..170 "\n"
+ R_CURLY@170..171 "}"
+ LINE_BREAK@171..173 "\n\n"
+ ENVIRONMENT@173..217
+ BEGIN@173..194
+ COMMAND_NAME@173..179 "\\begin"
+ CURLY_GROUP_WORD@179..194
+ L_CURLY@179..180 "{"
+ KEY@180..188
+ WORD@180..188 "document"
+ R_CURLY@188..189 "}"
+ LINE_BREAK@189..190 "\n"
+ WHITESPACE@190..194 " "
+ GENERIC_COMMAND@194..202
+ COMMAND_NAME@194..201 "\\lipsum"
+ LINE_BREAK@201..202 "\n"
+ END@202..217
+ COMMAND_NAME@202..206 "\\end"
+ CURLY_GROUP_WORD@206..217
+ L_CURLY@206..207 "{"
+ KEY@207..215
+ WORD@207..215 "document"
+ R_CURLY@215..216 "}"
+ LINE_BREAK@216..217 "\n"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_issue_931() {
+ check(
+ r#"\bibliography{$HOME/Literature}"#,
+ expect![[r#"
+ ROOT@0..31
+ PREAMBLE@0..31
+ BIBTEX_INCLUDE@0..31
+ COMMAND_NAME@0..13 "\\bibliography"
+ CURLY_GROUP_WORD_LIST@13..31
+ L_CURLY@13..14 "{"
+ KEY@14..30
+ DOLLAR@14..15 "$"
+ WORD@15..30 "HOME/Literature"
+ R_CURLY@30..31 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_definition_line_break() {
+ check(
+ r#"\label{hello
+world}"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ LABEL_DEFINITION@0..13
+ COMMAND_NAME@0..6 "\\label"
+ CURLY_GROUP_WORD@6..13
+ L_CURLY@6..7 "{"
+ KEY@7..13
+ WORD@7..12 "hello"
+ LINE_BREAK@12..13 "\n"
+ TEXT@13..18
+ WORD@13..18 "world"
+ ERROR@18..19
+ R_CURLY@18..19 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_definition_simple() {
+ check(
+ r#"\label{foo}"#,
+ expect![[r#"
+ ROOT@0..11
+ PREAMBLE@0..11
+ LABEL_DEFINITION@0..11
+ COMMAND_NAME@0..6 "\\label"
+ CURLY_GROUP_WORD@6..11
+ L_CURLY@6..7 "{"
+ KEY@7..10
+ WORD@7..10 "foo"
+ R_CURLY@10..11 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_number() {
+ check(
+ r#"\newlabel{foo}{{1.1}}"#,
+ expect![[r#"
+ ROOT@0..21
+ PREAMBLE@0..21
+ LABEL_NUMBER@0..21
+ COMMAND_NAME@0..9 "\\newlabel"
+ CURLY_GROUP_WORD@9..14
+ L_CURLY@9..10 "{"
+ KEY@10..13
+ WORD@10..13 "foo"
+ R_CURLY@13..14 "}"
+ CURLY_GROUP@14..21
+ L_CURLY@14..15 "{"
+ CURLY_GROUP@15..20
+ L_CURLY@15..16 "{"
+ TEXT@16..19
+ WORD@16..19 "1.1"
+ R_CURLY@19..20 "}"
+ R_CURLY@20..21 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_equation() {
+ check(
+ r#"\eqref{foo}"#,
+ expect![[r#"
+ ROOT@0..11
+ PREAMBLE@0..11
+ LABEL_REFERENCE@0..11
+ COMMAND_NAME@0..6 "\\eqref"
+ CURLY_GROUP_WORD_LIST@6..11
+ L_CURLY@6..7 "{"
+ KEY@7..10
+ WORD@7..10 "foo"
+ R_CURLY@10..11 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_incomplete() {
+ check(
+ r#"Equation \eqref{eq is a \emph{useful} identity."#,
+ expect![[r#"
+ ROOT@0..47
+ PREAMBLE@0..47
+ TEXT@0..9
+ WORD@0..8 "Equation"
+ WHITESPACE@8..9 " "
+ LABEL_REFERENCE@9..24
+ COMMAND_NAME@9..15 "\\eqref"
+ CURLY_GROUP_WORD_LIST@15..24
+ L_CURLY@15..16 "{"
+ KEY@16..24
+ WORD@16..18 "eq"
+ WHITESPACE@18..19 " "
+ WORD@19..21 "is"
+ WHITESPACE@21..22 " "
+ WORD@22..23 "a"
+ WHITESPACE@23..24 " "
+ GENERIC_COMMAND@24..38
+ COMMAND_NAME@24..29 "\\emph"
+ CURLY_GROUP@29..38
+ L_CURLY@29..30 "{"
+ TEXT@30..36
+ WORD@30..36 "useful"
+ R_CURLY@36..37 "}"
+ WHITESPACE@37..38 " "
+ TEXT@38..47
+ WORD@38..47 "identity."
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_multiple() {
+ check(
+ r#"\ref{foo, bar}"#,
+ expect![[r#"
+ ROOT@0..14
+ PREAMBLE@0..14
+ LABEL_REFERENCE@0..14
+ COMMAND_NAME@0..4 "\\ref"
+ CURLY_GROUP_WORD_LIST@4..14
+ L_CURLY@4..5 "{"
+ KEY@5..8
+ WORD@5..8 "foo"
+ COMMA@8..9 ","
+ WHITESPACE@9..10 " "
+ KEY@10..13
+ WORD@10..13 "bar"
+ R_CURLY@13..14 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_range_error() {
+ check(
+ r#"\crefrange{foo{bar}"#,
+ expect![[r#"
+ ROOT@0..19
+ PREAMBLE@0..19
+ LABEL_REFERENCE_RANGE@0..19
+ COMMAND_NAME@0..10 "\\crefrange"
+ CURLY_GROUP_WORD@10..14
+ L_CURLY@10..11 "{"
+ KEY@11..14
+ WORD@11..14 "foo"
+ CURLY_GROUP_WORD@14..19
+ L_CURLY@14..15 "{"
+ KEY@15..18
+ WORD@15..18 "bar"
+ R_CURLY@18..19 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_range_incomplete() {
+ check(
+ r#"\crefrange{foo}"#,
+ expect![[r#"
+ ROOT@0..15
+ PREAMBLE@0..15
+ LABEL_REFERENCE_RANGE@0..15
+ COMMAND_NAME@0..10 "\\crefrange"
+ CURLY_GROUP_WORD@10..15
+ L_CURLY@10..11 "{"
+ KEY@11..14
+ WORD@11..14 "foo"
+ R_CURLY@14..15 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_range_simple() {
+ check(
+ r#"\crefrange{foo}{bar}"#,
+ expect![[r#"
+ ROOT@0..20
+ PREAMBLE@0..20
+ LABEL_REFERENCE_RANGE@0..20
+ COMMAND_NAME@0..10 "\\crefrange"
+ CURLY_GROUP_WORD@10..15
+ L_CURLY@10..11 "{"
+ KEY@11..14
+ WORD@11..14 "foo"
+ R_CURLY@14..15 "}"
+ CURLY_GROUP_WORD@15..20
+ L_CURLY@15..16 "{"
+ KEY@16..19
+ WORD@16..19 "bar"
+ R_CURLY@19..20 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_label_reference_simple() {
+ check(
+ r#"\ref{foo}"#,
+ expect![[r#"
+ ROOT@0..9
+ PREAMBLE@0..9
+ LABEL_REFERENCE@0..9
+ COMMAND_NAME@0..4 "\\ref"
+ CURLY_GROUP_WORD_LIST@4..9
+ L_CURLY@4..5 "{"
+ KEY@5..8
+ WORD@5..8 "foo"
+ R_CURLY@8..9 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_parameter() {
+ check(
+ r#"#1"#,
+ expect![[r##"
+ ROOT@0..2
+ PREAMBLE@0..2
+ TEXT@0..2
+ WORD@0..2 "#1"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_parameter_error() {
+ check(
+ r#"#"#,
+ expect![[r##"
+ ROOT@0..1
+ PREAMBLE@0..1
+ TEXT@0..1
+ WORD@0..1 "#"
+
+ "##]],
+ );
+}
+
+#[test]
+fn test_paragraphs() {
+ check(
+ r#"\section{Section 1}
+Section 1
+
+\paragraph{Paragraph 1}
+Paragraph 1
+
+\paragraph{Paragraph 2}
+Paragraph 2
+
+\section{Section 2}
+Section 2"#,
+ expect![[r#"
+ ROOT@0..134
+ PREAMBLE@0..134
+ SECTION@0..105
+ COMMAND_NAME@0..8 "\\section"
+ CURLY_GROUP@8..20
+ L_CURLY@8..9 "{"
+ TEXT@9..18
+ WORD@9..16 "Section"
+ WHITESPACE@16..17 " "
+ WORD@17..18 "1"
+ R_CURLY@18..19 "}"
+ LINE_BREAK@19..20 "\n"
+ TEXT@20..31
+ WORD@20..27 "Section"
+ WHITESPACE@27..28 " "
+ WORD@28..29 "1"
+ LINE_BREAK@29..31 "\n\n"
+ PARAGRAPH@31..68
+ COMMAND_NAME@31..41 "\\paragraph"
+ CURLY_GROUP@41..55
+ L_CURLY@41..42 "{"
+ TEXT@42..53
+ WORD@42..51 "Paragraph"
+ WHITESPACE@51..52 " "
+ WORD@52..53 "1"
+ R_CURLY@53..54 "}"
+ LINE_BREAK@54..55 "\n"
+ TEXT@55..68
+ WORD@55..64 "Paragraph"
+ WHITESPACE@64..65 " "
+ WORD@65..66 "1"
+ LINE_BREAK@66..68 "\n\n"
+ PARAGRAPH@68..105
+ COMMAND_NAME@68..78 "\\paragraph"
+ CURLY_GROUP@78..92
+ L_CURLY@78..79 "{"
+ TEXT@79..90
+ WORD@79..88 "Paragraph"
+ WHITESPACE@88..89 " "
+ WORD@89..90 "2"
+ R_CURLY@90..91 "}"
+ LINE_BREAK@91..92 "\n"
+ TEXT@92..105
+ WORD@92..101 "Paragraph"
+ WHITESPACE@101..102 " "
+ WORD@102..103 "2"
+ LINE_BREAK@103..105 "\n\n"
+ SECTION@105..134
+ COMMAND_NAME@105..113 "\\section"
+ CURLY_GROUP@113..125
+ L_CURLY@113..114 "{"
+ TEXT@114..123
+ WORD@114..121 "Section"
+ WHITESPACE@121..122 " "
+ WORD@122..123 "2"
+ R_CURLY@123..124 "}"
+ LINE_BREAK@124..125 "\n"
+ TEXT@125..134
+ WORD@125..132 "Section"
+ WHITESPACE@132..133 " "
+ WORD@133..134 "2"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_structure_enum_item() {
+ check(
+ r#"\begin{enumerate} \item 1 \item[2] 2 \item 3 \end{enumerate}"#,
+ expect![[r#"
+ ROOT@0..60
+ PREAMBLE@0..60
+ ENVIRONMENT@0..60
+ BEGIN@0..18
+ COMMAND_NAME@0..6 "\\begin"
+ CURLY_GROUP_WORD@6..18
+ L_CURLY@6..7 "{"
+ KEY@7..16
+ WORD@7..16 "enumerate"
+ R_CURLY@16..17 "}"
+ WHITESPACE@17..18 " "
+ ENUM_ITEM@18..26
+ COMMAND_NAME@18..23 "\\item"
+ WHITESPACE@23..24 " "
+ TEXT@24..26
+ WORD@24..25 "1"
+ WHITESPACE@25..26 " "
+ ENUM_ITEM@26..37
+ COMMAND_NAME@26..31 "\\item"
+ BRACK_GROUP@31..35
+ L_BRACK@31..32 "["
+ TEXT@32..33
+ WORD@32..33 "2"
+ R_BRACK@33..34 "]"
+ WHITESPACE@34..35 " "
+ TEXT@35..37
+ WORD@35..36 "2"
+ WHITESPACE@36..37 " "
+ ENUM_ITEM@37..45
+ COMMAND_NAME@37..42 "\\item"
+ WHITESPACE@42..43 " "
+ TEXT@43..45
+ WORD@43..44 "3"
+ WHITESPACE@44..45 " "
+ END@45..60
+ COMMAND_NAME@45..49 "\\end"
+ CURLY_GROUP_WORD@49..60
+ L_CURLY@49..50 "{"
+ KEY@50..59
+ WORD@50..59 "enumerate"
+ R_CURLY@59..60 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_structure_invalid_nesting() {
+ check(
+ r#"\section{Foo} \chapter{Bar}"#,
+ expect![[r#"
+ ROOT@0..27
+ PREAMBLE@0..27
+ SECTION@0..14
+ COMMAND_NAME@0..8 "\\section"
+ CURLY_GROUP@8..14
+ L_CURLY@8..9 "{"
+ TEXT@9..12
+ WORD@9..12 "Foo"
+ R_CURLY@12..13 "}"
+ WHITESPACE@13..14 " "
+ CHAPTER@14..27
+ COMMAND_NAME@14..22 "\\chapter"
+ CURLY_GROUP@22..27
+ L_CURLY@22..23 "{"
+ TEXT@23..26
+ WORD@23..26 "Bar"
+ R_CURLY@26..27 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_structure_nested() {
+ check(
+ r#"\part{1}\chapter{2}\section{3}\subsection{4}\subsubsection{5}\paragraph{6}\subparagraph{7}"#,
+ expect![[r#"
+ ROOT@0..90
+ PREAMBLE@0..90
+ PART@0..90
+ COMMAND_NAME@0..5 "\\part"
+ CURLY_GROUP@5..8
+ L_CURLY@5..6 "{"
+ TEXT@6..7
+ WORD@6..7 "1"
+ R_CURLY@7..8 "}"
+ CHAPTER@8..90
+ COMMAND_NAME@8..16 "\\chapter"
+ CURLY_GROUP@16..19
+ L_CURLY@16..17 "{"
+ TEXT@17..18
+ WORD@17..18 "2"
+ R_CURLY@18..19 "}"
+ SECTION@19..90
+ COMMAND_NAME@19..27 "\\section"
+ CURLY_GROUP@27..30
+ L_CURLY@27..28 "{"
+ TEXT@28..29
+ WORD@28..29 "3"
+ R_CURLY@29..30 "}"
+ SUBSECTION@30..90
+ COMMAND_NAME@30..41 "\\subsection"
+ CURLY_GROUP@41..44
+ L_CURLY@41..42 "{"
+ TEXT@42..43
+ WORD@42..43 "4"
+ R_CURLY@43..44 "}"
+ SUBSUBSECTION@44..90
+ COMMAND_NAME@44..58 "\\subsubsection"
+ CURLY_GROUP@58..61
+ L_CURLY@58..59 "{"
+ TEXT@59..60
+ WORD@59..60 "5"
+ R_CURLY@60..61 "}"
+ PARAGRAPH@61..90
+ COMMAND_NAME@61..71 "\\paragraph"
+ CURLY_GROUP@71..74
+ L_CURLY@71..72 "{"
+ TEXT@72..73
+ WORD@72..73 "6"
+ R_CURLY@73..74 "}"
+ SUBPARAGRAPH@74..90
+ COMMAND_NAME@74..87 "\\subparagraph"
+ CURLY_GROUP@87..90
+ L_CURLY@87..88 "{"
+ TEXT@88..89
+ WORD@88..89 "7"
+ R_CURLY@89..90 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_structure_siblings() {
+ check(
+ r#"\section{Foo} Foo \section{Bar} Bar"#,
+ expect![[r#"
+ ROOT@0..35
+ PREAMBLE@0..35
+ SECTION@0..18
+ COMMAND_NAME@0..8 "\\section"
+ CURLY_GROUP@8..14
+ L_CURLY@8..9 "{"
+ TEXT@9..12
+ WORD@9..12 "Foo"
+ R_CURLY@12..13 "}"
+ WHITESPACE@13..14 " "
+ TEXT@14..18
+ WORD@14..17 "Foo"
+ WHITESPACE@17..18 " "
+ SECTION@18..35
+ COMMAND_NAME@18..26 "\\section"
+ CURLY_GROUP@26..32
+ L_CURLY@26..27 "{"
+ TEXT@27..30
+ WORD@27..30 "Bar"
+ R_CURLY@30..31 "}"
+ WHITESPACE@31..32 " "
+ TEXT@32..35
+ WORD@32..35 "Bar"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_full() {
+ check(
+ r#"\newtheorem{foo}[bar]{Foo}[baz]"#,
+ expect![[r#"
+ ROOT@0..31
+ PREAMBLE@0..31
+ THEOREM_DEFINITION_AMSTHM@0..31
+ COMMAND_NAME@0..11 "\\newtheorem"
+ CURLY_GROUP_WORD@11..16
+ L_CURLY@11..12 "{"
+ KEY@12..15
+ WORD@12..15 "foo"
+ R_CURLY@15..16 "}"
+ BRACK_GROUP_WORD@16..21
+ L_BRACK@16..17 "["
+ KEY@17..20
+ WORD@17..20 "bar"
+ R_BRACK@20..21 "]"
+ CURLY_GROUP@21..26
+ L_CURLY@21..22 "{"
+ TEXT@22..25
+ WORD@22..25 "Foo"
+ R_CURLY@25..26 "}"
+ BRACK_GROUP_WORD@26..31
+ L_BRACK@26..27 "["
+ KEY@27..30
+ WORD@27..30 "baz"
+ R_BRACK@30..31 "]"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_name_with_counter() {
+ check(
+ r#"\newtheorem{foo}[bar]"#,
+ expect![[r#"
+ ROOT@0..21
+ PREAMBLE@0..21
+ THEOREM_DEFINITION_AMSTHM@0..21
+ COMMAND_NAME@0..11 "\\newtheorem"
+ CURLY_GROUP_WORD@11..16
+ L_CURLY@11..12 "{"
+ KEY@12..15
+ WORD@12..15 "foo"
+ R_CURLY@15..16 "}"
+ BRACK_GROUP_WORD@16..21
+ L_BRACK@16..17 "["
+ KEY@17..20
+ WORD@17..20 "bar"
+ R_BRACK@20..21 "]"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_name_with_description() {
+ check(
+ r#"\newtheorem{foo}{Foo}"#,
+ expect![[r#"
+ ROOT@0..21
+ PREAMBLE@0..21
+ THEOREM_DEFINITION_AMSTHM@0..21
+ COMMAND_NAME@0..11 "\\newtheorem"
+ CURLY_GROUP_WORD@11..16
+ L_CURLY@11..12 "{"
+ KEY@12..15
+ WORD@12..15 "foo"
+ R_CURLY@15..16 "}"
+ CURLY_GROUP@16..21
+ L_CURLY@16..17 "{"
+ TEXT@17..20
+ WORD@17..20 "Foo"
+ R_CURLY@20..21 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_name_with_description_and_counter() {
+ check(
+ r#"\newtheorem{foo}[bar]{Foo}"#,
+ expect![[r#"
+ ROOT@0..26
+ PREAMBLE@0..26
+ THEOREM_DEFINITION_AMSTHM@0..26
+ COMMAND_NAME@0..11 "\\newtheorem"
+ CURLY_GROUP_WORD@11..16
+ L_CURLY@11..12 "{"
+ KEY@12..15
+ WORD@12..15 "foo"
+ R_CURLY@15..16 "}"
+ BRACK_GROUP_WORD@16..21
+ L_BRACK@16..17 "["
+ KEY@17..20
+ WORD@17..20 "bar"
+ R_BRACK@20..21 "]"
+ CURLY_GROUP@21..26
+ L_CURLY@21..22 "{"
+ TEXT@22..25
+ WORD@22..25 "Foo"
+ R_CURLY@25..26 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_only_name() {
+ check(
+ r#"\newtheorem{foo}"#,
+ expect![[r#"
+ ROOT@0..16
+ PREAMBLE@0..16
+ THEOREM_DEFINITION_AMSTHM@0..16
+ COMMAND_NAME@0..11 "\\newtheorem"
+ CURLY_GROUP_WORD@11..16
+ L_CURLY@11..12 "{"
+ KEY@12..15
+ WORD@12..15 "foo"
+ R_CURLY@15..16 "}"
+
+ "#]],
+ );
+}
+
+#[test]
+fn test_theorem_definition_thmtools() {
+ check(
+ r#"\declaretheorem[style=foo, name=bar]{baz}"#,
+ expect![[r#"
+ ROOT@0..41
+ PREAMBLE@0..41
+ THEOREM_DEFINITION_THMTOOLS@0..41
+ COMMAND_NAME@0..15 "\\declaretheorem"
+ BRACK_GROUP_KEY_VALUE@15..36
+ L_BRACK@15..16 "["
+ KEY_VALUE_BODY@16..35
+ KEY_VALUE_PAIR@16..25
+ KEY@16..21
+ WORD@16..21 "style"
+ EQUALITY_SIGN@21..22 "="
+ VALUE@22..25
+ TEXT@22..25
+ WORD@22..25 "foo"
+ COMMA@25..26 ","
+ WHITESPACE@26..27 " "
+ KEY_VALUE_PAIR@27..35
+ KEY@27..31
+ WORD@27..31 "name"
+ EQUALITY_SIGN@31..32 "="
+ VALUE@32..35
+ TEXT@32..35
+ WORD@32..35 "bar"
+ R_BRACK@35..36 "]"
+ CURLY_GROUP_WORD@36..41
+ L_CURLY@36..37 "{"
+ KEY@37..40
+ WORD@37..40 "baz"
+ R_CURLY@40..41 "}"
+
+ "#]],
+ );
+}
diff --git a/support/texlab/crates/parser/src/latexmkrc.rs b/support/texlab/crates/parser/src/latexmkrc.rs
new file mode 100644
index 0000000000..63c92bd353
--- /dev/null
+++ b/support/texlab/crates/parser/src/latexmkrc.rs
@@ -0,0 +1,52 @@
+use syntax::latexmkrc::LatexmkrcData;
+use tempfile::tempdir;
+
+pub fn parse_latexmkrc(_input: &str) -> std::io::Result<LatexmkrcData> {
+ let temp_dir = tempdir()?;
+ let non_existent_tex = temp_dir.path().join("NONEXISTENT.tex");
+
+ // Run `latexmk -dir-report $TMPDIR/NONEXISTENT.tex` to obtain out_dir
+ // and aux_dir values. We pass nonexistent file to prevent latexmk from
+ // building anything, since we need this invocation only to extract the
+ // -dir-report variables.
+ //
+ // In the future, latexmk plans to implement -dir-report-only option and we
+ // won't have to resort to this hack with NONEXISTENT.tex.
+ let output = std::process::Command::new("latexmk")
+ .arg("-dir-report")
+ .arg(non_existent_tex)
+ .output()?;
+
+ let stderr = String::from_utf8_lossy(&output.stderr);
+
+ let (aux_dir, out_dir) = stderr.lines().find_map(extract_dirs).ok_or_else(|| {
+ std::io::Error::new(
+ std::io::ErrorKind::InvalidData,
+ "Normalized aux and out dir were not found in latexmk output",
+ )
+ })?;
+
+ Ok(LatexmkrcData {
+ aux_dir: Some(aux_dir),
+ out_dir: Some(out_dir),
+ })
+}
+
+/// Extracts $aux_dir and $out_dir from lines of the form
+///
+/// Latexmk: Normalized aux dir and out dir: '$aux_dir', '$out_dir'
+fn extract_dirs(line: &str) -> Option<(String, String)> {
+ let mut it = line
+ .strip_prefix("Latexmk: Normalized aux dir and out dir: ")?
+ .split(", ");
+
+ let aux_dir = it.next()?.strip_prefix('\'')?.strip_suffix('\'')?;
+ let out_dir = it.next()?.strip_prefix('\'')?.strip_suffix('\'')?;
+
+ // Ensure there's no more data
+ if it.next().is_some() {
+ return None;
+ }
+
+ Some((String::from(aux_dir), String::from(out_dir)))
+}
diff --git a/support/texlab/crates/parser/src/lib.rs b/support/texlab/crates/parser/src/lib.rs
index fab576a041..2a4190b7e2 100644
--- a/support/texlab/crates/parser/src/lib.rs
+++ b/support/texlab/crates/parser/src/lib.rs
@@ -2,5 +2,9 @@ mod bibtex;
mod build_log;
mod config;
mod latex;
+mod latexmkrc;
-pub use self::{bibtex::parse_bibtex, build_log::parse_build_log, config::*, latex::parse_latex};
+pub use self::{
+ bibtex::parse_bibtex, build_log::parse_build_log, config::*, latex::parse_latex,
+ latexmkrc::parse_latexmkrc,
+};
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
deleted file mode 100644
index 7c665e628a..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@comment.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/comment.txt
----
-ROOT@0..82
- JUNK@0..16 "Some junk here\n\n"
- TYPE@16..24 "@comment"
- JUNK@24..82 "{foo,\n author = {F ..."
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
deleted file mode 100644
index 84c9f86ec0..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_809.txt.snap
+++ /dev/null
@@ -1,32 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/issue_809.txt
----
-ROOT@0..50
- ENTRY@0..50
- TYPE@0..8 "@article"
- L_DELIM@8..9 "{"
- NAME@9..18 "issue_809"
- COMMA@18..19 ","
- WHITESPACE@19..22 "\n "
- FIELD@22..48
- NAME@22..27 "title"
- WHITESPACE@27..28 " "
- EQ@28..29 "="
- WHITESPACE@29..30 " "
- CURLY_GROUP@30..47
- L_CURLY@30..31 "{"
- WORD@31..34 "foo"
- WHITESPACE@34..35 " "
- WORD@35..36 "("
- QUOTE@36..37 "\""
- WHITESPACE@37..38 " "
- WORD@38..42 "bar)"
- WHITESPACE@42..43 " "
- WORD@43..46 "baz"
- R_CURLY@46..47 "}"
- COMMA@47..48 ","
- WHITESPACE@48..49 "\n"
- R_DELIM@49..50 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_945.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_945.txt.snap
deleted file mode 100644
index 11a2955b1c..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@issue_945.txt.snap
+++ /dev/null
@@ -1,27 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/issue_945.txt
----
-ROOT@0..33
- ENTRY@0..33
- TYPE@0..8 "@article"
- L_DELIM@8..9 "{"
- NAME@9..13 "test"
- COMMA@13..14 ","
- WHITESPACE@14..15 " "
- FIELD@15..32
- NAME@15..21 "author"
- WHITESPACE@21..22 " "
- EQ@22..23 "="
- WHITESPACE@23..24 " "
- CURLY_GROUP@24..32
- L_CURLY@24..25 "{"
- ACCENT@25..31
- ACCENT_NAME@25..27 "\\\""
- L_CURLY@27..28 "{"
- COMMAND_NAME@28..30 "\\i"
- R_CURLY@30..31 "}"
- R_CURLY@31..32 "}"
- R_DELIM@32..33 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
deleted file mode 100644
index b0d043b1a7..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@preamble.txt.snap
+++ /dev/null
@@ -1,17 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/preamble.txt
----
-ROOT@0..25
- PREAMBLE@0..25
- TYPE@0..9 "@preamble"
- L_DELIM@9..10 "{"
- QUOTE_GROUP@10..24
- QUOTE@10..11 "\""
- WORD@11..16 "Hello"
- WHITESPACE@16..17 " "
- WORD@17..23 "World!"
- QUOTE@23..24 "\""
- R_DELIM@24..25 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
deleted file mode 100644
index 36db1ebb4c..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aho_2006.txt.snap
+++ /dev/null
@@ -1,132 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/aho_2006.txt
----
-ROOT@0..314
- ENTRY@0..314
- TYPE@0..5 "@book"
- L_DELIM@5..6 "{"
- NAME@6..21 "10.5555/1177220"
- COMMA@21..22 ","
- WHITESPACE@22..27 "\n "
- FIELD@27..111
- NAME@27..33 "author"
- WHITESPACE@33..34 " "
- EQ@34..35 "="
- WHITESPACE@35..36 " "
- CURLY_GROUP@36..110
- L_CURLY@36..37 "{"
- WORD@37..40 "Aho"
- COMMA@40..41 ","
- WHITESPACE@41..42 " "
- WORD@42..48 "Alfred"
- WHITESPACE@48..49 " "
- WORD@49..51 "V."
- WHITESPACE@51..52 " "
- WORD@52..55 "and"
- WHITESPACE@55..56 " "
- WORD@56..59 "Lam"
- COMMA@59..60 ","
- WHITESPACE@60..61 " "
- WORD@61..67 "Monica"
- WHITESPACE@67..68 " "
- WORD@68..70 "S."
- WHITESPACE@70..71 " "
- WORD@71..74 "and"
- WHITESPACE@74..75 " "
- WORD@75..80 "Sethi"
- COMMA@80..81 ","
- WHITESPACE@81..82 " "
- WORD@82..86 "Ravi"
- WHITESPACE@86..87 " "
- WORD@87..90 "and"
- WHITESPACE@90..91 " "
- WORD@91..97 "Ullman"
- COMMA@97..98 ","
- WHITESPACE@98..99 " "
- WORD@99..106 "Jeffrey"
- WHITESPACE@106..107 " "
- WORD@107..109 "D."
- R_CURLY@109..110 "}"
- COMMA@110..111 ","
- WHITESPACE@111..116 "\n "
- FIELD@116..185
- NAME@116..121 "title"
- WHITESPACE@121..122 " "
- EQ@122..123 "="
- WHITESPACE@123..124 " "
- CURLY_GROUP@124..184
- L_CURLY@124..125 "{"
- WORD@125..135 "Compilers:"
- WHITESPACE@135..136 " "
- WORD@136..146 "Principles"
- COMMA@146..147 ","
- WHITESPACE@147..148 " "
- WORD@148..158 "Techniques"
- COMMA@158..159 ","
- WHITESPACE@159..160 " "
- WORD@160..163 "and"
- WHITESPACE@163..164 " "
- WORD@164..169 "Tools"
- WHITESPACE@169..170 " "
- WORD@170..174 "(2nd"
- WHITESPACE@174..175 " "
- WORD@175..183 "Edition)"
- R_CURLY@183..184 "}"
- COMMA@184..185 ","
- WHITESPACE@185..190 "\n "
- FIELD@190..204
- NAME@190..194 "year"
- WHITESPACE@194..195 " "
- EQ@195..196 "="
- WHITESPACE@196..197 " "
- CURLY_GROUP@197..203
- L_CURLY@197..198 "{"
- INTEGER@198..202 "2006"
- R_CURLY@202..203 "}"
- COMMA@203..204 ","
- WHITESPACE@204..209 "\n "
- FIELD@209..229
- NAME@209..213 "isbn"
- WHITESPACE@213..214 " "
- EQ@214..215 "="
- WHITESPACE@215..216 " "
- CURLY_GROUP@216..228
- L_CURLY@216..217 "{"
- INTEGER@217..227 "0321486811"
- R_CURLY@227..228 "}"
- COMMA@228..229 ","
- WHITESPACE@229..234 "\n "
- FIELD@234..292
- NAME@234..243 "publisher"
- WHITESPACE@243..244 " "
- EQ@244..245 "="
- WHITESPACE@245..246 " "
- CURLY_GROUP@246..291
- L_CURLY@246..247 "{"
- WORD@247..261 "Addison-Wesley"
- WHITESPACE@261..262 " "
- WORD@262..269 "Longman"
- WHITESPACE@269..270 " "
- WORD@270..280 "Publishing"
- WHITESPACE@280..281 " "
- WORD@281..284 "Co."
- COMMA@284..285 ","
- WHITESPACE@285..286 " "
- WORD@286..290 "Inc."
- R_CURLY@290..291 "}"
- COMMA@291..292 ","
- WHITESPACE@292..297 "\n "
- FIELD@297..313
- NAME@297..304 "address"
- WHITESPACE@304..305 " "
- EQ@305..306 "="
- WHITESPACE@306..307 " "
- CURLY_GROUP@307..312
- L_CURLY@307..308 "{"
- WORD@308..311 "USA"
- R_CURLY@311..312 "}"
- WHITESPACE@312..313 "\n"
- R_DELIM@313..314 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
deleted file mode 100644
index 6b273d63a2..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__aksin_2006.txt.snap
+++ /dev/null
@@ -1,258 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
----
-ROOT@0..679
- STRING@0..40
- TYPE@0..7 "@string"
- L_DELIM@7..8 "{"
- NAME@8..13 "jomch"
- WHITESPACE@13..16 " "
- EQ@16..17 "="
- WHITESPACE@17..18 " "
- CURLY_GROUP@18..39
- L_CURLY@18..19 "{"
- WORD@19..21 "J."
- NBSP@21..22 "~"
- WORD@22..32 "Organomet."
- WHITESPACE@32..33 " "
- WORD@33..38 "Chem."
- R_CURLY@38..39 "}"
- R_DELIM@39..40 "}"
- JUNK@40..42 "\n\n"
- ENTRY@42..679
- TYPE@42..50 "@article"
- L_DELIM@50..51 "{"
- NAME@51..56 "aksin"
- COMMA@56..57 ","
- WHITESPACE@57..62 "\n "
- FIELD@62..284
- NAME@62..68 "author"
- WHITESPACE@68..75 " "
- EQ@75..76 "="
- WHITESPACE@76..77 " "
- CURLY_GROUP@77..283
- L_CURLY@77..78 "{"
- WORD@78..81 "Aks"
- CURLY_GROUP@81..85
- L_CURLY@81..82 "{"
- COMMAND@82..84
- COMMAND_NAME@82..84 "\\i"
- R_CURLY@84..85 "}"
- WORD@85..86 "n"
- COMMA@86..87 ","
- WHITESPACE@87..88 " "
- CURLY_GROUP@88..93
- L_CURLY@88..89 "{"
- ACCENT@89..92
- ACCENT_NAME@89..91 "\\\""
- WORD@91..92 "O"
- R_CURLY@92..93 "}"
- WORD@93..96 "zge"
- WHITESPACE@96..97 " "
- WORD@97..100 "and"
- WHITESPACE@100..101 " "
- WORD@101..102 "T"
- CURLY_GROUP@102..107
- L_CURLY@102..103 "{"
- ACCENT@103..106
- ACCENT_NAME@103..105 "\\\""
- WORD@105..106 "u"
- R_CURLY@106..107 "}"
- WORD@107..112 "rkmen"
- COMMA@112..113 ","
- WHITESPACE@113..114 " "
- WORD@114..120 "Hayati"
- WHITESPACE@120..121 " "
- WORD@121..124 "and"
- WHITESPACE@124..125 " "
- WORD@125..130 "Artok"
- COMMA@130..131 ","
- WHITESPACE@131..132 " "
- WORD@132..138 "Levent"
- WHITESPACE@138..159 "\n "
- WORD@159..162 "and"
- WHITESPACE@162..163 " "
- CURLY_GROUP@163..170
- L_CURLY@163..164 "{"
- ACCENT@164..169
- ACCENT_NAME@164..166 "\\c"
- L_CURLY@166..167 "{"
- WORD@167..168 "C"
- R_CURLY@168..169 "}"
- R_CURLY@169..170 "}"
- WORD@170..178 "etinkaya"
- COMMA@178..179 ","
- WHITESPACE@179..180 " "
- WORD@180..185 "Bekir"
- WHITESPACE@185..186 " "
- WORD@186..189 "and"
- WHITESPACE@189..190 " "
- WORD@190..192 "Ni"
- COMMA@192..193 ","
- WHITESPACE@193..194 " "
- WORD@194..202 "Chaoying"
- WHITESPACE@202..203 " "
- WORD@203..206 "and"
- WHITESPACE@206..227 "\n "
- WORD@227..228 "B"
- CURLY_GROUP@228..233
- L_CURLY@228..229 "{"
- ACCENT@229..232
- ACCENT_NAME@229..231 "\\\""
- WORD@231..232 "u"
- R_CURLY@232..233 "}"
- WORD@233..234 "y"
- CURLY_GROUP@234..239
- L_CURLY@234..235 "{"
- ACCENT@235..238
- ACCENT_NAME@235..237 "\\\""
- WORD@237..238 "u"
- R_CURLY@238..239 "}"
- WORD@239..241 "kg"
- CURLY_GROUP@241..246
- L_CURLY@241..242 "{"
- ACCENT@242..245
- ACCENT_NAME@242..244 "\\\""
- WORD@244..245 "u"
- R_CURLY@245..246 "}"
- WORD@246..248 "ng"
- CURLY_GROUP@248..253
- L_CURLY@248..249 "{"
- ACCENT@249..252
- ACCENT_NAME@249..251 "\\\""
- WORD@251..252 "o"
- R_CURLY@252..253 "}"
- WORD@253..254 "r"
- COMMA@254..255 ","
- WHITESPACE@255..256 " "
- WORD@256..261 "Orhan"
- WHITESPACE@261..262 " "
- WORD@262..265 "and"
- WHITESPACE@265..266 " "
- CURLY_GROUP@266..271
- L_CURLY@266..267 "{"
- ACCENT@267..270
- ACCENT_NAME@267..269 "\\\""
- WORD@269..270 "O"
- R_CURLY@270..271 "}"
- WORD@271..275 "zkal"
- COMMA@275..276 ","
- WHITESPACE@276..277 " "
- WORD@277..282 "Erhan"
- R_CURLY@282..283 "}"
- COMMA@283..284 ","
- WHITESPACE@284..289 "\n "
- FIELD@289..471
- NAME@289..294 "title"
- WHITESPACE@294..302 " "
- EQ@302..303 "="
- WHITESPACE@303..304 " "
- CURLY_GROUP@304..470
- L_CURLY@304..305 "{"
- WORD@305..311 "Effect"
- WHITESPACE@311..312 " "
- WORD@312..314 "of"
- WHITESPACE@314..315 " "
- WORD@315..329 "immobilization"
- WHITESPACE@329..330 " "
- WORD@330..332 "on"
- WHITESPACE@332..333 " "
- WORD@333..342 "catalytic"
- WHITESPACE@342..343 " "
- WORD@343..358 "characteristics"
- WHITESPACE@358..359 " "
- WORD@359..361 "of"
- WHITESPACE@361..382 "\n "
- WORD@382..391 "saturated"
- WHITESPACE@391..392 " "
- CURLY_GROUP@392..398
- L_CURLY@392..393 "{"
- WORD@393..397 "Pd-N"
- R_CURLY@397..398 "}"
- WORD@398..411 "-heterocyclic"
- WHITESPACE@411..412 " "
- WORD@412..420 "carbenes"
- WHITESPACE@420..421 " "
- WORD@421..423 "in"
- WHITESPACE@423..424 " "
- CURLY_GROUP@424..439
- L_CURLY@424..425 "{"
- WORD@425..438 "Mizoroki-Heck"
- R_CURLY@438..439 "}"
- WHITESPACE@439..460 "\n "
- WORD@460..469 "reactions"
- R_CURLY@469..470 "}"
- COMMA@470..471 ","
- WHITESPACE@471..476 "\n "
- FIELD@476..497
- NAME@476..488 "journaltitle"
- WHITESPACE@488..489 " "
- EQ@489..490 "="
- WHITESPACE@490..491 " "
- LITERAL@491..496
- NAME@491..496 "jomch"
- COMMA@496..497 ","
- WHITESPACE@497..502 "\n "
- FIELD@502..522
- NAME@502..506 "date"
- WHITESPACE@506..515 " "
- EQ@515..516 "="
- WHITESPACE@516..517 " "
- LITERAL@517..521
- INTEGER@517..521 "2006"
- COMMA@521..522 ","
- WHITESPACE@522..527 "\n "
- FIELD@527..546
- NAME@527..533 "volume"
- WHITESPACE@533..540 " "
- EQ@540..541 "="
- WHITESPACE@541..542 " "
- LITERAL@542..545
- INTEGER@542..545 "691"
- COMMA@545..546 ","
- WHITESPACE@546..551 "\n "
- FIELD@551..569
- NAME@551..557 "number"
- WHITESPACE@557..564 " "
- EQ@564..565 "="
- WHITESPACE@565..566 " "
- LITERAL@566..568
- INTEGER@566..568 "13"
- COMMA@568..569 ","
- WHITESPACE@569..574 "\n "
- FIELD@574..601
- NAME@574..579 "pages"
- WHITESPACE@579..587 " "
- EQ@587..588 "="
- WHITESPACE@588..589 " "
- CURLY_GROUP@589..600
- L_CURLY@589..590 "{"
- WORD@590..599 "3027-3036"
- R_CURLY@599..600 "}"
- COMMA@600..601 ","
- WHITESPACE@601..606 "\n "
- FIELD@606..677
- NAME@606..616 "indextitle"
- WHITESPACE@616..619 " "
- EQ@619..620 "="
- WHITESPACE@620..621 " "
- CURLY_GROUP@621..676
- L_CURLY@621..622 "{"
- WORD@622..628 "Effect"
- WHITESPACE@628..629 " "
- WORD@629..631 "of"
- WHITESPACE@631..632 " "
- WORD@632..646 "immobilization"
- WHITESPACE@646..647 " "
- WORD@647..649 "on"
- WHITESPACE@649..650 " "
- WORD@650..659 "catalytic"
- WHITESPACE@659..660 " "
- WORD@660..675 "characteristics"
- R_CURLY@675..676 "}"
- COMMA@676..677 ","
- WHITESPACE@677..678 "\n"
- R_DELIM@678..679 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
deleted file mode 100644
index 280dd5a4cf..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__almendro_1998.txt.snap
+++ /dev/null
@@ -1,246 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
----
-ROOT@0..706
- ENTRY@0..706
- TYPE@0..7 "@patent"
- L_DELIM@7..8 "{"
- NAME@8..16 "almendro"
- COMMA@16..17 ","
- WHITESPACE@17..22 "\n "
- FIELD@22..150
- NAME@22..28 "author"
- WHITESPACE@28..35 " "
- EQ@35..36 "="
- WHITESPACE@36..37 " "
- CURLY_GROUP@37..149
- L_CURLY@37..38 "{"
- WORD@38..46 "Almendro"
- COMMA@46..47 ","
- WHITESPACE@47..48 " "
- WORD@48..51 "Jos"
- CURLY_GROUP@51..56
- L_CURLY@51..52 "{"
- ACCENT@52..55
- ACCENT_NAME@52..54 "\\'"
- WORD@54..55 "e"
- R_CURLY@55..56 "}"
- WHITESPACE@56..57 " "
- WORD@57..59 "L."
- WHITESPACE@59..60 " "
- WORD@60..63 "and"
- WHITESPACE@63..64 " "
- WORD@64..68 "Mart"
- CURLY_GROUP@68..73
- L_CURLY@68..69 "{"
- ACCENT@69..72
- ACCENT_NAME@69..71 "\\'"
- WORD@71..72 "i"
- R_CURLY@72..73 "}"
- WORD@73..74 "n"
- COMMA@74..75 ","
- WHITESPACE@75..76 " "
- WORD@76..83 "Jacinto"
- WHITESPACE@83..84 " "
- WORD@84..87 "and"
- WHITESPACE@87..88 " "
- WORD@88..89 "S"
- CURLY_GROUP@89..94
- L_CURLY@89..90 "{"
- ACCENT@90..93
- ACCENT_NAME@90..92 "\\'"
- WORD@92..93 "a"
- R_CURLY@93..94 "}"
- WORD@94..99 "nchez"
- COMMA@99..100 ","
- WHITESPACE@100..121 "\n "
- WORD@121..128 "Alberto"
- WHITESPACE@128..129 " "
- WORD@129..132 "and"
- WHITESPACE@132..133 " "
- WORD@133..138 "Nozal"
- COMMA@138..139 ","
- WHITESPACE@139..140 " "
- WORD@140..148 "Fernando"
- R_CURLY@148..149 "}"
- COMMA@149..150 ","
- WHITESPACE@150..155 "\n "
- FIELD@155..203
- NAME@155..160 "title"
- WHITESPACE@160..168 " "
- EQ@168..169 "="
- WHITESPACE@169..170 " "
- CURLY_GROUP@170..202
- L_CURLY@170..171 "{"
- WORD@171..190 "Elektromagnetisches"
- WHITESPACE@190..191 " "
- WORD@191..201 "Signalhorn"
- R_CURLY@201..202 "}"
- COMMA@202..203 ","
- WHITESPACE@203..208 "\n "
- FIELD@208..238
- NAME@208..214 "number"
- WHITESPACE@214..221 " "
- EQ@221..222 "="
- WHITESPACE@222..223 " "
- CURLY_GROUP@223..237
- L_CURLY@223..224 "{"
- WORD@224..236 "EU-29702195U"
- R_CURLY@236..237 "}"
- COMMA@237..238 ","
- WHITESPACE@238..243 "\n "
- FIELD@243..263
- NAME@243..247 "date"
- WHITESPACE@247..256 " "
- EQ@256..257 "="
- WHITESPACE@257..258 " "
- LITERAL@258..262
- INTEGER@258..262 "1998"
- COMMA@262..263 ","
- WHITESPACE@263..268 "\n "
- FIELD@268..323
- NAME@268..276 "location"
- WHITESPACE@276..281 " "
- EQ@281..282 "="
- WHITESPACE@282..283 " "
- CURLY_GROUP@283..322
- L_CURLY@283..284 "{"
- WORD@284..293 "countryfr"
- WHITESPACE@293..294 " "
- WORD@294..297 "and"
- WHITESPACE@297..298 " "
- WORD@298..307 "countryuk"
- WHITESPACE@307..308 " "
- WORD@308..311 "and"
- WHITESPACE@311..312 " "
- WORD@312..321 "countryde"
- R_CURLY@321..322 "}"
- COMMA@322..323 ","
- WHITESPACE@323..328 "\n "
- FIELD@328..352
- NAME@328..334 "langid"
- WHITESPACE@334..341 " "
- EQ@341..342 "="
- WHITESPACE@342..343 " "
- CURLY_GROUP@343..351
- L_CURLY@343..344 "{"
- WORD@344..350 "german"
- R_CURLY@350..351 "}"
- COMMA@351..352 ","
- WHITESPACE@352..357 "\n "
- FIELD@357..704
- NAME@357..367 "annotation"
- WHITESPACE@367..370 " "
- EQ@370..371 "="
- WHITESPACE@371..372 " "
- CURLY_GROUP@372..703
- L_CURLY@372..373 "{"
- WORD@373..377 "This"
- WHITESPACE@377..378 " "
- WORD@378..380 "is"
- WHITESPACE@380..381 " "
- WORD@381..382 "a"
- WHITESPACE@382..383 " "
- COMMAND@383..390
- COMMAND_NAME@383..390 "\\texttt"
- CURLY_GROUP@390..398
- L_CURLY@390..391 "{"
- WORD@391..397 "patent"
- R_CURLY@397..398 "}"
- WHITESPACE@398..399 " "
- WORD@399..404 "entry"
- WHITESPACE@404..405 " "
- WORD@405..409 "with"
- WHITESPACE@409..410 " "
- WORD@410..411 "a"
- WHITESPACE@411..412 " "
- COMMAND@412..419
- COMMAND_NAME@412..419 "\\texttt"
- CURLY_GROUP@419..429
- L_CURLY@419..420 "{"
- WORD@420..428 "location"
- R_CURLY@428..429 "}"
- WHITESPACE@429..450 "\n "
- WORD@450..456 "field."
- WHITESPACE@456..457 " "
- WORD@457..460 "The"
- WHITESPACE@460..461 " "
- WORD@461..467 "number"
- WHITESPACE@467..468 " "
- WORD@468..470 "is"
- WHITESPACE@470..471 " "
- WORD@471..476 "given"
- WHITESPACE@476..477 " "
- WORD@477..479 "in"
- WHITESPACE@479..480 " "
- WORD@480..483 "the"
- WHITESPACE@483..484 " "
- COMMAND@484..491
- COMMAND_NAME@484..491 "\\texttt"
- CURLY_GROUP@491..499
- L_CURLY@491..492 "{"
- WORD@492..498 "number"
- R_CURLY@498..499 "}"
- WHITESPACE@499..500 " "
- WORD@500..506 "field."
- WHITESPACE@506..507 " "
- WORD@507..511 "Note"
- WHITESPACE@511..532 "\n "
- WORD@532..535 "the"
- WHITESPACE@535..536 " "
- WORD@536..542 "format"
- WHITESPACE@542..543 " "
- WORD@543..545 "of"
- WHITESPACE@545..546 " "
- WORD@546..549 "the"
- WHITESPACE@549..550 " "
- COMMAND@550..557
- COMMAND_NAME@550..557 "\\texttt"
- CURLY_GROUP@557..567
- L_CURLY@557..558 "{"
- WORD@558..566 "location"
- R_CURLY@566..567 "}"
- WHITESPACE@567..568 " "
- WORD@568..573 "field"
- WHITESPACE@573..574 " "
- WORD@574..576 "in"
- WHITESPACE@576..577 " "
- WORD@577..580 "the"
- WHITESPACE@580..581 " "
- WORD@581..589 "database"
- WHITESPACE@589..610 "\n "
- WORD@610..615 "file."
- WHITESPACE@615..616 " "
- WORD@616..623 "Compare"
- WHITESPACE@623..624 " "
- COMMAND@624..631
- COMMAND_NAME@624..631 "\\texttt"
- CURLY_GROUP@631..643
- L_CURLY@631..632 "{"
- WORD@632..642 "laufenberg"
- R_CURLY@642..643 "}"
- COMMA@643..644 ","
- WHITESPACE@644..645 " "
- COMMAND@645..652
- COMMAND_NAME@645..652 "\\texttt"
- CURLY_GROUP@652..660
- L_CURLY@652..653 "{"
- WORD@653..659 "sorace"
- R_CURLY@659..660 "}"
- COMMA@660..661 ","
- WHITESPACE@661..662 " "
- WORD@662..665 "and"
- WHITESPACE@665..686 "\n "
- COMMAND@686..693
- COMMAND_NAME@686..693 "\\texttt"
- CURLY_GROUP@693..702
- L_CURLY@693..694 "{"
- WORD@694..701 "kowalik"
- R_CURLY@701..702 "}"
- R_CURLY@702..703 "}"
- COMMA@703..704 ","
- WHITESPACE@704..705 "\n"
- R_DELIM@705..706 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
deleted file mode 100644
index 8fb5a718d0..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__averroes_1998.txt.snap
+++ /dev/null
@@ -1,351 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
----
-ROOT@0..1008
- ENTRY@0..1008
- TYPE@0..5 "@book"
- L_DELIM@5..6 "{"
- NAME@6..20 "averroes/bland"
- COMMA@20..21 ","
- WHITESPACE@21..26 "\n "
- FIELD@26..52
- NAME@26..32 "author"
- WHITESPACE@32..39 " "
- EQ@39..40 "="
- WHITESPACE@40..41 " "
- CURLY_GROUP@41..51
- L_CURLY@41..42 "{"
- WORD@42..50 "Averroes"
- R_CURLY@50..51 "}"
- COMMA@51..52 ","
- WHITESPACE@52..57 "\n "
- FIELD@57..220
- NAME@57..62 "title"
- WHITESPACE@62..70 " "
- EQ@70..71 "="
- WHITESPACE@71..72 " "
- CURLY_GROUP@72..219
- L_CURLY@72..73 "{"
- WORD@73..76 "The"
- WHITESPACE@76..77 " "
- WORD@77..84 "Epistle"
- WHITESPACE@84..85 " "
- WORD@85..87 "on"
- WHITESPACE@87..88 " "
- WORD@88..91 "the"
- WHITESPACE@91..92 " "
- WORD@92..103 "Possibility"
- WHITESPACE@103..104 " "
- WORD@104..106 "of"
- WHITESPACE@106..107 " "
- WORD@107..118 "Conjunction"
- WHITESPACE@118..119 " "
- WORD@119..123 "with"
- WHITESPACE@123..124 " "
- WORD@124..127 "the"
- WHITESPACE@127..128 " "
- WORD@128..134 "Active"
- WHITESPACE@134..155 "\n "
- WORD@155..164 "Intellect"
- WHITESPACE@164..165 " "
- WORD@165..167 "by"
- WHITESPACE@167..168 " "
- CURLY_GROUP@168..179
- L_CURLY@168..169 "{"
- WORD@169..172 "Ibn"
- WHITESPACE@172..173 " "
- WORD@173..178 "Rushd"
- R_CURLY@178..179 "}"
- WHITESPACE@179..180 " "
- WORD@180..184 "with"
- WHITESPACE@184..185 " "
- WORD@185..188 "the"
- WHITESPACE@188..189 " "
- WORD@189..199 "Commentary"
- WHITESPACE@199..200 " "
- WORD@200..202 "of"
- WHITESPACE@202..203 " "
- CURLY_GROUP@203..218
- L_CURLY@203..204 "{"
- WORD@204..209 "Moses"
- WHITESPACE@209..210 " "
- WORD@210..217 "Narboni"
- R_CURLY@217..218 "}"
- R_CURLY@218..219 "}"
- COMMA@219..220 ","
- WHITESPACE@220..225 "\n "
- FIELD@225..245
- NAME@225..229 "date"
- WHITESPACE@229..238 " "
- EQ@238..239 "="
- WHITESPACE@239..240 " "
- LITERAL@240..244
- INTEGER@240..244 "1982"
- COMMA@244..245 ","
- WHITESPACE@245..250 "\n "
- FIELD@250..284
- NAME@250..256 "editor"
- WHITESPACE@256..263 " "
- EQ@263..264 "="
- WHITESPACE@264..265 " "
- CURLY_GROUP@265..283
- L_CURLY@265..266 "{"
- WORD@266..271 "Bland"
- COMMA@271..272 ","
- WHITESPACE@272..273 " "
- WORD@273..279 "Kalman"
- WHITESPACE@279..280 " "
- WORD@280..282 "P."
- R_CURLY@282..283 "}"
- COMMA@283..284 ","
- WHITESPACE@284..289 "\n "
- FIELD@289..323
- NAME@289..299 "translator"
- WHITESPACE@299..302 " "
- EQ@302..303 "="
- WHITESPACE@303..304 " "
- CURLY_GROUP@304..322
- L_CURLY@304..305 "{"
- WORD@305..310 "Bland"
- COMMA@310..311 ","
- WHITESPACE@311..312 " "
- WORD@312..318 "Kalman"
- WHITESPACE@318..319 " "
- WORD@319..321 "P."
- R_CURLY@321..322 "}"
- COMMA@322..323 ","
- WHITESPACE@323..328 "\n "
- FIELD@328..407
- NAME@328..334 "series"
- WHITESPACE@334..341 " "
- EQ@341..342 "="
- WHITESPACE@342..343 " "
- CURLY_GROUP@343..406
- L_CURLY@343..344 "{"
- WORD@344..353 "Moreshet:"
- WHITESPACE@353..354 " "
- WORD@354..361 "Studies"
- WHITESPACE@361..362 " "
- WORD@362..364 "in"
- WHITESPACE@364..365 " "
- CURLY_GROUP@365..373
- L_CURLY@365..366 "{"
- WORD@366..372 "Jewish"
- R_CURLY@372..373 "}"
- WHITESPACE@373..374 " "
- WORD@374..381 "History"
- COMMA@381..382 ","
- WHITESPACE@382..383 " "
- WORD@383..393 "Literature"
- WHITESPACE@393..394 " "
- WORD@394..397 "and"
- WHITESPACE@397..398 " "
- WORD@398..405 "Thought"
- R_CURLY@405..406 "}"
- COMMA@406..407 ","
- WHITESPACE@407..412 "\n "
- FIELD@412..429
- NAME@412..418 "number"
- WHITESPACE@418..425 " "
- EQ@425..426 "="
- WHITESPACE@426..427 " "
- LITERAL@427..428
- INTEGER@427..428 "7"
- COMMA@428..429 ","
- WHITESPACE@429..434 "\n "
- FIELD@434..490
- NAME@434..443 "publisher"
- WHITESPACE@443..447 " "
- EQ@447..448 "="
- WHITESPACE@448..449 " "
- CURLY_GROUP@449..489
- L_CURLY@449..450 "{"
- WORD@450..456 "Jewish"
- WHITESPACE@456..457 " "
- WORD@457..468 "Theological"
- WHITESPACE@468..469 " "
- WORD@469..477 "Seminary"
- WHITESPACE@477..478 " "
- WORD@478..480 "of"
- WHITESPACE@480..481 " "
- WORD@481..488 "America"
- R_CURLY@488..489 "}"
- COMMA@489..490 ","
- WHITESPACE@490..495 "\n "
- FIELD@495..521
- NAME@495..503 "location"
- WHITESPACE@503..508 " "
- EQ@508..509 "="
- WHITESPACE@509..510 " "
- CURLY_GROUP@510..520
- L_CURLY@510..511 "{"
- WORD@511..514 "New"
- WHITESPACE@514..515 " "
- WORD@515..519 "York"
- R_CURLY@519..520 "}"
- COMMA@520..521 ","
- WHITESPACE@521..526 "\n "
- FIELD@526..551
- NAME@526..534 "keywords"
- WHITESPACE@534..539 " "
- EQ@539..540 "="
- WHITESPACE@540..541 " "
- CURLY_GROUP@541..550
- L_CURLY@541..542 "{"
- WORD@542..549 "primary"
- R_CURLY@549..550 "}"
- COMMA@550..551 ","
- WHITESPACE@551..556 "\n "
- FIELD@556..581
- NAME@556..562 "langid"
- WHITESPACE@562..569 " "
- EQ@569..570 "="
- WHITESPACE@570..571 " "
- CURLY_GROUP@571..580
- L_CURLY@571..572 "{"
- WORD@572..579 "english"
- R_CURLY@579..580 "}"
- COMMA@580..581 ","
- WHITESPACE@581..586 "\n "
- FIELD@586..620
- NAME@586..596 "langidopts"
- WHITESPACE@596..599 " "
- EQ@599..600 "="
- WHITESPACE@600..601 " "
- CURLY_GROUP@601..619
- L_CURLY@601..602 "{"
- WORD@602..618 "variant=american"
- R_CURLY@618..619 "}"
- COMMA@619..620 ","
- WHITESPACE@620..625 "\n "
- FIELD@625..689
- NAME@625..635 "indextitle"
- WHITESPACE@635..638 " "
- EQ@638..639 "="
- WHITESPACE@639..640 " "
- CURLY_GROUP@640..688
- L_CURLY@640..641 "{"
- WORD@641..648 "Epistle"
- WHITESPACE@648..649 " "
- WORD@649..651 "on"
- WHITESPACE@651..652 " "
- WORD@652..655 "the"
- WHITESPACE@655..656 " "
- WORD@656..667 "Possibility"
- WHITESPACE@667..668 " "
- WORD@668..670 "of"
- WHITESPACE@670..671 " "
- WORD@671..682 "Conjunction"
- COMMA@682..683 ","
- WHITESPACE@683..684 " "
- WORD@684..687 "The"
- R_CURLY@687..688 "}"
- COMMA@688..689 ","
- WHITESPACE@689..694 "\n "
- FIELD@694..738
- NAME@694..704 "shorttitle"
- WHITESPACE@704..707 " "
- EQ@707..708 "="
- WHITESPACE@708..709 " "
- CURLY_GROUP@709..737
- L_CURLY@709..710 "{"
- WORD@710..721 "Possibility"
- WHITESPACE@721..722 " "
- WORD@722..724 "of"
- WHITESPACE@724..725 " "
- WORD@725..736 "Conjunction"
- R_CURLY@736..737 "}"
- COMMA@737..738 ","
- WHITESPACE@738..743 "\n "
- FIELD@743..1006
- NAME@743..753 "annotation"
- WHITESPACE@753..756 " "
- EQ@756..757 "="
- WHITESPACE@757..758 " "
- CURLY_GROUP@758..1005
- L_CURLY@758..759 "{"
- WORD@759..760 "A"
- WHITESPACE@760..761 " "
- COMMAND@761..768
- COMMAND_NAME@761..768 "\\texttt"
- CURLY_GROUP@768..774
- L_CURLY@768..769 "{"
- WORD@769..773 "book"
- R_CURLY@773..774 "}"
- WHITESPACE@774..775 " "
- WORD@775..780 "entry"
- WHITESPACE@780..781 " "
- WORD@781..785 "with"
- WHITESPACE@785..786 " "
- WORD@786..787 "a"
- WHITESPACE@787..788 " "
- COMMAND@788..795
- COMMAND_NAME@788..795 "\\texttt"
- CURLY_GROUP@795..803
- L_CURLY@795..796 "{"
- WORD@796..802 "series"
- R_CURLY@802..803 "}"
- WHITESPACE@803..804 " "
- WORD@804..807 "and"
- WHITESPACE@807..808 " "
- WORD@808..809 "a"
- WHITESPACE@809..830 "\n "
- COMMAND@830..837
- COMMAND_NAME@830..837 "\\texttt"
- CURLY_GROUP@837..845
- L_CURLY@837..838 "{"
- WORD@838..844 "number"
- R_CURLY@844..845 "}"
- WORD@845..846 "."
- WHITESPACE@846..847 " "
- WORD@847..851 "Note"
- WHITESPACE@851..852 " "
- WORD@852..855 "the"
- WHITESPACE@855..856 " "
- WORD@856..869 "concatenation"
- WHITESPACE@869..870 " "
- WORD@870..872 "of"
- WHITESPACE@872..873 " "
- WORD@873..876 "the"
- WHITESPACE@876..877 " "
- COMMAND@877..884
- COMMAND_NAME@877..884 "\\texttt"
- CURLY_GROUP@884..892
- L_CURLY@884..885 "{"
- WORD@885..891 "editor"
- R_CURLY@891..892 "}"
- WHITESPACE@892..913 "\n "
- WORD@913..916 "and"
- WHITESPACE@916..917 " "
- COMMAND@917..924
- COMMAND_NAME@917..924 "\\texttt"
- CURLY_GROUP@924..936
- L_CURLY@924..925 "{"
- WORD@925..935 "translator"
- R_CURLY@935..936 "}"
- WHITESPACE@936..937 " "
- WORD@937..943 "fields"
- WHITESPACE@943..944 " "
- WORD@944..946 "as"
- WHITESPACE@946..947 " "
- WORD@947..951 "well"
- WHITESPACE@951..952 " "
- WORD@952..954 "as"
- WHITESPACE@954..955 " "
- WORD@955..958 "the"
- WHITESPACE@958..979 "\n "
- COMMAND@979..986
- COMMAND_NAME@979..986 "\\texttt"
- CURLY_GROUP@986..998
- L_CURLY@986..987 "{"
- WORD@987..997 "indextitle"
- R_CURLY@997..998 "}"
- WHITESPACE@998..999 " "
- WORD@999..1004 "field"
- R_CURLY@1004..1005 "}"
- COMMA@1005..1006 ","
- WHITESPACE@1006..1007 "\n"
- R_DELIM@1007..1008 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
deleted file mode 100644
index 417041cde4..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__betram_1996.txt.snap
+++ /dev/null
@@ -1,208 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/betram_1996.txt
----
-ROOT@0..556
- STRING@0..40
- TYPE@0..7 "@string"
- L_DELIM@7..8 "{"
- NAME@8..12 "jams"
- WHITESPACE@12..16 " "
- EQ@16..17 "="
- WHITESPACE@17..18 " "
- CURLY_GROUP@18..39
- L_CURLY@18..19 "{"
- WORD@19..21 "J."
- NBSP@21..22 "~"
- WORD@22..27 "Amer."
- WHITESPACE@27..28 " "
- WORD@28..33 "Math."
- WHITESPACE@33..34 " "
- WORD@34..38 "Soc."
- R_CURLY@38..39 "}"
- R_DELIM@39..40 "}"
- JUNK@40..42 "\n\n"
- ENTRY@42..556
- TYPE@42..50 "@article"
- L_DELIM@50..51 "{"
- NAME@51..58 "bertram"
- COMMA@58..59 ","
- WHITESPACE@59..64 "\n "
- FIELD@64..119
- NAME@64..70 "author"
- WHITESPACE@70..77 " "
- EQ@77..78 "="
- WHITESPACE@78..79 " "
- CURLY_GROUP@79..118
- L_CURLY@79..80 "{"
- WORD@80..87 "Bertram"
- COMMA@87..88 ","
- WHITESPACE@88..89 " "
- WORD@89..94 "Aaron"
- WHITESPACE@94..95 " "
- WORD@95..98 "and"
- WHITESPACE@98..99 " "
- WORD@99..108 "Wentworth"
- COMMA@108..109 ","
- WHITESPACE@109..110 " "
- WORD@110..117 "Richard"
- R_CURLY@117..118 "}"
- COMMA@118..119 ","
- WHITESPACE@119..124 "\n "
- FIELD@124..202
- NAME@124..129 "title"
- WHITESPACE@129..137 " "
- EQ@137..138 "="
- WHITESPACE@138..139 " "
- CURLY_GROUP@139..201
- L_CURLY@139..140 "{"
- WORD@140..146 "Gromov"
- WHITESPACE@146..147 " "
- WORD@147..157 "invariants"
- WHITESPACE@157..158 " "
- WORD@158..161 "for"
- WHITESPACE@161..162 " "
- WORD@162..173 "holomorphic"
- WHITESPACE@173..174 " "
- WORD@174..178 "maps"
- WHITESPACE@178..179 " "
- WORD@179..181 "on"
- WHITESPACE@181..182 " "
- CURLY_GROUP@182..191
- L_CURLY@182..183 "{"
- WORD@183..190 "Riemann"
- R_CURLY@190..191 "}"
- WHITESPACE@191..192 " "
- WORD@192..200 "surfaces"
- R_CURLY@200..201 "}"
- COMMA@201..202 ","
- WHITESPACE@202..207 "\n "
- FIELD@207..227
- NAME@207..219 "journaltitle"
- WHITESPACE@219..220 " "
- EQ@220..221 "="
- WHITESPACE@221..222 " "
- LITERAL@222..226
- NAME@222..226 "jams"
- COMMA@226..227 ","
- WHITESPACE@227..232 "\n "
- FIELD@232..252
- NAME@232..236 "date"
- WHITESPACE@236..245 " "
- EQ@245..246 "="
- WHITESPACE@246..247 " "
- LITERAL@247..251
- INTEGER@247..251 "1996"
- COMMA@251..252 ","
- WHITESPACE@252..257 "\n "
- FIELD@257..274
- NAME@257..263 "volume"
- WHITESPACE@263..270 " "
- EQ@270..271 "="
- WHITESPACE@271..272 " "
- LITERAL@272..273
- INTEGER@272..273 "9"
- COMMA@273..274 ","
- WHITESPACE@274..279 "\n "
- FIELD@279..296
- NAME@279..285 "number"
- WHITESPACE@285..292 " "
- EQ@292..293 "="
- WHITESPACE@293..294 " "
- LITERAL@294..295
- INTEGER@294..295 "2"
- COMMA@295..296 ","
- WHITESPACE@296..301 "\n "
- FIELD@301..326
- NAME@301..306 "pages"
- WHITESPACE@306..314 " "
- EQ@314..315 "="
- WHITESPACE@315..316 " "
- CURLY_GROUP@316..325
- L_CURLY@316..317 "{"
- WORD@317..324 "529-571"
- R_CURLY@324..325 "}"
- COMMA@325..326 ","
- WHITESPACE@326..331 "\n "
- FIELD@331..356
- NAME@331..337 "langid"
- WHITESPACE@337..344 " "
- EQ@344..345 "="
- WHITESPACE@345..346 " "
- CURLY_GROUP@346..355
- L_CURLY@346..347 "{"
- WORD@347..354 "english"
- R_CURLY@354..355 "}"
- COMMA@355..356 ","
- WHITESPACE@356..361 "\n "
- FIELD@361..395
- NAME@361..371 "langidopts"
- WHITESPACE@371..374 " "
- EQ@374..375 "="
- WHITESPACE@375..376 " "
- CURLY_GROUP@376..394
- L_CURLY@376..377 "{"
- WORD@377..393 "variant=american"
- R_CURLY@393..394 "}"
- COMMA@394..395 ","
- WHITESPACE@395..400 "\n "
- FIELD@400..435
- NAME@400..410 "shorttitle"
- WHITESPACE@410..413 " "
- EQ@413..414 "="
- WHITESPACE@414..415 " "
- CURLY_GROUP@415..434
- L_CURLY@415..416 "{"
- WORD@416..422 "Gromov"
- WHITESPACE@422..423 " "
- WORD@423..433 "invariants"
- R_CURLY@433..434 "}"
- COMMA@434..435 ","
- WHITESPACE@435..440 "\n "
- FIELD@440..554
- NAME@440..450 "annotation"
- WHITESPACE@450..453 " "
- EQ@453..454 "="
- WHITESPACE@454..455 " "
- CURLY_GROUP@455..553
- L_CURLY@455..456 "{"
- WORD@456..458 "An"
- WHITESPACE@458..459 " "
- COMMAND@459..466
- COMMAND_NAME@459..466 "\\texttt"
- CURLY_GROUP@466..475
- L_CURLY@466..467 "{"
- WORD@467..474 "article"
- R_CURLY@474..475 "}"
- WHITESPACE@475..476 " "
- WORD@476..481 "entry"
- WHITESPACE@481..482 " "
- WORD@482..486 "with"
- WHITESPACE@486..487 " "
- WORD@487..488 "a"
- WHITESPACE@488..489 " "
- COMMAND@489..496
- COMMAND_NAME@489..496 "\\texttt"
- CURLY_GROUP@496..504
- L_CURLY@496..497 "{"
- WORD@497..503 "volume"
- R_CURLY@503..504 "}"
- WHITESPACE@504..505 " "
- WORD@505..508 "and"
- WHITESPACE@508..509 " "
- WORD@509..510 "a"
- WHITESPACE@510..531 "\n "
- COMMAND@531..538
- COMMAND_NAME@531..538 "\\texttt"
- CURLY_GROUP@538..546
- L_CURLY@538..539 "{"
- WORD@539..545 "number"
- R_CURLY@545..546 "}"
- WHITESPACE@546..547 " "
- WORD@547..552 "field"
- R_CURLY@552..553 "}"
- COMMA@553..554 ","
- WHITESPACE@554..555 "\n"
- R_DELIM@555..556 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
deleted file mode 100644
index 86ee736c2b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__blom_2021.txt.snap
+++ /dev/null
@@ -1,223 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/blom_2021.txt
----
-ROOT@0..860
- ENTRY@0..860
- TYPE@0..8 "@article"
- L_DELIM@8..9 "{"
- NAME@9..42 "DBLP:journals/corr/ab ..."
- COMMA@42..43 ","
- WHITESPACE@43..48 "\n "
- FIELD@48..322
- NAME@48..54 "author"
- WHITESPACE@54..58 " "
- EQ@58..59 "="
- WHITESPACE@59..60 " "
- CURLY_GROUP@60..321
- L_CURLY@60..61 "{"
- WORD@61..69 "Michelle"
- WHITESPACE@69..70 " "
- WORD@70..72 "L."
- WHITESPACE@72..73 " "
- WORD@73..77 "Blom"
- WHITESPACE@77..78 " "
- WORD@78..81 "and"
- WHITESPACE@81..102 "\n "
- WORD@102..109 "Jurlind"
- WHITESPACE@109..110 " "
- WORD@110..119 "Budurushi"
- WHITESPACE@119..120 " "
- WORD@120..123 "and"
- WHITESPACE@123..144 "\n "
- WORD@144..150 "Ronald"
- WHITESPACE@150..151 " "
- WORD@151..153 "L."
- WHITESPACE@153..154 " "
- WORD@154..160 "Rivest"
- WHITESPACE@160..161 " "
- WORD@161..164 "and"
- WHITESPACE@164..185 "\n "
- WORD@185..191 "Philip"
- WHITESPACE@191..192 " "
- WORD@192..194 "B."
- WHITESPACE@194..195 " "
- WORD@195..200 "Stark"
- WHITESPACE@200..201 " "
- WORD@201..204 "and"
- WHITESPACE@204..225 "\n "
- WORD@225..230 "Peter"
- WHITESPACE@230..231 " "
- WORD@231..233 "J."
- WHITESPACE@233..234 " "
- WORD@234..241 "Stuckey"
- WHITESPACE@241..242 " "
- WORD@242..245 "and"
- WHITESPACE@245..266 "\n "
- WORD@266..273 "Vanessa"
- WHITESPACE@273..274 " "
- WORD@274..280 "Teague"
- WHITESPACE@280..281 " "
- WORD@281..284 "and"
- WHITESPACE@284..305 "\n "
- WORD@305..311 "Damjan"
- WHITESPACE@311..312 " "
- WORD@312..320 "Vukcevic"
- R_CURLY@320..321 "}"
- COMMA@321..322 ","
- WHITESPACE@322..327 "\n "
- FIELD@327..473
- NAME@327..332 "title"
- WHITESPACE@332..337 " "
- EQ@337..338 "="
- WHITESPACE@338..339 " "
- CURLY_GROUP@339..472
- L_CURLY@339..340 "{"
- WORD@340..355 "Assertion-based"
- WHITESPACE@355..356 " "
- WORD@356..366 "Approaches"
- WHITESPACE@366..367 " "
- WORD@367..369 "to"
- WHITESPACE@369..370 " "
- WORD@370..378 "Auditing"
- WHITESPACE@378..379 " "
- WORD@379..386 "Complex"
- WHITESPACE@386..387 " "
- WORD@387..396 "Elections"
- COMMA@396..397 ","
- WHITESPACE@397..398 " "
- WORD@398..402 "with"
- WHITESPACE@402..403 " "
- WORD@403..414 "application"
- WHITESPACE@414..435 "\n "
- WORD@435..437 "to"
- WHITESPACE@437..438 " "
- WORD@438..448 "party-list"
- WHITESPACE@448..449 " "
- WORD@449..461 "proportional"
- WHITESPACE@461..462 " "
- WORD@462..471 "elections"
- R_CURLY@471..472 "}"
- COMMA@472..473 ","
- WHITESPACE@473..478 "\n "
- FIELD@478..497
- NAME@478..485 "journal"
- WHITESPACE@485..488 " "
- EQ@488..489 "="
- WHITESPACE@489..490 " "
- CURLY_GROUP@490..496
- L_CURLY@490..491 "{"
- WORD@491..495 "CoRR"
- R_CURLY@495..496 "}"
- COMMA@496..497 ","
- WHITESPACE@497..502 "\n "
- FIELD@502..531
- NAME@502..508 "volume"
- WHITESPACE@508..512 " "
- EQ@512..513 "="
- WHITESPACE@513..514 " "
- CURLY_GROUP@514..530
- L_CURLY@514..515 "{"
- WORD@515..529 "abs/2107.11903"
- R_CURLY@529..530 "}"
- COMMA@530..531 ","
- WHITESPACE@531..536 "\n "
- FIELD@536..555
- NAME@536..540 "year"
- WHITESPACE@540..546 " "
- EQ@546..547 "="
- WHITESPACE@547..548 " "
- CURLY_GROUP@548..554
- L_CURLY@548..549 "{"
- INTEGER@549..553 "2021"
- R_CURLY@553..554 "}"
- COMMA@554..555 ","
- WHITESPACE@555..560 "\n "
- FIELD@560..607
- NAME@560..563 "url"
- WHITESPACE@563..570 " "
- EQ@570..571 "="
- WHITESPACE@571..572 " "
- CURLY_GROUP@572..606
- L_CURLY@572..573 "{"
- WORD@573..605 "https://arxiv.org/abs ..."
- R_CURLY@605..606 "}"
- COMMA@606..607 ","
- WHITESPACE@607..612 "\n "
- FIELD@612..633
- NAME@612..622 "eprinttype"
- WHITESPACE@622..623 " "
- EQ@623..624 "="
- WHITESPACE@624..625 " "
- CURLY_GROUP@625..632
- L_CURLY@625..626 "{"
- WORD@626..631 "arXiv"
- R_CURLY@631..632 "}"
- COMMA@632..633 ","
- WHITESPACE@633..638 "\n "
- FIELD@638..663
- NAME@638..644 "eprint"
- WHITESPACE@644..648 " "
- EQ@648..649 "="
- WHITESPACE@649..650 " "
- CURLY_GROUP@650..662
- L_CURLY@650..651 "{"
- WORD@651..661 "2107.11903"
- R_CURLY@661..662 "}"
- COMMA@662..663 ","
- WHITESPACE@663..668 "\n "
- FIELD@668..714
- NAME@668..677 "timestamp"
- WHITESPACE@677..678 " "
- EQ@678..679 "="
- WHITESPACE@679..680 " "
- CURLY_GROUP@680..713
- L_CURLY@680..681 "{"
- WORD@681..684 "Thu"
- COMMA@684..685 ","
- WHITESPACE@685..686 " "
- INTEGER@686..688 "29"
- WHITESPACE@688..689 " "
- WORD@689..692 "Jul"
- WHITESPACE@692..693 " "
- INTEGER@693..697 "2021"
- WHITESPACE@697..698 " "
- WORD@698..706 "16:14:15"
- WHITESPACE@706..707 " "
- WORD@707..712 "+0200"
- R_CURLY@712..713 "}"
- COMMA@713..714 ","
- WHITESPACE@714..719 "\n "
- FIELD@719..787
- NAME@719..725 "biburl"
- WHITESPACE@725..729 " "
- EQ@729..730 "="
- WHITESPACE@730..731 " "
- CURLY_GROUP@731..786
- L_CURLY@731..732 "{"
- WORD@732..785 "https://dblp.org/rec/ ..."
- R_CURLY@785..786 "}"
- COMMA@786..787 ","
- WHITESPACE@787..792 "\n "
- FIELD@792..859
- NAME@792..801 "bibsource"
- WHITESPACE@801..802 " "
- EQ@802..803 "="
- WHITESPACE@803..804 " "
- CURLY_GROUP@804..858
- L_CURLY@804..805 "{"
- WORD@805..809 "dblp"
- WHITESPACE@809..810 " "
- WORD@810..818 "computer"
- WHITESPACE@818..819 " "
- WORD@819..826 "science"
- WHITESPACE@826..827 " "
- WORD@827..839 "bibliography"
- COMMA@839..840 ","
- WHITESPACE@840..841 " "
- WORD@841..857 "https://dblp.org"
- R_CURLY@857..858 "}"
- WHITESPACE@858..859 "\n"
- R_DELIM@859..860 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
deleted file mode 100644
index d633886ced..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__combi_2004.txt.snap
+++ /dev/null
@@ -1,251 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/combi_2004.txt
----
-ROOT@0..674
- ENTRY@0..674
- TYPE@0..14 "@inproceedings"
- L_DELIM@14..15 "{"
- NAME@15..36 "10.1145/967900.968040"
- COMMA@36..37 ","
- WHITESPACE@37..42 "\n "
- FIELD@42..86
- NAME@42..48 "author"
- WHITESPACE@48..49 " "
- EQ@49..50 "="
- WHITESPACE@50..51 " "
- CURLY_GROUP@51..85
- L_CURLY@51..52 "{"
- WORD@52..57 "Combi"
- COMMA@57..58 ","
- WHITESPACE@58..59 " "
- WORD@59..64 "Carlo"
- WHITESPACE@64..65 " "
- WORD@65..68 "and"
- WHITESPACE@68..69 " "
- WORD@69..74 "Pozzi"
- COMMA@74..75 ","
- WHITESPACE@75..76 " "
- WORD@76..84 "Giuseppe"
- R_CURLY@84..85 "}"
- COMMA@85..86 ","
- WHITESPACE@86..91 "\n "
- FIELD@91..157
- NAME@91..96 "title"
- WHITESPACE@96..97 " "
- EQ@97..98 "="
- WHITESPACE@98..99 " "
- CURLY_GROUP@99..156
- L_CURLY@99..100 "{"
- WORD@100..113 "Architectures"
- WHITESPACE@113..114 " "
- WORD@114..117 "for"
- WHITESPACE@117..118 " "
- WORD@118..119 "a"
- WHITESPACE@119..120 " "
- WORD@120..128 "Temporal"
- WHITESPACE@128..129 " "
- WORD@129..137 "Workflow"
- WHITESPACE@137..138 " "
- WORD@138..148 "Management"
- WHITESPACE@148..149 " "
- WORD@149..155 "System"
- R_CURLY@155..156 "}"
- COMMA@156..157 ","
- WHITESPACE@157..162 "\n "
- FIELD@162..176
- NAME@162..166 "year"
- WHITESPACE@166..167 " "
- EQ@167..168 "="
- WHITESPACE@168..169 " "
- CURLY_GROUP@169..175
- L_CURLY@169..170 "{"
- INTEGER@170..174 "2004"
- R_CURLY@174..175 "}"
- COMMA@175..176 ","
- WHITESPACE@176..181 "\n "
- FIELD@181..201
- NAME@181..185 "isbn"
- WHITESPACE@185..186 " "
- EQ@186..187 "="
- WHITESPACE@187..188 " "
- CURLY_GROUP@188..200
- L_CURLY@188..189 "{"
- INTEGER@189..199 "1581138121"
- R_CURLY@199..200 "}"
- COMMA@200..201 ","
- WHITESPACE@201..206 "\n "
- FIELD@206..256
- NAME@206..215 "publisher"
- WHITESPACE@215..216 " "
- EQ@216..217 "="
- WHITESPACE@217..218 " "
- CURLY_GROUP@218..255
- L_CURLY@218..219 "{"
- WORD@219..230 "Association"
- WHITESPACE@230..231 " "
- WORD@231..234 "for"
- WHITESPACE@234..235 " "
- WORD@235..244 "Computing"
- WHITESPACE@244..245 " "
- WORD@245..254 "Machinery"
- R_CURLY@254..255 "}"
- COMMA@255..256 ","
- WHITESPACE@256..261 "\n "
- FIELD@261..291
- NAME@261..268 "address"
- WHITESPACE@268..269 " "
- EQ@269..270 "="
- WHITESPACE@270..271 " "
- CURLY_GROUP@271..290
- L_CURLY@271..272 "{"
- WORD@272..275 "New"
- WHITESPACE@275..276 " "
- WORD@276..280 "York"
- COMMA@280..281 ","
- WHITESPACE@281..282 " "
- WORD@282..284 "NY"
- COMMA@284..285 ","
- WHITESPACE@285..286 " "
- WORD@286..289 "USA"
- R_CURLY@289..290 "}"
- COMMA@290..291 ","
- WHITESPACE@291..296 "\n "
- FIELD@296..342
- NAME@296..299 "url"
- WHITESPACE@299..300 " "
- EQ@300..301 "="
- WHITESPACE@301..302 " "
- CURLY_GROUP@302..341
- L_CURLY@302..303 "{"
- WORD@303..340 "https://doi.org/10.11 ..."
- R_CURLY@340..341 "}"
- COMMA@341..342 ","
- WHITESPACE@342..347 "\n "
- FIELD@347..377
- NAME@347..350 "doi"
- WHITESPACE@350..351 " "
- EQ@351..352 "="
- WHITESPACE@352..353 " "
- CURLY_GROUP@353..376
- L_CURLY@353..354 "{"
- WORD@354..375 "10.1145/967900.968040"
- R_CURLY@375..376 "}"
- COMMA@376..377 ","
- WHITESPACE@377..382 "\n "
- FIELD@382..455
- NAME@382..391 "booktitle"
- WHITESPACE@391..392 " "
- EQ@392..393 "="
- WHITESPACE@393..394 " "
- CURLY_GROUP@394..454
- L_CURLY@394..395 "{"
- WORD@395..406 "Proceedings"
- WHITESPACE@406..407 " "
- WORD@407..409 "of"
- WHITESPACE@409..410 " "
- WORD@410..413 "the"
- WHITESPACE@413..414 " "
- INTEGER@414..418 "2004"
- WHITESPACE@418..419 " "
- WORD@419..422 "ACM"
- WHITESPACE@422..423 " "
- WORD@423..432 "Symposium"
- WHITESPACE@432..433 " "
- WORD@433..435 "on"
- WHITESPACE@435..436 " "
- WORD@436..443 "Applied"
- WHITESPACE@443..444 " "
- WORD@444..453 "Computing"
- R_CURLY@453..454 "}"
- COMMA@454..455 ","
- WHITESPACE@455..460 "\n "
- FIELD@460..478
- NAME@460..465 "pages"
- WHITESPACE@465..466 " "
- EQ@466..467 "="
- WHITESPACE@467..468 " "
- CURLY_GROUP@468..477
- L_CURLY@468..469 "{"
- WORD@469..476 "659-666"
- R_CURLY@476..477 "}"
- COMMA@477..478 ","
- WHITESPACE@478..483 "\n "
- FIELD@483..498
- NAME@483..491 "numpages"
- WHITESPACE@491..492 " "
- EQ@492..493 "="
- WHITESPACE@493..494 " "
- CURLY_GROUP@494..497
- L_CURLY@494..495 "{"
- INTEGER@495..496 "8"
- R_CURLY@496..497 "}"
- COMMA@497..498 ","
- WHITESPACE@498..503 "\n "
- FIELD@503..615
- NAME@503..511 "keywords"
- WHITESPACE@511..512 " "
- EQ@512..513 "="
- WHITESPACE@513..514 " "
- CURLY_GROUP@514..614
- L_CURLY@514..515 "{"
- WORD@515..521 "active"
- WHITESPACE@521..522 " "
- WORD@522..526 "DBMS"
- COMMA@526..527 ","
- WHITESPACE@527..528 " "
- WORD@528..536 "temporal"
- WHITESPACE@536..537 " "
- WORD@537..541 "DBMS"
- COMMA@541..542 ","
- WHITESPACE@542..543 " "
- WORD@543..551 "workflow"
- WHITESPACE@551..552 " "
- WORD@552..562 "management"
- WHITESPACE@562..563 " "
- WORD@563..569 "system"
- WHITESPACE@569..570 " "
- WORD@570..571 "-"
- WHITESPACE@571..572 " "
- WORD@572..576 "WfMS"
- COMMA@576..577 ","
- WHITESPACE@577..578 " "
- WORD@578..586 "temporal"
- WHITESPACE@586..587 " "
- WORD@587..595 "workflow"
- WHITESPACE@595..596 " "
- WORD@596..606 "management"
- WHITESPACE@606..607 " "
- WORD@607..613 "system"
- R_CURLY@613..614 "}"
- COMMA@614..615 ","
- WHITESPACE@615..620 "\n "
- FIELD@620..649
- NAME@620..628 "location"
- WHITESPACE@628..629 " "
- EQ@629..630 "="
- WHITESPACE@630..631 " "
- CURLY_GROUP@631..648
- L_CURLY@631..632 "{"
- WORD@632..639 "Nicosia"
- COMMA@639..640 ","
- WHITESPACE@640..641 " "
- WORD@641..647 "Cyprus"
- R_CURLY@647..648 "}"
- COMMA@648..649 ","
- WHITESPACE@649..654 "\n "
- FIELD@654..673
- NAME@654..660 "series"
- WHITESPACE@660..661 " "
- EQ@661..662 "="
- WHITESPACE@662..663 " "
- CURLY_GROUP@663..672
- L_CURLY@663..664 "{"
- WORD@664..667 "SAC"
- WHITESPACE@667..668 " "
- WORD@668..671 "'04"
- R_CURLY@671..672 "}"
- WHITESPACE@672..673 "\n"
- R_DELIM@673..674 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
deleted file mode 100644
index 2275d58d08..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__erwin_2007.txt.snap
+++ /dev/null
@@ -1,239 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
----
-ROOT@0..615
- ENTRY@0..615
- TYPE@0..14 "@inproceedings"
- L_DELIM@14..15 "{"
- NAME@15..38 "10.5555/1386993.1386994"
- COMMA@38..39 ","
- WHITESPACE@39..44 "\n "
- FIELD@44..107
- NAME@44..50 "author"
- WHITESPACE@50..51 " "
- EQ@51..52 "="
- WHITESPACE@52..53 " "
- CURLY_GROUP@53..106
- L_CURLY@53..54 "{"
- WORD@54..59 "Erwin"
- COMMA@59..60 ","
- WHITESPACE@60..61 " "
- WORD@61..65 "Alva"
- WHITESPACE@65..66 " "
- WORD@66..69 "and"
- WHITESPACE@69..70 " "
- WORD@70..77 "Gopalan"
- COMMA@77..78 ","
- WHITESPACE@78..79 " "
- WORD@79..82 "Raj"
- WHITESPACE@82..83 " "
- WORD@83..85 "P."
- WHITESPACE@85..86 " "
- WORD@86..89 "and"
- WHITESPACE@89..90 " "
- WORD@90..98 "Achuthan"
- COMMA@98..99 ","
- WHITESPACE@99..100 " "
- WORD@100..102 "N."
- WHITESPACE@102..103 " "
- WORD@103..105 "R."
- R_CURLY@105..106 "}"
- COMMA@106..107 ","
- WHITESPACE@107..112 "\n "
- FIELD@112..194
- NAME@112..117 "title"
- WHITESPACE@117..118 " "
- EQ@118..119 "="
- WHITESPACE@119..120 " "
- CURLY_GROUP@120..193
- L_CURLY@120..121 "{"
- WORD@121..122 "A"
- WHITESPACE@122..123 " "
- WORD@123..132 "Bottom-up"
- WHITESPACE@132..133 " "
- WORD@133..143 "Projection"
- WHITESPACE@143..144 " "
- WORD@144..149 "Based"
- WHITESPACE@149..150 " "
- WORD@150..159 "Algorithm"
- WHITESPACE@159..160 " "
- WORD@160..163 "for"
- WHITESPACE@163..164 " "
- WORD@164..170 "Mining"
- WHITESPACE@170..171 " "
- WORD@171..175 "High"
- WHITESPACE@175..176 " "
- WORD@176..183 "Utility"
- WHITESPACE@183..184 " "
- WORD@184..192 "Itemsets"
- R_CURLY@192..193 "}"
- COMMA@193..194 ","
- WHITESPACE@194..199 "\n "
- FIELD@199..213
- NAME@199..203 "year"
- WHITESPACE@203..204 " "
- EQ@204..205 "="
- WHITESPACE@205..206 " "
- CURLY_GROUP@206..212
- L_CURLY@206..207 "{"
- INTEGER@207..211 "2007"
- R_CURLY@211..212 "}"
- COMMA@212..213 ","
- WHITESPACE@213..218 "\n "
- FIELD@218..241
- NAME@218..222 "isbn"
- WHITESPACE@222..223 " "
- EQ@223..224 "="
- WHITESPACE@224..225 " "
- CURLY_GROUP@225..240
- L_CURLY@225..226 "{"
- INTEGER@226..239 "9781920682651"
- R_CURLY@239..240 "}"
- COMMA@240..241 ","
- WHITESPACE@241..246 "\n "
- FIELD@246..294
- NAME@246..255 "publisher"
- WHITESPACE@255..256 " "
- EQ@256..257 "="
- WHITESPACE@257..258 " "
- CURLY_GROUP@258..293
- L_CURLY@258..259 "{"
- WORD@259..269 "Australian"
- WHITESPACE@269..270 " "
- WORD@270..278 "Computer"
- WHITESPACE@278..279 " "
- WORD@279..286 "Society"
- COMMA@286..287 ","
- WHITESPACE@287..288 " "
- WORD@288..292 "Inc."
- R_CURLY@292..293 "}"
- COMMA@293..294 ","
- WHITESPACE@294..299 "\n "
- FIELD@299..315
- NAME@299..306 "address"
- WHITESPACE@306..307 " "
- EQ@307..308 "="
- WHITESPACE@308..309 " "
- CURLY_GROUP@309..314
- L_CURLY@309..310 "{"
- WORD@310..313 "AUS"
- R_CURLY@313..314 "}"
- COMMA@314..315 ","
- WHITESPACE@315..320 "\n "
- FIELD@320..447
- NAME@320..329 "booktitle"
- WHITESPACE@329..330 " "
- EQ@330..331 "="
- WHITESPACE@331..332 " "
- CURLY_GROUP@332..446
- L_CURLY@332..333 "{"
- WORD@333..344 "Proceedings"
- WHITESPACE@344..345 " "
- WORD@345..347 "of"
- WHITESPACE@347..348 " "
- WORD@348..351 "the"
- WHITESPACE@351..352 " "
- WORD@352..355 "2nd"
- WHITESPACE@355..356 " "
- WORD@356..369 "International"
- WHITESPACE@369..370 " "
- WORD@370..378 "Workshop"
- WHITESPACE@378..379 " "
- WORD@379..381 "on"
- WHITESPACE@381..382 " "
- WORD@382..393 "Integrating"
- WHITESPACE@393..394 " "
- WORD@394..404 "Artificial"
- WHITESPACE@404..405 " "
- WORD@405..417 "Intelligence"
- WHITESPACE@417..418 " "
- WORD@418..421 "and"
- WHITESPACE@421..422 " "
- WORD@422..426 "Data"
- WHITESPACE@426..427 " "
- WORD@427..433 "Mining"
- WHITESPACE@433..434 " "
- WORD@434..435 "-"
- WHITESPACE@435..436 " "
- WORD@436..442 "Volume"
- WHITESPACE@442..443 " "
- INTEGER@443..445 "84"
- R_CURLY@445..446 "}"
- COMMA@446..447 ","
- WHITESPACE@447..452 "\n "
- FIELD@452..467
- NAME@452..457 "pages"
- WHITESPACE@457..458 " "
- EQ@458..459 "="
- WHITESPACE@459..460 " "
- CURLY_GROUP@460..466
- L_CURLY@460..461 "{"
- WORD@461..465 "3-11"
- R_CURLY@465..466 "}"
- COMMA@466..467 ","
- WHITESPACE@467..472 "\n "
- FIELD@472..487
- NAME@472..480 "numpages"
- WHITESPACE@480..481 " "
- EQ@481..482 "="
- WHITESPACE@482..483 " "
- CURLY_GROUP@483..486
- L_CURLY@483..484 "{"
- INTEGER@484..485 "9"
- R_CURLY@485..486 "}"
- COMMA@486..487 ","
- WHITESPACE@487..492 "\n "
- FIELD@492..549
- NAME@492..500 "keywords"
- WHITESPACE@500..501 " "
- EQ@501..502 "="
- WHITESPACE@502..503 " "
- CURLY_GROUP@503..548
- L_CURLY@503..504 "{"
- WORD@504..511 "pattern"
- WHITESPACE@511..512 " "
- WORD@512..518 "growth"
- COMMA@518..519 ","
- WHITESPACE@519..520 " "
- WORD@520..524 "high"
- WHITESPACE@524..525 " "
- WORD@525..532 "utility"
- WHITESPACE@532..533 " "
- WORD@533..540 "itemset"
- WHITESPACE@540..541 " "
- WORD@541..547 "mining"
- R_CURLY@547..548 "}"
- COMMA@548..549 ","
- WHITESPACE@549..554 "\n "
- FIELD@554..589
- NAME@554..562 "location"
- WHITESPACE@562..563 " "
- EQ@563..564 "="
- WHITESPACE@564..565 " "
- CURLY_GROUP@565..588
- L_CURLY@565..566 "{"
- WORD@566..570 "Gold"
- WHITESPACE@570..571 " "
- WORD@571..576 "Coast"
- COMMA@576..577 ","
- WHITESPACE@577..578 " "
- WORD@578..587 "Australia"
- R_CURLY@587..588 "}"
- COMMA@588..589 ","
- WHITESPACE@589..594 "\n "
- FIELD@594..614
- NAME@594..600 "series"
- WHITESPACE@600..601 " "
- EQ@601..602 "="
- WHITESPACE@602..603 " "
- CURLY_GROUP@603..613
- L_CURLY@603..604 "{"
- WORD@604..608 "AIDM"
- WHITESPACE@608..609 " "
- WORD@609..612 "'07"
- R_CURLY@612..613 "}"
- WHITESPACE@613..614 "\n"
- R_DELIM@614..615 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
deleted file mode 100644
index d409435d09..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__jain_1999.txt.snap
+++ /dev/null
@@ -1,267 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/jain_1999.txt
----
-ROOT@0..674
- ENTRY@0..674
- TYPE@0..8 "@article"
- L_DELIM@8..9 "{"
- NAME@9..30 "10.1145/331499.331504"
- COMMA@30..31 ","
- WHITESPACE@31..36 "\n "
- FIELD@36..93
- NAME@36..42 "author"
- WHITESPACE@42..43 " "
- EQ@43..44 "="
- WHITESPACE@44..45 " "
- CURLY_GROUP@45..92
- L_CURLY@45..46 "{"
- WORD@46..50 "Jain"
- COMMA@50..51 ","
- WHITESPACE@51..52 " "
- WORD@52..54 "A."
- WHITESPACE@54..55 " "
- WORD@55..57 "K."
- WHITESPACE@57..58 " "
- WORD@58..61 "and"
- WHITESPACE@61..62 " "
- WORD@62..67 "Murty"
- COMMA@67..68 ","
- WHITESPACE@68..69 " "
- WORD@69..71 "M."
- WHITESPACE@71..72 " "
- WORD@72..74 "N."
- WHITESPACE@74..75 " "
- WORD@75..78 "and"
- WHITESPACE@78..79 " "
- WORD@79..84 "Flynn"
- COMMA@84..85 ","
- WHITESPACE@85..86 " "
- WORD@86..88 "P."
- WHITESPACE@88..89 " "
- WORD@89..91 "J."
- R_CURLY@91..92 "}"
- COMMA@92..93 ","
- WHITESPACE@93..98 "\n "
- FIELD@98..134
- NAME@98..103 "title"
- WHITESPACE@103..104 " "
- EQ@104..105 "="
- WHITESPACE@105..106 " "
- CURLY_GROUP@106..133
- L_CURLY@106..107 "{"
- WORD@107..111 "Data"
- WHITESPACE@111..112 " "
- WORD@112..123 "Clustering:"
- WHITESPACE@123..124 " "
- WORD@124..125 "A"
- WHITESPACE@125..126 " "
- WORD@126..132 "Review"
- R_CURLY@132..133 "}"
- COMMA@133..134 ","
- WHITESPACE@134..139 "\n "
- FIELD@139..153
- NAME@139..143 "year"
- WHITESPACE@143..144 " "
- EQ@144..145 "="
- WHITESPACE@145..146 " "
- CURLY_GROUP@146..152
- L_CURLY@146..147 "{"
- INTEGER@147..151 "1999"
- R_CURLY@151..152 "}"
- COMMA@152..153 ","
- WHITESPACE@153..158 "\n "
- FIELD@158..184
- NAME@158..168 "issue_date"
- WHITESPACE@168..169 " "
- EQ@169..170 "="
- WHITESPACE@170..171 " "
- CURLY_GROUP@171..183
- L_CURLY@171..172 "{"
- WORD@172..177 "Sept."
- WHITESPACE@177..178 " "
- INTEGER@178..182 "1999"
- R_CURLY@182..183 "}"
- COMMA@183..184 ","
- WHITESPACE@184..189 "\n "
- FIELD@189..239
- NAME@189..198 "publisher"
- WHITESPACE@198..199 " "
- EQ@199..200 "="
- WHITESPACE@200..201 " "
- CURLY_GROUP@201..238
- L_CURLY@201..202 "{"
- WORD@202..213 "Association"
- WHITESPACE@213..214 " "
- WORD@214..217 "for"
- WHITESPACE@217..218 " "
- WORD@218..227 "Computing"
- WHITESPACE@227..228 " "
- WORD@228..237 "Machinery"
- R_CURLY@237..238 "}"
- COMMA@238..239 ","
- WHITESPACE@239..244 "\n "
- FIELD@244..274
- NAME@244..251 "address"
- WHITESPACE@251..252 " "
- EQ@252..253 "="
- WHITESPACE@253..254 " "
- CURLY_GROUP@254..273
- L_CURLY@254..255 "{"
- WORD@255..258 "New"
- WHITESPACE@258..259 " "
- WORD@259..263 "York"
- COMMA@263..264 ","
- WHITESPACE@264..265 " "
- WORD@265..267 "NY"
- COMMA@267..268 ","
- WHITESPACE@268..269 " "
- WORD@269..272 "USA"
- R_CURLY@272..273 "}"
- COMMA@273..274 ","
- WHITESPACE@274..279 "\n "
- FIELD@279..293
- NAME@279..285 "volume"
- WHITESPACE@285..286 " "
- EQ@286..287 "="
- WHITESPACE@287..288 " "
- CURLY_GROUP@288..292
- L_CURLY@288..289 "{"
- INTEGER@289..291 "31"
- R_CURLY@291..292 "}"
- COMMA@292..293 ","
- WHITESPACE@293..298 "\n "
- FIELD@298..311
- NAME@298..304 "number"
- WHITESPACE@304..305 " "
- EQ@305..306 "="
- WHITESPACE@306..307 " "
- CURLY_GROUP@307..310
- L_CURLY@307..308 "{"
- INTEGER@308..309 "3"
- R_CURLY@309..310 "}"
- COMMA@310..311 ","
- WHITESPACE@311..316 "\n "
- FIELD@316..335
- NAME@316..320 "issn"
- WHITESPACE@320..321 " "
- EQ@321..322 "="
- WHITESPACE@322..323 " "
- CURLY_GROUP@323..334
- L_CURLY@323..324 "{"
- WORD@324..333 "0360-0300"
- R_CURLY@333..334 "}"
- COMMA@334..335 ","
- WHITESPACE@335..340 "\n "
- FIELD@340..386
- NAME@340..343 "url"
- WHITESPACE@343..344 " "
- EQ@344..345 "="
- WHITESPACE@345..346 " "
- CURLY_GROUP@346..385
- L_CURLY@346..347 "{"
- WORD@347..384 "https://doi.org/10.11 ..."
- R_CURLY@384..385 "}"
- COMMA@385..386 ","
- WHITESPACE@386..391 "\n "
- FIELD@391..421
- NAME@391..394 "doi"
- WHITESPACE@394..395 " "
- EQ@395..396 "="
- WHITESPACE@396..397 " "
- CURLY_GROUP@397..420
- L_CURLY@397..398 "{"
- WORD@398..419 "10.1145/331499.331504"
- R_CURLY@419..420 "}"
- COMMA@420..421 ","
- WHITESPACE@421..426 "\n "
- FIELD@426..456
- NAME@426..433 "journal"
- WHITESPACE@433..434 " "
- EQ@434..435 "="
- WHITESPACE@435..436 " "
- CURLY_GROUP@436..455
- L_CURLY@436..437 "{"
- WORD@437..440 "ACM"
- WHITESPACE@440..441 " "
- WORD@441..448 "Comput."
- WHITESPACE@448..449 " "
- WORD@449..454 "Surv."
- R_CURLY@454..455 "}"
- COMMA@455..456 ","
- WHITESPACE@456..461 "\n "
- FIELD@461..475
- NAME@461..466 "month"
- WHITESPACE@466..467 " "
- EQ@467..468 "="
- WHITESPACE@468..469 " "
- CURLY_GROUP@469..474
- L_CURLY@469..470 "{"
- WORD@470..473 "sep"
- R_CURLY@473..474 "}"
- COMMA@474..475 ","
- WHITESPACE@475..480 "\n "
- FIELD@480..498
- NAME@480..485 "pages"
- WHITESPACE@485..486 " "
- EQ@486..487 "="
- WHITESPACE@487..488 " "
- CURLY_GROUP@488..497
- L_CURLY@488..489 "{"
- WORD@489..496 "264-323"
- R_CURLY@496..497 "}"
- COMMA@497..498 ","
- WHITESPACE@498..503 "\n "
- FIELD@503..519
- NAME@503..511 "numpages"
- WHITESPACE@511..512 " "
- EQ@512..513 "="
- WHITESPACE@513..514 " "
- CURLY_GROUP@514..518
- L_CURLY@514..515 "{"
- INTEGER@515..517 "60"
- R_CURLY@517..518 "}"
- COMMA@518..519 ","
- WHITESPACE@519..524 "\n "
- FIELD@524..673
- NAME@524..532 "keywords"
- WHITESPACE@532..533 " "
- EQ@533..534 "="
- WHITESPACE@534..535 " "
- CURLY_GROUP@535..672
- L_CURLY@535..536 "{"
- WORD@536..547 "incremental"
- WHITESPACE@547..548 " "
- WORD@548..558 "clustering"
- COMMA@558..559 ","
- WHITESPACE@559..560 " "
- WORD@560..570 "clustering"
- WHITESPACE@570..571 " "
- WORD@571..583 "applications"
- COMMA@583..584 ","
- WHITESPACE@584..585 " "
- WORD@585..596 "exploratory"
- WHITESPACE@596..597 " "
- WORD@597..601 "data"
- WHITESPACE@601..602 " "
- WORD@602..610 "analysis"
- COMMA@610..611 ","
- WHITESPACE@611..612 " "
- WORD@612..619 "cluster"
- WHITESPACE@619..620 " "
- WORD@620..628 "analysis"
- COMMA@628..629 ","
- WHITESPACE@629..630 " "
- WORD@630..640 "similarity"
- WHITESPACE@640..641 " "
- WORD@641..648 "indices"
- COMMA@648..649 ","
- WHITESPACE@649..650 " "
- WORD@650..662 "unsupervised"
- WHITESPACE@662..663 " "
- WORD@663..671 "learning"
- R_CURLY@671..672 "}"
- WHITESPACE@672..673 "\n"
- R_DELIM@673..674 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
deleted file mode 100644
index e93f8ce6cb..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__kastenholz_2006.txt.snap
+++ /dev/null
@@ -1,302 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
----
-ROOT@0..898
- STRING@0..35
- TYPE@0..7 "@string"
- L_DELIM@7..8 "{"
- NAME@8..13 "jchph"
- WHITESPACE@13..16 " "
- EQ@16..17 "="
- WHITESPACE@17..18 " "
- CURLY_GROUP@18..34
- L_CURLY@18..19 "{"
- WORD@19..21 "J."
- NBSP@21..22 "~"
- WORD@22..27 "Chem."
- WHITESPACE@27..28 " "
- WORD@28..33 "Phys."
- R_CURLY@33..34 "}"
- R_DELIM@34..35 "}"
- JUNK@35..37 "\n\n"
- ENTRY@37..898
- TYPE@37..45 "@article"
- L_DELIM@45..46 "{"
- NAME@46..56 "kastenholz"
- COMMA@56..57 ","
- WHITESPACE@57..62 "\n "
- FIELD@62..130
- NAME@62..68 "author"
- WHITESPACE@68..75 " "
- EQ@75..76 "="
- WHITESPACE@76..77 " "
- CURLY_GROUP@77..129
- L_CURLY@77..78 "{"
- WORD@78..88 "Kastenholz"
- COMMA@88..89 ","
- WHITESPACE@89..90 " "
- WORD@90..92 "M."
- WHITESPACE@92..93 " "
- WORD@93..95 "A."
- WHITESPACE@95..96 " "
- WORD@96..99 "and"
- WHITESPACE@99..100 " "
- WORD@100..101 "H"
- CURLY_GROUP@101..106
- L_CURLY@101..102 "{"
- ACCENT@102..105
- ACCENT_NAME@102..104 "\\\""
- WORD@104..105 "u"
- R_CURLY@105..106 "}"
- WORD@106..115 "nenberger"
- COMMA@115..116 ","
- WHITESPACE@116..117 " "
- WORD@117..125 "Philippe"
- WHITESPACE@125..126 " "
- WORD@126..128 "H."
- R_CURLY@128..129 "}"
- COMMA@129..130 ","
- WHITESPACE@130..135 "\n "
- FIELD@135..275
- NAME@135..140 "title"
- WHITESPACE@140..148 " "
- EQ@148..149 "="
- WHITESPACE@149..150 " "
- CURLY_GROUP@150..274
- L_CURLY@150..151 "{"
- WORD@151..162 "Computation"
- WHITESPACE@162..163 " "
- WORD@163..165 "of"
- WHITESPACE@165..166 " "
- WORD@166..177 "methodology"
- COMMAND@177..184
- COMMAND_NAME@177..184 "\\hyphen"
- WHITESPACE@184..185 " "
- WORD@185..196 "independent"
- WHITESPACE@196..197 " "
- WORD@197..202 "ionic"
- WHITESPACE@202..203 " "
- WORD@203..212 "solvation"
- WHITESPACE@212..233 "\n "
- WORD@233..237 "free"
- WHITESPACE@237..238 " "
- WORD@238..246 "energies"
- WHITESPACE@246..247 " "
- WORD@247..251 "from"
- WHITESPACE@251..252 " "
- WORD@252..261 "molecular"
- WHITESPACE@261..262 " "
- WORD@262..273 "simulations"
- R_CURLY@273..274 "}"
- COMMA@274..275 ","
- WHITESPACE@275..280 "\n "
- FIELD@280..301
- NAME@280..292 "journaltitle"
- WHITESPACE@292..293 " "
- EQ@293..294 "="
- WHITESPACE@294..295 " "
- LITERAL@295..300
- NAME@295..300 "jchph"
- COMMA@300..301 ","
- WHITESPACE@301..306 "\n "
- FIELD@306..326
- NAME@306..310 "date"
- WHITESPACE@310..319 " "
- EQ@319..320 "="
- WHITESPACE@320..321 " "
- LITERAL@321..325
- INTEGER@321..325 "2006"
- COMMA@325..326 ","
- WHITESPACE@326..331 "\n "
- FIELD@331..404
- NAME@331..339 "subtitle"
- WHITESPACE@339..344 " "
- EQ@344..345 "="
- WHITESPACE@345..346 " "
- CURLY_GROUP@346..403
- L_CURLY@346..347 "{"
- CURLY_GROUP@347..350
- L_CURLY@347..348 "{"
- WORD@348..349 "I"
- R_CURLY@349..350 "}"
- WORD@350..351 "."
- WHITESPACE@351..352 " "
- CURLY_GROUP@352..357
- L_CURLY@352..353 "{"
- WORD@353..356 "The"
- R_CURLY@356..357 "}"
- WHITESPACE@357..358 " "
- WORD@358..371 "electrostatic"
- WHITESPACE@371..372 " "
- WORD@372..381 "potential"
- WHITESPACE@381..382 " "
- WORD@382..384 "in"
- WHITESPACE@384..385 " "
- WORD@385..394 "molecular"
- WHITESPACE@394..395 " "
- WORD@395..402 "liquids"
- R_CURLY@402..403 "}"
- COMMA@403..404 ","
- WHITESPACE@404..409 "\n "
- FIELD@409..428
- NAME@409..415 "volume"
- WHITESPACE@415..422 " "
- EQ@422..423 "="
- WHITESPACE@423..424 " "
- LITERAL@424..427
- INTEGER@424..427 "124"
- COMMA@427..428 ","
- WHITESPACE@428..433 "\n "
- FIELD@433..455
- NAME@433..436 "eid"
- WHITESPACE@436..446 " "
- EQ@446..447 "="
- WHITESPACE@447..448 " "
- LITERAL@448..454
- INTEGER@448..454 "124106"
- COMMA@454..455 ","
- WHITESPACE@455..460 "\n "
- FIELD@460..495
- NAME@460..463 "doi"
- WHITESPACE@463..473 " "
- EQ@473..474 "="
- WHITESPACE@474..475 " "
- CURLY_GROUP@475..494
- L_CURLY@475..476 "{"
- WORD@476..493 "10.1063/1.2172593"
- R_CURLY@493..494 "}"
- COMMA@494..495 ","
- WHITESPACE@495..500 "\n "
- FIELD@500..525
- NAME@500..506 "langid"
- WHITESPACE@506..513 " "
- EQ@513..514 "="
- WHITESPACE@514..515 " "
- CURLY_GROUP@515..524
- L_CURLY@515..516 "{"
- WORD@516..523 "english"
- R_CURLY@523..524 "}"
- COMMA@524..525 ","
- WHITESPACE@525..530 "\n "
- FIELD@530..564
- NAME@530..540 "langidopts"
- WHITESPACE@540..543 " "
- EQ@543..544 "="
- WHITESPACE@544..545 " "
- CURLY_GROUP@545..563
- L_CURLY@545..546 "{"
- WORD@546..562 "variant=american"
- R_CURLY@562..563 "}"
- COMMA@563..564 ","
- WHITESPACE@564..569 "\n "
- FIELD@569..631
- NAME@569..579 "indextitle"
- WHITESPACE@579..582 " "
- EQ@582..583 "="
- WHITESPACE@583..584 " "
- CURLY_GROUP@584..630
- L_CURLY@584..585 "{"
- WORD@585..596 "Computation"
- WHITESPACE@596..597 " "
- WORD@597..599 "of"
- WHITESPACE@599..600 " "
- WORD@600..605 "ionic"
- WHITESPACE@605..606 " "
- WORD@606..615 "solvation"
- WHITESPACE@615..616 " "
- WORD@616..620 "free"
- WHITESPACE@620..621 " "
- WORD@621..629 "energies"
- R_CURLY@629..630 "}"
- COMMA@630..631 ","
- WHITESPACE@631..636 "\n "
- FIELD@636..896
- NAME@636..646 "annotation"
- WHITESPACE@646..649 " "
- EQ@649..650 "="
- WHITESPACE@650..651 " "
- CURLY_GROUP@651..895
- L_CURLY@651..652 "{"
- WORD@652..654 "An"
- WHITESPACE@654..655 " "
- COMMAND@655..662
- COMMAND_NAME@655..662 "\\texttt"
- CURLY_GROUP@662..671
- L_CURLY@662..663 "{"
- WORD@663..670 "article"
- R_CURLY@670..671 "}"
- WHITESPACE@671..672 " "
- WORD@672..677 "entry"
- WHITESPACE@677..678 " "
- WORD@678..682 "with"
- WHITESPACE@682..683 " "
- WORD@683..685 "an"
- WHITESPACE@685..686 " "
- COMMAND@686..693
- COMMAND_NAME@686..693 "\\texttt"
- CURLY_GROUP@693..698
- L_CURLY@693..694 "{"
- WORD@694..697 "eid"
- R_CURLY@697..698 "}"
- WHITESPACE@698..699 " "
- WORD@699..702 "and"
- WHITESPACE@702..703 " "
- WORD@703..704 "a"
- WHITESPACE@704..725 "\n "
- COMMAND@725..732
- COMMAND_NAME@725..732 "\\texttt"
- CURLY_GROUP@732..737
- L_CURLY@732..733 "{"
- WORD@733..736 "doi"
- R_CURLY@736..737 "}"
- WHITESPACE@737..738 " "
- WORD@738..744 "field."
- WHITESPACE@744..745 " "
- WORD@745..749 "Note"
- WHITESPACE@749..750 " "
- WORD@750..754 "that"
- WHITESPACE@754..755 " "
- WORD@755..758 "the"
- WHITESPACE@758..759 " "
- COMMAND@759..766
- COMMAND_NAME@759..766 "\\textsc"
- CURLY_GROUP@766..771
- L_CURLY@766..767 "{"
- WORD@767..770 "doi"
- R_CURLY@770..771 "}"
- WHITESPACE@771..772 " "
- WORD@772..774 "is"
- WHITESPACE@774..775 " "
- WORD@775..786 "transformed"
- WHITESPACE@786..807 "\n "
- WORD@807..811 "into"
- WHITESPACE@811..812 " "
- WORD@812..813 "a"
- WHITESPACE@813..814 " "
- WORD@814..823 "clickable"
- WHITESPACE@823..824 " "
- WORD@824..828 "link"
- WHITESPACE@828..829 " "
- WORD@829..831 "if"
- WHITESPACE@831..832 " "
- COMMAND@832..839
- COMMAND_NAME@832..839 "\\texttt"
- CURLY_GROUP@839..849
- L_CURLY@839..840 "{"
- WORD@840..848 "hyperref"
- R_CURLY@848..849 "}"
- WHITESPACE@849..850 " "
- WORD@850..857 "support"
- WHITESPACE@857..858 " "
- WORD@858..861 "has"
- WHITESPACE@861..862 " "
- WORD@862..866 "been"
- WHITESPACE@866..887 "\n "
- WORD@887..894 "enabled"
- R_CURLY@894..895 "}"
- COMMA@895..896 ","
- WHITESPACE@896..897 "\n"
- R_DELIM@897..898 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
deleted file mode 100644
index 59e678cbee..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__knuth_1984.txt.snap
+++ /dev/null
@@ -1,320 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
----
-ROOT@0..993
- ENTRY@0..993
- TYPE@0..5 "@book"
- L_DELIM@5..6 "{"
- NAME@6..16 "knuth:ct:a"
- COMMA@16..17 ","
- WHITESPACE@17..22 "\n "
- FIELD@22..56
- NAME@22..28 "author"
- WHITESPACE@28..35 " "
- EQ@35..36 "="
- WHITESPACE@36..37 " "
- CURLY_GROUP@37..55
- L_CURLY@37..38 "{"
- WORD@38..43 "Knuth"
- COMMA@43..44 ","
- WHITESPACE@44..45 " "
- WORD@45..51 "Donald"
- WHITESPACE@51..52 " "
- WORD@52..54 "E."
- R_CURLY@54..55 "}"
- COMMA@55..56 ","
- WHITESPACE@56..61 "\n "
- FIELD@61..94
- NAME@61..66 "title"
- WHITESPACE@66..74 " "
- EQ@74..75 "="
- WHITESPACE@75..76 " "
- CURLY_GROUP@76..93
- L_CURLY@76..77 "{"
- WORD@77..80 "The"
- WHITESPACE@80..81 " "
- CURLY_GROUP@81..92
- L_CURLY@81..82 "{"
- COMMAND@82..86
- COMMAND_NAME@82..86 "\\TeX"
- WHITESPACE@86..87 " "
- WORD@87..91 "book"
- R_CURLY@91..92 "}"
- R_CURLY@92..93 "}"
- COMMA@93..94 ","
- WHITESPACE@94..99 "\n "
- FIELD@99..119
- NAME@99..103 "date"
- WHITESPACE@103..112 " "
- EQ@112..113 "="
- WHITESPACE@113..114 " "
- LITERAL@114..118
- INTEGER@114..118 "1984"
- COMMA@118..119 ","
- WHITESPACE@119..124 "\n "
- FIELD@124..166
- NAME@124..133 "maintitle"
- WHITESPACE@133..137 " "
- EQ@137..138 "="
- WHITESPACE@138..139 " "
- CURLY_GROUP@139..165
- L_CURLY@139..140 "{"
- WORD@140..149 "Computers"
- WHITESPACE@149..150 " "
- COMMAND@150..152
- COMMAND_NAME@150..152 "\\&"
- WHITESPACE@152..153 " "
- WORD@153..164 "Typesetting"
- R_CURLY@164..165 "}"
- COMMA@165..166 ","
- WHITESPACE@166..171 "\n "
- FIELD@171..190
- NAME@171..177 "volume"
- WHITESPACE@177..184 " "
- EQ@184..185 "="
- WHITESPACE@185..186 " "
- CURLY_GROUP@186..189
- L_CURLY@186..187 "{"
- WORD@187..188 "A"
- R_CURLY@188..189 "}"
- COMMA@189..190 ","
- WHITESPACE@190..195 "\n "
- FIELD@195..227
- NAME@195..204 "publisher"
- WHITESPACE@204..208 " "
- EQ@208..209 "="
- WHITESPACE@209..210 " "
- CURLY_GROUP@210..226
- L_CURLY@210..211 "{"
- WORD@211..225 "Addison-Wesley"
- R_CURLY@225..226 "}"
- COMMA@226..227 ","
- WHITESPACE@227..232 "\n "
- FIELD@232..264
- NAME@232..240 "location"
- WHITESPACE@240..245 " "
- EQ@245..246 "="
- WHITESPACE@246..247 " "
- CURLY_GROUP@247..263
- L_CURLY@247..248 "{"
- WORD@248..255 "Reading"
- COMMA@255..256 ","
- WHITESPACE@256..257 " "
- WORD@257..262 "Mass."
- R_CURLY@262..263 "}"
- COMMA@263..264 ","
- WHITESPACE@264..269 "\n "
- FIELD@269..294
- NAME@269..275 "langid"
- WHITESPACE@275..282 " "
- EQ@282..283 "="
- WHITESPACE@283..284 " "
- CURLY_GROUP@284..293
- L_CURLY@284..285 "{"
- WORD@285..292 "english"
- R_CURLY@292..293 "}"
- COMMA@293..294 ","
- WHITESPACE@294..299 "\n "
- FIELD@299..333
- NAME@299..309 "langidopts"
- WHITESPACE@309..312 " "
- EQ@312..313 "="
- WHITESPACE@313..314 " "
- CURLY_GROUP@314..332
- L_CURLY@314..315 "{"
- WORD@315..331 "variant=american"
- R_CURLY@331..332 "}"
- COMMA@332..333 ","
- WHITESPACE@333..338 "\n "
- FIELD@338..381
- NAME@338..347 "sorttitle"
- WHITESPACE@347..351 " "
- EQ@351..352 "="
- WHITESPACE@352..353 " "
- CURLY_GROUP@353..380
- L_CURLY@353..354 "{"
- WORD@354..363 "Computers"
- WHITESPACE@363..364 " "
- WORD@364..365 "&"
- WHITESPACE@365..366 " "
- WORD@366..377 "Typesetting"
- WHITESPACE@377..378 " "
- WORD@378..379 "A"
- R_CURLY@379..380 "}"
- COMMA@380..381 ","
- WHITESPACE@381..386 "\n "
- FIELD@386..416
- NAME@386..400 "indexsorttitle"
- EQ@400..401 "="
- WHITESPACE@401..402 " "
- CURLY_GROUP@402..415
- L_CURLY@402..403 "{"
- WORD@403..406 "The"
- WHITESPACE@406..407 " "
- WORD@407..414 "TeXbook"
- R_CURLY@414..415 "}"
- COMMA@415..416 ","
- WHITESPACE@416..421 "\n "
- FIELD@421..461
- NAME@421..431 "indextitle"
- WHITESPACE@431..434 " "
- EQ@434..435 "="
- WHITESPACE@435..436 " "
- CURLY_GROUP@436..460
- L_CURLY@436..437 "{"
- COMMAND@437..445
- COMMAND_NAME@437..445 "\\protect"
- COMMAND@445..449
- COMMAND_NAME@445..449 "\\TeX"
- WHITESPACE@449..450 " "
- WORD@450..454 "book"
- COMMA@454..455 ","
- WHITESPACE@455..456 " "
- WORD@456..459 "The"
- R_CURLY@459..460 "}"
- COMMA@460..461 ","
- WHITESPACE@461..466 "\n "
- FIELD@466..493
- NAME@466..476 "shorttitle"
- WHITESPACE@476..479 " "
- EQ@479..480 "="
- WHITESPACE@480..481 " "
- CURLY_GROUP@481..492
- L_CURLY@481..482 "{"
- COMMAND@482..486
- COMMAND_NAME@482..486 "\\TeX"
- WHITESPACE@486..487 " "
- WORD@487..491 "book"
- R_CURLY@491..492 "}"
- COMMA@492..493 ","
- WHITESPACE@493..498 "\n "
- FIELD@498..991
- NAME@498..508 "annotation"
- WHITESPACE@508..511 " "
- EQ@511..512 "="
- WHITESPACE@512..513 " "
- CURLY_GROUP@513..990
- L_CURLY@513..514 "{"
- WORD@514..517 "The"
- WHITESPACE@517..518 " "
- WORD@518..523 "first"
- WHITESPACE@523..524 " "
- WORD@524..530 "volume"
- WHITESPACE@530..531 " "
- WORD@531..533 "of"
- WHITESPACE@533..534 " "
- WORD@534..535 "a"
- WHITESPACE@535..536 " "
- WORD@536..547 "five-volume"
- WHITESPACE@547..548 " "
- WORD@548..553 "book."
- WHITESPACE@553..554 " "
- WORD@554..558 "Note"
- WHITESPACE@558..559 " "
- WORD@559..562 "the"
- WHITESPACE@562..583 "\n "
- COMMAND@583..590
- COMMAND_NAME@583..590 "\\texttt"
- CURLY_GROUP@590..601
- L_CURLY@590..591 "{"
- WORD@591..600 "sorttitle"
- R_CURLY@600..601 "}"
- WHITESPACE@601..602 " "
- WORD@602..608 "field."
- WHITESPACE@608..609 " "
- WORD@609..611 "We"
- WHITESPACE@611..612 " "
- WORD@612..616 "want"
- WHITESPACE@616..617 " "
- WORD@617..621 "this"
- WHITESPACE@621..642 "\n "
- WORD@642..648 "volume"
- WHITESPACE@648..649 " "
- WORD@649..651 "to"
- WHITESPACE@651..652 " "
- WORD@652..654 "be"
- WHITESPACE@654..655 " "
- WORD@655..661 "listed"
- WHITESPACE@661..662 " "
- WORD@662..667 "after"
- WHITESPACE@667..668 " "
- WORD@668..671 "the"
- WHITESPACE@671..672 " "
- WORD@672..677 "entry"
- WHITESPACE@677..678 " "
- WORD@678..687 "referring"
- WHITESPACE@687..688 " "
- WORD@688..690 "to"
- WHITESPACE@690..691 " "
- WORD@691..694 "the"
- WHITESPACE@694..695 " "
- WORD@695..701 "entire"
- WHITESPACE@701..722 "\n "
- WORD@722..733 "five-volume"
- WHITESPACE@733..734 " "
- WORD@734..738 "set."
- WHITESPACE@738..739 " "
- WORD@739..743 "Also"
- WHITESPACE@743..744 " "
- WORD@744..748 "note"
- WHITESPACE@748..749 " "
- WORD@749..752 "the"
- WHITESPACE@752..753 " "
- COMMAND@753..760
- COMMAND_NAME@753..760 "\\texttt"
- CURLY_GROUP@760..772
- L_CURLY@760..761 "{"
- WORD@761..771 "indextitle"
- R_CURLY@771..772 "}"
- WHITESPACE@772..773 " "
- WORD@773..776 "and"
- WHITESPACE@776..797 "\n "
- COMMAND@797..804
- COMMAND_NAME@797..804 "\\texttt"
- CURLY_GROUP@804..820
- L_CURLY@804..805 "{"
- WORD@805..819 "indexsorttitle"
- R_CURLY@819..820 "}"
- WHITESPACE@820..821 " "
- WORD@821..828 "fields."
- WHITESPACE@828..829 " "
- WORD@829..837 "Indexing"
- WHITESPACE@837..838 " "
- WORD@838..846 "packages"
- WHITESPACE@846..847 " "
- WORD@847..851 "that"
- WHITESPACE@851..852 " "
- WORD@852..857 "don't"
- WHITESPACE@857..878 "\n "
- WORD@878..886 "generate"
- WHITESPACE@886..887 " "
- WORD@887..893 "robust"
- WHITESPACE@893..894 " "
- WORD@894..899 "index"
- WHITESPACE@899..900 " "
- WORD@900..907 "entries"
- WHITESPACE@907..908 " "
- WORD@908..915 "require"
- WHITESPACE@915..916 " "
- WORD@916..920 "some"
- WHITESPACE@920..921 " "
- WORD@921..928 "control"
- WHITESPACE@928..929 " "
- WORD@929..938 "sequences"
- WHITESPACE@938..959 "\n "
- WORD@959..961 "to"
- WHITESPACE@961..962 " "
- WORD@962..964 "be"
- WHITESPACE@964..965 " "
- WORD@965..974 "protected"
- WHITESPACE@974..975 " "
- WORD@975..979 "from"
- WHITESPACE@979..980 " "
- WORD@980..989 "expansion"
- R_CURLY@989..990 "}"
- COMMA@990..991 ","
- WHITESPACE@991..992 "\n"
- R_DELIM@992..993 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
deleted file mode 100644
index 75f0293f23..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__matuz_1990.txt.snap
+++ /dev/null
@@ -1,176 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
----
-ROOT@0..517
- ENTRY@0..517
- TYPE@0..11 "@collection"
- L_DELIM@11..12 "{"
- NAME@12..23 "matuz:doody"
- COMMA@23..24 ","
- WHITESPACE@24..29 "\n "
- FIELD@29..59
- NAME@29..35 "editor"
- WHITESPACE@35..42 " "
- EQ@42..43 "="
- WHITESPACE@43..44 " "
- CURLY_GROUP@44..58
- L_CURLY@44..45 "{"
- WORD@45..50 "Matuz"
- COMMA@50..51 ","
- WHITESPACE@51..52 " "
- WORD@52..57 "Roger"
- R_CURLY@57..58 "}"
- COMMA@58..59 ","
- WHITESPACE@59..64 "\n "
- FIELD@64..113
- NAME@64..69 "title"
- WHITESPACE@69..77 " "
- EQ@77..78 "="
- WHITESPACE@78..79 " "
- CURLY_GROUP@79..112
- L_CURLY@79..80 "{"
- WORD@80..92 "Contemporary"
- WHITESPACE@92..93 " "
- WORD@93..101 "Literary"
- WHITESPACE@101..102 " "
- WORD@102..111 "Criticism"
- R_CURLY@111..112 "}"
- COMMA@112..113 ","
- WHITESPACE@113..118 "\n "
- FIELD@118..138
- NAME@118..122 "year"
- WHITESPACE@122..131 " "
- EQ@131..132 "="
- WHITESPACE@132..133 " "
- LITERAL@133..137
- INTEGER@133..137 "1990"
- COMMA@137..138 ","
- WHITESPACE@138..143 "\n "
- FIELD@143..161
- NAME@143..149 "volume"
- WHITESPACE@149..156 " "
- EQ@156..157 "="
- WHITESPACE@157..158 " "
- LITERAL@158..160
- INTEGER@158..160 "61"
- COMMA@160..161 ","
- WHITESPACE@161..166 "\n "
- FIELD@166..188
- NAME@166..175 "publisher"
- WHITESPACE@175..179 " "
- EQ@179..180 "="
- WHITESPACE@180..181 " "
- CURLY_GROUP@181..187
- L_CURLY@181..182 "{"
- WORD@182..186 "Gale"
- R_CURLY@186..187 "}"
- COMMA@187..188 ","
- WHITESPACE@188..193 "\n "
- FIELD@193..218
- NAME@193..201 "location"
- WHITESPACE@201..206 " "
- EQ@206..207 "="
- WHITESPACE@207..208 " "
- CURLY_GROUP@208..217
- L_CURLY@208..209 "{"
- WORD@209..216 "Detroit"
- R_CURLY@216..217 "}"
- COMMA@217..218 ","
- WHITESPACE@218..223 "\n "
- FIELD@223..248
- NAME@223..228 "pages"
- WHITESPACE@228..236 " "
- EQ@236..237 "="
- WHITESPACE@237..238 " "
- CURLY_GROUP@238..247
- L_CURLY@238..239 "{"
- WORD@239..246 "204-208"
- R_CURLY@246..247 "}"
- COMMA@247..248 ","
- WHITESPACE@248..253 "\n "
- FIELD@253..278
- NAME@253..259 "langid"
- WHITESPACE@259..266 " "
- EQ@266..267 "="
- WHITESPACE@267..268 " "
- CURLY_GROUP@268..277
- L_CURLY@268..269 "{"
- WORD@269..276 "english"
- R_CURLY@276..277 "}"
- COMMA@277..278 ","
- WHITESPACE@278..283 "\n "
- FIELD@283..317
- NAME@283..293 "langidopts"
- WHITESPACE@293..296 " "
- EQ@296..297 "="
- WHITESPACE@297..298 " "
- CURLY_GROUP@298..316
- L_CURLY@298..299 "{"
- WORD@299..315 "variant=american"
- R_CURLY@315..316 "}"
- COMMA@316..317 ","
- WHITESPACE@317..322 "\n "
- FIELD@322..515
- NAME@322..332 "annotation"
- WHITESPACE@332..335 " "
- EQ@335..336 "="
- WHITESPACE@336..337 " "
- CURLY_GROUP@337..514
- L_CURLY@337..338 "{"
- WORD@338..339 "A"
- WHITESPACE@339..340 " "
- COMMAND@340..347
- COMMAND_NAME@340..347 "\\texttt"
- CURLY_GROUP@347..359
- L_CURLY@347..348 "{"
- WORD@348..358 "collection"
- R_CURLY@358..359 "}"
- WHITESPACE@359..360 " "
- WORD@360..365 "entry"
- WHITESPACE@365..366 " "
- WORD@366..375 "providing"
- WHITESPACE@375..376 " "
- WORD@376..379 "the"
- WHITESPACE@379..380 " "
- WORD@380..387 "excerpt"
- WHITESPACE@387..388 " "
- WORD@388..399 "information"
- WHITESPACE@399..420 "\n "
- WORD@420..423 "for"
- WHITESPACE@423..424 " "
- WORD@424..427 "the"
- WHITESPACE@427..428 " "
- COMMAND@428..435
- COMMAND_NAME@428..435 "\\texttt"
- CURLY_GROUP@435..442
- L_CURLY@435..436 "{"
- WORD@436..441 "doody"
- R_CURLY@441..442 "}"
- WHITESPACE@442..443 " "
- WORD@443..449 "entry."
- WHITESPACE@449..450 " "
- WORD@450..454 "Note"
- WHITESPACE@454..455 " "
- WORD@455..458 "the"
- WHITESPACE@458..459 " "
- WORD@459..465 "format"
- WHITESPACE@465..466 " "
- WORD@466..468 "of"
- WHITESPACE@468..469 " "
- WORD@469..472 "the"
- WHITESPACE@472..493 "\n "
- COMMAND@493..500
- COMMAND_NAME@493..500 "\\texttt"
- CURLY_GROUP@500..507
- L_CURLY@500..501 "{"
- WORD@501..506 "pages"
- R_CURLY@506..507 "}"
- WHITESPACE@507..508 " "
- WORD@508..513 "field"
- R_CURLY@513..514 "}"
- COMMA@514..515 ","
- WHITESPACE@515..516 "\n"
- R_DELIM@516..517 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
deleted file mode 100644
index 97fe0cf087..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__nietzsche_1998.txt.snap
+++ /dev/null
@@ -1,368 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
----
-ROOT@0..1112
- STRING@0..49
- TYPE@0..7 "@string"
- L_DELIM@7..8 "{"
- NAME@8..11 "dtv"
- WHITESPACE@11..16 " "
- EQ@16..17 "="
- WHITESPACE@17..18 " "
- CURLY_GROUP@18..48
- L_CURLY@18..19 "{"
- WORD@19..28 "Deutscher"
- WHITESPACE@28..29 " "
- WORD@29..47 "Taschenbuch-Verlag"
- R_CURLY@47..48 "}"
- R_DELIM@48..49 "}"
- JUNK@49..51 "\n\n"
- ENTRY@51..1112
- TYPE@51..58 "@mvbook"
- L_DELIM@58..59 "{"
- NAME@59..72 "nietzsche:ksa"
- COMMA@72..73 ","
- WHITESPACE@73..78 "\n "
- FIELD@78..116
- NAME@78..84 "author"
- WHITESPACE@84..91 " "
- EQ@91..92 "="
- WHITESPACE@92..93 " "
- CURLY_GROUP@93..115
- L_CURLY@93..94 "{"
- WORD@94..103 "Nietzsche"
- COMMA@103..104 ","
- WHITESPACE@104..105 " "
- WORD@105..114 "Friedrich"
- R_CURLY@114..115 "}"
- COMMA@115..116 ","
- WHITESPACE@116..121 "\n "
- FIELD@121..158
- NAME@121..126 "title"
- WHITESPACE@126..134 " "
- EQ@134..135 "="
- WHITESPACE@135..136 " "
- CURLY_GROUP@136..157
- L_CURLY@136..137 "{"
- WORD@137..138 "S"
- CURLY_GROUP@138..143
- L_CURLY@138..139 "{"
- ACCENT@139..142
- ACCENT_NAME@139..141 "\\\""
- WORD@141..142 "a"
- R_CURLY@142..143 "}"
- WORD@143..150 "mtliche"
- WHITESPACE@150..151 " "
- WORD@151..156 "Werke"
- R_CURLY@156..157 "}"
- COMMA@157..158 ","
- WHITESPACE@158..163 "\n "
- FIELD@163..183
- NAME@163..167 "date"
- WHITESPACE@167..176 " "
- EQ@176..177 "="
- WHITESPACE@177..178 " "
- LITERAL@178..182
- INTEGER@178..182 "1988"
- COMMA@182..183 ","
- WHITESPACE@183..188 "\n "
- FIELD@188..243
- NAME@188..194 "editor"
- WHITESPACE@194..201 " "
- EQ@201..202 "="
- WHITESPACE@202..203 " "
- CURLY_GROUP@203..242
- L_CURLY@203..204 "{"
- WORD@204..209 "Colli"
- COMMA@209..210 ","
- WHITESPACE@210..211 " "
- WORD@211..218 "Giorgio"
- WHITESPACE@218..219 " "
- WORD@219..222 "and"
- WHITESPACE@222..223 " "
- WORD@223..232 "Montinari"
- COMMA@232..233 ","
- WHITESPACE@233..234 " "
- WORD@234..241 "Mazzino"
- R_CURLY@241..242 "}"
- COMMA@242..243 ","
- WHITESPACE@243..248 "\n "
- FIELD@248..265
- NAME@248..255 "edition"
- WHITESPACE@255..261 " "
- EQ@261..262 "="
- WHITESPACE@262..263 " "
- LITERAL@263..264
- INTEGER@263..264 "2"
- COMMA@264..265 ","
- WHITESPACE@265..270 "\n "
- FIELD@270..288
- NAME@270..277 "volumes"
- WHITESPACE@277..283 " "
- EQ@283..284 "="
- WHITESPACE@284..285 " "
- LITERAL@285..287
- INTEGER@285..287 "15"
- COMMA@287..288 ","
- WHITESPACE@288..293 "\n "
- FIELD@293..339
- NAME@293..302 "publisher"
- WHITESPACE@302..306 " "
- EQ@306..307 "="
- WHITESPACE@307..308 " "
- JOIN@308..338
- LITERAL@308..311
- NAME@308..311 "dtv"
- WHITESPACE@311..312 " "
- POUND@312..313 "#"
- WHITESPACE@313..314 " "
- CURLY_GROUP@314..338
- L_CURLY@314..315 "{"
- WHITESPACE@315..316 " "
- WORD@316..319 "and"
- WHITESPACE@319..320 " "
- WORD@320..326 "Walter"
- WHITESPACE@326..327 " "
- WORD@327..329 "de"
- WHITESPACE@329..330 " "
- WORD@330..337 "Gruyter"
- R_CURLY@337..338 "}"
- COMMA@338..339 ","
- WHITESPACE@339..344 "\n "
- FIELD@344..397
- NAME@344..352 "location"
- WHITESPACE@352..357 " "
- EQ@357..358 "="
- WHITESPACE@358..359 " "
- CURLY_GROUP@359..396
- L_CURLY@359..360 "{"
- WORD@360..361 "M"
- CURLY_GROUP@361..366
- L_CURLY@361..362 "{"
- ACCENT@362..365
- ACCENT_NAME@362..364 "\\\""
- WORD@364..365 "u"
- R_CURLY@365..366 "}"
- WORD@366..371 "nchen"
- WHITESPACE@371..372 " "
- WORD@372..375 "and"
- WHITESPACE@375..376 " "
- WORD@376..382 "Berlin"
- WHITESPACE@382..383 " "
- WORD@383..386 "and"
- WHITESPACE@386..387 " "
- WORD@387..390 "New"
- WHITESPACE@390..391 " "
- WORD@391..395 "York"
- R_CURLY@395..396 "}"
- COMMA@396..397 ","
- WHITESPACE@397..402 "\n "
- FIELD@402..426
- NAME@402..408 "langid"
- WHITESPACE@408..415 " "
- EQ@415..416 "="
- WHITESPACE@416..417 " "
- CURLY_GROUP@417..425
- L_CURLY@417..418 "{"
- WORD@418..424 "german"
- R_CURLY@424..425 "}"
- COMMA@425..426 ","
- WHITESPACE@426..431 "\n "
- FIELD@431..461
- NAME@431..440 "sorttitle"
- WHITESPACE@440..444 " "
- EQ@444..445 "="
- WHITESPACE@445..446 " "
- CURLY_GROUP@446..460
- L_CURLY@446..447 "{"
- WORD@447..459 "Werke-00-000"
- R_CURLY@459..460 "}"
- COMMA@460..461 ","
- WHITESPACE@461..466 "\n "
- FIELD@466..500
- NAME@466..480 "indexsorttitle"
- EQ@480..481 "="
- WHITESPACE@481..482 " "
- CURLY_GROUP@482..499
- L_CURLY@482..483 "{"
- WORD@483..492 "Samtliche"
- WHITESPACE@492..493 " "
- WORD@493..498 "Werke"
- R_CURLY@498..499 "}"
- COMMA@499..500 ","
- WHITESPACE@500..505 "\n "
- FIELD@505..547
- NAME@505..513 "subtitle"
- WHITESPACE@513..518 " "
- EQ@518..519 "="
- WHITESPACE@519..520 " "
- CURLY_GROUP@520..546
- L_CURLY@520..521 "{"
- WORD@521..530 "Kritische"
- WHITESPACE@530..531 " "
- WORD@531..545 "Studienausgabe"
- R_CURLY@545..546 "}"
- COMMA@546..547 ","
- WHITESPACE@547..552 "\n "
- FIELD@552..1110
- NAME@552..562 "annotation"
- WHITESPACE@562..565 " "
- EQ@565..566 "="
- WHITESPACE@566..567 " "
- CURLY_GROUP@567..1109
- L_CURLY@567..568 "{"
- WORD@568..571 "The"
- WHITESPACE@571..572 " "
- WORD@572..580 "critical"
- WHITESPACE@580..581 " "
- WORD@581..588 "edition"
- WHITESPACE@588..589 " "
- WORD@589..591 "of"
- WHITESPACE@591..592 " "
- WORD@592..603 "Nietzsche's"
- WHITESPACE@603..604 " "
- WORD@604..610 "works."
- WHITESPACE@610..611 " "
- WORD@611..615 "This"
- WHITESPACE@615..616 " "
- WORD@616..618 "is"
- WHITESPACE@618..619 " "
- WORD@619..620 "a"
- WHITESPACE@620..641 "\n "
- COMMAND@641..648
- COMMAND_NAME@641..648 "\\texttt"
- CURLY_GROUP@648..656
- L_CURLY@648..649 "{"
- WORD@649..655 "mvbook"
- R_CURLY@655..656 "}"
- WHITESPACE@656..657 " "
- WORD@657..662 "entry"
- WHITESPACE@662..663 " "
- WORD@663..672 "referring"
- WHITESPACE@672..673 " "
- WORD@673..675 "to"
- WHITESPACE@675..676 " "
- WORD@676..677 "a"
- WHITESPACE@677..678 " "
- WORD@678..687 "15-volume"
- WHITESPACE@687..688 " "
- WORD@688..692 "work"
- WHITESPACE@692..693 " "
- WORD@693..695 "as"
- WHITESPACE@695..696 " "
- WORD@696..697 "a"
- WHITESPACE@697..718 "\n "
- WORD@718..724 "whole."
- WHITESPACE@724..725 " "
- WORD@725..729 "Note"
- WHITESPACE@729..730 " "
- WORD@730..733 "the"
- WHITESPACE@733..734 " "
- COMMAND@734..741
- COMMAND_NAME@734..741 "\\texttt"
- CURLY_GROUP@741..750
- L_CURLY@741..742 "{"
- WORD@742..749 "volumes"
- R_CURLY@749..750 "}"
- WHITESPACE@750..751 " "
- WORD@751..756 "field"
- WHITESPACE@756..757 " "
- WORD@757..760 "and"
- WHITESPACE@760..761 " "
- WORD@761..764 "the"
- WHITESPACE@764..765 " "
- WORD@765..771 "format"
- WHITESPACE@771..772 " "
- WORD@772..774 "of"
- WHITESPACE@774..775 " "
- WORD@775..778 "the"
- WHITESPACE@778..799 "\n "
- COMMAND@799..806
- COMMAND_NAME@799..806 "\\texttt"
- CURLY_GROUP@806..817
- L_CURLY@806..807 "{"
- WORD@807..816 "publisher"
- R_CURLY@816..817 "}"
- WHITESPACE@817..818 " "
- WORD@818..821 "and"
- WHITESPACE@821..822 " "
- COMMAND@822..829
- COMMAND_NAME@822..829 "\\texttt"
- CURLY_GROUP@829..839
- L_CURLY@829..830 "{"
- WORD@830..838 "location"
- R_CURLY@838..839 "}"
- WHITESPACE@839..840 " "
- WORD@840..846 "fields"
- WHITESPACE@846..847 " "
- WORD@847..849 "in"
- WHITESPACE@849..850 " "
- WORD@850..853 "the"
- WHITESPACE@853..874 "\n "
- WORD@874..882 "database"
- WHITESPACE@882..883 " "
- WORD@883..888 "file."
- WHITESPACE@888..889 " "
- WORD@889..893 "Also"
- WHITESPACE@893..894 " "
- WORD@894..898 "note"
- WHITESPACE@898..899 " "
- WORD@899..902 "the"
- WHITESPACE@902..903 " "
- COMMAND@903..910
- COMMAND_NAME@903..910 "\\texttt"
- CURLY_GROUP@910..921
- L_CURLY@910..911 "{"
- WORD@911..920 "sorttitle"
- R_CURLY@920..921 "}"
- WHITESPACE@921..922 " "
- WORD@922..925 "and"
- WHITESPACE@925..946 "\n "
- WORD@946..951 "field"
- WHITESPACE@951..952 " "
- WORD@952..957 "which"
- WHITESPACE@957..958 " "
- WORD@958..960 "is"
- WHITESPACE@960..961 " "
- WORD@961..965 "used"
- WHITESPACE@965..966 " "
- WORD@966..968 "to"
- WHITESPACE@968..969 " "
- WORD@969..978 "fine-tune"
- WHITESPACE@978..979 " "
- WORD@979..982 "the"
- WHITESPACE@982..1003 "\n "
- WORD@1003..1010 "sorting"
- WHITESPACE@1010..1011 " "
- WORD@1011..1016 "order"
- WHITESPACE@1016..1017 " "
- WORD@1017..1019 "of"
- WHITESPACE@1019..1020 " "
- WORD@1020..1023 "the"
- WHITESPACE@1023..1024 " "
- WORD@1024..1037 "bibliography."
- WHITESPACE@1037..1038 " "
- WORD@1038..1040 "We"
- WHITESPACE@1040..1041 " "
- WORD@1041..1045 "want"
- WHITESPACE@1045..1046 " "
- WORD@1046..1050 "this"
- WHITESPACE@1050..1051 " "
- WORD@1051..1055 "item"
- WHITESPACE@1055..1056 " "
- WORD@1056..1062 "listed"
- WHITESPACE@1062..1083 "\n "
- WORD@1083..1088 "first"
- WHITESPACE@1088..1089 " "
- WORD@1089..1091 "in"
- WHITESPACE@1091..1092 " "
- WORD@1092..1095 "the"
- WHITESPACE@1095..1096 " "
- WORD@1096..1108 "bibliography"
- R_CURLY@1108..1109 "}"
- COMMA@1109..1110 ","
- WHITESPACE@1110..1111 "\n"
- R_DELIM@1111..1112 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
deleted file mode 100644
index 11a8f38bac..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__bibtex__tests__parse@samples__rivest_1978.txt.snap
+++ /dev/null
@@ -1,232 +0,0 @@
----
-source: crates/parser/src/bibtex.rs
-expression: root
-input_file: crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
----
-ROOT@0..557
- ENTRY@0..557
- TYPE@0..8 "@article"
- L_DELIM@8..9 "{"
- NAME@9..30 "10.1145/359340.359342"
- COMMA@30..31 ","
- WHITESPACE@31..36 "\n "
- FIELD@36..92
- NAME@36..42 "author"
- WHITESPACE@42..43 " "
- EQ@43..44 "="
- WHITESPACE@44..45 " "
- CURLY_GROUP@45..91
- L_CURLY@45..46 "{"
- WORD@46..52 "Rivest"
- COMMA@52..53 ","
- WHITESPACE@53..54 " "
- WORD@54..56 "R."
- WHITESPACE@56..57 " "
- WORD@57..59 "L."
- WHITESPACE@59..60 " "
- WORD@60..63 "and"
- WHITESPACE@63..64 " "
- WORD@64..70 "Shamir"
- COMMA@70..71 ","
- WHITESPACE@71..72 " "
- WORD@72..74 "A."
- WHITESPACE@74..75 " "
- WORD@75..78 "and"
- WHITESPACE@78..79 " "
- WORD@79..86 "Adleman"
- COMMA@86..87 ","
- WHITESPACE@87..88 " "
- WORD@88..90 "L."
- R_CURLY@90..91 "}"
- COMMA@91..92 ","
- WHITESPACE@92..97 "\n "
- FIELD@97..178
- NAME@97..102 "title"
- WHITESPACE@102..103 " "
- EQ@103..104 "="
- WHITESPACE@104..105 " "
- CURLY_GROUP@105..177
- L_CURLY@105..106 "{"
- WORD@106..107 "A"
- WHITESPACE@107..108 " "
- WORD@108..114 "Method"
- WHITESPACE@114..115 " "
- WORD@115..118 "for"
- WHITESPACE@118..119 " "
- WORD@119..128 "Obtaining"
- WHITESPACE@128..129 " "
- WORD@129..136 "Digital"
- WHITESPACE@136..137 " "
- WORD@137..147 "Signatures"
- WHITESPACE@147..148 " "
- WORD@148..151 "and"
- WHITESPACE@151..152 " "
- WORD@152..162 "Public-Key"
- WHITESPACE@162..163 " "
- WORD@163..176 "Cryptosystems"
- R_CURLY@176..177 "}"
- COMMA@177..178 ","
- WHITESPACE@178..183 "\n "
- FIELD@183..197
- NAME@183..187 "year"
- WHITESPACE@187..188 " "
- EQ@188..189 "="
- WHITESPACE@189..190 " "
- CURLY_GROUP@190..196
- L_CURLY@190..191 "{"
- INTEGER@191..195 "1978"
- R_CURLY@195..196 "}"
- COMMA@196..197 ","
- WHITESPACE@197..202 "\n "
- FIELD@202..227
- NAME@202..212 "issue_date"
- WHITESPACE@212..213 " "
- EQ@213..214 "="
- WHITESPACE@214..215 " "
- CURLY_GROUP@215..226
- L_CURLY@215..216 "{"
- WORD@216..220 "Feb."
- WHITESPACE@220..221 " "
- INTEGER@221..225 "1978"
- R_CURLY@225..226 "}"
- COMMA@226..227 ","
- WHITESPACE@227..232 "\n "
- FIELD@232..282
- NAME@232..241 "publisher"
- WHITESPACE@241..242 " "
- EQ@242..243 "="
- WHITESPACE@243..244 " "
- CURLY_GROUP@244..281
- L_CURLY@244..245 "{"
- WORD@245..256 "Association"
- WHITESPACE@256..257 " "
- WORD@257..260 "for"
- WHITESPACE@260..261 " "
- WORD@261..270 "Computing"
- WHITESPACE@270..271 " "
- WORD@271..280 "Machinery"
- R_CURLY@280..281 "}"
- COMMA@281..282 ","
- WHITESPACE@282..287 "\n "
- FIELD@287..317
- NAME@287..294 "address"
- WHITESPACE@294..295 " "
- EQ@295..296 "="
- WHITESPACE@296..297 " "
- CURLY_GROUP@297..316
- L_CURLY@297..298 "{"
- WORD@298..301 "New"
- WHITESPACE@301..302 " "
- WORD@302..306 "York"
- COMMA@306..307 ","
- WHITESPACE@307..308 " "
- WORD@308..310 "NY"
- COMMA@310..311 ","
- WHITESPACE@311..312 " "
- WORD@312..315 "USA"
- R_CURLY@315..316 "}"
- COMMA@316..317 ","
- WHITESPACE@317..322 "\n "
- FIELD@322..336
- NAME@322..328 "volume"
- WHITESPACE@328..329 " "
- EQ@329..330 "="
- WHITESPACE@330..331 " "
- CURLY_GROUP@331..335
- L_CURLY@331..332 "{"
- INTEGER@332..334 "21"
- R_CURLY@334..335 "}"
- COMMA@335..336 ","
- WHITESPACE@336..341 "\n "
- FIELD@341..354
- NAME@341..347 "number"
- WHITESPACE@347..348 " "
- EQ@348..349 "="
- WHITESPACE@349..350 " "
- CURLY_GROUP@350..353
- L_CURLY@350..351 "{"
- INTEGER@351..352 "2"
- R_CURLY@352..353 "}"
- COMMA@353..354 ","
- WHITESPACE@354..359 "\n "
- FIELD@359..378
- NAME@359..363 "issn"
- WHITESPACE@363..364 " "
- EQ@364..365 "="
- WHITESPACE@365..366 " "
- CURLY_GROUP@366..377
- L_CURLY@366..367 "{"
- WORD@367..376 "0001-0782"
- R_CURLY@376..377 "}"
- COMMA@377..378 ","
- WHITESPACE@378..383 "\n "
- FIELD@383..429
- NAME@383..386 "url"
- WHITESPACE@386..387 " "
- EQ@387..388 "="
- WHITESPACE@388..389 " "
- CURLY_GROUP@389..428
- L_CURLY@389..390 "{"
- WORD@390..427 "https://doi.org/10.11 ..."
- R_CURLY@427..428 "}"
- COMMA@428..429 ","
- WHITESPACE@429..434 "\n "
- FIELD@434..464
- NAME@434..437 "doi"
- WHITESPACE@437..438 " "
- EQ@438..439 "="
- WHITESPACE@439..440 " "
- CURLY_GROUP@440..463
- L_CURLY@440..441 "{"
- WORD@441..462 "10.1145/359340.359342"
- R_CURLY@462..463 "}"
- COMMA@463..464 ","
- WHITESPACE@464..469 "\n "
- FIELD@469..493
- NAME@469..476 "journal"
- WHITESPACE@476..477 " "
- EQ@477..478 "="
- WHITESPACE@478..479 " "
- CURLY_GROUP@479..492
- L_CURLY@479..480 "{"
- WORD@480..487 "Commun."
- WHITESPACE@487..488 " "
- WORD@488..491 "ACM"
- R_CURLY@491..492 "}"
- COMMA@492..493 ","
- WHITESPACE@493..498 "\n "
- FIELD@498..512
- NAME@498..503 "month"
- WHITESPACE@503..504 " "
- EQ@504..505 "="
- WHITESPACE@505..506 " "
- CURLY_GROUP@506..511
- L_CURLY@506..507 "{"
- WORD@507..510 "feb"
- R_CURLY@510..511 "}"
- COMMA@511..512 ","
- WHITESPACE@512..517 "\n "
- FIELD@517..535
- NAME@517..522 "pages"
- WHITESPACE@522..523 " "
- EQ@523..524 "="
- WHITESPACE@524..525 " "
- CURLY_GROUP@525..534
- L_CURLY@525..526 "{"
- WORD@526..533 "120-126"
- R_CURLY@533..534 "}"
- COMMA@534..535 ","
- WHITESPACE@535..540 "\n "
- FIELD@540..555
- NAME@540..548 "numpages"
- WHITESPACE@548..549 " "
- EQ@549..550 "="
- WHITESPACE@550..551 " "
- CURLY_GROUP@551..554
- L_CURLY@551..552 "{"
- INTEGER@552..553 "7"
- R_CURLY@553..554 "}"
- COMMA@554..555 ","
- WHITESPACE@555..556 "\n"
- R_DELIM@556..557 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
deleted file mode 100644
index 39808505c1..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@001.txt.snap
+++ /dev/null
@@ -1,27 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/001.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "Overfull \\hbox (200.00162pt too wide) in paragraph at lines 8--9",
- hint: None,
- line: Some(
- 7,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "Overfull \\vbox (3.19998pt too high) detected at line 23",
- hint: None,
- line: Some(
- 22,
- ),
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
deleted file mode 100644
index 6d4001e120..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@002.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/002.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "./child.tex",
- level: Error,
- message: "Undefined control sequence.",
- hint: Some(
- "\\foo",
- ),
- line: Some(
- 0,
- ),
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
deleted file mode 100644
index bbc50a44c2..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@003.txt.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/003.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "LaTeX Warning: Citation `foo' on page 1 undefined on input line 6.",
- hint: None,
- line: Some(
- 5,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "LaTeX Warning: There were undefined references.",
- hint: None,
- line: None,
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
deleted file mode 100644
index c4f2ce5c72..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@004.txt.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/004.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty",
- level: Error,
- message: "Package babel Error: Unknown option `foo'. Either you misspelled it or the language definition file foo.ldf was not found.",
- hint: Some(
- "\\ProcessOptions*",
- ),
- line: Some(
- 392,
- ),
- },
- BuildError {
- relative_path: "/TexLive/texmf-dist/tex/generic/babel/babel.sty",
- level: Error,
- message: "Package babel Error: You haven't specified a language option.",
- hint: Some(
- "ry to proceed from here, type x to quit.}",
- ),
- line: Some(
- 425,
- ),
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
deleted file mode 100644
index dafd6a4506..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@005.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/005.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing. Loading 'csquotes' recommended.",
- hint: None,
- line: None,
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "LaTeX Warning: There were undefined references.",
- hint: None,
- line: None,
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Warning,
- message: "Package biblatex Warning: Please (re)run Biber on the file: parent and rerun LaTeX afterwards.",
- hint: None,
- line: None,
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
deleted file mode 100644
index ca9318c68d..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@006.txt.snap
+++ /dev/null
@@ -1,69 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/006.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Undefined control sequence.",
- hint: Some(
- "\\foo",
- ),
- line: Some(
- 6,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Missing $ inserted.",
- hint: Some(
- "\\bar",
- ),
- line: Some(
- 7,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Undefined control sequence.",
- hint: Some(
- "\\baz",
- ),
- line: Some(
- 8,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Missing { inserted.",
- hint: None,
- line: Some(
- 9,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Missing $ inserted.",
- hint: None,
- line: Some(
- 9,
- ),
- },
- BuildError {
- relative_path: "./parent.tex",
- level: Error,
- message: "Missing } inserted.",
- hint: None,
- line: Some(
- 9,
- ),
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
deleted file mode 100644
index bf0c832fe2..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__build_log__tests__parse@007.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/build_log.rs
-expression: parse_build_log(&text)
-input_file: crates/parser/src/test_data/build_log/007.txt
----
-BuildLog {
- errors: [
- BuildError {
- relative_path: "/some/folder/a.tex",
- level: Error,
- message: "Undefined control sequence.",
- hint: Some(
- "\\lsdkfjlskdfj",
- ),
- line: Some(
- 3,
- ),
- },
- ],
-}
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
deleted file mode 100644
index b93689a3b9..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@block_comments.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/block_comments.txt
----
-ROOT@0..48
- PREAMBLE@0..48
- TEXT@0..4
- WORD@0..3 "Foo"
- LINE_BREAK@3..4 "\n"
- BLOCK_COMMENT@4..22
- COMMAND_NAME@4..12 "\\iffalse"
- LINE_BREAK@12..13 "\n"
- WORD@13..18 "Test1"
- LINE_BREAK@18..19 "\n"
- COMMAND_NAME@19..22 "\\fi"
- LINE_BREAK@22..23 "\n"
- TEXT@23..27
- WORD@23..26 "Bar"
- LINE_BREAK@26..27 "\n"
- BLOCK_COMMENT@27..44
- COMMAND_NAME@27..35 "\\iffalse"
- LINE_BREAK@35..36 "\n"
- COMMAND_NAME@36..40 "\\fii"
- LINE_BREAK@40..41 "\n"
- COMMAND_NAME@41..44 "\\fi"
- LINE_BREAK@44..45 "\n"
- TEXT@45..48
- WORD@45..48 "Baz"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
deleted file mode 100644
index bb82661568..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/caption/caption_default.txt
----
-ROOT@0..27
- PREAMBLE@0..27
- CAPTION@0..27
- COMMAND_NAME@0..8 "\\caption"
- BRACK_GROUP@8..13
- L_BRACK@8..9 "["
- TEXT@9..12
- WORD@9..12 "qux"
- R_BRACK@12..13 "]"
- CURLY_GROUP@13..27
- L_CURLY@13..14 "{"
- TEXT@14..18
- WORD@14..17 "Foo"
- WHITESPACE@17..18 " "
- GENERIC_COMMAND@18..23
- COMMAND_NAME@18..22 "\\Bar"
- WHITESPACE@22..23 " "
- TEXT@23..26
- WORD@23..26 "Baz"
- R_CURLY@26..27 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
deleted file mode 100644
index 741d4ea0c4..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_default_error.txt.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/caption/caption_default_error.txt
----
-ROOT@0..26
- PREAMBLE@0..26
- CAPTION@0..26
- COMMAND_NAME@0..8 "\\caption"
- BRACK_GROUP@8..13
- L_BRACK@8..9 "["
- TEXT@9..12
- WORD@9..12 "qux"
- R_BRACK@12..13 "]"
- CURLY_GROUP@13..26
- L_CURLY@13..14 "{"
- TEXT@14..18
- WORD@14..17 "Foo"
- WHITESPACE@17..18 " "
- GENERIC_COMMAND@18..23
- COMMAND_NAME@18..22 "\\Bar"
- WHITESPACE@22..23 " "
- TEXT@23..26
- WORD@23..26 "Baz"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
deleted file mode 100644
index 56735873f9..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_figure.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/caption/caption_figure.txt
----
-ROOT@0..39
- PREAMBLE@0..39
- ENVIRONMENT@0..39
- BEGIN@0..14
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..14
- L_CURLY@6..7 "{"
- KEY@7..13
- WORD@7..13 "figure"
- R_CURLY@13..14 "}"
- CAPTION@14..27
- COMMAND_NAME@14..22 "\\caption"
- CURLY_GROUP@22..27
- L_CURLY@22..23 "{"
- TEXT@23..26
- WORD@23..26 "Foo"
- R_CURLY@26..27 "}"
- END@27..39
- COMMAND_NAME@27..31 "\\end"
- CURLY_GROUP_WORD@31..39
- L_CURLY@31..32 "{"
- KEY@32..38
- WORD@32..38 "figure"
- R_CURLY@38..39 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
deleted file mode 100644
index 12ef5ffebb..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal.txt.snap
+++ /dev/null
@@ -1,21 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/caption/caption_minimal.txt
----
-ROOT@0..22
- PREAMBLE@0..22
- CAPTION@0..22
- COMMAND_NAME@0..8 "\\caption"
- CURLY_GROUP@8..22
- L_CURLY@8..9 "{"
- TEXT@9..13
- WORD@9..12 "Foo"
- WHITESPACE@12..13 " "
- GENERIC_COMMAND@13..18
- COMMAND_NAME@13..17 "\\Bar"
- WHITESPACE@17..18 " "
- TEXT@18..21
- WORD@18..21 "Baz"
- R_CURLY@21..22 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
deleted file mode 100644
index 7bc85c0b20..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@caption__caption_minimal_error.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
----
-ROOT@0..21
- PREAMBLE@0..21
- CAPTION@0..21
- COMMAND_NAME@0..8 "\\caption"
- CURLY_GROUP@8..21
- L_CURLY@8..9 "{"
- TEXT@9..13
- WORD@9..12 "Foo"
- WHITESPACE@12..13 " "
- GENERIC_COMMAND@13..18
- COMMAND_NAME@13..17 "\\Bar"
- WHITESPACE@17..18 " "
- TEXT@18..21
- WORD@18..21 "Baz"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
deleted file mode 100644
index d35246b26c..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_empty.txt.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_empty.txt
----
-ROOT@0..7
- PREAMBLE@0..7
- CITATION@0..7
- COMMAND_NAME@0..5 "\\cite"
- CURLY_GROUP_WORD_LIST@5..7
- L_CURLY@5..6 "{"
- R_CURLY@6..7 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
deleted file mode 100644
index 0855ea49ad..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_missing_brace.txt.snap
+++ /dev/null
@@ -1,14 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
----
-ROOT@0..9
- PREAMBLE@0..9
- CITATION@0..9
- COMMAND_NAME@0..5 "\\cite"
- CURLY_GROUP_WORD_LIST@5..9
- L_CURLY@5..6 "{"
- KEY@6..9
- WORD@6..9 "foo"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
deleted file mode 100644
index e4d49e796e..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_multiple_keys.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
----
-ROOT@0..15
- PREAMBLE@0..15
- CITATION@0..15
- COMMAND_NAME@0..5 "\\cite"
- CURLY_GROUP_WORD_LIST@5..15
- L_CURLY@5..6 "{"
- KEY@6..9
- WORD@6..9 "foo"
- COMMA@9..10 ","
- WHITESPACE@10..11 " "
- KEY@11..14
- WORD@11..14 "bar"
- R_CURLY@14..15 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
deleted file mode 100644
index 654b97dfd9..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_prenote.txt
----
-ROOT@0..15
- PREAMBLE@0..15
- CITATION@0..15
- COMMAND_NAME@0..5 "\\cite"
- BRACK_GROUP@5..10
- L_BRACK@5..6 "["
- TEXT@6..9
- WORD@6..9 "foo"
- R_BRACK@9..10 "]"
- CURLY_GROUP_WORD_LIST@10..15
- L_CURLY@10..11 "{"
- KEY@11..14
- WORD@11..14 "bar"
- R_CURLY@14..15 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
deleted file mode 100644
index ca83218dfb..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_prenote_postnote.txt.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- CITATION@0..20
- COMMAND_NAME@0..5 "\\cite"
- BRACK_GROUP@5..10
- L_BRACK@5..6 "["
- TEXT@6..9
- WORD@6..9 "foo"
- R_BRACK@9..10 "]"
- BRACK_GROUP@10..15
- L_BRACK@10..11 "["
- TEXT@11..14
- WORD@11..14 "bar"
- R_BRACK@14..15 "]"
- CURLY_GROUP_WORD_LIST@15..20
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "baz"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
deleted file mode 100644
index 015abf7011..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_redundant_comma.txt.snap
+++ /dev/null
@@ -1,17 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
----
-ROOT@0..12
- PREAMBLE@0..12
- CITATION@0..12
- COMMAND_NAME@0..5 "\\cite"
- CURLY_GROUP_WORD_LIST@5..12
- L_CURLY@5..6 "{"
- COMMA@6..7 ","
- KEY@7..10
- WORD@7..10 "foo"
- COMMA@10..11 ","
- R_CURLY@11..12 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
deleted file mode 100644
index 99cc891d2b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_simple.txt
----
-ROOT@0..10
- PREAMBLE@0..10
- CITATION@0..10
- COMMAND_NAME@0..5 "\\cite"
- CURLY_GROUP_WORD_LIST@5..10
- L_CURLY@5..6 "{"
- KEY@6..9
- WORD@6..9 "foo"
- R_CURLY@9..10 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
deleted file mode 100644
index 4b66a7e7d9..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@citation__citation_star.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/citation/citation_star.txt
----
-ROOT@0..10
- PREAMBLE@0..10
- CITATION@0..10
- COMMAND_NAME@0..7 "\\nocite"
- CURLY_GROUP_WORD_LIST@7..10
- L_CURLY@7..8 "{"
- KEY@8..9
- WORD@8..9 "*"
- R_CURLY@9..10 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
deleted file mode 100644
index d38951b148..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_definition_simple.txt.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_definition_simple.txt
----
-ROOT@0..33
- PREAMBLE@0..33
- COLOR_DEFINITION@0..33
- COMMAND_NAME@0..12 "\\definecolor"
- CURLY_GROUP_WORD@12..17
- L_CURLY@12..13 "{"
- KEY@13..16
- WORD@13..16 "foo"
- R_CURLY@16..17 "}"
- CURLY_GROUP_WORD@17..22
- L_CURLY@17..18 "{"
- KEY@18..21
- WORD@18..21 "rgb"
- R_CURLY@21..22 "}"
- CURLY_GROUP@22..33
- L_CURLY@22..23 "{"
- TEXT@23..32
- WORD@23..26 "255"
- COMMA@26..27 ","
- WORD@27..30 "168"
- COMMA@30..31 ","
- WORD@31..32 "0"
- R_CURLY@32..33 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
deleted file mode 100644
index dbf153dc18..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_reference_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_reference_simple.txt
----
-ROOT@0..13
- PREAMBLE@0..13
- COLOR_REFERENCE@0..13
- COMMAND_NAME@0..6 "\\color"
- CURLY_GROUP_WORD@6..13
- L_CURLY@6..7 "{"
- KEY@7..12
- WORD@7..12 "black"
- R_CURLY@12..13 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
deleted file mode 100644
index 9e3317ac05..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error1.txt.snap
+++ /dev/null
@@ -1,33 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
----
-ROOT@0..39
- PREAMBLE@0..39
- COLOR_SET_DEFINITION@0..39
- COMMAND_NAME@0..15 "\\definecolorset"
- BRACK_GROUP_WORD@15..19
- L_BRACK@15..16 "["
- KEY@16..18
- WORD@16..18 "ty"
- R_BRACK@18..19 "]"
- CURLY_GROUP_WORD_LIST@19..29
- L_CURLY@19..20 "{"
- KEY@20..23
- WORD@20..23 "rgb"
- COMMA@23..24 ","
- KEY@24..28
- WORD@24..28 "HTML"
- R_CURLY@28..29 "}"
- CURLY_GROUP_WORD@29..34
- L_CURLY@29..30 "{"
- KEY@30..33
- WORD@30..33 "foo"
- R_CURLY@33..34 "}"
- CURLY_GROUP_WORD@34..39
- L_CURLY@34..35 "{"
- KEY@35..38
- WORD@35..38 "bar"
- R_CURLY@38..39 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
deleted file mode 100644
index 04b75973e5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error2.txt.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
----
-ROOT@0..30
- PREAMBLE@0..30
- COLOR_SET_DEFINITION@0..30
- COMMAND_NAME@0..15 "\\definecolorset"
- CURLY_GROUP_WORD_LIST@15..25
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "rgb"
- COMMA@19..20 ","
- KEY@20..24
- WORD@20..24 "HTML"
- R_CURLY@24..25 "}"
- CURLY_GROUP_WORD@25..30
- L_CURLY@25..26 "{"
- KEY@26..29
- WORD@26..29 "foo"
- R_CURLY@29..30 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
deleted file mode 100644
index 1133778fbf..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error3.txt.snap
+++ /dev/null
@@ -1,18 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
----
-ROOT@0..25
- PREAMBLE@0..25
- COLOR_SET_DEFINITION@0..25
- COMMAND_NAME@0..15 "\\definecolorset"
- CURLY_GROUP_WORD_LIST@15..25
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "rgb"
- COMMA@19..20 ","
- KEY@20..24
- WORD@20..24 "HTML"
- R_CURLY@24..25 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
deleted file mode 100644
index 11d175d732..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_error4.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
----
-ROOT@0..15
- PREAMBLE@0..15
- COLOR_SET_DEFINITION@0..15
- COMMAND_NAME@0..15 "\\definecolorset"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
deleted file mode 100644
index 903a780989..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@color__color_set_definition_simple.txt.snap
+++ /dev/null
@@ -1,38 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
----
-ROOT@0..44
- PREAMBLE@0..44
- COLOR_SET_DEFINITION@0..44
- COMMAND_NAME@0..15 "\\definecolorset"
- BRACK_GROUP_WORD@15..19
- L_BRACK@15..16 "["
- KEY@16..18
- WORD@16..18 "ty"
- R_BRACK@18..19 "]"
- CURLY_GROUP_WORD_LIST@19..29
- L_CURLY@19..20 "{"
- KEY@20..23
- WORD@20..23 "rgb"
- COMMA@23..24 ","
- KEY@24..28
- WORD@24..28 "HTML"
- R_CURLY@28..29 "}"
- CURLY_GROUP_WORD@29..34
- L_CURLY@29..30 "{"
- KEY@30..33
- WORD@30..33 "foo"
- R_CURLY@33..34 "}"
- CURLY_GROUP_WORD@34..39
- L_CURLY@34..35 "{"
- KEY@35..38
- WORD@35..38 "bar"
- R_CURLY@38..39 "}"
- CURLY_GROUP_WORD@39..44
- L_CURLY@39..40 "{"
- KEY@40..43
- WORD@40..43 "baz"
- R_CURLY@43..44 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
deleted file mode 100644
index c4d51b8248..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_argc.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
----
-ROOT@0..22
- PREAMBLE@0..22
- COMMAND_DEFINITION@0..22
- COMMAND_NAME@0..11 "\\newcommand"
- CURLY_GROUP_COMMAND@11..17
- L_CURLY@11..12 "{"
- COMMAND_NAME@12..16 "\\foo"
- R_CURLY@16..17 "}"
- CURLY_GROUP@17..22
- L_CURLY@17..18 "{"
- TEXT@18..21
- WORD@18..21 "foo"
- R_CURLY@21..22 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
deleted file mode 100644
index 4170bbb233..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl.txt.snap
+++ /dev/null
@@ -1,14 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
----
-ROOT@0..17
- PREAMBLE@0..17
- COMMAND_DEFINITION@0..17
- COMMAND_NAME@0..11 "\\newcommand"
- CURLY_GROUP_COMMAND@11..17
- L_CURLY@11..12 "{"
- COMMAND_NAME@12..16 "\\foo"
- R_CURLY@16..17 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
deleted file mode 100644
index 8a3bd36895..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_no_impl_error.txt.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
----
-ROOT@0..16
- PREAMBLE@0..16
- COMMAND_DEFINITION@0..16
- COMMAND_NAME@0..11 "\\newcommand"
- CURLY_GROUP_COMMAND@11..16
- L_CURLY@11..12 "{"
- COMMAND_NAME@12..16 "\\foo"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
deleted file mode 100644
index ff11be61d4..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_optional.txt.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
----
-ROOT@0..29
- PREAMBLE@0..29
- COMMAND_DEFINITION@0..29
- COMMAND_NAME@0..11 "\\newcommand"
- CURLY_GROUP_COMMAND@11..17
- L_CURLY@11..12 "{"
- COMMAND_NAME@12..16 "\\foo"
- R_CURLY@16..17 "}"
- BRACK_GROUP_WORD@17..20
- L_BRACK@17..18 "["
- KEY@18..19
- WORD@18..19 "1"
- R_BRACK@19..20 "]"
- BRACK_GROUP@20..25
- L_BRACK@20..21 "["
- TEXT@21..24
- WORD@21..24 "def"
- R_BRACK@24..25 "]"
- CURLY_GROUP@25..29
- L_CURLY@25..26 "{"
- TEXT@26..28
- WORD@26..28 "#1"
- R_CURLY@28..29 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
deleted file mode 100644
index 1d5fb28686..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_simple.txt.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
----
-ROOT@0..23
- PREAMBLE@0..23
- COMMAND_DEFINITION@0..19
- COMMAND_NAME@0..11 "\\newcommand"
- BRACK_GROUP_WORD@11..14
- L_BRACK@11..12 "["
- KEY@12..13
- WORD@12..13 "1"
- R_BRACK@13..14 "]"
- CURLY_GROUP@14..19
- L_CURLY@14..15 "{"
- GENERIC_COMMAND@15..18
- COMMAND_NAME@15..18 "\\id"
- R_CURLY@18..19 "}"
- CURLY_GROUP@19..23
- L_CURLY@19..20 "{"
- TEXT@20..22
- WORD@20..22 "#1"
- R_CURLY@22..23 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
deleted file mode 100644
index 3e58111e6b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__command_definition_with_begin.txt.snap
+++ /dev/null
@@ -1,39 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
----
-ROOT@0..80
- PREAMBLE@0..80
- COMMAND_DEFINITION@0..80
- COMMAND_NAME@0..11 "\\newcommand"
- CURLY_GROUP_COMMAND@11..35
- L_CURLY@11..12 "{"
- COMMAND_NAME@12..34 "\\CVSubHeadingListStart"
- R_CURLY@34..35 "}"
- CURLY_GROUP@35..80
- L_CURLY@35..36 "{"
- BEGIN@36..79
- COMMAND_NAME@36..42 "\\begin"
- CURLY_GROUP_WORD@42..51
- L_CURLY@42..43 "{"
- KEY@43..50
- WORD@43..50 "itemize"
- R_CURLY@50..51 "}"
- BRACK_GROUP@51..79
- L_BRACK@51..52 "["
- TEXT@52..62
- WORD@52..62 "leftmargin"
- EQUALITY_SIGN@62..63 "="
- TEXT@63..75
- WORD@63..68 "0.5cm"
- COMMA@68..69 ","
- WHITESPACE@69..70 " "
- WORD@70..75 "label"
- EQUALITY_SIGN@75..76 "="
- CURLY_GROUP@76..78
- L_CURLY@76..77 "{"
- R_CURLY@77..78 "}"
- R_BRACK@78..79 "]"
- R_CURLY@79..80 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
deleted file mode 100644
index ea401584af..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_no_impl.txt.snap
+++ /dev/null
@@ -1,14 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
----
-ROOT@0..26
- PREAMBLE@0..26
- MATH_OPERATOR@0..26
- COMMAND_NAME@0..20 "\\DeclareMathOperator"
- CURLY_GROUP_COMMAND@20..26
- L_CURLY@20..21 "{"
- COMMAND_NAME@21..25 "\\foo"
- R_CURLY@25..26 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
deleted file mode 100644
index 2833943059..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@command_definition__math_operator_simple.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
----
-ROOT@0..31
- PREAMBLE@0..31
- MATH_OPERATOR@0..31
- COMMAND_NAME@0..20 "\\DeclareMathOperator"
- CURLY_GROUP_COMMAND@20..26
- L_CURLY@20..21 "{"
- COMMAND_NAME@21..25 "\\foo"
- R_CURLY@25..26 "}"
- CURLY_GROUP@26..31
- L_CURLY@26..27 "{"
- TEXT@27..30
- WORD@27..30 "foo"
- R_CURLY@30..31 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
deleted file mode 100644
index 48f11f6285..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_asymptote.txt.snap
+++ /dev/null
@@ -1,41 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_asymptote.txt
----
-ROOT@0..50
- PREAMBLE@0..50
- ENVIRONMENT@0..50
- BEGIN@0..16
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..16
- L_CURLY@6..7 "{"
- KEY@7..10
- WORD@7..10 "asy"
- R_CURLY@10..11 "}"
- LINE_BREAK@11..12 "\n"
- WHITESPACE@12..16 " "
- TEXT@16..22
- WORD@16..22 "printf"
- MIXED_GROUP@22..39
- L_PAREN@22..23 "("
- TEXT@23..35
- WORD@23..29 "\"Hello"
- WHITESPACE@29..30 " "
- WORD@30..35 "World"
- GENERIC_COMMAND@35..37
- COMMAND_NAME@35..37 "\\n"
- TEXT@37..38
- WORD@37..38 "\""
- R_PAREN@38..39 ")"
- TEXT@39..41
- WORD@39..40 ";"
- LINE_BREAK@40..41 "\n"
- END@41..50
- COMMAND_NAME@41..45 "\\end"
- CURLY_GROUP_WORD@45..50
- L_CURLY@45..46 "{"
- KEY@46..49
- WORD@46..49 "asy"
- R_CURLY@49..50 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
deleted file mode 100644
index 2403d60ef1..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition.txt.snap
+++ /dev/null
@@ -1,40 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_definition.txt
----
-ROOT@0..47
- PREAMBLE@0..47
- ENVIRONMENT_DEFINITION@0..47
- COMMAND_NAME@0..15 "\\newenvironment"
- CURLY_GROUP_WORD@15..20
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "bar"
- R_CURLY@19..20 "}"
- BRACK_GROUP_WORD@20..23
- L_BRACK@20..21 "["
- KEY@21..22
- WORD@21..22 "1"
- R_BRACK@22..23 "]"
- CURLY_GROUP@23..36
- L_CURLY@23..24 "{"
- GENERIC_COMMAND@24..35
- COMMAND_NAME@24..30 "\\begin"
- CURLY_GROUP@30..35
- L_CURLY@30..31 "{"
- TEXT@31..34
- WORD@31..34 "foo"
- R_CURLY@34..35 "}"
- R_CURLY@35..36 "}"
- CURLY_GROUP@36..47
- L_CURLY@36..37 "{"
- GENERIC_COMMAND@37..46
- COMMAND_NAME@37..41 "\\end"
- CURLY_GROUP@41..46
- L_CURLY@41..42 "{"
- TEXT@42..45
- WORD@42..45 "foo"
- R_CURLY@45..46 "}"
- R_CURLY@46..47 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
deleted file mode 100644
index ae0fbd931a..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_definition_optional_arg.txt.snap
+++ /dev/null
@@ -1,35 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
----
-ROOT@0..44
- PREAMBLE@0..44
- ENVIRONMENT_DEFINITION@0..44
- COMMAND_NAME@0..15 "\\newenvironment"
- CURLY_GROUP_WORD@15..20
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "foo"
- R_CURLY@19..20 "}"
- BRACK_GROUP_WORD@20..23
- L_BRACK@20..21 "["
- KEY@21..22
- WORD@21..22 "1"
- R_BRACK@22..23 "]"
- BRACK_GROUP@23..32
- L_BRACK@23..24 "["
- TEXT@24..31
- WORD@24..31 "default"
- R_BRACK@31..32 "]"
- CURLY_GROUP@32..39
- L_CURLY@32..33 "{"
- TEXT@33..38
- WORD@33..38 "begin"
- R_CURLY@38..39 "}"
- CURLY_GROUP@39..44
- L_CURLY@39..40 "{"
- TEXT@40..43
- WORD@40..43 "end"
- R_CURLY@43..44 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
deleted file mode 100644
index b4e1d6a458..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested.txt.snap
+++ /dev/null
@@ -1,41 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_nested.txt
----
-ROOT@0..43
- PREAMBLE@0..43
- ENVIRONMENT@0..43
- BEGIN@0..12
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..12
- L_CURLY@6..7 "{"
- KEY@7..10
- WORD@7..10 "foo"
- R_CURLY@10..11 "}"
- WHITESPACE@11..12 " "
- ENVIRONMENT@12..34
- BEGIN@12..24
- COMMAND_NAME@12..18 "\\begin"
- CURLY_GROUP_WORD@18..24
- L_CURLY@18..19 "{"
- KEY@19..22
- WORD@19..22 "qux"
- R_CURLY@22..23 "}"
- WHITESPACE@23..24 " "
- END@24..34
- COMMAND_NAME@24..28 "\\end"
- CURLY_GROUP_WORD@28..34
- L_CURLY@28..29 "{"
- KEY@29..32
- WORD@29..32 "baz"
- R_CURLY@32..33 "}"
- WHITESPACE@33..34 " "
- END@34..43
- COMMAND_NAME@34..38 "\\end"
- CURLY_GROUP_WORD@38..43
- L_CURLY@38..39 "{"
- KEY@39..42
- WORD@39..42 "bar"
- R_CURLY@42..43 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
deleted file mode 100644
index 5d67bfe665..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_nested_missing_braces.txt.snap
+++ /dev/null
@@ -1,42 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
----
-ROOT@0..52
- PREAMBLE@0..52
- ENVIRONMENT@0..52
- BEGIN@0..11
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..11
- L_CURLY@6..7 "{"
- KEY@7..11
- WORD@7..10 "foo"
- WHITESPACE@10..11 " "
- ENVIRONMENT@11..44
- BEGIN@11..34
- COMMAND_NAME@11..17 "\\begin"
- CURLY_GROUP_WORD@17..34
- L_CURLY@17..18 "{"
- KEY@18..34
- WORD@18..21 "qux"
- WHITESPACE@21..22 " "
- WORD@22..27 "Hello"
- WHITESPACE@27..28 " "
- WORD@28..33 "World"
- WHITESPACE@33..34 " "
- END@34..44
- COMMAND_NAME@34..38 "\\end"
- CURLY_GROUP_WORD@38..44
- L_CURLY@38..39 "{"
- KEY@39..42
- WORD@39..42 "baz"
- R_CURLY@42..43 "}"
- WHITESPACE@43..44 " "
- END@44..52
- COMMAND_NAME@44..48 "\\end"
- CURLY_GROUP_WORD@48..52
- L_CURLY@48..49 "{"
- KEY@49..52
- WORD@49..52 "bar"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
deleted file mode 100644
index f74b68fdf7..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@environment__environment_simple.txt.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/environment/environment_simple.txt
----
-ROOT@0..33
- PREAMBLE@0..33
- ENVIRONMENT@0..33
- BEGIN@0..12
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..12
- L_CURLY@6..7 "{"
- KEY@7..10
- WORD@7..10 "foo"
- R_CURLY@10..11 "}"
- WHITESPACE@11..12 " "
- TEXT@12..24
- WORD@12..17 "Hello"
- WHITESPACE@17..18 " "
- WORD@18..23 "World"
- WHITESPACE@23..24 " "
- END@24..33
- COMMAND_NAME@24..28 "\\end"
- CURLY_GROUP_WORD@28..33
- L_CURLY@28..29 "{"
- KEY@29..32
- WORD@29..32 "bar"
- R_CURLY@32..33 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
deleted file mode 100644
index 71fff49984..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation.txt.snap
+++ /dev/null
@@ -1,17 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/equation.txt
----
-ROOT@0..13
- PREAMBLE@0..13
- EQUATION@0..13
- COMMAND_NAME@0..2 "\\["
- WHITESPACE@2..3 " "
- TEXT@3..11
- WORD@3..6 "foo"
- WHITESPACE@6..7 " "
- WORD@7..10 "bar"
- WHITESPACE@10..11 " "
- COMMAND_NAME@11..13 "\\]"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
deleted file mode 100644
index 1590fbed73..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@equation_missing_begin.txt.snap
+++ /dev/null
@@ -1,32 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/equation_missing_begin.txt
----
-ROOT@0..28
- PREAMBLE@0..28
- ENVIRONMENT@0..28
- BEGIN@0..10
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..10
- L_CURLY@6..7 "{"
- KEY@7..8
- WORD@7..8 "a"
- R_CURLY@8..9 "}"
- WHITESPACE@9..10 " "
- TEXT@10..18
- WORD@10..13 "foo"
- WHITESPACE@13..14 " "
- WORD@14..17 "bar"
- WHITESPACE@17..18 " "
- GENERIC_COMMAND@18..21
- COMMAND_NAME@18..20 "\\]"
- WHITESPACE@20..21 " "
- END@21..28
- COMMAND_NAME@21..25 "\\end"
- CURLY_GROUP_WORD@25..28
- L_CURLY@25..26 "{"
- KEY@26..27
- WORD@26..27 "b"
- R_CURLY@27..28 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
deleted file mode 100644
index 9057d8f024..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_args.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/generic_command_args.txt
----
-ROOT@0..14
- PREAMBLE@0..14
- GENERIC_COMMAND@0..14
- COMMAND_NAME@0..4 "\\foo"
- CURLY_GROUP@4..9
- L_CURLY@4..5 "{"
- TEXT@5..8
- WORD@5..8 "bar"
- R_CURLY@8..9 "}"
- MIXED_GROUP@9..14
- L_BRACK@9..10 "["
- TEXT@10..13
- WORD@10..13 "qux"
- R_BRACK@13..14 "]"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
deleted file mode 100644
index ee8f593395..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_empty.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/generic_command_empty.txt
----
-ROOT@0..4
- PREAMBLE@0..4
- GENERIC_COMMAND@0..4
- COMMAND_NAME@0..4 "\\foo"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
deleted file mode 100644
index f973be4b12..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@generic_command_escape.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/generic_command_escape.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- GENERIC_COMMAND@0..2
- COMMAND_NAME@0..2 "\\#"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
deleted file mode 100644
index fb24afbf24..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_declaration.txt.snap
+++ /dev/null
@@ -1,50 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
----
-ROOT@0..64
- PREAMBLE@0..64
- ACRONYM_DECLARATION@0..64
- COMMAND_NAME@0..15 "\\DeclareAcronym"
- CURLY_GROUP_WORD@15..19
- L_CURLY@15..16 "{"
- KEY@16..18
- WORD@16..18 "eg"
- R_CURLY@18..19 "}"
- CURLY_GROUP_KEY_VALUE@19..64
- L_CURLY@19..20 "{"
- KEY_VALUE_BODY@20..63
- KEY_VALUE_PAIR@20..31
- KEY@20..26
- WORD@20..25 "short"
- WHITESPACE@25..26 " "
- EQUALITY_SIGN@26..27 "="
- WHITESPACE@27..28 " "
- VALUE@28..31
- TEXT@28..31
- WORD@28..31 "e.g"
- COMMA@31..32 ","
- KEY_VALUE_PAIR@32..50
- KEY@32..37
- WORD@32..36 "long"
- WHITESPACE@36..37 " "
- EQUALITY_SIGN@37..38 "="
- WHITESPACE@38..39 " "
- VALUE@39..50
- TEXT@39..50
- WORD@39..42 "for"
- WHITESPACE@42..43 " "
- WORD@43..50 "example"
- COMMA@50..51 ","
- KEY_VALUE_PAIR@51..63
- KEY@51..55
- WORD@51..54 "tag"
- WHITESPACE@54..55 " "
- EQUALITY_SIGN@55..56 "="
- WHITESPACE@56..57 " "
- VALUE@57..63
- TEXT@57..63
- WORD@57..63 "abbrev"
- R_CURLY@63..64 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
deleted file mode 100644
index 8dd76abbf3..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_options.txt.snap
+++ /dev/null
@@ -1,47 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
----
-ROOT@0..76
- PREAMBLE@0..76
- ACRONYM_DEFINITION@0..76
- COMMAND_NAME@0..11 "\\newacronym"
- BRACK_GROUP_KEY_VALUE@11..43
- L_BRACK@11..12 "["
- KEY_VALUE_BODY@12..42
- KEY_VALUE_PAIR@12..42
- KEY@12..22
- WORD@12..22 "longplural"
- EQUALITY_SIGN@22..23 "="
- VALUE@23..42
- CURLY_GROUP@23..42
- L_CURLY@23..24 "{"
- TEXT@24..41
- WORD@24..30 "Frames"
- WHITESPACE@30..31 " "
- WORD@31..34 "per"
- WHITESPACE@34..35 " "
- WORD@35..41 "Second"
- R_CURLY@41..42 "}"
- R_BRACK@42..43 "]"
- CURLY_GROUP_WORD@43..53
- L_CURLY@43..44 "{"
- KEY@44..52
- WORD@44..52 "fpsLabel"
- R_CURLY@52..53 "}"
- CURLY_GROUP@53..58
- L_CURLY@53..54 "{"
- TEXT@54..57
- WORD@54..57 "FPS"
- R_CURLY@57..58 "}"
- CURLY_GROUP@58..76
- L_CURLY@58..59 "{"
- TEXT@59..75
- WORD@59..64 "Frame"
- WHITESPACE@64..65 " "
- WORD@65..68 "per"
- WHITESPACE@68..69 " "
- WORD@69..75 "Second"
- R_CURLY@75..76 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
deleted file mode 100644
index cf630440f8..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_definition_simple.txt.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
----
-ROOT@0..44
- PREAMBLE@0..44
- ACRONYM_DEFINITION@0..44
- COMMAND_NAME@0..11 "\\newacronym"
- CURLY_GROUP_WORD@11..21
- L_CURLY@11..12 "{"
- KEY@12..20
- WORD@12..20 "fpsLabel"
- R_CURLY@20..21 "}"
- CURLY_GROUP@21..26
- L_CURLY@21..22 "{"
- TEXT@22..25
- WORD@22..25 "FPS"
- R_CURLY@25..26 "}"
- CURLY_GROUP@26..44
- L_CURLY@26..27 "{"
- TEXT@27..43
- WORD@27..32 "Frame"
- WHITESPACE@32..33 " "
- WORD@33..36 "per"
- WHITESPACE@36..37 " "
- WORD@37..43 "Second"
- R_CURLY@43..44 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
deleted file mode 100644
index 721dfa5bf9..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_package.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_package.txt
----
-ROOT@0..35
- PREAMBLE@0..35
- ACRONYM_DEFINITION@0..35
- COMMAND_NAME@0..5 "\\acro"
- CURLY_GROUP_WORD@5..10
- L_CURLY@5..6 "{"
- KEY@6..9
- WORD@6..9 "fps"
- R_CURLY@9..10 "}"
- BRACK_GROUP@10..15
- L_BRACK@10..11 "["
- TEXT@11..14
- WORD@11..14 "FPS"
- R_BRACK@14..15 "]"
- CURLY_GROUP@15..35
- L_CURLY@15..16 "{"
- TEXT@16..33
- WORD@16..22 "Frames"
- WHITESPACE@22..23 " "
- WORD@23..26 "per"
- WHITESPACE@26..27 " "
- WORD@27..33 "Second"
- R_CURLY@33..34 "}"
- LINE_BREAK@34..35 "\n"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
deleted file mode 100644
index 6e470c3add..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_options.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
----
-ROOT@0..32
- PREAMBLE@0..32
- ACRONYM_REFERENCE@0..32
- COMMAND_NAME@0..9 "\\acrshort"
- BRACK_GROUP_KEY_VALUE@9..22
- L_BRACK@9..10 "["
- KEY_VALUE_BODY@10..21
- KEY_VALUE_PAIR@10..17
- KEY@10..13
- WORD@10..13 "foo"
- EQUALITY_SIGN@13..14 "="
- VALUE@14..17
- TEXT@14..17
- WORD@14..17 "bar"
- COMMA@17..18 ","
- KEY_VALUE_PAIR@18..21
- KEY@18..21
- WORD@18..21 "baz"
- R_BRACK@21..22 "]"
- CURLY_GROUP_WORD@22..32
- L_CURLY@22..23 "{"
- KEY@23..31
- WORD@23..31 "fpsLabel"
- R_CURLY@31..32 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
deleted file mode 100644
index 5b83135522..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__acronym_reference_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- ACRONYM_REFERENCE@0..19
- COMMAND_NAME@0..9 "\\acrshort"
- CURLY_GROUP_WORD@9..19
- L_CURLY@9..10 "{"
- KEY@10..18
- WORD@10..18 "fpsLabel"
- R_CURLY@18..19 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
deleted file mode 100644
index 52037c6bbf..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_definition_simple.txt.snap
+++ /dev/null
@@ -1,34 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
----
-ROOT@0..39
- PREAMBLE@0..39
- GLOSSARY_ENTRY_DEFINITION@0..39
- COMMAND_NAME@0..17 "\\newglossaryentry"
- CURLY_GROUP_WORD@17..22
- L_CURLY@17..18 "{"
- KEY@18..21
- WORD@18..21 "foo"
- R_CURLY@21..22 "}"
- CURLY_GROUP_KEY_VALUE@22..39
- L_CURLY@22..23 "{"
- KEY_VALUE_BODY@23..38
- KEY_VALUE_PAIR@23..32
- KEY@23..27
- WORD@23..26 "bar"
- WHITESPACE@26..27 " "
- EQUALITY_SIGN@27..28 "="
- WHITESPACE@28..29 " "
- VALUE@29..32
- TEXT@29..32
- WORD@29..32 "baz"
- COMMA@32..33 ","
- WHITESPACE@33..34 " "
- KEY_VALUE_PAIR@34..37
- KEY@34..37
- WORD@34..37 "qux"
- COMMA@37..38 ","
- R_CURLY@38..39 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
deleted file mode 100644
index 07d1d8cdfa..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_options.txt.snap
+++ /dev/null
@@ -1,33 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
----
-ROOT@0..25
- PREAMBLE@0..25
- GLOSSARY_ENTRY_REFERENCE@0..25
- COMMAND_NAME@0..4 "\\gls"
- BRACK_GROUP_KEY_VALUE@4..20
- L_BRACK@4..5 "["
- KEY_VALUE_BODY@5..19
- KEY_VALUE_PAIR@5..14
- KEY@5..9
- WORD@5..8 "foo"
- WHITESPACE@8..9 " "
- EQUALITY_SIGN@9..10 "="
- WHITESPACE@10..11 " "
- VALUE@11..14
- TEXT@11..14
- WORD@11..14 "bar"
- COMMA@14..15 ","
- WHITESPACE@15..16 " "
- KEY_VALUE_PAIR@16..19
- KEY@16..19
- WORD@16..19 "qux"
- R_BRACK@19..20 "]"
- CURLY_GROUP_WORD@20..25
- L_CURLY@20..21 "{"
- KEY@21..24
- WORD@21..24 "baz"
- R_CURLY@24..25 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
deleted file mode 100644
index db50fc3298..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@glossary__glossary_entry_reference_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
----
-ROOT@0..9
- PREAMBLE@0..9
- GLOSSARY_ENTRY_REFERENCE@0..9
- COMMAND_NAME@0..4 "\\gls"
- CURLY_GROUP_WORD@4..9
- L_CURLY@4..5 "{"
- KEY@5..8
- WORD@5..8 "foo"
- R_CURLY@8..9 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
deleted file mode 100644
index 80bf58d783..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path.txt.snap
+++ /dev/null
@@ -1,18 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/graphics_path.txt
----
-ROOT@0..28
- PREAMBLE@0..28
- GRAPHICS_PATH@0..28
- COMMAND_NAME@0..13 "\\graphicspath"
- CURLY_GROUP@13..28
- L_CURLY@13..14 "{"
- CURLY_GROUP_WORD@14..27
- L_CURLY@14..15 "{"
- KEY@15..26
- WORD@15..26 "../figures/"
- R_CURLY@26..27 "}"
- R_CURLY@27..28 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
deleted file mode 100644
index c8521d2de7..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_command.txt.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/graphics_path_command.txt
----
-ROOT@0..32
- PREAMBLE@0..32
- GRAPHICS_PATH@0..32
- COMMAND_NAME@0..13 "\\graphicspath"
- CURLY_GROUP@13..32
- L_CURLY@13..14 "{"
- CURLY_GROUP_WORD@14..31
- L_CURLY@14..15 "{"
- KEY@15..30
- COMMAND_NAME@15..22 "\\subfix"
- CURLY_GROUP_WORD@22..30
- L_CURLY@22..23 "{"
- KEY@23..29
- WORD@23..29 "./img/"
- R_CURLY@29..30 "}"
- R_CURLY@30..31 "}"
- R_CURLY@31..32 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
deleted file mode 100644
index 4ca53d2fe2..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@graphics_path_options.txt.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/graphics_path_options.txt
----
-ROOT@0..33
- PREAMBLE@0..33
- GRAPHICS_PATH@0..13
- COMMAND_NAME@0..13 "\\graphicspath"
- MIXED_GROUP@13..18
- L_BRACK@13..14 "["
- TEXT@14..17
- WORD@14..17 "foo"
- R_BRACK@17..18 "]"
- CURLY_GROUP@18..33
- L_CURLY@18..19 "{"
- CURLY_GROUP@19..32
- L_CURLY@19..20 "{"
- TEXT@20..31
- WORD@20..31 "../figures/"
- R_CURLY@31..32 "}"
- R_CURLY@32..33 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
deleted file mode 100644
index 902cacfdd5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_missing_end.txt.snap
+++ /dev/null
@@ -1,14 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
----
-ROOT@0..12
- PREAMBLE@0..12
- CURLY_GROUP@0..12
- L_CURLY@0..1 "{"
- TEXT@1..12
- WORD@1..6 "hello"
- WHITESPACE@6..7 " "
- WORD@7..12 "world"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
deleted file mode 100644
index 4f1b8473be..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__curly_group_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/curly_group_simple.txt
----
-ROOT@0..13
- PREAMBLE@0..13
- CURLY_GROUP@0..13
- L_CURLY@0..1 "{"
- TEXT@1..12
- WORD@1..6 "hello"
- WHITESPACE@6..7 " "
- WORD@7..12 "world"
- R_CURLY@12..13 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
deleted file mode 100644
index dfddb20f85..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__equation_missing_end.txt.snap
+++ /dev/null
@@ -1,32 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/equation_missing_end.txt
----
-ROOT@0..28
- PREAMBLE@0..28
- ENVIRONMENT@0..28
- BEGIN@0..10
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..10
- L_CURLY@6..7 "{"
- KEY@7..8
- WORD@7..8 "a"
- R_CURLY@8..9 "}"
- WHITESPACE@9..10 " "
- EQUATION@10..21
- COMMAND_NAME@10..12 "\\["
- WHITESPACE@12..13 " "
- TEXT@13..21
- WORD@13..16 "foo"
- WHITESPACE@16..17 " "
- WORD@17..20 "bar"
- WHITESPACE@20..21 " "
- END@21..28
- COMMAND_NAME@21..25 "\\end"
- CURLY_GROUP_WORD@25..28
- L_CURLY@25..26 "{"
- KEY@26..27
- WORD@26..27 "b"
- R_CURLY@27..28 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
deleted file mode 100644
index d9e1636cf8..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__escaped_brackets.txt.snap
+++ /dev/null
@@ -1,18 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/escaped_brackets.txt
----
-ROOT@0..6
- PREAMBLE@0..6
- CURLY_GROUP@0..3
- L_CURLY@0..1 "{"
- MIXED_GROUP@1..2
- L_BRACK@1..2 "["
- R_CURLY@2..3 "}"
- CURLY_GROUP@3..6
- L_CURLY@3..4 "{"
- ERROR@4..5
- R_BRACK@4..5 "]"
- R_CURLY@5..6 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
deleted file mode 100644
index 922776c8c5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_braces.txt.snap
+++ /dev/null
@@ -1,12 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/unmatched_braces.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- ERROR@0..1
- R_CURLY@0..1 "}"
- CURLY_GROUP@1..2
- L_CURLY@1..2 "{"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
deleted file mode 100644
index 12e455b505..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets.txt.snap
+++ /dev/null
@@ -1,12 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/unmatched_brackets.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- ERROR@0..1
- R_BRACK@0..1 "]"
- MIXED_GROUP@1..2
- L_BRACK@1..2 "["
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
deleted file mode 100644
index 765c7e4a8d..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@group__unmatched_brackets_with_group.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
----
-ROOT@0..4
- PREAMBLE@0..4
- CURLY_GROUP@0..4
- L_CURLY@0..1 "{"
- ERROR@1..2
- R_BRACK@1..2 "]"
- MIXED_GROUP@2..3
- L_BRACK@2..3 "["
- R_CURLY@3..4 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
deleted file mode 100644
index 27bca69893..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@hello_world.txt.snap
+++ /dev/null
@@ -1,12 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/hello_world.txt
----
-ROOT@0..12
- PREAMBLE@0..12
- TEXT@0..12
- WORD@0..5 "Hello"
- WHITESPACE@5..6 " "
- WORD@6..12 "World!"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
deleted file mode 100644
index e3e34a68f6..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_options.txt.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/biblatex_include_options.txt
----
-ROOT@0..42
- PREAMBLE@0..42
- BIBLATEX_INCLUDE@0..42
- COMMAND_NAME@0..15 "\\addbibresource"
- BRACK_GROUP_KEY_VALUE@15..29
- L_BRACK@15..16 "["
- KEY_VALUE_BODY@16..28
- KEY_VALUE_PAIR@16..23
- KEY@16..19
- WORD@16..19 "foo"
- EQUALITY_SIGN@19..20 "="
- VALUE@20..23
- TEXT@20..23
- WORD@20..23 "bar"
- COMMA@23..24 ","
- WHITESPACE@24..25 " "
- KEY_VALUE_PAIR@25..28
- KEY@25..28
- WORD@25..28 "baz"
- R_BRACK@28..29 "]"
- CURLY_GROUP_WORD_LIST@29..42
- L_CURLY@29..30 "{"
- KEY@30..41
- WORD@30..41 "foo/bar.bib"
- R_CURLY@41..42 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
deleted file mode 100644
index b4b4193dba..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__biblatex_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
----
-ROOT@0..28
- PREAMBLE@0..28
- BIBLATEX_INCLUDE@0..28
- COMMAND_NAME@0..15 "\\addbibresource"
- CURLY_GROUP_WORD_LIST@15..28
- L_CURLY@15..16 "{"
- KEY@16..27
- WORD@16..27 "foo/bar.bib"
- R_CURLY@27..28 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
deleted file mode 100644
index c39c9e2c68..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__bibtex_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
----
-ROOT@0..22
- PREAMBLE@0..22
- BIBTEX_INCLUDE@0..22
- COMMAND_NAME@0..13 "\\bibliography"
- CURLY_GROUP_WORD_LIST@13..22
- L_CURLY@13..14 "{"
- KEY@14..21
- WORD@14..21 "foo/bar"
- R_CURLY@21..22 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
deleted file mode 100644
index a8d5a7077f..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_empty.txt.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/class_include_empty.txt
----
-ROOT@0..16
- PREAMBLE@0..16
- CLASS_INCLUDE@0..16
- COMMAND_NAME@0..14 "\\documentclass"
- CURLY_GROUP_WORD_LIST@14..16
- L_CURLY@14..15 "{"
- R_CURLY@15..16 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
deleted file mode 100644
index 4cf4473cfa..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_options.txt.snap
+++ /dev/null
@@ -1,38 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/class_include_options.txt
----
-ROOT@0..44
- PREAMBLE@0..44
- CLASS_INCLUDE@0..44
- COMMAND_NAME@0..14 "\\documentclass"
- BRACK_GROUP_KEY_VALUE@14..35
- L_BRACK@14..15 "["
- KEY_VALUE_BODY@15..34
- KEY_VALUE_PAIR@15..24
- KEY@15..19
- WORD@15..18 "foo"
- WHITESPACE@18..19 " "
- EQUALITY_SIGN@19..20 "="
- WHITESPACE@20..21 " "
- VALUE@21..24
- TEXT@21..24
- WORD@21..24 "bar"
- COMMA@24..25 ","
- WHITESPACE@25..26 " "
- KEY_VALUE_PAIR@26..29
- KEY@26..29
- WORD@26..29 "baz"
- COMMA@29..30 ","
- WHITESPACE@30..31 " "
- KEY_VALUE_PAIR@31..34
- KEY@31..34
- WORD@31..34 "qux"
- R_BRACK@34..35 "]"
- CURLY_GROUP_WORD_LIST@35..44
- L_CURLY@35..36 "{"
- KEY@36..43
- WORD@36..43 "article"
- R_CURLY@43..44 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
deleted file mode 100644
index a6be2ec496..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__class_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/class_include_simple.txt
----
-ROOT@0..23
- PREAMBLE@0..23
- CLASS_INCLUDE@0..23
- COMMAND_NAME@0..14 "\\documentclass"
- CURLY_GROUP_WORD_LIST@14..23
- L_CURLY@14..15 "{"
- KEY@15..22
- WORD@15..22 "article"
- R_CURLY@22..23 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
deleted file mode 100644
index 6f9f736d1f..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_command.txt.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/graphics_include_command.txt
----
-ROOT@0..52
- PREAMBLE@0..52
- GRAPHICS_INCLUDE@0..52
- COMMAND_NAME@0..16 "\\includegraphics"
- BRACK_GROUP_KEY_VALUE@16..37
- L_BRACK@16..17 "["
- KEY_VALUE_BODY@17..36
- KEY_VALUE_PAIR@17..36
- KEY@17..22
- WORD@17..22 "width"
- EQUALITY_SIGN@22..23 "="
- VALUE@23..36
- TEXT@23..26
- WORD@23..26 "0.5"
- GENERIC_COMMAND@26..36
- COMMAND_NAME@26..36 "\\textwidth"
- R_BRACK@36..37 "]"
- CURLY_GROUP_WORD_LIST@37..52
- L_CURLY@37..38 "{"
- KEY@38..51
- COMMAND_NAME@38..42 "\\foo"
- WORD@42..43 "."
- COMMAND_NAME@43..47 "\\bar"
- WORD@47..51 ".pdf"
- R_CURLY@51..52 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
deleted file mode 100644
index 4b422dcd64..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_complicated_options.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
----
-ROOT@0..39
- PREAMBLE@0..39
- GRAPHICS_INCLUDE@0..39
- COMMAND_NAME@0..16 "\\includegraphics"
- BRACK_GROUP_KEY_VALUE@16..37
- L_BRACK@16..17 "["
- KEY_VALUE_BODY@17..36
- KEY_VALUE_PAIR@17..36
- KEY@17..22
- WORD@17..22 "width"
- EQUALITY_SIGN@22..23 "="
- VALUE@23..36
- TEXT@23..26
- WORD@23..26 "0.5"
- GENERIC_COMMAND@26..36
- COMMAND_NAME@26..36 "\\textwidth"
- R_BRACK@36..37 "]"
- CURLY_GROUP_WORD_LIST@37..39
- L_CURLY@37..38 "{"
- R_CURLY@38..39 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
deleted file mode 100644
index 656d68c1ef..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_options.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/graphics_include_options.txt
----
-ROOT@0..39
- PREAMBLE@0..39
- GRAPHICS_INCLUDE@0..39
- COMMAND_NAME@0..16 "\\includegraphics"
- BRACK_GROUP_KEY_VALUE@16..26
- L_BRACK@16..17 "["
- KEY_VALUE_BODY@17..25
- KEY_VALUE_PAIR@17..25
- KEY@17..22
- WORD@17..22 "scale"
- EQUALITY_SIGN@22..23 "="
- VALUE@23..25
- TEXT@23..25
- WORD@23..25 ".5"
- R_BRACK@25..26 "]"
- CURLY_GROUP_WORD_LIST@26..39
- L_CURLY@26..27 "{"
- KEY@27..38
- WORD@27..38 "foo/bar.pdf"
- R_CURLY@38..39 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
deleted file mode 100644
index 39cb634ec2..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__graphics_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/graphics_include_simple.txt
----
-ROOT@0..29
- PREAMBLE@0..29
- GRAPHICS_INCLUDE@0..29
- COMMAND_NAME@0..16 "\\includegraphics"
- CURLY_GROUP_WORD_LIST@16..29
- L_CURLY@16..17 "{"
- KEY@17..28
- WORD@17..28 "foo/bar.pdf"
- R_CURLY@28..29 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
deleted file mode 100644
index 645133e65c..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_incomplete.txt.snap
+++ /dev/null
@@ -1,14 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/import_incomplete.txt
----
-ROOT@0..11
- PREAMBLE@0..11
- IMPORT@0..11
- COMMAND_NAME@0..7 "\\import"
- CURLY_GROUP_WORD@7..11
- L_CURLY@7..8 "{"
- KEY@8..11
- WORD@8..11 "foo"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
deleted file mode 100644
index b383dc435e..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__import_simple.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/import_simple.txt
----
-ROOT@0..17
- PREAMBLE@0..17
- IMPORT@0..17
- COMMAND_NAME@0..7 "\\import"
- CURLY_GROUP_WORD@7..12
- L_CURLY@7..8 "{"
- KEY@8..11
- WORD@8..11 "foo"
- R_CURLY@11..12 "}"
- CURLY_GROUP_WORD@12..17
- L_CURLY@12..13 "{"
- KEY@13..16
- WORD@13..16 "bar"
- R_CURLY@16..17 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
deleted file mode 100644
index 2c2c176fdb..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_options.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/inkscape_include_options.txt
----
-ROOT@0..30
- PREAMBLE@0..30
- SVG_INCLUDE@0..30
- COMMAND_NAME@0..11 "\\includesvg"
- BRACK_GROUP_KEY_VALUE@11..21
- L_BRACK@11..12 "["
- KEY_VALUE_BODY@12..20
- KEY_VALUE_PAIR@12..20
- KEY@12..17
- WORD@12..17 "scale"
- EQUALITY_SIGN@17..18 "="
- VALUE@18..20
- TEXT@18..20
- WORD@18..20 ".5"
- R_BRACK@20..21 "]"
- CURLY_GROUP_WORD_LIST@21..30
- L_CURLY@21..22 "{"
- KEY@22..29
- WORD@22..29 "foo/bar"
- R_CURLY@29..30 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
deleted file mode 100644
index 62cb7486db..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__inkscape_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- SVG_INCLUDE@0..20
- COMMAND_NAME@0..11 "\\includesvg"
- CURLY_GROUP_WORD_LIST@11..20
- L_CURLY@11..12 "{"
- KEY@12..19
- WORD@12..19 "foo/bar"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
deleted file mode 100644
index 2fff7b1e8f..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_equality_sign.txt.snap
+++ /dev/null
@@ -1,17 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
----
-ROOT@0..17
- PREAMBLE@0..17
- LATEX_INCLUDE@0..17
- COMMAND_NAME@0..8 "\\include"
- CURLY_GROUP_WORD_LIST@8..17
- L_CURLY@8..9 "{"
- KEY@9..16
- WORD@9..12 "foo"
- EQUALITY_SIGN@12..13 "="
- WORD@13..16 "bar"
- R_CURLY@16..17 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
deleted file mode 100644
index 4841296f02..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/latex_include_simple.txt
----
-ROOT@0..17
- PREAMBLE@0..17
- LATEX_INCLUDE@0..17
- COMMAND_NAME@0..8 "\\include"
- CURLY_GROUP_WORD_LIST@8..17
- L_CURLY@8..9 "{"
- KEY@9..16
- WORD@9..16 "foo/bar"
- R_CURLY@16..17 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
deleted file mode 100644
index 7f13f6b247..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__latex_input_path_brackets.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- LATEX_INCLUDE@0..20
- COMMAND_NAME@0..6 "\\input"
- CURLY_GROUP_WORD_LIST@6..20
- L_CURLY@6..7 "{"
- KEY@7..19
- WORD@7..10 "foo"
- L_BRACK@10..11 "["
- WORD@11..14 "bar"
- R_BRACK@14..15 "]"
- WORD@15..19 ".tex"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
deleted file mode 100644
index 086f2b0c75..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_empty.txt.snap
+++ /dev/null
@@ -1,13 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/package_include_empty.txt
----
-ROOT@0..13
- PREAMBLE@0..13
- PACKAGE_INCLUDE@0..13
- COMMAND_NAME@0..11 "\\usepackage"
- CURLY_GROUP_WORD_LIST@11..13
- L_CURLY@11..12 "{"
- R_CURLY@12..13 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
deleted file mode 100644
index d42a4a76fe..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_multiple.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/package_include_multiple.txt
----
-ROOT@0..28
- PREAMBLE@0..28
- PACKAGE_INCLUDE@0..28
- COMMAND_NAME@0..11 "\\usepackage"
- CURLY_GROUP_WORD_LIST@11..28
- L_CURLY@11..12 "{"
- KEY@12..19
- WORD@12..19 "amsmath"
- COMMA@19..20 ","
- WHITESPACE@20..21 " "
- KEY@21..27
- WORD@21..27 "lipsum"
- R_CURLY@27..28 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
deleted file mode 100644
index 8ecffa39d5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_options.txt.snap
+++ /dev/null
@@ -1,38 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/package_include_options.txt
----
-ROOT@0..41
- PREAMBLE@0..41
- PACKAGE_INCLUDE@0..41
- COMMAND_NAME@0..11 "\\usepackage"
- BRACK_GROUP_KEY_VALUE@11..32
- L_BRACK@11..12 "["
- KEY_VALUE_BODY@12..31
- KEY_VALUE_PAIR@12..21
- KEY@12..16
- WORD@12..15 "foo"
- WHITESPACE@15..16 " "
- EQUALITY_SIGN@16..17 "="
- WHITESPACE@17..18 " "
- VALUE@18..21
- TEXT@18..21
- WORD@18..21 "bar"
- COMMA@21..22 ","
- WHITESPACE@22..23 " "
- KEY_VALUE_PAIR@23..26
- KEY@23..26
- WORD@23..26 "baz"
- COMMA@26..27 ","
- WHITESPACE@27..28 " "
- KEY_VALUE_PAIR@28..31
- KEY@28..31
- WORD@28..31 "qux"
- R_BRACK@31..32 "]"
- CURLY_GROUP_WORD_LIST@32..41
- L_CURLY@32..33 "{"
- KEY@33..40
- WORD@33..40 "amsmath"
- R_CURLY@40..41 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
deleted file mode 100644
index 99304a8108..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__package_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/package_include_simple.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- PACKAGE_INCLUDE@0..20
- COMMAND_NAME@0..11 "\\usepackage"
- CURLY_GROUP_WORD_LIST@11..20
- L_CURLY@11..12 "{"
- KEY@12..19
- WORD@12..19 "amsmath"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
deleted file mode 100644
index c55ce16744..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__pgf_library_import_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- TIKZ_LIBRARY_IMPORT@0..19
- COMMAND_NAME@0..14 "\\usepgflibrary"
- CURLY_GROUP_WORD_LIST@14..19
- L_CURLY@14..15 "{"
- KEY@15..18
- WORD@15..18 "foo"
- R_CURLY@18..19 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
deleted file mode 100644
index 7e67683606..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_options.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/svg_include_options.txt
----
-ROOT@0..34
- PREAMBLE@0..34
- SVG_INCLUDE@0..34
- COMMAND_NAME@0..11 "\\includesvg"
- BRACK_GROUP_KEY_VALUE@11..21
- L_BRACK@11..12 "["
- KEY_VALUE_BODY@12..20
- KEY_VALUE_PAIR@12..20
- KEY@12..17
- WORD@12..17 "scale"
- EQUALITY_SIGN@17..18 "="
- VALUE@18..20
- TEXT@18..20
- WORD@18..20 ".5"
- R_BRACK@20..21 "]"
- CURLY_GROUP_WORD_LIST@21..34
- L_CURLY@21..22 "{"
- KEY@22..33
- WORD@22..33 "foo/bar.svg"
- R_CURLY@33..34 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
deleted file mode 100644
index f776f9c2bc..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__svg_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/svg_include_simple.txt
----
-ROOT@0..24
- PREAMBLE@0..24
- SVG_INCLUDE@0..24
- COMMAND_NAME@0..11 "\\includesvg"
- CURLY_GROUP_WORD_LIST@11..24
- L_CURLY@11..12 "{"
- KEY@12..23
- WORD@12..23 "foo/bar.svg"
- R_CURLY@23..24 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
deleted file mode 100644
index fff99d5ad1..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__tikz_library_import_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- TIKZ_LIBRARY_IMPORT@0..20
- COMMAND_NAME@0..15 "\\usetikzlibrary"
- CURLY_GROUP_WORD_LIST@15..20
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "foo"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
deleted file mode 100644
index 28eda149c4..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@include__verbatim_include_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
----
-ROOT@0..27
- PREAMBLE@0..27
- VERBATIM_INCLUDE@0..27
- COMMAND_NAME@0..14 "\\verbatiminput"
- CURLY_GROUP_WORD_LIST@14..27
- L_CURLY@14..15 "{"
- KEY@15..26
- WORD@15..26 "foo/bar.txt"
- R_CURLY@26..27 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
deleted file mode 100644
index b5696044a5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/inline.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- FORMULA@0..19
- DOLLAR@0..1 "$"
- TEXT@1..3
- WORD@1..2 "x"
- WHITESPACE@2..3 " "
- GENERIC_COMMAND@3..18
- COMMAND_NAME@3..6 "\\in"
- WHITESPACE@6..7 " "
- MIXED_GROUP@7..18
- L_BRACK@7..8 "["
- TEXT@8..11
- WORD@8..9 "0"
- COMMA@9..10 ","
- WHITESPACE@10..11 " "
- GENERIC_COMMAND@11..17
- COMMAND_NAME@11..17 "\\infty"
- R_PAREN@17..18 ")"
- DOLLAR@18..19 "$"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
deleted file mode 100644
index 6d614db919..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@inline_double_dollar.txt.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/inline_double_dollar.txt
----
-ROOT@0..21
- PREAMBLE@0..21
- FORMULA@0..21
- DOLLAR@0..2 "$$"
- TEXT@2..4
- WORD@2..3 "x"
- WHITESPACE@3..4 " "
- GENERIC_COMMAND@4..19
- COMMAND_NAME@4..7 "\\in"
- WHITESPACE@7..8 " "
- MIXED_GROUP@8..19
- L_BRACK@8..9 "["
- TEXT@9..12
- WORD@9..10 "0"
- COMMA@10..11 ","
- WHITESPACE@11..12 " "
- GENERIC_COMMAND@12..18
- COMMAND_NAME@12..18 "\\infty"
- R_PAREN@18..19 ")"
- DOLLAR@19..21 "$$"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_568.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_568.txt.snap
deleted file mode 100644
index f71507c2ac..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_568.txt.snap
+++ /dev/null
@@ -1,28 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_568.txt
----
-ROOT@0..51
- PREAMBLE@0..51
- LATEX_INCLUDE@0..36
- COMMAND_NAME@0..6 "\\input"
- CURLY_GROUP_WORD_LIST@6..36
- L_CURLY@6..7 "{"
- WORD@7..8 "|"
- KEY@8..34
- WORD@8..15 "ipython"
- WHITESPACE@15..16 " "
- WORD@16..34 "scripts/test.ipynb"
- R_CURLY@34..35 "}"
- LINE_BREAK@35..36 "\n"
- LABEL_DEFINITION@36..51
- COMMAND_NAME@36..42 "\\label"
- CURLY_GROUP_WORD@42..51
- L_CURLY@42..43 "{"
- KEY@43..50
- WORD@43..48 "fig:x"
- EQUALITY_SIGN@48..49 "="
- WORD@49..50 "2"
- R_CURLY@50..51 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
deleted file mode 100644
index 4165481528..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_745.txt.snap
+++ /dev/null
@@ -1,131 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_745.txt
----
-ROOT@0..271
- PREAMBLE@0..271
- CLASS_INCLUDE@0..24
- COMMAND_NAME@0..14 "\\documentclass"
- CURLY_GROUP_WORD_LIST@14..24
- L_CURLY@14..15 "{"
- KEY@15..22
- WORD@15..22 "article"
- R_CURLY@22..23 "}"
- LINE_BREAK@23..24 "\n"
- PACKAGE_INCLUDE@24..50
- COMMAND_NAME@24..35 "\\usepackage"
- CURLY_GROUP_WORD_LIST@35..50
- L_CURLY@35..36 "{"
- KEY@36..46
- WORD@36..46 "tabularray"
- R_CURLY@46..47 "}"
- WHITESPACE@47..48 " "
- LINE_BREAK@48..50 "\n\n"
- GENERIC_COMMAND@50..64
- COMMAND_NAME@50..63 "\\ExplSyntaxOn"
- LINE_BREAK@63..64 "\n"
- GENERIC_COMMAND@64..223
- COMMAND_NAME@64..87 "\\NewDocumentEnvironment"
- CURLY_GROUP@87..96
- L_CURLY@87..88 "{"
- TEXT@88..95
- WORD@88..95 "exptblr"
- R_CURLY@95..96 "}"
- CURLY_GROUP@96..107
- L_CURLY@96..97 "{"
- TEXT@97..98
- WORD@97..98 "O"
- CURLY_GROUP@98..100
- L_CURLY@98..99 "{"
- R_CURLY@99..100 "}"
- TEXT@100..101
- WORD@100..101 "m"
- R_CURLY@101..102 "}"
- LINE_BREAK@102..103 "\n"
- WHITESPACE@103..107 " "
- CURLY_GROUP@107..200
- L_CURLY@107..108 "{"
- LINE_BREAK@108..109 "\n"
- WHITESPACE@109..113 " "
- GENERIC_COMMAND@113..194
- COMMAND_NAME@113..119 "\\use:x"
- LINE_BREAK@119..120 "\n"
- WHITESPACE@120..124 " "
- CURLY_GROUP@124..194
- L_CURLY@124..125 "{"
- LINE_BREAK@125..126 "\n"
- WHITESPACE@126..130 " "
- GENERIC_COMMAND@130..141
- COMMAND_NAME@130..140 "\\exp_not:N"
- WHITESPACE@140..141 " "
- ENVIRONMENT@141..188
- BEGIN@141..179
- COMMAND_NAME@141..147 "\\begin"
- CURLY_GROUP_WORD@147..158
- L_CURLY@147..148 "{"
- KEY@148..152
- WORD@148..152 "tblr"
- R_CURLY@152..153 "}"
- LINE_BREAK@153..154 "\n"
- WHITESPACE@154..158 " "
- BRACK_GROUP@158..179
- L_BRACK@158..159 "["
- GENERIC_COMMAND@159..173
- COMMAND_NAME@159..169 "\\exp_not:n"
- CURLY_GROUP@169..173
- L_CURLY@169..170 "{"
- TEXT@170..172
- WORD@170..172 "#1"
- R_CURLY@172..173 "}"
- R_BRACK@173..174 "]"
- LINE_BREAK@174..175 "\n"
- WHITESPACE@175..179 " "
- CURLY_GROUP@179..188
- L_CURLY@179..180 "{"
- TEXT@180..182
- WORD@180..182 "#2"
- R_CURLY@182..183 "}"
- LINE_BREAK@183..184 "\n"
- WHITESPACE@184..188 " "
- R_CURLY@188..189 "}"
- LINE_BREAK@189..190 "\n"
- WHITESPACE@190..194 " "
- R_CURLY@194..195 "}"
- LINE_BREAK@195..196 "\n"
- WHITESPACE@196..200 " "
- CURLY_GROUP@200..223
- L_CURLY@200..201 "{"
- LINE_BREAK@201..202 "\n"
- WHITESPACE@202..206 " "
- GENERIC_COMMAND@206..221
- COMMAND_NAME@206..210 "\\end"
- CURLY_GROUP@210..221
- L_CURLY@210..211 "{"
- TEXT@211..215
- WORD@211..215 "tblr"
- R_CURLY@215..216 "}"
- LINE_BREAK@216..217 "\n"
- WHITESPACE@217..221 " "
- R_CURLY@221..222 "}"
- LINE_BREAK@222..223 "\n"
- GENERIC_COMMAND@223..239
- COMMAND_NAME@223..237 "\\ExplSyntaxOff"
- LINE_BREAK@237..239 "\n\n"
- ENVIRONMENT@239..271
- BEGIN@239..257
- COMMAND_NAME@239..245 "\\begin"
- CURLY_GROUP_WORD@245..257
- L_CURLY@245..246 "{"
- KEY@246..254
- WORD@246..254 "document"
- R_CURLY@254..255 "}"
- LINE_BREAK@255..257 "\n\n"
- END@257..271
- COMMAND_NAME@257..261 "\\end"
- CURLY_GROUP_WORD@261..271
- L_CURLY@261..262 "{"
- KEY@262..270
- WORD@262..270 "document"
- R_CURLY@270..271 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
deleted file mode 100644
index 9899e3c9ab..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_789.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_789.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- GRAPHICS_PATH@0..19
- COMMAND_NAME@0..13 "\\graphicspath"
- CURLY_GROUP_WORD@13..19
- L_CURLY@13..14 "{"
- KEY@14..18
- WORD@14..18 "test"
- R_CURLY@18..19 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_828.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_828.txt.snap
deleted file mode 100644
index 059b957241..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_828.txt.snap
+++ /dev/null
@@ -1,22 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_828.txt
----
-ROOT@0..51
- PREAMBLE@0..51
- GENERIC_COMMAND@0..5
- COMMAND_NAME@0..5 "\\verb"
- VERBATIM@5..6 "|"
- VERBATIM@6..17 "<STATEMENT>"
- VERBATIM@17..22 " "
- VERBATIM@22..24 "if"
- VERBATIM@24..25 "("
- VERBATIM@25..31 "<expr>"
- VERBATIM@31..32 ")"
- VERBATIM@32..33 "{"
- VERBATIM@33..43 "<body>else"
- VERBATIM@43..44 "{"
- VERBATIM@44..50 "<body>"
- VERBATIM@50..51 "|"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
deleted file mode 100644
index dc8c3a3d2b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_853.txt.snap
+++ /dev/null
@@ -1,62 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_853.txt
----
-ROOT@0..135
- PREAMBLE@0..135
- CLASS_INCLUDE@0..24
- COMMAND_NAME@0..14 "\\documentclass"
- CURLY_GROUP_WORD_LIST@14..24
- L_CURLY@14..15 "{"
- KEY@15..22
- WORD@15..22 "minimal"
- R_CURLY@22..23 "}"
- LINE_BREAK@23..24 "\n"
- ENVIRONMENT@24..135
- BEGIN@24..41
- COMMAND_NAME@24..30 "\\begin"
- CURLY_GROUP_WORD@30..41
- L_CURLY@30..31 "{"
- KEY@31..39
- WORD@31..39 "document"
- R_CURLY@39..40 "}"
- LINE_BREAK@40..41 "\n"
- TEXT@41..75
- WORD@41..45 "This"
- WHITESPACE@45..46 " "
- WORD@46..48 "is"
- WHITESPACE@48..49 " "
- WORD@49..51 "an"
- WHITESPACE@51..52 " "
- WORD@52..56 "asdf"
- WHITESPACE@56..57 " "
- WORD@57..66 "undefined"
- WHITESPACE@66..67 " "
- WORD@67..74 "command"
- LINE_BREAK@74..75 "\n"
- BLOCK_COMMENT@75..120
- COMMAND_NAME@75..83 "\\iffalse"
- LINE_BREAK@83..84 "\n"
- WHITESPACE@84..86 " "
- BLOCK_COMMENT@86..97
- COMMAND_NAME@86..94 "\\iffalse"
- COMMAND_NAME@94..97 "\\fi"
- LINE_BREAK@97..98 "\n"
- WHITESPACE@98..100 " "
- COMMAND_NAME@100..104 "\\end"
- L_CURLY@104..105 "{"
- WORD@105..114 "enumerate"
- R_CURLY@114..115 "}"
- WHITESPACE@115..116 " "
- LINE_BREAK@116..117 "\n"
- COMMAND_NAME@117..120 "\\fi"
- LINE_BREAK@120..121 "\n"
- END@121..135
- COMMAND_NAME@121..125 "\\end"
- CURLY_GROUP_WORD@125..135
- L_CURLY@125..126 "{"
- KEY@126..134
- WORD@126..134 "document"
- R_CURLY@134..135 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
deleted file mode 100644
index b0edef17a8..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_857.txt.snap
+++ /dev/null
@@ -1,33 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_857.txt
----
-ROOT@0..55
- PREAMBLE@0..55
- COMMAND_DEFINITION@0..11
- COMMAND_NAME@0..11 "\\newcommand"
- GENERIC_COMMAND@11..17
- COMMAND_NAME@11..14 "\\ö"
- CURLY_GROUP@14..17
- L_CURLY@14..15 "{"
- R_CURLY@15..16 "}"
- LINE_BREAK@16..17 "\n"
- COMMAND_DEFINITION@17..38
- COMMAND_NAME@17..28 "\\newcommand"
- CURLY_GROUP_COMMAND@28..35
- L_CURLY@28..29 "{"
- COMMAND_NAME@29..34 "\\öö"
- R_CURLY@34..35 "}"
- CURLY_GROUP@35..38
- L_CURLY@35..36 "{"
- R_CURLY@36..37 "}"
- LINE_BREAK@37..38 "\n"
- COMMAND_DEFINITION@38..49
- COMMAND_NAME@38..49 "\\newcommand"
- GENERIC_COMMAND@49..55
- COMMAND_NAME@49..53 "\\123"
- CURLY_GROUP@53..55
- L_CURLY@53..54 "{"
- R_CURLY@54..55 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
deleted file mode 100644
index 8555f2bc48..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_874.txt.snap
+++ /dev/null
@@ -1,28 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_874.txt
----
-ROOT@0..37
- PREAMBLE@0..37
- GRAPHICS_INCLUDE@0..37
- COMMAND_NAME@0..16 "\\includegraphics"
- BRACK_GROUP_KEY_VALUE@16..27
- L_BRACK@16..17 "["
- KEY_VALUE_BODY@17..26
- KEY_VALUE_PAIR@17..26
- KEY@17..22
- WORD@17..22 "scale"
- EQUALITY_SIGN@22..23 "="
- VALUE@23..26
- TEXT@23..26
- WORD@23..26 "0.2"
- R_BRACK@26..27 "]"
- CURLY_GROUP_WORD_LIST@27..37
- L_CURLY@27..28 "{"
- KEY@28..36
- WORD@28..31 "7.4"
- R_PAREN@31..32 ")"
- WORD@32..36 ".jpg"
- R_CURLY@36..37 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_919.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_919.txt.snap
deleted file mode 100644
index bf5d207fca..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_919.txt.snap
+++ /dev/null
@@ -1,61 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_919.txt
----
-ROOT@0..217
- PREAMBLE@0..217
- CLASS_INCLUDE@0..25
- COMMAND_NAME@0..14 "\\documentclass"
- CURLY_GROUP_WORD_LIST@14..25
- L_CURLY@14..15 "{"
- KEY@15..22
- WORD@15..22 "article"
- R_CURLY@22..23 "}"
- LINE_BREAK@23..25 "\n\n"
- PACKAGE_INCLUDE@25..173
- COMMAND_NAME@25..36 "\\usepackage"
- CURLY_GROUP_WORD_LIST@36..173
- L_CURLY@36..37 "{"
- LINE_BREAK@37..38 "\n"
- WHITESPACE@38..42 " "
- KEY@42..48
- WORD@42..48 "lipsum"
- COMMA@48..49 ","
- WHITESPACE@49..50 " "
- COMMENT@50..70 "% provides blindtext"
- LINE_BREAK@70..71 "\n"
- WHITESPACE@71..75 " "
- KEY@75..83
- WORD@75..83 "booktabs"
- COMMA@83..84 ","
- WHITESPACE@84..85 " "
- COMMENT@85..110 "% better rules for ta ..."
- LINE_BREAK@110..111 "\n"
- WHITESPACE@111..115 " "
- COMMENT@115..169 "%xcolor % easily defi ..."
- LINE_BREAK@169..170 "\n"
- R_CURLY@170..171 "}"
- LINE_BREAK@171..173 "\n\n"
- ENVIRONMENT@173..217
- BEGIN@173..194
- COMMAND_NAME@173..179 "\\begin"
- CURLY_GROUP_WORD@179..194
- L_CURLY@179..180 "{"
- KEY@180..188
- WORD@180..188 "document"
- R_CURLY@188..189 "}"
- LINE_BREAK@189..190 "\n"
- WHITESPACE@190..194 " "
- GENERIC_COMMAND@194..202
- COMMAND_NAME@194..201 "\\lipsum"
- LINE_BREAK@201..202 "\n"
- END@202..217
- COMMAND_NAME@202..206 "\\end"
- CURLY_GROUP_WORD@206..217
- L_CURLY@206..207 "{"
- KEY@207..215
- WORD@207..215 "document"
- R_CURLY@215..216 "}"
- LINE_BREAK@216..217 "\n"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_931.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_931.txt.snap
deleted file mode 100644
index 2fef140d95..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@issue_931.txt.snap
+++ /dev/null
@@ -1,16 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/issue_931.txt
----
-ROOT@0..31
- PREAMBLE@0..31
- BIBTEX_INCLUDE@0..31
- COMMAND_NAME@0..13 "\\bibliography"
- CURLY_GROUP_WORD_LIST@13..31
- L_CURLY@13..14 "{"
- KEY@14..30
- DOLLAR@14..15 "$"
- WORD@15..30 "HOME/Literature"
- R_CURLY@30..31 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
deleted file mode 100644
index 5eaed87fee..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_line_break.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_definition_line_break.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- LABEL_DEFINITION@0..13
- COMMAND_NAME@0..6 "\\label"
- CURLY_GROUP_WORD@6..13
- L_CURLY@6..7 "{"
- KEY@7..13
- WORD@7..12 "hello"
- LINE_BREAK@12..13 "\n"
- TEXT@13..18
- WORD@13..18 "world"
- ERROR@18..19
- R_CURLY@18..19 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
deleted file mode 100644
index cb693002b5..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_definition_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_definition_simple.txt
----
-ROOT@0..11
- PREAMBLE@0..11
- LABEL_DEFINITION@0..11
- COMMAND_NAME@0..6 "\\label"
- CURLY_GROUP_WORD@6..11
- L_CURLY@6..7 "{"
- KEY@7..10
- WORD@7..10 "foo"
- R_CURLY@10..11 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
deleted file mode 100644
index 6e9613313a..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_number.txt.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_number.txt
----
-ROOT@0..21
- PREAMBLE@0..21
- LABEL_NUMBER@0..21
- COMMAND_NAME@0..9 "\\newlabel"
- CURLY_GROUP_WORD@9..14
- L_CURLY@9..10 "{"
- KEY@10..13
- WORD@10..13 "foo"
- R_CURLY@13..14 "}"
- CURLY_GROUP@14..21
- L_CURLY@14..15 "{"
- CURLY_GROUP@15..20
- L_CURLY@15..16 "{"
- TEXT@16..19
- WORD@16..19 "1.1"
- R_CURLY@19..20 "}"
- R_CURLY@20..21 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
deleted file mode 100644
index b631f40b60..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_equation.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_equation.txt
----
-ROOT@0..11
- PREAMBLE@0..11
- LABEL_REFERENCE@0..11
- COMMAND_NAME@0..6 "\\eqref"
- CURLY_GROUP_WORD_LIST@6..11
- L_CURLY@6..7 "{"
- KEY@7..10
- WORD@7..10 "foo"
- R_CURLY@10..11 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
deleted file mode 100644
index 054da6d258..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_incomplete.txt.snap
+++ /dev/null
@@ -1,32 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
----
-ROOT@0..47
- PREAMBLE@0..47
- TEXT@0..9
- WORD@0..8 "Equation"
- WHITESPACE@8..9 " "
- LABEL_REFERENCE@9..24
- COMMAND_NAME@9..15 "\\eqref"
- CURLY_GROUP_WORD_LIST@15..24
- L_CURLY@15..16 "{"
- KEY@16..24
- WORD@16..18 "eq"
- WHITESPACE@18..19 " "
- WORD@19..21 "is"
- WHITESPACE@21..22 " "
- WORD@22..23 "a"
- WHITESPACE@23..24 " "
- GENERIC_COMMAND@24..38
- COMMAND_NAME@24..29 "\\emph"
- CURLY_GROUP@29..38
- L_CURLY@29..30 "{"
- TEXT@30..36
- WORD@30..36 "useful"
- R_CURLY@36..37 "}"
- WHITESPACE@37..38 " "
- TEXT@38..47
- WORD@38..47 "identity."
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
deleted file mode 100644
index 5a228e8972..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_multiple.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_multiple.txt
----
-ROOT@0..14
- PREAMBLE@0..14
- LABEL_REFERENCE@0..14
- COMMAND_NAME@0..4 "\\ref"
- CURLY_GROUP_WORD_LIST@4..14
- L_CURLY@4..5 "{"
- KEY@5..8
- WORD@5..8 "foo"
- COMMA@8..9 ","
- WHITESPACE@9..10 " "
- KEY@10..13
- WORD@10..13 "bar"
- R_CURLY@13..14 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
deleted file mode 100644
index a4b25eeb09..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_error.txt.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_range_error.txt
----
-ROOT@0..19
- PREAMBLE@0..19
- LABEL_REFERENCE_RANGE@0..19
- COMMAND_NAME@0..10 "\\crefrange"
- CURLY_GROUP_WORD@10..14
- L_CURLY@10..11 "{"
- KEY@11..14
- WORD@11..14 "foo"
- CURLY_GROUP_WORD@14..19
- L_CURLY@14..15 "{"
- KEY@15..18
- WORD@15..18 "bar"
- R_CURLY@18..19 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
deleted file mode 100644
index e18cd6ed97..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_incomplete.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
----
-ROOT@0..15
- PREAMBLE@0..15
- LABEL_REFERENCE_RANGE@0..15
- COMMAND_NAME@0..10 "\\crefrange"
- CURLY_GROUP_WORD@10..15
- L_CURLY@10..11 "{"
- KEY@11..14
- WORD@11..14 "foo"
- R_CURLY@14..15 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
deleted file mode 100644
index 335309607c..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_range_simple.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
----
-ROOT@0..20
- PREAMBLE@0..20
- LABEL_REFERENCE_RANGE@0..20
- COMMAND_NAME@0..10 "\\crefrange"
- CURLY_GROUP_WORD@10..15
- L_CURLY@10..11 "{"
- KEY@11..14
- WORD@11..14 "foo"
- R_CURLY@14..15 "}"
- CURLY_GROUP_WORD@15..20
- L_CURLY@15..16 "{"
- KEY@16..19
- WORD@16..19 "bar"
- R_CURLY@19..20 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
deleted file mode 100644
index ba3d08b472..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@label__label_reference_simple.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/label/label_reference_simple.txt
----
-ROOT@0..9
- PREAMBLE@0..9
- LABEL_REFERENCE@0..9
- COMMAND_NAME@0..4 "\\ref"
- CURLY_GROUP_WORD_LIST@4..9
- L_CURLY@4..5 "{"
- KEY@5..8
- WORD@5..8 "foo"
- R_CURLY@8..9 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
deleted file mode 100644
index aa038efb86..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/parameter.txt
----
-ROOT@0..2
- PREAMBLE@0..2
- TEXT@0..2
- WORD@0..2 "#1"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
deleted file mode 100644
index 7f9a744622..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@parameter_error.txt.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/parameter_error.txt
----
-ROOT@0..1
- PREAMBLE@0..1
- TEXT@0..1
- WORD@0..1 "#"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__paragraphs.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__paragraphs.txt.snap
deleted file mode 100644
index 7c3e7fae57..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__paragraphs.txt.snap
+++ /dev/null
@@ -1,67 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/structure/paragraphs.txt
----
-ROOT@0..134
- PREAMBLE@0..134
- SECTION@0..105
- COMMAND_NAME@0..8 "\\section"
- CURLY_GROUP@8..20
- L_CURLY@8..9 "{"
- TEXT@9..18
- WORD@9..16 "Section"
- WHITESPACE@16..17 " "
- WORD@17..18 "1"
- R_CURLY@18..19 "}"
- LINE_BREAK@19..20 "\n"
- TEXT@20..31
- WORD@20..27 "Section"
- WHITESPACE@27..28 " "
- WORD@28..29 "1"
- LINE_BREAK@29..31 "\n\n"
- PARAGRAPH@31..68
- COMMAND_NAME@31..41 "\\paragraph"
- CURLY_GROUP@41..55
- L_CURLY@41..42 "{"
- TEXT@42..53
- WORD@42..51 "Paragraph"
- WHITESPACE@51..52 " "
- WORD@52..53 "1"
- R_CURLY@53..54 "}"
- LINE_BREAK@54..55 "\n"
- TEXT@55..68
- WORD@55..64 "Paragraph"
- WHITESPACE@64..65 " "
- WORD@65..66 "1"
- LINE_BREAK@66..68 "\n\n"
- PARAGRAPH@68..105
- COMMAND_NAME@68..78 "\\paragraph"
- CURLY_GROUP@78..92
- L_CURLY@78..79 "{"
- TEXT@79..90
- WORD@79..88 "Paragraph"
- WHITESPACE@88..89 " "
- WORD@89..90 "2"
- R_CURLY@90..91 "}"
- LINE_BREAK@91..92 "\n"
- TEXT@92..105
- WORD@92..101 "Paragraph"
- WHITESPACE@101..102 " "
- WORD@102..103 "2"
- LINE_BREAK@103..105 "\n\n"
- SECTION@105..134
- COMMAND_NAME@105..113 "\\section"
- CURLY_GROUP@113..125
- L_CURLY@113..114 "{"
- TEXT@114..123
- WORD@114..121 "Section"
- WHITESPACE@121..122 " "
- WORD@122..123 "2"
- R_CURLY@123..124 "}"
- LINE_BREAK@124..125 "\n"
- TEXT@125..134
- WORD@125..132 "Section"
- WHITESPACE@132..133 " "
- WORD@133..134 "2"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
deleted file mode 100644
index 6045bdce2b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_enum_item.txt.snap
+++ /dev/null
@@ -1,47 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/structure/structure_enum_item.txt
----
-ROOT@0..60
- PREAMBLE@0..60
- ENVIRONMENT@0..60
- BEGIN@0..18
- COMMAND_NAME@0..6 "\\begin"
- CURLY_GROUP_WORD@6..18
- L_CURLY@6..7 "{"
- KEY@7..16
- WORD@7..16 "enumerate"
- R_CURLY@16..17 "}"
- WHITESPACE@17..18 " "
- ENUM_ITEM@18..26
- COMMAND_NAME@18..23 "\\item"
- WHITESPACE@23..24 " "
- TEXT@24..26
- WORD@24..25 "1"
- WHITESPACE@25..26 " "
- ENUM_ITEM@26..37
- COMMAND_NAME@26..31 "\\item"
- BRACK_GROUP@31..35
- L_BRACK@31..32 "["
- TEXT@32..33
- WORD@32..33 "2"
- R_BRACK@33..34 "]"
- WHITESPACE@34..35 " "
- TEXT@35..37
- WORD@35..36 "2"
- WHITESPACE@36..37 " "
- ENUM_ITEM@37..45
- COMMAND_NAME@37..42 "\\item"
- WHITESPACE@42..43 " "
- TEXT@43..45
- WORD@43..44 "3"
- WHITESPACE@44..45 " "
- END@45..60
- COMMAND_NAME@45..49 "\\end"
- CURLY_GROUP_WORD@49..60
- L_CURLY@49..50 "{"
- KEY@50..59
- WORD@50..59 "enumerate"
- R_CURLY@59..60 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
deleted file mode 100644
index df715917df..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_invalid_nesting.txt.snap
+++ /dev/null
@@ -1,23 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
----
-ROOT@0..27
- PREAMBLE@0..27
- SECTION@0..14
- COMMAND_NAME@0..8 "\\section"
- CURLY_GROUP@8..14
- L_CURLY@8..9 "{"
- TEXT@9..12
- WORD@9..12 "Foo"
- R_CURLY@12..13 "}"
- WHITESPACE@13..14 " "
- CHAPTER@14..27
- COMMAND_NAME@14..22 "\\chapter"
- CURLY_GROUP@22..27
- L_CURLY@22..23 "{"
- TEXT@23..26
- WORD@23..26 "Bar"
- R_CURLY@26..27 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
deleted file mode 100644
index d9dab436e7..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_nested.txt.snap
+++ /dev/null
@@ -1,57 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/structure/structure_nested.txt
----
-ROOT@0..90
- PREAMBLE@0..90
- PART@0..90
- COMMAND_NAME@0..5 "\\part"
- CURLY_GROUP@5..8
- L_CURLY@5..6 "{"
- TEXT@6..7
- WORD@6..7 "1"
- R_CURLY@7..8 "}"
- CHAPTER@8..90
- COMMAND_NAME@8..16 "\\chapter"
- CURLY_GROUP@16..19
- L_CURLY@16..17 "{"
- TEXT@17..18
- WORD@17..18 "2"
- R_CURLY@18..19 "}"
- SECTION@19..90
- COMMAND_NAME@19..27 "\\section"
- CURLY_GROUP@27..30
- L_CURLY@27..28 "{"
- TEXT@28..29
- WORD@28..29 "3"
- R_CURLY@29..30 "}"
- SUBSECTION@30..90
- COMMAND_NAME@30..41 "\\subsection"
- CURLY_GROUP@41..44
- L_CURLY@41..42 "{"
- TEXT@42..43
- WORD@42..43 "4"
- R_CURLY@43..44 "}"
- SUBSUBSECTION@44..90
- COMMAND_NAME@44..58 "\\subsubsection"
- CURLY_GROUP@58..61
- L_CURLY@58..59 "{"
- TEXT@59..60
- WORD@59..60 "5"
- R_CURLY@60..61 "}"
- PARAGRAPH@61..90
- COMMAND_NAME@61..71 "\\paragraph"
- CURLY_GROUP@71..74
- L_CURLY@71..72 "{"
- TEXT@72..73
- WORD@72..73 "6"
- R_CURLY@73..74 "}"
- SUBPARAGRAPH@74..90
- COMMAND_NAME@74..87 "\\subparagraph"
- CURLY_GROUP@87..90
- L_CURLY@87..88 "{"
- TEXT@88..89
- WORD@88..89 "7"
- R_CURLY@89..90 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
deleted file mode 100644
index 66040952f0..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@structure__structure_siblings.txt.snap
+++ /dev/null
@@ -1,29 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/structure/structure_siblings.txt
----
-ROOT@0..35
- PREAMBLE@0..35
- SECTION@0..18
- COMMAND_NAME@0..8 "\\section"
- CURLY_GROUP@8..14
- L_CURLY@8..9 "{"
- TEXT@9..12
- WORD@9..12 "Foo"
- R_CURLY@12..13 "}"
- WHITESPACE@13..14 " "
- TEXT@14..18
- WORD@14..17 "Foo"
- WHITESPACE@17..18 " "
- SECTION@18..35
- COMMAND_NAME@18..26 "\\section"
- CURLY_GROUP@26..32
- L_CURLY@26..27 "{"
- TEXT@27..30
- WORD@27..30 "Bar"
- R_CURLY@30..31 "}"
- WHITESPACE@31..32 " "
- TEXT@32..35
- WORD@32..35 "Bar"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
deleted file mode 100644
index ce42bde1d3..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_full.txt.snap
+++ /dev/null
@@ -1,30 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
----
-ROOT@0..31
- PREAMBLE@0..31
- THEOREM_DEFINITION_AMSTHM@0..31
- COMMAND_NAME@0..11 "\\newtheorem"
- CURLY_GROUP_WORD@11..16
- L_CURLY@11..12 "{"
- KEY@12..15
- WORD@12..15 "foo"
- R_CURLY@15..16 "}"
- BRACK_GROUP_WORD@16..21
- L_BRACK@16..17 "["
- KEY@17..20
- WORD@17..20 "bar"
- R_BRACK@20..21 "]"
- CURLY_GROUP@21..26
- L_CURLY@21..22 "{"
- TEXT@22..25
- WORD@22..25 "Foo"
- R_CURLY@25..26 "}"
- BRACK_GROUP_WORD@26..31
- L_BRACK@26..27 "["
- KEY@27..30
- WORD@27..30 "baz"
- R_BRACK@30..31 "]"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
deleted file mode 100644
index c1e7ad5387..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_counter.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
----
-ROOT@0..21
- PREAMBLE@0..21
- THEOREM_DEFINITION_AMSTHM@0..21
- COMMAND_NAME@0..11 "\\newtheorem"
- CURLY_GROUP_WORD@11..16
- L_CURLY@11..12 "{"
- KEY@12..15
- WORD@12..15 "foo"
- R_CURLY@15..16 "}"
- BRACK_GROUP_WORD@16..21
- L_BRACK@16..17 "["
- KEY@17..20
- WORD@17..20 "bar"
- R_BRACK@20..21 "]"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
deleted file mode 100644
index 13c043c94f..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description.txt.snap
+++ /dev/null
@@ -1,20 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
----
-ROOT@0..21
- PREAMBLE@0..21
- THEOREM_DEFINITION_AMSTHM@0..21
- COMMAND_NAME@0..11 "\\newtheorem"
- CURLY_GROUP_WORD@11..16
- L_CURLY@11..12 "{"
- KEY@12..15
- WORD@12..15 "foo"
- R_CURLY@15..16 "}"
- CURLY_GROUP@16..21
- L_CURLY@16..17 "{"
- TEXT@17..20
- WORD@17..20 "Foo"
- R_CURLY@20..21 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
deleted file mode 100644
index 57f4f7ce1b..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_name_with_description_and_counter.txt.snap
+++ /dev/null
@@ -1,25 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
----
-ROOT@0..26
- PREAMBLE@0..26
- THEOREM_DEFINITION_AMSTHM@0..26
- COMMAND_NAME@0..11 "\\newtheorem"
- CURLY_GROUP_WORD@11..16
- L_CURLY@11..12 "{"
- KEY@12..15
- WORD@12..15 "foo"
- R_CURLY@15..16 "}"
- BRACK_GROUP_WORD@16..21
- L_BRACK@16..17 "["
- KEY@17..20
- WORD@17..20 "bar"
- R_BRACK@20..21 "]"
- CURLY_GROUP@21..26
- L_CURLY@21..22 "{"
- TEXT@22..25
- WORD@22..25 "Foo"
- R_CURLY@25..26 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
deleted file mode 100644
index 22674fbbba..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_only_name.txt.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
----
-ROOT@0..16
- PREAMBLE@0..16
- THEOREM_DEFINITION_AMSTHM@0..16
- COMMAND_NAME@0..11 "\\newtheorem"
- CURLY_GROUP_WORD@11..16
- L_CURLY@11..12 "{"
- KEY@12..15
- WORD@12..15 "foo"
- R_CURLY@15..16 "}"
-
diff --git a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_thmtools.txt.snap b/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_thmtools.txt.snap
deleted file mode 100644
index 8b00bb4b59..0000000000
--- a/support/texlab/crates/parser/src/snapshots/parser__latex__tests__parse@theorem_definition__theorem_definition_thmtools.txt.snap
+++ /dev/null
@@ -1,35 +0,0 @@
----
-source: crates/parser/src/latex.rs
-expression: root
-input_file: crates/parser/src/test_data/latex/theorem_definition/theorem_definition_thmtools.txt
----
-ROOT@0..41
- PREAMBLE@0..41
- THEOREM_DEFINITION_THMTOOLS@0..41
- COMMAND_NAME@0..15 "\\declaretheorem"
- BRACK_GROUP_KEY_VALUE@15..36
- L_BRACK@15..16 "["
- KEY_VALUE_BODY@16..35
- KEY_VALUE_PAIR@16..25
- KEY@16..21
- WORD@16..21 "style"
- EQUALITY_SIGN@21..22 "="
- VALUE@22..25
- TEXT@22..25
- WORD@22..25 "foo"
- COMMA@25..26 ","
- WHITESPACE@26..27 " "
- KEY_VALUE_PAIR@27..35
- KEY@27..31
- WORD@27..31 "name"
- EQUALITY_SIGN@31..32 "="
- VALUE@32..35
- TEXT@32..35
- WORD@32..35 "bar"
- R_BRACK@35..36 "]"
- CURLY_GROUP_WORD@36..41
- L_CURLY@36..37 "{"
- KEY@37..40
- WORD@37..40 "baz"
- R_CURLY@40..41 "}"
-
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/comment.txt b/support/texlab/crates/parser/src/test_data/bibtex/comment.txt
deleted file mode 100644
index f2ff586ab7..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/comment.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Some junk here
-
-@comment{foo,
- author = {Foo Bar},
- title = {Some Title},
-}
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt b/support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
deleted file mode 100644
index c94b808fd5..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/issue_809.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-@article{issue_809,
- title = {foo (" bar) baz},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/issue_945.txt b/support/texlab/crates/parser/src/test_data/bibtex/issue_945.txt
deleted file mode 100644
index e50835d51f..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/issue_945.txt
+++ /dev/null
@@ -1 +0,0 @@
-@article{test, author = {\"{\i}}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/preamble.txt b/support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
deleted file mode 100644
index 266b5ce228..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/preamble.txt
+++ /dev/null
@@ -1 +0,0 @@
-@preamble{"Hello World!"} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
deleted file mode 100644
index ff829b40d1..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/aho_2006.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-@book{10.5555/1177220,
- author = {Aho, Alfred V. and Lam, Monica S. and Sethi, Ravi and Ullman, Jeffrey D.},
- title = {Compilers: Principles, Techniques, and Tools (2nd Edition)},
- year = {2006},
- isbn = {0321486811},
- publisher = {Addison-Wesley Longman Publishing Co., Inc.},
- address = {USA}
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
deleted file mode 100644
index 88ea701c22..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/aksin_2006.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-@string{jomch = {J.~Organomet. Chem.}}
-
-@article{aksin,
- author = {Aks{\i}n, {\"O}zge and T{\"u}rkmen, Hayati and Artok, Levent
- and {\c{C}}etinkaya, Bekir and Ni, Chaoying and
- B{\"u}y{\"u}kg{\"u}ng{\"o}r, Orhan and {\"O}zkal, Erhan},
- title = {Effect of immobilization on catalytic characteristics of
- saturated {Pd-N}-heterocyclic carbenes in {Mizoroki-Heck}
- reactions},
- journaltitle = jomch,
- date = 2006,
- volume = 691,
- number = 13,
- pages = {3027-3036},
- indextitle = {Effect of immobilization on catalytic characteristics},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
deleted file mode 100644
index ed16d33c67..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/almendro_1998.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-@patent{almendro,
- author = {Almendro, Jos{\'e} L. and Mart{\'i}n, Jacinto and S{\'a}nchez,
- Alberto and Nozal, Fernando},
- title = {Elektromagnetisches Signalhorn},
- number = {EU-29702195U},
- date = 1998,
- location = {countryfr and countryuk and countryde},
- langid = {german},
- annotation = {This is a \texttt{patent} entry with a \texttt{location}
- field. The number is given in the \texttt{number} field. Note
- the format of the \texttt{location} field in the database
- file. Compare \texttt{laufenberg}, \texttt{sorace}, and
- \texttt{kowalik}},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
deleted file mode 100644
index 9f224353cc..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/averroes_1998.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-@book{averroes/bland,
- author = {Averroes},
- title = {The Epistle on the Possibility of Conjunction with the Active
- Intellect by {Ibn Rushd} with the Commentary of {Moses Narboni}},
- date = 1982,
- editor = {Bland, Kalman P.},
- translator = {Bland, Kalman P.},
- series = {Moreshet: Studies in {Jewish} History, Literature and Thought},
- number = 7,
- publisher = {Jewish Theological Seminary of America},
- location = {New York},
- keywords = {primary},
- langid = {english},
- langidopts = {variant=american},
- indextitle = {Epistle on the Possibility of Conjunction, The},
- shorttitle = {Possibility of Conjunction},
- annotation = {A \texttt{book} entry with a \texttt{series} and a
- \texttt{number}. Note the concatenation of the \texttt{editor}
- and \texttt{translator} fields as well as the
- \texttt{indextitle} field},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
deleted file mode 100644
index b2d77e216f..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/betram_1996.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-@string{jams = {J.~Amer. Math. Soc.}}
-
-@article{bertram,
- author = {Bertram, Aaron and Wentworth, Richard},
- title = {Gromov invariants for holomorphic maps on {Riemann} surfaces},
- journaltitle = jams,
- date = 1996,
- volume = 9,
- number = 2,
- pages = {529-571},
- langid = {english},
- langidopts = {variant=american},
- shorttitle = {Gromov invariants},
- annotation = {An \texttt{article} entry with a \texttt{volume} and a
- \texttt{number} field},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
deleted file mode 100644
index a502e53e03..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/blom_2021.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-@article{DBLP:journals/corr/abs-2107-11903,
- author = {Michelle L. Blom and
- Jurlind Budurushi and
- Ronald L. Rivest and
- Philip B. Stark and
- Peter J. Stuckey and
- Vanessa Teague and
- Damjan Vukcevic},
- title = {Assertion-based Approaches to Auditing Complex Elections, with application
- to party-list proportional elections},
- journal = {CoRR},
- volume = {abs/2107.11903},
- year = {2021},
- url = {https://arxiv.org/abs/2107.11903},
- eprinttype = {arXiv},
- eprint = {2107.11903},
- timestamp = {Thu, 29 Jul 2021 16:14:15 +0200},
- biburl = {https://dblp.org/rec/journals/corr/abs-2107-11903.bib},
- bibsource = {dblp computer science bibliography, https://dblp.org}
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
deleted file mode 100644
index 7d8545577d..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/combi_2004.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-@inproceedings{10.1145/967900.968040,
- author = {Combi, Carlo and Pozzi, Giuseppe},
- title = {Architectures for a Temporal Workflow Management System},
- year = {2004},
- isbn = {1581138121},
- publisher = {Association for Computing Machinery},
- address = {New York, NY, USA},
- url = {https://doi.org/10.1145/967900.968040},
- doi = {10.1145/967900.968040},
- booktitle = {Proceedings of the 2004 ACM Symposium on Applied Computing},
- pages = {659-666},
- numpages = {8},
- keywords = {active DBMS, temporal DBMS, workflow management system - WfMS, temporal workflow management system},
- location = {Nicosia, Cyprus},
- series = {SAC '04}
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
deleted file mode 100644
index 116f5e7098..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/erwin_2007.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-@inproceedings{10.5555/1386993.1386994,
- author = {Erwin, Alva and Gopalan, Raj P. and Achuthan, N. R.},
- title = {A Bottom-up Projection Based Algorithm for Mining High Utility Itemsets},
- year = {2007},
- isbn = {9781920682651},
- publisher = {Australian Computer Society, Inc.},
- address = {AUS},
- booktitle = {Proceedings of the 2nd International Workshop on Integrating Artificial Intelligence and Data Mining - Volume 84},
- pages = {3-11},
- numpages = {9},
- keywords = {pattern growth, high utility itemset mining},
- location = {Gold Coast, Australia},
- series = {AIDM '07}
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
deleted file mode 100644
index c367ef12ee..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/jain_1999.txt
+++ /dev/null
@@ -1,18 +0,0 @@
-@article{10.1145/331499.331504,
- author = {Jain, A. K. and Murty, M. N. and Flynn, P. J.},
- title = {Data Clustering: A Review},
- year = {1999},
- issue_date = {Sept. 1999},
- publisher = {Association for Computing Machinery},
- address = {New York, NY, USA},
- volume = {31},
- number = {3},
- issn = {0360-0300},
- url = {https://doi.org/10.1145/331499.331504},
- doi = {10.1145/331499.331504},
- journal = {ACM Comput. Surv.},
- month = {sep},
- pages = {264-323},
- numpages = {60},
- keywords = {incremental clustering, clustering applications, exploratory data analysis, cluster analysis, similarity indices, unsupervised learning}
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
deleted file mode 100644
index 457f871491..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/kastenholz_2006.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-@string{jchph = {J.~Chem. Phys.}}
-
-@article{kastenholz,
- author = {Kastenholz, M. A. and H{\"u}nenberger, Philippe H.},
- title = {Computation of methodology\hyphen independent ionic solvation
- free energies from molecular simulations},
- journaltitle = jchph,
- date = 2006,
- subtitle = {{I}. {The} electrostatic potential in molecular liquids},
- volume = 124,
- eid = 124106,
- doi = {10.1063/1.2172593},
- langid = {english},
- langidopts = {variant=american},
- indextitle = {Computation of ionic solvation free energies},
- annotation = {An \texttt{article} entry with an \texttt{eid} and a
- \texttt{doi} field. Note that the \textsc{doi} is transformed
- into a clickable link if \texttt{hyperref} support has been
- enabled},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
deleted file mode 100644
index 98c595e35c..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/knuth_1984.txt
+++ /dev/null
@@ -1,22 +0,0 @@
-@book{knuth:ct:a,
- author = {Knuth, Donald E.},
- title = {The {\TeX book}},
- date = 1984,
- maintitle = {Computers \& Typesetting},
- volume = {A},
- publisher = {Addison-Wesley},
- location = {Reading, Mass.},
- langid = {english},
- langidopts = {variant=american},
- sorttitle = {Computers & Typesetting A},
- indexsorttitle= {The TeXbook},
- indextitle = {\protect\TeX book, The},
- shorttitle = {\TeX book},
- annotation = {The first volume of a five-volume book. Note the
- \texttt{sorttitle} field. We want this
- volume to be listed after the entry referring to the entire
- five-volume set. Also note the \texttt{indextitle} and
- \texttt{indexsorttitle} fields. Indexing packages that don't
- generate robust index entries require some control sequences
- to be protected from expansion},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
deleted file mode 100644
index cb803aab51..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/matuz_1990.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-@collection{matuz:doody,
- editor = {Matuz, Roger},
- title = {Contemporary Literary Criticism},
- year = 1990,
- volume = 61,
- publisher = {Gale},
- location = {Detroit},
- pages = {204-208},
- langid = {english},
- langidopts = {variant=american},
- annotation = {A \texttt{collection} entry providing the excerpt information
- for the \texttt{doody} entry. Note the format of the
- \texttt{pages} field},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
deleted file mode 100644
index e245be39bb..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/nietzsche_1998.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-@string{dtv = {Deutscher Taschenbuch-Verlag}}
-
-@mvbook{nietzsche:ksa,
- author = {Nietzsche, Friedrich},
- title = {S{\"a}mtliche Werke},
- date = 1988,
- editor = {Colli, Giorgio and Montinari, Mazzino},
- edition = 2,
- volumes = 15,
- publisher = dtv # { and Walter de Gruyter},
- location = {M{\"u}nchen and Berlin and New York},
- langid = {german},
- sorttitle = {Werke-00-000},
- indexsorttitle= {Samtliche Werke},
- subtitle = {Kritische Studienausgabe},
- annotation = {The critical edition of Nietzsche's works. This is a
- \texttt{mvbook} entry referring to a 15-volume work as a
- whole. Note the \texttt{volumes} field and the format of the
- \texttt{publisher} and \texttt{location} fields in the
- database file. Also note the \texttt{sorttitle} and
- field which is used to fine-tune the
- sorting order of the bibliography. We want this item listed
- first in the bibliography},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt b/support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
deleted file mode 100644
index e1076145ea..0000000000
--- a/support/texlab/crates/parser/src/test_data/bibtex/samples/rivest_1978.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-@article{10.1145/359340.359342,
- author = {Rivest, R. L. and Shamir, A. and Adleman, L.},
- title = {A Method for Obtaining Digital Signatures and Public-Key Cryptosystems},
- year = {1978},
- issue_date = {Feb. 1978},
- publisher = {Association for Computing Machinery},
- address = {New York, NY, USA},
- volume = {21},
- number = {2},
- issn = {0001-0782},
- url = {https://doi.org/10.1145/359340.359342},
- doi = {10.1145/359340.359342},
- journal = {Commun. ACM},
- month = {feb},
- pages = {120-126},
- numpages = {7},
-} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/001.txt b/support/texlab/crates/parser/src/test_data/build_log/001.txt
deleted file mode 100644
index fc9968af0f..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/001.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:50
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-)
-(/TexLive/texmf-dist/tex/latex/multirow/bigstrut.sty
-Package: bigstrut 2016/11/25 v2.2 Provide larger struts in tabulars
-\bigstrutjot=\dimen103
-)
-(/TexLive/texmf-dist/tex/latex/multirow/multirow.sty
-Package: multirow 2016/11/25 v2.2 Span multiple rows of a table
-\multirow@colwidth=\skip43
-\multirow@cntb=\count87
-\multirow@dima=\skip44
-) (./parent.aux)
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-
-Overfull \hbox (200.00162pt too wide) in paragraph at lines 8--9
-[]\OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-[]
-
-LaTeX Font Info: External font `cmex10' loaded for size
-(Font) <7> on input line 11.
-LaTeX Font Info: External font `cmex10' loaded for size
-(Font) <5> on input line 11.
-
-Overfull \vbox (3.19998pt too high) detected at line 23
-[]
-
-[1
-
-{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux) )
-Here is how much of TeX's memory you used:
-265 strings out of 492995
-3121 string characters out of 6138727
-55074 words of memory out of 5000000
-3896 multiletter control sequences out of 15000+600000
-3640 words of font info for 14 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-23i,20n,20p,124b,282s stack positions out of 5000i,500n,10000p,200000b,80000s
-</
-TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb></TexLive/texmf-d
-ist/fonts/type1/public/amsfonts/cm/cmr7.pfb>
-Output written on parent.pdf (1 page, 17505 bytes).
-PDF statistics:
-16 PDF objects out of 1000 (max. 8388607)
-10 compressed objects within 1 object stream
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/002.txt b/support/texlab/crates/parser/src/test_data/build_log/002.txt
deleted file mode 100644
index 8d438d1f12..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/002.txt
+++ /dev/null
@@ -1,64 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:52
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-) (./parent.aux (./child.aux))
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-(./child.tex
-! Undefined control sequence.
-l.1 \foo
-
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
-
-) (./parent.aux) )
-Here is how much of TeX's memory you used:
-205 strings out of 492995
-2149 string characters out of 6138727
-54074 words of memory out of 5000000
-3841 multiletter control sequences out of 15000+600000
-3640 words of font info for 14 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s
-
-No pages of output.
-PDF statistics:
-0 PDF objects out of 1000 (max. 8388607)
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/003.txt b/support/texlab/crates/parser/src/test_data/build_log/003.txt
deleted file mode 100644
index 220614b91c..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/003.txt
+++ /dev/null
@@ -1,65 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:51
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-) (./parent.aux)
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 4.
-LaTeX Font Info: ... okay on input line 4.
-
-LaTeX Warning: Citation `foo' on page 1 undefined on input line 6.
-
-[1
-
-{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux)
-
-LaTeX Warning: There were undefined references.
-
-)
-Here is how much of TeX's memory you used:
-204 strings out of 492995
-2142 string characters out of 6138727
-54074 words of memory out of 5000000
-3842 multiletter control sequences out of 15000+600000
-3948 words of font info for 15 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-23i,4n,21p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s
-</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmbx10.pfb></TexLive/
-texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb>
-Output written on parent.pdf (1 page, 17339 bytes).
-PDF statistics:
-16 PDF objects out of 1000 (max. 8388607)
-10 compressed objects within 1 object stream
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/004.txt b/support/texlab/crates/parser/src/test_data/build_log/004.txt
deleted file mode 100644
index 4ab379cd53..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/004.txt
+++ /dev/null
@@ -1,83 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:40
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-)
-(/TexLive/texmf-dist/tex/generic/babel/babel.sty
-Package: babel 2017/05/19 3.10 The Babel package
-
-! Package babel Error: Unknown option `foo'. Either you misspelled it
-(babel) or the language definition file foo.ldf was not found.
-
-See the babel package documentation for explanation.
-Type H <return> for immediate help.
-...
-
-l.393 \ProcessOptions*
-
-Valid options are: shorthands=, KeepShorthandsActive,
-activeacute, activegrave, noconfigs, safe=, main=, math=
-headfoot=, strings=, config=, hyphenmap=, or a language name.
-
-! Package babel Error: You haven't specified a language option.
-
-See the babel package documentation for explanation.
-Type H <return> for immediate help.
-...
-
-l.426 ...ry to proceed from here, type x to quit.}
-
-You need to specify a language, either as a global option
-or as an optional argument to the \usepackage command;
-You shouldn't try to proceed from here, type x to quit.
-
-) (./parent.aux)
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 5.
-LaTeX Font Info: ... okay on input line 5.
-(./parent.aux) )
-Here is how much of TeX's memory you used:
-304 strings out of 492995
-3421 string characters out of 6138727
-56035 words of memory out of 5000000
-3938 multiletter control sequences out of 15000+600000
-3640 words of font info for 14 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-23i,1n,17p,116b,36s stack positions out of 5000i,500n,10000p,200000b,80000s
-
-No pages of output.
-PDF statistics:
-0 PDF objects out of 1000 (max. 8388607)
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/005.txt b/support/texlab/crates/parser/src/test_data/build_log/005.txt
deleted file mode 100644
index 07c95bfc6b..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/005.txt
+++ /dev/null
@@ -1,385 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:45
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-)
-(/TexLive/texmf-dist/tex/generic/babel/babel.sty
-Package: babel 2017/05/19 3.10 The Babel package
-
-(/TexLive/texmf-dist/tex/generic/babel-spanish/spanish.ldf
-Language: spanish.ldf 2016/03/03 v5.0p Spanish support from the babel system
-
-(/TexLive/texmf-dist/tex/generic/babel/babel.def
-File: babel.def 2017/05/19 3.10 Babel common definitions
-\babel@savecnt=\count87
-\U@D=\dimen103
-)
-\es@quottoks=\toks14
-\es@quotdepth=\count88
-Package babel Info: Making " an active character on input line 561.
-Package babel Info: Making . an active character on input line 662.
-Package babel Info: Making < an active character on input line 707.
-Package babel Info: Making > an active character on input line 707.
-))
-(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.sty
-Package: biblatex 2016/12/05 v3.7 programmable bibliographies (PK/JW/AB)
-
-(/TexLive/texmf-dist/tex/generic/oberdiek/pdftexcmds.sty
-Package: pdftexcmds 2017/03/19 v0.25 Utility functions of pdfTeX for LuaTeX (HO
-)
-
-(/TexLive/texmf-dist/tex/generic/oberdiek/infwarerr.sty
-Package: infwarerr 2016/05/16 v1.4 Providing info/warning/error messages (HO)
-)
-(/TexLive/texmf-dist/tex/generic/oberdiek/ifluatex.sty
-Package: ifluatex 2016/05/16 v1.4 Provides the ifluatex switch (HO)
-Package ifluatex Info: LuaTeX not detected.
-)
-(/TexLive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty
-Package: ltxcmds 2016/05/16 v1.23 LaTeX kernel commands for general use (HO)
-)
-(/TexLive/texmf-dist/tex/generic/oberdiek/ifpdf.sty
-Package: ifpdf 2017/03/15 v3.2 Provides the ifpdf switch
-)
-Package pdftexcmds Info: LuaTeX not detected.
-Package pdftexcmds Info: \pdf@primitive is available.
-Package pdftexcmds Info: \pdf@ifprimitive is available.
-Package pdftexcmds Info: \pdfdraftmode found.
-)
-(/TexLive/texmf-dist/tex/latex/etoolbox/etoolbox.sty
-Package: etoolbox 2017/01/02 v2.4 e-TeX tools for LaTeX (JAW)
-\etb@tempcnta=\count89
-)
-(/TexLive/texmf-dist/tex/latex/graphics/keyval.sty
-Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
-\KV@toks@=\toks15
-)
-(/TexLive/texmf-dist/tex/latex/oberdiek/kvoptions.sty
-Package: kvoptions 2016/05/16 v3.12 Key value format for package options (HO)
-
-(/TexLive/texmf-dist/tex/generic/oberdiek/kvsetkeys.sty
-Package: kvsetkeys 2016/05/16 v1.17 Key value parser (HO)
-
-(/TexLive/texmf-dist/tex/generic/oberdiek/etexcmds.sty
-Package: etexcmds 2016/05/16 v1.6 Avoid name clashes with e-TeX commands (HO)
-Package etexcmds Info: Could not find \expanded.
-(etexcmds) That can mean that you are not using pdfTeX 1.50 or
-(etexcmds) that some package has redefined \expanded.
-(etexcmds) In the latter case, load this package earlier.
-)))
-(/TexLive/texmf-dist/tex/latex/logreq/logreq.sty
-Package: logreq 2010/08/04 v1.0 xml request logger
-\lrq@indent=\count90
-
-(/TexLive/texmf-dist/tex/latex/logreq/logreq.def
-File: logreq.def 2010/08/04 v1.0 logreq spec v1.0
-))
-(/TexLive/texmf-dist/tex/latex/base/ifthen.sty
-Package: ifthen 2014/09/29 v1.1c Standard LaTeX ifthen package (DPC)
-)
-(/TexLive/texmf-dist/tex/latex/url/url.sty
-\Urlmuskip=\muskip10
-Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
-)
-(/TexLive/texmf-dist/tex/generic/xstring/xstring.sty
-(/TexLive/texmf-dist/tex/generic/xstring/xstring.tex
-\@xs@message=\write3
-\integerpart=\count91
-\decimalpart=\count92
-)
-Package: xstring 2013/10/13 v1.7c String manipulations (C Tellechea)
-)
-\c@tabx@nest=\count93
-\c@listtotal=\count94
-\c@listcount=\count95
-\c@liststart=\count96
-\c@liststop=\count97
-\c@citecount=\count98
-\c@citetotal=\count99
-\c@multicitecount=\count100
-\c@multicitetotal=\count101
-\c@instcount=\count102
-\c@maxnames=\count103
-\c@minnames=\count104
-\c@maxitems=\count105
-\c@minitems=\count106
-\c@citecounter=\count107
-\c@savedcitecounter=\count108
-\c@uniquelist=\count109
-\c@uniquename=\count110
-\c@refsection=\count111
-\c@refsegment=\count112
-\c@maxextratitle=\count113
-\c@maxextratitleyear=\count114
-\c@maxextrayear=\count115
-\c@maxextraalpha=\count116
-\c@abbrvpenalty=\count117
-\c@highnamepenalty=\count118
-\c@lownamepenalty=\count119
-\c@maxparens=\count120
-\c@parenlevel=\count121
-\blx@tempcnta=\count122
-\blx@tempcntb=\count123
-\blx@tempcntc=\count124
-\blx@maxsection=\count125
-\blx@maxsegment@0=\count126
-\blx@notetype=\count127
-\blx@parenlevel@text=\count128
-\blx@parenlevel@foot=\count129
-\blx@sectionciteorder@0=\count130
-\labelnumberwidth=\skip43
-\labelalphawidth=\skip44
-\biblabelsep=\skip45
-\bibitemsep=\skip46
-\bibnamesep=\skip47
-\bibinitsep=\skip48
-\bibparsep=\skip49
-\bibhang=\skip50
-\blx@bcfin=\read1
-\blx@bcfout=\write4
-\c@mincomprange=\count131
-\c@maxcomprange=\count132
-\c@mincompwidth=\count133
-Package biblatex Info: Trying to load biblatex default data model...
-Package biblatex Info: ... file 'blx-dm.def' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/blx-dm.def)
-Package biblatex Info: Trying to load biblatex style data model...
-Package biblatex Info: ... file 'ieee.dbx' not found.
-Package biblatex Info: Trying to load biblatex custom data model...
-Package biblatex Info: ... file 'biblatex-dm.cfg' not found.
-\c@afterword=\count134
-\c@savedafterword=\count135
-\c@annotator=\count136
-\c@savedannotator=\count137
-\c@author=\count138
-\c@savedauthor=\count139
-\c@bookauthor=\count140
-\c@savedbookauthor=\count141
-\c@commentator=\count142
-\c@savedcommentator=\count143
-\c@editor=\count144
-\c@savededitor=\count145
-\c@editora=\count146
-\c@savededitora=\count147
-\c@editorb=\count148
-\c@savededitorb=\count149
-\c@editorc=\count150
-\c@savededitorc=\count151
-\c@foreword=\count152
-\c@savedforeword=\count153
-\c@holder=\count154
-\c@savedholder=\count155
-\c@introduction=\count156
-\c@savedintroduction=\count157
-\c@namea=\count158
-\c@savednamea=\count159
-\c@nameb=\count160
-\c@savednameb=\count161
-\c@namec=\count162
-\c@savednamec=\count163
-\c@translator=\count164
-\c@savedtranslator=\count165
-\c@shortauthor=\count166
-\c@savedshortauthor=\count167
-\c@shorteditor=\count168
-\c@savedshorteditor=\count169
-\c@labelname=\count170
-\c@savedlabelname=\count171
-\c@institution=\count172
-\c@savedinstitution=\count173
-\c@lista=\count174
-\c@savedlista=\count175
-\c@listb=\count176
-\c@savedlistb=\count177
-\c@listc=\count178
-\c@savedlistc=\count179
-\c@listd=\count180
-\c@savedlistd=\count181
-\c@liste=\count182
-\c@savedliste=\count183
-\c@listf=\count184
-\c@savedlistf=\count185
-\c@location=\count186
-\c@savedlocation=\count187
-\c@organization=\count188
-\c@savedorganization=\count189
-\c@origlocation=\count190
-\c@savedoriglocation=\count191
-\c@origpublisher=\count192
-\c@savedorigpublisher=\count193
-\c@publisher=\count194
-\c@savedpublisher=\count195
-\c@language=\count196
-\c@savedlanguage=\count197
-\c@pageref=\count198
-\c@savedpageref=\count199
-\shorthandwidth=\skip51
-\shortjournalwidth=\skip52
-\shortserieswidth=\skip53
-\shorttitlewidth=\skip54
-\shortauthorwidth=\skip55
-\shorteditorwidth=\skip56
-Package biblatex Info: Trying to load compatibility code...
-Package biblatex Info: ... file 'blx-compat.def' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/blx-compat.def
-File: blx-compat.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB)
-)
-Package biblatex Info: Trying to load generic definitions...
-Package biblatex Info: ... file 'biblatex.def' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.def
-File: biblatex.def 2016/12/05 v3.7 biblatex compatibility (PK/JW/AB)
-\c@textcitecount=\count266
-\c@textcitetotal=\count267
-\c@textcitemaxnames=\count268
-\c@biburlnumpenalty=\count269
-\c@biburlucpenalty=\count270
-\c@biburllcpenalty=\count271
-\c@smartand=\count272
-)
-Package biblatex Info: Trying to load bibliography style 'ieee'...
-Package biblatex Info: ... file 'ieee.bbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.bbx
-File: ieee.bbx 2017/03/27 v1.2d biblatex bibliography style
-Package biblatex Info: Trying to load bibliography style 'numeric-comp'...
-Package biblatex Info: ... file 'numeric-comp.bbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric-comp.bbx
-File: numeric-comp.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
-Package biblatex Info: Trying to load bibliography style 'numeric'...
-Package biblatex Info: ... file 'numeric.bbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/bbx/numeric.bbx
-File: numeric.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
-Package biblatex Info: Trying to load bibliography style 'standard'...
-Package biblatex Info: ... file 'standard.bbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/bbx/standard.bbx
-File: standard.bbx 2016/12/05 v3.7 biblatex bibliography style (PK/JW/AB)
-\c@bbx:relatedcount=\count273
-\c@bbx:relatedtotal=\count274
-))))
-Package biblatex Info: Trying to load citation style 'ieee'...
-Package biblatex Info: ... file 'ieee.cbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex-ieee/ieee.cbx
-File: ieee.cbx 2017/03/27 v1.2d biblatex citation style
-Package biblatex Info: Trying to load citation style 'numeric-comp'...
-Package biblatex Info: ... file 'numeric-comp.cbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/cbx/numeric-comp.cbx
-File: numeric-comp.cbx 2016/12/05 v3.7 biblatex citation style (PK/JW/AB)
-\c@cbx@tempcnta=\count275
-\c@cbx@tempcntb=\count276
-Package biblatex Info: Redefining '\cite'.
-Package biblatex Info: Redefining '\parencite'.
-Package biblatex Info: Redefining '\footcite'.
-Package biblatex Info: Redefining '\footcitetext'.
-Package biblatex Info: Redefining '\smartcite'.
-Package biblatex Info: Redefining '\supercite'.
-Package biblatex Info: Redefining '\textcite'.
-Package biblatex Info: Redefining '\textcites'.
-Package biblatex Info: Redefining '\cites'.
-Package biblatex Info: Redefining '\parencites'.
-Package biblatex Info: Redefining '\smartcites'.
-)
-Package biblatex Info: Redefining '\cite'.
-Package biblatex Info: Redefining '\cites'.
-)
-Package biblatex Info: Trying to load configuration file...
-Package biblatex Info: ... file 'biblatex.cfg' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/biblatex.cfg
-File: biblatex.cfg
-))
-Package biblatex Info: Trying to load language 'spanish'...
-Package biblatex Info: ... file 'spanish.lbx' found.
-
-(/TexLive/texmf-dist/tex/latex/biblatex/lbx/spanish.lbx
-File: spanish.lbx 2016/12/05 v3.7 biblatex localization (PK/JW/AB)
-)
-
-Package biblatex Warning: 'babel/polyglossia' detected but 'csquotes' missing.
-(biblatex) Loading 'csquotes' recommended.
-
-\@quotelevel=\count277
-\@quotereset=\count278
-(./parent.aux)
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 6.
-LaTeX Font Info: ... okay on input line 6.
-LaTeX Info: Redefining \sptext on input line 6.
-LaTeX Info: Redefining \. on input line 6.
-LaTeX Info: Redefining \% on input line 6.
-Package biblatex Info: No input encoding detected.
-(biblatex) Assuming 'ascii'.
-Package biblatex Info: Automatic encoding selection.
-(biblatex) Assuming data encoding 'ascii'.
-\openout4 = `parent.bcf'.
-
-Package biblatex Info: Trying to load bibliographic data...
-Package biblatex Info: ... file 'parent.bbl' not found.
-
-No file parent.bbl.
-Package biblatex Info: Reference section=0 on input line 6.
-Package biblatex Info: Reference segment=0 on input line 6.
-(./parent.aux)
-
-LaTeX Warning: There were undefined references.
-
-Package biblatex Warning: Please (re)run Biber on the file:
-(biblatex) parent
-(biblatex) and rerun LaTeX afterwards.
-
-Package logreq Info: Writing requests to 'parent.run.xml'.
-\openout1 = `parent.run.xml'.
-
-)
-Here is how much of TeX's memory you used:
-7717 strings out of 492995
-133301 string characters out of 6138727
-557258 words of memory out of 5000000
-11248 multiletter control sequences out of 15000+600000
-3640 words of font info for 14 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-35i,1n,30p,856b,700s stack positions out of 5000i,500n,10000p,200000b,80000s
-
-No pages of output.
-PDF statistics:
-0 PDF objects out of 1000 (max. 8388607)
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/006.txt b/support/texlab/crates/parser/src/test_data/build_log/006.txt
deleted file mode 100644
index 3edb18b8c7..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/006.txt
+++ /dev/null
@@ -1,122 +0,0 @@
-This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/W32TeX) (preloaded format=pdflatex 2018.3.30) 26 DEC 2018 16:33
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**./parent.tex
-(./parent.tex
-LaTeX2e <2017-04-15>
-Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
-(/TexLive/texmf-dist/tex/latex/base/article.cls
-Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
-(/TexLive/texmf-dist/tex/latex/base/size10.clo
-File: size10.clo 2014/09/29 v1.4h Standard LaTeX file (size option)
-)
-\c@part=\count79
-\c@section=\count80
-\c@subsection=\count81
-\c@subsubsection=\count82
-\c@paragraph=\count83
-\c@subparagraph=\count84
-\c@figure=\count85
-\c@table=\count86
-\abovecaptionskip=\skip41
-\belowcaptionskip=\skip42
-\bibindent=\dimen102
-) (./parent.aux
-(./child.tex.aux))
-\openout1 = `parent.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-\openout2 = `child.aux'.
-
-(./child.tex)
-! Undefined control sequence.
-l.7 \foo
-
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
-
-! Missing $ inserted.
-<inserted text>
- $
-l.8 \bar
-
-I've inserted a begin-math/end-math symbol since I think
-you left one out. Proceed, with fingers crossed.
-
-LaTeX Font Info: External font `cmex10' loaded for size
-(Font) <7> on input line 8.
-LaTeX Font Info: External font `cmex10' loaded for size
-(Font) <5> on input line 8.
-! Undefined control sequence.
-l.9 \baz
-
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
-
-! Missing { inserted.
-<to be read again>
- \par
-l.10
-
-A left brace was mandatory here, so I've put one in.
-You might want to delete and/or insert some corrections
-so that I will find a matching right brace soon.
-(If you're confused by all this, try typing `I}' now.)
-
-! Missing $ inserted.
-<inserted text>
- $
-l.10
-
-I've inserted a begin-math/end-math symbol since I think
-you left one out. Proceed, with fingers crossed.
-
-! Missing } inserted.
-<inserted text>
- }
-l.10
-
-I've inserted something that you may have forgotten.
-(See the <inserted text> above.)
-With luck, this will get me unwedged. But if you
-really didn't forget anything, try typing `2' now; then
-my insertion and my current dilemma will both disappear.
-
-[1
-
-{/TexLive/texmf-var/fonts/map/pdftex/updmap/pdftex.map}] (./parent.aux
-(./child.aux)) )
-Here is how much of TeX's memory you used:
-212 strings out of 492995
-2238 string characters out of 6138727
-54074 words of memory out of 5000000
-3843 multiletter control sequences out of 15000+600000
-3640 words of font info for 14 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-23i,4n,17p,116b,107s stack positions out of 5000i,500n,10000p,200000b,80000s
-</TexLive/texmf-dist/fonts/type1/public/amsfonts/cm/cmr10.pfb
->
-Output written on parent.pdf (1 page, 8329 bytes).
-PDF statistics:
-12 PDF objects out of 1000 (max. 8388607)
-7 compressed objects within 1 object stream
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/build_log/007.txt b/support/texlab/crates/parser/src/test_data/build_log/007.txt
deleted file mode 100644
index 4c86405c0d..0000000000
--- a/support/texlab/crates/parser/src/test_data/build_log/007.txt
+++ /dev/null
@@ -1,176 +0,0 @@
-This is pdfTeX, Version 3.141592653-2.6-1.40.22 (TeX Live 2021/W32TeX) (preloaded format=pdflatex 2021.6.19) 5 NOV 2021 19:10
-entering extended mode
-restricted \write18 enabled.
-%&-line parsing enabled.
-**/some/folder/a.tex
-(/some/folder/a.tex
-LaTeX2e <2021-06-01> patch level 1
-L3 programming layer <2021-06-18>
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrartcl.cls
-Document Class: scrartcl 2021/03/17 v3.33 KOMA-Script document class (article)
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrkbase.sty
-Package: scrkbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-dependent b
-asics and keyval usage)
-
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrbase.sty
-Package: scrbase 2021/03/17 v3.33 KOMA-Script package (KOMA-Script-independent
-basics and keyval usage)
-
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile.sty
-Package: scrlfile 2021/03/17 v3.33 KOMA-Script package (file load hooks)
-
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
-Package: scrlfile-hook 2021/03/17 v3.33 KOMA-Script package (using LaTeX hooks)
-
-
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrlogo.sty
-Package: scrlogo 2021/03/17 v3.33 KOMA-Script package (logo)
-)))
-(/texlive/2021/texmf-dist/tex/latex/graphics/keyval.sty
-Package: keyval 2014/10/28 v1.15 key=value parser (DPC)
-\KV@toks@=\toks16
-)
-Applying: [2021/05/01] Usage of raw option list on input line 252.
-Already applied: [0000/00/00] compatibility for LaTeX before 2021/05/01 on inpu
-t line 337.
-))
-==> First Aid for scrkbase.sty no longer applied!
-(/texlive/2021/texmf-dist/tex/latex/koma-script/tocbasic.sty
-Package: tocbasic 2021/03/17 v3.33 KOMA-Script package (handling toc-files)
-\scr@dte@tocline@numberwidth=\skip47
-\scr@dte@tocline@numbox=\box50
-)
-Package tocbasic Info: babel extension for `toc' omitted
-(tocbasic) because of missing \bbl@set@language on input line 135.
-Class scrartcl Info: File `scrsize11pt.clo' used instead of
-(scrartcl) file `scrsize11.clo' to setup font sizes on input line 223
-9.
-
-(/texlive/2021/texmf-dist/tex/latex/koma-script/scrsize11pt.clo
-File: scrsize11pt.clo 2021/03/17 v3.33 KOMA-Script font size class option (11pt
-)
-)
-(/texlive/2021/texmf-dist/tex/latex/koma-script/typearea.sty
-Package: typearea 2021/03/17 v3.33 KOMA-Script package (type area)
-\ta@bcor=\skip48
-\ta@div=\count182
-\ta@hblk=\skip49
-\ta@vblk=\skip50
-\ta@temp=\skip51
-\footheight=\skip52
-Package typearea Info: These are the values describing the layout:
-(typearea) DIV = 10
-(typearea) BCOR = 0.0pt
-(typearea) \paperwidth = 597.50793pt
-(typearea) \textwidth = 418.25555pt
-(typearea) DIV departure = -6%
-(typearea) \evensidemargin = 17.3562pt
-(typearea) \oddsidemargin = 17.3562pt
-(typearea) \paperheight = 845.04694pt
-(typearea) \textheight = 595.80026pt
-(typearea) \topmargin = -25.16531pt
-(typearea) \headheight = 17.0pt
-(typearea) \headsep = 20.40001pt
-(typearea) \topskip = 11.0pt
-(typearea) \footskip = 47.6pt
-(typearea) \baselineskip = 13.6pt
-(typearea) on input line 1741.
-)
-\c@part=\count183
-\c@section=\count184
-\c@subsection=\count185
-\c@subsubsection=\count186
-\c@paragraph=\count187
-\c@subparagraph=\count188
-\scr@dte@section@maxnumwidth=\skip53
-Class scrartcl Info: using compatibility default `runin=bysign'
-(scrartcl) for `\section on input line 4846.
-Class scrartcl Info: using compatibility default `afterindent=bysign'
-(scrartcl) for `\section on input line 4846.
-\scr@dte@part@maxnumwidth=\skip54
-Class scrartcl Info: using compatibility default `afterindent=false'
-(scrartcl) for `\part on input line 4854.
-\scr@dte@subsection@maxnumwidth=\skip55
-Class scrartcl Info: using compatibility default `runin=bysign'
-(scrartcl) for `\subsection on input line 4864.
-Class scrartcl Info: using compatibility default `afterindent=bysign'
-(scrartcl) for `\subsection on input line 4864.
-\scr@dte@subsubsection@maxnumwidth=\skip56
-Class scrartcl Info: using compatibility default `runin=bysign'
-(scrartcl) for `\subsubsection on input line 4874.
-Class scrartcl Info: using compatibility default `afterindent=bysign'
-(scrartcl) for `\subsubsection on input line 4874.
-\scr@dte@paragraph@maxnumwidth=\skip57
-Class scrartcl Info: using compatibility default `runin=bysign'
-(scrartcl) for `\paragraph on input line 4885.
-Class scrartcl Info: using compatibility default `afterindent=bysign'
-(scrartcl) for `\paragraph on input line 4885.
-\scr@dte@subparagraph@maxnumwidth=\skip58
-Class scrartcl Info: using compatibility default `runin=bysign'
-(scrartcl) for `\subparagraph on input line 4895.
-Class scrartcl Info: using compatibility default `afterindent=bysign'
-(scrartcl) for `\subparagraph on input line 4895.
-\abovecaptionskip=\skip59
-\belowcaptionskip=\skip60
-\c@pti@nb@sid@b@x=\box51
-Package tocbasic Info: babel extension for `lof' omitted
-(tocbasic) because of missing \bbl@set@language on input line 6127.
-
-\scr@dte@figure@maxnumwidth=\skip61
-\c@figure=\count189
-Package tocbasic Info: babel extension for `lot' omitted
-(tocbasic) because of missing \bbl@set@language on input line 6139.
-
-\scr@dte@table@maxnumwidth=\skip62
-\c@table=\count190
-Class scrartcl Info: Redefining `\numberline' on input line 6303.
-\bibindent=\dimen138
-)
-(/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
-File: l3backend-pdftex.def 2021-05-07 L3 backend support: PDF output (pdfTeX)
-\l__color_backend_stack_int=\count191
-\l__pdf_internal_box=\box52
-) (./a.aux)
-\openout1 = `a.aux'.
-
-LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 3.
-LaTeX Font Info: ... okay on input line 3.
-Package scrbase Info: activating english \contentsname on input line 3.
-Package scrbase Info: activating english \listfigurename on input line 3.
-Package scrbase Info: activating english \listtablename on input line 3.
-! Undefined control sequence.
-l.4 \lsdkfjlskdfj
-
-The control sequence at the end of the top line
-of your error message was never \def'ed. If you have
-misspelled it (e.g., `\hobx'), type `I' and the correct
-spelling (e.g., `I\hbox'). Otherwise just continue,
-and I'll forget about whatever was undefined.
-
-(./a.aux) )
-Here is how much of TeX's memory you used:
-3199 strings out of 478510
-74549 string characters out of 5853586
-510929 words of memory out of 5000000
-21227 multiletter control sequences out of 15000+600000
-403730 words of font info for 28 fonts, out of 8000000 for 9000
-1141 hyphenation exceptions out of 8191
-108i,1n,108p,10625b,270s stack positions out of 5000i,500n,10000p,200000b,80000s
-
-No pages of output.
-PDF statistics:
-0 PDF objects out of 1000 (max. 8388607)
-0 named destinations out of 1000 (max. 500000)
-1 words of extra memory for PDF output out of 10000 (max. 10000000) \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/block_comments.txt b/support/texlab/crates/parser/src/test_data/latex/block_comments.txt
deleted file mode 100644
index d4e63ab1c8..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/block_comments.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-Foo
-\iffalse
-Test1
-\fi
-Bar
-\iffalse
-\fii
-\fi
-Baz \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
deleted file mode 100644
index 9084f143bf..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/caption/caption_default.txt
+++ /dev/null
@@ -1 +0,0 @@
-\caption[qux]{Foo \Bar Baz} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
deleted file mode 100644
index 62e5962816..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/caption/caption_default_error.txt
+++ /dev/null
@@ -1 +0,0 @@
-\caption[qux]{Foo \Bar Baz \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
deleted file mode 100644
index 8a1d3067d8..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/caption/caption_figure.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{figure}\caption{Foo}\end{figure} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
deleted file mode 100644
index 07af0af8ca..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal.txt
+++ /dev/null
@@ -1 +0,0 @@
-\caption{Foo \Bar Baz} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt b/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
deleted file mode 100644
index 747db731c1..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/caption/caption_minimal_error.txt
+++ /dev/null
@@ -1 +0,0 @@
-\caption{Foo \Bar Baz \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
deleted file mode 100644
index 06704b89a4..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_empty.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite{} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
deleted file mode 100644
index 1f8e4c9310..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_missing_brace.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite{foo \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
deleted file mode 100644
index be5da02c62..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_multiple_keys.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite{foo, bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
deleted file mode 100644
index 5ae28c28ec..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite[foo]{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
deleted file mode 100644
index 23103b2476..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_prenote_postnote.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite[foo][bar]{baz} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
deleted file mode 100644
index 68e3c2d36e..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_redundant_comma.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite{,foo,} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
deleted file mode 100644
index cd5809ef25..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\cite{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt b/support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
deleted file mode 100644
index d1a2677021..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/citation/citation_star.txt
+++ /dev/null
@@ -1 +0,0 @@
-\nocite{*} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
deleted file mode 100644
index e8b58c8162..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolor{foo}{rgb}{255,168,0} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
deleted file mode 100644
index 4fea2b24ec..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_reference_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\color{black} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
deleted file mode 100644
index f377ffcf2f..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error1.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolorset[ty]{rgb,HTML}{foo}{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
deleted file mode 100644
index 0b5fa35868..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error2.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolorset{rgb,HTML}{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
deleted file mode 100644
index fb695b4530..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error3.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolorset{rgb,HTML} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
deleted file mode 100644
index 7c494133bf..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_error4.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolorset \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
deleted file mode 100644
index c812e61041..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/color/color_set_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\definecolorset[ty]{rgb,HTML}{foo}{bar}{baz} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
deleted file mode 100644
index ef63ef62cb..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_argc.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand{\foo}{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
deleted file mode 100644
index 5ffc7e97c2..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand{\foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
deleted file mode 100644
index 9323f5a313..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_no_impl_error.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand{\foo \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
deleted file mode 100644
index c3fb7225f3..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_optional.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand{\foo}[1][def]{#1} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
deleted file mode 100644
index ffce86f21c..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand[1]{\id}{#1} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
deleted file mode 100644
index e7ce7984cb..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/command_definition_with_begin.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newcommand{\CVSubHeadingListStart}{\begin{itemize}[leftmargin=0.5cm, label={}]} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
deleted file mode 100644
index 685be22ce6..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_no_impl.txt
+++ /dev/null
@@ -1 +0,0 @@
-\DeclareMathOperator{\foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt b/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
deleted file mode 100644
index ffbf671f74..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/command_definition/math_operator_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\DeclareMathOperator{\foo}{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
deleted file mode 100644
index 76646075ea..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_asymptote.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-\begin{asy}
- printf("Hello World\n");
-\end{asy} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
deleted file mode 100644
index d3a5291dca..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newenvironment{bar}[1]{\begin{foo}}{\end{foo}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
deleted file mode 100644
index bead3228a4..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_definition_optional_arg.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newenvironment{foo}[1][default]{begin}{end} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
deleted file mode 100644
index 8d84019ac7..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{foo} \begin{qux} \end{baz} \end{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
deleted file mode 100644
index 35ce901a83..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_nested_missing_braces.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{foo \begin{qux Hello World \end{baz} \end{bar \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt b/support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
deleted file mode 100644
index 309b559957..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/environment/environment_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{foo} Hello World \end{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/equation.txt b/support/texlab/crates/parser/src/test_data/latex/equation.txt
deleted file mode 100644
index 7f85196961..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/equation.txt
+++ /dev/null
@@ -1 +0,0 @@
-\[ foo bar \] \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt b/support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
deleted file mode 100644
index 9e5707b196..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/equation_missing_begin.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{a} foo bar \] \end{b} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
deleted file mode 100644
index 2d62314c5c..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/generic_command_args.txt
+++ /dev/null
@@ -1 +0,0 @@
-\foo{bar}[qux] \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
deleted file mode 100644
index eeb4a48255..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/generic_command_empty.txt
+++ /dev/null
@@ -1 +0,0 @@
-\foo \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt b/support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
deleted file mode 100644
index 133d674d1e..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/generic_command_escape.txt
+++ /dev/null
@@ -1 +0,0 @@
-\# \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
deleted file mode 100644
index abf12b6cae..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_declaration.txt
+++ /dev/null
@@ -1 +0,0 @@
-\DeclareAcronym{eg}{short = e.g,long = for example,tag = abbrev} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
deleted file mode 100644
index 47a69067ca..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
deleted file mode 100644
index 4fbf285927..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newacronym{fpsLabel}{FPS}{Frame per Second} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
deleted file mode 100644
index 86e60c4584..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_package.txt
+++ /dev/null
@@ -1 +0,0 @@
-\acro{fps}[FPS]{Frames per Second}
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
deleted file mode 100644
index 43fd03f12b..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\acrshort[foo=bar,baz]{fpsLabel} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
deleted file mode 100644
index d9fb5b9a25..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/acronym_reference_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\acrshort{fpsLabel} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
deleted file mode 100644
index fb1e12899a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newglossaryentry{foo}{bar = baz, qux,} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
deleted file mode 100644
index fbae075e1d..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\gls[foo = bar, qux]{baz} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
deleted file mode 100644
index a603355f0f..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/glossary/glossary_entry_reference_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\gls{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/graphics_path.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
deleted file mode 100644
index 0e9f431c36..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/graphics_path.txt
+++ /dev/null
@@ -1 +0,0 @@
-\graphicspath{{../figures/}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
deleted file mode 100644
index 729ee51690..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/graphics_path_command.txt
+++ /dev/null
@@ -1 +0,0 @@
-\graphicspath{{\subfix{./img/}}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt b/support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
deleted file mode 100644
index ae8aa84d86..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/graphics_path_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\graphicspath[foo]{{../figures/}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
deleted file mode 100644
index 6c7b76c0f8..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/curly_group_missing_end.txt
+++ /dev/null
@@ -1 +0,0 @@
-{hello world \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt b/support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
deleted file mode 100644
index 5084aae70a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/curly_group_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-{hello world} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt b/support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
deleted file mode 100644
index fcb715926a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/equation_missing_end.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{a} \[ foo bar \end{b} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
deleted file mode 100644
index 144a5fdd6d..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/escaped_brackets.txt
+++ /dev/null
@@ -1 +0,0 @@
-{[}{]} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
deleted file mode 100644
index 8f606b7dbe..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_braces.txt
+++ /dev/null
@@ -1 +0,0 @@
-}{ \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
deleted file mode 100644
index 94ea4d5c96..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets.txt
+++ /dev/null
@@ -1 +0,0 @@
-][ \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt b/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
deleted file mode 100644
index ebf6229429..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/group/unmatched_brackets_with_group.txt
+++ /dev/null
@@ -1 +0,0 @@
-{][} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/hello_world.txt b/support/texlab/crates/parser/src/test_data/latex/hello_world.txt
deleted file mode 100644
index c57eff55eb..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/hello_world.txt
+++ /dev/null
@@ -1 +0,0 @@
-Hello World! \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
deleted file mode 100644
index 216e7ea165..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\addbibresource[foo=bar, baz]{foo/bar.bib} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
deleted file mode 100644
index fe10ce257d..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/biblatex_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\addbibresource{foo/bar.bib} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
deleted file mode 100644
index 955353f690..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/bibtex_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\bibliography{foo/bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
deleted file mode 100644
index 144b418175..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/class_include_empty.txt
+++ /dev/null
@@ -1 +0,0 @@
-\documentclass{} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
deleted file mode 100644
index 32dc4279d7..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/class_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\documentclass[foo = bar, baz, qux]{article} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
deleted file mode 100644
index 15f3d6ea0a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/class_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\documentclass{article} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
deleted file mode 100644
index 14a4a96216..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_command.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includegraphics[width=0.5\textwidth]{\foo.\bar.pdf} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
deleted file mode 100644
index d6b6910c14..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_complicated_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includegraphics[width=0.5\textwidth]{} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
deleted file mode 100644
index 8d3c45f2a5..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includegraphics[scale=.5]{foo/bar.pdf} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
deleted file mode 100644
index 629cf3e8a9..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/graphics_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includegraphics{foo/bar.pdf} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
deleted file mode 100644
index 3d6bc5f043..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/import_incomplete.txt
+++ /dev/null
@@ -1 +0,0 @@
-\import{foo \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
deleted file mode 100644
index f38059d6c1..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/import_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\import{foo}{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
deleted file mode 100644
index e6dd431c7c..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includesvg[scale=.5]{foo/bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
deleted file mode 100644
index 4e3a4ea9ba..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/inkscape_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includesvg{foo/bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
deleted file mode 100644
index 5a763b4e29..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/latex_include_equality_sign.txt
+++ /dev/null
@@ -1 +0,0 @@
-\include{foo=bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
deleted file mode 100644
index c0d3d390df..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/latex_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\include{foo/bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt b/support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
deleted file mode 100644
index 6585f50d52..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/latex_input_path_brackets.txt
+++ /dev/null
@@ -1 +0,0 @@
-\input{foo[bar].tex} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
deleted file mode 100644
index 09e02cc1cc..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/package_include_empty.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usepackage{} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
deleted file mode 100644
index c1080aaf66..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/package_include_multiple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usepackage{amsmath, lipsum} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
deleted file mode 100644
index 83a50c12cf..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/package_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usepackage[foo = bar, baz, qux]{amsmath} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
deleted file mode 100644
index 3cf1b4edc0..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/package_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usepackage{amsmath} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
deleted file mode 100644
index 25a2b24720..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/pgf_library_import_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usepgflibrary{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
deleted file mode 100644
index 3eb90568ab..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/svg_include_options.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includesvg[scale=.5]{foo/bar.svg} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
deleted file mode 100644
index 964a3adcd6..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/svg_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includesvg{foo/bar.svg} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
deleted file mode 100644
index ff616ebd11..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/tikz_library_import_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\usetikzlibrary{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt b/support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
deleted file mode 100644
index a0b3fec843..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/include/verbatim_include_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\verbatiminput{foo/bar.txt} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/inline.txt b/support/texlab/crates/parser/src/test_data/latex/inline.txt
deleted file mode 100644
index 81a429dc26..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/inline.txt
+++ /dev/null
@@ -1 +0,0 @@
-$x \in [0, \infty)$ \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt b/support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
deleted file mode 100644
index c3a7fee9f6..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/inline_double_dollar.txt
+++ /dev/null
@@ -1 +0,0 @@
-$$x \in [0, \infty)$$ \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_568.txt b/support/texlab/crates/parser/src/test_data/latex/issue_568.txt
deleted file mode 100644
index a01a16854d..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_568.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-\input{|ipython scripts/test.ipynb}
-\label{fig:x=2} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_745.txt b/support/texlab/crates/parser/src/test_data/latex/issue_745.txt
deleted file mode 100644
index 4cbebeb2d8..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_745.txt
+++ /dev/null
@@ -1,21 +0,0 @@
-\documentclass{article}
-\usepackage{tabularray}
-
-\ExplSyntaxOn
-\NewDocumentEnvironment{exptblr}{O{}m}
- {
- \use:x
- {
- \exp_not:N \begin{tblr}
- [\exp_not:n{#1}]
- {#2}
- }
- }
- {
- \end{tblr}
- }
-\ExplSyntaxOff
-
-\begin{document}
-
-\end{document} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_789.txt b/support/texlab/crates/parser/src/test_data/latex/issue_789.txt
deleted file mode 100644
index 612c6de786..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_789.txt
+++ /dev/null
@@ -1 +0,0 @@
-\graphicspath{test} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_828.txt b/support/texlab/crates/parser/src/test_data/latex/issue_828.txt
deleted file mode 100644
index 76f973bdbd..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_828.txt
+++ /dev/null
@@ -1 +0,0 @@
-\verb|<STATEMENT> if(<expr>){<body>else{<body>| \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_853.txt b/support/texlab/crates/parser/src/test_data/latex/issue_853.txt
deleted file mode 100644
index 312889717c..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_853.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-\documentclass{minimal}
-\begin{document}
-This is an asdf undefined command
-\iffalse
- \iffalse\fi
- \end{enumerate}
-\fi
-\end{document} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_857.txt b/support/texlab/crates/parser/src/test_data/latex/issue_857.txt
deleted file mode 100644
index 0640263c84..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_857.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-\newcommand\ö{}
-\newcommand{\öö}{}
-\newcommand\123{} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_874.txt b/support/texlab/crates/parser/src/test_data/latex/issue_874.txt
deleted file mode 100644
index adb3e438a2..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_874.txt
+++ /dev/null
@@ -1 +0,0 @@
-\includegraphics[scale=0.2]{7.4).jpg} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_919.txt b/support/texlab/crates/parser/src/test_data/latex/issue_919.txt
deleted file mode 100644
index 40e1b16a03..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_919.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-\documentclass{article}
-
-\usepackage{
- lipsum, % provides blindtext
- booktabs, % better rules for tables
- %xcolor % easily define colors with \definecolor{}{}{}
-}
-
-\begin{document}
- \lipsum
-\end{document}
diff --git a/support/texlab/crates/parser/src/test_data/latex/issue_931.txt b/support/texlab/crates/parser/src/test_data/latex/issue_931.txt
deleted file mode 100644
index 8d75cecfae..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/issue_931.txt
+++ /dev/null
@@ -1 +0,0 @@
-\bibliography{$HOME/Literature} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
deleted file mode 100644
index d567c6d25a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_definition_line_break.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-\label{hello
-world} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
deleted file mode 100644
index 43ebaf1cec..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_definition_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\label{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_number.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
deleted file mode 100644
index 6e994af500..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_number.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newlabel{foo}{{1.1}} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
deleted file mode 100644
index ab386645df..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_equation.txt
+++ /dev/null
@@ -1 +0,0 @@
-\eqref{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
deleted file mode 100644
index 1d0f79ec8e..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_incomplete.txt
+++ /dev/null
@@ -1 +0,0 @@
-Equation \eqref{eq is a \emph{useful} identity. \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
deleted file mode 100644
index e8bb38ee9e..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_multiple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\ref{foo, bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
deleted file mode 100644
index 9213da0460..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_error.txt
+++ /dev/null
@@ -1 +0,0 @@
-\crefrange{foo{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
deleted file mode 100644
index 841133d73a..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_incomplete.txt
+++ /dev/null
@@ -1 +0,0 @@
-\crefrange{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
deleted file mode 100644
index a0e985ea88..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_range_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\crefrange{foo}{bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt b/support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
deleted file mode 100644
index dde4f444f4..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/label/label_reference_simple.txt
+++ /dev/null
@@ -1 +0,0 @@
-\ref{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/parameter.txt b/support/texlab/crates/parser/src/test_data/latex/parameter.txt
deleted file mode 100644
index d44ac7b947..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/parameter.txt
+++ /dev/null
@@ -1 +0,0 @@
-#1 \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/parameter_error.txt b/support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
deleted file mode 100644
index 4287ca8617..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/parameter_error.txt
+++ /dev/null
@@ -1 +0,0 @@
-# \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/structure/paragraphs.txt b/support/texlab/crates/parser/src/test_data/latex/structure/paragraphs.txt
deleted file mode 100644
index a7e32353bb..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/structure/paragraphs.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-\section{Section 1}
-Section 1
-
-\paragraph{Paragraph 1}
-Paragraph 1
-
-\paragraph{Paragraph 2}
-Paragraph 2
-
-\section{Section 2}
-Section 2 \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
deleted file mode 100644
index 3288ec259b..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/structure/structure_enum_item.txt
+++ /dev/null
@@ -1 +0,0 @@
-\begin{enumerate} \item 1 \item[2] 2 \item 3 \end{enumerate} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
deleted file mode 100644
index 7203dd2d24..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/structure/structure_invalid_nesting.txt
+++ /dev/null
@@ -1 +0,0 @@
-\section{Foo} \chapter{Bar} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
deleted file mode 100644
index 082f10765b..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/structure/structure_nested.txt
+++ /dev/null
@@ -1 +0,0 @@
-\part{1}\chapter{2}\section{3}\subsection{4}\subsubsection{5}\paragraph{6}\subparagraph{7} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt b/support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
deleted file mode 100644
index d8e347c429..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/structure/structure_siblings.txt
+++ /dev/null
@@ -1 +0,0 @@
-\section{Foo} Foo \section{Bar} Bar \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
deleted file mode 100644
index 286d111ad1..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_full.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newtheorem{foo}[bar]{Foo}[baz] \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
deleted file mode 100644
index af1b6903a5..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_counter.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newtheorem{foo}[bar] \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
deleted file mode 100644
index e5d6551666..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newtheorem{foo}{Foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
deleted file mode 100644
index 89c37d9497..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_name_with_description_and_counter.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newtheorem{foo}[bar]{Foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
deleted file mode 100644
index 62adb2c4b9..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_only_name.txt
+++ /dev/null
@@ -1 +0,0 @@
-\newtheorem{foo} \ No newline at end of file
diff --git a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_thmtools.txt b/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_thmtools.txt
deleted file mode 100644
index 2662a5ca8c..0000000000
--- a/support/texlab/crates/parser/src/test_data/latex/theorem_definition/theorem_definition_thmtools.txt
+++ /dev/null
@@ -1 +0,0 @@
-\declaretheorem[style=foo, name=bar]{baz} \ No newline at end of file
diff --git a/support/texlab/crates/references/Cargo.toml b/support/texlab/crates/references/Cargo.toml
index 7aa810487d..49827f8d12 100644
--- a/support/texlab/crates/references/Cargo.toml
+++ b/support/texlab/crates/references/Cargo.toml
@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-rowan = "0.15.11"
+rowan = "0.15.13"
syntax = { path = "../syntax" }
[dev-dependencies]
diff --git a/support/texlab/crates/references/src/entry.rs b/support/texlab/crates/references/src/entry.rs
index 617ff86304..c3926058e6 100644
--- a/support/texlab/crates/references/src/entry.rs
+++ b/support/texlab/crates/references/src/entry.rs
@@ -1,7 +1,7 @@
use base_db::{
semantics::{bib, tex},
util::queries::{self, Object},
- DocumentData,
+ DocumentData, DocumentLocation,
};
use crate::{Reference, ReferenceContext, ReferenceKind};
@@ -9,7 +9,7 @@ use crate::{Reference, ReferenceContext, ReferenceKind};
pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
let offset = context.params.offset;
- let name = match &context.params.document.data {
+ let name = match &context.params.feature.document.data {
DocumentData::Tex(data) => {
let result = queries::object_at_cursor(
&data.semantics.citations,
@@ -29,18 +29,17 @@ pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
_ => return None,
};
- for (document, obj) in queries::objects_with_name::<tex::Citation>(&context.project, name) {
+ let project = &context.params.feature.project;
+ for (document, obj) in queries::objects_with_name::<tex::Citation>(&project, name) {
context.results.push(Reference {
- document,
- range: obj.name.range,
+ location: DocumentLocation::new(document, obj.name.range),
kind: ReferenceKind::Reference,
});
}
- for (document, obj) in queries::objects_with_name::<bib::Entry>(&context.project, name) {
+ for (document, obj) in queries::objects_with_name::<bib::Entry>(&project, name) {
context.results.push(Reference {
- document,
- range: obj.name.range,
+ location: DocumentLocation::new(document, obj.name.range),
kind: ReferenceKind::Definition,
});
}
diff --git a/support/texlab/crates/references/src/label.rs b/support/texlab/crates/references/src/label.rs
index 5ed8096c5c..872ef2dd14 100644
--- a/support/texlab/crates/references/src/label.rs
+++ b/support/texlab/crates/references/src/label.rs
@@ -1,26 +1,27 @@
use base_db::{
semantics::tex,
util::queries::{self, Object},
+ DocumentLocation,
};
use crate::{Reference, ReferenceContext, ReferenceKind};
pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
- let data = context.params.document.data.as_tex()?;
+ let data = context.params.feature.document.data.as_tex()?;
let mode = queries::SearchMode::Full;
let name = queries::object_at_cursor(&data.semantics.labels, context.params.offset, mode)?
.object
.name_text();
- for (document, label) in queries::objects_with_name::<tex::Label>(&context.project, name) {
+ let project = &context.params.feature.project;
+ for (document, label) in queries::objects_with_name::<tex::Label>(&project, name) {
let kind = match label.kind {
tex::LabelKind::Definition => ReferenceKind::Definition,
tex::LabelKind::Reference | tex::LabelKind::ReferenceRange => ReferenceKind::Reference,
};
context.results.push(Reference {
- document,
- range: label.name.range,
+ location: DocumentLocation::new(document, label.name.range),
kind,
});
}
diff --git a/support/texlab/crates/references/src/lib.rs b/support/texlab/crates/references/src/lib.rs
index 76cd8ce53c..c223ad8eba 100644
--- a/support/texlab/crates/references/src/lib.rs
+++ b/support/texlab/crates/references/src/lib.rs
@@ -2,13 +2,12 @@ mod entry;
mod label;
mod string_def;
-use base_db::{Document, Project, Workspace};
-use rowan::{TextRange, TextSize};
+use base_db::{DocumentLocation, FeatureParams};
+use rowan::TextSize;
#[derive(Debug)]
-pub struct Reference<'db> {
- pub document: &'db Document,
- pub range: TextRange,
+pub struct Reference<'a> {
+ pub location: DocumentLocation<'a>,
pub kind: ReferenceKind,
}
@@ -19,24 +18,20 @@ pub enum ReferenceKind {
}
#[derive(Debug)]
-pub struct ReferenceParams<'db> {
- pub workspace: &'db Workspace,
- pub document: &'db Document,
+pub struct ReferenceParams<'a> {
+ pub feature: FeatureParams<'a>,
pub offset: TextSize,
}
#[derive(Debug)]
-struct ReferenceContext<'db> {
- params: ReferenceParams<'db>,
- project: Project<'db>,
- results: Vec<Reference<'db>>,
+struct ReferenceContext<'a> {
+ params: ReferenceParams<'a>,
+ results: Vec<Reference<'a>>,
}
pub fn find_all(params: ReferenceParams) -> Vec<Reference<'_>> {
- let project = params.workspace.project(params.document);
let mut context = ReferenceContext {
params,
- project,
results: Vec::new(),
};
diff --git a/support/texlab/crates/references/src/string_def.rs b/support/texlab/crates/references/src/string_def.rs
index 9657686079..18b28d49e2 100644
--- a/support/texlab/crates/references/src/string_def.rs
+++ b/support/texlab/crates/references/src/string_def.rs
@@ -1,10 +1,11 @@
+use base_db::DocumentLocation;
use rowan::ast::AstNode;
use syntax::bibtex;
use crate::{Reference, ReferenceContext, ReferenceKind};
pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
- let document = context.params.document;
+ let document = context.params.feature.document;
let data = document.data.as_bib()?;
let root = data.root_node();
let name = root
@@ -18,8 +19,7 @@ pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
for string in &data.semantics.strings {
if string.name.text == name.text() {
context.results.push(Reference {
- document,
- range: string.name.range,
+ location: DocumentLocation::new(document, string.name.range),
kind: ReferenceKind::Definition,
});
}
@@ -32,8 +32,7 @@ pub(super) fn find_all(context: &mut ReferenceContext) -> Option<()> {
.filter(|token| token.text() == name.text())
{
context.results.push(Reference {
- document,
- range: token.text_range(),
+ location: DocumentLocation::new(document, token.text_range()),
kind: ReferenceKind::Reference,
});
}
diff --git a/support/texlab/crates/references/src/tests.rs b/support/texlab/crates/references/src/tests.rs
index 03a83c5f14..3a3e7008a0 100644
--- a/support/texlab/crates/references/src/tests.rs
+++ b/support/texlab/crates/references/src/tests.rs
@@ -4,30 +4,13 @@ use crate::{ReferenceKind, ReferenceParams};
fn check(fixture: &str, include_def: bool) {
let fixture = test_utils::fixture::Fixture::parse(fixture);
- let workspace = &fixture.workspace;
+ let (feature, offset) = fixture.make_params().unwrap();
- let expected = fixture
- .documents
- .iter()
- .flat_map(|document| document.ranges.iter().map(|&range| (&document.uri, range)))
- .collect::<HashSet<_>>();
-
- let (document, offset) = fixture
- .documents
- .iter()
- .find_map(|document| Some((workspace.lookup(&document.uri)?, document.cursor?)))
- .unwrap();
-
- let params = ReferenceParams {
- workspace,
- document,
- offset,
- };
-
- let actual = crate::find_all(params)
+ let expected = fixture.locations().collect::<HashSet<_>>();
+ let actual = crate::find_all(ReferenceParams { feature, offset })
.into_iter()
.filter(|reference| reference.kind == ReferenceKind::Reference || include_def)
- .map(|reference| (&reference.document.uri, reference.range))
+ .map(|reference| reference.location)
.collect::<HashSet<_>>();
assert_eq!(actual, expected);
diff --git a/support/texlab/crates/rename/Cargo.toml b/support/texlab/crates/rename/Cargo.toml
index 90cf4f4197..127b3316d7 100644
--- a/support/texlab/crates/rename/Cargo.toml
+++ b/support/texlab/crates/rename/Cargo.toml
@@ -8,7 +8,7 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
syntax = { path = "../syntax" }
diff --git a/support/texlab/crates/rename/src/command.rs b/support/texlab/crates/rename/src/command.rs
index eacf411710..edcf7db61e 100644
--- a/support/texlab/crates/rename/src/command.rs
+++ b/support/texlab/crates/rename/src/command.rs
@@ -5,7 +5,7 @@ use syntax::latex;
use crate::{RenameBuilder, RenameParams};
pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
- let data = params.inner.document.data.as_tex()?;
+ let data = params.feature.document.data.as_tex()?;
let token = data
.root_node()
.token_at_offset(params.offset)
@@ -22,7 +22,7 @@ pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
pub(super) fn rename<'a>(builder: &mut RenameBuilder) -> Option<()> {
let name = prepare_rename(&builder.params)?;
- for document in &builder.params.inner.project.documents {
+ for document in &builder.params.feature.project.documents {
let DocumentData::Tex(data) = &document.data else {
continue;
};
diff --git a/support/texlab/crates/rename/src/entry.rs b/support/texlab/crates/rename/src/entry.rs
index 11800f1371..c0b508a506 100644
--- a/support/texlab/crates/rename/src/entry.rs
+++ b/support/texlab/crates/rename/src/entry.rs
@@ -7,7 +7,7 @@ use base_db::{
use crate::{RenameBuilder, RenameParams};
pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
- match &params.inner.document.data {
+ match &params.feature.document.data {
DocumentData::Tex(data) => {
let result = queries::object_at_cursor(
&data.semantics.citations,
@@ -33,7 +33,7 @@ pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
pub(super) fn rename<'a>(builder: &mut RenameBuilder) -> Option<()> {
let name = prepare_rename(&builder.params)?;
- let project = &builder.params.inner.project;
+ let project = &builder.params.feature.project;
let citations = queries::objects_with_name::<tex::Citation>(project, &name.text)
.map(|(doc, obj)| (doc, obj.name.range));
diff --git a/support/texlab/crates/rename/src/label.rs b/support/texlab/crates/rename/src/label.rs
index 983cc4f912..b21e1b795e 100644
--- a/support/texlab/crates/rename/src/label.rs
+++ b/support/texlab/crates/rename/src/label.rs
@@ -6,7 +6,7 @@ use base_db::{
use crate::{RenameBuilder, RenameParams};
pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
- let data = params.inner.document.data.as_tex()?;
+ let data = params.feature.document.data.as_tex()?;
let labels = &data.semantics.labels;
let label = queries::object_at_cursor(labels, params.offset, queries::SearchMode::Name)?;
Some(Span::new(label.object.name.text.clone(), label.range))
@@ -15,7 +15,7 @@ pub(super) fn prepare_rename(params: &RenameParams) -> Option<Span> {
pub(super) fn rename(builder: &mut RenameBuilder) -> Option<()> {
let name = prepare_rename(&builder.params)?;
- let project = &builder.params.inner.project;
+ let project = &builder.params.feature.project;
for (document, label) in queries::objects_with_name::<tex::Label>(project, &name.text) {
let entry = builder.result.changes.entry(document);
entry.or_default().push(label.name_range());
diff --git a/support/texlab/crates/rename/src/lib.rs b/support/texlab/crates/rename/src/lib.rs
index d9b28c3586..b7dd197ce0 100644
--- a/support/texlab/crates/rename/src/lib.rs
+++ b/support/texlab/crates/rename/src/lib.rs
@@ -7,19 +7,19 @@ use rowan::{TextRange, TextSize};
use rustc_hash::FxHashMap;
#[derive(Debug)]
-pub struct RenameParams<'db> {
- pub inner: FeatureParams<'db>,
+pub struct RenameParams<'a> {
+ pub feature: FeatureParams<'a>,
pub offset: TextSize,
}
#[derive(Debug, Default)]
-pub struct RenameResult<'db> {
- pub changes: FxHashMap<&'db Document, Vec<TextRange>>,
+pub struct RenameResult<'a> {
+ pub changes: FxHashMap<&'a Document, Vec<TextRange>>,
}
-struct RenameBuilder<'db> {
- params: &'db RenameParams<'db>,
- result: RenameResult<'db>,
+struct RenameBuilder<'a> {
+ params: RenameParams<'a>,
+ result: RenameResult<'a>,
}
pub fn prepare_rename(params: &RenameParams) -> Option<TextRange> {
@@ -29,7 +29,7 @@ pub fn prepare_rename(params: &RenameParams) -> Option<TextRange> {
.map(|span| span.range)
}
-pub fn rename<'db>(params: &'db RenameParams<'db>) -> RenameResult<'db> {
+pub fn rename<'a>(params: RenameParams<'a>) -> RenameResult<'a> {
let result = RenameResult::default();
let mut builder = RenameBuilder { params, result };
diff --git a/support/texlab/crates/rename/src/tests.rs b/support/texlab/crates/rename/src/tests.rs
index d931e92798..0f4263033e 100644
--- a/support/texlab/crates/rename/src/tests.rs
+++ b/support/texlab/crates/rename/src/tests.rs
@@ -1,4 +1,3 @@
-use base_db::FeatureParams;
use rustc_hash::FxHashMap;
use crate::RenameParams;
@@ -14,20 +13,13 @@ fn check(input: &str) {
}
}
- let (document, offset) = fixture
- .documents
- .iter()
- .find_map(|spec| Some((fixture.workspace.lookup(&spec.uri)?, spec.cursor?)))
- .unwrap();
-
- let inner = FeatureParams::new(&fixture.workspace, document);
- let params = RenameParams { inner, offset };
- let actual = crate::rename(&params);
+ let (feature, offset) = fixture.make_params().unwrap();
+ let actual = crate::rename(RenameParams { feature, offset });
assert_eq!(actual.changes, expected);
}
#[test]
-fn command() {
+fn test_command() {
check(
r#"
%! foo.tex
@@ -44,7 +36,7 @@ fn command() {
}
#[test]
-fn entry() {
+fn test_entry() {
check(
r#"
%! main.bib
@@ -61,7 +53,7 @@ fn entry() {
}
#[test]
-fn citation() {
+fn test_citation() {
check(
r#"
%! main.bib
@@ -78,7 +70,7 @@ fn citation() {
}
#[test]
-fn label() {
+fn test_label() {
check(
r#"
%! foo.tex
diff --git a/support/texlab/crates/symbols/Cargo.toml b/support/texlab/crates/symbols/Cargo.toml
index 19a9c44964..5386efdcf9 100644
--- a/support/texlab/crates/symbols/Cargo.toml
+++ b/support/texlab/crates/symbols/Cargo.toml
@@ -12,13 +12,14 @@ doctest = false
[dependencies]
base-db = { path = "../base-db" }
distro = { path = "../distro" }
-itertools = "0.11.0"
-rowan = "0.15.11"
+itertools = "0.12.0"
+line-index = { path = "../line-index" }
+rowan = "0.15.13"
syntax = { path = "../syntax" }
titlecase = "2.2.1"
-url = "=2.3.1"
+url = "2.5.0"
[dev-dependencies]
-regex = "1.9.1"
+regex = "1.10.2"
test-utils = { path = "../test-utils" }
expect-test = "1.4.1"
diff --git a/support/texlab/crates/symbols/src/document.rs b/support/texlab/crates/symbols/src/document.rs
index b34974e019..e8f1087051 100644
--- a/support/texlab/crates/symbols/src/document.rs
+++ b/support/texlab/crates/symbols/src/document.rs
@@ -22,6 +22,7 @@ pub fn document_symbols(workspace: &Workspace, document: &Document) -> Vec<Symbo
DocumentData::Aux(_)
| DocumentData::Log(_)
| DocumentData::Root
+ | DocumentData::Latexmkrc(_)
| DocumentData::Tectonic => Vec::new(),
};
diff --git a/support/texlab/crates/symbols/src/workspace/sort.rs b/support/texlab/crates/symbols/src/workspace/sort.rs
index 0e24c25ac9..75d80a02eb 100644
--- a/support/texlab/crates/symbols/src/workspace/sort.rs
+++ b/support/texlab/crates/symbols/src/workspace/sort.rs
@@ -38,8 +38,9 @@ impl<'a> From<&'a Workspace> for ProjectOrdering<'a> {
#[cfg(test)]
mod tests {
- use base_db::{util::LineCol, Owner};
+ use base_db::Owner;
use distro::Language;
+ use line_index::LineCol;
use super::{ProjectOrdering, Url, Workspace};
diff --git a/support/texlab/crates/symbols/src/workspace/tests.rs b/support/texlab/crates/symbols/src/workspace/tests.rs
index 26bdefa6b6..3fecd58a57 100644
--- a/support/texlab/crates/symbols/src/workspace/tests.rs
+++ b/support/texlab/crates/symbols/src/workspace/tests.rs
@@ -75,7 +75,7 @@ fn check(query: &str, expect: Expect) {
}
#[test]
-fn filter_type_section() {
+fn test_filter_type_section() {
check(
"section",
expect![[r#"
@@ -158,7 +158,7 @@ fn filter_type_section() {
}
#[test]
-fn filter_type_figure() {
+fn test_filter_type_figure() {
check(
"figure",
expect![[r#"
@@ -187,7 +187,7 @@ fn filter_type_figure() {
}
#[test]
-fn filter_type_item() {
+fn test_filter_type_item() {
check(
"item",
expect![[r#"
@@ -252,7 +252,7 @@ fn filter_type_item() {
}
#[test]
-fn filter_type_math() {
+fn test_filter_type_math() {
check(
"math",
expect![[r#"
@@ -299,7 +299,7 @@ fn filter_type_math() {
}
#[test]
-fn filter_bibtex() {
+fn test_filter_bibtex() {
check(
"bibtex",
expect![[r#"
diff --git a/support/texlab/crates/syntax/Cargo.toml b/support/texlab/crates/syntax/Cargo.toml
index 8477e01e0d..5e6c69409a 100644
--- a/support/texlab/crates/syntax/Cargo.toml
+++ b/support/texlab/crates/syntax/Cargo.toml
@@ -7,8 +7,8 @@ edition.workspace = true
rust-version.workspace = true
[dependencies]
-itertools = "0.11.0"
-rowan = "0.15.11"
+itertools = "0.12.0"
+rowan = "0.15.13"
[lib]
doctest = false
diff --git a/support/texlab/crates/syntax/src/latexmkrc.rs b/support/texlab/crates/syntax/src/latexmkrc.rs
new file mode 100644
index 0000000000..41cc5b9bbf
--- /dev/null
+++ b/support/texlab/crates/syntax/src/latexmkrc.rs
@@ -0,0 +1,5 @@
+#[derive(Debug, Clone, Default)]
+pub struct LatexmkrcData {
+ pub aux_dir: Option<String>,
+ pub out_dir: Option<String>,
+}
diff --git a/support/texlab/crates/syntax/src/lib.rs b/support/texlab/crates/syntax/src/lib.rs
index dc8761b73d..35f1bb8c52 100644
--- a/support/texlab/crates/syntax/src/lib.rs
+++ b/support/texlab/crates/syntax/src/lib.rs
@@ -1,5 +1,6 @@
pub mod bibtex;
pub mod latex;
+pub mod latexmkrc;
#[derive(Debug, PartialEq, Eq, Clone, Copy, PartialOrd, Ord, Hash)]
pub enum BuildErrorLevel {
diff --git a/support/texlab/crates/test-utils/Cargo.toml b/support/texlab/crates/test-utils/Cargo.toml
index 6426dad920..16a0099b04 100644
--- a/support/texlab/crates/test-utils/Cargo.toml
+++ b/support/texlab/crates/test-utils/Cargo.toml
@@ -9,8 +9,9 @@ rust-version.workspace = true
[dependencies]
base-db = { path = "../base-db" }
distro = { path = "../distro" }
-rowan = "0.15.11"
-url = "=2.3.1"
+line-index = { path = "../line-index" }
+rowan = "0.15.13"
+url = "2.5.0"
[lib]
doctest = false
diff --git a/support/texlab/crates/test-utils/src/fixture.rs b/support/texlab/crates/test-utils/src/fixture.rs
index 55ab162d28..9a768035c8 100644
--- a/support/texlab/crates/test-utils/src/fixture.rs
+++ b/support/texlab/crates/test-utils/src/fixture.rs
@@ -1,9 +1,7 @@
use std::path::PathBuf;
-use base_db::{
- util::{LineCol, LineIndex},
- Owner, Workspace,
-};
+use base_db::{DocumentLocation, FeatureParams, Owner, Workspace};
+use line_index::{LineCol, LineIndex};
use rowan::{TextRange, TextSize};
use url::Url;
@@ -47,6 +45,28 @@ impl Fixture {
documents,
}
}
+
+ pub fn make_params(&self) -> Option<(FeatureParams, TextSize)> {
+ let spec = self
+ .documents
+ .iter()
+ .find(|spec| spec.cursor.is_some())
+ .or_else(|| self.documents.first())?;
+
+ let document = self.workspace.lookup(&spec.uri)?;
+ let params = FeatureParams::new(&self.workspace, document);
+ let cursor = spec.cursor.unwrap_or_default();
+ Some((params, cursor))
+ }
+
+ pub fn locations(&self) -> impl Iterator<Item = DocumentLocation> {
+ self.documents.iter().flat_map(|spec| {
+ let document = self.workspace.lookup(&spec.uri).unwrap();
+ spec.ranges
+ .iter()
+ .map(|range| DocumentLocation::new(document, *range))
+ })
+ }
}
#[derive(Debug)]
@@ -99,10 +119,10 @@ impl DocumentSpec {
let line_index = LineIndex::new(&text);
- let cursor = cursor.map(|cursor| cursor.to_offset(&text, &line_index));
+ let cursor = cursor.and_then(|cursor| cursor.to_offset(&text, &line_index));
let ranges = ranges
.into_iter()
- .map(|range| range.to_offset(&text, &line_index))
+ .filter_map(|range| range.to_offset(&text, &line_index))
.collect();
Self {
@@ -125,11 +145,11 @@ impl CharacterPosition {
Self { line, col }
}
- fn to_offset(self, text: &str, line_index: &LineIndex) -> TextSize {
+ fn to_offset(self, text: &str, line_index: &LineIndex) -> Option<TextSize> {
let start = line_index.offset(LineCol {
line: (self.line - 1) as u32,
col: 0,
- });
+ })?;
let slice = &text[start.into()..];
let len = slice
@@ -137,7 +157,7 @@ impl CharacterPosition {
.nth(self.col)
.map_or_else(|| slice.len(), |(i, _)| i);
- start + TextSize::try_from(len).unwrap()
+ Some(start + TextSize::try_from(len).ok()?)
}
}
@@ -152,9 +172,9 @@ impl CharacterRange {
Self { start, end }
}
- fn to_offset(self, text: &str, line_index: &LineIndex) -> TextRange {
- let start = self.start.to_offset(text, line_index);
- let end = self.end.to_offset(text, line_index);
- TextRange::new(start, end)
+ fn to_offset(self, text: &str, line_index: &LineIndex) -> Option<TextRange> {
+ let start = self.start.to_offset(text, line_index)?;
+ let end = self.end.to_offset(text, line_index)?;
+ Some(TextRange::new(start, end))
}
}
diff --git a/support/texlab/crates/texlab/Cargo.toml b/support/texlab/crates/texlab/Cargo.toml
index 9b120d7884..099e0cc8c7 100644
--- a/support/texlab/crates/texlab/Cargo.toml
+++ b/support/texlab/crates/texlab/Cargo.toml
@@ -1,7 +1,7 @@
[package]
name = "texlab"
description = "LaTeX Language Server"
-version = "5.11.0"
+version = "5.12.0"
license.workspace = true
readme = "README.md"
authors.workspace = true
@@ -12,7 +12,7 @@ repository = "https://github.com/latex-lsp/texlab"
documentation = "https://github.com/latex-lsp/texlab"
keywords = ["lsp", "server", "latex", "bibtex"]
categories = ["development-tools"]
-exclude = ["tests/it/**", "*.snap"]
+exclude = ["*.snap"]
[[bin]]
name = "texlab"
@@ -24,8 +24,9 @@ doctest = false
[dependencies]
anyhow = "1.0.75"
base-db = { path = "../base-db" }
+bibfmt = { path = "../bibfmt" }
citeproc = { path = "../citeproc" }
-clap = { version = "4.4.4", features = ["derive"] }
+clap = { version = "4.4.10", features = ["derive"] }
commands = { path = "../commands" }
completion = { path = "../completion" }
completion-data = { path = "../completion-data" }
@@ -37,10 +38,11 @@ encoding_rs = "0.8.33"
encoding_rs_io = "0.1.7"
fern = "0.6.2"
folding = { path = "../folding" }
-fuzzy-matcher = { version = "0.3.7", features = ["compact"] }
+highlights = { path = "../highlights" }
hover = { path = "../hover" }
inlay-hints = { path = "../inlay-hints" }
-itertools = "0.11.0"
+line-index = { path = "../line-index" }
+links = { path = "../links" }
log = "0.4.19"
lsp-server = "0.7.4"
lsp-types = "0.94.1"
@@ -49,25 +51,22 @@ notify-debouncer-full = "0.3.1"
once_cell = "1.18.0"
parking_lot = "0.12.1"
parser = { path = "../parser" }
-rayon = "1.8.0"
references = { path = "../references" }
-regex = "1.9.5"
+regex = "1.10.2"
rename = { path = "../rename" }
-rowan = "0.15.11"
+rowan = "0.15.13"
rustc-hash = "1.1.0"
-serde = "1.0.188"
-serde_json = "1.0.107"
+serde = "1.0.193"
+serde_json = "1.0.108"
serde_regex = "1.1.0"
-serde_repr = "0.1.16"
+serde_repr = "0.1.17"
symbols = { path = "../symbols" }
syntax = { path = "../syntax" }
tempfile = "3.8.0"
threadpool = "1.8.1"
[dev-dependencies]
-assert_unordered = "0.3.5"
criterion = { version = "0.5.1" }
-insta = { version = "1.32.0", features = ["glob", "redactions", "json"] }
[[bench]]
name = "bench_main"
diff --git a/support/texlab/crates/texlab/benches/bench_main.rs b/support/texlab/crates/texlab/benches/bench_main.rs
index da98e63bfb..0f54a2c2d1 100644
--- a/support/texlab/crates/texlab/benches/bench_main.rs
+++ b/support/texlab/crates/texlab/benches/bench_main.rs
@@ -1,6 +1,7 @@
-use base_db::{util::LineCol, Owner, Workspace};
+use base_db::{Owner, Workspace};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use distro::Language;
+use line_index::LineCol;
use lsp_types::{ClientCapabilities, CompletionParams, Position, TextDocumentPositionParams, Url};
use parser::{parse_latex, SyntaxConfig};
@@ -12,7 +13,7 @@ fn criterion_benchmark(c: &mut Criterion) {
b.iter(|| parse_latex(black_box(CODE), &config));
});
- c.bench_function("LaTeX/Completion/Command_v2", |b| {
+ c.bench_function("LaTeX/Completion/Command", |b| {
let uri = Url::parse("http://example.com/texlab.tex").unwrap();
let text = CODE.to_string();
let mut workspace = Workspace::default();
diff --git a/support/texlab/crates/texlab/src/features/completion.rs b/support/texlab/crates/texlab/src/features/completion.rs
index e02b39c2c6..8e5fa2adbb 100644
--- a/support/texlab/crates/texlab/src/features/completion.rs
+++ b/support/texlab/crates/texlab/src/features/completion.rs
@@ -1,11 +1,9 @@
-use base_db::{
- util::{LineIndex, RenderedObject},
- Document, FeatureParams, Workspace,
-};
+use base_db::{util::RenderedObject, Document, FeatureParams, Workspace};
use completion::{
ArgumentData, CompletionItem, CompletionItemData, CompletionParams, EntryTypeData,
FieldTypeData,
};
+use line_index::LineIndex;
use lsp_types::{ClientCapabilities, ClientInfo, CompletionList};
use serde::{Deserialize, Serialize};
@@ -23,7 +21,7 @@ pub fn complete(
let feature = FeatureParams::new(workspace, document);
let offset = document
.line_index
- .offset_lsp(params.text_document_position.position);
+ .offset_lsp(params.text_document_position.position)?;
let params = CompletionParams { feature, offset };
let result = completion::complete(&params);
@@ -36,7 +34,7 @@ pub fn complete(
.items
.into_iter()
.enumerate()
- .map(|(i, item)| item_builder.convert(item, i))
+ .filter_map(|(i, item)| item_builder.convert(item, i))
.collect();
Some(list)
@@ -70,9 +68,9 @@ impl<'a> ItemBuilder<'a> {
}
}
- pub fn convert(&self, item: CompletionItem, index: usize) -> lsp_types::CompletionItem {
+ pub fn convert(&self, item: CompletionItem, index: usize) -> Option<lsp_types::CompletionItem> {
let mut result = lsp_types::CompletionItem::default();
- let range = self.line_index.line_col_lsp_range(item.range);
+ let range = self.line_index.line_col_lsp_range(item.range)?;
match item.data {
CompletionItemData::Command(data) => {
@@ -134,7 +132,7 @@ impl<'a> ItemBuilder<'a> {
result.sort_text = Some(format!("{:0>2}", index));
result.preselect = Some(item.preselect);
- result
+ Some(result)
}
fn convert_command(
@@ -171,7 +169,7 @@ impl<'a> ItemBuilder<'a> {
if self.supports_snippets {
result.kind = Some(Structure::Snippet.completion_kind());
result.text_edit =
- Some(lsp_types::TextEdit::new(range, "begin{$1}\n\t\n\\end{$1}".into()).into());
+ Some(lsp_types::TextEdit::new(range, "begin{$1}\n\t$0\n\\end{$1}".into()).into());
result.insert_text_format = Some(lsp_types::InsertTextFormat::SNIPPET);
} else {
diff --git a/support/texlab/crates/texlab/src/features/definition.rs b/support/texlab/crates/texlab/src/features/definition.rs
index d450831e1f..ec7f08c296 100644
--- a/support/texlab/crates/texlab/src/features/definition.rs
+++ b/support/texlab/crates/texlab/src/features/definition.rs
@@ -1,4 +1,4 @@
-use base_db::Workspace;
+use base_db::{FeatureParams, Workspace};
use definition::DefinitionParams;
use lsp_types::{GotoDefinitionResponse, LocationLink, Position, Url};
@@ -10,35 +10,40 @@ pub fn goto_definition(
position: Position,
) -> Option<GotoDefinitionResponse> {
let document = workspace.lookup(uri)?;
- let offset = document.line_index.offset_lsp(position);
- let params = DefinitionParams {
- workspace,
- document,
- offset,
- };
+ let offset = document.line_index.offset_lsp(position)?;
+ let feature = FeatureParams::new(workspace, document);
+ let params = DefinitionParams { feature, offset };
let mut links = Vec::new();
for result in definition::goto_definition(params) {
- let origin_selection_range = Some(
- document
- .line_index
- .line_col_lsp_range(result.origin_selection_range),
- );
-
- let target_line_index = &result.target.line_index;
- let target_uri = result.target.uri.clone();
- let target_range = target_line_index.line_col_lsp_range(result.target_range);
-
- let target_selection_range =
- target_line_index.line_col_lsp_range(result.target_selection_range);
-
- links.push(LocationLink {
- origin_selection_range,
- target_uri,
- target_range,
- target_selection_range,
- });
+ if let Some(link) = convert_link(document, result) {
+ links.push(link);
+ }
}
Some(GotoDefinitionResponse::Link(links))
}
+
+fn convert_link(
+ document: &base_db::Document,
+ result: definition::DefinitionResult<'_>,
+) -> Option<LocationLink> {
+ let origin_selection_range = Some(
+ document
+ .line_index
+ .line_col_lsp_range(result.origin_selection_range)?,
+ );
+
+ let target_line_index = &result.target.line_index;
+ let target_uri = result.target.uri.clone();
+ let target_range = target_line_index.line_col_lsp_range(result.target_range)?;
+ let target_selection_range =
+ target_line_index.line_col_lsp_range(result.target_selection_range)?;
+ let value = LocationLink {
+ origin_selection_range,
+ target_uri,
+ target_range,
+ target_selection_range,
+ };
+ Some(value)
+}
diff --git a/support/texlab/crates/texlab/src/features/folding.rs b/support/texlab/crates/texlab/src/features/folding.rs
index 6de4ef0d22..6bdfc3a309 100644
--- a/support/texlab/crates/texlab/src/features/folding.rs
+++ b/support/texlab/crates/texlab/src/features/folding.rs
@@ -18,27 +18,29 @@ pub fn find_all(
.is_some();
let document = workspace.lookup(uri)?;
- let foldings = folding::find_all(document).into_iter().map(|folding| {
- let range = document.line_index.line_col_lsp_range(folding.range);
+ let foldings = folding::find_all(document)
+ .into_iter()
+ .filter_map(|folding| {
+ let range = document.line_index.line_col_lsp_range(folding.range)?;
- let kind = if custom_kinds {
- Some(match folding.kind {
- FoldingRangeKind::Section => "section",
- FoldingRangeKind::Environment => "environment",
- FoldingRangeKind::Entry => "entry",
- })
- } else {
- None
- };
+ let kind = if custom_kinds {
+ Some(match folding.kind {
+ FoldingRangeKind::Section => "section",
+ FoldingRangeKind::Environment => "environment",
+ FoldingRangeKind::Entry => "entry",
+ })
+ } else {
+ None
+ };
- serde_json::json!({
- "startLine": range.start.line,
- "startCharacter": range.start.character,
- "endLine": range.end.line,
- "endCharacter": range.end.character,
- "kind": kind,
- })
- });
+ Some(serde_json::json!({
+ "startLine": range.start.line,
+ "startCharacter": range.start.character,
+ "endLine": range.end.line,
+ "endCharacter": range.end.character,
+ "kind": kind,
+ }))
+ });
Some(foldings.collect())
}
diff --git a/support/texlab/crates/texlab/src/features/formatting.rs b/support/texlab/crates/texlab/src/features/formatting.rs
index f16ee8e243..9073b04aa3 100644
--- a/support/texlab/crates/texlab/src/features/formatting.rs
+++ b/support/texlab/crates/texlab/src/features/formatting.rs
@@ -24,6 +24,10 @@ pub fn format_source_code(
Formatter::Server => format_bibtex_internal(workspace, document, options),
Formatter::LatexIndent => format_with_latexindent(workspace, document),
},
- Language::Aux | Language::Log | Language::Root | Language::Tectonic => None,
+ Language::Aux
+ | Language::Log
+ | Language::Root
+ | Language::Latexmkrc
+ | Language::Tectonic => None,
}
}
diff --git a/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs b/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
index 2b16939f43..0070765b4b 100644
--- a/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
+++ b/support/texlab/crates/texlab/src/features/formatting/bibtex_internal.rs
@@ -1,7 +1,6 @@
-use base_db::{util::LineIndex, Document, Workspace};
+use base_db::{Document, Workspace};
use lsp_types::{FormattingOptions, TextEdit};
-use rowan::{ast::AstNode, NodeOrToken};
-use syntax::bibtex::{self, HasName, HasType, HasValue};
+use rowan::{TextLen, TextRange};
use crate::util::line_index_ext::LineIndexExt;
@@ -10,189 +9,15 @@ pub fn format_bibtex_internal(
document: &Document,
options: &FormattingOptions,
) -> Option<Vec<TextEdit>> {
- let mut indent = String::new();
-
- if options.insert_spaces {
- for _ in 0..options.tab_size {
- indent.push(' ');
- }
- } else {
- indent.push('\t');
- }
-
- let line_length = workspace.config().formatting.line_length;
-
- let line_index = &document.line_index;
-
let data = document.data.as_bib()?;
- let mut edits = Vec::new();
-
- for node in data.root_node().children().filter(|node| {
- matches!(
- node.kind(),
- bibtex::PREAMBLE | bibtex::STRING | bibtex::ENTRY
- )
- }) {
- let range = node.text_range();
-
- let mut formatter =
- Formatter::new(indent.clone(), options.tab_size, line_length, line_index);
-
- formatter.visit_node(node);
- edits.push(TextEdit {
- range: line_index.line_col_lsp_range(range),
- new_text: formatter.output,
- });
- }
-
- Some(edits)
-}
-
-struct Formatter<'a> {
- indent: String,
- tab_size: u32,
- line_length: usize,
- output: String,
- align: Vec<usize>,
- line_index: &'a LineIndex,
-}
-
-impl<'a> Formatter<'a> {
- fn new(indent: String, tab_size: u32, line_length: usize, line_index: &'a LineIndex) -> Self {
- Self {
- indent,
- tab_size,
- line_length,
- output: String::new(),
- align: Vec::new(),
- line_index,
- }
- }
-
- fn visit_token_lowercase(&mut self, token: &bibtex::SyntaxToken) {
- self.output.push_str(&token.text().to_lowercase());
- }
-
- fn should_insert_space(
- &self,
- previous: &bibtex::SyntaxToken,
- current: &bibtex::SyntaxToken,
- ) -> bool {
- let previous_range = self.line_index.line_col_lsp_range(previous.text_range());
- let current_range = self.line_index.line_col_lsp_range(current.text_range());
- previous_range.start.line != current_range.start.line
- || previous_range.end.character < current_range.start.character
- }
-
- fn base_align(&self) -> usize {
- self.output[self.output.rfind('\n').unwrap_or(0)..]
- .chars()
- .count()
- }
-
- fn visit_node(&mut self, parent: bibtex::SyntaxNode) {
- match parent.kind() {
- bibtex::PREAMBLE => {
- let preamble = bibtex::Preamble::cast(parent).unwrap();
- self.visit_token_lowercase(&preamble.type_token().unwrap());
- self.output.push('{');
- if preamble.syntax().children().next().is_some() {
- self.align.push(self.base_align());
- for node in preamble.syntax().children() {
- self.visit_node(node);
- }
- self.output.push('}');
- }
- }
- bibtex::STRING => {
- let string = bibtex::StringDef::cast(parent).unwrap();
- self.visit_token_lowercase(&string.type_token().unwrap());
- self.output.push('{');
- if let Some(name) = string.name_token() {
- self.output.push_str(name.text());
- self.output.push_str(" = ");
- if let Some(value) = string.value() {
- self.align.push(self.base_align());
- self.visit_node(value.syntax().clone());
- self.output.push('}');
- }
- }
- }
- bibtex::ENTRY => {
- let entry = bibtex::Entry::cast(parent).unwrap();
- self.visit_token_lowercase(&entry.type_token().unwrap());
- self.output.push('{');
- if let Some(key) = entry.name_token() {
- self.output.push_str(&key.to_string());
- self.output.push(',');
- self.output.push('\n');
- for field in entry.fields() {
- self.visit_node(field.syntax().clone());
- }
- self.output.push('}');
- }
- }
- bibtex::FIELD => {
- let field = bibtex::Field::cast(parent).unwrap();
- self.output.push_str(&self.indent);
- let name = field.name_token().unwrap();
- self.output.push_str(name.text());
- self.output.push_str(" = ");
- if let Some(value) = field.value() {
- let count = name.text().chars().count();
- self.align.push(self.tab_size as usize + count + 3);
- self.visit_node(value.syntax().clone());
- self.output.push(',');
- self.output.push('\n');
- }
- }
- kind if bibtex::Value::can_cast(kind) => {
- let tokens: Vec<_> = parent
- .descendants_with_tokens()
- .filter_map(|element| element.into_token())
- .filter(|token| token.kind() != bibtex::WHITESPACE)
- .collect();
-
- self.output.push_str(tokens[0].text());
-
- let align = self.align.pop().unwrap_or_default();
- let mut length = align + tokens[0].text().chars().count();
- for i in 1..tokens.len() {
- let previous = &tokens[i - 1];
- let current = &tokens[i];
- let current_length = current.text().chars().count();
-
- let insert_space = self.should_insert_space(previous, current);
- let space_length = if insert_space { 1 } else { 0 };
-
- if length + current_length + space_length > self.line_length {
- self.output.push('\n');
- self.output.push_str(self.indent.as_ref());
- for _ in 0..=align - self.tab_size as usize {
- self.output.push(' ');
- }
- length = align;
- } else if insert_space {
- self.output.push(' ');
- length += 1;
- }
- self.output.push_str(current.text());
- length += current_length;
- }
- }
- bibtex::ROOT | bibtex::JUNK => {
- for element in parent.children_with_tokens() {
- match element {
- NodeOrToken::Token(token) => {
- self.output.push_str(token.text());
- }
- NodeOrToken::Node(node) => {
- self.visit_node(node);
- }
- }
- }
- }
- _ => unreachable!(),
- }
- }
+ let options = bibfmt::Options {
+ insert_spaces: options.insert_spaces,
+ line_length: workspace.config().formatting.line_length,
+ tab_size: options.tab_size as usize,
+ };
+
+ let output = bibfmt::format(&data.root_node(), &document.line_index, &options);
+ let range = TextRange::new(0.into(), document.text.text_len());
+ let range = document.line_index.line_col_lsp_range(range)?;
+ Some(vec![lsp_types::TextEdit::new(range, output)])
}
diff --git a/support/texlab/crates/texlab/src/features/formatting/latexindent.rs b/support/texlab/crates/texlab/src/features/formatting/latexindent.rs
index bf5385401b..510bd80207 100644
--- a/support/texlab/crates/texlab/src/features/formatting/latexindent.rs
+++ b/support/texlab/crates/texlab/src/features/formatting/latexindent.rs
@@ -52,7 +52,7 @@ pub fn format_with_latexindent(
} else {
let line_index = &document.line_index;
let start = Position::new(0, 0);
- let end = line_index.line_col_lsp(old_text.text_len());
+ let end = line_index.line_col_lsp(old_text.text_len())?;
Some(vec![TextEdit {
range: lsp_types::Range::new(start, end),
new_text,
diff --git a/support/texlab/crates/texlab/src/features/highlight.rs b/support/texlab/crates/texlab/src/features/highlight.rs
index 63fc8ef9e2..10c5d95fb1 100644
--- a/support/texlab/crates/texlab/src/features/highlight.rs
+++ b/support/texlab/crates/texlab/src/features/highlight.rs
@@ -1,17 +1,28 @@
-mod label;
-
-use base_db::Workspace;
-use lsp_types::DocumentHighlight;
+use base_db::{FeatureParams, Workspace};
+use highlights::{HighlightKind, HighlightParams};
use crate::util::line_index_ext::LineIndexExt;
pub fn find_all(
workspace: &Workspace,
params: &lsp_types::DocumentHighlightParams,
-) -> Option<Vec<DocumentHighlight>> {
+) -> Option<Vec<lsp_types::DocumentHighlight>> {
let uri = &params.text_document_position_params.text_document.uri;
let document = workspace.lookup(uri)?;
let position = params.text_document_position_params.position;
- let offset = document.line_index.offset_lsp(position);
- label::find_highlights(document, offset)
+ let offset = document.line_index.offset_lsp(position)?;
+ let feature = FeatureParams::new(workspace, document);
+ let params = HighlightParams { feature, offset };
+ let results = highlights::find_all(params);
+ let results = results.into_iter().filter_map(|result| {
+ let range = document.line_index.line_col_lsp_range(result.range)?;
+ let kind = Some(match result.kind {
+ HighlightKind::Write => lsp_types::DocumentHighlightKind::WRITE,
+ HighlightKind::Read => lsp_types::DocumentHighlightKind::READ,
+ });
+
+ Some(lsp_types::DocumentHighlight { range, kind })
+ });
+
+ Some(results.collect())
}
diff --git a/support/texlab/crates/texlab/src/features/highlight/label.rs b/support/texlab/crates/texlab/src/features/highlight/label.rs
deleted file mode 100644
index dc0a60ab65..0000000000
--- a/support/texlab/crates/texlab/src/features/highlight/label.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-use base_db::{semantics::tex::LabelKind, Document};
-use lsp_types::DocumentHighlight;
-use rowan::TextSize;
-
-use crate::util::line_index_ext::LineIndexExt;
-
-pub fn find_highlights(
- document: &Document,
- offset: TextSize,
-) -> Option<Vec<lsp_types::DocumentHighlight>> {
- let data = document.data.as_tex()?;
- let cursor = data
- .semantics
- .labels
- .iter()
- .find(|label| label.name.range.contains(offset))?;
-
- let mut highlights = Vec::new();
- let line_index = &document.line_index;
- for label in data
- .semantics
- .labels
- .iter()
- .filter(|label| label.name.text == cursor.name.text)
- {
- let range = line_index.line_col_lsp_range(label.name.range);
- let kind = Some(match label.kind {
- LabelKind::Definition => lsp_types::DocumentHighlightKind::WRITE,
- LabelKind::Reference => lsp_types::DocumentHighlightKind::READ,
- LabelKind::ReferenceRange => lsp_types::DocumentHighlightKind::READ,
- });
-
- highlights.push(DocumentHighlight { range, kind });
- }
-
- Some(highlights)
-}
diff --git a/support/texlab/crates/texlab/src/features/hover.rs b/support/texlab/crates/texlab/src/features/hover.rs
index bde71261c3..1aac645488 100644
--- a/support/texlab/crates/texlab/src/features/hover.rs
+++ b/support/texlab/crates/texlab/src/features/hover.rs
@@ -1,17 +1,14 @@
-use base_db::Workspace;
+use base_db::{FeatureParams, Workspace};
use hover::{HoverData, HoverParams};
use crate::util::line_index_ext::LineIndexExt;
-pub fn find(
- workspace: &Workspace,
- uri: &lsp_types::Url,
- position: lsp_types::Position,
-) -> Option<lsp_types::Hover> {
- let document = workspace.lookup(uri)?;
- let offset = document.line_index.offset_lsp(position);
- let params = HoverParams::new(workspace, document, offset);
- let hover = ::hover::find(&params)?;
+pub fn find(workspace: &Workspace, params: lsp_types::HoverParams) -> Option<lsp_types::Hover> {
+ let uri_and_pos = &params.text_document_position_params;
+ let document = workspace.lookup(&uri_and_pos.text_document.uri)?;
+ let feature = FeatureParams::new(workspace, document);
+ let offset = document.line_index.offset_lsp(uri_and_pos.position)?;
+ let hover = ::hover::find(HoverParams { feature, offset })?;
let contents = match hover.data {
HoverData::Citation(text) => lsp_types::MarkupContent {
@@ -42,6 +39,6 @@ pub fn find(
Some(lsp_types::Hover {
contents: lsp_types::HoverContents::Markup(contents),
- range: Some(document.line_index.line_col_lsp_range(hover.range)),
+ range: document.line_index.line_col_lsp_range(hover.range),
})
}
diff --git a/support/texlab/crates/texlab/src/features/inlay_hint.rs b/support/texlab/crates/texlab/src/features/inlay_hint.rs
index cb4056f922..44ed0757a5 100644
--- a/support/texlab/crates/texlab/src/features/inlay_hint.rs
+++ b/support/texlab/crates/texlab/src/features/inlay_hint.rs
@@ -10,13 +10,13 @@ pub fn find_all(
) -> Option<Vec<lsp_types::InlayHint>> {
let document = workspace.lookup(uri)?;
let line_index = &document.line_index;
- let range = line_index.offset_lsp_range(range);
+ let range = line_index.offset_lsp_range(range)?;
let feature = FeatureParams::new(workspace, document);
let params = InlayHintParams { range, feature };
let hints = inlay_hints::find_all(params)?;
let hints = hints.into_iter().filter_map(|hint| {
- let position = line_index.line_col_lsp(hint.offset);
+ let position = line_index.line_col_lsp(hint.offset)?;
Some(match hint.data {
InlayHintData::LabelDefinition(label) => {
let number = label.number?;
diff --git a/support/texlab/crates/texlab/src/features/inlay_hint/label.rs b/support/texlab/crates/texlab/src/features/inlay_hint/label.rs
deleted file mode 100644
index f73d3fd9ae..0000000000
--- a/support/texlab/crates/texlab/src/features/inlay_hint/label.rs
+++ /dev/null
@@ -1,41 +0,0 @@
-use base_db::{
- semantics::tex::LabelKind,
- util::{render_label, RenderedObject},
- DocumentData,
-};
-
-use super::InlayHintBuilder;
-
-pub(super) fn find_hints(builder: &mut InlayHintBuilder) -> Option<()> {
- let DocumentData::Tex(data) = &builder.document.data else { return None };
-
- let range = builder.range;
- for label in data
- .semantics
- .labels
- .iter()
- .filter(|label| label.kind == LabelKind::Definition)
- .filter(|label| label.name.range.intersect(range).is_some())
- {
- let Some(rendered) = render_label(builder.workspace, &builder.project, label) else { continue };
- let Some(number) = &rendered.number else { continue };
-
- let text = match &rendered.object {
- RenderedObject::Section { prefix, .. } => {
- format!("{} {}", prefix, number)
- }
- RenderedObject::Float { kind, .. } => {
- format!("{} {}", kind.as_str(), number)
- }
- RenderedObject::Theorem { kind, .. } => {
- format!("{} {}", kind, number)
- }
- RenderedObject::Equation => format!("Equation ({})", number),
- RenderedObject::EnumItem => format!("Item {}", number),
- };
-
- builder.push(label.full_range.end(), text);
- }
-
- Some(())
-}
diff --git a/support/texlab/crates/texlab/src/features/link.rs b/support/texlab/crates/texlab/src/features/link.rs
index 9fb70d8b65..b821dcf6e1 100644
--- a/support/texlab/crates/texlab/src/features/link.rs
+++ b/support/texlab/crates/texlab/src/features/link.rs
@@ -1,38 +1,20 @@
-mod include;
-
-use base_db::{Document, Workspace};
+use base_db::{FeatureParams, Workspace};
use lsp_types::{DocumentLink, Url};
-use rowan::TextRange;
use crate::util::line_index_ext::LineIndexExt;
pub fn find_all(workspace: &Workspace, uri: &Url) -> Option<Vec<DocumentLink>> {
let document = workspace.lookup(uri)?;
- let mut builder = LinkBuilder {
- workspace,
- document,
- links: Vec::new(),
- };
-
- include::find_links(&mut builder);
- Some(builder.links)
-}
-
-struct LinkBuilder<'a> {
- workspace: &'a Workspace,
- document: &'a Document,
- links: Vec<DocumentLink>,
-}
-impl<'a> LinkBuilder<'a> {
- pub fn push(&mut self, range: TextRange, target: &Document) {
- let range = self.document.line_index.line_col_lsp_range(range);
- let target = Some(target.uri.clone());
- self.links.push(DocumentLink {
- range,
- target,
- tooltip: None,
+ let links = links::find_links(FeatureParams::new(workspace, document)).into_iter();
+ let links = links.filter_map(|link| {
+ Some(lsp_types::DocumentLink {
data: None,
- });
- }
+ tooltip: None,
+ target: Some(link.document.uri.clone()),
+ range: document.line_index.line_col_lsp_range(link.range)?,
+ })
+ });
+
+ Some(links.collect())
}
diff --git a/support/texlab/crates/texlab/src/features/link/include.rs b/support/texlab/crates/texlab/src/features/link/include.rs
deleted file mode 100644
index eef47514af..0000000000
--- a/support/texlab/crates/texlab/src/features/link/include.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-use super::LinkBuilder;
-
-pub(super) fn find_links(builder: &mut LinkBuilder) -> Option<()> {
- let parent = *builder
- .workspace
- .parents(builder.document)
- .iter()
- .next()
- .unwrap_or(&builder.document);
-
- let graph = base_db::graph::Graph::new(builder.workspace, parent);
-
- for edge in &graph.edges {
- if edge.source == builder.document {
- if let Some(weight) = &edge.weight {
- builder.push(weight.link.path.range, edge.target);
- }
- }
- }
-
- Some(())
-}
diff --git a/support/texlab/crates/texlab/src/features/reference.rs b/support/texlab/crates/texlab/src/features/reference.rs
index eb0807c7fc..380471e6cf 100644
--- a/support/texlab/crates/texlab/src/features/reference.rs
+++ b/support/texlab/crates/texlab/src/features/reference.rs
@@ -1,32 +1,33 @@
-use base_db::Workspace;
+use base_db::{FeatureParams, Workspace};
use references::{ReferenceKind, ReferenceParams};
use crate::util::line_index_ext::LineIndexExt;
pub fn find_all(
workspace: &Workspace,
- uri: &lsp_types::Url,
- position: lsp_types::Position,
- context: &lsp_types::ReferenceContext,
+ params: lsp_types::ReferenceParams,
) -> Option<Vec<lsp_types::Location>> {
- let document = workspace.lookup(uri)?;
- let offset = document.line_index.offset_lsp(position);
- let params = ReferenceParams {
- workspace,
- document,
- offset,
- };
+ let uri_and_pos = params.text_document_position;
+ let include_declaration = params.context.include_declaration;
+ let document = workspace.lookup(&uri_and_pos.text_document.uri)?;
+ let offset = document.line_index.offset_lsp(uri_and_pos.position)?;
+
+ let feature = FeatureParams::new(workspace, document);
let mut results = Vec::new();
- for result in references::find_all(params)
+ for result in references::find_all(ReferenceParams { feature, offset })
.into_iter()
- .filter(|result| result.kind == ReferenceKind::Reference || context.include_declaration)
+ .filter(|result| result.kind == ReferenceKind::Reference || include_declaration)
{
- let document = result.document;
+ let document = result.location.document;
let uri = document.uri.clone();
- let range = document.line_index.line_col_lsp_range(result.range);
- let location = lsp_types::Location::new(uri, range);
- results.push(location);
+ if let Some(range) = document
+ .line_index
+ .line_col_lsp_range(result.location.range)
+ {
+ let location = lsp_types::Location::new(uri, range);
+ results.push(location);
+ }
}
Some(results)
diff --git a/support/texlab/crates/texlab/src/features/rename.rs b/support/texlab/crates/texlab/src/features/rename.rs
index 1f48a449c0..297547e7e5 100644
--- a/support/texlab/crates/texlab/src/features/rename.rs
+++ b/support/texlab/crates/texlab/src/features/rename.rs
@@ -11,7 +11,7 @@ pub fn prepare_rename_all(
) -> Option<lsp_types::Range> {
let params = create_params(workspace, params)?;
let range = rename::prepare_rename(&params)?;
- Some(params.inner.document.line_index.line_col_lsp_range(range))
+ params.feature.document.line_index.line_col_lsp_range(range)
}
pub fn rename_all(
@@ -20,15 +20,15 @@ pub fn rename_all(
) -> Option<lsp_types::WorkspaceEdit> {
let new_name = &params.new_name;
let params = create_params(workspace, &params.text_document_position)?;
- let result = rename::rename(&params);
+ let result = rename::rename(params);
let mut changes = HashMap::default();
for (document, ranges) in result.changes {
let mut edits = Vec::new();
- for range in ranges {
- let range = document.line_index.line_col_lsp_range(range);
- edits.push(lsp_types::TextEdit::new(range, new_name.clone()));
- }
+ ranges
+ .into_iter()
+ .filter_map(|range| document.line_index.line_col_lsp_range(range))
+ .for_each(|range| edits.push(lsp_types::TextEdit::new(range, new_name.clone())));
changes.insert(document.uri.clone(), edits);
}
@@ -42,6 +42,9 @@ fn create_params<'db>(
) -> Option<RenameParams<'db>> {
let document = workspace.lookup(&params.text_document.uri)?;
let inner = FeatureParams::new(workspace, document);
- let offset = document.line_index.offset_lsp(params.position);
- Some(RenameParams { inner, offset })
+ let offset = document.line_index.offset_lsp(params.position)?;
+ Some(RenameParams {
+ feature: inner,
+ offset,
+ })
}
diff --git a/support/texlab/crates/texlab/src/features/symbols.rs b/support/texlab/crates/texlab/src/features/symbols.rs
index 170705e05c..65e92a5b17 100644
--- a/support/texlab/crates/texlab/src/features/symbols.rs
+++ b/support/texlab/crates/texlab/src/features/symbols.rs
@@ -14,7 +14,7 @@ pub fn document_symbols(
if capabilities.has_hierarchical_document_symbol_support() {
let results = symbols
.into_iter()
- .map(|symbol| convert_to_nested_symbol(symbol, document))
+ .filter_map(|symbol| convert_to_nested_symbol(symbol, document))
.collect();
DocumentSymbolResponse::Nested(results)
@@ -38,26 +38,29 @@ pub fn workspace_symbols(workspace: &Workspace, query: &str) -> WorkspaceSymbolR
WorkspaceSymbolResponse::Flat(results)
}
-fn convert_to_nested_symbol(symbol: symbols::Symbol, document: &Document) -> DocumentSymbol {
+fn convert_to_nested_symbol(
+ symbol: symbols::Symbol,
+ document: &Document,
+) -> Option<DocumentSymbol> {
let children = symbol
.children
.into_iter()
- .map(|child| convert_to_nested_symbol(child, document))
+ .filter_map(|child| convert_to_nested_symbol(child, document))
.collect();
#[allow(deprecated)]
- DocumentSymbol {
+ Some(DocumentSymbol {
name: symbol.name,
detail: symbol.label.map(|label| label.text),
kind: convert_symbol_kind(symbol.kind),
deprecated: Some(false),
- range: document.line_index.line_col_lsp_range(symbol.full_range),
+ range: document.line_index.line_col_lsp_range(symbol.full_range)?,
selection_range: document
.line_index
- .line_col_lsp_range(symbol.selection_range),
+ .line_col_lsp_range(symbol.selection_range)?,
children: Some(children),
tags: None,
- }
+ })
}
fn convert_to_flat_symbols(
@@ -65,7 +68,9 @@ fn convert_to_flat_symbols(
document: &Document,
results: &mut Vec<lsp_types::SymbolInformation>,
) {
- let range = document.line_index.line_col_lsp_range(symbol.full_range);
+ let Some(range) = document.line_index.line_col_lsp_range(symbol.full_range) else {
+ return;
+ };
#[allow(deprecated)]
results.push(lsp_types::SymbolInformation {
diff --git a/support/texlab/crates/texlab/src/server.rs b/support/texlab/crates/texlab/src/server.rs
index 7757bbb460..f06984d596 100644
--- a/support/texlab/crates/texlab/src/server.rs
+++ b/support/texlab/crates/texlab/src/server.rs
@@ -11,11 +11,12 @@ use std::{
};
use anyhow::Result;
-use base_db::{util::LineCol, Config, Owner, Workspace};
+use base_db::{Config, Owner, Workspace};
use commands::{BuildCommand, CleanCommand, CleanTarget, ForwardSearch};
use crossbeam_channel::{Receiver, Sender};
use diagnostics::{DiagnosticManager, DiagnosticSource};
use distro::{Distro, Language};
+use line_index::LineCol;
use lsp_server::{Connection, ErrorCode, Message, RequestId};
use lsp_types::{notification::*, request::*, *};
use notify::event::ModifyKind;
@@ -413,7 +414,7 @@ impl Server {
};
match change.range {
Some(range) => {
- let range = document.line_index.offset_lsp_range(range);
+ let range = document.line_index.offset_lsp_range(range).unwrap();
workspace.edit(&uri, range, &change.text);
}
None => {
@@ -605,25 +606,20 @@ impl Server {
Ok(())
}
- fn references(&self, id: RequestId, params: ReferenceParams) -> Result<()> {
- let mut uri = params.text_document_position.text_document.uri;
- normalize_uri(&mut uri);
- let position = params.text_document_position.position;
+ fn references(&self, id: RequestId, mut params: ReferenceParams) -> Result<()> {
+ normalize_uri(&mut params.text_document_position.text_document.uri);
self.run_query(id, move |db| {
- reference::find_all(db, &uri, position, &params.context).unwrap_or_default()
+ reference::find_all(db, params).unwrap_or_default()
});
Ok(())
}
- fn hover(&mut self, id: RequestId, params: HoverParams) -> Result<()> {
- let mut uri = params.text_document_position_params.text_document.uri;
- normalize_uri(&mut uri);
-
- let position = params.text_document_position_params.position;
- self.update_cursor(&uri, position);
-
- self.run_query(id, move |db| hover::find(db, &uri, position));
+ fn hover(&mut self, id: RequestId, mut params: HoverParams) -> Result<()> {
+ normalize_uri(&mut params.text_document_position_params.text_document.uri);
+ let uri_and_pos = &params.text_document_position_params;
+ self.update_cursor(&uri_and_pos.text_document.uri, uri_and_pos.position);
+ self.run_query(id, move |db| hover::find(db, params));
Ok(())
}
@@ -941,15 +937,17 @@ impl Server {
};
let line_index = &document.line_index;
- let position = line_index.offset_lsp(params.text_document_position.position);
+ let Some(position) = line_index.offset_lsp(params.text_document_position.position) else {
+ anyhow::bail!("Invalid position for document {uri}!")
+ };
let Some(result) = commands::change_environment(document, position, &params.new_name)
else {
anyhow::bail!("No environment found at the current position");
};
- let range1 = line_index.line_col_lsp_range(result.begin);
- let range2 = line_index.line_col_lsp_range(result.end);
+ let range1 = line_index.line_col_lsp_range(result.begin).unwrap();
+ let range2 = line_index.line_col_lsp_range(result.end).unwrap();
let mut changes = HashMap::new();
changes.insert(
@@ -985,15 +983,18 @@ impl Server {
};
let line_index = &document.line_index;
- let offset = line_index.offset_lsp(params.position);
+ let Some(offset) = line_index.offset_lsp(params.position) else {
+ anyhow::bail!("Invalid position for document {uri}!")
+ };
+
let results = commands::find_environments(document, offset)
.into_iter()
.map(|result| EnvironmentLocation {
name: TextWithRange {
- range: line_index.line_col_lsp_range(result.name.range),
+ range: line_index.line_col_lsp_range(result.name.range).unwrap(),
text: result.name.text,
},
- full_range: line_index.line_col_lsp_range(result.full_range),
+ full_range: line_index.line_col_lsp_range(result.full_range).unwrap(),
})
.collect();
diff --git a/support/texlab/crates/texlab/src/util/diagnostics.rs b/support/texlab/crates/texlab/src/util/diagnostics.rs
index 89d33060a1..0ef24d065b 100644
--- a/support/texlab/crates/texlab/src/util/diagnostics.rs
+++ b/support/texlab/crates/texlab/src/util/diagnostics.rs
@@ -21,7 +21,7 @@ pub fn collect<'db>(
.map(|(document, diags)| {
let diags = diags
.into_iter()
- .map(|diag| create_diagnostic(workspace, document, diag))
+ .filter_map(|diag| create_diagnostic(workspace, document, diag))
.collect::<Vec<_>>();
(document, diags)
@@ -33,8 +33,8 @@ fn create_diagnostic(
workspace: &Workspace,
document: &Document,
diagnostic: &Diagnostic,
-) -> lsp_types::Diagnostic {
- let range = document.line_index.line_col_lsp_range(diagnostic.range);
+) -> Option<lsp_types::Diagnostic> {
+ let range = document.line_index.line_col_lsp_range(diagnostic.range)?;
let severity = match &diagnostic.data {
DiagnosticData::Tex(error) => match error {
@@ -154,14 +154,14 @@ fn create_diagnostic(
DiagnosticData::Build(_) => None,
};
- lsp_types::Diagnostic {
+ Some(lsp_types::Diagnostic {
severity: Some(severity),
code: code.map(lsp_types::NumberOrString::Number),
source: Some(String::from(source)),
tags,
related_information,
..lsp_types::Diagnostic::new_simple(range, message)
- }
+ })
}
fn make_conflict_info(
@@ -172,10 +172,9 @@ fn make_conflict_info(
let mut items = Vec::new();
for (uri, range) in locations {
let range = workspace
- .lookup(uri)
- .unwrap()
+ .lookup(uri)?
.line_index
- .line_col_lsp_range(*range);
+ .line_col_lsp_range(*range)?;
let message = format!("conflicting {object} defined here");
let location = lsp_types::Location::new(uri.clone(), range);
diff --git a/support/texlab/crates/texlab/src/util/line_index_ext.rs b/support/texlab/crates/texlab/src/util/line_index_ext.rs
index a7b0fa8953..8e6bb6da03 100644
--- a/support/texlab/crates/texlab/src/util/line_index_ext.rs
+++ b/support/texlab/crates/texlab/src/util/line_index_ext.rs
@@ -1,51 +1,53 @@
-use base_db::util::{LineCol, LineColUtf16, LineIndex};
+use line_index::{LineCol, LineColUtf16, LineIndex};
use lsp_types::{Position, Range};
use rowan::{TextRange, TextSize};
pub trait LineIndexExt {
- fn offset_lsp(&self, line_col: Position) -> TextSize;
+ fn offset_lsp(&self, line_col: Position) -> Option<TextSize>;
- fn offset_lsp_range(&self, line_col: Range) -> TextRange;
+ fn offset_lsp_range(&self, line_col: Range) -> Option<TextRange>;
- fn line_col_lsp(&self, offset: TextSize) -> Position;
+ fn line_col_lsp(&self, offset: TextSize) -> Option<Position>;
- fn line_col_lsp_range(&self, offset: TextRange) -> Range;
+ fn line_col_lsp_range(&self, offset: TextRange) -> Option<Range>;
}
impl LineIndexExt for LineIndex {
- fn offset_lsp(&self, line_col: Position) -> TextSize {
+ fn offset_lsp(&self, line_col: Position) -> Option<TextSize> {
let line_col = LineColUtf16 {
line: line_col.line,
col: line_col.character,
};
- self.offset(self.to_utf8(line_col))
+
+ let line_col = self.to_utf8(line_col)?;
+ self.offset(line_col)
}
- fn offset_lsp_range(&self, line_col: Range) -> TextRange {
- let start = self.offset_lsp(line_col.start);
- let end = self.offset_lsp(line_col.end);
- TextRange::new(start, end)
+ fn offset_lsp_range(&self, line_col: Range) -> Option<TextRange> {
+ let start = self.offset_lsp(line_col.start)?;
+ let end = self.offset_lsp(line_col.end)?;
+ Some(TextRange::new(start, end))
}
- fn line_col_lsp(&self, offset: TextSize) -> Position {
- let position = self.line_col(offset);
- let LineColUtf16 { line, col } = self.to_utf16(position);
- Position::new(line, col)
+ fn line_col_lsp(&self, offset: TextSize) -> Option<Position> {
+ let line_col = self.line_col(offset);
+ let line_col = self.to_utf16(line_col)?;
+ Some(Position::new(line_col.line, line_col.col))
}
- fn line_col_lsp_range(&self, offset: TextRange) -> Range {
- let start = self.line_col_lsp(offset.start());
- let mut end = self.line_col_lsp(offset.end());
+ fn line_col_lsp_range(&self, offset: TextRange) -> Option<Range> {
+ let start = self.line_col_lsp(offset.start())?;
+ let mut end = self.line_col_lsp(offset.end())?;
if end.line != start.line && end.character == 0 {
// Prefer keeping multi-line ranges on the same line
let line_end = self.offset(LineCol {
line: end.line,
col: 0,
- });
+ })?;
- end = self.line_col_lsp(line_end - TextSize::from(1));
+ end = self.line_col_lsp(line_end - TextSize::from(1))?;
}
- Range::new(start, end)
+ Some(Range::new(start, end))
}
}
diff --git a/support/texlab/crates/texlab/tests/lsp/fixture.rs b/support/texlab/crates/texlab/tests/lsp/fixture.rs
deleted file mode 100644
index a10105eb7f..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/fixture.rs
+++ /dev/null
@@ -1,271 +0,0 @@
-use std::{
- path::{Path, PathBuf},
- sync::Once,
- thread::JoinHandle,
-};
-
-use anyhow::Result;
-use distro::Language;
-use lsp_server::Connection;
-use lsp_types::{
- notification::{DidOpenTextDocument, Exit, Initialized},
- request::{Initialize, Shutdown},
- ClientCapabilities, DidOpenTextDocumentParams, InitializeParams, InitializedParams, Location,
- Position, Range, TextDocumentIdentifier, TextDocumentItem, TextDocumentPositionParams, Url,
-};
-use tempfile::{tempdir, TempDir};
-use texlab::{LspClient, Server};
-
-#[derive(Debug)]
-pub struct Fixture {
- pub documents: Vec<Document>,
-}
-
-impl Fixture {
- pub fn parse(input: &str) -> Fixture {
- let mut documents = Vec::new();
-
- let mut start = 0;
- if !input.is_empty() {
- for end in input
- .match_indices("%!")
- .skip(1)
- .map(|(i, _)| i)
- .chain(std::iter::once(input.len()))
- {
- documents.push(Document::parse(&input[start..end]));
- start = end;
- }
- }
-
- Self { documents }
- }
-
- pub fn setup(&self, client: &LspClient, dir: &Path) -> Result<()> {
- for document in &self.documents {
- let text = String::from(&document.text);
- let path = dir.join(&document.path);
- std::fs::create_dir_all(path.parent().unwrap())?;
- std::fs::write(&path, &text)?;
-
- let uri = Url::from_file_path(&path).unwrap();
- let language = Language::from_path(&path).unwrap_or(Language::Tex);
- let language_id = String::from(match language {
- Language::Tex => "latex",
- Language::Bib => "bibtex",
- Language::Aux | Language::Log | Language::Root | Language::Tectonic => continue,
- });
-
- client.send_notification::<DidOpenTextDocument>(DidOpenTextDocumentParams {
- text_document: TextDocumentItem::new(uri, language_id, 0, text),
- })?;
- }
-
- Ok(())
- }
-}
-
-#[derive(Debug)]
-pub struct Document {
- pub path: PathBuf,
- pub text: String,
- pub cursor: Option<Position>,
- pub ranges: Vec<Range>,
-}
-
-impl Document {
- pub fn parse(input: &str) -> Self {
- let mut lines = Vec::new();
-
- let (path, input) = input
- .trim()
- .strip_prefix("%! ")
- .map(|input| input.split_once('\n').unwrap_or((input, "")))
- .unwrap();
-
- let mut ranges = Vec::new();
- let mut cursor = None;
-
- for line in input.lines().map(|line| line.trim_end()) {
- if line.chars().all(|c| matches!(c, ' ' | '^' | '|' | '!')) && !line.is_empty() {
- let index = (lines.len() - 1) as u32;
-
- cursor = cursor.or_else(|| {
- let character = line.find('|')?;
- Some(Position::new(index, character as u32))
- });
-
- if let Some(start) = line.find('!') {
- let position = Position::new(index, start as u32);
- ranges.push(Range::new(position, position));
- }
-
- if let Some(start) = line.find('^') {
- let end = line.rfind('^').unwrap() + 1;
- ranges.push(Range::new(
- Position::new(index, start as u32),
- Position::new(index, end as u32),
- ));
- }
- } else {
- lines.push(line);
- }
- }
-
- Self {
- path: PathBuf::from(path),
- text: lines.join("\n"),
- cursor,
- ranges,
- }
- }
-}
-
-static LOGGER: Once = Once::new();
-
-#[derive(Debug)]
-pub struct TestBed {
- fixture: Fixture,
- locations: Vec<Location>,
- _temp_dir: TempDir,
- temp_dir_path: PathBuf,
- client: LspClient,
- client_thread: Option<JoinHandle<()>>,
- server_thread: Option<JoinHandle<()>>,
-}
-
-impl Drop for TestBed {
- fn drop(&mut self) {
- let _ = self.client.send_request::<Shutdown>(());
- let _ = self.client.send_notification::<Exit>(());
- self.client_thread.take().unwrap().join().unwrap();
- self.server_thread.take().unwrap().join().unwrap();
- }
-}
-
-impl TestBed {
- pub fn new(fixture: &str) -> Result<Self> {
- LOGGER.call_once(|| {
- if option_env!("TEST_LOG") == Some("1") {
- fern::Dispatch::new()
- .filter(|metadata| {
- metadata.target().contains("texlab")
- || metadata.target().contains("lsp_server")
- })
- .level(log::LevelFilter::Trace)
- .chain(std::io::stderr())
- .apply()
- .unwrap()
- }
- });
-
- let fixture = Fixture::parse(fixture);
- let (server_conn, client_conn) = Connection::memory();
-
- let client = LspClient::new(client_conn.sender);
-
- let server_thread = std::thread::spawn(move || Server::new(server_conn).run().unwrap());
- let client_thread = {
- let client = client.clone();
- std::thread::spawn(move || {
- for message in &client_conn.receiver {
- match message {
- lsp_server::Message::Request(request) => {
- client
- .send_error(
- request.id,
- lsp_server::ErrorCode::MethodNotFound.into(),
- "Method not found".into(),
- )
- .unwrap();
- }
- lsp_server::Message::Response(response) => {
- client.recv_response(response).unwrap();
- }
- lsp_server::Message::Notification(_) => {}
- }
- }
- })
- };
-
- let temp_dir = tempdir()?;
- let temp_dir_path = temp_dir.path().canonicalize()?;
-
- let locations = fixture
- .documents
- .iter()
- .flat_map(|document| {
- let uri = Url::from_file_path(temp_dir_path.join(&document.path)).unwrap();
- document
- .ranges
- .iter()
- .map(move |range| Location::new(uri.clone(), *range))
- })
- .collect();
-
- Ok(TestBed {
- fixture,
- locations,
- _temp_dir: temp_dir,
- temp_dir_path,
- client,
- client_thread: Some(client_thread),
- server_thread: Some(server_thread),
- })
- }
-
- pub fn initialize(&self, capabilities: ClientCapabilities) -> Result<()> {
- self.client.send_request::<Initialize>(InitializeParams {
- capabilities,
- initialization_options: Some(serde_json::json!({ "skipDistro": true })),
- ..Default::default()
- })?;
-
- self.client
- .send_notification::<Initialized>(InitializedParams {})?;
-
- self.fixture.setup(&self.client, self.directory())?;
- Ok(())
- }
-
- pub fn client(&self) -> &LspClient {
- &self.client
- }
-
- pub fn cursor(&self) -> Option<TextDocumentPositionParams> {
- let (document, cursor) = self
- .fixture
- .documents
- .iter()
- .find_map(|document| document.cursor.map(|cursor| (document, cursor)))?;
-
- let uri = Url::from_file_path(self.temp_dir_path.join(&document.path)).unwrap();
- let id = TextDocumentIdentifier::new(uri);
- Some(TextDocumentPositionParams::new(id, cursor))
- }
-
- pub fn locations(&self) -> &[Location] {
- &self.locations
- }
-
- pub fn directory(&self) -> &Path {
- &self.temp_dir_path
- }
-
- pub fn documents(&self) -> &[Document] {
- &self.fixture.documents
- }
-
- pub fn redact(&self, uri: &Url) -> Url {
- if uri.scheme() != "file" {
- return uri.clone();
- }
-
- let path = uri.to_file_path().unwrap().canonicalize().unwrap();
- let path = path.strip_prefix(self.directory()).unwrap();
- let path = path.to_str().unwrap();
-
- let text = format!("redacted://{}", path.replace('\\', "/"));
- Url::parse(&text).unwrap()
- }
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/main.rs b/support/texlab/crates/texlab/tests/lsp/main.rs
deleted file mode 100644
index aeb4f8993c..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/main.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-mod fixture;
-mod text_document;
-mod workspace;
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document.rs b/support/texlab/crates/texlab/tests/lsp/text_document.rs
deleted file mode 100644
index 8276c43815..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-mod document_highlight;
-mod document_link;
-mod document_symbol;
-mod formatting;
-mod inlay_hint;
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
deleted file mode 100644
index 5cfb8fbee8..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/document_highlight.rs
+++ /dev/null
@@ -1,51 +0,0 @@
-use assert_unordered::assert_eq_unordered;
-use lsp_types::{
- request::DocumentHighlightRequest, ClientCapabilities, DocumentHighlight,
- DocumentHighlightKind, DocumentHighlightParams,
-};
-
-use crate::fixture::TestBed;
-
-fn check(fixture: &str, highlight_kinds: &[DocumentHighlightKind]) {
- let test_bed = TestBed::new(fixture).unwrap();
- test_bed.initialize(ClientCapabilities::default()).unwrap();
-
- let expected: Vec<_> = test_bed
- .locations()
- .iter()
- .zip(highlight_kinds)
- .map(|(location, kind)| DocumentHighlight {
- range: location.range,
- kind: Some(*kind),
- })
- .collect();
-
- let text_document_position_params = test_bed.cursor().unwrap();
- let actual = test_bed
- .client()
- .send_request::<DocumentHighlightRequest>(DocumentHighlightParams {
- text_document_position_params,
- partial_result_params: Default::default(),
- work_done_progress_params: Default::default(),
- })
- .unwrap()
- .unwrap_or_default();
-
- assert_eq_unordered!(actual, expected);
-}
-
-#[test]
-fn test_label() {
- check(
- r#"
-%! main.tex
-\label{foo}
- |
- ^^^
-\ref{foo}
- ^^^
-\label{bar}
-"#,
- &[DocumentHighlightKind::WRITE, DocumentHighlightKind::READ],
- )
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
deleted file mode 100644
index 6aab6105de..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/document_link.rs
+++ /dev/null
@@ -1,52 +0,0 @@
-use insta::assert_json_snapshot;
-use lsp_types::{
- request::DocumentLinkRequest, ClientCapabilities, DocumentLink, DocumentLinkParams,
-};
-
-use crate::fixture::TestBed;
-
-fn find_links(fixture: &str) -> Vec<DocumentLink> {
- let test_bed = TestBed::new(fixture).unwrap();
- test_bed.initialize(ClientCapabilities::default()).unwrap();
-
- let text_document_position = test_bed.cursor().unwrap();
- let mut links = test_bed
- .client()
- .send_request::<DocumentLinkRequest>(DocumentLinkParams {
- text_document: text_document_position.text_document,
- work_done_progress_params: Default::default(),
- partial_result_params: Default::default(),
- })
- .unwrap()
- .unwrap_or_default();
-
- for link in &mut links {
- link.target = Some(test_bed.redact(link.target.as_ref().unwrap()));
- }
-
- links
-}
-
-#[test]
-fn document_include() {
- assert_json_snapshot!(find_links(
- r#"
-%! foo.tex
-\input{bar.tex}
-|
-
-%! bar.tex"#,
- ))
-}
-
-#[test]
-fn document_import() {
- assert_json_snapshot!(find_links(
- r#"
-%! foo.tex
-\import{.}{bar/baz}
-|
-
-%! bar/baz.tex"#,
- ))
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs b/support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
deleted file mode 100644
index e22c9374ad..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/document_symbol.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use insta::assert_debug_snapshot;
-use lsp_types::{notification::DidOpenTextDocument, request::DocumentSymbolRequest, *};
-
-use crate::fixture::TestBed;
-
-#[test]
-fn test_smoke() {
- let test_bed = TestBed::new("").unwrap();
- test_bed
- .initialize(ClientCapabilities {
- text_document: Some(TextDocumentClientCapabilities {
- document_symbol: Some(DocumentSymbolClientCapabilities {
- hierarchical_document_symbol_support: Some(true),
- ..Default::default()
- }),
- ..Default::default()
- }),
- ..Default::default()
- })
- .unwrap();
-
- let uri = Url::parse("file:///texlab/main.tex").unwrap();
- test_bed
- .client()
- .send_notification::<DidOpenTextDocument>(DidOpenTextDocumentParams {
- text_document: TextDocumentItem::new(
- uri.clone(),
- "latex".into(),
- 0,
- r#"\section{Foo} \subsection{Bar} \section{Baz}"#.into(),
- ),
- })
- .unwrap();
-
- let Some(DocumentSymbolResponse::Nested(symbols)) = test_bed
- .client()
- .send_request::<DocumentSymbolRequest>(DocumentSymbolParams {
- text_document: TextDocumentIdentifier { uri },
- partial_result_params: Default::default(),
- work_done_progress_params: Default::default(),
- })
- .unwrap() else { unreachable!() };
-
- assert_debug_snapshot!(symbols);
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs b/support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
deleted file mode 100644
index 05f8f768de..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/formatting.rs
+++ /dev/null
@@ -1,135 +0,0 @@
-use base_db::util::LineIndex;
-use insta::assert_snapshot;
-use lsp_types::{
- request::Formatting, ClientCapabilities, DocumentFormattingParams, FormattingOptions,
-};
-use texlab::util::line_index_ext::LineIndexExt;
-
-use crate::fixture::TestBed;
-
-fn format(fixture: &str) -> String {
- let test_bed = TestBed::new(fixture).unwrap();
- test_bed.initialize(ClientCapabilities::default()).unwrap();
-
- let text_document = test_bed.cursor().unwrap().text_document;
- let edits = test_bed
- .client()
- .send_request::<Formatting>(DocumentFormattingParams {
- text_document,
- work_done_progress_params: Default::default(),
- options: FormattingOptions {
- insert_spaces: true,
- tab_size: 4,
- ..Default::default()
- },
- })
- .unwrap()
- .unwrap_or_default();
-
- let old_text = &test_bed.documents()[0].text;
- let line_index = LineIndex::new(old_text);
- let mut new_text = String::from(old_text);
- for edit in edits.into_iter().rev() {
- let range = line_index.offset_lsp_range(edit.range);
- new_text.replace_range::<std::ops::Range<usize>>(range.into(), &edit.new_text);
- }
-
- new_text
-}
-
-#[test]
-fn bibtex_internal_wrap_long_lines() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.
-Lorem ipsum dolor sit amet,
-consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_multiple_entries() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet,
-consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}
-
-@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet,
-consectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}"
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_trailing_comma() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = baz}
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_insert_braces() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = baz,
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_command() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = "\baz",}
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_join_strings() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article{foo, bar = "baz" # "qux"}
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_parens() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@article(foo,)
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_string() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@string{foo="bar"}
-|"#,
- ));
-}
-
-#[test]
-fn bibtex_internal_preamble() {
- assert_snapshot!(format(
- r#"
-%! main.bib
-@preamble{
- "foo bar baz" }
-|"#,
- ));
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs b/support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
deleted file mode 100644
index d8ae8e304a..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/inlay_hint.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-use insta::assert_json_snapshot;
-use lsp_types::{
- request::InlayHintRequest, ClientCapabilities, InlayHint, InlayHintParams, Position, Range,
-};
-
-use crate::fixture::TestBed;
-
-fn find_hints(fixture: &str) -> Vec<InlayHint> {
- let test_bed = TestBed::new(fixture).unwrap();
- test_bed.initialize(ClientCapabilities::default()).unwrap();
-
- let cursor = test_bed.cursor().unwrap();
-
- test_bed
- .client()
- .send_request::<InlayHintRequest>(InlayHintParams {
- text_document: cursor.text_document,
- range: Range::new(Position::new(0, 0), cursor.position),
- work_done_progress_params: Default::default(),
- })
- .unwrap()
- .unwrap_or_default()
-}
-
-#[test]
-fn label_definition() {
- assert_json_snapshot!(find_hints(
- r#"
-%! main.tex
-\documentclass{article}
-\usepackage{caption}
-\begin{document}
-\section{Foo}\label{sec:foo}
-\section{Bar}\label{sec:bar}
-\subsection{Baz}\label{sec:baz}
-\begin{figure}
- Test
- \label{fig:qux}
- \caption{Qux}
-\end{figure}
-\end{document}
- |
-
-%! main.aux
-\relax
-\providecommand*\caption@xref[2]{\@setref\relax\@undefined{#1}}
-\newlabel{fig:qux}{{\caption@xref {fig:qux}{ on input line 15}}{1}}
-\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Qux\relax }}{1}{}\protected@file@percent }
-\@writefile{toc}{\contentsline {section}{\numberline {1}Foo}{1}{}\protected@file@percent }
-\newlabel{sec:foo}{{1}{1}}
-\@writefile{toc}{\contentsline {section}{\numberline {2}Bar}{1}{}\protected@file@percent }
-\newlabel{sec:bar}{{2}{1}}
-\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Baz}{1}{}\protected@file@percent }
-\newlabel{sec:baz}{{2.1}{1}}
-\gdef \@abspage@last{1}"#,
- ));
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
deleted file mode 100644
index 19c84e95fc..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_package_ref.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\acrodef{fpsLabel}[FPS]{Frames per Second}\n\\ac{f\n |\n ^\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
deleted file mode 100644
index 23e5b695ef..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_empty.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n\\acrshort{}\n |\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
deleted file mode 100644
index 25171b679c..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_open_brace.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n\\acrshort{f\n |\n ^\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
deleted file mode 100644
index 1d3f3329c1..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__acronym_ref_simple.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n\\acrshort{f}\n |\n ^\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
deleted file mode 100644
index ecc48b5a7f..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_empty.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{amsfonts}\n\\mathbb{}\n |\"#)"
----
-[
- {
- "label": "A",
- "preselect": false
- },
- {
- "label": "B",
- "preselect": false
- },
- {
- "label": "C",
- "preselect": false
- },
- {
- "label": "D",
- "preselect": false
- },
- {
- "label": "E",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
deleted file mode 100644
index 530527a384..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{amsfonts}\n\\mathbb{\n |\nTest\"#)"
----
-[
- {
- "label": "A",
- "preselect": false
- },
- {
- "label": "B",
- "preselect": false
- },
- {
- "label": "C",
- "preselect": false
- },
- {
- "label": "D",
- "preselect": false
- },
- {
- "label": "E",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
deleted file mode 100644
index c98249c781..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__argument_word.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{amsfonts}\n\\mathbb{A}\n |\n ^\"#)"
----
-[
- {
- "label": "A",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
deleted file mode 100644
index bb9e30ae55..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__begin_environment_without_snippet_support.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\beg\n |\n ^^^\"#)"
----
-[
- {
- "label": "AtBeginDocument",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "AtBeginDvi",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "begin",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "begingroup",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "bigwedge",
- "detail": "⋀, built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
deleted file mode 100644
index db26e6125d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation.snap
+++ /dev/null
@@ -1,16 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{article}\n\\bibliography{main}\n\\begin{document}\n\\cite{\n |\n\\end{document}\n\n%! main.bib\n@article{foo:2019,\n author = {Foo Bar},\n title = {Baz Qux},\n year = {2019},\n}\n\n@article{bar:2005,}\"#)"
----
-[
- {
- "label": "bar:2005",
- "preselect": false,
- "filterText": "bar:2005 @article"
- },
- {
- "label": "foo:2019",
- "preselect": false,
- "filterText": "foo:2019 @article Foo Bar Baz Qux 2019"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
deleted file mode 100644
index 242d5d2a0b..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_acronym.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\addbibresource{main.bib}\n\\DeclareAcronym{foo}{cite={}}\n |\n\n%! main.bib\n@article{foo,}\"#)"
----
-[
- {
- "label": "foo",
- "preselect": false,
- "filterText": "foo @article"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
deleted file mode 100644
index b205903a04..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\addbibresource{main.bib}\n\\cite{\n |\n\n%! main.bib\n@article{foo,}\"#)"
----
-[
- {
- "label": "foo",
- "preselect": false,
- "filterText": "foo @article"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
deleted file mode 100644
index 519fa60fa6..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__citation_open_brace_multiple.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\addbibresource{main.bib}\n\\cite{foo,a\n |\n ^\n\n%! main.bib\n@article{foo,}\"#)"
----
-[
- {
- "label": "foo",
- "preselect": false,
- "filterText": "foo @article"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
deleted file mode 100644
index 421335a4a5..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\definecolor{foo}{\n |\"#)"
----
-[
- {
- "label": "HTML",
- "preselect": false
- },
- {
- "label": "RGB",
- "preselect": false
- },
- {
- "label": "cmyk",
- "preselect": false
- },
- {
- "label": "gray",
- "preselect": false
- },
- {
- "label": "rgb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
deleted file mode 100644
index 5d7338e48e..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\definecolorset{\n |\"#)"
----
-[
- {
- "label": "HTML",
- "preselect": false
- },
- {
- "label": "RGB",
- "preselect": false
- },
- {
- "label": "cmyk",
- "preselect": false
- },
- {
- "label": "gray",
- "preselect": false
- },
- {
- "label": "rgb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
deleted file mode 100644
index 811b47c9ee..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_set_simple.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\definecolorset{}\n |\"#)"
----
-[
- {
- "label": "HTML",
- "preselect": false
- },
- {
- "label": "RGB",
- "preselect": false
- },
- {
- "label": "cmyk",
- "preselect": false
- },
- {
- "label": "gray",
- "preselect": false
- },
- {
- "label": "rgb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
deleted file mode 100644
index dbb34f08d9..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_model_definition_simple.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\definecolor{foo}{}\n |\"#)"
----
-[
- {
- "label": "HTML",
- "preselect": false
- },
- {
- "label": "RGB",
- "preselect": false
- },
- {
- "label": "cmyk",
- "preselect": false
- },
- {
- "label": "gray",
- "preselect": false
- },
- {
- "label": "rgb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
deleted file mode 100644
index e30fc4c1b0..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\color{\n |\"#)"
----
-[
- {
- "label": "Apricot",
- "preselect": false
- },
- {
- "label": "Aquamarine",
- "preselect": false
- },
- {
- "label": "Bittersweet",
- "preselect": false
- },
- {
- "label": "Black",
- "preselect": false
- },
- {
- "label": "Blue",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
deleted file mode 100644
index 5aab0d8e3b..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_simple.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\color{}\n |\"#)"
----
-[
- {
- "label": "Apricot",
- "preselect": false
- },
- {
- "label": "Aquamarine",
- "preselect": false
- },
- {
- "label": "Bittersweet",
- "preselect": false
- },
- {
- "label": "Black",
- "preselect": false
- },
- {
- "label": "Blue",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
deleted file mode 100644
index fe803dc6cc..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__color_word.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\color{re}\n |\n ^^\"#)"
----
-[
- {
- "label": "BrickRed",
- "preselect": false
- },
- {
- "label": "Red",
- "preselect": false
- },
- {
- "label": "RedOrange",
- "preselect": false
- },
- {
- "label": "RedViolet",
- "preselect": false
- },
- {
- "label": "red",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
deleted file mode 100644
index 616fb22a6b..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_bibtex.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{b,\n c = {\\LaT }\n |\n ^^^\n}\"#)"
----
-[
- {
- "label": "LaTeX",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "LaTeXe",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "LastDeclaredEncoding",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "last",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "latexreleaseversion",
- "detail": "built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
deleted file mode 100644
index 0e40056a6e..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\\n |\"#)"
----
-[
- {
- "label": "!",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "\"",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "#",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "$",
- "detail": "$, built-in",
- "preselect": false
- },
- {
- "label": "%",
- "detail": "built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
deleted file mode 100644
index 360229fa7a..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_command_simple_package.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{lipsum}\n\\lips\n |\n ^^^^\"#)"
----
-[
- {
- "label": "LipsumPar",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumProtect",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumRestoreAll",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsum",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsumexp",
- "detail": "lipsum.sty",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
deleted file mode 100644
index a2e5e17ac4..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_class.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{article}\n\\begin{thein}\n |\n ^^^^^\"#)"
----
-[
- {
- "label": "theindex",
- "detail": "article.cls",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
deleted file mode 100644
index 28d9c6e82c..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_command_definition.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newcommand{\\foo}{\\begin{doc}\n |\n ^^^\"#)"
----
-[
- {
- "label": "document",
- "detail": "built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
deleted file mode 100644
index f892dba5a7..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\begin{doc\n |\n ^^^\"#)"
----
-[
- {
- "label": "document",
- "detail": "built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
deleted file mode 100644
index 95a2e1db04..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__component_environment_simple_end.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\begin{document}\n\\end{\n |\"#)"
----
-[
- {
- "label": "abstract",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "array",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "center",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "csname",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "document",
- "detail": "built-in",
- "preselect": true
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
deleted file mode 100644
index 0fd8b00254..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_preamble.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@preamble{\n |\n ^^^^^^^^\"#)"
----
-[
- {
- "label": "preamble",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
deleted file mode 100644
index 6844fc1862..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_after_string.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@string{\n |\n ^^^^^^\"#)"
----
-[
- {
- "label": "string",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
deleted file mode 100644
index e74f5fed37..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_at_empty.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@\n |\"#)"
----
-[
- {
- "label": "article",
- "preselect": false
- },
- {
- "label": "artwork",
- "preselect": false
- },
- {
- "label": "audio",
- "preselect": false
- },
- {
- "label": "bibnote",
- "preselect": false
- },
- {
- "label": "book",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
deleted file mode 100644
index f9defdee01..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_article.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article\n |\n ^^^^^^^\"#)"
----
-[
- {
- "label": "article",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
deleted file mode 100644
index aad03a392b..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_preamble.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@preamble\n |\n ^^^^^^^^\"#)"
----
-[
- {
- "label": "preamble",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
deleted file mode 100644
index e30c60a45c..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_before_string.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@string\n |\n ^^^^^^\"#)"
----
-[
- {
- "label": "string",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
deleted file mode 100644
index 2724026a26..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__entry_type_complete_entry.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo, author = {foo}}\n |\n ^^^^^^^\"#)"
----
-[
- {
- "label": "article",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
deleted file mode 100644
index a5a1d7838e..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_closed.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo,}\n |\"#)"
----
-[
- {
- "label": "abstract",
- "preselect": false
- },
- {
- "label": "addendum",
- "preselect": false
- },
- {
- "label": "address",
- "preselect": false
- },
- {
- "label": "afterword",
- "preselect": false
- },
- {
- "label": "annotation",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
deleted file mode 100644
index 693d4ed141..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_empty_entry_open.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo,\n |\"#)"
----
-[
- {
- "label": "abstract",
- "preselect": false
- },
- {
- "label": "addendum",
- "preselect": false
- },
- {
- "label": "address",
- "preselect": false
- },
- {
- "label": "afterword",
- "preselect": false
- },
- {
- "label": "annotation",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
deleted file mode 100644
index cb0d41ed5d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_field_name.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo, a\n |\n ^\"#)"
----
-[
- {
- "label": "abstract",
- "preselect": false
- },
- {
- "label": "addendum",
- "preselect": false
- },
- {
- "label": "address",
- "preselect": false
- },
- {
- "label": "afterword",
- "preselect": false
- },
- {
- "label": "annotation",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
deleted file mode 100644
index 66dbf62785..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_closed.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo, author = bar, edit}\n |\n ^^^^\"#)"
----
-[
- {
- "label": "edition",
- "preselect": false
- },
- {
- "label": "editor",
- "preselect": false
- },
- {
- "label": "editora",
- "preselect": false
- },
- {
- "label": "editoratype",
- "preselect": false
- },
- {
- "label": "editorb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
deleted file mode 100644
index 221f78f335..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__field_entry_two_fields_name_open.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.bib\n@article{foo, author = bar, edit\n |\n ^^^^\"#)"
----
-[
- {
- "label": "edition",
- "preselect": false
- },
- {
- "label": "editor",
- "preselect": false
- },
- {
- "label": "editora",
- "preselect": false
- },
- {
- "label": "editoratype",
- "preselect": false
- },
- {
- "label": "editorb",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
deleted file mode 100644
index 1be95d5d99..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_open_brace.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n\\gls{f\n |\n ^\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
deleted file mode 100644
index 81e9299d69..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__glossary_ref_simple.snap
+++ /dev/null
@@ -1,10 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newacronym[longplural={Frames per Second}]{fpsLabel}{FPS}{Frame per Second}\n\\gls{f}\n |\n ^\"#)"
----
-[
- {
- "label": "fpsLabel",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
deleted file mode 100644
index 9ed7978612..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_closed_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{art}\n |\n ^^^\"#)"
----
-[
- {
- "label": "article",
- "preselect": false
- },
- {
- "label": "articleingud",
- "preselect": false
- },
- {
- "label": "articoletteracdp",
- "preselect": false
- },
- {
- "label": "artikel1",
- "preselect": false
- },
- {
- "label": "artikel2",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
deleted file mode 100644
index b650b621c6..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_class_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{art \\foo\n |\n ^^^\"#)"
----
-[
- {
- "label": "article",
- "preselect": false
- },
- {
- "label": "articleingud",
- "preselect": false
- },
- {
- "label": "articoletteracdp",
- "preselect": false
- },
- {
- "label": "artikel1",
- "preselect": false
- },
- {
- "label": "artikel2",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
deleted file mode 100644
index f8cad5526c..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_closed_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{lips}\n |\n ^^^^\"#)"
----
-[
- {
- "label": "lips",
- "preselect": false
- },
- {
- "label": "lipsum",
- "preselect": false
- },
- {
- "label": "lisp-simple-alloc",
- "preselect": false
- },
- {
- "label": "lisp-string",
- "preselect": false
- },
- {
- "label": "lwarp-lips",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
deleted file mode 100644
index d234241e24..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__import_package_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepackage{lips\n |\n ^^^^\"#)"
----
-[
- {
- "label": "lips",
- "preselect": false
- },
- {
- "label": "lipsum",
- "preselect": false
- },
- {
- "label": "lisp-simple-alloc",
- "preselect": false
- },
- {
- "label": "lisp-string",
- "preselect": false
- },
- {
- "label": "lwarp-lips",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
deleted file mode 100644
index 2b8f89b48d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_857_1.snap
+++ /dev/null
@@ -1,21 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! bug.tex\n\\documentclass{article}\n\\newcommand{\\ö}{foo}\n\\newcommand{\\öö}{bar}\n\\newcommand{\\ööabc}{baz}\n\\begin{document}\n\\ö\n |\n ^\n\\end{document}\n\"#)"
----
-[
- {
- "label": "ö",
- "detail": "user-defined",
- "preselect": false
- },
- {
- "label": "öö",
- "detail": "user-defined",
- "preselect": false
- },
- {
- "label": "ööabc",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
deleted file mode 100644
index c49510429d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_864.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! bug.tex\n\\documentclass{article}\n\\def\\あいうえお{}\n\\begin{document}\n\\あ\n |\n ^\n\\end{document}\"#)"
----
-[
- {
- "label": "あいうえお",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_883.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_883.snap
deleted file mode 100644
index 2f17e08bdb..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_883.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! bug.tex\n\\begin{doc\n |\n ^^^\n% Comment\"#)"
----
-[
- {
- "label": "document",
- "detail": "built-in",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_885.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_885.snap
deleted file mode 100644
index 2f286288b9..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__issue_885.snap
+++ /dev/null
@@ -1,18 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{book}\n\\usepackage{import}\n\\begin{document}\n\\subincludefrom{part 1}{main}\n\\include{part 2/main}\n\n\\ref{sec}\n |\n ^^^\n\\end{document}\n\n%! part 1/main.tex\n\\part{1}\n\\label{part 1}\n\\subimport{chapter 1}{main}\n\n%! part 1/chapter 1/main.tex\n\\chapter{1}\n\\label{chapter 1}\n\\subimport{./}{section 1}\n%\\subimport{}{section 1}\n\n%! part 1/chapter 1/section 1.tex\n\\section{1}\n\\label{section 1}\n\n%! part 2/main.tex\n\\part{2}\n\\label{part 2}\n\\input{part 2/chapter 2/main}\n\n%! part 2/chapter 2/main.tex\n\\chapter{2}\n\\label{chapter 2}\n\\input{part 2/chapter 2/section 2}\n\n%! part 2/chapter 2/section 2.tex\n\\section{2}\n\\label{section 2}\n\"#)"
----
-[
- {
- "label": "section 1",
- "detail": "Section (1)",
- "preselect": false,
- "filterText": "section 1 Section (1)"
- },
- {
- "label": "section 2",
- "detail": "Section (2)",
- "preselect": false,
- "filterText": "section 2 Section (2)"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
deleted file mode 100644
index a186c56920..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__label.snap
+++ /dev/null
@@ -1,36 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! foo.tex\n\\documentclass{article}\n\n\\usepackage{amsmath}\n\\usepackage{caption}\n\\usepackage{amsthm}\n\\newtheorem{lemma}{Lemma}\n\n\\begin{document}\n\n\\section{Foo}%\n\\label{sec:foo}\n\n\\begin{equation}%\n\\label{eq:foo}\n 1 + 1 = 2\n\\end{equation}\n\n\\begin{equation}%\n\\label{eq:bar}\n 1 + 1 = 2\n\\end{equation}\n\n\\begin{figure}%\n\\LaTeX{}\n\\caption{Baz}%\n\\label{fig:baz}\n\\end{figure}\n\n\\begin{lemma}%\n\\label{thm:foo}\n 1 + 1 = 2\n\\end{lemma}\n\n\\include{bar}\n\n\\end{document}\n\n%! bar.tex\n\\section{Bar}%\n\\label{sec:bar}\n\nLorem ipsum dolor sit amet.\n\\ref{}\n |\n\n%! foo.aux\n\\relax\n\\@writefile{lof}{\\contentsline {figure}{\\numberline {1}{\\ignorespaces Baz\\relax }}{1}\\protected@file@percent }\n\\providecommand*\\caption@xref[2]{\\@setref\\relax\\@undefined{#1}}\n\\newlabel{fig:baz}{{1}{1}}\n\\@writefile{toc}{\\contentsline {section}{\\numberline {1}Foo}{1}\\protected@file@percent }\n\\newlabel{sec:foo}{{1}{1}}\n\\newlabel{eq:foo}{{1}{1}}\n\\newlabel{eq:bar}{{2}{1}}\n\\newlabel{thm:foo}{{1}{1}}\n\\@input{bar.aux}\"#)"
----
-[
- {
- "label": "eq:bar",
- "detail": "Equation (2)",
- "preselect": false,
- "filterText": "eq:bar Equation (2)"
- },
- {
- "label": "eq:foo",
- "detail": "Equation (1)",
- "preselect": false,
- "filterText": "eq:foo Equation (1)"
- },
- {
- "label": "fig:baz",
- "detail": "Figure 1",
- "preselect": false,
- "filterText": "fig:baz Figure 1: Baz"
- },
- {
- "label": "sec:bar",
- "detail": "Section (Bar)",
- "preselect": false,
- "filterText": "sec:bar Section (Bar)"
- },
- {
- "label": "sec:foo",
- "detail": "Section 1 (Foo)",
- "preselect": false,
- "filterText": "sec:foo Section 1 (Foo)"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
deleted file mode 100644
index 351dc96deb..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_import.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\documentclass{article}\n\\import{sub}{sub/sub.tex}\n\\lipsu\n |\n ^^^^^\n\n%! sub/sub.tex\n\\input{child.tex}\n\n%! sub/child.tex\n\\usepackage{lipsum}\"#)"
----
-[
- {
- "label": "LipsumPar",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumProtect",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumRestoreAll",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsum",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsumexp",
- "detail": "lipsum.sty",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
deleted file mode 100644
index 8ddefbc6ad..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__project_resolution_texlabroot.snap
+++ /dev/null
@@ -1,31 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! src/main.tex\n\\documentclass{article}\n\\include{src/foo}\n\\lipsu\n |\n ^^^^^\n\n%! src/foo.tex\n\\include{src/bar}\n\n%! src/bar.tex\n\\usepackage{lipsum}\n\n%! .texlabroot\"#)"
----
-[
- {
- "label": "LipsumPar",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumProtect",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "LipsumRestoreAll",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsum",
- "detail": "lipsum.sty",
- "preselect": false
- },
- {
- "label": "lipsumexp",
- "detail": "lipsum.sty",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
deleted file mode 100644
index f60725667f..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_begin.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newtheorem{lemma}{Lemma}\n\\begin{lem\n |\n ^^^\"#)"
----
-[
- {
- "label": "lemma",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
deleted file mode 100644
index 0ec951db1d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__theorem_end.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\newtheorem{lemma}{Lemma}\n\\begin{}\n\\end{lem\n |\n ^^^\"#)"
----
-[
- {
- "label": "lemma",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
deleted file mode 100644
index e727fbbc1d..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_closed_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepgflibrary{}\n |\"#)"
----
-[
- {
- "label": "arrows",
- "preselect": false
- },
- {
- "label": "arrows.meta",
- "preselect": false
- },
- {
- "label": "arrows.spaced",
- "preselect": false
- },
- {
- "label": "curvilinear",
- "preselect": false
- },
- {
- "label": "datavisualization.barcharts",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
deleted file mode 100644
index 668b445c91..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__tikz_library_open_brace.snap
+++ /dev/null
@@ -1,26 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\usepgflibrary{\n |\"#)"
----
-[
- {
- "label": "arrows",
- "preselect": false
- },
- {
- "label": "arrows.meta",
- "preselect": false
- },
- {
- "label": "arrows.spaced",
- "preselect": false
- },
- {
- "label": "curvilinear",
- "preselect": false
- },
- {
- "label": "datavisualization.barcharts",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
deleted file mode 100644
index ce8c10d8e9..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_command.snap
+++ /dev/null
@@ -1,11 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\foobar\n\\fooba\n |\n ^^^^^\n\\begin{foo}\n\\end{foo}\n\\begin{fo}\"#)"
----
-[
- {
- "label": "foobar",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
deleted file mode 100644
index c46a9beb26..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__completion__user_environment.snap
+++ /dev/null
@@ -1,16 +0,0 @@
----
-source: tests/lsp/text_document/completion.rs
-expression: "complete(r#\"\n%! main.tex\n\\foobar\n\\fooba\n\\begin{foo}\n\\end{foo}\n\\begin{fo}\n |\n ^^\"#)"
----
-[
- {
- "label": "filecontents",
- "detail": "built-in",
- "preselect": false
- },
- {
- "label": "foo",
- "detail": "user-defined",
- "preselect": false
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
deleted file mode 100644
index 24e4efd8aa..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_import.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/document_link.rs
-expression: "find_links(r#\"\n%! foo.tex\n\\import{.}{bar/baz}\n|\n\n%! bar/baz.tex\"#)"
----
-[
- {
- "range": {
- "start": {
- "line": 0,
- "character": 11
- },
- "end": {
- "line": 0,
- "character": 18
- }
- },
- "target": "redacted://bar/baz.tex"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
deleted file mode 100644
index c19654b797..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_link__document_include.snap
+++ /dev/null
@@ -1,19 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/document_link.rs
-expression: "find_links(r#\"\n%! foo.tex\n\\input{bar.tex}\n|\n\n%! bar.tex\"#)"
----
-[
- {
- "range": {
- "start": {
- "line": 0,
- "character": 7
- },
- "end": {
- "line": 0,
- "character": 14
- }
- },
- "target": "redacted://bar.tex"
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__smoke.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__smoke.snap
deleted file mode 100644
index 061fc93c95..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__document_symbol__smoke.snap
+++ /dev/null
@@ -1,103 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/document_symbol.rs
-expression: symbols
----
-[
- DocumentSymbol {
- name: "Foo",
- detail: None,
- kind: Module,
- tags: None,
- deprecated: Some(
- false,
- ),
- range: Range {
- start: Position {
- line: 0,
- character: 0,
- },
- end: Position {
- line: 0,
- character: 30,
- },
- },
- selection_range: Range {
- start: Position {
- line: 0,
- character: 0,
- },
- end: Position {
- line: 0,
- character: 30,
- },
- },
- children: Some(
- [
- DocumentSymbol {
- name: "Bar",
- detail: None,
- kind: Module,
- tags: None,
- deprecated: Some(
- false,
- ),
- range: Range {
- start: Position {
- line: 0,
- character: 14,
- },
- end: Position {
- line: 0,
- character: 30,
- },
- },
- selection_range: Range {
- start: Position {
- line: 0,
- character: 14,
- },
- end: Position {
- line: 0,
- character: 30,
- },
- },
- children: Some(
- [],
- ),
- },
- ],
- ),
- },
- DocumentSymbol {
- name: "Baz",
- detail: None,
- kind: Module,
- tags: None,
- deprecated: Some(
- false,
- ),
- range: Range {
- start: Position {
- line: 0,
- character: 31,
- },
- end: Position {
- line: 0,
- character: 44,
- },
- },
- selection_range: Range {
- start: Position {
- line: 0,
- character: 31,
- },
- end: Position {
- line: 0,
- character: 44,
- },
- },
- children: Some(
- [],
- ),
- },
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
deleted file mode 100644
index b98dd68758..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_command.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = \"\\baz\",}\n|\"#)"
----
-@article{foo,
- bar = "\baz",
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
deleted file mode 100644
index a95f5d3006..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_insert_braces.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = baz,\n|\"#)"
----
-@article{foo,
- bar = baz,
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
deleted file mode 100644
index 3ea6bf18ad..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_join_strings.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = \"baz\" # \"qux\"}\n|\"#)"
----
-@article{foo,
- bar = "baz" # "qux",
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
deleted file mode 100644
index 966f133a76..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_multiple_entries.snap
+++ /dev/null
@@ -1,15 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\n\n@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\"\n|\"#)"
----
-@article{foo,
- bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
- dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
- amet, consectetur adipiscing elit.},
-}
-
-@article{foo,
- bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
- dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
- amet, consectetur adipiscing elit.},
-}"
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
deleted file mode 100644
index ca317db108..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_parens.snap
+++ /dev/null
@@ -1,6 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article(foo,)\n|\"#)"
----
-@article{foo,
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
deleted file mode 100644
index 6448e3a791..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_preamble.snap
+++ /dev/null
@@ -1,5 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@preamble{\n \"foo bar baz\" }\n|\"#)"
----
-@preamble{"foo bar baz"}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
deleted file mode 100644
index a1739290fd..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_string.snap
+++ /dev/null
@@ -1,5 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@string{foo=\"bar\"}\n|\"#)"
----
-@string{foo = "bar"}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
deleted file mode 100644
index dd5c7b49f0..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_trailing_comma.snap
+++ /dev/null
@@ -1,7 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = baz}\n|\"#)"
----
-@article{foo,
- bar = baz,
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
deleted file mode 100644
index c52b8a9317..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__formatting__bibtex_internal_wrap_long_lines.snap
+++ /dev/null
@@ -1,9 +0,0 @@
----
-source: tests/lsp/text_document/formatting.rs
-expression: "format(r#\"\n%! main.bib\n@article{foo, bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit.\nLorem ipsum dolor sit amet,\nconsectetur adipiscing elit. Lorem ipsum dolor sit amet, consectetur adipiscing elit.},}\n|\"#)"
----
-@article{foo,
- bar = {Lorem ipsum dolor sit amet, consectetur adipiscing elit. Lorem ipsum
- dolor sit amet, consectetur adipiscing elit. Lorem ipsum dolor sit
- amet, consectetur adipiscing elit.},
-}
diff --git a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap b/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
deleted file mode 100644
index 050ae5afd3..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/text_document/snapshots/lsp__text_document__inlay_hint__label_definition.snap
+++ /dev/null
@@ -1,38 +0,0 @@
----
-source: crates/texlab/tests/lsp/text_document/inlay_hint.rs
-expression: "find_hints(r#\"\n%! main.tex\n\\documentclass{article}\n\\usepackage{caption}\n\\begin{document}\n\\section{Foo}\\label{sec:foo}\n\\section{Bar}\\label{sec:bar}\n\\subsection{Baz}\\label{sec:baz}\n\\begin{figure}\n Test\n \\label{fig:qux}\n \\caption{Qux}\n\\end{figure}\n\\end{document}\n |\n\n%! main.aux\n\\relax \n\\providecommand*\\caption@xref[2]{\\@setref\\relax\\@undefined{#1}}\n\\newlabel{fig:qux}{{\\caption@xref {fig:qux}{ on input line 15}}{1}}\n\\@writefile{lof}{\\contentsline {figure}{\\numberline {1}{\\ignorespaces Qux\\relax }}{1}{}\\protected@file@percent }\n\\@writefile{toc}{\\contentsline {section}{\\numberline {1}Foo}{1}{}\\protected@file@percent }\n\\newlabel{sec:foo}{{1}{1}}\n\\@writefile{toc}{\\contentsline {section}{\\numberline {2}Bar}{1}{}\\protected@file@percent }\n\\newlabel{sec:bar}{{2}{1}}\n\\@writefile{toc}{\\contentsline {subsection}{\\numberline {2.1}Baz}{1}{}\\protected@file@percent }\n\\newlabel{sec:baz}{{2.1}{1}}\n\\gdef \\@abspage@last{1}\"#)"
----
-[
- {
- "position": {
- "line": 3,
- "character": 28
- },
- "label": " Section 1 ",
- "paddingLeft": true
- },
- {
- "position": {
- "line": 4,
- "character": 28
- },
- "label": " Section 2 ",
- "paddingLeft": true
- },
- {
- "position": {
- "line": 5,
- "character": 31
- },
- "label": " Subsection 2.1 ",
- "paddingLeft": true
- },
- {
- "position": {
- "line": 8,
- "character": 19
- },
- "label": " Figure fig:qux ",
- "paddingLeft": true
- }
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/workspace.rs b/support/texlab/crates/texlab/tests/lsp/workspace.rs
deleted file mode 100644
index 15e0679dea..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/workspace.rs
+++ /dev/null
@@ -1 +0,0 @@
-mod symbol;
diff --git a/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__smoke.snap b/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__smoke.snap
deleted file mode 100644
index 20c012bec9..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/workspace/snapshots/lsp__workspace__symbol__smoke.snap
+++ /dev/null
@@ -1,78 +0,0 @@
----
-source: crates/texlab/tests/lsp/workspace/symbol.rs
-expression: symbols
----
-[
- SymbolInformation {
- name: "Foo",
- kind: Module,
- tags: None,
- deprecated: Some(
- false,
- ),
- location: Location {
- uri: Url {
- scheme: "redacted",
- cannot_be_a_base: false,
- username: "",
- password: None,
- host: Some(
- Domain(
- "main.tex",
- ),
- ),
- port: None,
- path: "",
- query: None,
- fragment: None,
- },
- range: Range {
- start: Position {
- line: 7,
- character: 0,
- },
- end: Position {
- line: 8,
- character: 3,
- },
- },
- },
- container_name: None,
- },
- SymbolInformation {
- name: "Bar",
- kind: Module,
- tags: None,
- deprecated: Some(
- false,
- ),
- location: Location {
- uri: Url {
- scheme: "redacted",
- cannot_be_a_base: false,
- username: "",
- password: None,
- host: Some(
- Domain(
- "main.tex",
- ),
- ),
- port: None,
- path: "",
- query: None,
- fragment: None,
- },
- range: Range {
- start: Position {
- line: 10,
- character: 0,
- },
- end: Position {
- line: 11,
- character: 3,
- },
- },
- },
- container_name: None,
- },
-]
diff --git a/support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs b/support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
deleted file mode 100644
index 8deae20a44..0000000000
--- a/support/texlab/crates/texlab/tests/lsp/workspace/symbol.rs
+++ /dev/null
@@ -1,48 +0,0 @@
-use insta::assert_debug_snapshot;
-use lsp_types::{
- request::WorkspaceSymbolRequest, ClientCapabilities, WorkspaceSymbolParams,
- WorkspaceSymbolResponse,
-};
-
-use crate::fixture::TestBed;
-
-#[test]
-fn test_smoke() {
- let test_bed = TestBed::new(
- r#"
-%! main.tex
-\documentclass{article}
-\usepackage{caption}
-\usepackage{amsmath}
-\usepackage{amsthm}
-
-\begin{document}
-
-\section{Foo}\label{sec:foo}
-Foo
-
-\section{Bar}
-Bar
-
-\end{document}
-"#,
- )
- .unwrap();
-
- test_bed.initialize(ClientCapabilities::default()).unwrap();
-
- let Some(WorkspaceSymbolResponse::Flat(mut symbols)) = test_bed
- .client()
- .send_request::<WorkspaceSymbolRequest>(WorkspaceSymbolParams {
- query: String::new(),
- work_done_progress_params: Default::default(),
- partial_result_params: Default::default(),
- })
- .unwrap() else { unreachable!() };
-
- for symbol in &mut symbols {
- symbol.location.uri = test_bed.redact(&symbol.location.uri);
- }
-
- assert_debug_snapshot!(symbols);
-}
diff --git a/support/texlab/texlab.1 b/support/texlab/texlab.1
index 23418dce4c..18919ec9a3 100644
--- a/support/texlab/texlab.1
+++ b/support/texlab/texlab.1
@@ -1,7 +1,7 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.13.
-.TH TEXLAB "1" "November 2023" "texlab 5.11.0" "User Commands"
+.TH TEXLAB "1" "December 2023" "texlab 5.12.0" "User Commands"
.SH NAME
-texlab \- manual page for texlab 5.11.0
+texlab \- manual page for texlab 5.12.0
.SH SYNOPSIS
.B texlab
[\fI\,OPTIONS\/\fR]
diff --git a/support/texlab/texlab.pdf b/support/texlab/texlab.pdf
index d989a13e2e..ac225c8f02 100644
--- a/support/texlab/texlab.pdf
+++ b/support/texlab/texlab.pdf
Binary files differ