From 3cc441d9d802ac7fcc0ede2a66bac76362635f30 Mon Sep 17 00:00:00 2001 From: hydroper Date: Thu, 2 May 2024 11:38:38 +0000 Subject: [PATCH] Automated report --- .github/workflows/demo.yml | 41 - .gitignore | 1 - Cargo.lock | 639 -- Cargo.toml | 8 - LICENSE | 202 - README.md | 44 - as3/promise/AggregateError.as | 10 - as3/promise/Promise.as | 354 -- as3/promise/PromiseHandler.as | 16 - crates/parser/Cargo.toml | 34 - crates/parser/README.md | 3 - crates/parser/compilation_unit.rs | 8 - crates/parser/compilation_unit/comment.rs | 59 - .../compilation_unit/compilation_unit.rs | 245 - crates/parser/compilation_unit/location.rs | 176 - crates/parser/diagnostics.rs | 6 - crates/parser/diagnostics/diagnostic_kind.rs | 76 - crates/parser/diagnostics/diagnostics.rs | 175 - .../diagnostics_english_resources.rs | 75 - crates/parser/lib.rs | 11 - crates/parser/ns.rs | 8 - crates/parser/operator.rs | 6 - crates/parser/operator/operator.rs | 127 - crates/parser/operator/operator_precedence.rs | 77 - crates/parser/parser.rs | 23 - crates/parser/parser/character_validator.rs | 147 - crates/parser/parser/context.rs | 174 - crates/parser/parser/css_parser.rs | 847 --- crates/parser/parser/css_tokenizer.rs | 434 -- crates/parser/parser/parser.rs | 5364 ----------------- crates/parser/parser/parser_error.rs | 20 - crates/parser/parser/reserved_word.rs | 110 - crates/parser/parser/token.rs | 470 -- crates/parser/parser/tokenizer.rs | 1305 ---- crates/parser/tree.rs | 161 - crates/parser/tree/array_literal.rs | 18 - crates/parser/tree/asdoc.rs | 52 - crates/parser/tree/assignment_expression.rs | 14 - crates/parser/tree/attributes.rs | 170 - crates/parser/tree/binary_expression.rs | 10 - crates/parser/tree/block.rs | 9 - crates/parser/tree/boolean_literal.rs | 8 - crates/parser/tree/break_statement.rs | 8 - crates/parser/tree/call_expression.rs | 9 - crates/parser/tree/class_definition.rs | 14 - .../parser/tree/computed_member_expression.rs | 12 - crates/parser/tree/conditional_expression.rs | 10 - crates/parser/tree/configuration_directive.rs | 33 - crates/parser/tree/continue_statement.rs | 8 - crates/parser/tree/css.rs | 471 -- .../tree/default_xml_namespace_statement.rs | 8 - crates/parser/tree/descendants_expression.rs | 9 - crates/parser/tree/destructuring.rs | 9 - crates/parser/tree/directive.rs | 78 - crates/parser/tree/do_statement.rs | 10 - crates/parser/tree/empty_statement.rs | 7 - crates/parser/tree/enum_definition.rs | 13 - crates/parser/tree/expression.rs | 276 - crates/parser/tree/expression_statement.rs | 8 - .../tree/expression_with_type_arguments.rs | 10 - crates/parser/tree/filter_expression.rs | 10 - crates/parser/tree/for_statement.rs | 32 - crates/parser/tree/function_definition.rs | 111 - crates/parser/tree/function_expression.rs | 9 - crates/parser/tree/if_statement.rs | 10 - crates/parser/tree/import_directive.rs | 25 - crates/parser/tree/import_meta.rs | 8 - crates/parser/tree/include_directive.rs | 12 - crates/parser/tree/interface_definition.rs | 13 - crates/parser/tree/invalidated_node.rs | 8 - crates/parser/tree/labeled_statement.rs | 9 - crates/parser/tree/member_expression.rs | 9 - crates/parser/tree/mxml.rs | 186 - crates/parser/tree/namespace_definition.rs | 11 - crates/parser/tree/new_expression.rs | 9 - .../tree/normal_configuration_directive.rs | 13 - crates/parser/tree/null_literal.rs | 7 - crates/parser/tree/numeric_literal.rs | 157 - crates/parser/tree/object_initializer.rs | 63 - .../tree/optional_chaining_expression.rs | 21 - crates/parser/tree/package_definition.rs | 10 - crates/parser/tree/paren_expression.rs | 8 - crates/parser/tree/program.rs | 9 - crates/parser/tree/qualified_identifier.rs | 49 - crates/parser/tree/regexp_literal.rs | 9 - .../tree/reserved_namespace_expression.rs | 41 - crates/parser/tree/return_statement.rs | 8 - crates/parser/tree/sequence_expression.rs | 10 - crates/parser/tree/string_literal.rs | 8 - crates/parser/tree/super_expression.rs | 18 - crates/parser/tree/super_statement.rs | 8 - crates/parser/tree/switch_statement.rs | 46 - crates/parser/tree/this_literal.rs | 7 - crates/parser/tree/throw_statement.rs | 8 - crates/parser/tree/tree_semantics.rs | 228 - crates/parser/tree/try_statement.rs | 23 - crates/parser/tree/type_definition.rs | 11 - crates/parser/tree/type_expression.rs | 56 - crates/parser/tree/type_parameter.rs | 9 - crates/parser/tree/unary_expression.rs | 9 - crates/parser/tree/use_namespace_directive.rs | 8 - crates/parser/tree/variable_definition.rs | 36 - crates/parser/tree/vector_literal.rs | 9 - crates/parser/tree/while_statement.rs | 9 - crates/parser/tree/with_statement.rs | 9 - crates/parser/tree/xml_expression.rs | 57 - crates/parser/util.rs | 36 - crates/parser/util/arena.rs | 19 - crates/parser/util/character_reader.rs | 138 - crates/parser/util/css.rs | 163 - crates/parser/util/escaping.rs | 11 - crates/parser_test/Cargo.toml | 23 - crates/parser_test/main.rs | 62 - demo/Cargo.toml | 18 - demo/dist/as3_parser_demo.d.ts | 40 + demo/dist/as3_parser_demo.js | 199 + demo/dist/as3_parser_demo_bg.wasm | Bin 0 -> 2496903 bytes demo/dist/as3_parser_demo_bg.wasm.d.ts | 8 + demo/src/lib.rs | 58 - docs/attaching-meaning.md | 25 - docs/building-a-compiler.md | 33 - docs/compilers/ide.md | 5 - docs/compilers/special-cases.md | 116 - docs/diagnostics.md | 81 - docs/getting-started.md | 55 - docs/locations.md | 38 - docs/new-syntax.md | 292 - docs/processing-deviations.md | 7 - docs/references.md | 15 - docs/verifier/Type.md | 28 - docs/verifier/Type/kinds/any-type.md | 19 - docs/verifier/Type/kinds/class-type.md | 161 - docs/verifier/Type/kinds/enum-type.md | 86 - docs/verifier/Type/kinds/function-type.md | 27 - docs/verifier/Type/kinds/interface-type.md | 104 - docs/verifier/Type/kinds/name.md | 28 - docs/verifier/Type/kinds/namespace-set.md | 13 - docs/verifier/Type/kinds/namespace.md | 67 - docs/verifier/Type/kinds/never-type.md | 19 - docs/verifier/Type/kinds/package.md | 119 - docs/verifier/Type/kinds/undefined-type.md | 23 - docs/verifier/Type/kinds/void-type.md | 23 - docs/verifier/TypeHost.md | 3 - docs/verifier/vector.md | 18 - docs/working-with-css.md | 22 - docs/working-with-mxml.md | 44 - examples/asdoc/.gitignore | 1 - examples/asdoc/Cargo.toml | 11 - examples/asdoc/Example.as | 10 - examples/asdoc/example.rs | 61 - tests/parser/ASDoc.as | 24 - tests/parser/ASDoc.diag | 0 tests/parser/ASDoc.tree | 235 - tests/parser/Attributes.as | 17 - tests/parser/Attributes.diag | 0 tests/parser/Attributes.tree | 293 - tests/parser/Configuration.as | 21 - tests/parser/Configuration.diag | 0 tests/parser/Configuration.tree | 386 -- tests/parser/E4X.as | 18 - tests/parser/E4X.diag | 0 tests/parser/E4X.tree | 324 - tests/parser/MXML1.diag | 0 tests/parser/MXML1.mxml | 16 - tests/parser/MXML1.tree | 215 - tests/parser/MXML2.diag | 0 tests/parser/MXML2.mxml | 4 - tests/parser/MXML2.tree | 38 - tests/parser/Misc.as | 19 - tests/parser/Misc.diag | 0 tests/parser/Misc.tree | 341 -- tests/parser/Qualifier.as | 9 - tests/parser/Qualifier.diag | 0 tests/parser/Qualifier.tree | 351 -- tests/parser/README.md | 17 - tests/parser/Super.as | 12 - tests/parser/Super.diag | 1 - tests/parser/Super.tree | 215 - tests/parser/css/mediaQuery.css | 5 - tests/parser/css/mediaQuery.diag | 0 tests/parser/css/mediaQuery.tree | 92 - tests/parser/css/selectors.css | 9 - tests/parser/css/selectors.diag | 0 tests/parser/css/selectors.tree | 200 - 184 files changed, 247 insertions(+), 19100 deletions(-) delete mode 100644 .github/workflows/demo.yml delete mode 100644 .gitignore delete mode 100644 Cargo.lock delete mode 100644 Cargo.toml delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 as3/promise/AggregateError.as delete mode 100644 as3/promise/Promise.as delete mode 100644 as3/promise/PromiseHandler.as delete mode 100644 crates/parser/Cargo.toml delete mode 100644 crates/parser/README.md delete mode 100644 crates/parser/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/comment.rs delete mode 100644 crates/parser/compilation_unit/compilation_unit.rs delete mode 100644 crates/parser/compilation_unit/location.rs delete mode 100644 crates/parser/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostic_kind.rs delete mode 100644 crates/parser/diagnostics/diagnostics.rs delete mode 100644 crates/parser/diagnostics/diagnostics_english_resources.rs delete mode 100644 crates/parser/lib.rs delete mode 100644 crates/parser/ns.rs delete mode 100644 crates/parser/operator.rs delete mode 100644 crates/parser/operator/operator.rs delete mode 100644 crates/parser/operator/operator_precedence.rs delete mode 100644 crates/parser/parser.rs delete mode 100644 crates/parser/parser/character_validator.rs delete mode 100644 crates/parser/parser/context.rs delete mode 100644 crates/parser/parser/css_parser.rs delete mode 100644 crates/parser/parser/css_tokenizer.rs delete mode 100644 crates/parser/parser/parser.rs delete mode 100644 crates/parser/parser/parser_error.rs delete mode 100644 crates/parser/parser/reserved_word.rs delete mode 100644 crates/parser/parser/token.rs delete mode 100644 crates/parser/parser/tokenizer.rs delete mode 100644 crates/parser/tree.rs delete mode 100644 crates/parser/tree/array_literal.rs delete mode 100644 crates/parser/tree/asdoc.rs delete mode 100644 crates/parser/tree/assignment_expression.rs delete mode 100644 crates/parser/tree/attributes.rs delete mode 100644 crates/parser/tree/binary_expression.rs delete mode 100644 crates/parser/tree/block.rs delete mode 100644 crates/parser/tree/boolean_literal.rs delete mode 100644 crates/parser/tree/break_statement.rs delete mode 100644 crates/parser/tree/call_expression.rs delete mode 100644 crates/parser/tree/class_definition.rs delete mode 100644 crates/parser/tree/computed_member_expression.rs delete mode 100644 crates/parser/tree/conditional_expression.rs delete mode 100644 crates/parser/tree/configuration_directive.rs delete mode 100644 crates/parser/tree/continue_statement.rs delete mode 100644 crates/parser/tree/css.rs delete mode 100644 crates/parser/tree/default_xml_namespace_statement.rs delete mode 100644 crates/parser/tree/descendants_expression.rs delete mode 100644 crates/parser/tree/destructuring.rs delete mode 100644 crates/parser/tree/directive.rs delete mode 100644 crates/parser/tree/do_statement.rs delete mode 100644 crates/parser/tree/empty_statement.rs delete mode 100644 crates/parser/tree/enum_definition.rs delete mode 100644 crates/parser/tree/expression.rs delete mode 100644 crates/parser/tree/expression_statement.rs delete mode 100644 crates/parser/tree/expression_with_type_arguments.rs delete mode 100644 crates/parser/tree/filter_expression.rs delete mode 100644 crates/parser/tree/for_statement.rs delete mode 100644 crates/parser/tree/function_definition.rs delete mode 100644 crates/parser/tree/function_expression.rs delete mode 100644 crates/parser/tree/if_statement.rs delete mode 100644 crates/parser/tree/import_directive.rs delete mode 100644 crates/parser/tree/import_meta.rs delete mode 100644 crates/parser/tree/include_directive.rs delete mode 100644 crates/parser/tree/interface_definition.rs delete mode 100644 crates/parser/tree/invalidated_node.rs delete mode 100644 crates/parser/tree/labeled_statement.rs delete mode 100644 crates/parser/tree/member_expression.rs delete mode 100644 crates/parser/tree/mxml.rs delete mode 100644 crates/parser/tree/namespace_definition.rs delete mode 100644 crates/parser/tree/new_expression.rs delete mode 100644 crates/parser/tree/normal_configuration_directive.rs delete mode 100644 crates/parser/tree/null_literal.rs delete mode 100644 crates/parser/tree/numeric_literal.rs delete mode 100644 crates/parser/tree/object_initializer.rs delete mode 100644 crates/parser/tree/optional_chaining_expression.rs delete mode 100644 crates/parser/tree/package_definition.rs delete mode 100644 crates/parser/tree/paren_expression.rs delete mode 100644 crates/parser/tree/program.rs delete mode 100644 crates/parser/tree/qualified_identifier.rs delete mode 100644 crates/parser/tree/regexp_literal.rs delete mode 100644 crates/parser/tree/reserved_namespace_expression.rs delete mode 100644 crates/parser/tree/return_statement.rs delete mode 100644 crates/parser/tree/sequence_expression.rs delete mode 100644 crates/parser/tree/string_literal.rs delete mode 100644 crates/parser/tree/super_expression.rs delete mode 100644 crates/parser/tree/super_statement.rs delete mode 100644 crates/parser/tree/switch_statement.rs delete mode 100644 crates/parser/tree/this_literal.rs delete mode 100644 crates/parser/tree/throw_statement.rs delete mode 100644 crates/parser/tree/tree_semantics.rs delete mode 100644 crates/parser/tree/try_statement.rs delete mode 100644 crates/parser/tree/type_definition.rs delete mode 100644 crates/parser/tree/type_expression.rs delete mode 100644 crates/parser/tree/type_parameter.rs delete mode 100644 crates/parser/tree/unary_expression.rs delete mode 100644 crates/parser/tree/use_namespace_directive.rs delete mode 100644 crates/parser/tree/variable_definition.rs delete mode 100644 crates/parser/tree/vector_literal.rs delete mode 100644 crates/parser/tree/while_statement.rs delete mode 100644 crates/parser/tree/with_statement.rs delete mode 100644 crates/parser/tree/xml_expression.rs delete mode 100644 crates/parser/util.rs delete mode 100644 crates/parser/util/arena.rs delete mode 100644 crates/parser/util/character_reader.rs delete mode 100644 crates/parser/util/css.rs delete mode 100644 crates/parser/util/escaping.rs delete mode 100644 crates/parser_test/Cargo.toml delete mode 100644 crates/parser_test/main.rs delete mode 100644 demo/Cargo.toml create mode 100644 demo/dist/as3_parser_demo.d.ts create mode 100644 demo/dist/as3_parser_demo.js create mode 100644 demo/dist/as3_parser_demo_bg.wasm create mode 100644 demo/dist/as3_parser_demo_bg.wasm.d.ts delete mode 100644 demo/src/lib.rs delete mode 100644 docs/attaching-meaning.md delete mode 100644 docs/building-a-compiler.md delete mode 100644 docs/compilers/ide.md delete mode 100644 docs/compilers/special-cases.md delete mode 100644 docs/diagnostics.md delete mode 100644 docs/getting-started.md delete mode 100644 docs/locations.md delete mode 100644 docs/new-syntax.md delete mode 100644 docs/processing-deviations.md delete mode 100644 docs/references.md delete mode 100644 docs/verifier/Type.md delete mode 100644 docs/verifier/Type/kinds/any-type.md delete mode 100644 docs/verifier/Type/kinds/class-type.md delete mode 100644 docs/verifier/Type/kinds/enum-type.md delete mode 100644 docs/verifier/Type/kinds/function-type.md delete mode 100644 docs/verifier/Type/kinds/interface-type.md delete mode 100644 docs/verifier/Type/kinds/name.md delete mode 100644 docs/verifier/Type/kinds/namespace-set.md delete mode 100644 docs/verifier/Type/kinds/namespace.md delete mode 100644 docs/verifier/Type/kinds/never-type.md delete mode 100644 docs/verifier/Type/kinds/package.md delete mode 100644 docs/verifier/Type/kinds/undefined-type.md delete mode 100644 docs/verifier/Type/kinds/void-type.md delete mode 100644 docs/verifier/TypeHost.md delete mode 100644 docs/verifier/vector.md delete mode 100644 docs/working-with-css.md delete mode 100644 docs/working-with-mxml.md delete mode 100644 examples/asdoc/.gitignore delete mode 100644 examples/asdoc/Cargo.toml delete mode 100644 examples/asdoc/Example.as delete mode 100644 examples/asdoc/example.rs delete mode 100644 tests/parser/ASDoc.as delete mode 100644 tests/parser/ASDoc.diag delete mode 100644 tests/parser/ASDoc.tree delete mode 100644 tests/parser/Attributes.as delete mode 100644 tests/parser/Attributes.diag delete mode 100644 tests/parser/Attributes.tree delete mode 100644 tests/parser/Configuration.as delete mode 100644 tests/parser/Configuration.diag delete mode 100644 tests/parser/Configuration.tree delete mode 100644 tests/parser/E4X.as delete mode 100644 tests/parser/E4X.diag delete mode 100644 tests/parser/E4X.tree delete mode 100644 tests/parser/MXML1.diag delete mode 100644 tests/parser/MXML1.mxml delete mode 100644 tests/parser/MXML1.tree delete mode 100644 tests/parser/MXML2.diag delete mode 100644 tests/parser/MXML2.mxml delete mode 100644 tests/parser/MXML2.tree delete mode 100644 tests/parser/Misc.as delete mode 100644 tests/parser/Misc.diag delete mode 100644 tests/parser/Misc.tree delete mode 100644 tests/parser/Qualifier.as delete mode 100644 tests/parser/Qualifier.diag delete mode 100644 tests/parser/Qualifier.tree delete mode 100644 tests/parser/README.md delete mode 100644 tests/parser/Super.as delete mode 100644 tests/parser/Super.diag delete mode 100644 tests/parser/Super.tree delete mode 100644 tests/parser/css/mediaQuery.css delete mode 100644 tests/parser/css/mediaQuery.diag delete mode 100644 tests/parser/css/mediaQuery.tree delete mode 100644 tests/parser/css/selectors.css delete mode 100644 tests/parser/css/selectors.diag delete mode 100644 tests/parser/css/selectors.tree diff --git a/.github/workflows/demo.yml b/.github/workflows/demo.yml deleted file mode 100644 index cad5473..0000000 --- a/.github/workflows/demo.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Demo - -on: - push: - branches: [ "master" ] - pull_request: - branches: [ "master" ] - -permissions: - contents: write - -env: - CARGO_TERM_COLOR: always - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - name: Use nightly Rust - run: rustup default nightly - - name: Add wasm32 target - run: rustup target add wasm32-unknown-unknown - - name: Install wasm-bindgen CLI - run: cargo install wasm-bindgen-cli - - name: Build demo - run: cargo build -p as3_parser_demo --release --target wasm32-unknown-unknown - - name: Update demo/dist - run: wasm-bindgen --target web --out-dir demo/dist target/wasm32-unknown-unknown/release/as3_parser_demo.wasm - - name: Git commit report - run: | - git config --global user.name 'hydroper' - git config --global user.email 'matheusdiasdesouzads@gmail.com' - git switch -C demo - git rm --cached -r . - git add demo - git rm --cached -r demo/src - git rm --cached demo/Cargo.toml - git commit -m "Automated report" - git push origin -f demo diff --git a/.gitignore b/.gitignore deleted file mode 100644 index c41cc9e..0000000 --- a/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 5ad4372..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,639 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "anstream" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys", -] - -[[package]] -name = "anyhow" -version = "1.0.82" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" - -[[package]] -name = "as3_parser" -version = "1.0.7" -dependencies = [ - "bitflags", - "by_address", - "bytes", - "conv", - "file_paths", - "htmlentity", - "hydroper_source_text", - "late_format", - "lazy-regex", - "lazy_static", - "maplit", - "num-bigint", - "num-derive", - "num-traits", - "serde", - "serde_json", - "unicode-general-category", -] - -[[package]] -name = "as3_parser_demo" -version = "0.1.0" -dependencies = [ - "as3_parser", - "maplit", - "serde", - "serde_json", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "as3_parser_test" -version = "0.4.0" -dependencies = [ - "as3_parser", - "clap", - "file_paths", - "maplit", - "serde", - "serde_json", -] - -[[package]] -name = "asdoc-example" -version = "0.1.0" -dependencies = [ - "as3_parser", -] - -[[package]] -name = "autocfg" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" -dependencies = [ - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "clap" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528131438037fd55894f62d6e9f068b8f45ac57ffa77517819645d10aed04f64" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "conv" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ff10625fd0ac447827aa30ea8b861fead473bb60aeb73af6c1c58caf0d1299" -dependencies = [ - "custom_derive", -] - -[[package]] -name = "custom_derive" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" - -[[package]] -name = "file_paths" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6655a548f719048f152b0349acf5f1b0fa7ce430acb49d4afc1d42513f160549" -dependencies = [ - "lazy-regex", -] - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "htmlentity" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab11d4e4796b618b77cabd8f0729eb8033891609820303af715e9306dbb95cd" -dependencies = [ - "anyhow", - "lazy_static", - "thiserror", -] - -[[package]] -name = "hydroper_source_text" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cce3d21a188729674efc26164f9a201d567ab2fe28b6789cb802d7ca66ee7aaf" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "late_format" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20a4c2785e13b46810cdd5b6df71b2bbacd6195d18d37b99098c6f52631dc6d" -dependencies = [ - "lazy-regex", - "maplit", -] - -[[package]] -name = "lazy-regex" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d12be4595afdf58bd19e4a9f4e24187da2a66700786ff660a418e9059937a4c" -dependencies = [ - "lazy-regex-proc_macros", - "once_cell", - "regex", -] - -[[package]] -name = "lazy-regex-proc_macros" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bcd58e6c97a7fcbaffcdc95728b393b8d98933bfadad49ed4097845b57ef0b" -dependencies = [ - "proc-macro2", - "quote", - "regex", - "syn", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "proc-macro2" -version = "1.0.79" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "ryu" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" - -[[package]] -name = "serde" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.197" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.115" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12dc5c46daa8e9fdf4f5e71b6cf9a53f2487da0e86e55808e2d35539666497dd" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "syn" -version = "2.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "thiserror" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "unicode-general-category" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2281c8c1d221438e373249e065ca4989c4c36952c211ff21a0ee91c44a3869e7" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" -dependencies = [ - "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.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index d173730..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[workspace] -members = [ - "crates/parser", - "crates/parser_test", - "demo", - "examples/asdoc", -] -resolver = "2" \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 9820eb1..0000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2024 Hydroper - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 22fe4ef..0000000 --- a/README.md +++ /dev/null @@ -1,44 +0,0 @@ -# ActionScript 3 Parser - -

- - - - - - -

- -ActionScript 3 parser in the Rust language. - -[Online demo](https://hydroper.github.io/as3parser/demo) - -## Documentation - -[Getting started](docs/getting-started.md) - -[Working with Diagnostics](docs/diagnostics.md) - -[Working with Locations](docs/locations.md) - -[Working with MXML](docs/working-with-mxml.md) - -[Working with CSS](docs/working-with-css.md) - -[Attaching Meaning](docs/attaching-meaning.md) - -[Reference Documents](docs/references.md) - -[New Syntax](docs/new-syntax.md) - -[Processing Deviations](docs/processing-deviations.md) - -[Building a Compiler](docs/building-a-compiler.md) - -## Wiki - -The [wiki](https://github.com/hydroper/as3parser/wiki) of this repository contains other introductory articles. - -## License - -Apache License 2.0, copyright 2024 Hydroper diff --git a/as3/promise/AggregateError.as b/as3/promise/AggregateError.as deleted file mode 100644 index c09f54c..0000000 --- a/as3/promise/AggregateError.as +++ /dev/null @@ -1,10 +0,0 @@ -package { - public class AggregateError extends Error { - public var errors: Array; - - public function AggregateError(errors: Array, message: String = "") { - super(message); - this.errors = errors.slice(0); - } - } -} \ No newline at end of file diff --git a/as3/promise/Promise.as b/as3/promise/Promise.as deleted file mode 100644 index 147b551..0000000 --- a/as3/promise/Promise.as +++ /dev/null @@ -1,354 +0,0 @@ -package { - import flash.utils.setTimeout; - import __AS3__.promise.*; - - /** - * The Promise object represents the eventual completion (or failure) - * of an asynchronous operation and its resulting value. - * - * For more information, consult [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * # Examples - * - * ``` - * const promise = new Promise.<*>(function(resolve: Function, reject: Function): void { - * // - * }); - * - * promise - * .then(function(): * {}) - * .catch(function(error: *): * {}) - * .finally(function(): void {}); - * ``` - */ - public final class Promise. { - // Implementation based on - // https://github.com/taylorhakes/promise-polyfill - - private var m_state:Number = 0; - private var m_handled:Boolean = false; - private var m_value:* = undefined; - private var m_deferreds:Vector. = new Vector.; - - private static function bindFunction(fn:Function, thisArg:*):Function { - return function(...argumentsList):void { - fn.apply(thisArg, argumentsList); - }; - } - - public function Promise(fn: Function) { - doResolve(fn, this); - } - - private static function handle(self:Promise., deferred:PromiseHandler):void { - while (self.m_state === 3) { - self = self.m_value; - } - if (self.m_state === 0) { - self.m_deferreds.push(deferred); - return; - } - self.m_handled = true; - Promise.._immediateFn(function():void { - var cb:Function = self.m_state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self.m_state === 1 ? Promise..privateResolve : Promise..privateReject)(deferred.promise, self.m_value); - return; - } - var ret:* = undefined; - try { - ret = cb(self.m_value); - } - catch (e:*) { - Promise..privateReject(deferred.promise, e); - return; - } - Promise..privateResolve(deferred.promise, ret); - }); - } - - private static function privateResolve(self:Promise., newValue:*):void { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) { - throw new TypeError('A promise cannot be resolved with itself.'); - } - if (newValue is Promise) { - self.m_state = 3; - self.m_value = newValue; - Promise..finale(self); - return; - } - self.m_state = 1; - self.m_value = newValue; - Promise..finale(self); - } - catch (e:*) { - Promise..privateReject(self, e); - } - } - - private static function privateReject(self:Promise., newValue:*):void { - self.m_state = 2; - self.m_value = newValue; - Promise..finale(self); - } - - private static function finale(self:Promise.):void { - if (self.m_state === 2 && self.m_deferreds.length === 0) { - Promise.._immediateFn(function():void { - if (!self.m_handled) { - Promise.._unhandledRejectionFn(self.m_value); - } - }); - } - - for (var i:Number = 0, len:Number = self.m_deferreds.length; i < len; i++) { - handle(self, self.m_deferreds[i]); - } - self.m_deferreds = null; - } - - /** - * Takes a potentially misbehaving resolver function and make sure - * `onFulfilled` and `onRejected` are only called once. - * - * Makes no guarantees about asynchrony. - */ - private static function doResolve(fn:Function, self:Promise.):void { - var done:Boolean = false; - try { - fn( - function(value:*):* { - if (done) return; - done = true; - Promise..privateResolve(self, value); - }, - function(reason:*):* { - if (done) return; - done = true; - Promise..privateReject(self, reason); - } - ); - } - catch (ex:*) { - if (done) return; - done = true; - Promise..privateReject(self, ex); - } - } - - /** - * The `Promise.allSettled()` static method takes an iterable of promises - * as input and returns a single Promise. - * This returned promise fulfills when all of the input's promises settle - * (including when an empty iterable is passed), with an array of objects that - * describe the outcome of each promise. - * - * # Example - * - * ``` - * const promise1 = Promise..resolve(3); - * const promise2 = new Promise.(function(resolve: Function, reject: Function): void { - * setTimeout(reject, 100, "foo"); - * }); - * Promise..allSettled([promise1, promise2]) - * .then(function(results: Array): void { - * for each (const result in results) { - * trace(result.status); - * } - * }); - * // Expected output: - * // "fulfilled" - * // "rejected" - * ``` - * - * @return A `Promise` that is: - * - * - **Already fulfilled,** if the iterable passed is empty. - * - **Asynchronously fulfilled,** when all promises in the given - * iterable have settled (either fulfilled or rejected). - * The fulfillment value is an array of objects, each describing the - * outcome of one promise in the iterable, in the order of the promises passed, - * regardless of completion order. Each outcome object has the following properties: - * - `status`: A string, either `"fulfilled"` or `"rejected"`, indicating the eventual state of the promise. - * - `value`: Only present if `status` is `"fulfilled"`. The value that the promise was fulfilled with. - * - `reason`: Only present if `status` is `"rejected"`. The reason that the promise was rejected with. - * - * If the iterable passed is non-empty but contains no pending promises, - * the returned promise is still asynchronously (instead of synchronously) fulfilled. - */ - public static function allSettled(promises: Array): Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - function res(i:Number, val:*):void { - if (val is Promise) { - Promise(val).then( - function(val:*):* { - res(i, val); - }, - function(e:*):* { - args[i] = { status: 'rejected', reason: e }; - if (--remaining === 0) { - resolve(args); - } - } - ); - return; - } - args[i] = { status: 'fulfilled', value: val }; - if (--remaining === 0) { - resolve(args); - } - } - for (var i:Number = 0; i < args.length; ++i) { - res(i, args[i]); - } - }); - } // allSettled - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any) - */ - public static function any(promises:Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - reject(undefined); - return; - } - var rejectionReasons:Array = []; - for (var i:Number = 0; i < args.length; ++i) { - try { - Promise..resolve(args[i]) - .then(resolve) - .catch(function(error:*):* { - rejectionReasons.push(error); - if (rejectionReasons.length === args.length) { - reject( - new AggregateError( - rejectionReasons, - 'All promises were rejected' - ) - ); - } - }); - } - catch (ex:*) { - reject(ex); - } - } - }); - } // any - - public function finally(callback:Function):Promise. { - return this.then( - function(value:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return value; - }); - }, - function(reason:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return Promise..reject(reason); - }); - } - ); - } - - public function catch(onRejected: Function):Promise. { - return this.then(null, onRejected); - } - - public function then(onFulfilled: function(T): U, onRejected: function(*): E = null):Promise.<*> { - var prom = new Promise.<*>(function(_a:*, _b:*):void {}); - Promise..handle(this, new PromiseHandler(onFulfilled, onRejected, prom)); - return prom; - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) - */ - public static function all(promises: Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - - function res(i:Number, val:*):void { - try { - if (val is Promise) { - Promise(val).then( - function(val): * { - res(i, val); - }, - reject - ); - return; - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } - catch (ex:*) { - reject(ex); - } - } - - for (var i:Number = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - } // all - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve) - */ - public static function resolve(value: *):Promise. { - if (value is Promise) { - return Promise.(value); - } - - return new Promise.(function(resolve: Function, reject: Function): void { - resolve(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject) - */ - public static function reject(value: *): Promise. { - return new Promise(function(resolve: Function, reject: Function): void { - reject(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race) - */ - public static function race(promises:Array):Promise. { - return new Promise.(function(resolve:Function, reject:Function):void { - for each (var arg:* in promises) { - Promise..resolve(arg).then(resolve, reject); - } - }); - } - - private static function _immediateFn(fn:Function):void { - setTimeout(fn, 0); - } - - private static function _unhandledRejectionFn(err:*):void { - trace("Possible unhandled Promise rejection:", err); - } - } -} diff --git a/as3/promise/PromiseHandler.as b/as3/promise/PromiseHandler.as deleted file mode 100644 index 708f554..0000000 --- a/as3/promise/PromiseHandler.as +++ /dev/null @@ -1,16 +0,0 @@ -package __AS3__.promise { - /** - * @private - */ - public final class PromiseHandler { - public var onFulfilled: Function; - public var onRejected: Function; - public var promise: Promise; - - public function PromiseHandler(onFulfilled: Function, onRejected: Function, promise: Promise) { - this.onFulfilled = onFulfilled; - this.onRejected = onRejected; - this.promise = promise; - } - } -} diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml deleted file mode 100644 index f8fb3aa..0000000 --- a/crates/parser/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "as3_parser" -version = "1.0.7" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 parser" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[lib] -name = "as3_parser" -path = "lib.rs" - -[dependencies] -bitflags = { version = "2.4.1", features = ["serde"] } -bytes = "1" -file_paths = "1.0.0" -conv = "0.3.3" -htmlentity = "1.3.1" -late_format = "1.0.0" -maplit = "1.0.2" -num-bigint = "0.4" -num-derive = "0.4.1" -num-traits = "0.2.17" -lazy-regex = "3.0.2" -lazy_static = "1.4.0" -unicode-general-category = "0.6.0" -by_address = "1.1.0" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -hydroper_source_text = "1.0.3" diff --git a/crates/parser/README.md b/crates/parser/README.md deleted file mode 100644 index 61237d1..0000000 --- a/crates/parser/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# ActionScript 3 Parser - -Refer to the [crate repository](https://github.com/hydroper/as3parser) for full details. diff --git a/crates/parser/compilation_unit.rs b/crates/parser/compilation_unit.rs deleted file mode 100644 index 93b1777..0000000 --- a/crates/parser/compilation_unit.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Defines the compilation unit, comments, and source locations. - -mod compilation_unit; -pub use compilation_unit::*; -mod comment; -pub use comment::*; -mod location; -pub use location::*; \ No newline at end of file diff --git a/crates/parser/compilation_unit/comment.rs b/crates/parser/compilation_unit/comment.rs deleted file mode 100644 index 6046ab7..0000000 --- a/crates/parser/compilation_unit/comment.rs +++ /dev/null @@ -1,59 +0,0 @@ -use crate::ns::*; - -pub struct Comment { - pub(crate) multiline: bool, - pub(crate) content: RefCell, - pub(crate) location: RefCell, -} - -impl Comment { - pub fn new(multiline: bool, content: String, location: Location) -> Self { - Self { - multiline, - content: RefCell::new(content), - location: RefCell::new(location), - } - } - - pub fn multiline(&self) -> bool { - self.multiline - } - - /// The content of the comment. - /// * If it is a multi-line comment, it includes all the characters after `/*` until `*/` (exclusive). - /// * If it is a single-line comment, it includes all the characters after `//` - /// until the next line terminator (exclusive) or end of program. - pub fn content(&self) -> String { - self.content.borrow().clone() - } - - pub fn set_content(&self, content: String) { - self.content.replace(content); - } - - pub fn location(&self) -> Location { - self.location.borrow().clone() - } - - pub fn set_location(&self, location: Location) { - self.location.replace(location); - } - - /// Indicates whether the comment is an AsDoc comment preceding - /// a specific location. - pub fn is_asdoc(&self, location_to_precede: &Location) -> bool { - if self.multiline && self.content.borrow().starts_with('*') { - let mut i: usize = self.location.borrow().last_offset; - for (i_1, ch) in self.location.borrow().compilation_unit().text()[i..].char_indices() { - i = i_1; - if !(CharacterValidator::is_whitespace(ch) || CharacterValidator::is_line_terminator(ch)) { - break; - } - } - i += self.location.borrow().last_offset; - location_to_precede.first_offset == i - } else { - false - } - } -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/compilation_unit.rs b/crates/parser/compilation_unit/compilation_unit.rs deleted file mode 100644 index fe900a5..0000000 --- a/crates/parser/compilation_unit/compilation_unit.rs +++ /dev/null @@ -1,245 +0,0 @@ -use std::{any::Any, cell::RefMut}; -use crate::ns::*; -use hydroper_source_text::SourceText; - -/// `CompilationUnit` identifies an AS3 compilation unit and contains -/// a source text. -pub struct CompilationUnit { - pub(crate) file_path: Option, - pub(crate) source_text: SourceText, - pub(crate) compiler_options: RefCell>>, - pub(crate) diagnostics: RefCell>, - pub(crate) error_count: Cell, - pub(crate) warning_count: Cell, - pub(crate) invalidated: Cell, - pub(crate) comments: RefCell>>, - pub(crate) included_from: RefCell>>, - pub(crate) nested_compilation_units: RefCell>>, -} - -impl Default for CompilationUnit { - fn default() -> Self { - Self { - file_path: None, - source_text: SourceText::new("".into()), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - } - } -} - -impl CompilationUnit { - /// Constructs a source file in unparsed and non verified state. - pub fn new(file_path: Option, text: String) -> Rc { - Rc::new(Self { - file_path, - source_text: SourceText::new(text), - compiler_options: RefCell::new(None), - diagnostics: RefCell::new(vec![]), - invalidated: Cell::new(false), - error_count: Cell::new(0), - warning_count: Cell::new(0), - comments: RefCell::new(vec![]), - nested_compilation_units: RefCell::new(vec![]), - included_from: RefCell::new(None), - }) - } - - /// File path of the source or `None` if not a file. - pub fn file_path(&self) -> Option { - self.file_path.clone() - } - - /// Source text. - pub fn text(&self) -> &String { - &self.source_text.contents - } - - /// Compiler options. - pub fn compiler_options(&self) -> Option> { - self.compiler_options.borrow().clone() - } - - /// Set compiler options. - pub fn set_compiler_options(&self, options: Option>) { - self.compiler_options.replace(options); - } - - /// Whether the source contains any errors after parsing - /// and/or verification. - pub fn invalidated(&self) -> bool { - self.invalidated.get() - } - - /// The comments present in the source file. To get mutable access to the - /// collection of comments, use the `comments_mut()` method instead. - pub fn comments(&self) -> Vec> { - let mut collection = vec![]; - for c in self.comments.borrow().iter() { - collection.push(c.clone()); - } - collection - } - - /// The comments present in the source file, as a mutable collection. - pub fn comments_mut(&self) -> RefMut>> { - self.comments.borrow_mut() - } - - /// Contributes a comment if there is no other comment - /// in the same location. - pub fn add_comment(&self, comment: Rc) { - let mut dup = false; - let i = comment.location.borrow().first_offset(); - for c1 in self.comments.borrow().iter() { - if c1.location.borrow().first_offset == i { - dup = true; - break; - } - } - if !dup { - self.comments.borrow_mut().push(comment); - } - } - - /// Diagnostics of the source file after parsing and/or - /// verification. - pub fn diagnostics(&self) -> Vec { - self.diagnostics.borrow().clone() - } - - /// Diagnostics of the source file after parsing and/or - /// verification, including those of nested compilation units. - pub fn nested_diagnostics(&self) -> Vec { - let mut result = self.diagnostics(); - for unit in self.nested_compilation_units.borrow().iter() { - result.extend(unit.nested_diagnostics()); - } - result - } - - /// Sort diagnostics from the compilation unit - /// and any nested compilation units. - pub fn sort_diagnostics(&self) { - self.diagnostics.borrow_mut().sort(); - for unit in self.nested_compilation_units.borrow().iter() { - unit.sort_diagnostics(); - } - } - - /// Determines whether to skip contributing an error when it - /// occurs at the same offset of another error. - pub fn prevent_equal_offset_error(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_warning() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// Determines whether to skip contributing a warning when it - /// occurs at the same offset of another warning. - pub fn prevent_equal_offset_warning(&self, location: &Location) -> bool { - let diag_list = self.diagnostics.borrow(); - for diag in diag_list.iter() { - if diag.is_error() { - continue; - } - if diag.location.first_offset == location.first_offset { - return true; - } - } - false - } - - /// If this compilation unit is subsequent of an include directive in another - /// compilation unit, returns the compilation unit of that include directive. - pub fn included_from(&self) -> Option> { - self.included_from.borrow().clone() - } - - pub(crate) fn set_included_from(&self, included_from: Option>) { - self.included_from.replace(included_from); - } - - pub(crate) fn include_directive_is_circular(&self, file_path: &str) -> bool { - if canonicalize_path(&self.file_path.clone().unwrap_or("".into())) == canonicalize_path(file_path) { - return true; - } - if let Some(included_from) = self.included_from() { - return included_from.include_directive_is_circular(file_path); - } - return false; - } - - pub fn nested_compilation_units(&self) -> Vec> { - let mut result = vec![]; - for unit in self.nested_compilation_units.borrow().iter() { - result.push(unit.clone()); - } - result - } - - pub fn add_nested_compilation_unit(&self, unit: Rc) { - self.nested_compilation_units.borrow_mut().push(unit); - } - - pub fn add_diagnostic(&self, diagnostic: Diagnostic) { - if diagnostic.is_warning() { - self.warning_count.set(self.warning_count.get() + 1); - } else { - self.error_count.set(self.error_count.get() + 1); - self.invalidated.set(true); - } - self.diagnostics.borrow_mut().push(diagnostic); - } - - pub fn error_count(&self) -> u32 { - self.error_count.get() - } - - pub fn warning_count(&self) -> u32 { - self.warning_count.get() - } - - /// Retrieves line number from an offset. The resulting line number - /// is counted from one. - pub fn get_line_number(&self, offset: usize) -> usize { - self.source_text.get_line_number(offset) - } - - /// Returns the zero based column of an offset. - pub fn get_column(&self, offset: usize) -> usize { - self.source_text.get_column(offset) - } - - /// Retrieves offset from line number (counted from one). - pub fn get_line_offset(&self, line: usize) -> Option { - self.source_text.get_line_offset(line) - } - - /// Retrieves the offset from the corresponding line of an offset. - pub fn get_line_offset_from_offset(&self, offset: usize) -> usize { - self.source_text.get_line_offset_from_offset(offset) - } - - pub fn get_line_indent(&self, line: usize) -> usize { - let line_offset = self.get_line_offset(line).unwrap(); - CharacterValidator::indent_count(&self.source_text.contents[line_offset..]) - } -} - -fn canonicalize_path(path: &str) -> String { - std::path::Path::new(path).canonicalize().unwrap_or(std::path::PathBuf::new()).to_string_lossy().into_owned() -} \ No newline at end of file diff --git a/crates/parser/compilation_unit/location.rs b/crates/parser/compilation_unit/location.rs deleted file mode 100644 index 44d46ed..0000000 --- a/crates/parser/compilation_unit/location.rs +++ /dev/null @@ -1,176 +0,0 @@ -use std::cmp::Ordering; -use std::fmt::Debug; -use serde::{Serialize, Deserialize, Serializer}; -use std::rc::Rc; -use crate::compilation_unit::*; -use crate::util::{CharacterReader, count_first_whitespace_characters}; - -/// Represents a source location. This location includes -/// spanning lines and columns and the reference compilation unit. -#[derive(Clone, Deserialize)] -pub struct Location { - /// The compilation unit that this location belongs to. - #[serde(skip)] - pub(crate) compilation_unit: Rc, - - /// First UTF-8 offset. - #[serde(skip)] - pub(crate) first_offset: usize, - - /// Last UTF-8 offset. - #[serde(skip)] - pub(crate) last_offset: usize, -} - -impl Serialize for Location { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - serializer.serialize_str(&format!("{}:{}-{}:{}", self.first_line_number(), self.first_column() + 1, self.last_line_number(), self.last_column() + 1)) - } -} - -impl Debug for Location { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, - "Location(first_line_number={}, first_column={}, first_offset={}, last_line_number={}, last_column={}, last_offset={})", - self.first_line_number(), - self.first_column(), - self.first_offset, - self.last_line_number(), - self.last_column(), - self.last_offset - ) - } -} - -impl Eq for Location {} - -impl PartialEq for Location { - fn eq(&self, other: &Self) -> bool { - Rc::ptr_eq(&self.compilation_unit, &other.compilation_unit) && - self.first_offset == other.first_offset && - self.last_offset == other.last_offset - } -} - -impl Ord for Location { - fn cmp(&self, other: &Self) -> Ordering { - self.partial_cmp(other).unwrap_or(Ordering::Equal) - } -} - -impl PartialOrd for Location { - fn partial_cmp(&self, other: &Self) -> Option { - self.first_offset.partial_cmp(&other.first_offset) - } -} - -impl Location { - /// Builds a location. - pub fn with_offsets( - compilation_unit: &Rc, - first_offset: usize, - last_offset: usize, - ) -> Self { - Self { - compilation_unit: compilation_unit.clone(), - first_offset, - last_offset, - } - } - - /// Builds a location. - pub fn with_offset(compilation_unit: &Rc, offset: usize) -> Self { - Self::with_offsets(compilation_unit, offset, offset) - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while `other` serves as the - /// last location. - pub fn combine_with(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.last_offset, - } - } - - /// Build a location by combining two locations. `self` - /// serves as the first location, while the first column and first line - /// of `other` serve as the last location. - pub fn combine_with_start_of(&self, other: Location) -> Self { - Self { - compilation_unit: self.compilation_unit.clone(), - first_offset: self.first_offset, - last_offset: other.first_offset, - } - } - - /// The compilation unit that this location belongs to. - pub fn compilation_unit(&self) -> Rc { - self.compilation_unit.clone() - } - - /// First line number, counted from one. - pub fn first_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.first_offset) - } - - /// Last line number, counted from one. - pub fn last_line_number(&self) -> usize { - self.compilation_unit.get_line_number(self.last_offset) - } - - // The first byte offset of this location. - pub fn first_offset(&self) -> usize { - self.first_offset - } - - // The last byte offset of this location. - pub fn last_offset(&self) -> usize { - self.last_offset - } - - /// Zero based first column of the location in code points. - pub fn first_column(&self) -> usize { - self.compilation_unit.get_column(self.first_offset) - } - - /// Zero based last column of the location in code points. - pub fn last_column(&self) -> usize { - self.compilation_unit.get_column(self.last_offset) - } - - pub fn character_count(&self) -> usize { - self.compilation_unit.text()[self.first_offset..self.last_offset].chars().count() - } - - /// Indicates whether a previous location and a next location - /// have a line break in between. - pub fn line_break(&self, other: &Self) -> bool { - self.last_line_number() != other.first_line_number() - } - - /// Returns the source text comprising the source location. - pub fn text(&self) -> String { - self.compilation_unit.text()[self.first_offset..self.last_offset].to_owned() - } - - /// Shifts a count of characters off this location until end-of-file. - pub fn shift_until_eof(&self, count: usize) -> Location { - let mut ch = CharacterReader::from(&self.compilation_unit.text()[self.first_offset..]); - for _ in 0..count { - if ch.next().is_none() { - break; - } - } - Self::with_offsets(&self.compilation_unit, self.first_offset + ch.index(), self.last_offset) - } - - /// Shifts the count of whitespace characters in a text off this location. - pub fn shift_whitespace(&self, text: &str) -> Location { - self.shift_until_eof(count_first_whitespace_characters(text)) - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics.rs b/crates/parser/diagnostics.rs deleted file mode 100644 index 34522bf..0000000 --- a/crates/parser/diagnostics.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the diagnostics produced by the parser. - -mod diagnostics; -pub use diagnostics::*; -mod diagnostic_kind; -pub use diagnostic_kind::*; \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostic_kind.rs b/crates/parser/diagnostics/diagnostic_kind.rs deleted file mode 100644 index baac4cb..0000000 --- a/crates/parser/diagnostics/diagnostic_kind.rs +++ /dev/null @@ -1,76 +0,0 @@ -#[repr(i32)] -#[derive(Eq, PartialEq, Clone, Copy)] -pub enum DiagnosticKind { - InvalidEscapeValue = 1024, - UnexpectedEnd = 1025, - UnallowedNumericSuffix = 1026, - StringLiteralMustBeTerminatedBeforeLineBreak = 1027, - Expecting = 1028, - ExpectingIdentifier = 1029, - ExpectingExpression = 1030, - ExpectingXmlName = 1031, - ExpectingXmlAttributeValue = 1032, - IllegalNullishCoalescingLeftOperand = 1033, - WrongParameterPosition = 1034, - DuplicateRestParameter = 1035, - NotAllowedHere = 1036, - MalformedRestParameter = 1037, - IllegalForInInitializer = 1038, - MultipleForInBindings = 1039, - UndefinedLabel = 1040, - IllegalContinue = 1041, - IllegalBreak = 1042, - ExpressionMustNotFollowLineBreak = 1043, - TokenMustNotFollowLineBreak = 1044, - ExpectingStringLiteral = 1045, - DuplicateAttribute = 1046, - DuplicateAccessModifier = 1047, - ExpectingDirectiveKeyword = 1048, - UnallowedAttribute = 1049, - UseDirectiveMustContainPublic = 1050, - MalformedEnumMember = 1051, - FunctionMayNotBeGenerator = 1052, - FunctionMayNotBeAsynchronous = 1053, - FunctionMustNotContainBody = 1054, - FunctionMustContainBody = 1055, - FunctionMustNotContainAnnotations = 1056, - NestedClassesNotAllowed = 1057, - DirectiveNotAllowedInInterface = 1058, - FailedParsingAsDocTag = 1059, - UnrecognizedAsDocTag = 1060, - UnrecognizedProxy = 1061, - EnumMembersMustBeConst = 1062, - ConstructorMustNotSpecifyResultType = 1063, - UnrecognizedMetadataSyntax = 1064, - FailedToIncludeFile = 1065, - ParentSourceIsNotAFile = 1066, - CircularIncludeDirective = 1067, - MalformedDestructuring = 1068, - XmlPrefixNotDefined = 1069, - RedefiningXmlAttribute = 1070, - InvalidXmlPi = 1071, - XmlPiUnknownAttribute = 1072, - XmlPiVersion = 1073, - XmlPiEncoding = 1074, - XmlMustConsistOfExactly1Element = 1075, - XmlNameAtMostOneColon = 1076, - UnexpectedCharacter = 1077, - InputEndedBeforeReachingClosingQuoteForString = 1078, - InputEndedBeforeReachingClosingSeqForCData = 1079, - InputEndedBeforeReachingClosingSeqForPi = 1080, - InputEndedBeforeReachingClosingSeqForXmlComment = 1081, - InputEndedBeforeReachingClosingSeqForMultiLineComment = 1082, - InputEndedBeforeReachingClosingSlashForRegExp = 1083, - InputEndedBeforeReachingClosingQuoteForAttributeValue = 1084, - ExpectingEitherSemicolonOrNewLineHere = 1085, - CssInvalidHexEscape = 1086, - ExpectingDirective = 1087, - ExpectingStatement = 1088, - Unexpected = 1089, -} - -impl DiagnosticKind { - pub fn id(&self) -> i32 { - *self as i32 - } -} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics.rs b/crates/parser/diagnostics/diagnostics.rs deleted file mode 100644 index 351b58c..0000000 --- a/crates/parser/diagnostics/diagnostics.rs +++ /dev/null @@ -1,175 +0,0 @@ -use std::any::Any; - -use maplit::hashmap; -use crate::ns::*; - -#[path = "diagnostics_english_resources.rs"] -mod diagnostics_english_resources; - -/// Represents a diagnostic originated from a compilation unit. -/// -/// Arguments are formatted using integer keys counted from 1 (one). -#[derive(Clone)] -pub struct Diagnostic { - pub(crate) location: Location, - pub(crate) kind: DiagnosticKind, - pub(crate) is_warning: bool, - pub(crate) is_verify_error: bool, - pub(crate) arguments: Vec>, - pub(crate) custom_kind: RefCell>>, -} - -impl Eq for Diagnostic {} - -impl PartialEq for Diagnostic { - fn eq(&self, other: &Self) -> bool { - self.location == other.location && - self.kind == other.kind - } -} - -impl Ord for Diagnostic { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.location.cmp(&other.location) - } -} - -impl PartialOrd for Diagnostic { - fn partial_cmp(&self, other: &Self) -> Option { - self.location.partial_cmp(&other.location) - } -} - -impl Diagnostic { - pub fn new_syntax_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_verify_error(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: true, - is_warning: false, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn new_warning(location: &Location, kind: DiagnosticKind, arguments: Vec>) -> Self { - Self { - location: location.clone(), - kind, - is_verify_error: false, - is_warning: true, - arguments, - custom_kind: RefCell::new(None), - } - } - - pub fn location(&self) -> Location { - self.location.clone() - } - - pub fn kind(&self) -> DiagnosticKind { - self.kind.clone() - } - - pub fn is_warning(&self) -> bool { - self.is_warning - } - - pub fn is_error(&self) -> bool { - !self.is_warning - } - - pub fn is_syntax_error(&self) -> bool { - !self.is_verify_error && !self.is_warning - } - - pub fn is_verify_error(&self) -> bool { - self.is_verify_error - } - - pub fn arguments(&self) -> Vec> { - self.arguments.clone() - } - - pub fn id(&self) -> i32 { - self.kind.id() - } - - pub fn custom_kind(&self) -> Option> { - self.custom_kind.borrow().clone() - } - - pub fn set_custom_kind(&self, id: Option>) { - self.custom_kind.replace(id); - } - - /// Formats the diagnostic by overriding the message text. - pub fn format_with_message(&self, message: &str, id: Option) -> String { - let category = (if self.is_verify_error { - "Verify error" - } else if self.is_warning { - "Warning" - } else { - "Syntax error" - }).to_owned(); - - let file_path = self.location.compilation_unit.file_path.clone().map_or("".to_owned(), |s| format!("{s}:")); - let line = self.location.first_line_number(); - let column = self.location.first_column() + 1; - if let Some(id) = id { - format!("{file_path}{line}:{column}: {category} #{}: {message}", id.to_string()) - } else { - format!("{file_path}{line}:{column}: {category}: {message}") - } - } - - /// Formats the diagnostic in English. - pub fn format_english(&self) -> String { - self.format_with_message(&self.format_message_english(), Some(self.id())) - } - - pub fn format_message_english(&self) -> String { - self.format_message(&diagnostics_english_resources::DATA) - } - - pub fn format_message(&self, messages: &HashMap) -> String { - let mut string_arguments: HashMap = hashmap!{}; - let mut i = 1; - for argument in &self.arguments { - string_arguments.insert(i.to_string(), argument.to_string()); - i += 1; - } - use late_format::LateFormat; - let Some(msg) = messages.get(&self.id()) else { - let id = self.id(); - panic!("Message resource is missing for ID {id}"); - }; - msg.late_format(string_arguments) - } -} - -/// The `diagarg![...]` literal is used for initializing -/// diagnostic arguments. -/// -/// For example: `diagarg![token, "foo".to_owned()]`. -pub macro diagarg { - ($($value:expr),*) => { vec![ $(Rc::new($value)),* ] }, -} - -pub trait DiagnosticArgument: Any + ToString + 'static { -} - -impl DiagnosticArgument for String {} - -impl DiagnosticArgument for Token {} \ No newline at end of file diff --git a/crates/parser/diagnostics/diagnostics_english_resources.rs b/crates/parser/diagnostics/diagnostics_english_resources.rs deleted file mode 100644 index b7eccc2..0000000 --- a/crates/parser/diagnostics/diagnostics_english_resources.rs +++ /dev/null @@ -1,75 +0,0 @@ -use lazy_static::lazy_static; -use maplit::hashmap; -use crate::ns::*; - -lazy_static! { - pub static ref DATA: HashMap = hashmap! { - // DiagnosticKind::K.id() => ".".into(), - DiagnosticKind::InvalidEscapeValue.id() => "Invalid escape value.".into(), - DiagnosticKind::UnexpectedEnd.id() => "Unexpected end-of-file.".into(), - DiagnosticKind::UnallowedNumericSuffix.id() => "Unallowed numeric suffix.".into(), - DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak.id() => "A string literal must be terminated before the line break.".into(), - DiagnosticKind::Expecting.id() => "Expecting {1} before {2}.".into(), - DiagnosticKind::ExpectingIdentifier.id() => "Expecting identifier before {1}.".into(), - DiagnosticKind::ExpectingExpression.id() => "Expecting expression before {1}.".into(), - DiagnosticKind::ExpectingXmlName.id() => "Expecting XML name before {1}.".into(), - DiagnosticKind::ExpectingXmlAttributeValue.id() => "Expecting XML attribute value before {1}.".into(), - DiagnosticKind::IllegalNullishCoalescingLeftOperand.id() => "Illegal nullish coalescing left operand.".into(), - DiagnosticKind::WrongParameterPosition.id() => "Wrong parameter position.".into(), - DiagnosticKind::DuplicateRestParameter.id() => "Duplicate rest parameter.".into(), - DiagnosticKind::NotAllowedHere.id() => "{1} not allowed here.".into(), - DiagnosticKind::MalformedRestParameter.id() => "Malformed rest parameter.".into(), - DiagnosticKind::IllegalForInInitializer.id() => "Illegal 'for..in' initializer.".into(), - DiagnosticKind::MultipleForInBindings.id() => "Multiple 'for..in' bindings are not allowed.".into(), - DiagnosticKind::UndefinedLabel.id() => "Undefined label '{1}'.".into(), - DiagnosticKind::IllegalContinue.id() => "Illegal continue statement.".into(), - DiagnosticKind::IllegalBreak.id() => "Illegal break statement.".into(), - DiagnosticKind::ExpressionMustNotFollowLineBreak.id() => "Expression must not follow line break.".into(), - DiagnosticKind::TokenMustNotFollowLineBreak.id() => "Token must not follow line break.".into(), - DiagnosticKind::ExpectingStringLiteral.id() => "Expecting string literal before {1}.".into(), - DiagnosticKind::DuplicateAttribute.id() => "Duplicate attribute.".into(), - DiagnosticKind::DuplicateAccessModifier.id() => "Duplicate access modifier.".into(), - DiagnosticKind::ExpectingDirectiveKeyword.id() => "Expecting either 'var', 'const', 'function', 'class' or 'interface.".into(), - DiagnosticKind::UnallowedAttribute.id() => "Unallowed attribute.".into(), - DiagnosticKind::UseDirectiveMustContainPublic.id() => "Use directive must contain the 'public' attribute.".into(), - DiagnosticKind::MalformedEnumMember.id() => "Malformed enumeration member.".into(), - DiagnosticKind::FunctionMayNotBeGenerator.id() => "Function may not be generator.".into(), - DiagnosticKind::FunctionMayNotBeAsynchronous.id() => "Function may not be asynchronous.".into(), - DiagnosticKind::FunctionMustNotContainBody.id() => "Function must not contain body.".into(), - DiagnosticKind::FunctionMustContainBody.id() => "Function must contain body.".into(), - DiagnosticKind::FunctionMustNotContainAnnotations.id() => "Function must not contain annotations.".into(), - DiagnosticKind::NestedClassesNotAllowed.id() => "Nested classes are not allowed.".into(), - DiagnosticKind::DirectiveNotAllowedInInterface.id() => "Directive not allowed in interface.".into(), - DiagnosticKind::FailedParsingAsDocTag.id() => "Failed parsing contents of ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedAsDocTag.id() => "Unrecognized ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedProxy.id() => "Unrecognized proxy: '{1}'.".into(), - DiagnosticKind::EnumMembersMustBeConst.id() => "Enumeration members must be 'const'.".into(), - DiagnosticKind::UnrecognizedMetadataSyntax.id() => "Unrecognized meta-data syntax.".into(), - DiagnosticKind::FailedToIncludeFile.id() => "Failed to include file.".into(), - DiagnosticKind::ParentSourceIsNotAFile.id() => "Parent source is not a file.".into(), - DiagnosticKind::CircularIncludeDirective.id() => "Circular include directive.".into(), - DiagnosticKind::MalformedDestructuring.id() => "Malformed destructuring.".into(), - DiagnosticKind::XmlPrefixNotDefined.id() => "Prefix not defined: '{1}'.".into(), - DiagnosticKind::RedefiningXmlAttribute.id() => "Redefining attribute: '{1}'.".into(), - DiagnosticKind::InvalidXmlPi.id() => "Invalid processing instruction.".into(), - DiagnosticKind::XmlPiUnknownAttribute.id() => "Unknown attribute at processing instruction: '{1}'.".into(), - DiagnosticKind::XmlPiVersion.id() => "XML version must be '1.0'.".into(), - DiagnosticKind::XmlPiEncoding.id() => "XML encoding must be either 'utf-8' or 'utf-16'.".into(), - DiagnosticKind::XmlMustConsistOfExactly1Element.id() => "Document must consist of exactly one element.".into(), - DiagnosticKind::XmlNameAtMostOneColon.id() => "XML name may have at most one colon.".into(), - DiagnosticKind::UnexpectedCharacter.id() => "Unexpected character. '{1}' is not allowed here".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString.id() => "Input ended before reaching the closing quotation mark for a string literal.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData.id() => "Input ended before reaching the closing ']]>' for a CDATA.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi.id() => "Input ended before reaching the closing '?>' for a processing instruction.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment.id() => "Input ended before reaching the closing '-->' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment.id() => "Input ended before reaching the closing '*/' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp.id() => "Input ended before reaching the closing slash for a regular expression.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue.id() => "Input ended before reaching the closing quotation mark for an attribute value.".into(), - DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere.id() => "Expecting either a semicolon or a new line here.".into(), - DiagnosticKind::CssInvalidHexEscape.id() => "Invalid hexadecimal escape: '\\{1}'.".into(), - DiagnosticKind::ExpectingDirective.id() => "Expecting directive before {1}".into(), - DiagnosticKind::ExpectingStatement.id() => "Expecting statement before {1}".into(), - DiagnosticKind::Unexpected.id() => "Unexpected {1}".into(), - // DiagnosticKind::K.id() => ".".into(), - }; -} \ No newline at end of file diff --git a/crates/parser/lib.rs b/crates/parser/lib.rs deleted file mode 100644 index c82a279..0000000 --- a/crates/parser/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![feature(decl_macro)] -#![feature(try_blocks)] - -pub mod tree; -pub mod compilation_unit; -pub mod diagnostics; -pub mod operator; -pub mod parser; -pub mod util; - -pub mod ns; \ No newline at end of file diff --git a/crates/parser/ns.rs b/crates/parser/ns.rs deleted file mode 100644 index 09adc4b..0000000 --- a/crates/parser/ns.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! The `ns` module is an union of all of the parser modules. - -pub use crate::tree::*; -pub use crate::compilation_unit::*; -pub use crate::diagnostics::*; -pub use crate::operator::*; -pub use crate::parser::*; -pub use crate::util::*; \ No newline at end of file diff --git a/crates/parser/operator.rs b/crates/parser/operator.rs deleted file mode 100644 index bbad3db..0000000 --- a/crates/parser/operator.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the ActionScript 3 operators. - -mod operator; -pub use operator::*; -mod operator_precedence; -pub use operator_precedence::*; \ No newline at end of file diff --git a/crates/parser/operator/operator.rs b/crates/parser/operator/operator.rs deleted file mode 100644 index 69cd19a..0000000 --- a/crates/parser/operator/operator.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents an ActionScript operator. -#[derive(Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Operator { - PostIncrement, - PostDecrement, - NonNull, - Delete, - Void, - Typeof, - Await, - Yield, - PreIncrement, - PreDecrement, - Positive, - Negative, - BitwiseNot, - LogicalNot, - - Power, - Multiply, - Divide, - Remainder, - Add, - Subtract, - ShiftLeft, - ShiftRight, - ShiftRightUnsigned, - Lt, - Gt, - Le, - Ge, - Instanceof, - In, - NotIn, - Is, - IsNot, - As, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - BitwiseAnd, - BitwiseXor, - BitwiseOr, - LogicalAnd, - LogicalXor, - LogicalOr, - NullCoalescing, -} - -/// Represents binary operator associativity. -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum BinaryAssociativity { - LeftToRight, - RightToLeft, -} - -/// Represents an ActionScript binary operator. -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct BinaryOperator(pub Operator, pub OperatorPrecedence, pub BinaryAssociativity); - -impl BinaryOperator { - pub fn operator(&self) -> Operator { - self.0 - } - - pub fn precedence(&self) -> OperatorPrecedence { - self.1 - } - - pub fn associativity(&self) -> BinaryAssociativity { - self.2 - } - - pub fn right_precedence(&self) -> OperatorPrecedence { - if self.operator() == Operator::NullCoalescing { - OperatorPrecedence::BitwiseOr - } else { - self.precedence().add(if self.associativity() == BinaryAssociativity::LeftToRight { 1 } else { 0 }).unwrap() - } - } -} - -impl TryFrom for BinaryOperator { - type Error = (); - /// Constructs `BinaryOperator` from abstract operator. - fn try_from(value: Operator) -> Result { - match value { - Operator::Multiply => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Divide => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Remainder => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Add => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::Subtract => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::ShiftLeft => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRight => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRightUnsigned => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::Lt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Gt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Le => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Ge => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::As => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::In => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::NotIn => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Instanceof => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Is => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::IsNot => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Equals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::NotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictNotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::BitwiseAnd => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseAnd, BinaryAssociativity::LeftToRight)), - Operator::BitwiseXor => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseXor, BinaryAssociativity::LeftToRight)), - Operator::BitwiseOr => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseOr, BinaryAssociativity::LeftToRight)), - Operator::LogicalAnd => Ok(BinaryOperator(value, OperatorPrecedence::LogicalAnd, BinaryAssociativity::LeftToRight)), - Operator::LogicalXor => Ok(BinaryOperator(value, OperatorPrecedence::LogicalXor, BinaryAssociativity::LeftToRight)), - Operator::LogicalOr => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - Operator::NullCoalescing => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - - Operator::Power => Ok(BinaryOperator(value, OperatorPrecedence::Exponentiation, BinaryAssociativity::RightToLeft)), - - _ => Err(()), - } - } -} \ No newline at end of file diff --git a/crates/parser/operator/operator_precedence.rs b/crates/parser/operator/operator_precedence.rs deleted file mode 100644 index 68b0abe..0000000 --- a/crates/parser/operator/operator_precedence.rs +++ /dev/null @@ -1,77 +0,0 @@ -use num_derive::FromPrimitive; -use num_traits::FromPrimitive; - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum OperatorPrecedence { - Postfix = 16, - Unary = 15, - Exponentiation = 14, - Multiplicative = 13, - Additive = 12, - Shift = 11, - Relational = 10, - Equality = 9, - BitwiseAnd = 8, - BitwiseXor = 7, - BitwiseOr = 6, - LogicalAnd = 5, - LogicalXor = 4, - /// Includes logical OR and nullish coalescing (`??`). - LogicalOrAndOther = 3, - /// Includes assignment operators, conditional operator, function expression and `yield` operator. - AssignmentAndOther = 2, - List = 1, -} - -impl OperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for OperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum CssOperatorPrecedence { - Unary = 3, - MultiValue = 2, - Array = 1, -} - -impl CssOperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for CssOperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} \ No newline at end of file diff --git a/crates/parser/parser.rs b/crates/parser/parser.rs deleted file mode 100644 index 897a3e2..0000000 --- a/crates/parser/parser.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Defines the parser and the tokenizer. -//! -//! Using the methods of the `ParserFacade` structure is the most common way of parsing -//! programs until end-of-file. - -mod character_validator; -pub use character_validator::*; -mod context; -pub use context::*; -mod reserved_word; -pub use reserved_word::*; -mod parser; -pub use parser::*; -mod css_parser; -pub use css_parser::*; -mod css_tokenizer; -pub use css_tokenizer::*; -mod parser_error; -pub use parser_error::*; -mod token; -pub use token::*; -mod tokenizer; -pub use tokenizer::*; \ No newline at end of file diff --git a/crates/parser/parser/character_validator.rs b/crates/parser/parser/character_validator.rs deleted file mode 100644 index ef06b61..0000000 --- a/crates/parser/parser/character_validator.rs +++ /dev/null @@ -1,147 +0,0 @@ -//use lazy_regex::{Lazy, Regex, lazy_regex}; -use unicode_general_category::{get_general_category, GeneralCategory}; - -// pub(crate) static CR_OR_CRLF_REGEX: Lazy = lazy_regex!(r"\r\n?"); - -/// The `CharacterValidator` structure defines static methods for character -/// validation. -pub struct CharacterValidator; - -impl CharacterValidator { - /// Returns the count of indentation characters in a string. - pub fn indent_count(string: &str) -> usize { - let mut n: usize = 0; - for ch in string.chars() { - if !CharacterValidator::is_whitespace(ch) { - break; - } - n += 1; - } - n - } - - pub fn is_whitespace(ch: char) -> bool { - if ch == '\x20' || ch == '\x09' || ch == '\x08' - || ch == '\x0C' || ch == '\u{A0}' { - return true; - } - let category = get_general_category(ch); - category == GeneralCategory::SpaceSeparator - } - - pub fn is_line_terminator(ch: char) -> bool { - ch == '\x0A' || ch == '\x0D' || ch == '\u{2028}' || ch == '\u{2029}' - } - - pub fn is_bin_digit(ch: char) -> bool { - ch == '\x30' || ch == '\x31' - } - - pub fn is_dec_digit(ch: char) -> bool { - ch >= '\x30' && ch <= '\x39' - } - - pub fn is_hex_digit(ch: char) -> bool { - CharacterValidator::is_dec_digit(ch) || (ch >= '\x41' && ch <= '\x46') || (ch >= '\x61' && ch <= '\x66') - } - - /// Returns the mathematical value of a hexadecimal digit. - pub fn hex_digit_mv(ch: char) -> Option { - if ch >= 'A' && ch <= 'F' { - Some((ch as u32) - 0x41 + 10) - } else if ch >= 'a' && ch <= 'f' { - Some((ch as u32) - 0x61 + 10) - } else if ch >= '0' && ch <= '9' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - /// Returns the mathematical value of a binary digit. - pub fn bin_digit_mv(ch: char) -> Option { - if ch >= '0' && ch <= '1' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - pub fn is_css_identifier_start(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') - } - - pub fn is_css_identifier_part(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' - } - - pub fn is_identifier_start(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_identifier_part(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::NonspacingMark, - GeneralCategory::SpacingMark, - GeneralCategory::ConnectorPunctuation, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_name_start(ch: char) -> bool { - if ch == '\x5f' || ch == ':' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_xml_name_part(ch: char) -> bool { - if ch == '\x5f' || ch == ':' || ch == '.' || ch == '-' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_whitespace(ch: char) -> bool { - ch == '\x20' || ch == '\x09' || ch == '\x0A' || ch == '\x0D' - } -} \ No newline at end of file diff --git a/crates/parser/parser/context.rs b/crates/parser/parser/context.rs deleted file mode 100644 index 3132d5b..0000000 --- a/crates/parser/parser/context.rs +++ /dev/null @@ -1,174 +0,0 @@ -use crate::ns::*; - -/// Context used to control the parsing of an expression. -#[derive(Clone)] -pub struct ParserExpressionContext { - pub min_precedence: OperatorPrecedence, - pub allow_in: bool, - pub allow_assignment: bool, -} - -impl Default for ParserExpressionContext { - fn default() -> Self { - Self { - min_precedence: OperatorPrecedence::List, - allow_in: true, - allow_assignment: true, - } - } -} - -#[derive(Clone)] -pub enum ParserDirectiveContext { - Default, - TopLevel, - PackageBlock, - ClassBlock { - name: String, - }, - InterfaceBlock, - EnumBlock, - ConstructorBlock { - super_statement_found: Rc>, - }, - WithControl { - super_statement_found: Option>>, - to_be_labeled: Option, - control_context: ParserControlFlowContext, - labels: HashMap, - }, -} - -impl ParserDirectiveContext { - pub fn may_contain_super_statement(&self) -> bool { - matches!(self, Self::ConstructorBlock { .. }) || matches!(self, Self::WithControl { .. }) - } - - pub fn super_statement_found(&self) -> bool { - match self { - Self::ConstructorBlock { super_statement_found } => super_statement_found.get(), - Self::WithControl { super_statement_found, .. } => super_statement_found.as_ref().or(Some(&Rc::new(Cell::new(false)))).unwrap().get(), - _ => false, - } - } - - pub fn set_super_statement_found(&self, value: bool) { - match self { - Self::ConstructorBlock { super_statement_found } => { super_statement_found.set(value) }, - Self::WithControl { super_statement_found, .. } => { - if let Some(found) = super_statement_found.as_ref() { - found.set(value); - } - }, - _ => {}, - } - } - - pub fn function_name_is_constructor(&self, name: &(String, Location)) -> bool { - if let ParserDirectiveContext::ClassBlock { name: ref name_1 } = self { - &name.0 == name_1 - } else { - false - } - } - - pub fn is_top_level_or_package(&self) -> bool { - matches!(self, ParserDirectiveContext::TopLevel) || matches!(self, ParserDirectiveContext::PackageBlock) - } - - pub fn is_type_block(&self) -> bool { - match self { - Self::ClassBlock { .. } | - Self::InterfaceBlock | - Self::EnumBlock => true, - _ => false, - } - } - - pub fn clone_control(&self) -> Self { - match self { - Self::WithControl { .. } => self.clone(), - _ => Self::Default, - } - } - - pub fn override_control_context(&self, label_only: bool, mut context: ParserControlFlowContext) -> Self { - let mut prev_context = None; - let mut label = None; - let mut super_statement_found: Option>> = None; - let mut labels = match self { - Self::WithControl { control_context, labels, to_be_labeled: label1, super_statement_found: super_found_1 } => { - prev_context = Some(control_context.clone()); - label = label1.clone(); - super_statement_found = super_found_1.clone(); - labels.clone() - }, - _ => HashMap::new(), - }; - if let Some(label) = label.clone() { - labels.insert(label, context.clone()); - } - if label_only { - context = prev_context.unwrap_or(ParserControlFlowContext { - breakable: false, - iteration: false, - }); - } - Self::WithControl { control_context: context, labels, to_be_labeled: None, super_statement_found } - } - - pub fn put_label(&self, label: String) -> Self { - match self { - Self::WithControl { control_context, labels, to_be_labeled: _, super_statement_found } => Self::WithControl { - to_be_labeled: Some(label), - control_context: control_context.clone(), - labels: labels.clone(), - super_statement_found: super_statement_found.clone(), - }, - _ => Self::WithControl { - to_be_labeled: Some(label), - control_context: ParserControlFlowContext { - breakable: false, - iteration: false, - }, - labels: HashMap::new(), - super_statement_found: match self { - Self::ConstructorBlock { super_statement_found } => Some(super_statement_found.clone()), - _ => None, - }, - }, - } - } - - pub fn is_label_defined(&self, label: String) -> bool { - self.resolve_label(label).is_some() - } - - pub fn resolve_label(&self, label: String) -> Option { - if let Self::WithControl { labels, .. } = &self { labels.get(&label).map(|c| c.clone()) } else { None } - } - - pub fn is_break_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.breakable } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.breakable } else { false } - } - } - - pub fn is_continue_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.iteration } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.iteration } else { false } - } - } -} - -#[derive(Clone)] -pub struct ParserControlFlowContext { - pub breakable: bool, - pub iteration: bool, -} \ No newline at end of file diff --git a/crates/parser/parser/css_parser.rs b/crates/parser/parser/css_parser.rs deleted file mode 100644 index c7f64a1..0000000 --- a/crates/parser/parser/css_parser.rs +++ /dev/null @@ -1,847 +0,0 @@ -use crate::ns::*; -use num_traits::ToPrimitive; - -pub struct CssParser<'input> { - tokenizer: CssTokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - expecting_token_error: bool, -} - -impl<'input> CssParser<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: CssTokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - None - } - } - - fn peek_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_identifier(&mut self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - None - } - } - - fn consume_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(name1) = self.token.0.clone() { - if name1 == name { - self.next(); - return true; - } - } - false - } - - /// Expects a token in non-greedy mode: if it fails, does not skip any token. - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn expect_identifier(&mut self) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn expect_unitless_number(&mut self) -> Option { - if let Token::CssNumber { value, .. } = self.token.0.clone() { - self.expecting_token_error = false; - self.next(); - Some(value) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - None - } - } - - fn expect_string(&mut self) -> (String, Location) { - if let Token::String(v) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (v, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof); - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(CssDirective::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_property_value(&self, location: &Location) -> Rc { - Rc::new(CssPropertyValue::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn _create_invalidated_selector(&self, location: &Location) -> Rc { - Rc::new(CssSelector::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_selector_condition(&self, location: &Location) -> Rc { - Rc::new(CssSelectorCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_media_query_condition(&self, location: &Location) -> Rc { - Rc::new(CssMediaQueryCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn eof(&self) -> bool { - matches!(self.token.0, Token::Eof) - } - - pub fn parse_document(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut directives: Vec> = vec![]; - while !self.eof() { - directives.push(self.parse_directive()); - } - let loc = self.pop_location(); - Rc::new(CssDocument { - location: if just_eof { - self.token.1.clone() - } else { - loc - }, - directives, - }) - } - - fn parse_directive(&mut self) -> Rc { - if let Some(rule) = self.parse_opt_rule() { - Rc::new(CssDirective::Rule(rule)) - } else if self.peek(Token::CssAtNamespace) { - self.mark_location(); - self.next(); - let prefix = self.expect_identifier(); - let uri = if self.expecting_token_error { - (String::new(), self.tokenizer.cursor_location()) - } else { - self.expect_string() - }; - if !self.expecting_token_error { - self.expect(Token::CssSemicolons); - } - let loc = self.pop_location(); - Rc::new(CssDirective::NamespaceDefinition(CssNamespaceDefinition { - location: loc, - prefix, - uri, - })) - } else if self.peek(Token::CssAtMedia) { - self.parse_media_query() - } else if self.peek(Token::CssAtFontFace) { - self.parse_font_face() - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - let d = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.next(); - d - } - } - - fn parse_media_query(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut conditions: Vec> = vec![]; - let condition = self.parse_opt_media_query_condition(); - if let Some(condition) = condition { - conditions.push(condition); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - loop { - if let Some(condition) = self.parse_opt_media_query_condition() { - conditions.push(condition); - } else if self.eof() || self.peek(Token::BlockOpen) { - break; - } else if !self.consume(Token::Comma) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - let mut rules: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - while !(self.eof() || self.peek(Token::BlockClose)) { - if let Some(rule) = self.parse_opt_rule() { - rules.push(Rc::new(rule)); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::MediaQuery(CssMediaQuery { - location: self.pop_location(), - conditions, - rules, - })) - } - - fn parse_font_face(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::FontFace(CssFontFace { - location: self.pop_location(), - properties, - })) - } - - fn parse_opt_media_query_condition(&mut self) -> Option> { - let mut base: Option> = None; - if self.peek_keyword("only") { - self.mark_location(); - self.next(); - let id = self.expect_identifier(); - base = Some(Rc::new(CssMediaQueryCondition::OnlyId { - location: self.pop_location(), - id, - })); - } - if let Some(id) = self.consume_identifier() { - base = Some(Rc::new(CssMediaQueryCondition::Id(id))); - } - if self.peek(Token::ParenOpen) { - self.mark_location(); - let property = self.parse_arguments().unwrap().parse_property(); - let loc = self.pop_location(); - base = Some(Rc::new(CssMediaQueryCondition::ParenProperty((property, loc)))); - } - if let Some(mut base) = base.clone() { - while self.consume_keyword("and") { - self.push_location(&base.location()); - if let Some(right) = self.parse_opt_media_query_condition() { - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right, - }); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right: self.create_invalidated_media_query_condition(&self.tokenizer.cursor_location()), - }); - } - } - return Some(base); - } - base - } - - fn parse_arguments(&mut self) -> Result { - if !self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Expecting, diagarg![Token::ParenOpen, self.token.0.clone()]); - return Err(ParserError::Common); - } - let (byte_range, token) = self.tokenizer.scan_arguments(); - self.previous_token = self.token.clone(); - self.token = token; - self.next(); - Ok(CssParserFacade(self.compilation_unit(), ParserOptions { - byte_range: Some(byte_range), - ..self.options() - })) - } - - fn parse_opt_rule(&mut self) -> Option { - let mut selectors: Vec> = vec![self.parse_opt_selector()?]; - while self.consume(Token::Comma) { - if let Some(s) = self.parse_opt_selector() { - selectors.push(s); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - } - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - self.push_location(&selectors[0].location()); - Some(CssRule { - location: self.pop_location(), - selectors, - properties, - }) - } - - fn parse_opt_selector(&mut self) -> Option> { - let mut base = self.parse_opt_base_selector()?; - - // Parse descendant combinators - while let Some(right) = self.parse_opt_base_selector() { - self.push_location(&base.location()); - base = Rc::new(CssSelector::Combinator(CssCombinatorSelector { - location: self.pop_location(), - left: base, - right, - combinator_type: CssCombinatorType::Descendant, - })); - } - - Some(base) - } - - fn parse_opt_base_selector(&mut self) -> Option> { - self.mark_location(); - let mut namespace_prefix: Option<(String, Location)> = None; - let mut element_name: Option<(String, Location)> = self.consume_identifier(); - let mut conditions: Vec> = vec![]; - if self.consume(Token::Pipe) { - namespace_prefix = element_name.clone(); - element_name = Some(self.expect_identifier()); - } - // Parse conditions as long as they are not separated by whitespace - while (element_name.is_none() && conditions.is_empty()) || (self.token.1.first_offset() - self.previous_token.1.last_offset() == 0) { - if let Some(condition) = self.parse_opt_selector_condition() { - conditions.push(condition); - } else { - break; - } - } - if element_name.is_none() && conditions.is_empty() { - self.pop_location(); - return None; - } - Some(Rc::new(CssSelector::Base(CssBaseSelector { - location: self.pop_location(), - namespace_prefix, - element_name, - conditions, - }))) - } - - fn parse_selector_condition(&mut self) -> Rc { - let Some(c) = self.parse_opt_selector_condition() else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_selector_condition(&self.tokenizer.cursor_location()); - }; - c - } - - fn parse_opt_selector_condition(&mut self) -> Option> { - if self.peek(Token::Dot) { - self.mark_location(); - self.next(); - let class_name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Class((class_name, self.pop_location())))); - } - if let Token::CssHashWord(id_value) = self.token.0.clone() { - let loc = self.token.1.clone(); - self.next(); - return Some(Rc::new(CssSelectorCondition::Id((id_value, loc)))); - } - if self.peek(Token::Colon) { - self.mark_location(); - self.next(); - if self.consume_keyword("not") { - let condition = if let Ok(a) = self.parse_arguments() { - a.parse_selector_condition() - } else { - self.duplicate_location(); - let loc = self.pop_location(); - self.create_invalidated_selector_condition(&loc) - }; - return Some(Rc::new(CssSelectorCondition::Not { - location: self.pop_location(), - condition, - })); - } else { - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Pseudo((name, self.pop_location())))); - } - } - if self.peek(Token::ColonColon) { - self.mark_location(); - self.next(); - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::PseudoElement((name, self.pop_location())))); - } - if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let name = self.expect_identifier(); - let mut operator: Option = None; - let mut value: Option<(String, Location)> = None; - while let Some(t1) = self.consume_attribute_operator() { - operator = Some(t1); - } - while let Token::String(s1) = self.token.0.clone() { - value = Some((s1, self.token.1.clone())); - self.next(); - } - self.expect(Token::SquareClose); - return Some(Rc::new(CssSelectorCondition::Attribute { - location: self.pop_location(), - name, - operator, - value, - })); - } - None - } - - fn consume_attribute_operator(&mut self) -> Option { - if self.consume(Token::CssBeginsWith) { - Some(CssAttributeOperator::BeginsWith) - } else if self.consume(Token::CssEndsWith) { - Some(CssAttributeOperator::EndsWith) - } else if self.consume(Token::CssContains) { - Some(CssAttributeOperator::Contains) - } else if self.consume(Token::CssListMatch) { - Some(CssAttributeOperator::ListMatch) - } else if self.consume(Token::CssHreflangMatch) { - Some(CssAttributeOperator::HreflangMatch) - } else if self.consume(Token::Assign) { - Some(CssAttributeOperator::Equals) - } else { - None - } - } - - fn parse_property(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(); - let mut value = self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - if !self.expecting_token_error { - self.expect(Token::Colon); - if !self.expecting_token_error { - value = self.parse_property_value(CssOperatorPrecedence::Array); - } - } - Rc::new(CssProperty::new(self.pop_location(), name, value)) - } - - fn parse_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Rc { - let Some(v) = self.parse_opt_property_value(min_precedence) else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - }; - v - } - - fn parse_opt_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Option> { - let base: Option>; - let t1 = self.token.0.clone(); - - // #HHH - // #HHHHHH - if let Token::CssHashWord(word) = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - if let Ok(v) = CssColorPropertyValue::from_hex(loc.clone(), &word) { - base = Some(Rc::new(CssPropertyValue::Color(v))); - } else { - base = Some(self.create_invalidated_property_value(&loc)); - } - // "..." - // '...' - } else if let Token::String(value) = t1 { - self.mark_location(); - self.next(); - base = Some(Rc::new(CssPropertyValue::String(CssStringPropertyValue { - location: self.pop_location(), - value - }))); - // DECIMAL - } else if let Token::CssNumber { value, unit } = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - base = Some(Rc::new(CssPropertyValue::Number(CssNumberPropertyValue { - location: loc, - value, - unit, - }))); - } else if let Some(id) = self.peek_identifier() { - self.mark_location(); - self.next(); - let color_int = css_color_constant_to_int(&id.0); - // COLOR_NAME such as "red" - if let Some(color_int) = color_int { - base = Some(Rc::new(CssPropertyValue::Color(CssColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - // rgb(...) - } else if id.0 == "rgb" && self.peek(Token::ParenOpen) { - if let Some(color_int) = self.parse_arguments().unwrap().parse_rgb() { - base = Some(Rc::new(CssPropertyValue::RgbColor(CssRgbColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - } else { - let loc = self.pop_location(); - base = Some(self.create_invalidated_property_value(&loc)); - } - } else if id.0 == "ClassReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::ClassReference(CssClassReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "PropertyReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::PropertyReference(CssPropertyReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "url" && self.peek(Token::ParenOpen) { - let url = self.parse_arguments().unwrap().parse_text(); - let mut format: Option<(String, Location)> = None; - if self.consume_keyword("format") { - if let Ok(a) = self.parse_arguments() { - format = Some(a.parse_text()); - } - } - base = Some(Rc::new(CssPropertyValue::Url(CssUrlPropertyValue { - location: self.pop_location(), - url, - format, - }))); - } else if id.0 == "local" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::Local(CssLocalPropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "Embed" && self.peek(Token::ParenOpen) { - let entries = self.parse_arguments().unwrap().parse_embed_entries(); - base = Some(Rc::new(CssPropertyValue::Embed(CssEmbedPropertyValue { - location: self.pop_location(), - entries, - }))); - } else { - if self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.parse_arguments().unwrap(); - } - base = Some(Rc::new(CssPropertyValue::Identifier(CssIdentifierPropertyValue { - location: self.pop_location(), - value: id.0, - }))); - } - } else if self.peek(Token::Plus) || self.peek(Token::Minus) - || self.peek(Token::Times) || self.peek(Token::Div) { - base = Some(self.create_invalidated_property_value(&self.token.1)); - self.next(); - } else { - return None; - } - - let mut base = base.unwrap(); - - loop { - if self.peek(Token::Comma) && min_precedence.includes(&CssOperatorPrecedence::Array) { - self.push_location(&base.location()); - let mut elements: Vec> = vec![base]; - while self.consume(Token::Comma) { - elements.push(self.parse_property_value(CssOperatorPrecedence::MultiValue)); - } - base = Rc::new(CssPropertyValue::Array(CssArrayPropertyValue { - location: self.pop_location(), - elements, - })); - } else if min_precedence.includes(&CssOperatorPrecedence::MultiValue) { - if let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - self.push_location(&base.location()); - let mut values: Vec> = vec![base, mv1]; - while let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - values.push(mv1); - } - base = Rc::new(CssPropertyValue::MultiValue(CssMultiValuePropertyValue { - location: self.pop_location(), - values, - })); - } else { - break; - } - } else { - break; - } - } - - Some(base) - } - - fn parse_embed_entry(&mut self) -> Rc { - self.mark_location(); - if let Some(key) = self.consume_identifier() { - if self.consume(Token::Assign) { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: Some(key), - value, - }) - } else { - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value: key, - }) - } - } else { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value, - }) - } - } -} - -fn rgb_bytes_to_integer(r: f64, g: f64, b: f64) -> u32 { - (calc_rgb_byte(r) << 16) | (calc_rgb_byte(g) << 8) | calc_rgb_byte(b) -} - -fn calc_rgb_byte(value: f64) -> u32 { - // Integer - if value.round() == value { - value.round().to_u32().unwrap_or(0).clamp(0, 255) - // Float - } else { - (value * 255.0).round().to_u32().unwrap_or(0).clamp(0, 255) - } -} - -/// A simplified interface for executing the CSS parser. -pub struct CssParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -impl<'input> CssParserFacade<'input> { - fn create_parser(&self) -> CssParser<'input> { - CssParser::new(self.0, &self.1) - } - - /// Parses `CssDocument` until end-of-file. - pub fn parse_document(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_document() - } - - /// Parses either a string or return source text as is. - pub fn parse_text(&self) -> (String, Location) { - let mut parser = self.create_parser(); - while parser.tokenizer.consume_whitespace() { - // Consumed whitespace - } - let d = parser.tokenizer.characters().peek_or_zero(); - if ['"', '\''].contains(&d) { - parser.next(); - let mut v: (String, Location) = ("".into(), parser.tokenizer.cursor_location()); - while let Token::String(v1) = parser.token.0.clone() { - v = (v1, parser.token.1.clone()); - parser.next(); - } - parser.expect_eof(); - v - } else { - let mut s = String::new(); - let i = parser.tokenizer.characters().index(); - while let Some(ch) = parser.tokenizer.characters_mut().next() { - s.push(ch); - } - let j = parser.tokenizer.characters().index(); - (s, Location::with_offsets(parser.compilation_unit(), i, j)) - } - } - - /// Parses `CssSelectorCondition` until end-of-file. - pub fn parse_selector_condition(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_selector_condition(); - parser.expect_eof(); - r - } - - pub fn parse_property(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property(); - parser.expect_eof(); - r - } - - pub fn parse_property_value(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property_value(CssOperatorPrecedence::Array); - parser.expect_eof(); - r - } - - pub fn parse_rgb(&self) -> Option { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.expect_unitless_number()?; - let g: f64; - let b: f64; - if parser.consume(Token::Comma) { - g = parser.expect_unitless_number()?; - parser.expect(Token::Comma); - b = parser.expect_unitless_number()?; - } else { - g = parser.expect_unitless_number()?; - b = parser.expect_unitless_number()?; - } - parser.expect_eof(); - Some(rgb_bytes_to_integer(r, g, b)) - } - - pub fn parse_embed_entries(&self) -> Vec> { - let mut parser = self.create_parser(); - let mut entries: Vec> = vec![]; - parser.next(); - if !parser.eof() { - entries.push(parser.parse_embed_entry()); - } - while parser.consume(Token::Comma) { - entries.push(parser.parse_embed_entry()); - } - parser.expect_eof(); - entries - } -} diff --git a/crates/parser/parser/css_tokenizer.rs b/crates/parser/parser/css_tokenizer.rs deleted file mode 100644 index 8c12cae..0000000 --- a/crates/parser/parser/css_tokenizer.rs +++ /dev/null @@ -1,434 +0,0 @@ -use crate::ns::*; -use std::str::FromStr; - -pub struct CssTokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> CssTokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - pub fn characters_mut(&mut self) -> &mut CharacterReader<'input> { - &mut self.characters - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - pub fn scan(&mut self) -> (Token, Location) { - while self.consume_whitespace() || self.consume_comment() { - // Do nothing - } - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - if let Some(id) = self.consume_css_id() { - return (Token::Identifier(id), start.combine_with(self.cursor_location())); - } - - // DECIMAL - // DECIMAL.PART - if CharacterValidator::is_dec_digit(ch) { - self.characters.next(); - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - } - return self.finish_number(start); - } - - if ch == '#' { - self.characters.next(); - let mut word = String::new(); - loop { - let ch = self.characters.peek_or_zero(); - if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '-' || ch == '_' { - word.push(ch); - self.characters.next(); - } else { - break; - } - } - if word.is_empty() { - self.add_unexpected_error(); - word = INVALIDATED_IDENTIFIER.to_owned(); - } - return (Token::CssHashWord(word), start.combine_with(self.cursor_location())); - } - - if ch == '@' { - // @namespace - if self.characters.peek_seq(10) == "@namespace" { - self.characters.skip_count_in_place(10); - return (Token::CssAtNamespace, start.combine_with(self.cursor_location())); - } - // @font-face - if self.characters.peek_seq(10) == "@font-face" { - self.characters.skip_count_in_place(10); - return (Token::CssAtFontFace, start.combine_with(self.cursor_location())); - } - // @media - if self.characters.peek_seq(6) == "@media" { - self.characters.skip_count_in_place(6); - return (Token::CssAtMedia, start.combine_with(self.cursor_location())); - } - } - - if ch == '!' && self.characters.peek_seq(10) == "!important" { - self.characters.skip_count_in_place(10); - return (Token::CssImportant, start.combine_with(self.cursor_location())); - } - - match ch { - // . - // .DECIMAL - '.' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - return self.finish_number(start); - } - (Token::Dot, start.combine_with(self.cursor_location())) - }, - '"' | '\'' => { - self.scan_string(ch, start) - }, - ';' => { - while self.characters.peek_or_zero() == ';' { - self.characters.next(); - } - (Token::CssSemicolons, start.combine_with(self.cursor_location())) - }, - '^' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssBeginsWith, start.combine_with(self.cursor_location())) - } - }, - '$' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssEndsWith, start.combine_with(self.cursor_location())) - } - }, - '*' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssContains, start.combine_with(self.cursor_location())) - } else { - (Token::Times, start.combine_with(self.cursor_location())) - } - }, - '~' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssListMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Tilde, start.combine_with(self.cursor_location())) - } - }, - '|' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssHreflangMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Pipe, start.combine_with(self.cursor_location())) - } - }, - '{' => { - self.characters.next(); - (Token::BlockOpen, start.combine_with(self.cursor_location())) - }, - '}' => { - self.characters.next(); - (Token::BlockClose, start.combine_with(self.cursor_location())) - }, - '[' => { - self.characters.next(); - (Token::SquareOpen, start.combine_with(self.cursor_location())) - }, - ']' => { - self.characters.next(); - (Token::SquareClose, start.combine_with(self.cursor_location())) - }, - '(' => { - self.characters.next(); - (Token::ParenOpen, start.combine_with(self.cursor_location())) - }, - ')' => { - self.characters.next(); - (Token::ParenClose, start.combine_with(self.cursor_location())) - }, - ',' => { - self.characters.next(); - (Token::Comma, start.combine_with(self.cursor_location())) - }, - '%' => { - self.characters.next(); - (Token::Percent, start.combine_with(self.cursor_location())) - }, - '=' => { - self.characters.next(); - (Token::Assign, start.combine_with(self.cursor_location())) - }, - ':' => { - self.characters.next(); - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - (Token::ColonColon, start.combine_with(self.cursor_location())) - } else { - (Token::Colon, start.combine_with(self.cursor_location())) - } - }, - '>' => { - self.characters.next(); - (Token::Gt, start.combine_with(self.cursor_location())) - }, - '+' => { - self.characters.next(); - (Token::Plus, start.combine_with(self.cursor_location())) - }, - _ => { - if self.characters.reached_end() { - return (Token::Eof, start); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan() - }, - } - } - - pub fn consume_whitespace(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if [' ', '\t', '\n', '\r'].contains(&ch) { - self.characters.next(); - true - } else { - false - } - } - - fn consume_comment(&mut self) -> bool { - if self.characters.peek_or_zero() == '/' && self.characters.peek_at_or_zero(1) == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - true - } else { - false - } - } - - fn consume_css_id(&mut self) -> Option { - let i = self.characters.index(); - let mut prefix_n = 0; - if self.characters.peek_or_zero() == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - } - } - } else if self.characters.peek_or_zero() == '-' { - prefix_n += 1; - } - if CharacterValidator::is_css_identifier_start(self.characters.peek_at_or_zero(prefix_n)) { - self.characters.skip_count_in_place(prefix_n + 1); - while CharacterValidator::is_css_identifier_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - return Some(self.compilation_unit.text()[i..self.characters.index()].to_owned()); - } - None - } - - fn finish_number(&mut self, start: Location) -> (Token, Location) { - let digits = &self.compilation_unit.text()[start.first_offset..self.characters.index()]; - let mut mv = f64::from_str(digits).unwrap_or(f64::NAN); - let mut unit: Option = None; - if self.characters.peek_or_zero() == '%' { - self.characters.next(); - mv /= 100.0; - } else { - unit = self.consume_css_id(); - } - (Token::CssNumber { - value: mv, - unit, - }, start.combine_with(self.cursor_location())) - } - - fn scan_string(&mut self, delim: char, start: Location) -> (Token, Location) { - let mut builder = String::new(); - self.characters.next(); - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if ch == '\\' { - let mut loc = self.cursor_location(); - self.characters.next(); - let mut digits = String::new(); - for _ in 0..6 { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_hex_digit(ch) { - digits.push(ch); - self.characters.next(); - } else { - break; - } - } - if digits.is_empty() { - self.add_unexpected_error(); - } else { - loc = loc.combine_with(self.cursor_location()); - let mv = u32::from_str_radix(&digits, 16).ok().and_then(|mv| char::from_u32(mv)); - if let Some(mv) = mv { - builder.push(mv); - } else { - self.add_syntax_error(&loc, DiagnosticKind::CssInvalidHexEscape, diagarg![digits]); - } - } - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - let loc = start.combine_with(self.cursor_location()); - (Token::String(builder), loc) - } - - pub fn scan_arguments(&mut self) -> ((usize, usize), (Token, Location)) { - let i = self.characters.index(); - let mut j: usize; - let mut nesting = 1; - let token: (Token, Location); - loop { - j = self.characters.index(); - let ch = self.characters.peek_or_zero(); - if ch == ')' { - self.characters.next(); - nesting -= 1; - if nesting == 0 { - token = (Token::ParenClose, Location::with_offsets(&self.compilation_unit, j, self.characters.index())); - break; - } - } else if ch == '(' { - self.characters.next(); - nesting += 1; - } else if self.characters.reached_end() { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::Expecting, diagarg![Token::ParenClose, Token::Eof]); - token = (Token::Eof, self.cursor_location()); - break; - } else { - self.characters.next(); - } - } - ((i, j), token) - } -} \ No newline at end of file diff --git a/crates/parser/parser/parser.rs b/crates/parser/parser/parser.rs deleted file mode 100644 index 664a137..0000000 --- a/crates/parser/parser/parser.rs +++ /dev/null @@ -1,5364 +0,0 @@ -use crate::ns::*; -use lazy_regex::*; - -pub struct Parser<'input> { - tokenizer: Tokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - activations: Vec, - ignore_xml_whitespace: bool, - expecting_token_error: bool, -} - -impl<'input> Parser<'input> { - /// Constructs a parser. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: Tokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - activations: vec![], - ignore_xml_whitespace: options.ignore_xml_whitespace, - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ignore_xml_whitespace: self.ignore_xml_whitespace, - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn patch_syntax_error(&self, original: DiagnosticKind, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().diagnostics.borrow().is_empty() { - return; - } - if self.compilation_unit().diagnostics.borrow().last().unwrap().kind == original { - let loc = self.compilation_unit().diagnostics.borrow_mut().pop().unwrap().location(); - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(&loc, kind, arguments)); - } - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_div(); - } - - fn next_ie_xml_tag(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_tag(); - } - - fn next_ie_xml_content(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_content(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - return Some((id, location)); - } - } - None - } - } - - fn peek_context_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_and_ie_xml_tag(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_tag(); - true - } else { - false - } - } - - fn consume_and_ie_xml_content(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_content(); - true - } else { - false - } - } - - fn consume_identifier(&mut self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - self.next(); - return Some((id, location)); - } - } - None - } - } - - fn _consume_context_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.next(); - true - } else { - false - } - } else { - false - } - } - - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - let expecting_identifier_name = token.is_identifier_name(); - while self.token.0 != Token::Eof && (if expecting_identifier_name { self.token.0.is_identifier_name() } else { true }) { - self.next(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn non_greedy_expect_virtual_semicolon(&mut self) { - self.expecting_token_error = false; - if !self.parse_semicolon() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - } - } - - fn expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_tag(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - fn expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_content(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn non_greedy_expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn expect_identifier(&mut self, reserved_words: bool) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - return (id, location); - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - /* - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if let Some(id) = self.consume_identifier(reserved_words) { - return id; - } else { - self.next(); - } - } - */ - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn _expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if self._consume_context_keyword(name) { - return; - } else { - self.next(); - } - } - } - - fn non_greedy_expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - } - - /// Expects a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn _expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if self.consume_type_parameters_gt() { - return; - } - } - } - } - - fn non_greedy_expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - } - } - - /// Consumes a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn consume_type_parameters_gt(&mut self) -> bool { - match self.token.0 { - Token::Gt => { - self.next(); - true - }, - Token::Ge => { - self.token.0 = Token::Assign; - self.token.1.first_offset += 1; - true - }, - Token::RightShift => { - self.token.0 = Token::Gt; - self.token.1.first_offset += 1; - true - }, - Token::RightShiftAssign => { - self.token.0 = Token::Ge; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShift => { - self.token.0 = Token::RightShift; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShiftAssign => { - self.token.0 = Token::RightShiftAssign; - self.token.1.first_offset += 1; - true - }, - _ => { - false - }, - } - } - - fn offending_token_is_inline_or_higher_indented(&self) -> bool { - if !self.previous_token.1.line_break(&self.token.1) { - return true; - } - let i1 = self.compilation_unit().get_line_indent(self.previous_token.1.first_line_number()); - let i2 = self.compilation_unit().get_line_indent(self.token.1.first_line_number()); - i2 > i1 - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof) - } - - fn create_invalidated_expression(&self, location: &Location) -> Rc { - Rc::new(Expression::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(Directive::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - pub fn parse_expression(&mut self, context: ParserExpressionContext) -> Rc { - if let Some(exp) = self.parse_opt_expression(context) { - exp - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - pub fn parse_opt_expression(&mut self, context: ParserExpressionContext) -> Option> { - let exp: Option> = self.parse_opt_start_expression(context.clone()); - - // Parse subexpressions - if let Some(exp) = exp { - return Some(self.parse_subexpressions(exp, context.clone())); - } - None - } - - fn parse_subexpressions(&mut self, mut base: Rc, context: ParserExpressionContext) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Increment) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostIncrement, - })); - } else if self.peek(Token::Decrement) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostDecrement, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - // `not in` - } else if self.token.0 == Token::Not && context.allow_in && context.min_precedence.includes(&OperatorPrecedence::Relational) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - self.non_greedy_expect(Token::In); - base = self.parse_binary_operator(base, Operator::NotIn, OperatorPrecedence::Relational.add(1).unwrap(), context.clone()); - // ConditionalExpression - } else if self.peek(Token::Question) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.push_location(&base.location()); - self.next(); - let consequent = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - let mut alternative = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - alternative = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - } - base = Rc::new(Expression::Conditional(ConditionalExpression { - location: self.pop_location(), - test: base, consequent, alternative, - })); - } else if let Some(binary_operator) = self.check_binary_operator(context.clone()) { - let BinaryOperator(operator, required_precedence, _) = binary_operator; - if context.min_precedence.includes(&required_precedence) { - self.next(); - base = self.parse_binary_operator(base, operator, binary_operator.right_precedence(), context.clone()); - } else { - break; - } - // AssignmentExpression - } else if self.peek(Token::Assign) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - if !left.is_valid_assignment_left_hand_side() { - self.add_syntax_error(&left.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: None, right, - })); - // CompoundAssignment and LogicalAssignment - } else if let Some(compound) = self.token.0.compound_assignment() { - if context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: Some(compound), right, - })); - } else { - break; - } - } else if self.peek(Token::Comma) && context.min_precedence.includes(&OperatorPrecedence::List) { - self.push_location(&base.location()); - self.next(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Sequence(SequenceExpression { - location: self.pop_location(), - left: base, right, - })); - } else { - break; - } - } - - base - } - - fn parse_binary_operator(&mut self, base: Rc, mut operator: Operator, right_precedence: OperatorPrecedence, context: ParserExpressionContext) -> Rc { - // The left operand of a null-coalescing operation must not be - // a logical AND, XOR or OR operation. - if operator == Operator::NullCoalescing { - if let Expression::Unary(UnaryExpression { expression, operator, .. }) = base.as_ref() { - if [Operator::LogicalAnd, Operator::LogicalXor, Operator::LogicalOr].contains(&operator) { - self.add_syntax_error(&expression.location(), DiagnosticKind::IllegalNullishCoalescingLeftOperand, vec![]); - } - } - } - - if operator == Operator::Is && self.consume(Token::Not) { - operator = Operator::IsNot; - } - - self.push_location(&base.location()); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: right_precedence, - ..context - }); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - left: base, operator, right, - })) - } - - fn check_binary_operator(&self, context: ParserExpressionContext) -> Option { - if let Some(operator) = self.token.0.to_binary_operator() { - if operator == Operator::In && !context.allow_in { - return None; - } - BinaryOperator::try_from(operator).ok() - } else { - None - } - } - - fn parse_optional_chaining(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - self.duplicate_location(); - let mut operation = Rc::new(Expression::OptionalChainingPlaceholder(OptionalChainingPlaceholder { - location: base.location(), - })); - if self.peek(Token::ParenOpen) { - let arguments: Vec> = self.parse_arguments(); - if arguments.len() == 1 && self.peek(Token::ColonColon) { - self.duplicate_location(); - let ql = self.pop_location(); - let q = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: arguments[0].clone(), - })); - let identifier = self.finish_qualified_identifier(false, ql, q); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, - identifier, - })); - } else { - operation = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base: operation, arguments - })); - } - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - operation = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: operation, asdoc, key, - })); - } else { - let identifier = self.parse_qualified_identifier(); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, identifier - })); - } - - // Parse postfix subexpressions - operation = self.parse_optional_chaining_subexpressions(operation); - - Rc::new(Expression::OptionalChaining(OptionalChainingExpression { - location: self.pop_location(), - base, expression: operation, - })) - } - - fn parse_optional_chaining_subexpressions(&mut self, mut base: Rc) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc: None, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - } else { - break; - } - } - - base - } - - fn parse_dot_subexpression(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - if self.peek(Token::ParenOpen) { - let paren_location = self.token_location(); - let paren_exp = self.parse_paren_list_expression(); - if !matches!(paren_exp.as_ref(), Expression::Sequence(_)) && self.peek(Token::ColonColon) { - let q = Rc::new(Expression::Paren(ParenExpression { - location: paren_location.clone(), - expression: paren_exp.clone(), - })); - let id = self.finish_qualified_identifier(false, paren_location, q); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } else { - Rc::new(Expression::Filter(FilterExpression { - location: self.pop_location(), - base, test: paren_exp - })) - } - } else if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })) - } else { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } - } - - /// Ensures a parameter list consists of zero or more required parameters followed by - /// zero or more optional parameters optionally followed by a rest parameter. - fn validate_parameter_list(&mut self, params: Vec<(ParameterKind, Location)>) { - let mut least_kind = ParameterKind::Required; - let mut has_rest = false; - for (param_kind, param_loc) in params { - if !least_kind.may_be_followed_by(param_kind) { - self.add_syntax_error(¶m_loc, DiagnosticKind::WrongParameterPosition, vec![]); - } - least_kind = param_kind; - if param_kind == ParameterKind::Rest && has_rest { - self.add_syntax_error(¶m_loc, DiagnosticKind::DuplicateRestParameter, vec![]); - } - has_rest = param_kind == ParameterKind::Rest; - } - } - - fn parse_opt_start_expression(&mut self, context: ParserExpressionContext) -> Option> { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - Some(self.parse_expression_starting_with_identifier((id, id_location))) - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - }))) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - }))) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - }))) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - }))) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Some(Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - }))) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - // Parentheses - } else if self.peek(Token::ParenOpen) { - Some(self.parse_paren_list_expr_or_qual_id()) - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - }))) - } else { - Some(self.parse_xml_element_or_xml_list(start)) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - Some(self.parse_array_initializer()) - // NewExpression - } else if self.peek(Token::New) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - let start = self.token_location(); - self.next(); - Some(self.parse_new_expression(start)) - } else if self.peek(Token::BlockOpen) { - Some(self.parse_object_initializer()) - } else if self.peek(Token::Function) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - Some(self.parse_function_expression(context.clone())) - // SuperExpression - } else if self.peek(Token::Super) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - Some(self.parse_super_expression_followed_by_property_operator()) - // AwaitExpression - } else if self.peek(Token::Await) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::Unary, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_await = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Await, - }))) - // YieldExpression - } else if self.peek(Token::Yield) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_yield = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Yield, - }))) - // Miscellaneous prefix unary expressions - } else if let Some((operator, subexp_precedence)) = self.check_prefix_operator() { - if context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { min_precedence: subexp_precedence, ..default() }); - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator, - }))) - } else { - None - } - // ImportMeta - } else if self.peek(Token::Import) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Dot); - self.non_greedy_expect_context_keyword("meta"); - Some(Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - }))) - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - } else { - None - } - } - - fn parse_expression_starting_with_identifier(&mut self, id: (String, Location)) -> Rc { - let id_location = id.1.clone(); - let id = id.0; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } - - fn check_prefix_operator(&self) -> Option<(Operator, OperatorPrecedence)> { - match self.token.0 { - Token::Delete => Some((Operator::Delete, OperatorPrecedence::Postfix)), - Token::Void => Some((Operator::Void, OperatorPrecedence::Unary)), - Token::Typeof => Some((Operator::Typeof, OperatorPrecedence::Unary)), - Token::Increment => Some((Operator::PreIncrement, OperatorPrecedence::Postfix)), - Token::Decrement => Some((Operator::PreDecrement, OperatorPrecedence::Postfix)), - Token::Plus => Some((Operator::Positive, OperatorPrecedence::Unary)), - Token::Minus => Some((Operator::Negative, OperatorPrecedence::Unary)), - Token::Tilde => Some((Operator::BitwiseNot, OperatorPrecedence::Unary)), - Token::Exclamation => Some((Operator::LogicalNot, OperatorPrecedence::Unary)), - _ => None, - } - } - - fn parse_function_expression(&mut self, context: ParserExpressionContext) -> Rc { - self.mark_location(); - self.next(); - let mut name = None; - if let Token::Identifier(id) = self.token.0.clone() { - name = Some((id, self.token.1.clone())); - self.next(); - } - let common = self.parse_function_common(true, ParserDirectiveContext::Default, context.allow_in); - Rc::new(Expression::Function(FunctionExpression { - location: self.pop_location(), - name, - common, - })) - } - - fn parse_function_common(&mut self, function_expr: bool, block_context: ParserDirectiveContext, allow_in: bool) -> Rc { - self.mark_location(); - self.duplicate_location(); - let mut params: Vec> = vec![]; - let mut return_annotation = Some(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - params.push(self.parse_parameter()); - while self.consume(Token::Comma) { - params.push(self.parse_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - return_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - } - self.validate_parameter_list(params.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let signature_location = self.pop_location(); - - // Enter activation - self.activations.push(ParserActivation::new()); - - // Body - let body = if self.peek(Token::BlockOpen) { - Some(FunctionBody::Block(Rc::new(self.parse_block(block_context)))) - } else if !(self.offending_token_is_inline_or_higher_indented() || self.peek(Token::ParenOpen)) { - None - } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }).map(|e| FunctionBody::Expression(e)) - }; - - // Body is required by function expressions - if body.is_none() && function_expr { - self.non_greedy_expect(Token::BlockOpen); - } - - // Exit activation - let activation = self.activations.pop().unwrap(); - - Rc::new(FunctionCommon { - location: self.pop_location(), - contains_await: activation.uses_await, - contains_yield: activation.uses_yield, - signature: FunctionSignature { - location: signature_location, - parameters: params, - result_type: return_annotation, - }, - body, - }) - } - - fn parse_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let binding: Rc = Rc::new(self.parse_variable_binding(true)); - let has_initializer = binding.initializer.is_some(); - let location = self.pop_location(); - if rest && has_initializer { - self.add_syntax_error(&location.clone(), DiagnosticKind::MalformedRestParameter, vec![]); - } - Rc::new(Parameter { - location, - destructuring: binding.destructuring.clone(), - default_value: binding.initializer.clone(), - kind: if rest { - ParameterKind::Rest - } else if has_initializer { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_object_initializer(&mut self) -> Rc { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut fields: Vec> = vec![]; - while !self.peek(Token::BlockClose) { - fields.push(self.parse_field()); - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::BlockClose); - - Rc::new(Expression::ObjectInitializer(ObjectInitializer { - location: self.pop_location(), - fields, - })) - } - - fn parse_field(&mut self) -> Rc { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - let subexp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - return Rc::new(InitializerField::Rest((subexp, self.pop_location()))); - } - - let name = self.parse_field_name(); - - let non_null = self.consume(Token::Exclamation); - let mut value = None; - - if self.consume(Token::Colon) { - value = Some(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } else if !matches!(name.0, FieldName::Identifier(_)) { - self.non_greedy_expect(Token::Colon); - } - - Rc::new(InitializerField::Field { - name, - non_null, - value, - }) - } - - fn parse_field_name(&mut self) -> (FieldName, Location) { - if let Token::String(value) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::StringLiteral(Rc::new(Expression::StringLiteral(StringLiteral { - location: location.clone(), - value: value.clone(), - }))), location) - } else if let Token::Number(value, suffix) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::NumericLiteral(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: location.clone(), - value: value.clone(), - suffix: *suffix, - }))), location) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let key_expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - let location = self.pop_location(); - (FieldName::Brackets(key_expr), location) - } else { - let id = self.parse_non_attribute_qualified_identifier(); - let l = id.location.clone(); - (FieldName::Identifier(id), l) - } - } - - fn parse_new_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - if self.consume(Token::Lt) { - let element_type = self.parse_type_expression(); - self.non_greedy_expect_type_parameters_gt(); - let mut elements: Vec = vec![]; - self.non_greedy_expect(Token::SquareOpen); - if !self.expecting_token_error { - while !self.peek(Token::SquareClose) { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - } - Rc::new(Expression::VectorLiteral(VectorLiteral { - location: self.pop_location(), - element_type, - elements, - })) - } else { - let base = self.parse_new_subexpression(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - Rc::new(Expression::New(NewExpression { - location: self.pop_location(), - base, arguments, - })) - } - } - - fn parse_new_expression_start(&mut self) -> Rc { - if self.peek(Token::New) { - let start = self.token_location(); - self.next(); - self.parse_new_expression(start) - } else if self.peek(Token::Super) { - self.parse_super_expression_followed_by_property_operator() - } else { - self.parse_primary_expression() - } - } - - fn parse_super_expression_followed_by_property_operator(&mut self) -> Rc { - self.mark_location(); - self.duplicate_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let super_expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - - if self.consume(Token::SquareOpen) { - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: super_expr, asdoc: None, key, - })) - } else { - self.non_greedy_expect(Token::Dot); - let identifier = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: super_expr, identifier, - })) - } - } - - fn parse_arguments(&mut self) -> Vec> { - self.non_greedy_expect(Token::ParenOpen); - let mut arguments = vec![]; - if !self.peek(Token::ParenClose) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - while self.consume(Token::Comma) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - } - self.non_greedy_expect(Token::ParenClose); - arguments - } - - fn parse_new_subexpression(&mut self) -> Rc { - let mut base = self.parse_new_expression_start(); - loop { - if self.consume(Token::SquareOpen) { - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base, asdoc: None, key, - })); - } else if self.consume(Token::Dot) { - self.push_location(&base.location()); - if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - base = Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })); - } else { - let identifier = self.parse_qualified_identifier(); - base = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier, - })); - } - } else { - break; - } - } - base - } - - fn parse_primary_expression(&mut self) -> Rc { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - })) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - })) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - })) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - })) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - })) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - // Parentheses - } else if self.peek(Token::ParenOpen) { - return self.parse_paren_list_expr_or_qual_id(); - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - })) - } else { - self.parse_xml_element_or_xml_list(start) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - self.parse_array_initializer() - } else if self.peek(Token::BlockOpen) { - self.parse_object_initializer() - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - /* - fn finish_embed_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - let descriptor = self.parse_object_initializer().clone(); - let Expression::ObjectInitializer(descriptor) = descriptor.as_ref() else { - panic!(); - }; - return Rc::new(Expression::Embed(EmbedExpression { - location: self.pop_location(), - description: descriptor.clone(), - })); - } - */ - - fn parse_array_initializer(&mut self) -> Rc { - self.mark_location(); - - let asdoc = self.parse_asdoc(); - - self.non_greedy_expect(Token::SquareOpen); - - let mut elements: Vec = vec![]; - - while !self.peek(Token::SquareClose) { - let mut ellipses = false; - while self.consume(Token::Comma) { - elements.push(Element::Elision); - ellipses = true; - } - if !ellipses { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ArrayLiteral(ArrayLiteral { - location: self.pop_location(), - asdoc, - elements, - })) - } - - fn parse_xml_element_or_xml_list(&mut self, start: Location) -> Rc { - self.next_ie_xml_tag(); - if self.consume_and_ie_xml_content(Token::Gt) { - self.push_location(&start); - let content = self.parse_xml_content(); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - self.non_greedy_expect(Token::Gt); - return Rc::new(Expression::XmlList(XmlListExpression { - location: self.pop_location(), - content, - })); - } - - self.push_location(&start); - let element = Rc::new(self.parse_xml_element(start, true)); - return Rc::new(Expression::Xml(XmlExpression { - location: self.pop_location(), - element, - })); - } - - /// Parses XMLElement starting from its XMLTagContent. - fn parse_xml_element(&mut self, start: Location, ends_at_ie_div: bool) -> XmlElement { - self.push_location(&start); - let name = self.parse_xml_tag_name(); - let mut attributes: Vec> = vec![]; - let mut attribute_expression: Option> = None; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - attribute_expression = Some(expr); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - break; - } else if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = XmlAttributeValue::Value(("".into(), self.token.1.clone())); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - value = XmlAttributeValue::Expression(expr); - } else { - value = XmlAttributeValue::Value(self.parse_xml_attribute_value()); - } - } - attributes.push(Rc::new(XmlAttribute { - location: self.pop_location(), - name, value - })); - } else { - break; - } - } - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty; - - if ends_at_ie_div { - is_empty = self.consume(Token::XmlSlashGt); - } else { - is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - } - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_xml_content()); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - closing_name = Some(self.parse_xml_tag_name()); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if ends_at_ie_div { - self.non_greedy_expect(Token::Gt); - } else { - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - - XmlElement { - location: self.pop_location(), - name, - attributes, - attribute_expression, - content, - closing_name, - } - } - - fn parse_xml_attribute_value(&mut self) -> (String, Location) { - if let Token::XmlAttributeValue(value) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_tag(); - return (value, location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlAttributeValue, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - fn parse_xml_tag_name(&mut self) -> XmlTagName { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - self.expect_and_ie_xml_tag(Token::BlockClose); - XmlTagName::Expression(expr) - } else { - XmlTagName::Name(self.parse_xml_name()) - } - } - - fn parse_xml_name(&mut self) -> (String, Location) { - if let Token::XmlName(name) = self.token.0.clone() { - let name_location = self.token_location(); - self.next_ie_xml_tag(); - return (name, name_location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlName, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.into(), self.tokenizer.cursor_location()) - } - } - - /// Parses XMLContent until a ` Vec> { - let mut content = vec![]; - while !self.peek(Token::XmlLtSlash) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_content(Token::BlockClose); - content.push(Rc::new(XmlContent::Expression(expr))); - } else if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Markup((markup, location)))); - } else if let Token::XmlText(text) = self.token.0.clone() { - if self.tokenizer.characters().reached_end() { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - break; - } - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Characters((text, location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_xml_element(start, false); - content.push(Rc::new(XmlContent::Element(Rc::new(element)))); - } else if self.peek(Token::Eof) { - break; - } else { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - } - } - content - } - - fn finish_paren_list_expr_or_qual_id(&mut self, start: Location, left: Rc) -> Rc { - if self.peek(Token::ColonColon) && !matches!(left.as_ref(), Expression::Sequence(_)) { - self.push_location(&start); - let ql = self.pop_location(); - let left = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: left, - })); - let id = self.finish_qualified_identifier(false, ql, left); - return Rc::new(Expression::QualifiedIdentifier(id)); - } - self.push_location(&start); - return Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression: left, - })); - } - - /// Parses either a ParenListExpression, (), or a QualifiedIdentifier - fn parse_paren_list_expr_or_qual_id(&mut self) -> Rc { - let start = self.token_location(); - self.non_greedy_expect(Token::ParenOpen); - - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - - self.non_greedy_expect(Token::ParenClose); - self.finish_paren_list_expr_or_qual_id(start, expr) - } - - fn parse_opt_reserved_namespace(&mut self) -> Option> { - let loc = self.token.1.clone(); - if self.consume(Token::Public) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Public(loc)))) - } else if self.consume(Token::Private) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Private(loc)))) - } else if self.consume(Token::Protected) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Protected(loc)))) - } else if self.consume(Token::Internal) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Internal(loc)))) - } else { - None - } - } - - fn parse_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = self.consume(Token::Attribute); - if attribute && self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - return QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Brackets(brackets), - }; - } - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - fn parse_non_attribute_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = false; - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - /// Expects a colon-colon and finishes a qualified identifier. - fn finish_qualified_identifier(&mut self, attribute: bool, start_location: Location, qual: Rc) -> QualifiedIdentifier { - self.push_location(&start_location); - self.non_greedy_expect(Token::ColonColon); - - // `::` may be followed by one of { IdentifierName, `*`, Brackets } - - // IdentifierName - if let Some(id) = self.consume_identifier(true) { - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(id), - } - // `*` - } else if self.peek(Token::Times) { - let id_location = self.token_location(); - self.next(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("*".into(), id_location)), - } - // Brackets - } else if self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Brackets(brackets), - } - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - } - - fn parse_brackets(&mut self) -> Rc { - self.non_greedy_expect(Token::SquareOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - expr - } - - fn parse_paren_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_paren_list_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_typed_destructuring(&mut self) -> TypedDestructuring { - self.mark_location(); - let mut destructuring: Rc; - if self.peek(Token::BlockOpen) { - destructuring = self.parse_object_initializer(); - } else if self.peek(Token::SquareOpen) { - destructuring = self.parse_array_initializer(); - } else { - let id = self.expect_identifier(true); - let id = QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }; - destructuring = Rc::new(Expression::QualifiedIdentifier(id)); - } - if self.consume(Token::Exclamation) { - self.push_location(&destructuring.location()); - destructuring = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::NonNull, - expression: destructuring.clone(), - })); - } - if !destructuring.is_valid_destructuring() { - self.add_syntax_error(&destructuring.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let type_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - TypedDestructuring { - location: self.pop_location(), - destructuring, - type_annotation, - } - } - - pub fn parse_type_expression(&mut self) -> Rc { - let start = self.token_location(); - let (mut base, wrap_nullable) = self.parse_type_expression_start(); - - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::Question) { - self.push_location(&base.location()); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } else if self.consume(Token::Exclamation) { - self.push_location(&base.location()); - base = Rc::new(Expression::NonNullableType(NonNullableTypeExpression { - location: self.pop_location(), - base, - })); - } else { - break; - } - } - - if wrap_nullable { - self.push_location(&start); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } - - base - } - - fn parse_type_expression_start(&mut self) -> (Rc, bool) { - // Allow a `?` prefix to wrap a type into nullable. - let wrap_nullable = self.consume(Token::Question); - - // Parenthesized - if self.peek(Token::ParenOpen) { - self.mark_location(); - let expression = self.parse_type_expression(); - (Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })), wrap_nullable) - } - // `function` - else if self.peek(Token::Function) { - (self.parse_function_type_expression(), wrap_nullable) - // `void` - } else if self.peek(Token::Void) { - self.mark_location(); - self.next(); - (Rc::new(Expression::VoidType(VoidTypeExpression { - location: self.pop_location(), - })), wrap_nullable) - // [T] - // [T1, T2, ...Tn] - } else if self.peek(Token::SquareOpen) { - let mut elements = vec![]; - self.mark_location(); - self.next(); - elements.push(self.parse_type_expression()); - if self.consume(Token::SquareClose) { - (Rc::new(Expression::ArrayType(ArrayTypeExpression { - location: self.pop_location(), - expression: elements[0].clone(), - })), wrap_nullable) - } else { - self.non_greedy_expect(Token::Comma); - elements.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - if self.peek(Token::SquareClose) { - break; - } - elements.push(self.parse_type_expression()); - } - self.non_greedy_expect(Token::SquareClose); - (Rc::new(Expression::TupleType(TupleTypeExpression { - location: self.pop_location(), - expressions: elements, - })), wrap_nullable) - } - } else if self.peek(Token::Times) { - let location = self.token_location(); - self.next(); - (Rc::new(Expression::AnyType(AnyTypeExpression { - location, - })), wrap_nullable) - // Identifier - } else { - let id = self.parse_qualified_identifier(); - (Rc::new(Expression::QualifiedIdentifier(id)), wrap_nullable) - } - } - - fn parse_function_type_expression(&mut self) -> Rc { - self.mark_location(); - self.next(); - - let mut parameters = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - parameters.push(self.parse_function_type_parameter()); - while self.consume(Token::Comma) { - parameters.push(self.parse_function_type_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - self.validate_parameter_list(parameters.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let mut result_type = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - result_type = self.parse_type_expression(); - } - Rc::new(Expression::FunctionType(FunctionTypeExpression { - location: self.pop_location(), - parameters, - result_type: Some(result_type), - })) - } - - fn parse_function_type_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let type_expression: Option> = if rest && self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_type_expression()) - }; - let optional = !rest && self.consume(Token::Assign); - let location = self.pop_location(); - Rc::new(FunctionTypeParameter { - location, - type_expression, - kind: if rest { - ParameterKind::Rest - } else if optional { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_variable_binding(&mut self, allow_in: bool) -> VariableBinding { - let destructuring = self.parse_typed_destructuring(); - let initializer = if self.consume(Token::Assign) { - Some(self.parse_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })) - } else { - None - }; - VariableBinding { - destructuring, - initializer, - } - } - - fn parse_semicolon(&mut self) -> bool { - self.consume(Token::Semicolon) || self.peek(Token::BlockClose) || self.previous_token.1.line_break(&self.token.1) - } - - fn parse_substatement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.parse_statement(context) - } - - fn parse_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - // ExpressionStatement or LabeledStatement - if let Token::Identifier(id) = &self.token.0.clone() { - let id = (id.clone(), self.token_location()); - self.next(); - self.parse_statement_starting_with_identifier(context, id) - // SuperStatement or ExpressionStatement with `super` - } else if self.peek(Token::Super) { - self.mark_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let mut semicolon = false; - if arguments.is_some() { - semicolon = self.parse_semicolon(); - } - if !semicolon && (self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - if !(self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - self.non_greedy_expect(Token::Dot); - } - self.duplicate_location(); - // ExpressionStatement (`super`...) - let mut expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - expr = self.parse_subexpressions(expr, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: expr, - })), semicolon) - } else { - // SuperStatement - let node = Rc::new(Directive::SuperStatement(SuperStatement { - location: self.pop_location(), - arguments: arguments.unwrap(), - })); - - // Check whether super statement is allowed here - let allowed_here; - if context.may_contain_super_statement() { - allowed_here = !context.super_statement_found(); - context.set_super_statement_found(true); - } else { - allowed_here = false; - } - - if !allowed_here { - self.add_syntax_error(&node.location(), DiagnosticKind::NotAllowedHere, diagarg![Token::Super]); - } - - (node, semicolon) - } - // EmptyStatement - } else if self.peek(Token::Semicolon) { - self.mark_location(); - self.next(); - (Rc::new(Directive::EmptyStatement(EmptyStatement { - location: self.pop_location(), - })), true) - // Block - } else if self.peek(Token::BlockOpen) { - let context = if context.is_top_level_or_package() || context.is_type_block() { - context.clone() - } else { - context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }) - }; - let block = self.parse_block(context); - (Rc::new(Directive::Block(block)), true) - // IfStatement - } else if self.peek(Token::If) { - self.parse_if_statement(context) - // SwitchStatement - // `switch type` - } else if self.peek(Token::Switch) { - self.parse_switch_statement(context) - // DoStatement - } else if self.peek(Token::Do) { - self.parse_do_statement(context) - // WhileStatement - } else if self.peek(Token::While) { - self.parse_while_statement(context) - // ForStatement - // `for..in` - // `for each` - } else if self.peek(Token::For) { - self.parse_for_statement(context) - // WithStatement - } else if self.peek(Token::With) { - self.parse_with_statement(context) - // BreakStatement - } else if self.peek(Token::Break) { - self.parse_break_statement(context) - // ContinueStatement - } else if self.peek(Token::Continue) { - self.parse_continue_statement(context) - // ReturnStatement - } else if self.peek(Token::Return) { - self.parse_return_statement(context) - // ThrowStatement - } else if self.peek(Token::Throw) { - self.parse_throw_statement(context) - // TryStatement - } else if self.peek(Token::Try) { - self.parse_try_statement(context) - // `default xml namespace = expression` - } else if self.peek(Token::Default) { - self.parse_default_xml_namespace_statement() - // ExpressionStatement - } else { - self.mark_location(); - - // Store offset for patching error - let i = self.tokenizer.characters().index(); - - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Patch error - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingExpression, DiagnosticKind::ExpectingStatement, diagarg![self.token.0.clone()]); - } - - let semicolon = if exp.is_invalidated() { - self.next(); - true - } else { self.parse_semicolon() }; - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - } - - fn parse_statement_starting_with_identifier(&mut self, context: ParserDirectiveContext, id: (String, Location)) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - - // LabeledStatement - if self.consume(Token::Colon) { - let (substatement, semicolon) = self.parse_substatement(context.put_label(id.0.clone())); - let labeled = Rc::new(Directive::LabeledStatement(LabeledStatement { - location: self.pop_location(), - label: id.clone(), - substatement, - })); - return (labeled, semicolon); - } - - let mut exp: Rc; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id.0 == "embed" && self.previous_token.1.character_count() == "embed".len() { - exp = self.finish_embed_expression(id_location); - } else { - */ - { - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - exp = Rc::new(Expression::QualifiedIdentifier(id)); - } else { - exp = id; - } - } - - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_qualified_identifier_statement_or_normal_config(&mut self, context: ParserDirectiveContext, id: (String, Location), asdoc: Option>) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - let mut exp = Rc::new(Expression::QualifiedIdentifier(id)); - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&exp, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_opt_normal_config(&mut self, exp: &Rc, asdoc: Option>, context: ParserDirectiveContext) -> Option<(Rc, bool)> { - if self.peek_annotatable_directive_identifier_name() { - match exp.to_normal_configuration_identifier(self) { - Ok(Some((q, constant_name, metadata))) => { - self.push_location(&exp.location()); - let mut context = AnnotatableContext { - start_location: exp.location(), - asdoc: self.parse_asdoc().or(asdoc), - attributes: metadata, - context, - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - let (directive, semicolon) = self.parse_annotatable_directive(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive, - })), semicolon)); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - if self.peek(Token::BlockOpen) { - if let Some((q, constant_name)) = exp.to_normal_configuration_identifier_no_metadata() { - self.push_location(&exp.location()); - let block = self.parse_block(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive: Rc::new(Directive::Block(block)), - })), true)); - } - } - None - } - - fn parse_block(&mut self, context: ParserDirectiveContext) -> Block { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut directives = vec![]; - if !self.expecting_token_error { - let mut semicolon = false; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - self.non_greedy_expect(Token::BlockClose); - } - Block { - location: self.pop_location(), - directives, - } - } - - fn parse_if_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut consequent: Rc = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let mut alternative: Option> = None; - let semicolon; - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - consequent = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - let (consequent_1, semicolon_1) = self.parse_substatement(context.clone()); - consequent = consequent_1; - if self.peek(Token::Else) { - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - self.next(); - let (alternative_2, semicolon_2) = self.parse_substatement(context.clone()); - alternative = Some(alternative_2); - semicolon = semicolon_2; - } else { - semicolon = semicolon_1; - } - } - } - (Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, consequent, alternative, - })), semicolon) - } - - fn parse_switch_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.peek_context_keyword("type") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_switch_type_statement(context); - } - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchStatement(SwitchStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - let mut semicolon = false; - while !self.peek(Token::BlockClose) { - if !cases.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - if !(self.peek(Token::Case) || self.peek(Token::Default)) { - break; - } - self.mark_location(); - let mut labels = vec![]; - loop { - if self.peek(Token::Case) { - self.mark_location(); - self.next(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Case((exp, self.pop_location()))); - } else if self.peek(Token::Default) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Default(self.pop_location())); - } else { - break; - } - } - let mut directives = vec![]; - semicolon = false; - while !(self.peek(Token::BlockClose) || self.peek(Token::Case) || self.peek(Token::Default)) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - cases.push(Case { - location: self.pop_location(), - labels, - directives, - }); - } - cases - } - - fn parse_switch_type_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_type_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchTypeStatement(SwitchTypeStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_type_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if self.peek(Token::Default) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter: None, - block, - }); - } else { - self.mark_location(); - self.non_greedy_expect(Token::Case); - if !self.expecting_token_error { - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = Some(self.parse_typed_destructuring()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter, - block, - }); - } - } - } - } - } - cases - } - - fn parse_do_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Body - let (body, semicolon_1) = self.parse_substatement(context); - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::While); - if !self.expecting_token_error { - test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - } - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::DoStatement(DoStatement { - location: self.pop_location(), - body, test, - })), semicolon) - } - - fn parse_while_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Test - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon: bool; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let (body_1, semicolon_1) = self.parse_substatement(context); - body = body_1; - semicolon = semicolon_1; - } else { - semicolon = self.parse_semicolon(); - } - } else { - semicolon = self.parse_semicolon(); - } - - (Rc::new(Directive::WhileStatement(WhileStatement { - location: self.pop_location(), - test, body, - })), semicolon) - } - - /// Parses `for`, `for..in` or `for each`. - fn parse_for_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // `for each` - if self.peek_context_keyword("each") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_for_each_statement(context); - } - - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init: None, test: None, update: None, body, - })), semicolon); - } - - let init_variable = if self.peek(Token::Var) || self.peek(Token::Const) { - Some(self.parse_simple_variable_definition(false)) - } else { - None - }; - - if init_variable.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_variable(context, init_variable.unwrap()); - } - - let mut init_exp = if init_variable.is_none() && !self.peek(Token::Semicolon) { - self.parse_opt_expression(ParserExpressionContext { - allow_in: false, - min_precedence: OperatorPrecedence::Postfix, - ..default() - }) - } else { - None - }; - - if init_exp.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_exp(context, init_exp.unwrap()); - } - - if init_exp.is_none() && init_variable.is_none() && !self.peek(Token::Semicolon) { - init_exp = Some(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } else if let Some(exp) = init_exp.as_ref() { - init_exp = Some(self.parse_subexpressions(exp.clone(), ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } - - let init = if let Some(exp) = init_exp.as_ref() { - Some(ForInitializer::Expression(exp.clone())) - } else if let Some(variable) = init_variable.as_ref() { - Some(ForInitializer::VariableDefinition(Rc::new(variable.clone()))) - } else { - None - }; - - self.non_greedy_expect(Token::Semicolon); - let test = if self.peek(Token::Semicolon) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::Semicolon); - let update = if self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init, test, update, body, - })), semicolon) - } - - fn parse_for_each_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let left = ForInBinding::Expression(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - let right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon); - } - - let left = if self.peek(Token::Var) || self.peek(Token::Const) { - self.mark_location(); - let kind = (if self.peek(Token::Var) { VariableDefinitionKind::Var } else { VariableDefinitionKind::Const }, self.token_location()); - self.next(); - let binding = self.parse_variable_binding(false); - if let Some(init) = &binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - ForInBinding::VariableDefinition(Rc::new(SimpleVariableDefinition { - location: self.pop_location(), - kind, - bindings: vec![Rc::new(binding)], - })) - } else { - ForInBinding::Expression(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::Postfix, ..default() - })) - }; - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::In); - if !self.expecting_token_error { - right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_variable(&mut self, context: ParserDirectiveContext, left: SimpleVariableDefinition) -> (Rc, bool) { - let variable_binding = left.bindings[0].clone(); - - if let Some(init) = &variable_binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - - if left.bindings.len() > 1 { - self.add_syntax_error(&left.kind.1.clone(), DiagnosticKind::MultipleForInBindings, vec![]); - } - - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::VariableDefinition(Rc::new(left)), right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_exp(&mut self, context: ParserDirectiveContext, left: Rc) -> (Rc, bool) { - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::Expression(left), right, body, - })), semicolon) - } - - fn parse_simple_variable_definition(&mut self, allow_in: bool) -> SimpleVariableDefinition { - self.mark_location(); - let kind: VariableDefinitionKind; - let kind_location = self.token_location(); - if self.consume(Token::Const) { - kind = VariableDefinitionKind::Const; - } else { - self.non_greedy_expect(Token::Var); - kind = VariableDefinitionKind::Var; - } - let mut bindings = vec![Rc::new(self.parse_variable_binding(allow_in))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(allow_in))); - } - SimpleVariableDefinition { - location: self.pop_location(), - kind: (kind, kind_location), - bindings, - } - } - - fn parse_with_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - - let mut object = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - object = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::WithStatement(WithStatement { - location: self.pop_location(), - object, body, - })), semicolon) - } - - fn parse_break_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::BreakStatement(BreakStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_break_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalBreak, vec![]); - } - - (node, semicolon) - } - - fn parse_continue_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ContinueStatement(ContinueStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_continue_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalContinue, vec![]); - } - - (node, semicolon) - } - - fn parse_return_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let expression = if self.previous_token.1.line_break(&self.token.1) { None } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }) - }; - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ReturnStatement(ReturnStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_throw_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let line_break = self.previous_token.1.line_break(&self.token.1); - - let expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - - if line_break { - self.add_syntax_error(&expression.location(), DiagnosticKind::ExpressionMustNotFollowLineBreak, vec![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ThrowStatement(ThrowStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_try_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - let context = context.clone_control(); - let block = Rc::new(self.parse_block(context.clone())); - let mut catch_clauses: Vec = vec![]; - let mut finally_clause: Option = None; - let mut found_catch = false; - loop { - if self.peek(Token::Catch) { - found_catch = true; - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = self.parse_typed_destructuring(); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - catch_clauses.push(CatchClause { - location: self.pop_location(), - parameter, - block, - }); - } - } - } else if self.peek(Token::Finally) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - finally_clause = Some(FinallyClause { - location: self.pop_location(), - block, - }); - break; - } else { - break; - } - } - if !found_catch && finally_clause.is_none() { - self.non_greedy_expect(Token::Catch); - } - - let node = Rc::new(Directive::TryStatement(TryStatement { - location: self.pop_location(), - block, catch_clauses, finally_clause, - })); - - (node, true) - } - - fn parse_default_xml_namespace_statement(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("xml"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - allow_assignment: false, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement { - location: self.pop_location(), - right: expression, - })); - - (node, semicolon) - } - - fn forbid_line_break_before_token(&mut self) { - if self.previous_token.1.line_break(&self.token.1) { - self.add_syntax_error(&self.token.1.clone(), DiagnosticKind::TokenMustNotFollowLineBreak, vec![]); - } - } - - fn parse_directive(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let asdoc: Option> = if self.peek(Token::SquareOpen) { None } else { self.parse_asdoc() }; - // ConfigurationDirective or Statement - if let Token::Identifier(id) = &self.token.0 { - let id = (id.clone(), self.token_location()); - self.next(); - - if id.0 == "include" && id.1.character_count() == "include".len() && matches!(self.token.0, Token::String(_)) && !self.previous_token.1.line_break(&self.token.1) { - return self.parse_include_directive(context, id.1); - } - - if self.peek(Token::BlockOpen) && &id.0 == "configuration" && id.1.character_count() == "configuration".len() { - return self.parse_configuration_directive(context, id.1); - } - - // If there is a line break or offending token is "::", - // do not proceed into parsing an expression attribute or annotatble directive. - let eligible_attribute_or_directive - = !self.previous_token.1.line_break(&self.token.1) - && !(matches!(self.token.0, Token::ColonColon)); - - if eligible_attribute_or_directive && (self.peek_annotatable_directive_identifier_name() || self.lookbehind_is_annotatable_directive_identifier_name()) { - let mut context1: AnnotatableContext; - - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) - && id.1.character_count() == id.0.len() - && self.token.0.is_identifier_name() { - context1 = AnnotatableContext { - start_location: id.1.clone(), - asdoc, - attributes: vec![], - context: context.clone(), - directive_context_keyword: Some(id.clone()), - }; - // self.parse_attribute_keywords_or_expressions(&mut context); - } else { - let mut first_attr_expr = self.parse_expression_starting_with_identifier(id); - first_attr_expr = self.parse_subexpressions(first_attr_expr, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Do not proceed into parsing an annotatable directive - // if there is a line break after an expression attribute, - // or if the offending token is not an identifier name, - // or if the expression attribute is not a valid access modifier. - if !first_attr_expr.valid_access_modifier() || self.previous_token.1.line_break(&self.token.1) || !(matches!(self.token.0, Token::Identifier(_)) || self.token.0.is_reserved_word()) { - self.push_location(&first_attr_expr.location()); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&first_attr_expr, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: first_attr_expr, - })), semicolon); - } - - let first_attr = self.keyword_or_expression_attribute_from_expression(&first_attr_expr); - - context1 = AnnotatableContext { - start_location: first_attr.location(), - asdoc, - attributes: vec![first_attr], - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context1); - } - return self.parse_annotatable_directive(context1); - } else if self.peek(Token::ColonColon) { - self.parse_qualified_identifier_statement_or_normal_config(context, id, asdoc) - } else { - self.parse_statement_starting_with_identifier(context, id) - } - } else if self.peek(Token::Import) { - self.parse_import_directive_or_expression_statement(context) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - if self.peek_annotatable_directive_identifier_name() { - match exp.to_metadata(self) { - Ok(Some(metadata)) => { - let mut context = AnnotatableContext { - start_location: self.pop_location(), - asdoc: self.parse_asdoc(), - attributes: metadata, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } else if self.peek(Token::Public) || self.peek(Token::Private) || self.peek(Token::Protected) - || self.peek(Token::Internal) || self.peek(Token::Var) || self.peek(Token::Const) - || self.peek(Token::Function) || self.peek(Token::Class) || self.peek(Token::Interface) { - let rns = self.parse_opt_reserved_namespace(); - let mut attributes: Vec = vec![]; - if let Some(rns) = rns { - // Do not proceed into parsing an annotatable directive - // if there is a "::" token. - if matches!(self.token.0, Token::ColonColon) { - self.push_location(&rns.location()); - let rns = Rc::new(Expression::QualifiedIdentifier(self.finish_qualified_identifier(false, rns.location(), rns))); - let rns = self.parse_subexpressions(rns, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: rns, - })), semicolon); - } - attributes.push(rns.to_reserved_namespace_attribute().unwrap()); - } - let mut context = AnnotatableContext { - start_location: self.token_location(), - asdoc, - attributes, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - } else if self.peek(Token::Use) { - self.parse_use_namespace_directive() - } else { - let i = self.tokenizer.characters().index(); - let r = self.parse_statement(context); - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingStatement, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - } - r - } - } - - fn parse_directives(&mut self, context: ParserDirectiveContext) -> Vec> { - let mut directives = vec![]; - let mut semicolon = false; - while !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - directives - } - - fn parse_expression_attribute(&mut self, id: &(String, Location)) -> Rc { - let mut result = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - loop { - if self.peek(Token::Dot) { - self.push_location(&result.location()); - self.next(); - let id = self.parse_qualified_identifier(); - result = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: result, identifier: id - })); - } else if self.consume(Token::SquareOpen) { - self.push_location(&result.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - result = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base: result, asdoc: None, key, location: self.pop_location() - })); - } else { - break; - } - } - result - } - - fn report_modifier_errors(&self, context: &AnnotatableContext) { - let mut i = 0usize; - while i < context.attributes.len() { - let a = &context.attributes[i]; - if Attribute::has(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAttribute, diagarg![]); - } - if Attribute::is_duplicate_access_modifier(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAccessModifier, diagarg![]); - } - i += 1; - } - } - - fn parse_annotatable_directive(&mut self, context: AnnotatableContext) -> (Rc, bool) { - if self.peek(Token::Var) || self.peek(Token::Const) { - self.report_modifier_errors(&context); - self.parse_variable_definition(context) - } else if self.consume(Token::Function) { - self.report_modifier_errors(&context); - self.parse_function_definition(context) - } else if self.consume(Token::Class) { - self.report_modifier_errors(&context); - self.parse_class_definition(context) - } else if context.has_directive_context_keyword("enum") { - self.report_modifier_errors(&context); - self.parse_enum_definition(context) - } else if context.has_directive_context_keyword("namespace") { - self.report_modifier_errors(&context); - self.parse_namespace_definition(context) - } else if self.consume(Token::Interface) { - self.report_modifier_errors(&context); - self.parse_interface_definition(context) - } else if context.has_directive_context_keyword("type") { - self.report_modifier_errors(&context); - self.parse_type_definition(context) - } else { - // In case there is a series of inline modifiers, - // report semicolon error between each. - let mut i = 0usize; - let mut error = false; - while i < context.attributes.len() { - if !context.attributes[i].is_metadata() { - let loc1 = context.attributes[i].location(); - if i + 1 < context.attributes.len() { - let loc2 = context.attributes[i + 1].location(); - if !loc1.line_break(&loc2) { - self.add_syntax_error(&loc2, DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - error = true; - } - } - } - i += 1; - } - - if !error { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingDirectiveKeyword, diagarg![self.token.0.clone()]); - } - self.push_location(&context.start_location); - let loc = self.pop_location(); - (self.create_invalidated_directive(&loc), true) - } - } - - pub(crate) fn refine_metadata(&self, exp: &Rc, asdoc: Option>) -> Result, MetadataRefineError> { - if let Expression::Call(CallExpression { base, arguments, .. }) = exp.as_ref() { - let Ok(name) = self.refine_metadata_name(base) else { - return Err(MetadataRefineError::Syntax); - }; - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: Some(self.refine_metadata_entries(arguments)?), - })) - } else { - if let Ok(name) = self.refine_metadata_name(exp) { - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: None, - })) - } else { - Err(MetadataRefineError::Syntax) - } - } - } - - fn refine_metadata_name(&self, exp: &Rc) -> Result<(String, Location), MetadataRefineError> { - if let Expression::QualifiedIdentifier(id) = exp.as_ref() { - if id.attribute { - return Err(MetadataRefineError::Syntax); - } - let qual = id.qualifier.as_ref().and_then(|q| q.to_identifier_name().map(|n| n.0)); - if id.qualifier.is_some() && qual.is_none() { - return Err(MetadataRefineError::Syntax); - } - if let QualifiedIdentifierIdentifier::Id((s, _)) = &id.id { - if s == "*" { Err(MetadataRefineError::Syntax) } else { Ok((if let Some(q) = qual { format!("{q}::{s}") } else { s.to_string() }, exp.location())) } - } else { - Err(MetadataRefineError::Syntax) - } - } else { - Err(MetadataRefineError::Syntax) - } - } - - fn refine_metadata_entries(&self, list: &Vec>) -> Result>, MetadataRefineError> { - let mut r = Vec::>::new(); - for entry in list { - r.push(self.refine_metadata_entry(&entry)?); - } - Ok(r) - } - - fn refine_metadata_entry(&self, exp: &Rc) -> Result, MetadataRefineError> { - match exp.as_ref() { - Expression::Assignment(AssignmentExpression { compound, left, right, location }) => { - if compound.is_some() { - return Err(MetadataRefineError::Syntax); - } - let key = self.refine_metadata_name(left)?; - if matches!(right.as_ref(), Expression::QualifiedIdentifier(_)) { - return Err(MetadataRefineError::Syntax); - } - let value = self.refine_metadata_value(right)?; - Ok(Rc::new(MetadataEntry { - location: location.clone(), - key: Some(key), - value: Rc::new(value), - })) - }, - _ => { - let value = self.refine_metadata_value(exp)?; - Ok(Rc::new(MetadataEntry { - location: exp.location(), - key: None, - value: Rc::new(value), - })) - }, - } - } - - fn refine_metadata_value(&self, exp: &Rc) -> Result { - match exp.as_ref() { - Expression::QualifiedIdentifier(_) => { - let name = self.refine_metadata_name(&exp)?; - Ok(MetadataValue::IdentifierString(name)) - }, - Expression::StringLiteral(StringLiteral { value, .. }) => Ok(MetadataValue::String((value.clone(), exp.location()))), - _ => Err(MetadataRefineError::Syntax), - } - } - - fn parse_import_directive_or_expression_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.consume(Token::Dot) { - self.duplicate_location(); - self.non_greedy_expect_context_keyword("meta"); - let mut expression = Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - })); - expression = self.parse_subexpressions(expression, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression, - })), semicolon) - } else { - let mut alias: Option<(String, Location)> = None; - let mut package_name: Vec<(String, Location)> = vec![]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - let id1 = self.expect_identifier(false); - if self.consume(Token::Assign) { - alias = Some(id1.clone()); - package_name.push(self.expect_identifier(false)); - } else { - package_name.push(id1); - } - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ImportDirective(ImportDirective { - location: self.pop_location(), - alias, - package_name, - import_specifier, - })); - - (node, semicolon) - } - } - - fn parse_include_directive(&mut self, context: ParserDirectiveContext, start: Location) -> (Rc, bool) { - self.push_location(&start); - let source_path_location = self.token_location(); - let Token::String(source) = &self.token.0.clone() else { - panic!(); - }; - let source = source.clone(); - self.next(); - let semicolon = self.parse_semicolon(); - - let nested_compilation_unit: Rc; - - // Select origin file path - let origin_file_path = if let Some(file_path) = self.tokenizer.compilation_unit().file_path.clone() { - Some(file_path) - } else { - std::env::current_dir().ok().map(|d| d.to_string_lossy().into_owned()) - }; - - // Resolve source - if let Some(origin_file_path) = origin_file_path { - let sub_file_path = file_paths::FlexPath::from_n_native([origin_file_path.as_ref(), "..", source.as_ref()]).to_string_with_flex_separator(); - if self.tokenizer.compilation_unit().include_directive_is_circular(&sub_file_path) { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::CircularIncludeDirective, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } else { - if let Ok(content) = std::fs::read_to_string(&sub_file_path) { - nested_compilation_unit = CompilationUnit::new(Some(sub_file_path.clone()), content); - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::FailedToIncludeFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - } - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::ParentSourceIsNotAFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - - // Let it be such that the sub compilation unit is subsequent of - // the super compilation unit. - nested_compilation_unit.set_included_from(Some(self.tokenizer.compilation_unit().clone())); - - // Add sub compilation unit to super compilation unit - self.tokenizer.compilation_unit().add_nested_compilation_unit(nested_compilation_unit.clone()); - - // Parse directives from replacement source - let (nested_packages, nested_directives) = parse_include_directive_source(nested_compilation_unit.clone(), context); - - // Delegate sub compilation unit errors to super compilation unit - if nested_compilation_unit.invalidated() { - self.tokenizer.compilation_unit().invalidated.set(true); - } - - let node = Rc::new(Directive::IncludeDirective(IncludeDirective { - location: self.pop_location(), - source, - nested_packages, - nested_directives, - nested_compilation_unit: nested_compilation_unit.clone(), - })); - - (node, semicolon) - } - - fn parse_use_namespace_directive(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - ..default() - }); - } - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::UseNamespaceDirective(UseNamespaceDirective { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_variable_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_static = Attribute::find_static(&attributes).is_some(); - self.push_location(&start_location); - let kind_location = self.token_location(); - let kind = if self.consume(Token::Const) { - VariableDefinitionKind::Const - } else { - self.non_greedy_expect(Token::Var); - VariableDefinitionKind::Var - }; - let mut bindings = vec![Rc::new(self.parse_variable_binding(true))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(true))); - } - - // Forbid destructuring bindings in enumerations. - if !has_static && matches!(context, ParserDirectiveContext::EnumBlock) { - if kind != VariableDefinitionKind::Const { - self.add_syntax_error(&kind_location, DiagnosticKind::EnumMembersMustBeConst, diagarg![]); - } - for binding in &bindings { - let malformed = !matches!(binding.destructuring.destructuring.as_ref(), Expression::QualifiedIdentifier(_)) - || binding.destructuring.type_annotation.is_some(); - if malformed { - self.add_syntax_error(&binding.location(), DiagnosticKind::MalformedEnumMember, diagarg![]); - } - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - let node = Rc::new(Directive::VariableDefinition(VariableDefinition { - location: self.pop_location(), - asdoc, - attributes, - kind: (kind, kind_location), - bindings, - })); - - (node, semicolon) - } - - fn parse_function_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_native = Attribute::find_native(&attributes).is_some(); - let has_abstract = Attribute::find_abstract(&attributes).is_some(); - self.push_location(&start_location); - let mut name = self.expect_identifier(true); - let mut getter = false; - let mut setter = false; - if self.peek_identifier(true).is_some() { - getter = Token::is_context_keyword(&self.previous_token, "get"); - setter = Token::is_context_keyword(&self.previous_token, "set"); - if getter || setter { - name = self.expect_identifier(true); - } - } - let constructor = !getter && !setter && context.function_name_is_constructor(&name); - let name = if getter { - FunctionName::Getter(name) - } else if setter { - FunctionName::Setter(name) - } else if constructor { - FunctionName::Constructor(name) - } else { - FunctionName::Identifier(name) - }; - let block_context = if constructor { - ParserDirectiveContext::ConstructorBlock { super_statement_found: Rc::new(Cell::new(false)) } - } else { - ParserDirectiveContext::Default - }; - let common = self.parse_function_common(false, block_context, true); - let semicolon = if common.has_block_body() { true } else { self.parse_semicolon() }; - - /* - if constructor && common.signature.result_type.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::ConstructorMustNotSpecifyResultType, diagarg![]); - } - */ - - // Not all kinds of functions may be generators. - if common.contains_yield && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeGenerator, diagarg![]); - } - - // Not all kinds of functions may be asynchronous. - if common.contains_await && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeAsynchronous, diagarg![]); - } - - let interface_method = matches!(context, ParserDirectiveContext::InterfaceBlock); - - // Body verification. - // - // Interface methods are skipped in the verification as they - // may omit body. - if !interface_method { - if (has_native || has_abstract) && common.body.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainBody, diagarg![]); - } else if !(has_native || has_abstract) && common.body.is_none() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustContainBody, diagarg![]); - } - } - - // Interface methods must not contain any annotations except for meta-data. - if !attributes.is_empty() && interface_method { - if !attributes.last().unwrap().is_metadata() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainAnnotations, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Final(_) | - Attribute::Override(_) | - Attribute::Abstract(_) => { - if !context.is_type_block() || constructor { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - - Attribute::Native(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let node = Rc::new(Directive::FunctionDefinition(FunctionDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - common, - })); - - (node, semicolon) - } - - fn parse_class_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression()); - } - let mut implements_clause: Option>> = None; - if self.consume(Token::Implements) { - implements_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::ClassBlock { - name: name.0.clone(), - })); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => {}, - Attribute::Final(_) => {}, - Attribute::Dynamic(_) => {}, - Attribute::Abstract(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::ClassDefinition(ClassDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - implements_clause, - block, - })); - - (node, true) - } - - fn parse_enum_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, mut attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let mut as_clause: Option> = None; - if self.consume(Token::As) { - as_clause = Some(self.parse_type_expression()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::EnumBlock)); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let mut is_set = false; - let metadata = Attribute::find_metadata(&attributes); - for metadata in metadata { - if metadata.name.0 == "Set" { - is_set = true; - Attribute::remove_metadata(&mut attributes, &metadata); - } - } - - let node = Rc::new(Directive::EnumDefinition(EnumDefinition { - location: self.pop_location(), - asdoc, - attributes, - is_set, - name: name.clone(), - as_clause, - block, - })); - - (node, true) - } - - fn parse_interface_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option>> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::InterfaceBlock)); - - // Interface block must only contain function definitions - for directive in block.directives.iter() { - if !(matches!(directive.as_ref(), Directive::FunctionDefinition(_))) { - self.add_syntax_error(&directive.location(), DiagnosticKind::DirectiveNotAllowedInInterface, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::InterfaceDefinition(InterfaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - block, - })); - - (node, true) - } - - fn parse_type_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - if !self.expecting_token_error { - right = self.parse_type_expression(); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&left.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::TypeDefinition(TypeDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_namespace_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right: Option> = None; - if self.consume(Token::Assign) { - right = Some(self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - Attribute::Static(_) => {}, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::NamespaceDefinition(NamespaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_type_expression_list(&mut self) -> Vec> { - let mut list = vec![self.parse_type_expression()]; - while self.consume(Token::Comma) { - list.push(self.parse_type_expression()); - } - list - } - - fn verify_visibility(&self, a: &Attribute, context: &ParserDirectiveContext) { - let mut unallowed = false; - match a { - Attribute::Expression(_) => {}, - Attribute::Public(_) => {}, - Attribute::Private(_) | - Attribute::Protected(_) => { - if !context.is_type_block() { - unallowed = true; - } - }, - Attribute::Internal(_) => {}, - _ => {} - } - if unallowed { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - } - - fn parse_type_parameters_opt(&mut self) -> Option>> { - if !self.consume(Token::Dot) { - return None; - } - let mut list: Vec> = vec![]; - self.non_greedy_expect(Token::Lt); - if !self.expecting_token_error { - list.push(self.parse_type_parameter()); - while self.consume(Token::Comma) { - list.push(self.parse_type_parameter()); - } - self.non_greedy_expect_type_parameters_gt(); - } - Some(list) - } - - fn parse_type_parameter(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(false); - Rc::new(TypeParameter { - location: self.pop_location(), - name, - }) - } - - fn parse_configuration_directive(&mut self, context: ParserDirectiveContext, start_location: Location) -> (Rc, bool) { - self.push_location(&start_location); - self.non_greedy_expect(Token::BlockOpen); - let subdirective = self.parse_configuration_subdirective(context.clone()); - self.non_greedy_expect(Token::BlockClose); - (Rc::new(Directive::ConfigurationDirective(ConfigurationDirective { - location: self.pop_location(), - directive: subdirective, - })), true) - } - - fn parse_configuration_subdirective(&mut self, context: ParserDirectiveContext) -> Rc { - if self.peek(Token::If) { - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_configuration_expression(); - } - self.non_greedy_expect(Token::ParenClose); - let consequent = Rc::new(Directive::Block(self.parse_block(context.clone()))); - let mut alternative: Option> = None; - if self.consume(Token::Else) { - alternative = Some(self.parse_configuration_subdirective(context.clone())); - } - Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, - consequent, - alternative, - })) - } else { - Rc::new(Directive::Block(self.parse_block(context.clone()))) - } - } - - fn parse_configuration_expression(&mut self) -> Rc { - let mut base = self.parse_configuration_primary_expression(); - if self.consume(Token::LogicalAnd) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalAnd, - left: base.clone(), - right, - })); - } else if self.consume(Token::LogicalOr) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalOr, - left: base.clone(), - right, - })); - } - base - } - - fn parse_configuration_primary_expression(&mut self) -> Rc { - if let Token::Identifier(_) = &self.token.0.clone() { - self.mark_location(); - let mut id = self.expect_identifier(false); - let mut qual: Option> = None; - if self.consume(Token::ColonColon) { - qual = Some(Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }))); - id = self.expect_identifier(true); - } - let id_location = self.pop_location(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: qual, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - let equality: Option = if self.consume(Token::Assign) { - Some(Operator::Equals) - } else if self.consume(Token::NotEquals) { - Some(Operator::NotEquals) - } else { - None - }; - if let Some(equality) = equality { - self.push_location(&id.location()); - self.mark_location(); - let mut value: String = "".into(); - if let Some((value_1, _)) = self.consume_identifier(false) { - value = value_1; - } else { - if let Token::String(s) = &self.token.0 { - value = s.clone(); - self.next(); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if let Token::String(s) = self.token.0.clone() { - self.pop_location(); - self.mark_location(); - value = s; - self.next(); - } - } - } - } - let right = Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value, - })); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: equality, - left: id.clone(), - right, - })) - } else { - id - } - } else if self.peek(Token::ParenOpen) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_expression(); - self.non_greedy_expect(Token::ParenClose); - Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })) - } else if self.peek(Token::Exclamation) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_primary_expression(); - Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::LogicalNot, - expression, - })) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - fn keyword_or_expression_attribute_from_expression(&self, expr: &Rc) -> Attribute { - match expr.as_ref() { - Expression::QualifiedIdentifier(id) => { - if id.qualifier.is_some() || id.attribute { - return Attribute::Expression(expr.clone()); - } - match &id.id { - QualifiedIdentifierIdentifier::Id((id, location)) => { - if let Some(attr) = Attribute::from_identifier_name(&id, &location) { - return attr; - } - Attribute::Expression(expr.clone()) - }, - _ => Attribute::Expression(expr.clone()), - } - }, - _ => Attribute::Expression(expr.clone()), - } - } - - fn keyword_attribute_from_previous_token(&self) -> Option { - self.previous_token.0.to_attribute(&self.previous_token.1) - } - - fn _keyword_or_expression_attribute_from_previous_token(&mut self) -> Option { - if let Some(a) = self.keyword_attribute_from_previous_token() { - return Some(a); - } - match &self.previous_token.0 { - Token::Identifier(id) => Some(Attribute::Expression(self.parse_expression_attribute(&(id.clone(), self.previous_token.1.clone())))), - _ => None, - } - } - - fn parse_keyword_or_expression_attribute(&mut self) -> Option { - if let Some(a) = self.token.0.to_attribute(&self.token.1) { - self.next(); - return Some(a); - } - match &self.token.0 { - Token::Identifier(_) => { - let id = self.expect_identifier(false); - Some(Attribute::Expression(self.parse_expression_attribute(&id))) - }, - _ => None, - } - } - - fn peek_annotatable_directive_identifier_name(&self) -> bool { - if self.token.0.to_attribute(&self.token.1).is_some() { - return true; - } - match self.token.0 { - Token::Identifier(_) => true, - Token::Var | - Token::Const | - Token::Function | - Token::Class | - Token::Interface => true, - _ => false, - } - } - - fn lookbehind_is_annotatable_directive_identifier_name(&self) -> bool { - self.keyword_attribute_from_previous_token().is_some() - || matches!(&self.previous_token.0, Token::Identifier(_)) - || Token::is_context_keyword(&self.previous_token, "enum") - || Token::is_context_keyword(&self.previous_token, "type") - || Token::is_context_keyword(&self.previous_token, "namespace") - } - - fn parse_attribute_keywords_or_expressions(&mut self, context: &mut AnnotatableContext) { - if context.directive_context_keyword.is_some() { - unreachable!(); - } - loop { - if let Some(a) = self.parse_keyword_or_expression_attribute() { - if let Attribute::Expression(e) = &a { - let id = e.to_identifier_name(); - if let Some(id) = id { - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - context.directive_context_keyword = Some(id); - break; - } - } - } - let last_attribute_is_identifier = context.attributes.last().map_or(false, |a| !a.is_metadata()); - if last_attribute_is_identifier { - self.forbid_line_break_before_token(); - } - context.attributes.push(a); - // self.next(); - } else { - if let Some(id) = self.peek_identifier(false) { - self.forbid_line_break_before_token(); - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - self.next(); - context.directive_context_keyword = Some(id); - } - } - break; - } - } - // For meta-data that are not one of certain Flex meta-data, - // delegate the respective ASDoc to the annotatable directive. - let mut new_attributes = Vec::::new(); - for attr in &context.attributes { - if let Attribute::Metadata(metadata) = attr { - if !is_flex_documentable_meta_data(&metadata.name.0) && metadata.asdoc.is_some() { - new_attributes.push(Attribute::Metadata(Rc::new(Metadata { - location: metadata.location.clone(), - asdoc: None, - name: metadata.name.clone(), - entries: metadata.entries.clone(), - }))); - context.asdoc = metadata.asdoc.clone(); - } else { - new_attributes.push(attr.clone()); - } - } else { - new_attributes.push(attr.clone()); - } - } - context.attributes = new_attributes; - } - - pub fn parse_package_definition(&mut self) -> Rc { - self.mark_location(); - let asdoc = self.parse_asdoc(); - self.non_greedy_expect(Token::Package); - let mut name = vec![]; - if let Some(name1) = self.consume_identifier(false) { - name.push(name1.clone()); - while self.consume(Token::Dot) { - name.push(self.expect_identifier(true)); - } - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::PackageBlock)); - Rc::new(PackageDefinition { - location: self.pop_location(), - asdoc, - name, - block, - }) - } - - pub fn parse_program(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut packages = vec![]; - while self.peek(Token::Package) { - packages.push(self.parse_package_definition()); - } - let directives = self.parse_directives(ParserDirectiveContext::TopLevel); - Rc::new(Program { - location: if just_eof { - self.pop_location(); - self.token.1.clone() - } else { - self.pop_location() - }, - packages, - directives, - }) - } - - pub fn parse_asdoc(&mut self) -> Option> { - let comments = self.compilation_unit().comments.borrow(); - let last_comment = comments.last().map(|last_comment| last_comment.clone()); - drop(comments); - last_comment.and_then(|comment| { - if comment.is_asdoc(&self.token.1) { - self.compilation_unit().comments_mut().pop(); - let location = comment.location(); - let comment_prefix_length: usize = 3; - let location1 = Location::with_offsets(self.compilation_unit(), location.first_offset + comment_prefix_length, location.last_offset - 2); - let content = &comment.content.borrow()[1..]; - let (main_body, tags) = self.parse_asdoc_content(&location1, content); - Some(Rc::new(AsDoc { - location, - main_body, - tags, - })) - } else { - None - } - }) - } - - fn parse_asdoc_content(&mut self, location: &Location, content: &str) -> (Option<(String, Location)>, Vec<(AsDocTag, Location)>) { - let lines = self.split_asdoc_lines(location, content); - - let mut main_body: Option<(String, Location)> = None; - let mut tags: Vec<(AsDocTag, Location)> = vec![]; - let mut i = 0; - let line_count = lines.len(); - - let mut building_content_tag_name: Option<(String, Location)> = None; - let mut building_content: Vec<(String, Location)> = vec![]; - let mut inside_code_block = false; - - while i < line_count { - let line = &lines[i]; - let tag = if inside_code_block { None } else { - regex_captures!(r"^([\s\t]*\@)([^\s\t]+)(.*)", &line.content) - }; - if let Some((_, tag_prefix, tag_name, tag_content)) = tag { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &tag_content) { - inside_code_block = true; - } - let tag_name_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() - 1, line.location.first_offset() + tag_prefix.len() + tag_name.len()); - building_content_tag_name = Some((tag_name.into(), tag_name_location)); - let tag_content_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() + tag_name.len(), line.location.last_offset()); - building_content.push((tag_content.into(), tag_content_location)); - - if ["private", "inheritDoc"].contains(&tag_name) { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - building_content_tag_name = None; - building_content.clear(); - } - } else { - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &line.content) { - inside_code_block = !inside_code_block; - } - building_content.push((line.content.clone(), line.location.clone())); - } - i += 1; - } - - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - - (main_body, tags) - } - - fn split_asdoc_lines(&mut self, location: &Location, content: &str) -> Vec { - let mut builder = String::new(); - let mut lines = vec![]; - let mut _line_number = location.first_line_number(); - let mut index = location.first_offset(); - let mut line_first_offset = index; - let mut characters = content.chars(); - while let Some(ch) = characters.next() { - if CharacterValidator::is_line_terminator(ch) { - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - index += ch.len_utf8(); - // sequence - if ch == '\r' && characters.clone().next().unwrap_or('\x00') == '\n' { - index += '\n'.len_utf8(); - characters.next(); - } - builder = String::new(); - _line_number += 1; - line_first_offset = index; - } else { - builder.push(ch); - index += ch.len_utf8(); - } - } - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - for line in &mut lines { - let line_content = line.content.to_owned(); - let prefix = regex_captures!(r"^\s*(\*\s?)", &line_content); - if let Some((prefix, _)) = prefix { - line.content = line.content[prefix.len()..].to_owned(); - line.location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + prefix.len(), line.location.last_offset()); - } - } - - lines - } - - fn parse_asdoc_tag_or_main_body( - &self, - building_content_tag_name: &mut Option<(String, Location)>, - building_content: &mut Vec<(String, Location)>, - main_body: &mut Option<(String, Location)>, - tags: &mut Vec<(AsDocTag, Location)> - ) { - if let Some((tag_name, ref tag_location)) = building_content_tag_name.as_ref() { - match tag_name.as_ref() { - // @author Author text - "author" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Author(content), location)); - }, - - // @copy reference - "copy" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some(reference) = self.parse_asdoc_reference(&content, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::Copy(reference), location)); - } - }, - - // @created Date text - "created" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Created(content), location)); - }, - - // @default value - "default" => { - let (reference, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Default(reference), location)); - }, - - // @deprecated - "deprecated" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - let mut message: Option = None; - - if !regex_is_match!(r"^\s*$", &text) { - message = Some(text.clone()); - } - - tags.push((AsDocTag::Deprecated { message }, location)); - }, - - // @eventType typeOrConstant - "eventType" => { - let (_, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - tags.push((AsDocTag::EventType(exp), location)); - }, - - // @example text - "example" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Example(text), location)); - }, - - // @inheritDoc - "inheritDoc" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::InheritDoc, location)); - }, - - // @internal text - "internal" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Internal(text), location)); - }, - - // @langversion text - "langversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Langversion(text), location)); - }, - - // @param paramName description - "param" => { - let (content, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - if let Some((_, name, description)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - tags.push((AsDocTag::Param { name: name.into(), description: description.trim_start().into() }, location)); - } else { - tags.push((AsDocTag::Param { name: content, description: "".into() }, location)); - } - }, - - // @playerversion text - "playerversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Playerversion(text), location)); - }, - - // @private - "private" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Private, location)); - }, - - // @productversion text - "productversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Productversion(text), location)); - }, - - // @return text - "return" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Return(text), location)); - }, - - // @see reference [displayText] - "see" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference: String; - let display_text: Option; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some((_, reference_1, display_text_1)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - reference = reference_1.to_owned(); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + reference.len()); - display_text = Some(display_text_1.trim().to_owned()); - } else { - reference = content; - display_text = None; - } - if let Some(reference) = self.parse_asdoc_reference(&reference, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::See { reference, display_text }, location)); - } - }, - - // @throws className description - "throws" => { - let (class_name_and_description, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - - let class_name_and_description = regex_captures!(r"^([^\s]+)(\s.*)?", &class_name_and_description); - - if let Some((_, class_name, description)) = class_name_and_description { - let description = description.trim().to_owned(); - let description = if description.is_empty() { - None - } else { - Some(description) - }; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + class_name.len()); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_type_expression(); - tags.push((AsDocTag::Throws { class_reference: exp, description }, location)); - } else { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - }, - - // @version Version text - "version" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Version(content), location)); - }, - - // Unrecognized tag - _ => { - self.add_syntax_error(&tag_location, DiagnosticKind::UnrecognizedAsDocTag, diagarg![tag_name.clone()]); - }, - } - } else if !building_content.is_empty() { - let content = join_asdoc_content(building_content); - if !content.0.is_empty() { - *main_body = Some(content); - } - } - - *building_content_tag_name = None; - building_content.clear(); - } - - fn parse_asdoc_reference(&self, reference: &str, reference_loc: &Location, tag_location: &Location, tag_name: &str) -> Option> { - let split: Vec<&str> = reference.split("#").collect(); - if split.len() > 2 { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - let mut base: Option> = None; - let base_text: String = split[0].to_owned(); - let instance_property_text: Option<(String, Location)> = split.get(1).and_then(|&f| if f.is_empty() { None } else { - Some((f.to_owned(), Location::with_offsets(self.compilation_unit(), reference_loc.first_offset() + base_text.len() + 1, reference_loc.last_offset()))) - }); - - if !base_text.is_empty() { - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.first_offset() + base_text.len())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - base = Some(exp); - } - - let mut instance_property: Option> = None; - if let Some(text) = instance_property_text { - let parser_options = ParserOptions { - byte_range: Some((text.1.first_offset(), text.1.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_qualified_identifier(); - instance_property = Some(Rc::new(exp)); - } - - if base.is_none() && instance_property.is_none() { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - Some(Rc::new(AsDocReference { base, instance_property, })) - } - - /// Parses MXMLElement starting from its XMLTagContent. - fn parse_mxml_element(&mut self, start: Location, namespace: &Rc, encoding: &mut String) -> MxmlElement { - self.push_location(&start); - let namespace = Rc::new(MxmlNamespace::new(Some(namespace))); - let name = self.parse_xml_name(); - let mut attributes: Vec> = vec![]; - let mut plain_attributes: Vec = vec![]; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = ("".into(), self.token.1.clone()); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - value = self.parse_xml_attribute_value(); - } - let attrib = PlainMxmlAttribute { - location: self.pop_location(), - name, - value, - }; - self.process_mxml_xmlns_attribute(&mut attributes, &attrib, &namespace); - plain_attributes.push(attrib); - } else { - break; - } - } - - for attrib in &plain_attributes { - self.process_mxml_attribute(&mut attributes, &attrib, &namespace); - } - - let name = self.process_mxml_tag_name(name, &namespace); - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_mxml_content(false, &namespace, encoding)); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - let name = self.parse_xml_name(); - closing_name = Some(self.process_mxml_tag_name(name, &namespace)); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - - if let Some(content) = content.as_mut() { - self.filter_mxml_whitespace_out(content); - } - - MxmlElement { - location: self.pop_location(), - name, - attributes, - content, - closing_name, - namespace, - } - } - - /// Filters whitespace chunks out of a content list when - /// they include at least one child element. - fn filter_mxml_whitespace_out(&self, content: &mut Vec>) { - if !self.ignore_xml_whitespace { - return; - } - let mut inc_el = false; - for node in content.iter() { - inc_el = matches!(node.as_ref(), MxmlContent::Element(_)); - if inc_el { - break; - } - } - if inc_el { - let mut indices: Vec = vec![]; - for i in 0..content.len() { - let MxmlContent::Characters((ch, _)) = content[i].as_ref() else { - continue; - }; - if ch.trim().is_empty() { - indices.push(i); - } - } - for i in indices.iter().rev() { - content.remove(*i); - } - } - } - - fn process_mxml_xmlns_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // xml="uri" - if attribute.name.0 == "xmlns" { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(MxmlNamespace::DEFAULT_NAMESPACE, &attribute_value); - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: None, - name: "xmlns".into(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - // xmlns:prefix="uri" - } else if attribute.name.0.starts_with("xmlns:") { - let attribute_value = unescape_xml(&attribute.value.0); - namespace.set(&attribute.name.0[6..], &attribute_value); - if attribute.name.0[6..].find(':').is_some() { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - output.push(Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix: Some("xmlns".into()), - name: attribute.name.0[6..].to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: true, - })); - } - } - - fn process_mxml_attribute(&mut self, output: &mut Vec>, attribute: &PlainMxmlAttribute, namespace: &Rc) { - // attrib="value" - if !(attribute.name.0 == "xmlns" || attribute.name.0.starts_with("xmlns:")) { - let attribute_value = unescape_xml(&attribute.value.0); - let split = attribute.name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&attribute.name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name = split.last().unwrap(); - let attrib = Rc::new(MxmlAttribute { - location: attribute.location.clone(), - name: MxmlName { - location: attribute.name.1.clone(), - prefix, - name: (*name).to_owned(), - }, - value: (attribute_value, attribute.value.1.clone()), - xmlns: false, - }); - match attrib.name.resolve_prefix(namespace) { - Ok(_) => { - for prev_attrib in output.iter() { - if prev_attrib.name.equals_name(&attrib.name, namespace).unwrap_or(false) { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::RedefiningXmlAttribute, diagarg![attrib.name.name.clone()]); - } - } - }, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&attrib.name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - output.push(attrib); - } - } - - fn process_mxml_tag_name(&mut self, name: (String, Location), namespace: &Rc) -> MxmlName { - let split = name.0.split(':').collect::>(); - if split.len() > 2 { - self.add_syntax_error(&name.1, DiagnosticKind::XmlNameAtMostOneColon, vec![]); - } - let prefix: Option = if split.len() > 1 { - Some(split[split.len() - 2].to_owned()) - } else { - None - }; - let name_str = split.last().unwrap(); - let name = MxmlName { - location: name.1.clone(), - prefix, - name: (*name_str).to_owned(), - }; - match name.resolve_prefix(namespace) { - Ok(_) => {}, - Err(MxmlNameError::PrefixNotDefined(prefix)) => { - self.add_syntax_error(&name.location, DiagnosticKind::XmlPrefixNotDefined, diagarg![prefix]); - }, - } - name - } - - /// Parses XMLContent until either the `, encoding: &mut String) -> Vec> { - let mut content = vec![]; - while if until_eof { self.tokenizer.characters().has_remaining() } else { !self.peek(Token::XmlLtSlash) } { - if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - // XMLCDATA - if markup.starts_with(" { - self.add_syntax_error(&location, DiagnosticKind::XmlPiUnknownAttribute, diagarg![name.clone()]); - }, - XmlPiError::Version => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiVersion, vec![]); - }, - XmlPiError::Encoding => { - self.add_syntax_error(&location, DiagnosticKind::XmlPiEncoding, vec![]); - }, - } - } - content.push(Rc::new(MxmlContent::ProcessingInstruction { - location, - name, - data: if data.is_empty() { None } else { Some(data) }, - })); - } - } else if let Token::XmlText(text) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(MxmlContent::Characters((unescape_xml(&text), location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_mxml_element(start, namespace, encoding); - content.push(Rc::new(MxmlContent::Element(Rc::new(element)))); - } else if !until_eof { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - if !self.tokenizer.characters().has_remaining() { - break; - } - } - } - content - } - - fn parse_mxml(&mut self) -> Rc { - self.mark_location(); - let ns = Rc::new(MxmlNamespace::new(None)); - let mut encoding = "utf-8".to_owned(); - let mut content = self.parse_mxml_content(true, &ns, &mut encoding); - self.filter_mxml_whitespace_out(&mut content); - - let mut element_count = 0usize; - let mut character_count = 0usize; - - for node in content.iter() { - match node.as_ref() { - MxmlContent::Characters(_) | - MxmlContent::CData(_) => { - character_count += 1; - }, - MxmlContent::Element(_) => { - element_count += 1; - }, - _ => {}, - } - } - let location = self.pop_location(); - if element_count != 1 || character_count != 0 { - self.add_syntax_error(&location, DiagnosticKind::XmlMustConsistOfExactly1Element, vec![]); - } - Rc::new(Mxml { - location, - version: XmlVersion::Version10, - encoding, - content, - }) - } -} - -fn parse_include_directive_source(nested_compilation_unit: Rc, context: ParserDirectiveContext) -> (Vec>, Vec>) { - let mut parser = Parser::new(&nested_compilation_unit, &ParserOptions { - ..default() - }); - parser.next(); - let mut packages = vec![]; - if matches!(context, ParserDirectiveContext::TopLevel) { - while parser.peek(Token::Package) { - packages.push(parser.parse_package_definition()); - } - } - (packages, parser.parse_directives(context)) -} - -fn join_asdoc_content(content: &Vec<(String, Location)>) -> (String, Location) { - // Ignore first empty lines - let mut i = 0usize; - for content1 in content.iter() { - if content1.0.trim().is_empty() { - i += 1; - } else { - break; - } - } - - // Ignore last empty lines - let mut j = content.len(); - for content1 in content.iter().rev() { - if content1.0.trim().is_empty() { - j -= 1; - } else { - break; - } - } - - if i > j { - i = j; - } - - let s: Vec = content[i..j].iter().map(|c| c.0.clone()).collect(); - let s = s.join("\n").trim().to_owned(); - let location = if i == j { - content[i].1.clone() - } else { - content[i].1.combine_with(content[i..j].last().unwrap().1.clone()) - }; - (s, location) -} - -fn process_xml_pi(cu: &Rc, byte_range: (usize, usize), name: &str, encoding: &mut String) -> Vec { - if name != "xml" { - return vec![]; - } - let mut parser = Parser::new(&cu, &ParserOptions { - byte_range: Some(byte_range), - ..default() - }); - let mut errors = Vec::::new(); - parser.next_ie_xml_tag(); - while parser.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(parser.token.0, Token::XmlName(_)) { - let name = parser.parse_xml_name(); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - parser.expect_and_ie_xml_tag(Token::Assign); - parser.consume_and_ie_xml_tag(Token::XmlWhitespace); - let value = parser.parse_xml_attribute_value(); - match name.0.as_ref() { - "version" => { - if value.0 != "1.0" { - errors.push(XmlPiError::Version); - } - }, - "encoding" => { - let v = value.0.to_lowercase(); - if ["utf-8", "utf-16"].contains(&v.as_str()) { - *encoding = v; - } else { - errors.push(XmlPiError::Encoding); - } - }, - _ => { - errors.push(XmlPiError::UnknownAttribute(name.0.clone())); - }, - } - } else { - break; - } - } - parser.expect_eof(); - errors -} - -fn is_flex_documentable_meta_data(name: &str) -> bool { - ["Event", "SkinState"].contains(&name) -} - -enum XmlPiError { - UnknownAttribute(String), - Version, - Encoding, -} - -struct ParserAsDocLine { - content: String, - location: Location, -} - -#[derive(Clone)] -struct ParserActivation { - uses_yield: bool, - uses_await: bool, -} - -impl ParserActivation { - pub fn new() -> Self { - Self { - uses_yield: false, - uses_await: false, - } - } -} - -#[derive(Clone)] -struct AnnotatableContext { - start_location: Location, - asdoc: Option>, - attributes: Vec, - context: ParserDirectiveContext, - /// Previous token as a directive context keyword. - directive_context_keyword: Option<(String, Location)>, -} - -impl AnnotatableContext { - pub fn has_directive_context_keyword(&self, name: &str) -> bool { - if let Some((ref k, _)) = self.directive_context_keyword { - k == name - } else { - false - } - } -} - -struct PlainMxmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: (String, Location), -} - -/// A simplified interface for executing the parser. -pub struct ParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -pub struct ParserOptions { - /// For MXML, indicates whether to ignore XML whitespace chunks when at - /// least one element appears. Default: true. - pub ignore_xml_whitespace: bool, - /// Indicates the range of characters that shall be parsed, - /// the first and last byte indices respectively. - pub byte_range: Option<(usize, usize)>, -} - -impl Default for ParserOptions { - fn default() -> Self { - Self { - ignore_xml_whitespace: true, - byte_range: None, - } - } -} - -impl<'input> ParserFacade<'input> { - fn create_parser(&self) -> Parser<'input> { - Parser::new(self.0, &self.1) - } - - /// Parses `Program` until end-of-file. - pub fn parse_program(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_program() - } - - /// Parses `ListExpression^allowIn` and expects end-of-file. - pub fn parse_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_expression(ParserExpressionContext { - ..default() - }); - parser.expect_eof(); - exp - } - - /// Parses a qualified identifier and expects end-of-file. - pub fn parse_qualified_identifier(&self) -> QualifiedIdentifier { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_qualified_identifier(); - parser.expect_eof(); - exp - } - - /// Parses `TypeExpression` and expects end-of-file. - pub fn parse_type_expression(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let exp = parser.parse_type_expression(); - parser.expect_eof(); - exp - } - - /// Parses `Directives` until end-of-file. - pub fn parse_directives(&self, context: ParserDirectiveContext) -> Vec> { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_directives(context) - } - - /// Parses `Mxml` until end-of-file. - pub fn parse_mxml(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next_ie_xml_content(); - parser.parse_mxml() - } -} diff --git a/crates/parser/parser/parser_error.rs b/crates/parser/parser/parser_error.rs deleted file mode 100644 index 7921630..0000000 --- a/crates/parser/parser/parser_error.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::ns::*; - -/// Indicates a fatal syntax error that leads the parser -/// to complete without a resulting node. -#[derive(Copy, Clone, Debug)] -pub enum ParserError { - Common, -} - -/// Returns the identifier name that is specially reserved -/// for invalidated identifiers that could not be parsed. -pub const INVALIDATED_IDENTIFIER: &'static str = "\x00"; - -#[derive(Clone)] -pub(crate) enum MetadataRefineError { - Syntax, -} - -#[derive(Clone)] -pub(crate) struct MetadataRefineError1(pub MetadataRefineError, pub Location); diff --git a/crates/parser/parser/reserved_word.rs b/crates/parser/parser/reserved_word.rs deleted file mode 100644 index 9a04596..0000000 --- a/crates/parser/parser/reserved_word.rs +++ /dev/null @@ -1,110 +0,0 @@ -use crate::ns::*; - -/// ActionScript reserved word validation. -pub struct As3ReservedWord; - -impl As3ReservedWord { - /// Checks if an *IdentifierName* is a reserved word. - pub fn test(name: &str) -> bool { - As3ReservedWord::token(name).is_some() - } - - /// Attempts to convert an *IdentifierName* into a reserved word token. - pub fn token(name: &str) -> Option { - match name.len() { - 1 => None, - 2 => { - match name { - "as" => Some(Token::As), - "do" => Some(Token::Do), - "if" => Some(Token::If), - "in" => Some(Token::In), - "is" => Some(Token::Is), - _ => None, - } - }, - 3 => { - match name { - "for" => Some(Token::For), - "new" => Some(Token::New), - "not" => Some(Token::Not), - "try" => Some(Token::Try), - "use" => Some(Token::Use), - "var" => Some(Token::Var), - _ => None, - } - }, - 4 => { - match name { - "case" => Some(Token::Case), - "else" => Some(Token::Else), - "null" => Some(Token::Null), - "this" => Some(Token::This), - "true" => Some(Token::True), - "void" => Some(Token::Void), - "with" => Some(Token::With), - _ => None, - } - }, - 5 => { - match name { - "await" => Some(Token::Await), - "break" => Some(Token::Break), - "catch" => Some(Token::Catch), - "class" => Some(Token::Class), - "const" => Some(Token::Const), - "false" => Some(Token::False), - "super" => Some(Token::Super), - "throw" => Some(Token::Throw), - "while" => Some(Token::While), - "yield" => Some(Token::Yield), - _ => None, - } - }, - 6 => { - match name { - "delete" => Some(Token::Delete), - "import" => Some(Token::Import), - "public" => Some(Token::Public), - "return" => Some(Token::Return), - "switch" => Some(Token::Switch), - "typeof" => Some(Token::Typeof), - _ => None, - } - }, - 7 => { - match name { - "default" => Some(Token::Default), - "extends" => Some(Token::Extends), - "finally" => Some(Token::Finally), - "package" => Some(Token::Package), - "private" => Some(Token::Private), - _ => None, - } - }, - 8 => { - match name { - "continue" => Some(Token::Continue), - "function" => Some(Token::Function), - "internal" => Some(Token::Internal), - _ => None, - } - }, - 9 => { - match name { - "interface" => Some(Token::Interface), - "protected" => Some(Token::Protected), - _ => None, - } - }, - 10 => { - match name { - "implements" => Some(Token::Implements), - "instanceof" => Some(Token::Instanceof), - _ => None, - } - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/token.rs b/crates/parser/parser/token.rs deleted file mode 100644 index f0913ae..0000000 --- a/crates/parser/parser/token.rs +++ /dev/null @@ -1,470 +0,0 @@ -use crate::ns::*; - -/// Represents a lexical token. -#[derive(Clone, PartialEq, Debug)] -pub enum Token { - Eof, - Identifier(String), - String(String), - /// Numeric literal token. - /// The numeric value is in character representation, which may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - Number(String, NumberSuffix), - RegExp { - body: String, - flags: String, - }, - - CssNumber { - value: f64, - unit: Option, - }, - CssHashWord(String), - CssBeginsWith, - CssEndsWith, - CssContains, - CssListMatch, - CssHreflangMatch, - CssAtNamespace, - CssAtMedia, - CssAtFontFace, - CssImportant, - CssSemicolons, - - // Punctuator - ColonColon, - /// The `@` token. - Attribute, - /// The `..` token. - Descendants, - /// The `...` token. - Ellipsis, - ParenOpen, - ParenClose, - SquareOpen, - SquareClose, - BlockOpen, - BlockClose, - Dot, - Semicolon, - Comma, - Lt, - Gt, - /// `<=` - Le, - /// `>=` - Ge, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - Plus, - Minus, - Times, - Div, - Percent, - Increment, - Decrement, - LeftShift, - RightShift, - UnsignedRightShift, - Ampersand, - Hat, - Pipe, - Tilde, - LogicalAnd, - LogicalXor, - LogicalOr, - Question, - Exclamation, - Colon, - Assign, - AddAssign, - SubtractAssign, - MultiplyAssign, - DivideAssign, - RemainderAssign, - LeftShiftAssign, - RightShiftAssign, - UnsignedRightShiftAssign, - BitwiseAndAssign, - BitwiseXorAssign, - BitwiseOrAssign, - LogicalAndAssign, - LogicalXorAssign, - LogicalOrAssign, - /// `**` - Power, - /// `**=` - PowerAssign, - /// `??` - NullCoalescing, - /// `??=` - NullCoalescingAssign, - /// `?.` - OptionalChaining, - - // Reserved words - As, - Await, - Break, - Case, - Catch, - Class, - Const, - Continue, - Default, - Delete, - Do, - Else, - Extends, - False, - Finally, - For, - Function, - If, - Implements, - Import, - In, - Instanceof, - Interface, - Internal, - Is, - New, - Not, - Null, - Package, - Private, - Protected, - Public, - Return, - Super, - Switch, - This, - Throw, - True, - Try, - Typeof, - Use, - Var, - Void, - While, - With, - Yield, - - XmlWhitespace, - XmlLtSlash, - XmlSlashGt, - XmlText(String), - XmlName(String), - XmlMarkup(String), - XmlAttributeValue(String), -} - -impl ToString for Token { - /// Converts the token into a readable string. - /// - /// The method `Token::to_string` returns the following possible values: - /// - /// * `"end of program"` - /// * `"identifier"` - /// * `"string"` for string literal - /// * `"number"` for numeric literal - /// * `"regular expression"` for regular expression literal - /// * `"'keyword'"` for reserved words - /// * `"'punctuator'"` for various punctuators - /// * `"punctuator"` for various punctuators - /// * `"XML whitespace"` - /// * `"''"` - /// * `"XML text"` - /// * `"XML name"` - /// * `"XML markup"` - /// * `"XML attribute value"` - fn to_string(&self) -> String { - (match self { - Token::Eof => "end-of-file", - Token::Identifier(_) => "identifier", - Token::String(_) => "string", - Token::Number(_, _) => "number", - Token::RegExp { .. } => "regular expression", - - Token::CssNumber { .. } => "number", - Token::CssHashWord(_) => "hash-word", - Token::CssBeginsWith => "'^='", - Token::CssEndsWith => "'$='", - Token::CssContains => "'*='", - Token::CssListMatch => "'~='", - Token::CssHreflangMatch => "'|='", - Token::CssAtNamespace => "at-namespace", - Token::CssAtMedia => "at-media", - Token::CssAtFontFace => "at-font-face", - Token::CssImportant => "'!important'", - Token::CssSemicolons => "semicolon", - - // Punctuators - Token::ColonColon => "colon-colon", - Token::Attribute => "'@'", - Token::Descendants => "'..'", - Token::Ellipsis => "'...'", - Token::ParenOpen => "paren-open", - Token::ParenClose => "paren-close", - Token::SquareOpen => "square-open", - Token::SquareClose => "square-close", - Token::BlockOpen => "block-open", - Token::BlockClose => "block-close", - Token::Dot => "dot", - Token::Semicolon => "semicolon", - Token::Comma => "comma", - Token::Lt => "less-than", - Token::Gt => "greater-than", - Token::Le => "'<='", - Token::Ge => "'>='", - Token::Equals => "'=='", - Token::NotEquals => "'!='", - Token::StrictEquals => "'==='", - Token::StrictNotEquals => "'!=='", - Token::Plus => "plus", - Token::Minus => "minus", - Token::Times => "times", - Token::Div => "slash", - Token::Percent => "percent", - Token::Increment => "'++'", - Token::Decrement => "'--'", - Token::LeftShift => "'<<'", - Token::RightShift => "'>>'", - Token::UnsignedRightShift => "'>>>'", - Token::Ampersand => "ampersand", - Token::Hat => "hat", - Token::Pipe => "pipe", - Token::Tilde => "tilde", - Token::LogicalAnd => "'&&'", - Token::LogicalXor => "'^^'", - Token::LogicalOr => "'||'", - Token::Question => "question-mark", - Token::Exclamation => "exclamation-mark", - Token::Colon => "colon", - Token::Assign => "'='", - Token::AddAssign => "'+='", - Token::SubtractAssign => "'-='", - Token::MultiplyAssign => "'*='", - Token::DivideAssign => "'/='", - Token::RemainderAssign => "'%='", - Token::LeftShiftAssign => "'<<='", - Token::RightShiftAssign => "'>>='", - Token::UnsignedRightShiftAssign => "'>>>='", - Token::BitwiseAndAssign => "'&='", - Token::BitwiseXorAssign => "'^='", - Token::BitwiseOrAssign => "'|='", - Token::LogicalAndAssign => "'&&='", - Token::LogicalXorAssign => "'^^='", - Token::LogicalOrAssign => "'||='", - Token::Power => "'**'", - Token::PowerAssign => "'**='", - Token::NullCoalescing => "'??'", - Token::NullCoalescingAssign => "'??='", - Token::OptionalChaining => "'?.'", - - // Reserved words - Token::As => "'as'", - Token::Await => "'await'", - Token::Break => "'break'", - Token::Case => "'case'", - Token::Catch => "'catch'", - Token::Class => "'class'", - Token::Const => "'const'", - Token::Continue => "'continue'", - Token::Default => "'default'", - Token::Delete => "'delete'", - Token::Do => "'do'", - Token::Else => "'else'", - Token::Extends => "'extends'", - Token::False => "'false'", - Token::Finally => "'finally'", - Token::For => "'for'", - Token::Function => "'function'", - Token::If => "'if'", - Token::Implements => "'implements'", - Token::Import => "'import'", - Token::In => "'in'", - Token::Instanceof => "'instanceof'", - Token::Interface => "'interface'", - Token::Internal => "'internal'", - Token::Is => "'is'", - Token::New => "'new'", - Token::Not => "'not'", - Token::Null => "'null'", - Token::Package => "'package'", - Token::Private => "'private'", - Token::Protected => "'protected'", - Token::Public => "'public'", - Token::Return => "'return'", - Token::Super => "'super'", - Token::Switch => "'switch'", - Token::This => "'this'", - Token::Throw => "'throw'", - Token::True => "'true'", - Token::Try => "'try'", - Token::Typeof => "'typeof'", - Token::Use => "'use'", - Token::Var => "'var'", - Token::Void => "'void'", - Token::While => "'while'", - Token::With => "'with'", - Token::Yield => "'yield'", - - Token::XmlWhitespace => "XML whitespace", - Token::XmlLtSlash => "' "'/>'", - Token::XmlText(_) => "XML text", - Token::XmlName(_) => "XML name", - Token::XmlMarkup(_) => "XML markup", - Token::XmlAttributeValue(_) => "XML attribute value", - }).into() - } -} - -impl Token { - pub fn is_context_keyword(token: &(Token, Location), keyword: &str) -> bool { - if let Token::Identifier(name) = &token.0 { - name == keyword && token.1.character_count() == name.len() - } else { - false - } - } - - /// Indicates whether the token is a reserved word. - pub fn is_reserved_word(&self) -> bool { - self.reserved_word_name().is_some() - } - - pub fn is_identifier_name(&self) -> bool { - matches!(self, Token::Identifier(_)) || self.is_reserved_word() - } - - /// Tests whether the token is a reserved word and returns - /// its *IdentifierName* string. - pub fn reserved_word_name(&self) -> Option { - match *self { - Token::As => Some("as".into()), - Token::Await => Some("await".into()), - Token::Break => Some("break".into()), - Token::Case => Some("case".into()), - Token::Catch => Some("catch".into()), - Token::Class => Some("class".into()), - Token::Const => Some("const".into()), - Token::Continue => Some("continue".into()), - Token::Default => Some("default".into()), - Token::Delete => Some("delete".into()), - Token::Do => Some("do".into()), - Token::Else => Some("else".into()), - Token::Extends => Some("extends".into()), - Token::False => Some("false".into()), - Token::Finally => Some("finally".into()), - Token::For => Some("for".into()), - Token::Function => Some("function".into()), - Token::If => Some("if".into()), - Token::Implements => Some("implements".into()), - Token::Import => Some("import".into()), - Token::In => Some("in".into()), - Token::Instanceof => Some("instanceof".into()), - Token::Interface => Some("interface".into()), - Token::Internal => Some("internal".into()), - Token::Is => Some("is".into()), - Token::New => Some("new".into()), - Token::Not => Some("not".into()), - Token::Null => Some("null".into()), - Token::Package => Some("package".into()), - Token::Private => Some("private".into()), - Token::Protected => Some("protected".into()), - Token::Public => Some("public".into()), - Token::Return => Some("return".into()), - Token::Super => Some("super".into()), - Token::Switch => Some("switch".into()), - Token::This => Some("this".into()), - Token::Throw => Some("throw".into()), - Token::True => Some("true".into()), - Token::Try => Some("try".into()), - Token::Typeof => Some("typeof".into()), - Token::Use => Some("use".into()), - Token::Var => Some("var".into()), - Token::Void => Some("void".into()), - Token::While => Some("while".into()), - Token::With => Some("with".into()), - Token::Yield => Some("yield".into()), - _ => None, - } - } - - /// Converts a compound assignment, a logical assignment, or a nullish coalescing assignment to an *Operator* value. - pub fn compound_assignment(&self) -> Option { - match self { - Self::AddAssign => Some(Operator::Add), - Self::SubtractAssign => Some(Operator::Subtract), - Self::MultiplyAssign => Some(Operator::Multiply), - Self::DivideAssign => Some(Operator::Divide), - Self::RemainderAssign => Some(Operator::Remainder), - Self::PowerAssign => Some(Operator::Power), - Self::LeftShiftAssign => Some(Operator::ShiftLeft), - Self::RightShiftAssign => Some(Operator::ShiftRight), - Self::UnsignedRightShiftAssign => Some(Operator::ShiftRightUnsigned), - Self::BitwiseAndAssign => Some(Operator::BitwiseAnd), - Self::BitwiseXorAssign => Some(Operator::BitwiseXor), - Self::BitwiseOrAssign => Some(Operator::BitwiseOr), - Self::LogicalAndAssign => Some(Operator::LogicalAnd), - Self::LogicalXorAssign => Some(Operator::LogicalXor), - Self::LogicalOrAssign => Some(Operator::LogicalOr), - Self::NullCoalescingAssign => Some(Operator::NullCoalescing), - _ => None, - } - } - - /// Converts this token into a binary operator, excluding - /// `not in`, and `is not`. - pub fn to_binary_operator(&self) -> Option { - match self { - Self::Times => Some(Operator::Multiply), - Self::Div => Some(Operator::Divide), - Self::Percent => Some(Operator::Remainder), - Self::Plus => Some(Operator::Add), - Self::Minus => Some(Operator::Subtract), - Self::LeftShift => Some(Operator::ShiftLeft), - Self::RightShift => Some(Operator::ShiftRight), - Self::UnsignedRightShift => Some(Operator::ShiftRightUnsigned), - Self::Lt => Some(Operator::Lt), - Self::Gt => Some(Operator::Gt), - Self::Le => Some(Operator::Le), - Self::Ge => Some(Operator::Ge), - Self::As => Some(Operator::As), - Self::In => Some(Operator::In), - Self::Is => Some(Operator::Is), - Self::Instanceof => Some(Operator::Instanceof), - Self::Equals => Some(Operator::Equals), - Self::NotEquals => Some(Operator::NotEquals), - Self::StrictEquals => Some(Operator::StrictEquals), - Self::StrictNotEquals => Some(Operator::StrictNotEquals), - Self::Ampersand => Some(Operator::BitwiseAnd), - Self::Hat => Some(Operator::BitwiseXor), - Self::Pipe => Some(Operator::BitwiseOr), - Self::LogicalAnd => Some(Operator::LogicalAnd), - Self::LogicalXor => Some(Operator::LogicalXor), - Self::LogicalOr => Some(Operator::LogicalOr), - Self::NullCoalescing => Some(Operator::NullCoalescing), - Self::Power => Some(Operator::Power), - _ => None, - } - } - - pub(crate) fn to_attribute(&self, location: &Location) -> Option { - match self { - Self::Public => Some(Attribute::Public(location.clone())), - Self::Private => Some(Attribute::Private(location.clone())), - Self::Protected => Some(Attribute::Protected(location.clone())), - Self::Internal => Some(Attribute::Internal(location.clone())), - Self::Identifier(ref name) => { - Attribute::from_identifier_name(name, &location) - }, - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/parser/tokenizer.rs b/crates/parser/parser/tokenizer.rs deleted file mode 100644 index fb43f34..0000000 --- a/crates/parser/parser/tokenizer.rs +++ /dev/null @@ -1,1305 +0,0 @@ -use crate::ns::*; - -pub struct Tokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> Tokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit.prevent_equal_offset_error(location) { - return; - } - self.compilation_unit.add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /// Scans for an *InputElementDiv* token. - pub fn scan_ie_div(&mut self) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_whitespace(ch) { - self.characters.next(); - } else if self.consume_line_terminator() || self.consume_comment() { - // Consumed line terminator or comment - } else { - break; - } - } - if let Some(result) = self.scan_identifier() { - return result; - } - if let Some(result) = self.scan_dot_or_numeric_literal() { - return result; - } - if let Some(result) = self.scan_string_literal(false) { - return result; - } - let start = self.cursor_location(); - match self.characters.peek_or_zero() { - ',' => { - // Comma - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Comma, location); - }, - '(' => { - // ParenOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenOpen, location); - }, - ')' => { - // ParenClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenClose, location); - }, - '[' => { - // SquareOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareOpen, location); - }, - ']' => { - // SquareClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareClose, location); - }, - '{' => { - // BlockOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockOpen, location); - }, - '}' => { - // BlockClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockClose, location); - }, - ':' => { - self.characters.next(); - // ColonColon - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ColonColon, location); - } - // Colon - let location = start.combine_with(self.cursor_location()); - return (Token::Colon, location); - }, - '=' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictEquals, location); - } - // Equals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Equals, location); - } - // Assign - let location = start.combine_with(self.cursor_location()); - return (Token::Assign, location); - }, - '!' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictNotEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictNotEquals, location); - } - // NotEquals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NotEquals, location); - } - // Exclamation - let location = start.combine_with(self.cursor_location()); - return (Token::Exclamation, location); - }, - '?' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // OptionalChaining - if ch == '.' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::OptionalChaining, location); - } - // NullCoalescingAssign - if ch == '?' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescingAssign, location); - } - // NullCoalescing - if ch == '?' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescing, location); - } - // Question - let location = start.combine_with(self.cursor_location()); - return (Token::Question, location); - }, - ';' => { - // Semicolon - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Semicolon, location); - }, - '<' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Le - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Le, location); - } - // LeftShiftAssign - if ch == '<' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShiftAssign, location); - } - // LeftShift - if ch == '<' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShift, location); - } - // Lt - let location = start.combine_with(self.cursor_location()); - return (Token::Lt, location); - }, - '>' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Ge - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Ge, location); - } - // RightShiftAssign - if ch == '>' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShiftAssign, location); - } - // UnsignedRightShiftAssign - if ch == '>' && self.characters.peek_seq(3) == ">>=" { - self.characters.skip_count_in_place(3); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShiftAssign, location); - } - // UnsignedRightShift - if ch == '>' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShift, location); - } - // RightShift - if ch == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShift, location); - } - // Gt - let location = start.combine_with(self.cursor_location()); - return (Token::Gt, location); - }, - '@' => { - // Attribute - self.characters.next(); - if let Some(token) = self.scan_string_literal(true) { - return token; - } - let location = start.combine_with(self.cursor_location()); - return (Token::Attribute, location); - }, - '+' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Increment - if ch == '+' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Increment, location); - } - // AddAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::AddAssign, location); - } - // Plus - let location = start.combine_with(self.cursor_location()); - return (Token::Plus, location); - }, - '-' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Decrement - if ch == '-' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Decrement, location); - } - // SubtractAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SubtractAssign, location); - } - // Minus - let location = start.combine_with(self.cursor_location()); - return (Token::Minus, location); - }, - '*' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // PowerAssign - if ch == '*' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::PowerAssign, location); - } - // Power - if ch == '*' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Power, location); - } - // MultiplyAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::MultiplyAssign, location); - } - // Times - let location = start.combine_with(self.cursor_location()); - return (Token::Times, location); - }, - '/' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // DivideAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::DivideAssign, location); - } - // Div - let location = start.combine_with(self.cursor_location()); - return (Token::Div, location); - }, - '%' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // RemainderAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RemainderAssign, location); - } - // Percent - let location = start.combine_with(self.cursor_location()); - return (Token::Percent, location); - }, - '&' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalAndAssign - if ch == '&' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAndAssign, location); - } - // LogicalAnd - if ch == '&' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAnd, location); - } - // BitwiseAndAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseAndAssign, location); - } - // BitwiseAnd - let location = start.combine_with(self.cursor_location()); - return (Token::Ampersand, location); - }, - '^' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalXorAssign - if ch == '^' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXorAssign, location); - } - // LogicalXor - if ch == '^' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXor, location); - } - // BitwiseXorAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseXorAssign, location); - } - // BitwiseXor - let location = start.combine_with(self.cursor_location()); - return (Token::Hat, location); - }, - '|' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalOrAssign - if ch == '|' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOrAssign, location); - } - // LogicalOr - if ch == '|' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOr, location); - } - // BitwiseOrAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseOrAssign, location); - } - // BitwiseOr - let location = start.combine_with(self.cursor_location()); - return (Token::Pipe, location); - }, - '~' => { - // BitwiseNot - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Tilde, location); - }, - _ => { - if self.characters.has_remaining() { - self.add_unexpected_error(); - self.characters.next(); - return self.scan_ie_div(); - // Eof - } else { - return (Token::Eof, start) - } - }, - } - } - - /// Scans regular expression after a `/` or `/=` token has been scanned by - /// `scan_ie_div`. - pub fn scan_regexp_literal(&mut self, start: Location, mut body: String) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if ch == '/' { - self.characters.next(); - break; - } else if ch == '\\' { - self.characters.next(); - body.push('\\'); - let ch = self.characters.peek_or_zero(); - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_unexpected_error(); - self.consume_line_terminator(); - } else { - self.characters.next(); - body.push(ch); - } - } else if CharacterValidator::is_line_terminator(ch) { - body.push('\n'); - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else { - body.push(ch); - self.characters.next(); - } - } - - let mut flags = String::new(); - while let Some((ch, _)) = self.consume_identifier_part() { - flags.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - (Token::RegExp { body, flags }, location) - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - // LineTerminator - fn consume_line_terminator(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch == '\x0D' && self.characters.peek_at_or_zero(1) == '\x0A' { - self.characters.skip_count_in_place(2); - // self.line_number += 1; - return true; - } - if CharacterValidator::is_line_terminator(ch) { - self.characters.next(); - // self.line_number += 1; - return true; - } - false - } - - fn consume_comment(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch != '/' { - return false; - } - let ch2 = self.characters.peek_at_or_zero(1); - if ch2 == '/' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - while !CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) && self.characters.has_remaining() { - self.characters.skip_in_place(); - } - let location = start.combine_with(self.cursor_location()); - self.consume_line_terminator(); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: false, - content: RefCell::new(self.compilation_unit.text()[(location.first_offset() + 2)..location.last_offset()].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - if ch2 == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.consume_line_terminator() { - // Consumed LineTerminator - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - false - } - - fn scan_identifier(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let mut escaped = false; - let Some((ch, escaped_2)) = self.consume_identifier_start() else { - return None; - }; - escaped = escaped || escaped_2; - let mut name = String::new(); - name.push(ch); - while let Some((ch, escaped_2)) = self.consume_identifier_part() { - escaped = escaped || escaped_2; - name.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - if !escaped { - if let Some(token) = As3ReservedWord::token(name.as_ref()) { - return Some((token, location)); - } - } - Some((Token::Identifier(name), location)) - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_start(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_start(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_part(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_part(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Expects UnicodeEscapeSequence starting from `u`. - fn expect_unicode_escape_sequence(&mut self) -> char { - let start = self.cursor_location(); - if self.characters.peek_or_zero() != 'u' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - - // Scan \uXXXX - if CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - let r = char::from_u32(self.expect_hex_digit() << 12 - | (self.expect_hex_digit() << 8) - | (self.expect_hex_digit() << 4) - | self.expect_hex_digit()); - let Some(r) = r else { - self.add_syntax_error(&start.combine_with(self.cursor_location()), DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - return r; - } - - // Scan \u{} - if self.characters.peek_or_zero() != '{' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() != '}' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - let r = u32::from_str_radix(&self.compilation_unit.text()[(start.first_offset + 2)..(location.last_offset - 1)], 16); - let Ok(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - let r = char::from_u32(r); - let Some(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - r - } - - fn expect_hex_digit(&mut self) -> u32 { - let ch = self.characters.peek_or_zero(); - let mv = CharacterValidator::hex_digit_mv(ch); - if mv.is_none() { - self.add_unexpected_error(); - return 0x5F; - } - self.characters.next(); - mv.unwrap() - } - - fn scan_dot_or_numeric_literal(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - let mut initial_dot = false; - if ch == '.' { - initial_dot = true; - self.characters.next(); - - let seq = self.characters.peek_seq(2); - // Ellipsis - if seq == ".." { - self.characters.skip_count_in_place(2); - return Some((Token::Ellipsis, start.combine_with(self.cursor_location()))); - } - let ch = seq.get(..1).map(|ch| ch.chars().next().unwrap()).unwrap_or('\x00'); - // Descendants - if ch == '.' { - self.characters.next(); - return Some((Token::Descendants, start.combine_with(self.cursor_location()))); - } - // Dot - if !CharacterValidator::is_dec_digit(ch) { - return Some((Token::Dot, start.combine_with(self.cursor_location()))); - } - - // NumericLiteral - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else if ch == '0' { - self.characters.next(); - let ch_2 = self.characters.peek_or_zero(); - - // HexLiteral - if ['X', 'x'].contains(&ch_2) { - self.characters.next(); - return self.scan_hex_literal(start.clone()); - } - - // BinLiteral; - if ['B', 'b'].contains(&ch_2) { - self.characters.next(); - return self.scan_bin_literal(start.clone()); - } - } else if CharacterValidator::is_dec_digit(ch) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else { - return None; - } - - if !initial_dot && self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - // Decimal exponent - if ['E', 'e'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - if ['+', '-'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - } - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - let string = self.compilation_unit.text()[start.first_offset..self.characters.index()].to_owned(); - - let mut suffix = NumberSuffix::None; - if self.characters.peek_or_zero() == 'f' || self.characters.peek_or_zero() == 'F' { - suffix = NumberSuffix::F; - self.characters.next(); - } - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - - Some((Token::Number(string, suffix), location)) - } - - fn scan_hex_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_hex_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn scan_bin_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_bin_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn consume_underscore_followed_by_dec_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_hex_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_bin_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn unallow_numeric_suffix(&self) { - if CharacterValidator::is_identifier_start(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - } - - fn scan_string_literal(&mut self, raw: bool) -> Option<(Token, Location)> { - let delim = self.characters.peek_or_zero(); - if !['"', '\''].contains(&delim) { - return None; - } - let mut start = self.cursor_location(); - // Include the "@" punctuator as part of raw string literals - if raw { - start = Location::with_offset(&start.compilation_unit(), start.first_offset() - 1); - } - - self.characters.next(); - - // Triple string literal - if self.characters.peek_or_zero() == delim && self.characters.peek_at_or_zero(1) == delim { - self.characters.skip_count_in_place(2); - return self.scan_triple_string_literal(delim, start, raw); - } - - let mut value = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - value.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - Some((Token::String(value), location)) - } - - fn scan_triple_string_literal(&mut self, delim: char, start: Location, raw: bool) -> Option<(Token, Location)> { - let mut lines: Vec = vec![]; - let mut builder = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - builder.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - - if lines[0].is_empty() && lines.len() > 1 { - lines.remove(0); - } - - let last_line = lines.pop().unwrap(); - - let base_indent = CharacterValidator::indent_count(&last_line); - - let mut lines: Vec = lines.iter().map(|line| { - let indent = CharacterValidator::indent_count(line); - line[usize::min(base_indent, indent)..].to_owned() - }).collect(); - - let last_line = last_line[base_indent..].to_owned(); - if !last_line.is_empty() { - lines.push(last_line); - } - - let value = lines.join("\n"); - Some((Token::String(value), location)) - } - - fn consume_escape_sequence(&mut self) -> Option { - if self.characters.peek_or_zero() != '\\' { - return None; - } - self.characters.next(); - if !self.characters.has_remaining() { - self.add_unexpected_error(); - return Some("".into()); - } - if self.consume_line_terminator() { - return Some("".into()); - } - let ch = self.characters.peek_or_zero(); - match ch { - '\'' | '"' | '\\' => { - self.characters.next(); - Some(ch.into()) - }, - 'u' => { - Some(self.expect_unicode_escape_sequence().into()) - }, - 'x' => { - self.characters.next(); - let v = (self.expect_hex_digit() << 4) | self.expect_hex_digit(); - let v = char::from_u32(v).unwrap(); - Some(v.into()) - }, - 'b' => { - self.characters.next(); - Some('\x08'.into()) - }, - 'f' => { - self.characters.next(); - Some('\x0C'.into()) - }, - 'n' => { - self.characters.next(); - Some('\x0A'.into()) - }, - 'r' => { - self.characters.next(); - Some('\x0D'.into()) - }, - 't' => { - self.characters.next(); - Some('\x09'.into()) - }, - 'v' => { - self.characters.next(); - Some('\x0B'.into()) - }, - '0' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - Some('\x00'.into()) - }, - ch => { - if CharacterValidator::is_dec_digit(ch) { - self.add_unexpected_error(); - } - self.characters.next(); - Some(ch.into()) - }, - } - } - - /// Scans for an *InputElementXMLTag* token. - pub fn scan_ie_xml_tag(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - // XmlName - if CharacterValidator::is_xml_name_start(ch) { - self.characters.next(); - while CharacterValidator::is_xml_name_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - let location = start.combine_with(self.cursor_location()); - let name = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - return (Token::XmlName(name), location); - } - - // XmlWhitespace - if CharacterValidator::is_xml_whitespace(ch) { - while CharacterValidator::is_xml_whitespace(self.characters.peek_or_zero()) { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - let location = start.combine_with(self.cursor_location()); - return (Token::XmlWhitespace, location); - } - - match ch { - // Assign - '=' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Assign, location) - }, - - // Gt - '>' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Gt, location) - }, - - // XmlSlashGt - '/' => { - self.characters.next(); - if self.characters.peek_or_zero() != '>' { - self.add_unexpected_error(); - /* - while self.characters.has_remaining() { - self.characters.next(); - if self.characters.peek_or_zero() == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - } - */ - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::XmlSlashGt, location) - }, - - // XmlAttributeValue - '"' | '\'' => { - let delim = ch; - self.characters.next(); - while self.characters.peek_or_zero() != delim && self.characters.has_remaining() { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue); - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlAttributeValue(value), location); - } - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - self.characters.next(); - - let location = start.combine_with(self.cursor_location()); - (Token::XmlAttributeValue(value), location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan_ie_xml_tag() - }, - } - } - - /// Scans for an *InputElementXMLContent* token. - pub fn scan_ie_xml_content(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - match ch { - '<' => { - self.characters.next(); - - // XmlMarkup - if let Some(r) = self.scan_xml_markup(start.clone()) { - return r; - } - - // XmlLtSlash - if self.characters.peek_or_zero() == '/' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlLtSlash, location); - } - - // Lt - let location = start.combine_with(self.cursor_location()); - (Token::Lt, location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - // XmlName - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - loop { - let ch = self.characters.peek_or_zero(); - if ['<', '{'].contains(&ch) { - break; - } - if CharacterValidator::is_line_terminator(ch) { - self.consume_line_terminator(); - } else if self.characters.has_remaining() { - self.characters.next(); - } else { - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - (Token::XmlText(content), location) - }, - } - } - - /// Attempts to scan a XMLMarkup token after a `<` character. - pub fn scan_xml_markup(&mut self, start: Location) -> Option<(Token, Location)> { - // XMLComment - if self.characters.peek_seq(3) == "!--" { - self.characters.skip_count_in_place(3); - loop { - if self.characters.peek_or_zero() == '-' && self.characters.peek_seq(3) == "-->" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLCDATA - if self.characters.peek_seq(8) == "![CDATA[" { - self.characters.skip_count_in_place(8); - loop { - if self.characters.peek_or_zero() == ']' && self.characters.peek_seq(3) == "]]>" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLPI - if self.characters.peek_or_zero() == '?' { - self.characters.next(); - loop { - if self.characters.peek_or_zero() == '?' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - None - } -} \ No newline at end of file diff --git a/crates/parser/tree.rs b/crates/parser/tree.rs deleted file mode 100644 index 3fc4e2c..0000000 --- a/crates/parser/tree.rs +++ /dev/null @@ -1,161 +0,0 @@ -//! Defines the syntactic nodes produced by the parser. - -mod invalidated_node; -pub use invalidated_node::*; - -// Expressions -mod expression; -pub use expression::*; -mod qualified_identifier; -pub use qualified_identifier::*; -mod paren_expression; -pub use paren_expression::*; -mod null_literal; -pub use null_literal::*; -mod boolean_literal; -pub use boolean_literal::*; -mod numeric_literal; -pub use numeric_literal::*; -mod string_literal; -pub use string_literal::*; -mod this_literal; -pub use this_literal::*; -mod regexp_literal; -pub use regexp_literal::*; -mod xml_expression; -pub use xml_expression::*; -mod array_literal; -pub use array_literal::*; -mod vector_literal; -pub use vector_literal::*; -mod object_initializer; -pub use object_initializer::*; -mod function_expression; -pub use function_expression::*; -mod import_meta; -pub use import_meta::*; -mod new_expression; -pub use new_expression::*; -mod member_expression; -pub use member_expression::*; -mod computed_member_expression; -pub use computed_member_expression::*; -mod descendants_expression; -pub use descendants_expression::*; -mod filter_expression; -pub use filter_expression::*; -mod super_expression; -pub use super_expression::*; -mod call_expression; -pub use call_expression::*; -mod expression_with_type_arguments; -pub use expression_with_type_arguments::*; -mod unary_expression; -pub use unary_expression::*; -mod optional_chaining_expression; -pub use optional_chaining_expression::*; -mod binary_expression; -pub use binary_expression::*; -mod conditional_expression; -pub use conditional_expression::*; -mod assignment_expression; -pub use assignment_expression::*; -mod sequence_expression; -pub use sequence_expression::*; -mod type_expression; -pub use type_expression::*; -mod reserved_namespace_expression; -pub use reserved_namespace_expression::*; - -// Destructuring -mod destructuring; -pub use destructuring::*; - -// Statements -mod empty_statement; -pub use empty_statement::*; -mod expression_statement; -pub use expression_statement::*; -mod super_statement; -pub use super_statement::*; -mod block; -pub use block::*; -mod labeled_statement; -pub use labeled_statement::*; -mod if_statement; -pub use if_statement::*; -mod switch_statement; -pub use switch_statement::*; -mod do_statement; -pub use do_statement::*; -mod while_statement; -pub use while_statement::*; -mod for_statement; -pub use for_statement::*; -mod continue_statement; -pub use continue_statement::*; -mod break_statement; -pub use break_statement::*; -mod with_statement; -pub use with_statement::*; -mod return_statement; -pub use return_statement::*; -mod throw_statement; -pub use throw_statement::*; -mod try_statement; -pub use try_statement::*; -mod default_xml_namespace_statement; -pub use default_xml_namespace_statement::*; - -// Directives -mod directive; -pub use directive::*; -mod configuration_directive; -pub use configuration_directive::*; -mod import_directive; -pub use import_directive::*; -mod use_namespace_directive; -pub use use_namespace_directive::*; -mod include_directive; -pub use include_directive::*; -mod normal_configuration_directive; -pub use normal_configuration_directive::*; - -// Miscellaneous -mod attributes; -pub use attributes::*; -mod asdoc; -pub use asdoc::*; -mod type_parameter; -pub use type_parameter::*; - -// Definitions -mod variable_definition; -pub use variable_definition::*; -mod function_definition; -pub use function_definition::*; -mod class_definition; -pub use class_definition::*; -mod enum_definition; -pub use enum_definition::*; -mod interface_definition; -pub use interface_definition::*; -mod type_definition; -pub use type_definition::*; -mod namespace_definition; -pub use namespace_definition::*; -mod package_definition; -pub use package_definition::*; -mod program; -pub use program::*; - -// MXML document -mod mxml; -pub use mxml::*; - -// CSS -mod css; -pub use css::*; - -mod tree_semantics; -pub use tree_semantics::*; \ No newline at end of file diff --git a/crates/parser/tree/array_literal.rs b/crates/parser/tree/array_literal.rs deleted file mode 100644 index 3ddf080..0000000 --- a/crates/parser/tree/array_literal.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayLiteral { - pub location: Location, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub elements: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum Element { - Elision, - Expression(Rc), - Rest((Rc, Location)), -} \ No newline at end of file diff --git a/crates/parser/tree/asdoc.rs b/crates/parser/tree/asdoc.rs deleted file mode 100644 index 95d7756..0000000 --- a/crates/parser/tree/asdoc.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDoc { - pub location: Location, - pub main_body: Option<(String, Location)>, - pub tags: Vec<(AsDocTag, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum AsDocTag { - Author(String), - Copy(Rc), - Created(String), - Default(String), - Deprecated { - message: Option, - }, - EventType(Rc), - Example(String), - InheritDoc, - Internal(String), - Langversion(String), - Param { - name: String, - description: String, - }, - Playerversion(String), - Private, - Productversion(String), - Return(String), - See { - reference: Rc, - display_text: Option, - }, - Throws { - class_reference: Rc, - description: Option, - }, - Version(String), -} - -/// An ASDoc reference consisting of an optional base and -/// an optional instance property fragment (`#x`). -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDocReference { - /// Base expression. - pub base: Option>, - /// Instance property fragment following the hash character. - pub instance_property: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/assignment_expression.rs b/crates/parser/tree/assignment_expression.rs deleted file mode 100644 index fbcfe64..0000000 --- a/crates/parser/tree/assignment_expression.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AssignmentExpression { - pub location: Location, - pub compound: Option, - /// Assignment left-hand side. - /// - /// If the left-hand side is an `ObjectInitializer` or an `ArrayLiteral` - /// and there is no compound assignment, it is a destructuring pattern. - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/attributes.rs b/crates/parser/tree/attributes.rs deleted file mode 100644 index 6e248d0..0000000 --- a/crates/parser/tree/attributes.rs +++ /dev/null @@ -1,170 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum Attribute { - Metadata(Rc), - Expression(Rc), - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), - Final(Location), - Native(Location), - Static(Location), - Abstract(Location), - Override(Location), - Dynamic(Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Metadata { - pub location: Location, - pub asdoc: Option>, - pub name: (String, Location), - pub entries: Option>>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MetadataEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MetadataValue { - IdentifierString((String, Location)), - String((String, Location)), -} - -impl MetadataValue { - pub fn location(&self) -> Location { - match self { - Self::IdentifierString((_, l)) => l.clone(), - Self::String((_, l)) => l.clone(), - } - } -} - -impl Attribute { - pub fn location(&self) -> Location { - match self { - Self::Expression(m) => m.location(), - Self::Metadata(m) => m.location.clone(), - Self::Public(a) => a.clone(), - Self::Private(a) => a.clone(), - Self::Protected(a) => a.clone(), - Self::Internal(a) => a.clone(), - Self::Final(a) => a.clone(), - Self::Native(a) => a.clone(), - Self::Static(a) => a.clone(), - Self::Abstract(a) => a.clone(), - Self::Override(a) => a.clone(), - Self::Dynamic(a) => a.clone(), - } - } - - pub fn has_access_modifier(list: &[Attribute]) -> bool { - for a in list { - match a { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => return true, - _ => {} - } - } - false - } - - pub fn remove_metadata(list: &mut Vec, metadata: &Rc) { - for i in 0..list.len() { - if let Attribute::Metadata(metadata_1) = &list[i] { - if Rc::ptr_eq(&metadata_1, metadata) { - list.remove(i); - break; - } - } - } - } - - pub fn find_metadata(list: &[Attribute]) -> Vec> { - let mut r = vec![]; - for a in list { - match &a { - Self::Metadata(e) => { - r.push(e.clone()); - }, - _ => {}, - } - } - r - } - pub fn find_expression(list: &[Attribute]) -> Option> { for a in list { match &a { Self::Expression(e) => return Some(e.clone()), _ => {} } }; None } - pub fn find_public(list: &[Attribute]) -> Option { for a in list { match &a { Self::Public(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_private(list: &[Attribute]) -> Option { for a in list { match &a { Self::Private(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_protected(list: &[Attribute]) -> Option { for a in list { match &a { Self::Protected(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_internal(list: &[Attribute]) -> Option { for a in list { match &a { Self::Internal(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_final(list: &[Attribute]) -> Option { for a in list { match &a { Self::Final(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_native(list: &[Attribute]) -> Option { for a in list { match &a { Self::Native(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_static(list: &[Attribute]) -> Option { for a in list { match &a { Self::Static(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_abstract(list: &[Attribute]) -> Option { for a in list { match &a { Self::Abstract(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_override(list: &[Attribute]) -> Option { for a in list { match &a { Self::Override(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_dynamic(list: &[Attribute]) -> Option { for a in list { match &a { Self::Dynamic(l) => return Some(l.clone()), _ => {} } }; None } - - pub fn has(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Public(_) => Self::find_public(list).is_some(), - Self::Private(_) => Self::find_private(list).is_some(), - Self::Protected(_) => Self::find_protected(list).is_some(), - Self::Internal(_) => Self::find_internal(list).is_some(), - Self::Final(_) => Self::find_final(list).is_some(), - Self::Native(_) => Self::find_native(list).is_some(), - Self::Static(_) => Self::find_static(list).is_some(), - Self::Abstract(_) => Self::find_abstract(list).is_some(), - Self::Override(_) => Self::find_override(list).is_some(), - Self::Dynamic(_) => Self::find_dynamic(list).is_some(), - _ => false, - } - } - - pub fn is_duplicate_access_modifier(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => Self::find_expression(list).is_some() || Self::find_public(list).is_some() || Self::find_private(list).is_some() || Self::find_protected(list).is_some() || Self::find_internal(list).is_some(), - _ => false, - } - } - - pub fn is_metadata(&self) -> bool { matches!(self, Self::Metadata(_)) } - pub fn is_public(&self) -> bool { matches!(self, Self::Public(_)) } - pub fn is_private(&self) -> bool { matches!(self, Self::Private(_)) } - pub fn is_protected(&self) -> bool { matches!(self, Self::Protected(_)) } - pub fn is_internal(&self) -> bool { matches!(self, Self::Internal(_)) } - pub fn is_final(&self) -> bool { matches!(self, Self::Final(_)) } - pub fn is_native(&self) -> bool { matches!(self, Self::Native(_)) } - pub fn is_static(&self) -> bool { matches!(self, Self::Static(_)) } - pub fn is_abstract(&self) -> bool { matches!(self, Self::Abstract(_)) } - pub fn is_override(&self) -> bool { matches!(self, Self::Override(_)) } - pub fn is_dynamic(&self) -> bool { matches!(self, Self::Dynamic(_)) } - - pub fn from_identifier_name(name: &str, location: &Location) -> Option { - if location.character_count() != name.chars().count() { - return None; - } - match name.as_ref() { - "final" => Some(Attribute::Final(location.clone())), - "native" => Some(Attribute::Native(location.clone())), - "static" => Some(Attribute::Static(location.clone())), - "abstract" => Some(Attribute::Abstract(location.clone())), - "override" => Some(Attribute::Override(location.clone())), - "dynamic" => Some(Attribute::Dynamic(location.clone())), - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/binary_expression.rs b/crates/parser/tree/binary_expression.rs deleted file mode 100644 index 26bee27..0000000 --- a/crates/parser/tree/binary_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BinaryExpression { - pub location: Location, - pub operator: Operator, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/block.rs b/crates/parser/tree/block.rs deleted file mode 100644 index 1349d32..0000000 --- a/crates/parser/tree/block.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Block statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct Block { - pub location: Location, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/boolean_literal.rs b/crates/parser/tree/boolean_literal.rs deleted file mode 100644 index 537f41f..0000000 --- a/crates/parser/tree/boolean_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BooleanLiteral { - pub location: Location, - pub value: bool, -} \ No newline at end of file diff --git a/crates/parser/tree/break_statement.rs b/crates/parser/tree/break_statement.rs deleted file mode 100644 index 4b75262..0000000 --- a/crates/parser/tree/break_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BreakStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/call_expression.rs b/crates/parser/tree/call_expression.rs deleted file mode 100644 index 2f502b2..0000000 --- a/crates/parser/tree/call_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct CallExpression { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/class_definition.rs b/crates/parser/tree/class_definition.rs deleted file mode 100644 index fb9d6b3..0000000 --- a/crates/parser/tree/class_definition.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ClassDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>, - pub implements_clause: Option>>, - pub block: Rc, -} diff --git a/crates/parser/tree/computed_member_expression.rs b/crates/parser/tree/computed_member_expression.rs deleted file mode 100644 index c869f5e..0000000 --- a/crates/parser/tree/computed_member_expression.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ComputedMemberExpression { - pub location: Location, - pub base: Rc, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub key: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/conditional_expression.rs b/crates/parser/tree/conditional_expression.rs deleted file mode 100644 index cbf1f8d..0000000 --- a/crates/parser/tree/conditional_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ConditionalExpression { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/configuration_directive.rs b/crates/parser/tree/configuration_directive.rs deleted file mode 100644 index c22fccf..0000000 --- a/crates/parser/tree/configuration_directive.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `configuration {}` directive. -/// -/// # Syntax -/// -/// The directive consists of a block -/// of `if..else` branches, whose -/// condition is one of the following expressions: -/// -/// ```plain -/// // Check whether constant is "true" -/// q::x -/// x -/// // Check whether constant is "v" -/// k="v" -/// k=v // QualifiedIdentifier == StringLiteral -/// // Check whether constant is not "v" -/// k!="v" -/// k!=v // QualifiedIdentifier != StringLiteral -/// -/// x && y -/// x || y -/// -/// (x) -/// !x -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct ConfigurationDirective { - pub location: Location, - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/continue_statement.rs b/crates/parser/tree/continue_statement.rs deleted file mode 100644 index 70338d7..0000000 --- a/crates/parser/tree/continue_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ContinueStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/css.rs b/crates/parser/tree/css.rs deleted file mode 100644 index c10a14f..0000000 --- a/crates/parser/tree/css.rs +++ /dev/null @@ -1,471 +0,0 @@ -use std::{marker::PhantomData, str::FromStr}; - -use crate::ns::*; -use num_traits::ToPrimitive; -use serde::{Serialize, Deserialize}; - -/// CSS3 selector combinators. -/// -/// See also: [CSS3 selectors: combinators](http://www.w3.org/TR/css3-selectors/#combinators). -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssCombinatorType { - Descendant, - Child, - Preceded, - Sibling, -} - -impl ToString for CssCombinatorType { - /// Symbol that represents the combinator type. - fn to_string(&self) -> String { - match self { - Self::Descendant => " ".into(), - Self::Child => ">".into(), - Self::Preceded => "+".into(), - Self::Sibling => "~".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssDirective { - Invalidated(InvalidatedNode), - FontFace(CssFontFace), - MediaQuery(CssMediaQuery), - NamespaceDefinition(CssNamespaceDefinition), - Rule(CssRule), -} - -impl CssDirective { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::FontFace(v) => v.location.clone(), - Self::MediaQuery(v) => v.location.clone(), - Self::NamespaceDefinition(v) => v.location.clone(), - Self::Rule(v) => v.location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssPropertyValue { - Invalidated(InvalidatedNode), - /// Example: `yellow, #fff` - Array(CssArrayPropertyValue), - /// Example: `1px solid red` - MultiValue(CssMultiValuePropertyValue), - /// Example: `yellow`, `#fff` - Color(CssColorPropertyValue), - /// Example: `10, 10.0, 10pt` - Number(CssNumberPropertyValue), - /// Example: `rgb(10% 10% 10%)`, `rgb(10%, 10%, 10%)` - RgbColor(CssRgbColorPropertyValue), - /// Example: `"string"` - String(CssStringPropertyValue), - /// Example: `solid`, `_serif` - Identifier(CssIdentifierPropertyValue), - /// `ClassReference(...)` - ClassReference(CssClassReferencePropertyValue), - /// `PropertyReference(...)` - PropertyReference(CssPropertyReferencePropertyValue), - //// `url(...) [format(...)]` - Url(CssUrlPropertyValue), - /// `local(...)` - Local(CssLocalPropertyValue), - /// `Embed(...)` - Embed(CssEmbedPropertyValue), -} - -impl CssPropertyValue { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Array(v) => v.location.clone(), - Self::MultiValue(v) => v.location.clone(), - Self::Color(v) => v.location.clone(), - Self::Number(v) => v.location.clone(), - Self::RgbColor(v) => v.location.clone(), - Self::String(v) => v.location.clone(), - Self::Identifier(v) => v.location.clone(), - Self::ClassReference(v) => v.location.clone(), - Self::PropertyReference(v) => v.location.clone(), - Self::Url(v) => v.location.clone(), - Self::Local(v) => v.location.clone(), - Self::Embed(v) => v.location.clone(), - } - } - - pub fn as_array(&self) -> Option<&CssArrayPropertyValue> { - let Self::Array(v) = self else { return None; }; - Some(v) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelector { - Invalidated(InvalidatedNode), - Base(CssBaseSelector), - Combinator(CssCombinatorSelector), -} - -impl CssSelector { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Base(v) => v.location.clone(), - Self::Combinator(v) => v.location.clone(), - } - } -} - -/// Array property values are comma-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// fillColors: #FFFFFF, #CCCCCC, #FFFFFF, #EEEEEE; -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssArrayPropertyValue { - pub location: Location, - pub elements: Vec>, -} - -/// Multi-value property values are space-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// 1px solid blue -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMultiValuePropertyValue { - pub location: Location, - pub values: Vec>, -} - -/// A CSS base selector. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssBaseSelector { - pub location: Location, - pub namespace_prefix: Option<(String, Location)>, - pub element_name: Option<(String, Location)>, - pub conditions: Vec>, -} - -/// Supported condition types for [`CssSelectorCondition`]. -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelectorCondition { - Invalidated(InvalidatedNode), - /// For example: `s|Label.className` - Class((String, Location)), - /// For example: `s|Label#idValue` - Id((String, Location)), - /// For example: `s|Label:loadingState` - Pseudo((String, Location)), - /// For example: `s|Label::loadingState` - PseudoElement((String, Location)), - /// For example: `s|Panel:not(:first-child)` - Not { - location: Location, - condition: Rc, - }, - /// For example: `s|Label[loadingState]` - Attribute { - location: Location, - name: (String, Location), - operator: Option, - value: Option<(String, Location)>, - }, -} - -impl CssSelectorCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Class((_, l)) => l.clone(), - Self::Id((_, l)) => l.clone(), - Self::Pseudo((_, l)) => l.clone(), - Self::PseudoElement((_, l)) => l.clone(), - Self::Not { location, .. } => location.clone(), - Self::Attribute { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssAttributeOperator { - Equals, - BeginsWith, - EndsWith, - Contains, - ListMatch, - HreflangMatch, -} - -impl ToString for CssAttributeOperator { - fn to_string(&self) -> String { - match self { - Self::Equals => "=".into(), - Self::BeginsWith => "^=".into(), - Self::EndsWith => "$=".into(), - Self::Contains => "*=".into(), - Self::ListMatch => "~=".into(), - Self::HreflangMatch => "|=".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssColorPropertyValue { - pub fn from_hex(location: Location, token_text: &str) -> Result { - let mut token_text = if token_text.starts_with('#') { token_text.to_owned() } else { - "#".to_owned() + token_text - }; - if token_text.len() == 4 { - let mut six = String::new(); - let chars: Vec<_> = token_text.chars().collect(); - six.push('#'); - six.push(chars[1]); - six.push(chars[1]); - six.push(chars[2]); - six.push(chars[2]); - six.push(chars[3]); - six.push(chars[3]); - token_text = six; - } - Ok(Self { - location, - color_int: u32::from_str_radix(&token_text[1..], 16).map_err(|_| ParserError::Common)?.clamp(0x000000, 0xFFFFFF), - }) - } - - pub fn text(&self) -> String { - self.location.text() - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNumberPropertyValue { - pub location: Location, - pub value: f64, - pub unit: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRgbColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssRgbColorPropertyValue { - pub fn from_raw_arguments(location: &Location, raw_arguments: &[String]) -> Result { - Ok(CssRgbColorPropertyValue { - location: location.clone(), - color_int: (Self::parse_component(&raw_arguments[0])? << 16) - | (Self::parse_component(&raw_arguments[1])? << 8) - | Self::parse_component(&raw_arguments[2])?, - }) - } - - fn parse_component(input: &str) -> Result { - let i = input.find('%'); - let v: u32; - if let Some(i) = i { - let percent = f64::from_str(&input[..i]).map_err(|_| ParserError::Common)?.clamp(0.0, 100.0); - v = (255.0 * (percent / 100.0)).round().to_u32().ok_or(ParserError::Common)?; - } else if input.contains('.') { - let ratio = f64::from_str(input).map_err(|_| ParserError::Common)?.clamp(0.0, 1.0); - v = (255.0 * ratio).round().to_u32().ok_or(ParserError::Common)?; - } else { - v = u32::from_str(input).map_err(|_| ParserError::Common)?; - } - Ok(v.clamp(0, 255)) - } -} - -/// A CSS text is a string value written without quotes. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssStringPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssIdentifierPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssClassReferencePropertyValue { - pub location: Location, - /// Name or "null". - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssPropertyReferencePropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssUrlPropertyValue { - pub location: Location, - pub url: (String, Location), - pub format: Option<(String, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssLocalPropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedPropertyValue { - pub location: Location, - pub entries: Vec>, -} - -/// Represents a key-value entry for an `Embed` function call property value. -/// It may be a keyless entry. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: (String, Location), -} - -/// A CSS selector containing a combinator. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssCombinatorSelector { - pub location: Location, - pub left: Rc, - pub right: Rc, - pub combinator_type: CssCombinatorType, -} - -/// The root object of a CSS DOM. The CSS3 DOM objects serve not only IDE -/// features in code model, but also CSS compilation. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssDocument { - pub location: Location, - pub directives: Vec>, -} - -/// CSS DOM for an `@font-face` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssFontFace { - pub location: Location, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssProperty { - pub location: Location, - pub name: (String, Location), - pub value: Rc, - #[serde(skip)] - _phantom: PhantomData<()>, -} - -impl CssProperty { - pub fn new(location: Location, name: (String, Location), value: Rc) -> Self { - Self { - location, - name: (Self::normalize(&name.0), name.1), - value, - _phantom: PhantomData::default(), - } - } - - /// Normalize CSS property names to camel-case style names. Names already in - /// camel-case will be returned as-is. - fn normalize(name: &str) -> String { - let mut split = name.split('-').map(|s| s.to_owned()).collect::>(); - let mut v = split[0].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_lowercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[0] = v1; - for i in 1..split.len() { - let mut v = split[i].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_uppercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[i] = v1; - } - split.join("") - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMediaQuery { - pub location: Location, - pub conditions: Vec>, - pub rules: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssMediaQueryCondition { - Invalidated(InvalidatedNode), - /// Identifier. Example: "screen". - Id((String, Location)), - /// The `only` keyword followed by an identifier. - /// Example: "only screen". - OnlyId { - location: Location, - id: (String, Location), - }, - /// A parenthesized property, such as - /// `(application-dpi: 240)`. - ParenProperty((Rc, Location)), - /// A `condition1 and condition2` expression. - And { - location: Location, - left: Rc, - right: Rc, - }, -} - -impl CssMediaQueryCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Id((_, l)) => l.clone(), - Self::OnlyId { location, .. } => location.clone(), - Self::ParenProperty((_, l)) => l.clone(), - Self::And { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRule { - pub location: Location, - pub selectors: Vec>, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNamespaceDefinition { - pub location: Location, - pub prefix: (String, Location), - pub uri: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/default_xml_namespace_statement.rs b/crates/parser/tree/default_xml_namespace_statement.rs deleted file mode 100644 index 08084e2..0000000 --- a/crates/parser/tree/default_xml_namespace_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DefaultXmlNamespaceStatement { - pub location: Location, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/descendants_expression.rs b/crates/parser/tree/descendants_expression.rs deleted file mode 100644 index d4e7bce..0000000 --- a/crates/parser/tree/descendants_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DescendantsExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/destructuring.rs b/crates/parser/tree/destructuring.rs deleted file mode 100644 index 3205c3d..0000000 --- a/crates/parser/tree/destructuring.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypedDestructuring { - pub location: Location, - pub destructuring: Rc, - pub type_annotation: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/directive.rs b/crates/parser/tree/directive.rs deleted file mode 100644 index 7506e0e..0000000 --- a/crates/parser/tree/directive.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Directive attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Directive { - EmptyStatement(EmptyStatement), - ExpressionStatement(ExpressionStatement), - SuperStatement(SuperStatement), - Block(Block), - LabeledStatement(LabeledStatement), - IfStatement(IfStatement), - SwitchStatement(SwitchStatement), - SwitchTypeStatement(SwitchTypeStatement), - DoStatement(DoStatement), - WhileStatement(WhileStatement), - ForStatement(ForStatement), - ForInStatement(ForInStatement), - BreakStatement(BreakStatement), - ContinueStatement(ContinueStatement), - WithStatement(WithStatement), - ReturnStatement(ReturnStatement), - ThrowStatement(ThrowStatement), - DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement), - TryStatement(TryStatement), - Invalidated(InvalidatedNode), - ConfigurationDirective(ConfigurationDirective), - ImportDirective(ImportDirective), - UseNamespaceDirective(UseNamespaceDirective), - IncludeDirective(IncludeDirective), - NormalConfigurationDirective(NormalConfigurationDirective), - VariableDefinition(VariableDefinition), - FunctionDefinition(FunctionDefinition), - ClassDefinition(ClassDefinition), - EnumDefinition(EnumDefinition), - InterfaceDefinition(InterfaceDefinition), - TypeDefinition(TypeDefinition), - NamespaceDefinition(NamespaceDefinition), -} - -impl Directive { - pub fn location(&self) -> Location { - match self { - Self::EmptyStatement(d) => d.location.clone(), - Self::ExpressionStatement(d) => d.location.clone(), - Self::SuperStatement(d) => d.location.clone(), - Self::Block(d) => d.location.clone(), - Self::LabeledStatement(d) => d.location.clone(), - Self::IfStatement(d) => d.location.clone(), - Self::SwitchStatement(d) => d.location.clone(), - Self::SwitchTypeStatement(d) => d.location.clone(), - Self::DoStatement(d) => d.location.clone(), - Self::WhileStatement(d) => d.location.clone(), - Self::ForStatement(d) => d.location.clone(), - Self::ForInStatement(d) => d.location.clone(), - Self::BreakStatement(d) => d.location.clone(), - Self::ContinueStatement(d) => d.location.clone(), - Self::WithStatement(d) => d.location.clone(), - Self::ReturnStatement(d) => d.location.clone(), - Self::ThrowStatement(d) => d.location.clone(), - Self::DefaultXmlNamespaceStatement(d) => d.location.clone(), - Self::TryStatement(d) => d.location.clone(), - Self::Invalidated(d) => d.location.clone(), - Self::ConfigurationDirective(d) => d.location.clone(), - Self::ImportDirective(d) => d.location.clone(), - Self::UseNamespaceDirective(d) => d.location.clone(), - Self::IncludeDirective(d) => d.location.clone(), - Self::NormalConfigurationDirective(d) => d.location.clone(), - Self::VariableDefinition(d) => d.location.clone(), - Self::FunctionDefinition(d) => d.location.clone(), - Self::ClassDefinition(d) => d.location.clone(), - Self::EnumDefinition(d) => d.location.clone(), - Self::InterfaceDefinition(d) => d.location.clone(), - Self::TypeDefinition(d) => d.location.clone(), - Self::NamespaceDefinition(d) => d.location.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/do_statement.rs b/crates/parser/tree/do_statement.rs deleted file mode 100644 index 2c6400e..0000000 --- a/crates/parser/tree/do_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `do..while` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct DoStatement { - pub location: Location, - pub body: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/empty_statement.rs b/crates/parser/tree/empty_statement.rs deleted file mode 100644 index 73ac431..0000000 --- a/crates/parser/tree/empty_statement.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EmptyStatement { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/enum_definition.rs b/crates/parser/tree/enum_definition.rs deleted file mode 100644 index b1892eb..0000000 --- a/crates/parser/tree/enum_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EnumDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub is_set: bool, - pub name: (String, Location), - pub as_clause: Option>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression.rs b/crates/parser/tree/expression.rs deleted file mode 100644 index 25e77da..0000000 --- a/crates/parser/tree/expression.rs +++ /dev/null @@ -1,276 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Expression attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Expression { - QualifiedIdentifier(QualifiedIdentifier), - Paren(ParenExpression), - NullLiteral(NullLiteral), - BooleanLiteral(BooleanLiteral), - NumericLiteral(NumericLiteral), - StringLiteral(StringLiteral), - ThisLiteral(ThisLiteral), - RegExpLiteral(RegExpLiteral), - Xml(XmlExpression), - XmlMarkup(XmlMarkupExpression), - XmlList(XmlListExpression), - ArrayLiteral(ArrayLiteral), - VectorLiteral(VectorLiteral), - ObjectInitializer(ObjectInitializer), - Function(FunctionExpression), - ImportMeta(ImportMeta), - New(NewExpression), - Member(MemberExpression), - ComputedMember(ComputedMemberExpression), - Descendants(DescendantsExpression), - Filter(FilterExpression), - Super(SuperExpression), - Call(CallExpression), - WithTypeArguments(ExpressionWithTypeArguments), - Unary(UnaryExpression), - OptionalChaining(OptionalChainingExpression), - OptionalChainingPlaceholder(OptionalChainingPlaceholder), - Binary(BinaryExpression), - Conditional(ConditionalExpression), - Assignment(AssignmentExpression), - Sequence(SequenceExpression), - NullableType(NullableTypeExpression), - NonNullableType(NonNullableTypeExpression), - AnyType(AnyTypeExpression), - VoidType(VoidTypeExpression), - ArrayType(ArrayTypeExpression), - TupleType(TupleTypeExpression), - FunctionType(FunctionTypeExpression), - Invalidated(InvalidatedNode), - ReservedNamespace(ReservedNamespaceExpression), -} - -impl Expression { - pub fn location(&self) -> Location { - match self { - Self::QualifiedIdentifier(e) => e.location.clone(), - Self::Paren(e) => e.location.clone(), - Self::NullLiteral(e) => e.location.clone(), - Self::BooleanLiteral(e) => e.location.clone(), - Self::NumericLiteral(e) => e.location.clone(), - Self::StringLiteral(e) => e.location.clone(), - Self::ThisLiteral(e) => e.location.clone(), - Self::RegExpLiteral(e) => e.location.clone(), - Self::Xml(e) => e.location.clone(), - Self::XmlMarkup(e) => e.location.clone(), - Self::XmlList(e) => e.location.clone(), - Self::ArrayLiteral(e) => e.location.clone(), - Self::VectorLiteral(e) => e.location.clone(), - Self::ObjectInitializer(e) => e.location.clone(), - Self::Function(e) => e.location.clone(), - Self::ImportMeta(e) => e.location.clone(), - Self::New(e) => e.location.clone(), - Self::Member(e) => e.location.clone(), - Self::ComputedMember(e) => e.location.clone(), - Self::Descendants(e) => e.location.clone(), - Self::Filter(e) => e.location.clone(), - Self::Super(e) => e.location.clone(), - Self::Call(e) => e.location.clone(), - Self::WithTypeArguments(e) => e.location.clone(), - Self::Unary(e) => e.location.clone(), - Self::OptionalChaining(e) => e.location.clone(), - Self::OptionalChainingPlaceholder(e) => e.location.clone(), - Self::Binary(e) => e.location.clone(), - Self::Conditional(e) => e.location.clone(), - Self::Assignment(e) => e.location.clone(), - Self::Sequence(e) => e.location.clone(), - Self::NullableType(e) => e.location.clone(), - Self::NonNullableType(e) => e.location.clone(), - Self::AnyType(e) => e.location.clone(), - Self::VoidType(e) => e.location.clone(), - Self::ArrayType(e) => e.location.clone(), - Self::TupleType(e) => e.location.clone(), - Self::FunctionType(e) => e.location.clone(), - Self::Invalidated(e) => e.location.clone(), - Self::ReservedNamespace(e) => e.location(), - } - } - - pub(crate) fn to_metadata(&self, parser: &Parser) -> Result>, MetadataRefineError1> { - match self { - Self::ArrayLiteral(ArrayLiteral { elements, asdoc, .. }) => { - if elements.len() != 1 { - return Ok(None); - } - if let Element::Expression(ref exp) = elements[0] { - Ok(Some(vec![Attribute::Metadata(parser.refine_metadata(exp, asdoc.clone()).map_err(|e| MetadataRefineError1(e, exp.location()))?)])) - } else { - Ok(None) - } - }, - Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) => { - let a = base.to_metadata(parser)?; - if a.is_none() { - return Ok(None); - } - let mut a = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - Ok(Some(a)) - }, - _ => Ok(None), - } - } - - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name_or_asterisk(), - _ => None, - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name(), - _ => None, - } - } - - pub fn valid_access_modifier(&self) -> bool { - match self { - Self::QualifiedIdentifier(id) => id.is_identifier_token(), - Self::Member(e) => e.base.valid_access_modifier(), - Self::ComputedMember(e) => e.base.valid_access_modifier(), - _ => false, - } - } - - pub(crate) fn to_reserved_namespace_string(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_string()) - } else { - None - } - } - - pub(crate) fn to_reserved_namespace_attribute(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_attribute()) - } else { - None - } - } - - pub fn is_invalidated(&self) -> bool { - matches!(self, Self::Invalidated(_)) - } - - pub fn is_non_null_operation(&self) -> bool { - match self { - Self::Unary(expr) => expr.operator == Operator::NonNull, - _ => false, - } - } - - pub fn is_valid_assignment_left_hand_side(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::Unary(e) => e.expression.is_valid_assignment_left_hand_side(), - Self::ArrayLiteral(_) | Self::ObjectInitializer(_) => self.is_valid_destructuring(), - _ => true, - } - } - - pub fn is_valid_destructuring(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::QualifiedIdentifier(id) => !id.attribute && id.qualifier.is_none() && match &id.id { - QualifiedIdentifierIdentifier::Id(id) => id.0 != "*", - _ => false, - }, - Self::ArrayLiteral(expr) => { - for el in &expr.elements { - match el { - Element::Elision => {}, - Element::Expression(expr) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - Element::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::ObjectInitializer(init) => { - for field in init.fields.iter() { - match field.as_ref() { - InitializerField::Field { value, .. } => { - if let Some(val) = value { - if !val.is_valid_destructuring() { - return false; - } - } - }, - InitializerField::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::Unary(expr) => expr.operator == Operator::NonNull && expr.expression.is_valid_destructuring(), - _ => false, - } - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier(&self, parser: &Parser) -> Result)>, MetadataRefineError1> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return Ok(None); - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Ok(Some((q, id.clone(), vec![]))); - } - } - } - } - if let Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) = self { - let a = base.to_normal_configuration_identifier(parser)?; - if a.is_none() { - return Ok(None); - } - let (ns, name, mut a) = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - return Ok(Some((ns, name, a))); - } - Ok(None) - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier_no_metadata(&self) -> Option<((String, Location), (String, Location))> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return None; - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Some((q, id.clone())); - } - } - } - } - None - } -} \ No newline at end of file diff --git a/crates/parser/tree/expression_statement.rs b/crates/parser/tree/expression_statement.rs deleted file mode 100644 index 779fc81..0000000 --- a/crates/parser/tree/expression_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression_with_type_arguments.rs b/crates/parser/tree/expression_with_type_arguments.rs deleted file mode 100644 index 8cf5e84..0000000 --- a/crates/parser/tree/expression_with_type_arguments.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `o.<...>` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionWithTypeArguments { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/filter_expression.rs b/crates/parser/tree/filter_expression.rs deleted file mode 100644 index 734b6e7..0000000 --- a/crates/parser/tree/filter_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Filter operation `o.(condition)`. -#[derive(Clone, Serialize, Deserialize)] -pub struct FilterExpression { - pub location: Location, - pub base: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/for_statement.rs b/crates/parser/tree/for_statement.rs deleted file mode 100644 index f648a97..0000000 --- a/crates/parser/tree/for_statement.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForStatement { - pub location: Location, - pub init: Option, - pub test: Option>, - pub update: Option>, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInitializer { - Expression(Rc), - VariableDefinition(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForInStatement { - pub location: Location, - pub each: bool, - pub left: ForInBinding, - pub right: Rc, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInBinding { - Expression(Rc), - VariableDefinition(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_definition.rs b/crates/parser/tree/function_definition.rs deleted file mode 100644 index 6da842e..0000000 --- a/crates/parser/tree/function_definition.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: FunctionName, - pub common: Rc, -} - -impl FunctionDefinition { - /// Indicates whether the function definition is not a getter, setter, - /// or constructor. - pub fn is_normal(&self) -> bool { - matches!(self.name, FunctionName::Identifier(_)) - } - pub fn is_getter(&self) -> bool { - matches!(self.name, FunctionName::Getter(_)) - } - pub fn is_setter(&self) -> bool { - matches!(self.name, FunctionName::Setter(_)) - } - pub fn is_constructor(&self) -> bool { - matches!(self.name, FunctionName::Constructor(_)) - } - pub fn name_identifier(&self) -> (String, Location) { - match &self.name { - FunctionName::Identifier(name) => name.clone(), - FunctionName::Getter(name) => name.clone(), - FunctionName::Setter(name) => name.clone(), - FunctionName::Constructor(name) => name.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionName { - Identifier((String, Location)), - Getter((String, Location)), - Setter((String, Location)), - /// A `FunctionName` is a `Constructor` variant - /// when the corresponding function definition is a constructor. - Constructor((String, Location)), -} - -impl FunctionName { - pub fn location(&self) -> Location { - match self { - Self::Identifier((_, l)) => l.clone(), - Self::Getter((_, l)) => l.clone(), - Self::Setter((_, l)) => l.clone(), - Self::Constructor((_, l)) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionCommon { - pub location: Location, - /// Indicates whether the corresponding function - /// contains the `yield` operator. - pub contains_yield: bool, - /// Indicates whether the corresponding function - /// contains the `await` operator. - pub contains_await: bool, - pub signature: FunctionSignature, - pub body: Option, -} - -impl FunctionCommon { - pub(crate) fn has_block_body(&self) -> bool { - if let Some(ref body) = self.body { matches!(body, FunctionBody::Block(_)) } else { false } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionSignature { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Parameter { - pub location: Location, - pub kind: ParameterKind, - pub destructuring: TypedDestructuring, - pub default_value: Option>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[repr(u32)] -pub enum ParameterKind { - Required = 1, - Optional = 2, - Rest = 3, -} - -impl ParameterKind { - pub fn may_be_followed_by(&self, other: Self) -> bool { - (*self as u32) <= (other as u32) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionBody { - Expression(Rc), - Block(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_expression.rs b/crates/parser/tree/function_expression.rs deleted file mode 100644 index 377512e..0000000 --- a/crates/parser/tree/function_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionExpression { - pub location: Location, - pub name: Option<(String, Location)>, - pub common: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/if_statement.rs b/crates/parser/tree/if_statement.rs deleted file mode 100644 index cf84ca0..0000000 --- a/crates/parser/tree/if_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IfStatement { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/import_directive.rs b/crates/parser/tree/import_directive.rs deleted file mode 100644 index cbf86a1..0000000 --- a/crates/parser/tree/import_directive.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportDirective { - pub location: Location, - pub alias: Option<(String, Location)>, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ImportSpecifier { - Wildcard(Location), - Identifier((String, Location)), -} - -impl ImportSpecifier { - pub fn location(&self) -> Location { - match self { - Self::Wildcard(l) => l.clone(), - Self::Identifier((_, l)) => l.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/import_meta.rs b/crates/parser/tree/import_meta.rs deleted file mode 100644 index be968ce..0000000 --- a/crates/parser/tree/import_meta.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `import.meta` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportMeta { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/include_directive.rs b/crates/parser/tree/include_directive.rs deleted file mode 100644 index 01faef3..0000000 --- a/crates/parser/tree/include_directive.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IncludeDirective { - pub location: Location, - pub source: String, - #[serde(skip)] - pub nested_compilation_unit: Rc, - pub nested_packages: Vec>, - pub nested_directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/interface_definition.rs b/crates/parser/tree/interface_definition.rs deleted file mode 100644 index 00dcb67..0000000 --- a/crates/parser/tree/interface_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct InterfaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/invalidated_node.rs b/crates/parser/tree/invalidated_node.rs deleted file mode 100644 index f15957d..0000000 --- a/crates/parser/tree/invalidated_node.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a construct that failed to parse. -#[derive(Clone, Serialize, Deserialize)] -pub struct InvalidatedNode { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/labeled_statement.rs b/crates/parser/tree/labeled_statement.rs deleted file mode 100644 index 81cb248..0000000 --- a/crates/parser/tree/labeled_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct LabeledStatement { - pub location: Location, - pub label: (String, Location), - pub substatement: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/member_expression.rs b/crates/parser/tree/member_expression.rs deleted file mode 100644 index 66bb70e..0000000 --- a/crates/parser/tree/member_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct MemberExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/mxml.rs b/crates/parser/tree/mxml.rs deleted file mode 100644 index 0316898..0000000 --- a/crates/parser/tree/mxml.rs +++ /dev/null @@ -1,186 +0,0 @@ -use std::collections::BTreeMap; - -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Mxml { - pub location: Location, - pub version: XmlVersion, - pub encoding: String, - pub content: Vec>, -} - -#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum XmlVersion { - /// XML version 1.0. - Version10, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlElement { - pub location: Location, - pub name: MxmlName, - /// Attribute list, including `xmlns` and `xmlns:` namespace prefixes. - pub attributes: Vec>, - /// The namespace mapping relative to the XML element. - #[serde(skip)] - pub namespace: Rc, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlAttribute { - pub location: Location, - /// Indicates whether the attribute is a `xmlns` or `xmlns:` attribute. - pub xmlns: bool, - pub name: MxmlName, - /// Attribute value. The location data includes the quotes. - pub value: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlName { - pub location: Location, - /// The unresolved prefix of the name. - pub prefix: Option, - pub name: String, -} - -impl MxmlName { - pub fn resolve_prefix(&self, namespace: &Rc) -> Result { - let Some(p) = self.prefix.as_ref() else { - return if let Some(v) = namespace.get(MxmlNamespace::DEFAULT_NAMESPACE) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(MxmlNamespace::DEFAULT_NAMESPACE.into())) - }; - }; - if let Some(v) = namespace.get(p) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(p.clone())) - } - } - - pub fn resolve_name(&self, namespace: &Rc) -> Result<(String, String), MxmlNameError> { - let p = self.resolve_prefix(namespace)?; - Ok((p, self.name.clone())) - } - - pub fn equals_name(&self, other: &Self, namespace: &Rc) -> Result { - if self.name != other.name { - return Ok(false); - } - let p1 = self.resolve_prefix(namespace)?; - let p2 = other.resolve_prefix(namespace)?; - Ok(&p1 == &p2) - } -} - -#[derive(Clone)] -pub enum MxmlNameError { - PrefixNotDefined(String), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MxmlContent { - Characters((String, Location)), - /// A CDATA construct, including the first `` characters. - CData((String, Location)), - /// A comment construct, including the first `` characters. - Comment((String, Location)), - ProcessingInstruction { - location: Location, - name: String, - data: Option, - }, - Element(Rc), -} - -impl MxmlContent { - pub fn location(&self) -> Location { - match self { - Self::Characters((_, l)) => l.clone(), - Self::CData((_, l)) => l.clone(), - Self::Comment((_, l)) => l.clone(), - Self::ProcessingInstruction { location: l, .. } => l.clone(), - Self::Element(e) => e.location.clone(), - } - } -} - -/// Mapping of namespace prefixes. -#[derive(Clone, PartialEq)] -pub struct MxmlNamespace { - parent: Option>, - mappings: RefCell>, -} - -impl Default for MxmlNamespace { - fn default() -> Self { - Self::new(None) - } -} - -impl MxmlNamespace { - /// Returns the prefix used for the default XML namespace. - pub const DEFAULT_NAMESPACE: &'static str = ""; - - /// Constructs an empty set of namespace mappings. - pub fn new(parent: Option<&Rc>) -> Self { - let mut ns = Self { - parent: parent.map(|p| p.clone()), - mappings: RefCell::new(BTreeMap::new()), - }; - if ns.parent.is_none() { - ns.mappings.get_mut().insert(Self::DEFAULT_NAMESPACE.into(), "".into()); - ns.mappings.get_mut().insert("xmlns".into(), "http://www.w3.org/xml/xmlns".into()); - } - ns - } - - pub fn includes(&self, prefix: &str) -> bool { - self.mappings.borrow().contains_key(prefix) || match &self.parent { - Some(p) => p.includes(prefix), - None => false, - } - } - - /// Retrieves the value of a prefix either in the actual - /// set of mappings or in the parent set of mappings. - pub fn get(&self, prefix: &str) -> Option { - if let Some(value) = self.mappings.borrow().get(prefix) { - return Some(value.clone()); - } - self.parent.as_ref().and_then(|p| p.get(prefix)) - } - - pub fn set(&self, prefix: &str, value: &str) { - self.mappings.borrow_mut().insert(prefix.to_owned(), value.to_owned()); - } - - pub fn delete(&self, prefix: &str) -> bool { - self.mappings.borrow_mut().remove(prefix).is_some() - } - - pub fn clear(&self) { - self.mappings.borrow_mut().clear(); - } - - /// Returns the actual set of prefix mappings. - pub fn listing(&self) -> BTreeMap { - self.mappings.borrow().clone() - } - - /// Returns a concatenation of the parent set of prefix mappings - /// and the actual set of prefix mappings. - pub fn full_listing(&self) -> BTreeMap { - let mut listing = self.parent.as_ref().map_or(BTreeMap::new(), |p| p.full_listing()); - listing.extend(self.listing()); - listing - } -} diff --git a/crates/parser/tree/namespace_definition.rs b/crates/parser/tree/namespace_definition.rs deleted file mode 100644 index 1f77880..0000000 --- a/crates/parser/tree/namespace_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NamespaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/new_expression.rs b/crates/parser/tree/new_expression.rs deleted file mode 100644 index 862e2da..0000000 --- a/crates/parser/tree/new_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NewExpression { - pub location: Location, - pub base: Rc, - pub arguments: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/normal_configuration_directive.rs b/crates/parser/tree/normal_configuration_directive.rs deleted file mode 100644 index 3083db8..0000000 --- a/crates/parser/tree/normal_configuration_directive.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a `CONFIG::x ...` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct NormalConfigurationDirective { - pub location: Location, - /// The namespace, most commonly the `CONFIG` identifier. - pub namespace: (String, Location), - /// The constant name without including the qualifier. - pub constant_name: (String, Location), - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/null_literal.rs b/crates/parser/tree/null_literal.rs deleted file mode 100644 index 6f286b7..0000000 --- a/crates/parser/tree/null_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/numeric_literal.rs b/crates/parser/tree/numeric_literal.rs deleted file mode 100644 index b695ebd..0000000 --- a/crates/parser/tree/numeric_literal.rs +++ /dev/null @@ -1,157 +0,0 @@ -use crate::ns::*; -use num_bigint::BigInt; -use serde::{Serialize, Deserialize}; -use std::str::FromStr; -use conv::ValueFrom; -use num_traits::ToPrimitive; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NumericLiteral { - pub location: Location, - /// The numeric value in character representation. Such representation may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - pub value: String, - pub suffix: NumberSuffix, -} - -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub enum NumberSuffix { - None, - F, -} - -impl NumericLiteral { - /// Parses a double-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_double(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } - } - f64::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a single-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_float(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } - } - f32::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a signed long either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_long(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i64::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a signed integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses an unsigned integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_uint(&self) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u32::from_str_radix(&s[2..], 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u32::from_str_radix(&s[2..], 2); - return n.map_err(|_| ParserError::Common); - } - } - u32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a big integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_big_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::hex_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 16); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::bin_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 2); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } - } - BigInt::from_str(&s).map_err(|_| ParserError::Common) - } -} - -mod tests { - #[allow(unused)] - use crate::ns::*; - #[allow(unused)] - use std::rc::Rc; - - #[test] - fn test_minimum_maximum() { - // Long.MIN_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x8000_0000_0000_0000".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MIN, literal.parse_long(true).unwrap()); - - // Long.MAX_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x7FFF_FFFF_FFFF_FFFF".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MAX, literal.parse_long(false).unwrap()); - } -} \ No newline at end of file diff --git a/crates/parser/tree/object_initializer.rs b/crates/parser/tree/object_initializer.rs deleted file mode 100644 index d7e6cbb..0000000 --- a/crates/parser/tree/object_initializer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ObjectInitializer { - pub location: Location, - pub fields: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum InitializerField { - Field { - name: (FieldName, Location), - /// Non-null operator used for destructuring. - non_null: bool, - value: Option>, - }, - Rest((Rc, Location)), -} - -impl InitializerField { - pub fn location(&self) -> Location { - match self { - Self::Field { ref name, ref value, .. } => { - value.clone().map_or(name.1.clone(), |v| name.1.combine_with(v.location())) - }, - Self::Rest((_, ref l)) => l.clone(), - } - } - - pub fn shorthand(&self) -> Option<&QualifiedIdentifier> { - if let Self::Field { name, .. } = self { - if let FieldName::Identifier(qid) = &name.0 { - Some(qid) - } else { - None - } - } else { - None - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FieldName { - Identifier(QualifiedIdentifier), - Brackets(Rc), - StringLiteral(Rc), - NumericLiteral(Rc), -} - -impl FieldName { - pub(crate) fn id(&self) -> Option<&QualifiedIdentifier> { - let Self::Identifier(id) = &self else { - return None; - }; - Some(id) - } - - pub fn id_equals(&self, name: &str) -> bool { - self.id().map(|name1| name == name1.to_identifier_name_or_asterisk().map(|id| id.0.clone()).unwrap_or("".into())).unwrap_or(false) - } -} \ No newline at end of file diff --git a/crates/parser/tree/optional_chaining_expression.rs b/crates/parser/tree/optional_chaining_expression.rs deleted file mode 100644 index b78c630..0000000 --- a/crates/parser/tree/optional_chaining_expression.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// An expression followed by optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingExpression { - pub location: Location, - pub base: Rc, - /// Optional chaining operations. - /// - /// An `OptionalChainingPlaceholder` node is is the topmost expression - /// in the `expression` field. - pub expression: Rc, -} - -/// Internal expression used as the topmost expression -/// of a sequence of optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingPlaceholder { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/package_definition.rs b/crates/parser/tree/package_definition.rs deleted file mode 100644 index 8b447ce..0000000 --- a/crates/parser/tree/package_definition.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageDefinition { - pub location: Location, - pub asdoc: Option>, - pub name: Vec<(String, Location)>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/paren_expression.rs b/crates/parser/tree/paren_expression.rs deleted file mode 100644 index ee3a330..0000000 --- a/crates/parser/tree/paren_expression.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ParenExpression { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/program.rs b/crates/parser/tree/program.rs deleted file mode 100644 index 2cabb41..0000000 --- a/crates/parser/tree/program.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Program { - pub location: Location, - pub packages: Vec>, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/qualified_identifier.rs b/crates/parser/tree/qualified_identifier.rs deleted file mode 100644 index 34d2cf2..0000000 --- a/crates/parser/tree/qualified_identifier.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct QualifiedIdentifier { - pub location: Location, - pub attribute: bool, - pub qualifier: Option>, - pub id: QualifiedIdentifierIdentifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum QualifiedIdentifierIdentifier { - Id((String, Location)), - Brackets(Rc), -} - -impl QualifiedIdentifier { - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - Some(id.clone()) - } else { - None - } - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - if id.0 == "*" { None } else { Some(id.clone()) } - } else { - None - } - } - } - - pub fn is_identifier_token(&self) -> bool { - self.qualifier.is_none() && !self.attribute && match &self.id { - QualifiedIdentifierIdentifier::Id((id, _)) => id != "*", - _ => false, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/regexp_literal.rs b/crates/parser/tree/regexp_literal.rs deleted file mode 100644 index 366bf7a..0000000 --- a/crates/parser/tree/regexp_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct RegExpLiteral { - pub location: Location, - pub body: String, - pub flags: String, -} \ No newline at end of file diff --git a/crates/parser/tree/reserved_namespace_expression.rs b/crates/parser/tree/reserved_namespace_expression.rs deleted file mode 100644 index 0e6e509..0000000 --- a/crates/parser/tree/reserved_namespace_expression.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum ReservedNamespaceExpression { - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), -} - -impl ReservedNamespaceExpression { - pub fn location(&self) -> Location { - match self { - Self::Public(l) => l.clone(), - Self::Private(l) => l.clone(), - Self::Protected(l) => l.clone(), - Self::Internal(l) => l.clone(), - } - } - - pub fn to_attribute(&self) -> Attribute { - match self { - Self::Public(l) => Attribute::Public(l.clone()), - Self::Private(l) => Attribute::Private(l.clone()), - Self::Protected(l) => Attribute::Protected(l.clone()), - Self::Internal(l) => Attribute::Internal(l.clone()), - } - } -} - -impl ToString for ReservedNamespaceExpression { - fn to_string(&self) -> String { - match self { - Self::Public(_) => "public".into(), - Self::Private(_) => "private".into(), - Self::Protected(_) => "protected".into(), - Self::Internal(_) => "internal".into(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/return_statement.rs b/crates/parser/tree/return_statement.rs deleted file mode 100644 index d31d41a..0000000 --- a/crates/parser/tree/return_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ReturnStatement { - pub location: Location, - pub expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/sequence_expression.rs b/crates/parser/tree/sequence_expression.rs deleted file mode 100644 index c6b9dfc..0000000 --- a/crates/parser/tree/sequence_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Sequence expression (`x, y`). -#[derive(Clone, Serialize, Deserialize)] -pub struct SequenceExpression { - pub location: Location, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/string_literal.rs b/crates/parser/tree/string_literal.rs deleted file mode 100644 index 2361c16..0000000 --- a/crates/parser/tree/string_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct StringLiteral { - pub location: Location, - pub value: String, -} \ No newline at end of file diff --git a/crates/parser/tree/super_expression.rs b/crates/parser/tree/super_expression.rs deleted file mode 100644 index 8d47cdd..0000000 --- a/crates/parser/tree/super_expression.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Super expression. -/// -/// The super expression must always be followed by a property operator. -/// When the super expression appears in evaluation, the immediately -/// following property operator is limited to access a property from the base class -/// or invoke a method of the base class. -/// -/// ``` -/// super.f() -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperExpression { - pub location: Location, - pub object: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/super_statement.rs b/crates/parser/tree/super_statement.rs deleted file mode 100644 index 22a520a..0000000 --- a/crates/parser/tree/super_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperStatement { - pub location: Location, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/switch_statement.rs b/crates/parser/tree/switch_statement.rs deleted file mode 100644 index 652ec62..0000000 --- a/crates/parser/tree/switch_statement.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Case { - pub location: Location, - pub labels: Vec, - pub directives: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CaseLabel { - Case((Rc, Location)), - Default(Location), -} - -impl CaseLabel { - pub fn location(&self) -> Location { - match self { - Self::Case((_, l)) => l.clone(), - Self::Default(l) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchTypeStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeCase { - pub location: Location, - /// Case parameter. If `None`, designates a `default {}` case. - pub parameter: Option, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/this_literal.rs b/crates/parser/tree/this_literal.rs deleted file mode 100644 index 4d4eeaf..0000000 --- a/crates/parser/tree/this_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThisLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/throw_statement.rs b/crates/parser/tree/throw_statement.rs deleted file mode 100644 index 48b71ff..0000000 --- a/crates/parser/tree/throw_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThrowStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/tree_semantics.rs b/crates/parser/tree/tree_semantics.rs deleted file mode 100644 index 9a04581..0000000 --- a/crates/parser/tree/tree_semantics.rs +++ /dev/null @@ -1,228 +0,0 @@ -use crate::ns::*; -use by_address::ByAddress; - -const LARGE_BYTES: usize = 26_000; - -/// Represents a mapping of nodes to meaning (*symbols*). -/// -/// A limited set of nodes may be mapped to symbols within this -/// structure through using the implemented `TreeSemanticsAccessor` -/// methods, such as `.get()` and `.set()`. -pub struct TreeSemantics { - common: TreeSemantics1, - large_units: RefCell>, TreeSemantics1>>, -} - -impl TreeSemantics { - pub fn new() -> Self { - Self { - common: TreeSemantics1::new(), - large_units: RefCell::new(HashMap::new()), - } - } -} - -/// Defines access methods for the `TreeSemantics` structure, -/// used for attaching semantics to the syntactic tree, -/// where `T` is the node type, and `S` is the symbol type. -pub trait TreeSemanticsAccessor { - fn get(&self, node: &Rc) -> Option; - fn set(&self, node: &Rc, symbol: Option); - fn delete(&self, node: &Rc) -> bool; - fn has(&self, node: &Rc) -> bool; -} - -macro impl_semantics_with_loc_call { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_with_loc_field { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_1 { - (struct $tree_semantics_1_id:ident, fn $new_id:ident, $($nodetype:ident),*$(,)?) => { - #[allow(non_snake_case)] - struct $tree_semantics_1_id { - $($nodetype: RefCell>, Option>>,)* - } - - impl $tree_semantics_1_id { - pub fn $new_id() -> Self { - Self { - $($nodetype: RefCell::new(HashMap::new()),)* - } - } - } - - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_1_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - self.$nodetype.borrow().get(&NodeAsKey(node.clone())).map(|v| v.clone().unwrap()) - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - self.$nodetype.borrow_mut().insert(NodeAsKey(node.clone()), symbol); - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow_mut().remove(&NodeAsKey(node.clone())).is_some() - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow().contains_key(&NodeAsKey(node.clone())) - } - } - )* - }, -} - -impl_semantics_with_loc_call!( - struct TreeSemantics, - Expression, - Directive, - MxmlContent, - CssDirective, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, -); - -impl_semantics_with_loc_field!( - struct TreeSemantics, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - Mxml, - MxmlElement, - MxmlAttribute, - CssProperty, - CssRule, - CssDocument, - QualifiedIdentifier, -); - -impl_semantics_1!( - struct TreeSemantics1, - fn new, - Expression, - Directive, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - QualifiedIdentifier, - Mxml, - MxmlContent, - MxmlElement, - MxmlAttribute, - CssDirective, - CssRule, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, - CssProperty, - CssDocument, -); \ No newline at end of file diff --git a/crates/parser/tree/try_statement.rs b/crates/parser/tree/try_statement.rs deleted file mode 100644 index 31a1922..0000000 --- a/crates/parser/tree/try_statement.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TryStatement { - pub location: Location, - pub block: Rc, - pub catch_clauses: Vec, - pub finally_clause: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CatchClause { - pub location: Location, - pub parameter: TypedDestructuring, - pub block: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FinallyClause { - pub location: Location, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_definition.rs b/crates/parser/tree/type_definition.rs deleted file mode 100644 index 95dce41..0000000 --- a/crates/parser/tree/type_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_expression.rs b/crates/parser/tree/type_expression.rs deleted file mode 100644 index 0b0eec9..0000000 --- a/crates/parser/tree/type_expression.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct NonNullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct AnyTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VoidTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayTypeExpression { - pub location: Location, - pub expression: Rc, -} - -/// A tuple type expression consisting of at least two elements. -#[derive(Clone, Serialize, Deserialize)] -pub struct TupleTypeExpression { - pub location: Location, - pub expressions: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeExpression { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -/// ```plain -/// function(T, T=, ...) -/// function(...[T]) -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeParameter { - pub location: Location, - pub kind: ParameterKind, - /// Possibly `None` for the rest parameter. - pub type_expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/type_parameter.rs b/crates/parser/tree/type_parameter.rs deleted file mode 100644 index adf800c..0000000 --- a/crates/parser/tree/type_parameter.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// A type parameter as in `function f.(): void {}`. -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeParameter { - pub location: Location, - pub name: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/unary_expression.rs b/crates/parser/tree/unary_expression.rs deleted file mode 100644 index 64fbcc3..0000000 --- a/crates/parser/tree/unary_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UnaryExpression { - pub location: Location, - pub operator: Operator, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/use_namespace_directive.rs b/crates/parser/tree/use_namespace_directive.rs deleted file mode 100644 index 7317395..0000000 --- a/crates/parser/tree/use_namespace_directive.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UseNamespaceDirective { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/variable_definition.rs b/crates/parser/tree/variable_definition.rs deleted file mode 100644 index 234492f..0000000 --- a/crates/parser/tree/variable_definition.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub enum VariableDefinitionKind { - Var, - Const, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SimpleVariableDefinition { - pub location: Location, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableBinding { - pub destructuring: TypedDestructuring, - pub initializer: Option>, -} - -impl VariableBinding { - pub fn location(&self) -> Location { - self.initializer.as_ref().map_or(self.destructuring.location.clone(), |init| self.destructuring.location.combine_with(init.location())) - } -} \ No newline at end of file diff --git a/crates/parser/tree/vector_literal.rs b/crates/parser/tree/vector_literal.rs deleted file mode 100644 index e506ed8..0000000 --- a/crates/parser/tree/vector_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VectorLiteral { - pub location: Location, - pub element_type: Rc, - pub elements: Vec, -} \ No newline at end of file diff --git a/crates/parser/tree/while_statement.rs b/crates/parser/tree/while_statement.rs deleted file mode 100644 index 2f20a97..0000000 --- a/crates/parser/tree/while_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WhileStatement { - pub location: Location, - pub test: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/with_statement.rs b/crates/parser/tree/with_statement.rs deleted file mode 100644 index 0f254c3..0000000 --- a/crates/parser/tree/with_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WithStatement { - pub location: Location, - pub object: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/xml_expression.rs b/crates/parser/tree/xml_expression.rs deleted file mode 100644 index 06857a8..0000000 --- a/crates/parser/tree/xml_expression.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlExpression { - pub location: Location, - pub element: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlMarkupExpression { - pub location: Location, - pub markup: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlListExpression { - pub location: Location, - pub content: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlElement { - pub location: Location, - pub name: XmlTagName, - pub attributes: Vec>, - pub attribute_expression: Option>, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlTagName { - Name((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: XmlAttributeValue, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlAttributeValue { - Value((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlContent { - Characters((String, Location)), - Markup((String, Location)), - Element(Rc), - Expression(Rc), -} \ No newline at end of file diff --git a/crates/parser/util.rs b/crates/parser/util.rs deleted file mode 100644 index 256a627..0000000 --- a/crates/parser/util.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Miscellaneous. - -mod arena; -pub use arena::*; - -pub use by_address::ByAddress as NodeAsKey; - -mod character_reader; -pub use character_reader::*; - -mod escaping; -pub use escaping::*; - -mod css; -pub use css::*; - -pub use std::cell::{Cell, RefCell}; -pub use std::collections::{HashMap, HashSet}; -pub use std::rc::{Rc, Weak}; - -pub fn default() -> T { - T::default() -} - -/// Counts the first whitespace characters of a string. -pub fn count_first_whitespace_characters(input: &str) -> usize { - input.chars().count() - input.trim_start().chars().count() -} - -/// Decreases the last offset of a range without ever going behind the first offset. -pub fn decrease_last_offset(first_offset: usize, mut last_offset: usize, count: usize) -> usize { - for _ in 0..count { - last_offset = if first_offset < last_offset { last_offset - 1 } else { last_offset }; - } - last_offset -} \ No newline at end of file diff --git a/crates/parser/util/arena.rs b/crates/parser/util/arena.rs deleted file mode 100644 index e9027f4..0000000 --- a/crates/parser/util/arena.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::{cell::RefCell, rc::{Rc, Weak}}; - -pub struct Arena { - data: RefCell>>, -} - -impl Arena { - pub fn new() -> Self { - Self { - data: RefCell::new(vec![]), - } - } - - pub fn allocate(&self, value: T) -> Weak { - let obj = Rc::new(value); - self.data.borrow_mut().push(obj.clone()); - Rc::downgrade(&obj) - } -} \ No newline at end of file diff --git a/crates/parser/util/character_reader.rs b/crates/parser/util/character_reader.rs deleted file mode 100644 index c6af904..0000000 --- a/crates/parser/util/character_reader.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::str::CharIndices; - -/// `CharacterReader` may be used for iterating characters from left-to-right -/// in a string with miscellaneous operation methods. -#[derive(Clone)] -pub struct CharacterReader<'a> { - length: usize, - start_offset: usize, - char_indices: CharIndices<'a>, -} - -impl<'a> CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string starting at the given offset. - pub fn from_offset(value: &'a str, offset: usize) -> Self { - CharacterReader { length: value.len(), start_offset: offset, char_indices: value[offset..].char_indices() } - } - - /// Indicates if there are remaining code points to read. - pub fn has_remaining(&self) -> bool { - self.clone().char_indices.next().is_some() - } - - /// Indicates if the reader has reached the end of the string. - pub fn reached_end(&self) -> bool { - self.clone().char_indices.next().is_none() - } - - /// Skips a code point in the reader. This is equivalent to - /// calling `next()`. - pub fn skip_in_place(&mut self) { - self.next(); - } - - /// Skips the given number of code points in the reader. - pub fn skip_count_in_place(&mut self, count: usize) { - for _ in 0..count { - if self.next().is_none() { - break; - } - } - } - - /// Returns the current byte offset in the string. - pub fn index(&self) -> usize { - self.clone().char_indices.next().map_or(self.length, |(i, _)| self.start_offset + i) - } - - /// Returns the next code point. If there are no code points - /// available, returns U+00. - pub fn next_or_zero(&mut self) -> char { - self.char_indices.next().map_or('\x00', |(_, cp)| cp) - } - - /// Peeks the next code point. - pub fn peek(&self) -> Option { - self.clone().char_indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point. If there are no code points - /// available, returns U+00. - pub fn peek_or_zero(&self) -> char { - self.clone().next_or_zero() - } - - /// Peeks the next code point at the given zero based code point index. - pub fn peek_at(&self, index: usize) -> Option { - let mut indices = self.clone().char_indices; - for _ in 0..index { - if indices.next().is_none() { - break; - } - } - indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point at the given zero based code point index. - /// If there are no code points available, returns U+00. - pub fn peek_at_or_zero(&self, index: usize) -> char { - self.peek_at(index).unwrap_or('\x00') - } - - /// Peeks a number of code points until the string's end. - pub fn peek_seq(&self, num_code_points: u64) -> String { - let mut r = String::new(); - let mut next_indices = self.char_indices.clone(); - for _ in 0..num_code_points { - match next_indices.next() { - None => { - break; - }, - Some(cp) => { - r.push(cp.1); - } - } - } - r - } -} - -impl<'a> From<&'a str> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a str) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> From<&'a String> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a String) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> Iterator for CharacterReader<'a> { - type Item = char; - - fn next(&mut self) -> Option { - self.char_indices.next().map(|(_, cp)| cp) - } -} - -#[cfg(test)] -mod test { - use super::CharacterReader; - #[test] - fn test() { - let mut reader = CharacterReader::from("foo"); - assert!(reader.has_remaining()); - assert_eq!(reader.peek_seq(5), "foo"); - assert_eq!(reader.peek_seq(1), "f"); - assert_eq!(reader.peek_or_zero(), 'f'); - for _ in 0..3 { - reader.next(); - } - assert_eq!(reader.peek_or_zero(), '\x00'); - assert!(reader.reached_end()); - } -} \ No newline at end of file diff --git a/crates/parser/util/css.rs b/crates/parser/util/css.rs deleted file mode 100644 index fa1fbf8..0000000 --- a/crates/parser/util/css.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::collections::HashMap; -use lazy_static::lazy_static; -use maplit::hashmap; - -/// Converts a CSS [color constant](http://www.w3schools.com/css/css_colorsfull.asp) into an integer. -pub fn css_color_constant_to_int(name: &str) -> Option { - COLOR_MAP.get(&name.to_lowercase()).map(|i| *i) -} - -lazy_static! { - /// Map color constant names to 24-bit RGB integer values. - /// - /// See also: [CSS colors](http://www.w3schools.com/css/css_colorsfull.asp) - static ref COLOR_MAP: HashMap = hashmap! { - "black".into() => 0x000000, - "navy".into() => 0x000080, - "darkblue".into() => 0x00008b, - "mediumblue".into() => 0x0000cd, - "blue".into() => 0x0000ff, - "darkgreen".into() => 0x006400, - "green".into() => 0x008000, - "teal".into() => 0x008080, - "darkcyan".into() => 0x008b8b, - "deepskyblue".into() => 0x00bfff, - "darkturquoise".into() => 0x00ced1, - "mediumspringgreen".into() => 0x00fa9a, - "lime".into() => 0x00ff00, - "springgreen".into() => 0x00ff7f, - "aqua".into() => 0x00ffff, - "cyan".into() => 0x00ffff, - "midnightblue".into() => 0x191970, - "dodgerblue".into() => 0x1e90ff, - "lightseagreen".into() => 0x20b2aa, - "forestgreen".into() => 0x228b22, - "seagreen".into() => 0x2e8b57, - "darkslategray".into() => 0x2f4f4f, - "darkslategrey".into() => 0x2f4f4f, - "limegreen".into() => 0x32cd32, - "mediumseagreen".into() => 0x3cb371, - "turquoise".into() => 0x40e0d0, - "royalblue".into() => 0x4169e1, - "steelblue".into() => 0x4682b4, - "darkslateblue".into() => 0x483d8b, - "mediumturquoise".into() => 0x48d1cc, - "indigo ".into() => 0x4b0082, - "darkolivegreen".into() => 0x556b2f, - "cadetblue".into() => 0x5f9ea0, - "cornflowerblue".into() => 0x6495ed, - "mediumaquamarine".into() => 0x66cdaa, - "dimgray".into() => 0x696969, - "dimgrey".into() => 0x696969, - "slateblue".into() => 0x6a5acd, - "olivedrab".into() => 0x6b8e23, - "slategray".into() => 0x708090, - "slategrey".into() => 0x708090, - "lightslategray".into() => 0x778899, - "lightslategrey".into() => 0x778899, - "mediumslateblue".into() => 0x7b68ee, - "lawngreen".into() => 0x7cfc00, - "chartreuse".into() => 0x7fff00, - "aquamarine".into() => 0x7fffd4, - "maroon".into() => 0x800000, - "purple".into() => 0x800080, - "olive".into() => 0x808000, - "gray".into() => 0x808080, - "grey".into() => 0x808080, - "skyblue".into() => 0x87ceeb, - "lightskyblue".into() => 0x87cefa, - "blueviolet".into() => 0x8a2be2, - "darkred".into() => 0x8b0000, - "darkmagenta".into() => 0x8b008b, - "saddlebrown".into() => 0x8b4513, - "darkseagreen".into() => 0x8fbc8f, - "lightgreen".into() => 0x90ee90, - "mediumpurple".into() => 0x9370d8, - "darkviolet".into() => 0x9400d3, - "palegreen".into() => 0x98fb98, - "darkorchid".into() => 0x9932cc, - "yellowgreen".into() => 0x9acd32, - "sienna".into() => 0xa0522d, - "brown".into() => 0xa52a2a, - "darkgray".into() => 0xa9a9a9, - "darkgrey".into() => 0xa9a9a9, - "lightblue".into() => 0xadd8e6, - "greenyellow".into() => 0xadff2f, - "paleturquoise".into() => 0xafeeee, - "lightsteelblue".into() => 0xb0c4de, - "powderblue".into() => 0xb0e0e6, - "firebrick".into() => 0xb22222, - "darkgoldenrod".into() => 0xb8860b, - "mediumorchid".into() => 0xba55d3, - "rosybrown".into() => 0xbc8f8f, - "darkkhaki".into() => 0xbdb76b, - "silver".into() => 0xc0c0c0, - "mediumvioletred".into() => 0xc71585, - "indianred ".into() => 0xcd5c5c, - "peru".into() => 0xcd853f, - "chocolate".into() => 0xd2691e, - "tan".into() => 0xd2b48c, - "lightgray".into() => 0xd3d3d3, - "lightgrey".into() => 0xd3d3d3, - "palevioletred".into() => 0xd87093, - "thistle".into() => 0xd8bfd8, - "orchid".into() => 0xda70d6, - "goldenrod".into() => 0xdaa520, - "crimson".into() => 0xdc143c, - "gainsboro".into() => 0xdcdcdc, - "plum".into() => 0xdda0dd, - "burlywood".into() => 0xdeb887, - "lightcyan".into() => 0xe0ffff, - "lavender".into() => 0xe6e6fa, - "darksalmon".into() => 0xe9967a, - "violet".into() => 0xee82ee, - "palegoldenrod".into() => 0xeee8aa, - "lightcoral".into() => 0xf08080, - "khaki".into() => 0xf0e68c, - "aliceblue".into() => 0xf0f8ff, - "honeydew".into() => 0xf0fff0, - "azure".into() => 0xf0ffff, - "sandybrown".into() => 0xf4a460, - "wheat".into() => 0xf5deb3, - "beige".into() => 0xf5f5dc, - "whitesmoke".into() => 0xf5f5f5, - "mintcream".into() => 0xf5fffa, - "ghostwhite".into() => 0xf8f8ff, - "salmon".into() => 0xfa8072, - "antiquewhite".into() => 0xfaebd7, - "linen".into() => 0xfaf0e6, - "lightgoldenrodyellow".into() => 0xfafad2, - "oldlace".into() => 0xfdf5e6, - "red".into() => 0xff0000, - "fuchsia".into() => 0xff00ff, - "magenta".into() => 0xff00ff, - "deeppink".into() => 0xff1493, - "orangered".into() => 0xff4500, - "tomato".into() => 0xff6347, - "hotpink".into() => 0xff69b4, - "coral".into() => 0xff7f50, - "darkorange".into() => 0xff8c00, - "lightsalmon".into() => 0xffa07a, - "orange".into() => 0xffa500, - "lightpink".into() => 0xffb6c1, - "pink".into() => 0xffc0cb, - "gold".into() => 0xffd700, - "peachpuff".into() => 0xffdab9, - "navajowhite".into() => 0xffdead, - "moccasin".into() => 0xffe4b5, - "bisque".into() => 0xffe4c4, - "mistyrose".into() => 0xffe4e1, - "blanchedalmond".into() => 0xffebcd, - "papayawhip".into() => 0xffefd5, - "lavenderblush".into() => 0xfff0f5, - "seashell".into() => 0xfff5ee, - "cornsilk".into() => 0xfff8dc, - "lemonchiffon".into() => 0xfffacd, - "floralwhite".into() => 0xfffaf0, - "snow".into() => 0xfffafa, - "yellow".into() => 0xffff00, - "lightyellow".into() => 0xffffe0, - "ivory".into() => 0xfffff0, - "white".into() => 0xffffff, - }; -} \ No newline at end of file diff --git a/crates/parser/util/escaping.rs b/crates/parser/util/escaping.rs deleted file mode 100644 index ffa020f..0000000 --- a/crates/parser/util/escaping.rs +++ /dev/null @@ -1,11 +0,0 @@ -/// Escapes XML special characters. -pub fn escape_xml(characters: &str) -> String { - let escaped = htmlentity::entity::encode(characters.as_ref(), &htmlentity::entity::EncodeType::NamedOrHex, &htmlentity::entity::CharacterSet::SpecialChars); - String::from_utf8_lossy(&escaped.bytes().into_owned()).into_owned() -} - -/// Unescapes XML entities conforming to HTML entities. -pub fn unescape_xml(input: &str) -> String { - let unescaped = htmlentity::entity::decode(input.as_ref()); - String::from_utf8_lossy(&unescaped.bytes().into_owned()).into_owned() -} \ No newline at end of file diff --git a/crates/parser_test/Cargo.toml b/crates/parser_test/Cargo.toml deleted file mode 100644 index fc873d6..0000000 --- a/crates/parser_test/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "as3_parser_test" -version = "0.4.0" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3_parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 Parser Test" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "as3_parser_test" -path = "main.rs" - -[dependencies] -clap = { version = "4.4.8", features = ["derive"] } -file_paths = "1.0.0" -as3_parser = { path = "../parser", version = "1.0" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" diff --git a/crates/parser_test/main.rs b/crates/parser_test/main.rs deleted file mode 100644 index 6abee8f..0000000 --- a/crates/parser_test/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -use clap::Parser; -use file_paths::FlexPath; -use std::{env, fs, io}; -use as3_parser::ns::*; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Arguments { - #[arg(short, long)] - source_path: String, - - #[arg(short, long)] - file_log: bool, - - #[arg(short, long)] - mxml: bool, - - #[arg(short, long)] - css: bool, -} - -fn main() -> io::Result<()> { - let arguments = Arguments::parse(); - let source_path = FlexPath::from_n_native([env::current_dir().unwrap().to_string_lossy().into_owned().as_ref(), arguments.source_path.as_ref()]).to_string_with_flex_separator(); - - // Canonicalize path - // let source_path = std::path::Path::new(&source_path).canonicalize().unwrap().to_string_lossy().into_owned(); - - let source_path_ast_json = FlexPath::new_native(&source_path).change_extension(".tree").to_string_with_flex_separator(); - let source_path_diagnostics = FlexPath::new_native(&source_path).change_extension(".diag").to_string_with_flex_separator(); - let source_content = fs::read_to_string(&source_path)?; - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - if arguments.mxml { - let document = ParserFacade(&compilation_unit, default()).parse_mxml(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else if arguments.css { - let document = CssParserFacade(&compilation_unit, default()).parse_document(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else { - let program = ParserFacade(&compilation_unit, default()).parse_program(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&program).unwrap())?; - } - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(diagnostic.format_english()); - } - if arguments.file_log { - fs::write(&source_path_diagnostics, diagnostics.join("\n"))?; - } else { - for diagnostic in diagnostics { - println!("{diagnostic}"); - } - } - Ok(()) -} \ No newline at end of file diff --git a/demo/Cargo.toml b/demo/Cargo.toml deleted file mode 100644 index 4c5f005..0000000 --- a/demo/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "as3_parser_demo" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -as3_parser = { path = "../crates/parser", version = "1.0" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -wasm-bindgen = "0.2.92" - -[dependencies.web-sys] -version = "0.3.4" -features = ["Document", "Window"] \ No newline at end of file diff --git a/demo/dist/as3_parser_demo.d.ts b/demo/dist/as3_parser_demo.d.ts new file mode 100644 index 0000000..68bc12b --- /dev/null +++ b/demo/dist/as3_parser_demo.d.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input: string, source_type: string): string; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly parse: (a: number, b: number, c: number, d: number, e: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/demo/dist/as3_parser_demo.js b/demo/dist/as3_parser_demo.js new file mode 100644 index 0000000..0e1f671 --- /dev/null +++ b/demo/dist/as3_parser_demo.js @@ -0,0 +1,199 @@ +let wasm; + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input, source_type) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(input, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(source_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.parse(retptr, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred3_0 = r0; + deferred3_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('as3_parser_demo_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/demo/dist/as3_parser_demo_bg.wasm b/demo/dist/as3_parser_demo_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f81e362c08d15c44bc21907c6465dd4a0ba28aaf GIT binary patch literal 2496903 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�OygK?^Y| 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

$|#1J4#N5uO(b;t&uh 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 z z)T0<$U(JtZz;vd9ByZ3qD z=ZEivnJH2Eb>A1osir(iGgMpMcR>P(@c%|9mZG%G{I7x&sEBfn;u#%J>%)?iHoR*Y z)*!5A9W<-0`2yNdOf z1fTS%n>l}5I(NvUug^=b2)ATQW?>5?vv8P!n*w}HhGaFb$;(FvYSdAhlSgjxZY;v; zQ}g|J4TeovumnLhbOHwFiK?`2m9sqhUsQ~jONy?dnh(4-h6dh}o-{?(_@-7Fj=m9S zWzo?$Ib^gBPD!4a++d{)I}9qyn9hX2nL}|L^B3i=lW+{LB6O0T{lMB0|8X3qiE+(6)Al=oCE+6|6&;wt1JXl=-7Oi{hjn1&Z%;mj}!U&d!>>2Cr} z5n{!hM3H(1KdMwgW}4A4<@*HLp#QkK=}}@0X(4))5v0uWqdJ!#%CcU~iSG(iH_DJe zq>fnw))zJLS~Md#E$B`Ezqs6thmJ0ua?bu6Z>$kKw2pCaAJyF4kp;JxT z*)b1s6#D7xOg|i>tPdae76SW4`VM|L*!LoSm?JNw_Uf$S`Mg0Ro|%5m6Bls^lbBCD z?EJ;=`3IdBRh~`dJ56g2l(DFgXW;=JU zn1($ax448prbvAkpx0+n2bUq#S1%mR>g)NFu8rq7fnT?PK)t=B9s(4o-70>!^CcRo zk9zREDra7iMke%@Xp{&o*Lpfk>aHL%7yqMWdoamC(8(;1bD$HD<~Wbhn`QXJ;h~q# zfwD{B#}b}cdQa;goin{6Qe0a^T|RS3(^&F(F&2$c#SMlB`43BjMqk!~Q=HYts3Suy z{kIxqMF&|ige<~01>i*oS-N1vl^e#74l=!xfmlZt#)xGRkg-xmBi#s@W&@OZ02`K- z{t>n&-i+;YXLbP#h@S{@1ooj5OzxTQYprpxVielJr=DnC?P6?@s=KM_#e-6B=&T-y z4YZN0U2GP7OiEH7I+Gekx}~;4lVVF?ZUxE0Y@@AEN)d}8w#X{IVFcXs-`G4~nqrED zEiuKOaUk3XnF)&m`@ka1k3d5w53~`XVX+-X~rHq^uGf9W}iK_%0A02R5Bim9Iwg~9j~C@ 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%0D=1qP&4f*0}R|u^wdukuLd1Kq0k($j1zk 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

*91mvz2E>K^uOa5Hux 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⩔bLMNzhi|QB5!92`|Y8goWdLFZ= z=dmi(^`HhtBP5w>-H49EzJ_U*zy5nQ>b@r-ul_qV3hF?03)Vt43;t+5&<50}X^f`W z+xUgG{QWcgf>b>l)jOz(GtmgD1M(=IG}YHu9hJS+`EEqrp(MM3{CDdTHDRpD+18v? zouYji5BmtWQ;kDW{iUC=w|ZnrjFAp?oFWPTTt_yoQnY@o#@}y(>Z8`E#WI5C__aQN zcRr^cyl$u-Q7TmDBh+PAothd*!r8bIx8N>}fa)#vLqTBtBx%e2Xq4_^{p$zqz zkAmg_sg1TshUNoF#SjdI<^>s#xtIslcm9|9WI22<@w;_exy?V-1O6;p=jkj`b)Hn; zNmLi*6{vp6w^045Z}EF|XhU5too9MBTA1dXkOT8DP#fk4elLHdo)(gE4N`G0{@wA~ z8WSWX6Bzf4YN(EGxCT`td8O&uu48`$jqFlVF1I^Kxy!WaD{opo`biq%3Hl0D2dr)a z=OW`AG{;@&i~BJgNfn|BRpeMQis5h^Ve#ZqI2I?MJSw7+RVL*WoPoMlpKOf_a4|X| z1zoHwc`dHTFpR)RJZ8_5&tVLvVHRd%F_t15?_wps$0p>W*okafApsR|GOD3_75ZV3 zWp9xSun3Fs4whmCR$?{Q;B#!mz>|4ycmf%C7O!HOWs&o-*p`v+;eC97RalMB>Kb{vEz<9 z?4iF1U2zqPvA=XEj<<58X#N6eXqS?5xpg9SK4=$QiBDL+OFZjpIp6LjdxvX=W*FwjWHbBReRKHD*utZYz+{Pdi z-y;8UB-JgHql!iA-gO{VpK^$$lVM(=r@5?SNQDpOy|o6UG(k(WF^z+}1YMxI_&Sax z{cQ#*bD-lyOYL*=3ux{c(eaX=IxsNSKDuSk}urkvy*%r3z?+f?sO8X*Y< z)qU&2b*l5$-&8kPX4?W%bPPlFgFlDr1?zZ4A=F0$G=Yv&w6QLvjz{#jP;c-(+WG4Z zo?en;rKknflhd(R5U68${vgz{+GIU6u%@J3iyNW-{Qh_rFJK(h zzyA_m!8%({euM9ABdPxWQ|YHa1M2fv{oh-m{(hZT^d8=a#*P18y>Qh_*1Q3lt3#fE z&exh*K58~O2TQRWs`tMZ-$Ql(cSH654@-z{*OeuYK_#m~N;OnR3c8{jdZD-VBPE*rQqcc{}5`nl`#H_>@fPeJ|Kdk~)ywe5Lc3)ELF zIv4r|sDJt{sDD~U<7sTdj|lS>rHOOD9Hf%@XaZ!hma+sY&R>r9|k5r#^ z4pfswebiF!N zq-5G8atdC@G^lTTHs+Z6wB;ugM z*B_HH71QwsW?JaS4E6NYk69R1a0*U?=6k!*)Q{O8Q!xvRu>|VNlp6Foo(}b0N^PhQ zQ~j5r4^#b^YwZhC_2bn~sq+=Wc?wBfme~1H>d$=(K=V=7px^N< z)I~jLo+0%sHnOuxc^{!J_9tAxa4Cl35j=)bNTeSz z%p=&4%Z)A6J0DLw6O%9*uR-~+d`k=R`(kgqMxuf zG>?J$45g_h)}oCT(ELf7hjA+s>D#NV{ynJQPxa3w)IZPPuc!G73hK9eaz?bDEzGZ0 z(D}nRzPtDNDw@8>a)!vqJRj6YPuyg8lM-8hdSB~g#LjaS>XxgvuY8A%P#@MtWUr6b zjc?|DshwNs+eYksUy(x5c{ZA`itLEaxE-u&^X$vG!8dr>ynT_`m

^`!IAqZ5HMr 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%0Ds>;62K1Cw75-?FXe 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 UCnv4_FWMNVE&u=k literal 0 HcmV?d00001 diff --git a/demo/dist/as3_parser_demo_bg.wasm.d.ts b/demo/dist/as3_parser_demo_bg.wasm.d.ts new file mode 100644 index 0000000..e814710 --- /dev/null +++ b/demo/dist/as3_parser_demo_bg.wasm.d.ts @@ -0,0 +1,8 @@ +/* tslint:disable */ +/* eslint-disable */ +export const memory: WebAssembly.Memory; +export function parse(a: number, b: number, c: number, d: number, e: number): void; +export function __wbindgen_add_to_stack_pointer(a: number): number; +export function __wbindgen_malloc(a: number, b: number): number; +export function __wbindgen_realloc(a: number, b: number, c: number, d: number): number; +export function __wbindgen_free(a: number, b: number, c: number): void; diff --git a/demo/src/lib.rs b/demo/src/lib.rs deleted file mode 100644 index 80e49c8..0000000 --- a/demo/src/lib.rs +++ /dev/null @@ -1,58 +0,0 @@ -use serde::{Deserialize, Serialize}; -use wasm_bindgen::prelude::*; -use as3_parser::ns::*; - -#[derive(Serialize, Deserialize)] -struct ParserResult { - program: Option>, - mxml: Option>, - css: Option>, - diagnostics: Vec, -} - -#[derive(Serialize, Deserialize)] -struct ParserDiagnosticResult { - warning: bool, - column1: usize, - column2: usize, - line1: usize, - line2: usize, - message: String, -} - -#[wasm_bindgen] -pub fn parse(input: &str, source_type: &str) -> String { - let compilation_unit = CompilationUnit::new(None, input.to_owned()); - - let mut program: Option> = None; - let mut mxml: Option> = None; - let mut css: Option> = None; - - let source_type = source_type.to_lowercase(); - - if source_type == "mxml" { - mxml = Some(ParserFacade(&compilation_unit, default()).parse_mxml()); - } else if source_type == "css" { - css = Some(CssParserFacade(&compilation_unit, default()).parse_document()); - } else { - program = Some(ParserFacade(&compilation_unit, default()).parse_program()); - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(ParserDiagnosticResult { - warning: diagnostic.is_warning(), - column1: diagnostic.location().first_column() + 1, - column2: diagnostic.location().last_column() + 1, - line1: diagnostic.location().first_line_number(), - line2: diagnostic.location().last_line_number(), - message: diagnostic.format_message_english(), - }); - } - serde_json::to_string_pretty(&ParserResult { - program, - mxml, - css, - diagnostics, - }).unwrap() -} \ No newline at end of file diff --git a/docs/attaching-meaning.md b/docs/attaching-meaning.md deleted file mode 100644 index c5635bf..0000000 --- a/docs/attaching-meaning.md +++ /dev/null @@ -1,25 +0,0 @@ -# Attaching Meaning - -ActionScript 3 compilers may need to attach meaning to nodes. They can do so by using the `TreeSemantics` mapping, which works just as a hash map, but using an efficient implementation for the different node types and splitting of dictionaries for large compilation units. - -```rust -use as3_parser::ns::*; - -// Construct a TreeSemantics structure, where ExampleMeaning -// is any type that implements Clone. -let semantics = TreeSemantics::::new(); - -// Retrieve the meaning of a node. -let meaning = semantics.get(&node); - -// Assign meaning to a node. -semantics.set(&node, meaning); - -// Delete the meaning of a node. -semantics.delete(&node); - -// Check whether a node has a meaning. -let has_meaning = semantics.has(&node); -``` - -Almost every node type that is used behind a `Rc` container may be used as a node type in `TreeSemantics`, such as `Rc`, `Rc`, and `Rc`. \ No newline at end of file diff --git a/docs/building-a-compiler.md b/docs/building-a-compiler.md deleted file mode 100644 index df6c3a2..0000000 --- a/docs/building-a-compiler.md +++ /dev/null @@ -1,33 +0,0 @@ -# Building a Compiler - -An ActionScript compiler does more than just parsing, including verification, and SWF and SWC processing. - -An ActionScript compiler handles three source file formats: ActionScript 3, MXML, and CSS. - -An ActionScript compiler outputs several problems, constructs a flow graph for every activation, and attaches meaning to tree nodes. - -This project itself is not a compiler, but it's designated to facilitate writing one, parsing the three file formats mentioned. - -## Compiler options - -Attach compiler options to a compilation unit by defining your own options data type and storing a reference of it by calling `compilation_unit.set_compiler_options(Some(options))` where `options: Rc`. - -The parser project leaves the compiler options to be defined as part of the compiler. - -## SWF - -The Ruffle player contains a [`swf` package](https://github.com/ruffle-rs/ruffle/tree/master/swf) that reads and writes SWF from or into structures. - -## Domain Memory Operations - -Detect [domain memory operations](https://obtw.wordpress.com/2013/04/03/making-bytearray-faster) to generate optimized AVM2 instructions. - -## Project Configuration - -It is interesting to consider allowing project configurations in a dependency managed manner. Something similiar to `asconfig.json` from the Visual Studio AS&MXML extension, but in a different way to allow dependencies that include their own ActionScript 3 configuration (including options such as `strict`, and `inferTypes`). - -## Special Cases - -Here is the [Special Cases](compilers/special-cases.md) document. - -Here is the [IDE](compilers/ide.md) document. \ No newline at end of file diff --git a/docs/compilers/ide.md b/docs/compilers/ide.md deleted file mode 100644 index 1476e55..0000000 --- a/docs/compilers/ide.md +++ /dev/null @@ -1,5 +0,0 @@ -# IDE - -## Verification - -If the last verification fails due to any syntax errors, keep the semantic database and node tree from the last verification. \ No newline at end of file diff --git a/docs/compilers/special-cases.md b/docs/compilers/special-cases.md deleted file mode 100644 index 91b6d0b..0000000 --- a/docs/compilers/special-cases.md +++ /dev/null @@ -1,116 +0,0 @@ -# Special cases - -## Strict - -Strict mode (default) or ECMAScript mode. - -## Infer types - -Optional infer types option introduced by Apache Royale. - -Infers for initializers and method result types. - -## Reference lookups in source path list - -Similiar to `--source-path` in the MXML compiler, and optional main class file. - -This form of reference lookup does not allow zero or more than one package definition in a file, and the definition at the package must match exactly the source path in the source tree. - -## Reference lookups in included sources list - -Similiar to `--include-sources` (recursive directory or specific file) and `--doc-sources` in the MXML compiler. - -This form of reference lookup allows multiple package definitions within a file. - -## Embed meta-data - -HARMAN introduced additional forms of embedding data with encryption. - -## Vector Data Type - -[Information](https://github.com/hydroper/as3parser/blob/0.3/docs/verifier/vector.md) - -## Namespaces - -[Information](https://github.com/hydroper/as3parser/blob/0.3/docs/verifier/Type/kinds/namespace.md) - -Remember of `static protected`. - -## Event meta-data - -Used by MXML components for event handling. For example, consider the `creationComplete="someCall()"` attribute in a XML file, containing zero or more directives. - -## Data binding - -Certain property attributes in MXML components may have values containing at most one braces group, containing a single expression that locates a bindable property. - -Example from Apache Royale: - -```xml - - - - - - - -``` - -What about string literals, in case you want to escape the braces? Supporting them might not be an issue. - -## Royale meta-data - -[See all Royale meta-data here](https://apache.github.io/royale-docs/features/as3/metadata) - -## Inline constants - -Inline constants are replaced by their compile-time constant value. - -``` -CONFIG::DEBUG -``` - -## Scope - -```as3 -package { - import flash.display.Sprite; - // Definitions may be nested in blocks. - { - public class Main extends Sprite { - { - protected var xy: * - } - } - } -} -var x: Number -{ - class Example { - function f(): void { - // "x" is visible at this scope. - x - } - } -} -// "Example" is visible at this scope. -Example -``` - -## Float class - -[Information](https://github.com/airsdk/Adobe-Runtime-Support/discussions/3081#discussioncomment-9091556) - -## Package Shadowing - -Properties from imported packages, when fully qualified, shadow variable names in scope. - -## Importing ActionScript 3 components in MXML - -* Use a `xmlns` prefix assigned to the full package name with a trailling `.*` sequence, as in `xmlns:fb="foo.bar.*"`. -* Use the `import` directive in a `fx:Script` tag and refer lexically to a component in the MXML. - -## Dynamic - -* The `Object` and `*` data types are fully dynamic, thus they may be mixed freely in operations, such as addition, property and query operators and iteration. -* There are `dynamic` classes, which allow for dynamic property operations and iteration. diff --git a/docs/diagnostics.md b/docs/diagnostics.md deleted file mode 100644 index 61531cb..0000000 --- a/docs/diagnostics.md +++ /dev/null @@ -1,81 +0,0 @@ -# Working with diagnostics - -The parser typically takes a `CompilationUnit` and produces a program structure. Diagnostics are emitted to that `CompilationUnit` rather than being returned by the parser. You can obtain them as follows: - -```rust -// Sorts the diagnostics, including these from files resolved from -// `IncludeDirective`. -compilation_unit.sort_diagnostics(); - -// diagnostics: Vec -// This includes diagnostics from files resolved from -// `IncludeDirective`. -let diagnostics = compilation_unit.nested_diagnostics(); - -// Formats the diagnostic with default English -for diagnostic in diagnostics { - println!("{}", diagnostic.format_english()); -} -``` - -## Invalidation - -A compilation unit is invalidated when it or any of its `IncludeDirective` files contain any errors: - -```rust -// invalidated: bool -let invalidated = compilation_unit.invalidated(); -``` - -## Adding diagnostics - -Adding a diagnostic to a `CompilationUnit` is a simple call, where `K` is the diagnostic kind: - -```rust -// Syntax error -compilation_unit.add_diagnostic(Diagnostic::new_syntax_error(&location, DiagnosticKind::K, diagarg![])); - -// Verify error -compilation_unit.add_diagnostic(Diagnostic::new_verify_error(&location, DiagnosticKind::K, diagarg![])); - -// Warning -compilation_unit.add_diagnostic(Diagnostic::new_warning(&location, DiagnosticKind::K, diagarg![])); -``` - -The `diagarg![]` literal takes elements that implement the `DiagnosticArgument` trait. - -## Custom kinds - -If you need to support your own messages, set the `custom_kind` field: - -```rust -diagnostic.set_custom_kind(Some(Rc::new(kind))); -``` - -Where `kind` is an enumeration's variant. You may then later cast the custom kind from `Rc` to your enumeration through `.downcast::()`. - -If you want, for simple debugging purposes, you may finish formatting your own message with location information by using: - -```rust -diagnostic.format_with_message("My message", Some(custom_id_number)) -``` - -For real use cases, calling `.format_with_message()` is not preferred if your application is not solely in English, since it will add categories such as `Warning`. - -## Arguments - -Diagnostics allow arbitrary argument data as long as it implements the `DiagnosticArgument` trait. The `diagarg!` literal autoboxes arguments in `Rc::new(...)`. - -To downcast to your data type, first make sure to have this attribute at the top of your crate: - -```rust -#![feature(trait_upcasting)] -``` - -Then, use the following code snippet: - -```rust -if let Ok(value) = Rc::downcast::(arg.clone()) { - // value: Rc -} -``` \ No newline at end of file diff --git a/docs/getting-started.md b/docs/getting-started.md deleted file mode 100644 index cf60b8a..0000000 --- a/docs/getting-started.md +++ /dev/null @@ -1,55 +0,0 @@ -# Getting started - -Switch to nightly Rust: - -```sh -rustup default nightly -``` - -Install `as3_parser` in your Cargo project with `cargo add as3_parser`, or add this to your `Cargo.toml` file: - -```toml -[dependencies] -as3_parser = "1.0" -``` - -Parse programs or expressions through the `ParserFacade` structure of the `as3_parser` crate: - -```rust -use as3_parser::ns::*; - -// Create compilation unit -let compilation_unit = CompilationUnit::new(None, "x ** y".into()); - -// Parser options -let parser_options = ParserOptions::default(); - -// Parse through ParserFacade -let program = ParserFacade(&compilation_unit, parser_options).parse_program(); -``` - -## Serializing nodes - -In Rust, to serialize data you generally use the `serde` package. Add it to your project's `Cargo.toml` manifest with: - -```toml -[dependencies] -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -``` - -With this, you can serialize a node to a JSON with: - -```rust -let json = serde_json::to_string_pretty(&node).unwrap(); -``` - -## ASDoc - -The parser attaches ASDoc comments to supported elements and recognizes tags beforehand, maintaining indentation of code blocks. - -* Meta data can contain an ASDoc comment -* Annotatable directives can contain an ASDoc comment -* Package definitions can contain an ASDoc comment - -Source location is fully available within ASDoc comments. For display texts, the location always ranges from the tag at-character to the last non whitespace character. \ No newline at end of file diff --git a/docs/locations.md b/docs/locations.md deleted file mode 100644 index 297ee1f..0000000 --- a/docs/locations.md +++ /dev/null @@ -1,38 +0,0 @@ -# Working with locations - -The `Location` structure includes full first-last locations: - -* The compilation unit -* The first and last lines -* The first and last columns -* The first and last offsets - -Logically, the `Location` structure stores solely the compilation unit reference and the first and last offsets. Then, it computes lines and columns through that compilation unit and these two offsets. - -## Offset - -An offset is a zero-based UTF-8 byte position in a source text, as the `str` type in the Rust langauge is UTF-8 encoded. - -## Byte ranges - -If a source text is situated in a place such as inside a MXML file, you may want to avoid creating a new compilation unit to parse that source text while maintaining line numbers and columns. - -It is simple to do that: just specify the `byte_range` option, passing the first and last byte offsets of an existing compilation unit: - -```rust -ParserFacade(ParserOptions { - byte_range: Some((first_offset, last_offset)), - ..default() -}) -``` - -You may then invoke parser methods within that `ParserFacade` object. - -### Determining offsets - -The parser attaches full source location information, including within MXML nodes, crucial for the `byte_range` option. - -For example: - -* MXML attribute values contain `Location` data (`attribute.value.1`) including the quotes. -* MXML CDATA contain `Location` data (`MxmlContent::CData((_, location))`) including the `` delimiters. \ No newline at end of file diff --git a/docs/new-syntax.md b/docs/new-syntax.md deleted file mode 100644 index 31d8ec9..0000000 --- a/docs/new-syntax.md +++ /dev/null @@ -1,292 +0,0 @@ -# New Syntax - -This parser adds certain new syntax to the language. Some come from Apache Royale, some from Samsung HARMAN, and some from other ECMAScript variants. - -## Destructuring - -``` -const { x } = o; -[y] = o1; -``` - -**Non-null**: non-null operator is supported within destructuring patterns. - -## Optional Chaining - -``` -o?.x -o?.[k] -o?.() -``` - -## Raw String Literal - -Samsung HARMAN added a `@` prefix to string literals, designing them such that escape sequences are uninterpreted. - -``` -@"" -``` - -## Triple String Literal - -ECMAScript 4 introduced a triple string literal that spans multiple lines and ignores indentation. - -``` -const s = """ - Text. - """ -s == "Text." -``` - -## Nullish Coalescing - -``` -x ?? y -x ??= y -``` - -## Non-null Operator - -``` -o! -``` - -## Keywords as Identifiers - -Certain contexts allow for using any reserved word as an identifier, such as function names and variable names. - -``` -function default(): void {} -``` - -## Abstract attribute - -The `abstract` attribute is valid at classes and methods. - -## Static attribute - -The `static` attribute is valid at classes. - -## Type definition - -``` -type T1 = T2 -``` - -## Enumeration definition - -``` -enum E1 { - const M1 - const M2 = "m2" - const M3 = ["m3", 10] - - function f1(): void {} -} -``` - -## Array Initializer - -``` -// Rest operator -[...o] -``` - -## Object initializer - -``` -// Rest operator -( { ...o } ); - -// Trailing comma -( { x: 10, } ); - -// Shorthand field -( { x } ); -``` - -## Generators - -``` -function f() { - // Yield operator - yield 10 -} -``` - -## Asynchronous methods - -``` -function f() { - // Await operator - await f1() -} -``` - -## Switch Type Statement - -ECMAScript 4 introduced a `switch type` statement. - -``` -switch type (o) { - case (d: Date) { - trace(d.valueOf()) - } - default { - trace("Not a Date") - } -} -``` - -## Configuration Directive - -`configuration { ... }` means conditional compilation with `if`, `else if` and `else` branches. A limited set of conditional expressions are valid and translate to a different syntactic construct: - -``` -configuration { - if (k=3) { - trace("k=3") - } else { - trace("k!=3") - } -} -``` - -Conditional expressions: - -```actionscript3 -// Check whether constant is "true" -q::x -x -// Check whether constant is "v" -k="v" -k=v // QualifiedIdentifier == StringLiteral -// Check whether constant is not "v" -k!="v" -k!=v // QualifiedIdentifier != StringLiteral - -x && y -x || y - -(x) -!x -``` - -## Parameterized Types - -``` -class C1. {} -``` - -## Function Type Expression - -The function type expression is as is in ECMAScript fourth edition, but not including the `this` parameter. - -A suffix `=` indicates an optional parameter. - -``` -type F = function(T, Number=, ...): T -type F = function(T, Number=, ...[T]): T -``` - -## Meta Properties - -``` -import.meta -``` - -## Non-Nullable Type Expression - -``` -type T1 = T! -``` - -## Nullable Type Expression - -``` -type T1 = T? -type T2 = ?T -``` - -## Void Type Expression - -`void` is allowed as a type expression everywhere. - -## Array Type Expression - -``` -type A1 = [T] -``` - -## Tuple Type Expression - -``` -type T1 = [E1, E2] -``` - -## Aliasing Imports - -``` -import x = ns.y; - -// Open ns.* and set "ns1" to ns.*'s public namespace or -// NamespaceSet(public, internal) -// if enclosing package is equal -// ti the aliased package -import ns1 = ns.*; -ns1::y -``` - -## Negated In/Is - -``` -k not in o -v is not T -``` - -## Exponentiation - -``` -n ** p -``` - -## Function Body - -Function bodies may consist of an expression, in which case, either: - -* The offending token of the expression is inline. -* The offending token of the expression is in a line whose indentation is higher than that of the previous token. -* The offending token of the expression is `(`. - -``` -const f = function(): Number (10) -``` - -Recommendation: for function definitions consisting of an expression body, it is recommended to use a semicolon to prevent ambiguity with meta-data treated as brackets operators. - -## Numeric Literal - -* Binary literal -* Underscore separators - -``` -0b1011 -10_000 -``` - -## Regular Expression - -* Line terminators allowed within a regular expression literal. - -``` -/(?:) -./m -``` - -## Float Suffix - -Samsung HARMAN introduced a `f` suffix to the *NumericLiteral* productions. - -``` -0f -``` diff --git a/docs/processing-deviations.md b/docs/processing-deviations.md deleted file mode 100644 index 84239ce..0000000 --- a/docs/processing-deviations.md +++ /dev/null @@ -1,7 +0,0 @@ -# Processing Deviations - -## Include Directive - -In the original ActionScript 3, the `include` directive concatenates source text from another ActionScript file, which affects line and column information; in other words, it is not a reliable feature. - -In this parser, the `include` directive contributes the syntactic structures from another ActionScript file, including package definitions and directives. \ No newline at end of file diff --git a/docs/references.md b/docs/references.md deleted file mode 100644 index 5289422..0000000 --- a/docs/references.md +++ /dev/null @@ -1,15 +0,0 @@ -# Reference Documents - -[ActionScript 3 Language Specification](https://web.archive.org/web/20240424210812/https://static.bloople.net/ActionScript%203%20Language%20Specification.pdf) - -[AVM2 Overview](https://web.archive.org/web/20240424211112/https://svn.science.uu.nl/repos/project.STEC.fittest-uu/docs/ActionScript/avm2overview.pdf) - -[ECMA-262 Third Edition](https://ecma-international.org/wp-content/uploads/ECMA-262_3rd_edition_december_1999.pdf) - -[ECMA-357 Second Edition](https://www.ecma-international.org/wp-content/uploads/ECMA-357_2nd_edition_december_2005.pdf) - -[ECMAScript 4 Overview Paper](https://archives.ecma-international.org/2007/misc/overview.pdf) - -[Flex](https://web.archive.org/web/20160322180947/http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf62883-7ff2.html) - -[SWF Specification 19](https://open-flash.github.io/mirrors/swf-spec-19.pdf) diff --git a/docs/verifier/Type.md b/docs/verifier/Type.md deleted file mode 100644 index b021cae..0000000 --- a/docs/verifier/Type.md +++ /dev/null @@ -1,28 +0,0 @@ -# Type - -The `Type` object represents a type or one of several traits. Unsupported operations on `Type` either return a placeholder value or panic. - -## Memory management - -The `Type` object is reference counted in an arena. `Type` itself is a weak reference; it contains an internal `Weak` inside, and operations over `Type` will upgrade it to a strong reference internally. The `TypeHost` always holds a strong reference to each `TypeKind`. - -## Assertion - -The `Type` object is an unification of various kinds. To make sure it is a certain type when storing it somewhere, use assertion layers such as `ClassType(t)` and `VariableProperty(t)`. - -```rust -use as3_verifier::*; - -struct Foo { - foo_package: Package, -} - -let foo = Foo { foo_package: Package(foo_type) }; - -// Assertion layers implement `Deref` targetting `&Type`. -println!("{:?}", foo.foo_package.parent()); - -// Take `Package` back into `Type` object -// by asserting that the contained `Type` is a package. -let foo_type: Type = *foo.foo_package; -``` \ No newline at end of file diff --git a/docs/verifier/Type/kinds/any-type.md b/docs/verifier/Type/kinds/any-type.md deleted file mode 100644 index bbd7a16..0000000 --- a/docs/verifier/Type/kinds/any-type.md +++ /dev/null @@ -1,19 +0,0 @@ -# Any type - -The `AnyType` type kind represents the wildcard (`*`) type. - -## Implicit conversions - -`*` and any other type implicitly convert to each other. - -## Supported methods - -### `asdoc()` - -Returns `None`. - -## Supported traits - -### `ToString` - -The `to_string()` method returns `"*"`. \ No newline at end of file diff --git a/docs/verifier/Type/kinds/class-type.md b/docs/verifier/Type/kinds/class-type.md deleted file mode 100644 index b711885..0000000 --- a/docs/verifier/Type/kinds/class-type.md +++ /dev/null @@ -1,161 +0,0 @@ -# Class type - -The `ClassType` type kind represents a class. It consists of: - -* A `Name` -* An optional parent `Type` - * It may be a `Package` type -* A sequence of type parameters -* Static properties `Names` object - * ECMA-262 `prototype` is a static read-only `prototype: *` property -* Prototype `Names` delegate -* Optional super class `Type` - * The only class with no super class is `Object` -* A set of implemented interfaces -* A set of known subclasses - * Used by the ASDoc tool -* Constructor function property -* Modifiers such as `final` and `static` -* Reserved namespaces (`private`, `protected`, `static protected`) -* An external toggle -* Meta data - -## Implicit conversions - -* `Object` and any other type implicitly convert to each other. -* Subclass implicitly converts to super class -* Implementor implicitly converts to implementing interface -* `C.` implicitly converts to `C.<*>` - -## Generics - -* Referring to `C` is equivalent to `C.<*>`. -* `C.` is equivalent to `C`. - -## Supported methods - -### `is_class_type()` - -Returns true. - -### `name()` - -The qualified name of this class. - -### `parent()` - -The parent of the class, or `None`. If any, it is a `Package` type. - -### `set_parent()` - -A setter for the `parent()` property. - -### `type_params()` - -An optional sequence of type parameters. - -### `set_type_params()` - -A setter for the `type_params()` property. - -### `static_properties()` - -Static properties of the class, as a `Names` object. It always defines: - -```as3 -public static const prototype: * = omittedInitializer; -``` - -### `prototype()` - -A class instance delegate, also known as the class prototype object. This is not equivalent to the static `prototype` property, but rather the compile-time delegate of the class. - -This returns a `Names` object. - -### `super_class()` - -The super class or `None`. The only class with no super class is `Object`. - -The super class may be an `Unresolved` type. - -### `set_super_class()` - -A setter for the `super_class()` property. - -### `implemented_interfaces()` - -Set of implemented interfaces, possibly containing `Unresolved` types. - -### `add_implemented_interface()` - -Adds an implemented interface to the end of the `implemented_interfaces()` collection. - -### `replace_implemented_interface()` - -Replaces an implemented interface. This is used for replacing `Unresolved` by another type. - -### `known_subclasses()` - -Set of known subclasses. This set is used by the ASDoc tool. - -### `add_known_subclass()` - -Adds a known subclass. - -### `constructor_function()` - -An optional constructor function. - -### `set_constructor_definition()` - -Setter for the `constructor_function()` property. - -### `is_static()` - -Whether the class is static. - -### `set_is_static()` - -Setter for the `is_static()` property. - -### `is_final()` - -Whether the class is final. - -### `set_is_final()` - -Setter for the `is_final()` property. - -### `private_namespace()` - -The `private` namespace of the class. - -### `protected_namespace()` - -The `protected` namespace of the class. - -### `static_protected_namespace()` - -The `static protected` namespace of the class. - -### `is_external()` - -Whether the class is external. - -### `set_is_external()` - -Setter for the `is_external()` property. - -### `metadata()` - -Collection of meta data. - -### `add_metadata()` - -Adds meta data. - -## Supported traits - -### `ToString` - -The `to_string()` method returns the fully qualified name of the class (including its qualifier namespace) and any type arguments (`.`). \ No newline at end of file diff --git a/docs/verifier/Type/kinds/enum-type.md b/docs/verifier/Type/kinds/enum-type.md deleted file mode 100644 index e683b3b..0000000 --- a/docs/verifier/Type/kinds/enum-type.md +++ /dev/null @@ -1,86 +0,0 @@ -# Enum type - -The `EnumType` type kind represents an enum. It consists of: - -* A `Name` -* An optional parent `Type` - * It may be a `Package` type -* A `[Set]` modifier -* A number type -* Static properties `Names` object - * ECMA-262 `prototype` is a static read-only `prototype: *` property -* Prototype `Names` delegate -* Mapping from member String to member Number -* Reserved namespaces (`private`) -* An external toggle -* Meta data - -## Supported methods - -### `is_enum_type()` - -Returns true. - -### `name()` - -The qualified name of this enum. - -### `parent()` - -The parent of the enum, or `None`. If any, it is a `Package` type. - -### `set_parent()` - -A setter for the `parent()` property. - -### `is_set()` - -Whether the enum is a set enum. Set enums are indicated by the `[Set]` meta data, representing a combination of members, using bitwise representation. - -### `enum_number_type()` - -The enum's number type. Non set enums use `Number` as the default number type, and set enums use `uint` as the default number type. It can be changed through the `[Number(numberType)]` meta data, where `numberType` is one of the language's supported numeric types. - -### `static_properties()` - -Static properties of the enum, as a `Names` object. It always defines: - -```as3 -public static const prototype: * = omittedInitializer; -``` - -### `prototype()` - -An enum instance delegate, also known as the enum prototype object. This is not equivalent to the static `prototype` property, but rather the compile-time delegate of the enum. - -This returns a `Names` object. - -### `enum_member_string_to_number()` - -A mapping from a member's String to that member's Number. - -### `private_namespace()` - -The `private` namespace of the enum. - -### `is_external()` - -Whether the enum is external. - -### `set_is_external()` - -Setter for the `is_external()` property. - -### `metadata()` - -Collection of meta data. - -### `add_metadata()` - -Adds meta data. - -## Supported traits - -### `ToString` - -The `to_string()` method returns the fully qualified name of the enum (including its qualifier namespace). \ No newline at end of file diff --git a/docs/verifier/Type/kinds/function-type.md b/docs/verifier/Type/kinds/function-type.md deleted file mode 100644 index 61a052c..0000000 --- a/docs/verifier/Type/kinds/function-type.md +++ /dev/null @@ -1,27 +0,0 @@ -# Function type - -The `FunctionType` represents a function type. A function type is equivalent to the `Function` class with additional type checking for its parameters and its return type. - -## Implicit conversions - -The `Function` class and function types implicitly convert to each other. - -## Supported methods - -### `is_function_type()` - -Returns true. - -### `function_params()` - -Parameter sequence containing zero or more required parameters, zero or more optional parameters, and an optional rest parameter. The parameters consist of a simple unqualified name. - -### `function_return()` - -The function's return type. - -## Supported traits - -### `ToString` - -The `to_string()` method returns a string in the form `(...) => T`. \ No newline at end of file diff --git a/docs/verifier/Type/kinds/interface-type.md b/docs/verifier/Type/kinds/interface-type.md deleted file mode 100644 index f9cfe38..0000000 --- a/docs/verifier/Type/kinds/interface-type.md +++ /dev/null @@ -1,104 +0,0 @@ -# Interface type - -The `InterfaceType` type kind represents an `interface` definition. It consists of: - -* A `Name` -* An optional parent `Type` - * It may be a `Package` type -* A sequence of type parameters -* Prototype `Names` delegate -* A set of super interfaces -* A set of known implementors - * Used by the ASDoc tool -* Reserved namespace (`interface_block_namespace`) - * Similiar to `public`, but an user namespace and not a system namespace -* An external toggle -* Meta data - -## Implicit conversions - -* Subinterface implicitly converts to super interface -* `I.` implicitly converts to `I.<*>` - -## Generics - -* Referring to `I` is equivalent to `I.<*>`. -* `I.` is equivalent to `I`. - -## Supported methods - -### `is_interface_type()` - -Returns true. - -### `name()` - -The qualified name of this interface. - -### `parent()` - -The parent of the interface, or `None`. If any, it is a `Package` type. - -### `set_parent()` - -A setter for the `parent()` property. - -### `type_params()` - -An optional sequence of type parameters. - -### `set_type_params()` - -A setter for the `type_params()` property. - -### `prototype()` - -An interface instance delegate, also known as the interface prototype object. - -This returns a `Names` object. - -### `super_interfaces()` - -A collection of super interfaces, possibly containing `Unresolved` types. - -### `add_super_interface()` - -Adds a super interface. - -### `replace_super_interface()` - -Replaces a super interface. This is required when replacing `Unresolved` by another type. - -### `known_implementors()` - -Set of known implementors. This set is used by the ASDoc tool. - -### `add_known_implementor()` - -Adds a known implementor. - -### `interface_block_namespace()` - -The namespace used in the `interface` block. It is an user namespace, not a system namespace. - -### `is_external()` - -Whether the interface is external. - -### `set_is_external()` - -Setter for the `is_external()` property. - -### `metadata()` - -Collection of meta data. - -### `add_metadata()` - -Adds meta data. - -## Supported traits - -### `ToString` - -The `to_string()` method returns the fully qualified name of the interface (including its qualifier namespace) and any type arguments (`.`). \ No newline at end of file diff --git a/docs/verifier/Type/kinds/name.md b/docs/verifier/Type/kinds/name.md deleted file mode 100644 index c9f78f1..0000000 --- a/docs/verifier/Type/kinds/name.md +++ /dev/null @@ -1,28 +0,0 @@ -# Name - -The `Name` type kind represents an unique name consisting of a namespace and a string. `Name` objects are used frequently to represent the name of classes, variables, and miscellaneous other symbols. - -`Name` types are interned in the `TypeHost` object. - -## Supported methods - -### `is_name()` - -Returns `true`. - -### `namespace()` - -Returns the namespace to which the name belongs. - -### `name_string()` - -Returns the name's string. - -## Supported traits - -### `ToString` - -The `to_string()` method applied to a `Name` type kind returns either of: - -* `"x"` -* `"\"string\"::x"` \ No newline at end of file diff --git a/docs/verifier/Type/kinds/namespace-set.md b/docs/verifier/Type/kinds/namespace-set.md deleted file mode 100644 index 93256b5..0000000 --- a/docs/verifier/Type/kinds/namespace-set.md +++ /dev/null @@ -1,13 +0,0 @@ -# Namespace set - -The `NamespaceSet` type kind is a set of `Namespace` types used for lookuping a name. - -## Supported methods - -### `is_namespace_set()` - -Returns `true`. - -### `namespace_set()` - -Returns a vector of `Namespace` types. \ No newline at end of file diff --git a/docs/verifier/Type/kinds/namespace.md b/docs/verifier/Type/kinds/namespace.md deleted file mode 100644 index 963ddbb..0000000 --- a/docs/verifier/Type/kinds/namespace.md +++ /dev/null @@ -1,67 +0,0 @@ -# Namespace - -The `Namespace` type kind represents a namespace used as a name qualifier in the ActionScript language. A namespace is either a system namespace, an user namespace (`namespace ns1 = "http://www.adobe.com";`), or an explicit namespace. A namespace may contain an ASDoc comment. - -## User namespaces - -In the ActionScript 3 bytecode, user namespaces map to `namespace_info` structures with the `CONSTANT_Namespace` constant. - -User namespaces are interned in the `TypeHost` object. - -## Explicit namespaces - -The origin of explicit namespaces is currently unknown, therefore explicit namespaces are unexplored, but they exist at the ActionScript 3 bytecode. In the ActionScript 3 bytecode, explicit namespaces map to `namespace_info` structures with the `CONSTANT_ExplicitNamespace` constant. - -As with user namespaces, explicit namespaces are interned in the `TypeHost` object. - -## Supported methods - -### `is_namespace()` - -Returns `true`. - -### `is_system_namespace()` - -Returns whether the namespace is a system namespace. - -### `is_user_namespace()` - -Returns whether the namespace is an user namespace. - -### `is_explicit_namespace()` - -Returns whether the namespace is an explicit namespace. - -### `is_string_assigned_namespace()` - -Returns whether the namespace is a string assigned namespace. - -### `system_namespace()` - -Returns the kind of system namespace the namespace is, if it is a system namespace; otherwise `None`. - -It includes not only `public`, `private`, `protected`, or `internal`, but also `static protected`. - -### `namespace_string()` - -Returns the assigned string of the namespace, if it is an user namespace or explicit namespace. For example, the namespace `namespace w3c = "http://www.w3c.org";` has a `namespace_string() == "http://www.w3c.org"`. - -### `asdoc()` - -An optional ASDoc comment applying to the namespace. - -### `set_asdoc()` - -A setter for the `asdoc()` property. - -## Supported traits - -### `ToString` - -The `to_string()` method returns either of: - -* `"public"` -* `"private"` -* `"protected"` -* `"internal"` -* `"\"string\""` \ No newline at end of file diff --git a/docs/verifier/Type/kinds/never-type.md b/docs/verifier/Type/kinds/never-type.md deleted file mode 100644 index 01a75df..0000000 --- a/docs/verifier/Type/kinds/never-type.md +++ /dev/null @@ -1,19 +0,0 @@ -# Never type - -The `NeverType` type kind represents the `never` type. The `never` type contains no value and is a result of a function that always throws or that does not interrupt execution annotated with the `never` type. Such function's control flow has to be analyzed beforehand to determine if it is valid. - -## Supported methods - -### `is_never_type()` - -Returns true. - -### `asdoc()` - -Returns `None`. - -## Supported traits - -### `ToString` - -The `to_string()` method returns `"never"`. \ No newline at end of file diff --git a/docs/verifier/Type/kinds/package.md b/docs/verifier/Type/kinds/package.md deleted file mode 100644 index 6c4336c..0000000 --- a/docs/verifier/Type/kinds/package.md +++ /dev/null @@ -1,119 +0,0 @@ -# Package - -The `Package` type kind represents a package as consisting of a name string (excluding dots), an optional parent package, a properties `Names` object, a collection of wildcard package exports (`export q.*;`), a collection of direct subpackages, a set of reserved namespaces (`public`, `internal`), and an optional ASDoc comment. - -## Supported methods - -### `is_package()` - -Returns true. - -### `name_string()` - -The name string of the package. This is a single identifier; therefore it does not contain the dot character. For example, it returns `y` for a package `x.y`. - -The package: - -```as3 -package x.y {} -``` - -Produces: - -```rust -xy.name_string() == "y" -xy.to_string() == "x.y" -``` - -### `parent()` - -The parent package of the package, or `None`. - -### `properties()` - -The properties of the package as a `Names` object. - -### `wildcard_package_exports()` - -A collection of wildcard package exports, as a vector of `Package` types. A wildcard package export is contributed from an `export` directive that exports a wildcard (`*`) item, such as in: - -```as3 -export q.*; -``` - -### `add_wildcard_package_export()` - -Adds a wildcard package export. This method is used by the `export` directive. - -### `subpackages()` - -A collection of direct subpackages. For example: - -```as3 -package x {} -package x.y {} -package x.y.z {} -``` - -The `x` package has `x.y` as a direct subpackage. - -### `asdoc()` - -An optional ASDoc comment applying to the package. - -### `set_asdoc()` - -A setter for the `asdoc()` property. - -### `get_or_create_package()` - -Lookups a package given an array of name strings, or creates it if it does not exist, returning a `Package` type. - -```rust -// Lookups a subpackage "x", then a subpackage "y" from the "x" package, -// and finally a "z" subpackage from the "x.y" package. -// If any of the segments does not exist as a subpackage, a new subpackage -// is created from the previous segment. -let xyz: Option = type_host.global_package().get_or_create_package(["x", "y", "z"]); -``` - -### `get_package()` - -Lookups a package given an array of name strings. - -```rust -// Lookups a subpackage "x", then a subpackage "y" from the "x" package, -// and finally a "z" subpackage from the "x.y" package. -let xyz: Option = type_host.global_package().get_package(["x", "y", "z"]); -``` - -### `get_packages_deep()` - -Returns a vector containing the package and all of its subpackages recursively. - -### `public_namespace()` - -The `public` namespace of the package. - -### `internal_namespace()` - -The `internal` namespace of the package. - -## Supported traits - -### `ToString` - -The `to_string()` method returns the fully-qualified name of the package using the dot delimiter. - -The following package: - -```as3 -package x.y.z {} -``` - -Produces: - -```rust -xyz.to_string() == "x.y.z" -xyz.name_string() == "z" -``` \ No newline at end of file diff --git a/docs/verifier/Type/kinds/undefined-type.md b/docs/verifier/Type/kinds/undefined-type.md deleted file mode 100644 index fa3109c..0000000 --- a/docs/verifier/Type/kinds/undefined-type.md +++ /dev/null @@ -1,23 +0,0 @@ -# Undefined type - -The `UndefinedType` type kind represents the `undefined` type. The `undefined` type is literally different from `void`, however both contain the `undefined` value. - -## Implicit conversions - -`void` and `undefined` implicitly convert to each other. - -## Supported methods - -### `is_undefined_type()` - -Returns true. - -### `asdoc()` - -Returns `None`. - -## Supported traits - -### `ToString` - -The `to_string()` method returns `"undefined"`. \ No newline at end of file diff --git a/docs/verifier/Type/kinds/void-type.md b/docs/verifier/Type/kinds/void-type.md deleted file mode 100644 index 61bb325..0000000 --- a/docs/verifier/Type/kinds/void-type.md +++ /dev/null @@ -1,23 +0,0 @@ -# Void type - -The `VoidType` type kind represents the `void` type. The `void` type is literally different from `undefined`, however both contain the `undefined` value. - -## Implicit conversions - -`void` and `undefined` implicitly convert to each other. - -## Supported methods - -### `is_void_type()` - -Returns true. - -### `asdoc()` - -Returns `None`. - -## Supported traits - -### `ToString` - -The `to_string()` method returns `"void"`. \ No newline at end of file diff --git a/docs/verifier/TypeHost.md b/docs/verifier/TypeHost.md deleted file mode 100644 index 8a5ef34..0000000 --- a/docs/verifier/TypeHost.md +++ /dev/null @@ -1,3 +0,0 @@ -# TypeHost - -The `TypeHost` object interns or caches miscellaneous types and contains a factory for creating types. The only interned types are names, unions, complements, tuples, nullable types, non-nullable types, types with arguments, user namespaces, and explicit namespaces; record and function types are structurally checked against the other type. \ No newline at end of file diff --git a/docs/verifier/vector.md b/docs/verifier/vector.md deleted file mode 100644 index 4a9cf7f..0000000 --- a/docs/verifier/vector.md +++ /dev/null @@ -1,18 +0,0 @@ -# Vector type - -The `Vector` class is treated in a special way for compatibility. The program or an external library defines the `__AS3__.vec.Vector` class and the verifier automatically turns it into a generic class with a single type parameter. - -## Code generation - -An ActionScript 3 compiler should generate a multiname for a `Vector` type with type arguments as follows: - -```plain -TypeName(QName(PackageNamespace("__AS3__.vec"),"Vector")) -``` - -An ActionScript 3 compiler should generate a class for a `Vector` type with type arguments as follows: - -```plain -getlex QName(PackageNamespace("__AS3__.vec"),"Vector") -getlex QName(PackageNamespace(""),"Number") -``` \ No newline at end of file diff --git a/docs/working-with-css.md b/docs/working-with-css.md deleted file mode 100644 index 41fdfe3..0000000 --- a/docs/working-with-css.md +++ /dev/null @@ -1,22 +0,0 @@ -# Working with CSS - -You can use the `CssParserFacade` to parse CSS style sheets from Flex components. - -*Note: if anything is missing from Apache Royale's latest CSS, you may create an issue or pull request about it.* - -Here is an example: - -```rust -use as3_parser::ns::*; - -let text = r#" -.style1 { - backgroundImage: Embed("../assets/flower.gif"); - backgroundAlpha: .2 -} -"#; - -let compilation_unit = CompilationUnit::new(None, text.into()); - -let document: Rc = CssParserFacade(&compilation_unit, ParserOptions::default()).parse_document(); -``` \ No newline at end of file diff --git a/docs/working-with-mxml.md b/docs/working-with-mxml.md deleted file mode 100644 index 37a3515..0000000 --- a/docs/working-with-mxml.md +++ /dev/null @@ -1,44 +0,0 @@ -# Working with MXML - -Average parsing of XML documents such as MXML is provided within this project, deviating slightly from the XML specification, which is a bit large to read for a proper implementation. - -The parser supports parsing only the UTF-8 encoding and XML version 1.0. - -Here is an example: - -```rust -use as3_parser::ns::*; - -let text = r#" - - - -"#; -let compilation_unit = CompilationUnit::new(None, text.into()); - -let parser_options = ParserOptions { - // Ignore whitespace chunks in a node list when at least one - // element appears. - ignore_xml_whitespace: true, - ..default() -}; - -let document: Rc = ParserFacade(&compilation_unit, parser_options).parse_mxml(); -``` - -The nodes used for ECMAScript for XML (E4X) and MXML are distinct. For example, MXML uses `MxmlElement` instead of `XmlElement`, and `MxmlContent` instead of `XmlContent`. - -## Qualified names - -Every element stores a reference to a semantic namespace set (`Rc`) consisting of mappings from prefixes to URIs. - -Resolve a plain `XmlName` node to a (*uri*, *name*) string group by invoking `name.resolve_name(&namespace)`, where `namespace` is usually `&element.namespace`. - -There are additional useful methods available within `XmlName` other than `resolve_name()`. - -## Default namespace - -The prefix for the default namespace is the empty string, but referred to by the `MxmlNamespace::DEFAULT_NAMESPACE` constant. diff --git a/examples/asdoc/.gitignore b/examples/asdoc/.gitignore deleted file mode 100644 index ea8c4bf..0000000 --- a/examples/asdoc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target diff --git a/examples/asdoc/Cargo.toml b/examples/asdoc/Cargo.toml deleted file mode 100644 index 8472705..0000000 --- a/examples/asdoc/Cargo.toml +++ /dev/null @@ -1,11 +0,0 @@ -[package] -name = "asdoc-example" -version = "0.1.0" -edition = "2021" - -[dependencies] -as3_parser = { path = "../../crates/parser", version = "1.0" } - -[[example]] -name = "asdoc" -path = "example.rs" \ No newline at end of file diff --git a/examples/asdoc/Example.as b/examples/asdoc/Example.as deleted file mode 100644 index d73fc3d..0000000 --- a/examples/asdoc/Example.as +++ /dev/null @@ -1,10 +0,0 @@ -package q1 { - public namespace q1ns - public class C1 { - /** - * @private - * Comment for q1.q1ns::x - */ - q1.q1ns var x - } -} \ No newline at end of file diff --git a/examples/asdoc/example.rs b/examples/asdoc/example.rs deleted file mode 100644 index 2e10ca1..0000000 --- a/examples/asdoc/example.rs +++ /dev/null @@ -1,61 +0,0 @@ -use std::env; -use as3_parser::ns::*; - -fn main() { - // Define source path - let source_path = env::current_dir().unwrap().join("Example.as").to_string_lossy().into_owned(); - - // Read source content - let source_content = include_str!("Example.as").to_owned(); - - // Create compilation unit - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - - // Parse program - let program = ParserFacade(&compilation_unit, default()).parse_program(); - visit_program(&program); - - // Report diagnostics - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - println!("{}", diagnostic.format_english()); - } -} - -fn visit_program(program: &Rc) { - for package in program.packages.iter() { - for directive in package.block.directives.iter() { - // directive: Rc - - match directive.as_ref() { - Directive::ClassDefinition(defn) => { - visit_class(&defn); - }, - - _ => {}, - } - } - } -} - -fn visit_class(defn: &ClassDefinition) { - for directive in defn.block.directives.iter() { - if let Directive::VariableDefinition(defn) = directive.as_ref() { - // Print any found main body and @private tags - if let Some(asdoc) = &defn.asdoc { - print_asdoc(asdoc); - } - } - } -} - -fn print_asdoc(asdoc: &Rc) { - if let Some((text, loc)) = &asdoc.main_body { - println!("Found main body at {}:{}\n\n{}\n\n", loc.first_line_number(), loc.first_column() + 1, text); - } - for (tag, loc) in &asdoc.tags { - if matches!(tag, AsDocTag::Private) { - println!("Found @private tag at {}:{}\n\n", loc.first_line_number(), loc.first_column() + 1); - } - } -} \ No newline at end of file diff --git a/tests/parser/ASDoc.as b/tests/parser/ASDoc.as deleted file mode 100644 index c14a1cc..0000000 --- a/tests/parser/ASDoc.as +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Main body. - * @copy C1#x - * @inheritDoc - * @see C1#x X description - */ -var x - -/** - * N1. - */ -[N1] -/** - * N2. Lorem - * ipsum. - */ -[N2] -var y - -/** - * @throws SyntaxError If a syntax error occurs. - */ -function m() { -} \ No newline at end of file diff --git a/tests/parser/ASDoc.diag b/tests/parser/ASDoc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/ASDoc.tree b/tests/parser/ASDoc.tree deleted file mode 100644 index f8c14d8..0000000 --- a/tests/parser/ASDoc.tree +++ /dev/null @@ -1,235 +0,0 @@ -{ - "location": "7:1-24:2", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "7:1-7:6", - "asdoc": { - "location": "1:1-6:4", - "main_body": [ - "Main body.", - "2:4-2:14" - ], - "tags": [ - [ - { - "Copy": { - "base": { - "QualifiedIdentifier": { - "location": "3:10-3:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "3:10-3:12" - ] - } - } - }, - "instance_property": { - "location": "3:13-3:14", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "3:13-3:14" - ] - } - } - } - }, - "3:4-3:14" - ], - [ - "InheritDoc", - "4:4-4:15" - ], - [ - { - "See": { - "reference": { - "base": { - "QualifiedIdentifier": { - "location": "5:9-5:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "5:9-5:11" - ] - } - } - }, - "instance_property": { - "location": "5:12-5:13", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "5:12-5:13" - ] - } - } - }, - "display_text": "X description" - } - }, - "5:4-5:27" - ] - ] - }, - "attributes": [], - "kind": [ - "Var", - "7:1-7:4" - ], - "bindings": [ - { - "destructuring": { - "location": "7:5-7:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "7:5-7:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "7:5-7:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "12:1-18:6", - "asdoc": { - "location": "13:1-16:4", - "main_body": [ - "N2. Lorem\nipsum.", - "14:4-15:10" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "17:2-17:4", - "asdoc": null, - "name": [ - "N2", - "17:2-17:4" - ], - "entries": null - } - } - ], - "kind": [ - "Var", - "18:1-18:4" - ], - "bindings": [ - { - "destructuring": { - "location": "18:5-18:6", - "destructuring": { - "QualifiedIdentifier": { - "location": "18:5-18:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "18:5-18:6" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "23:1-24:2", - "asdoc": { - "location": "20:1-22:4", - "main_body": null, - "tags": [ - [ - { - "Throws": { - "class_reference": { - "QualifiedIdentifier": { - "location": "21:12-21:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "SyntaxError", - "21:12-21:23" - ] - } - } - }, - "description": "If a syntax error occurs." - } - }, - "21:4-21:49" - ] - ] - }, - "attributes": [], - "name": { - "Identifier": [ - "m", - "23:10-23:11" - ] - }, - "common": { - "location": "23:11-24:2", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "23:11-23:13", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "23:14-24:2", - "metadata": null, - "directives": [] - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Attributes.as b/tests/parser/Attributes.as deleted file mode 100644 index 96fc965..0000000 --- a/tests/parser/Attributes.as +++ /dev/null @@ -1,17 +0,0 @@ -q.x var y - -[N1] internal var z - -[N1(x = "y")] {} - -dynamic final class C1 {} - -/** - * Foo - */ -[N1] -/** - * @eventType FooEvent.FOO - */ -[Event(name = "foo", type = "FooEvent")] -class C1 {} \ No newline at end of file diff --git a/tests/parser/Attributes.diag b/tests/parser/Attributes.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Attributes.tree b/tests/parser/Attributes.tree deleted file mode 100644 index ee105c8..0000000 --- a/tests/parser/Attributes.tree +++ /dev/null @@ -1,293 +0,0 @@ -{ - "location": "5:1-17:12", - "packages": [], - "directives": [ - { - "VariableDefinition": { - "location": "1:1-1:10", - "asdoc": null, - "attributes": [ - { - "Expression": { - "Member": { - "location": "1:1-1:4", - "base": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "1:1-1:2" - ] - } - } - }, - "identifier": { - "location": "1:3-1:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "1:3-1:4" - ] - } - } - } - } - } - ], - "kind": [ - "Var", - "1:5-1:8" - ], - "bindings": [ - { - "destructuring": { - "location": "1:9-1:10", - "destructuring": { - "QualifiedIdentifier": { - "location": "1:9-1:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "1:9-1:10" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "VariableDefinition": { - "location": "3:1-3:20", - "asdoc": null, - "attributes": [ - { - "Metadata": { - "location": "3:2-3:4", - "asdoc": null, - "name": [ - "N1", - "3:2-3:4" - ], - "entries": null - } - }, - { - "Internal": "3:6-3:14" - } - ], - "kind": [ - "Var", - "3:15-3:18" - ], - "bindings": [ - { - "destructuring": { - "location": "3:19-3:20", - "destructuring": { - "QualifiedIdentifier": { - "location": "3:19-3:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "3:19-3:20" - ] - } - } - }, - "type_annotation": null - }, - "initializer": null - } - ] - } - }, - { - "Block": { - "location": "5:15-5:17", - "metadata": [ - { - "Metadata": { - "location": "5:2-5:13", - "asdoc": null, - "name": [ - "N1", - "5:2-5:4" - ], - "entries": [ - { - "location": "5:5-5:12", - "key": [ - "x", - "5:5-5:6" - ], - "value": { - "String": [ - "y", - "5:9-5:12" - ] - } - } - ] - } - } - ], - "directives": [] - } - }, - { - "ClassDefinition": { - "location": "7:1-7:26", - "asdoc": null, - "attributes": [ - { - "Dynamic": "7:1-7:8" - }, - { - "Final": "7:9-7:14" - } - ], - "name": [ - "C1", - "7:21-7:23" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "7:24-7:26", - "metadata": null, - "directives": [] - } - } - }, - { - "ClassDefinition": { - "location": "12:1-17:12", - "asdoc": { - "location": "9:1-11:4", - "main_body": [ - "Foo", - "10:4-10:7" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "12:2-12:4", - "asdoc": null, - "name": [ - "N1", - "12:2-12:4" - ], - "entries": null - } - }, - { - "Metadata": { - "location": "16:2-16:40", - "asdoc": { - "location": "13:1-15:4", - "main_body": null, - "tags": [ - [ - { - "EventType": { - "Member": { - "location": "14:15-14:27", - "base": { - "QualifiedIdentifier": { - "location": "14:15-14:23", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FooEvent", - "14:15-14:23" - ] - } - } - }, - "identifier": { - "location": "14:24-14:27", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "FOO", - "14:24-14:27" - ] - } - } - } - } - }, - "14:4-14:27" - ] - ] - }, - "name": [ - "Event", - "16:2-16:7" - ], - "entries": [ - { - "location": "16:8-16:20", - "key": [ - "name", - "16:8-16:12" - ], - "value": { - "String": [ - "foo", - "16:15-16:20" - ] - } - }, - { - "location": "16:22-16:39", - "key": [ - "type", - "16:22-16:26" - ], - "value": { - "String": [ - "FooEvent", - "16:29-16:39" - ] - } - } - ] - } - } - ], - "name": [ - "C1", - "17:7-17:9" - ], - "type_parameters": null, - "extends_clause": null, - "implements_clause": null, - "block": { - "location": "17:10-17:12", - "metadata": null, - "directives": [] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Configuration.as b/tests/parser/Configuration.as deleted file mode 100644 index 38d8419..0000000 --- a/tests/parser/Configuration.as +++ /dev/null @@ -1,21 +0,0 @@ -package foo.bar { - /** - * Comment 1 (overriden by the "Communication facility" comment). - */ - CONFIG::DEBUG - /** - * Communication facility. - */ - [Adherence(type = "efficient")] - /** - * Dispatched when a message is received. - */ - [Event(name = "received", type = "foo.bar.MessageEvent")] - public class CommunicationCenter extends EventDispatcher { - CONFIG::DEBUG { - protected var x: T1, y: T2, z: T3; - protected function f1(): void {} - } - CONFIG::RELEASE protected var w: T4; - } -} \ No newline at end of file diff --git a/tests/parser/Configuration.diag b/tests/parser/Configuration.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Configuration.tree b/tests/parser/Configuration.tree deleted file mode 100644 index f9cdbf8..0000000 --- a/tests/parser/Configuration.tree +++ /dev/null @@ -1,386 +0,0 @@ -{ - "location": "5:5-21:2", - "packages": [ - { - "location": "5:5-21:2", - "asdoc": null, - "name": [ - [ - "foo", - "1:9-1:12" - ], - [ - "bar", - "1:13-1:16" - ] - ], - "block": { - "location": "5:5-21:2", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "14:62-20:6", - "namespace": [ - "CONFIG", - "5:5-5:11" - ], - "constant_name": [ - "DEBUG", - "5:13-5:18" - ], - "directive": { - "ClassDefinition": { - "location": "15:9-20:6", - "asdoc": { - "location": "6:5-8:8", - "main_body": [ - "Communication facility.", - "7:8-7:31" - ], - "tags": [] - }, - "attributes": [ - { - "Metadata": { - "location": "9:6-9:35", - "asdoc": null, - "name": [ - "Adherence", - "9:6-9:15" - ], - "entries": [ - { - "location": "9:16-9:34", - "key": [ - "type", - "9:16-9:20" - ], - "value": { - "String": [ - "efficient", - "9:23-9:34" - ] - } - } - ] - } - }, - { - "Metadata": { - "location": "13:6-13:61", - "asdoc": { - "location": "10:5-12:8", - "main_body": [ - "Dispatched when a message is received.", - "11:8-11:46" - ], - "tags": [] - }, - "name": [ - "Event", - "13:6-13:11" - ], - "entries": [ - { - "location": "13:12-13:29", - "key": [ - "name", - "13:12-13:16" - ], - "value": { - "String": [ - "received", - "13:19-13:29" - ] - } - }, - { - "location": "13:31-13:60", - "key": [ - "type", - "13:31-13:35" - ], - "value": { - "String": [ - "foo.bar.MessageEvent", - "13:38-13:60" - ] - } - } - ] - } - }, - { - "Public": "14:5-14:11" - } - ], - "name": [ - "CommunicationCenter", - "14:18-14:37" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "14:46-14:61", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "EventDispatcher", - "14:46-14:61" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "19:9-20:6", - "metadata": null, - "directives": [ - { - "NormalConfigurationDirective": { - "location": "15:9-18:10", - "namespace": [ - "CONFIG", - "15:9-15:15" - ], - "constant_name": [ - "DEBUG", - "15:17-15:22" - ], - "directive": { - "Block": { - "location": "15:23-18:10", - "metadata": null, - "directives": [ - { - "VariableDefinition": { - "location": "16:23-16:47", - "asdoc": null, - "attributes": [ - { - "Protected": "16:13-16:22" - } - ], - "kind": [ - "Var", - "16:23-16:26" - ], - "bindings": [ - { - "destructuring": { - "location": "16:27-16:32", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:27-16:28", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "16:27-16:28" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:30-16:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T1", - "16:30-16:32" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:34-16:39", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:34-16:35", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "16:34-16:35" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:37-16:39", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T2", - "16:37-16:39" - ] - } - } - } - }, - "initializer": null - }, - { - "destructuring": { - "location": "16:41-16:46", - "destructuring": { - "QualifiedIdentifier": { - "location": "16:41-16:42", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "16:41-16:42" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "16:44-16:46", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T3", - "16:44-16:46" - ] - } - } - } - }, - "initializer": null - } - ] - } - }, - { - "FunctionDefinition": { - "location": "17:23-17:45", - "asdoc": null, - "attributes": [ - { - "Protected": "17:13-17:22" - } - ], - "name": { - "Identifier": [ - "f1", - "17:32-17:34" - ] - }, - "common": { - "location": "17:34-17:45", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "17:34-17:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "17:38-17:42" - } - } - }, - "body": { - "Block": { - "location": "17:43-17:45", - "metadata": null, - "directives": [] - } - } - } - } - } - ] - } - } - } - }, - { - "NormalConfigurationDirective": { - "location": "19:9-19:45", - "namespace": [ - "CONFIG", - "19:9-19:15" - ], - "constant_name": [ - "RELEASE", - "19:17-19:24" - ], - "directive": { - "VariableDefinition": { - "location": "19:9-19:45", - "asdoc": null, - "attributes": [ - { - "Protected": "19:25-19:34" - } - ], - "kind": [ - "Var", - "19:35-19:38" - ], - "bindings": [ - { - "destructuring": { - "location": "19:39-19:44", - "destructuring": { - "QualifiedIdentifier": { - "location": "19:39-19:40", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "w", - "19:39-19:40" - ] - } - } - }, - "type_annotation": { - "QualifiedIdentifier": { - "location": "19:42-19:44", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T4", - "19:42-19:44" - ] - } - } - } - }, - "initializer": null - } - ] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - ], - "directives": [] -} \ No newline at end of file diff --git a/tests/parser/E4X.as b/tests/parser/E4X.as deleted file mode 100644 index fb18845..0000000 --- a/tests/parser/E4X.as +++ /dev/null @@ -1,18 +0,0 @@ -default xml namespace = myxmlns; - - ; - ; - ; - - - - - - Lorem ipsum - Lorem ipsum - {c} - - .(filterCondition) - ..d; - -<>; \ No newline at end of file diff --git a/tests/parser/E4X.diag b/tests/parser/E4X.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/E4X.tree b/tests/parser/E4X.tree deleted file mode 100644 index 44f7a88..0000000 --- a/tests/parser/E4X.tree +++ /dev/null @@ -1,324 +0,0 @@ -{ - "location": "1:1-18:7", - "packages": [], - "directives": [ - { - "DefaultXmlNamespaceStatement": { - "location": "1:1-1:33", - "right": { - "QualifiedIdentifier": { - "location": "1:25-1:32", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "myxmlns", - "1:25-1:32" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:19", - "expression": { - "XmlMarkup": { - "location": "3:1-3:17", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:8", - "expression": { - "XmlMarkup": { - "location": "4:1-4:6", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:27", - "expression": { - "XmlMarkup": { - "location": "5:1-5:25", - "markup": "" - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-16:9", - "expression": { - "Descendants": { - "location": "6:1-16:8", - "base": { - "Filter": { - "location": "6:1-15:23", - "base": { - "Xml": { - "location": "6:1-14:5", - "element": { - "location": "6:1-14:5", - "name": { - "Name": [ - "t", - "6:2-6:3" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "\r\n ", - "6:4-7:5" - ] - }, - { - "Element": { - "location": "7:6-7:9", - "name": { - "Name": [ - "t", - "7:6-7:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "7:9-8:5" - ] - }, - { - "Element": { - "location": "8:6-8:13", - "name": { - "Name": [ - "t", - "8:6-8:7" - ] - }, - "attributes": [], - "attribute_expression": { - "QualifiedIdentifier": { - "location": "8:9-8:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "8:9-8:10" - ] - } - } - }, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "8:13-9:5" - ] - }, - { - "Element": { - "location": "9:6-9:15", - "name": { - "Name": [ - "t", - "9:6-9:7" - ] - }, - "attributes": [ - { - "location": "9:8-9:13", - "name": [ - "k", - "9:8-9:9" - ], - "value": { - "Value": [ - "v", - "9:10-9:13" - ] - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n ", - "9:15-10:5" - ] - }, - { - "Element": { - "location": "10:6-10:15", - "name": { - "Name": [ - "t", - "10:6-10:7" - ] - }, - "attributes": [ - { - "location": "10:8-10:13", - "name": [ - "k", - "10:8-10:9" - ], - "value": { - "Expression": { - "QualifiedIdentifier": { - "location": "10:11-10:12", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "10:11-10:12" - ] - } - } - } - } - } - ], - "attribute_expression": null, - "content": null, - "closing_name": null - } - }, - { - "Characters": [ - "\r\n Lorem ipsum\r\n ", - "10:15-12:5" - ] - }, - { - "Element": { - "location": "12:6-12:23", - "name": { - "Name": [ - "t", - "12:6-12:7" - ] - }, - "attributes": [], - "attribute_expression": null, - "content": [ - { - "Characters": [ - "Lorem ipsum", - "12:8-12:19" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "12:21-12:22" - ] - } - } - }, - { - "Characters": [ - "\r\n ", - "12:23-13:5" - ] - }, - { - "Expression": { - "QualifiedIdentifier": { - "location": "13:6-13:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "c", - "13:6-13:7" - ] - } - } - } - }, - { - "Characters": [ - "\r\n", - "13:8-14:1" - ] - } - ], - "closing_name": { - "Name": [ - "t", - "14:3-14:4" - ] - } - } - } - }, - "test": { - "QualifiedIdentifier": { - "location": "15:7-15:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "filterCondition", - "15:7-15:22" - ] - } - } - } - } - }, - "identifier": { - "location": "16:7-16:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "d", - "16:7-16:8" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "18:1-18:7", - "expression": { - "XmlList": { - "location": "18:1-18:6", - "content": [] - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML1.diag b/tests/parser/MXML1.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML1.mxml b/tests/parser/MXML1.mxml deleted file mode 100644 index 5d922ab..0000000 --- a/tests/parser/MXML1.mxml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/tests/parser/MXML1.tree b/tests/parser/MXML1.tree deleted file mode 100644 index d8eebd2..0000000 --- a/tests/parser/MXML1.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-16:17", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Comment": [ - "", - "2:1-2:37" - ] - }, - { - "Element": { - "location": "3:2-16:17", - "name": { - "location": "3:2-3:15", - "prefix": "s", - "name": "Application" - }, - "attributes": [ - { - "location": "3:16-3:56", - "xmlns": true, - "name": { - "location": "3:16-3:24", - "prefix": "xmlns", - "name": "fx" - }, - "value": [ - "http://ns.adobe.com/mxml/2009", - "3:25-3:56" - ] - }, - { - "location": "4:5-4:48", - "xmlns": true, - "name": { - "location": "4:5-4:12", - "prefix": "xmlns", - "name": "s" - }, - "value": [ - "library://ns.adobe.com/flex/spark", - "4:13-4:48" - ] - }, - { - "location": "5:5-5:46", - "xmlns": true, - "name": { - "location": "5:5-5:13", - "prefix": "xmlns", - "name": "mx" - }, - "value": [ - "library://ns.adobe.com/flex/mx", - "5:14-5:46" - ] - } - ], - "content": [ - { - "Element": { - "location": "6:6-8:16", - "name": { - "location": "6:6-6:14", - "prefix": "s", - "name": "layout" - }, - "attributes": [], - "content": [ - { - "Element": { - "location": "7:10-7:28", - "name": { - "location": "7:10-7:26", - "prefix": "s", - "name": "VerticalLayout" - }, - "attributes": [], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "8:7-8:15", - "prefix": "s", - "name": "layout" - } - } - }, - { - "Element": { - "location": "9:6-14:65", - "name": { - "location": "9:6-9:14", - "prefix": "s", - "name": "Button" - }, - "attributes": [ - { - "location": "10:9-10:21", - "xmlns": false, - "name": { - "location": "10:9-10:11", - "prefix": null, - "name": "id" - }, - "value": [ - "button1", - "10:12-10:21" - ] - }, - { - "location": "11:9-11:28", - "xmlns": false, - "name": { - "location": "11:9-11:14", - "prefix": null, - "name": "label" - }, - "value": [ - "Click here!", - "11:15-11:28" - ] - }, - { - "location": "12:9-12:20", - "xmlns": false, - "name": { - "location": "12:9-12:14", - "prefix": null, - "name": "width" - }, - "value": [ - "100", - "12:15-12:20" - ] - }, - { - "location": "13:9-13:22", - "xmlns": false, - "name": { - "location": "13:9-13:17", - "prefix": null, - "name": "fontSize" - }, - "value": [ - "12", - "13:18-13:22" - ] - }, - { - "location": "14:9-14:63", - "xmlns": false, - "name": { - "location": "14:9-14:14", - "prefix": null, - "name": "click" - }, - "value": [ - "text1.text='&& Thanks for the click!';", - "14:15-14:63" - ] - } - ], - "content": null, - "closing_name": null - } - }, - { - "Element": { - "location": "15:6-15:29", - "name": { - "location": "15:6-15:16", - "prefix": "s", - "name": "TextArea" - }, - "attributes": [ - { - "location": "15:17-15:27", - "xmlns": false, - "name": { - "location": "15:17-15:19", - "prefix": null, - "name": "id" - }, - "value": [ - "text1", - "15:20-15:27" - ] - } - ], - "content": null, - "closing_name": null - } - } - ], - "closing_name": { - "location": "16:3-16:16", - "prefix": "s", - "name": "Application" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/MXML2.diag b/tests/parser/MXML2.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/MXML2.mxml b/tests/parser/MXML2.mxml deleted file mode 100644 index 5c28b9b..0000000 --- a/tests/parser/MXML2.mxml +++ /dev/null @@ -1,4 +0,0 @@ - - - & Text & - \ No newline at end of file diff --git a/tests/parser/MXML2.tree b/tests/parser/MXML2.tree deleted file mode 100644 index 5eb2621..0000000 --- a/tests/parser/MXML2.tree +++ /dev/null @@ -1,38 +0,0 @@ -{ - "location": "1:1-4:11", - "version": "Version10", - "encoding": "utf-8", - "content": [ - { - "ProcessingInstruction": { - "location": "1:1-1:22", - "name": "xml", - "data": " version=\"1.0\"" - } - }, - { - "Element": { - "location": "2:2-4:11", - "name": { - "location": "2:2-2:9", - "prefix": null, - "name": "invalid" - }, - "attributes": [], - "content": [ - { - "Characters": [ - "\r\n & Text &\r\n", - "2:10-4:1" - ] - } - ], - "closing_name": { - "location": "4:3-4:10", - "prefix": null, - "name": "invalid" - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Misc.as b/tests/parser/Misc.as deleted file mode 100644 index ba1c996..0000000 --- a/tests/parser/Misc.as +++ /dev/null @@ -1,19 +0,0 @@ -namespace ns1 -namespace ns2 = "http://www.samsung.com" - -new [] - -v is T -v is not T -v instanceof T -k in o -k not in o - -x ? y : z - -10 ; -10f ; - -/(?:)/gi ; - -/=/ \ No newline at end of file diff --git a/tests/parser/Misc.diag b/tests/parser/Misc.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Misc.tree b/tests/parser/Misc.tree deleted file mode 100644 index 893b52e..0000000 --- a/tests/parser/Misc.tree +++ /dev/null @@ -1,341 +0,0 @@ -{ - "location": "10:1-19:4", - "packages": [], - "directives": [ - { - "NamespaceDefinition": { - "location": "1:1-1:14", - "asdoc": null, - "attributes": [], - "left": [ - "ns1", - "1:11-1:14" - ], - "right": null - } - }, - { - "NamespaceDefinition": { - "location": "2:1-2:41", - "asdoc": null, - "attributes": [], - "left": [ - "ns2", - "2:11-2:14" - ], - "right": { - "StringLiteral": { - "location": "2:17-2:41", - "value": "http://www.samsung.com" - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:11", - "expression": { - "VectorLiteral": { - "location": "4:1-4:11", - "element_type": { - "QualifiedIdentifier": { - "location": "4:6-4:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "4:6-4:7" - ] - } - } - }, - "elements": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:7", - "expression": { - "Binary": { - "location": "6:1-6:7", - "operator": "Is", - "left": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "6:1-6:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "6:6-6:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "6:6-6:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:11", - "expression": { - "Binary": { - "location": "7:1-7:11", - "operator": "IsNot", - "left": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "7:1-7:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "7:10-7:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "7:10-7:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:15", - "expression": { - "Binary": { - "location": "8:1-8:15", - "operator": "Instanceof", - "left": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "v", - "8:1-8:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "8:14-8:15", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "T", - "8:14-8:15" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:7", - "expression": { - "Binary": { - "location": "9:1-9:7", - "operator": "In", - "left": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "9:1-9:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "9:6-9:7", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:6-9:7" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:1-10:11", - "expression": { - "Binary": { - "location": "10:1-10:11", - "operator": "NotIn", - "left": { - "QualifiedIdentifier": { - "location": "10:1-10:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "10:1-10:2" - ] - } - } - }, - "right": { - "QualifiedIdentifier": { - "location": "10:10-10:11", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "10:10-10:11" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "12:1-12:10", - "expression": { - "Conditional": { - "location": "12:1-12:10", - "test": { - "QualifiedIdentifier": { - "location": "12:1-12:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "x", - "12:1-12:2" - ] - } - } - }, - "consequent": { - "QualifiedIdentifier": { - "location": "12:5-12:6", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "y", - "12:5-12:6" - ] - } - } - }, - "alternative": { - "QualifiedIdentifier": { - "location": "12:9-12:10", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "z", - "12:9-12:10" - ] - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "14:1-14:6", - "expression": { - "NumericLiteral": { - "location": "14:1-14:3", - "value": "10", - "suffix": "None" - } - } - } - }, - { - "ExpressionStatement": { - "location": "15:1-15:7", - "expression": { - "NumericLiteral": { - "location": "15:1-15:4", - "value": "10", - "suffix": "F" - } - } - } - }, - { - "ExpressionStatement": { - "location": "17:1-17:12", - "expression": { - "RegExpLiteral": { - "location": "17:1-17:9", - "body": "(?:)", - "flags": "gi" - } - } - } - }, - { - "ExpressionStatement": { - "location": "19:1-19:4", - "expression": { - "RegExpLiteral": { - "location": "19:1-19:4", - "body": "=", - "flags": "" - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/Qualifier.as b/tests/parser/Qualifier.as deleted file mode 100644 index 837c5ba..0000000 --- a/tests/parser/Qualifier.as +++ /dev/null @@ -1,9 +0,0 @@ -* -; (q)::x -o.* -o.public -o.public::x -o.(q)::x -o.q::x -o.q::[k] -o.@x; \ No newline at end of file diff --git a/tests/parser/Qualifier.diag b/tests/parser/Qualifier.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/Qualifier.tree b/tests/parser/Qualifier.tree deleted file mode 100644 index d38b679..0000000 --- a/tests/parser/Qualifier.tree +++ /dev/null @@ -1,351 +0,0 @@ -{ - "location": "1:1-9:6", - "packages": [], - "directives": [ - { - "ExpressionStatement": { - "location": "1:1-2:2", - "expression": { - "QualifiedIdentifier": { - "location": "1:1-1:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "1:1-1:2" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "2:3-2:9", - "expression": { - "QualifiedIdentifier": { - "location": "2:3-2:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "2:3-2:6", - "expression": { - "QualifiedIdentifier": { - "location": "2:4-2:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "2:4-2:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "2:8-2:9" - ] - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "3:1-3:4", - "expression": { - "Member": { - "location": "3:1-3:4", - "base": { - "QualifiedIdentifier": { - "location": "3:1-3:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "3:1-3:2" - ] - } - } - }, - "identifier": { - "location": "3:3-3:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "*", - "3:3-3:4" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "4:1-4:9", - "expression": { - "Member": { - "location": "4:1-4:9", - "base": { - "QualifiedIdentifier": { - "location": "4:1-4:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "4:1-4:2" - ] - } - } - }, - "identifier": { - "location": "4:3-4:9", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "public", - "4:3-4:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "5:1-5:12", - "expression": { - "Member": { - "location": "5:1-5:12", - "base": { - "QualifiedIdentifier": { - "location": "5:1-5:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "5:1-5:2" - ] - } - } - }, - "identifier": { - "location": "5:3-5:12", - "attribute": false, - "qualifier": { - "ReservedNamespace": { - "Public": "5:3-5:9" - } - }, - "id": { - "Id": [ - "x", - "5:11-5:12" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "6:1-6:9", - "expression": { - "Member": { - "location": "6:1-6:9", - "base": { - "QualifiedIdentifier": { - "location": "6:1-6:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "6:1-6:2" - ] - } - } - }, - "identifier": { - "location": "6:3-6:9", - "attribute": false, - "qualifier": { - "Paren": { - "location": "6:3-6:4", - "expression": { - "QualifiedIdentifier": { - "location": "6:4-6:5", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "6:4-6:5" - ] - } - } - } - } - }, - "id": { - "Id": [ - "x", - "6:8-6:9" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "7:1-7:7", - "expression": { - "Member": { - "location": "7:1-7:7", - "base": { - "QualifiedIdentifier": { - "location": "7:1-7:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "7:1-7:2" - ] - } - } - }, - "identifier": { - "location": "7:3-7:7", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "7:3-7:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "7:3-7:4" - ] - } - } - }, - "id": { - "Id": [ - "x", - "7:6-7:7" - ] - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "8:1-8:9", - "expression": { - "Member": { - "location": "8:1-8:9", - "base": { - "QualifiedIdentifier": { - "location": "8:1-8:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "8:1-8:2" - ] - } - } - }, - "identifier": { - "location": "8:3-8:9", - "attribute": false, - "qualifier": { - "QualifiedIdentifier": { - "location": "8:3-8:4", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "q", - "8:3-8:4" - ] - } - } - }, - "id": { - "Brackets": { - "QualifiedIdentifier": { - "location": "8:7-8:8", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "k", - "8:7-8:8" - ] - } - } - } - } - } - } - } - } - }, - { - "ExpressionStatement": { - "location": "9:1-9:6", - "expression": { - "Member": { - "location": "9:1-9:5", - "base": { - "QualifiedIdentifier": { - "location": "9:1-9:2", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "o", - "9:1-9:2" - ] - } - } - }, - "identifier": { - "location": "9:3-9:5", - "attribute": true, - "qualifier": null, - "id": { - "Id": [ - "x", - "9:4-9:5" - ] - } - } - } - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/README.md b/tests/parser/README.md deleted file mode 100644 index b09ad3d..0000000 --- a/tests/parser/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# Parsing tests - -To test parsing a program producing output to the command line, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as -``` - -To test parsing a program producing output to two files `.ast.json` and `.diag`, run: - -``` -cargo run --bin as3_parser_test -- --source-path tests/parser/Demo.as --file-log -``` - -For parsing MXML, pass the `--mxml` flag. - -For parsing CSS, pass the `--css` flag. \ No newline at end of file diff --git a/tests/parser/Super.as b/tests/parser/Super.as deleted file mode 100644 index 817fde3..0000000 --- a/tests/parser/Super.as +++ /dev/null @@ -1,12 +0,0 @@ -super() // ERROR -class C2 extends C1 { - function C2() { - if (true) { - super() - } - } - override protected function m(): void { - super.m() - super(this).m() - } -} \ No newline at end of file diff --git a/tests/parser/Super.diag b/tests/parser/Super.diag deleted file mode 100644 index 1eac2e5..0000000 --- a/tests/parser/Super.diag +++ /dev/null @@ -1 +0,0 @@ -C:\Users\mathe\UnsyncDocuments\as3parser\tests\parser\Super.as:1:1: Syntax error #1036: 'super' not allowed here \ No newline at end of file diff --git a/tests/parser/Super.tree b/tests/parser/Super.tree deleted file mode 100644 index 24fa1b4..0000000 --- a/tests/parser/Super.tree +++ /dev/null @@ -1,215 +0,0 @@ -{ - "location": "1:1-12:2", - "packages": [], - "directives": [ - { - "SuperStatement": { - "location": "1:1-1:8", - "arguments": [] - } - }, - { - "ClassDefinition": { - "location": "2:1-12:2", - "asdoc": null, - "attributes": [], - "name": [ - "C2", - "2:7-2:9" - ], - "type_parameters": null, - "extends_clause": { - "QualifiedIdentifier": { - "location": "2:18-2:20", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "C1", - "2:18-2:20" - ] - } - } - }, - "implements_clause": null, - "block": { - "location": "2:21-12:2", - "metadata": null, - "directives": [ - { - "FunctionDefinition": { - "location": "3:5-7:6", - "asdoc": null, - "attributes": [], - "name": { - "Constructor": [ - "C2", - "3:14-3:16" - ] - }, - "common": { - "location": "3:16-7:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "3:16-3:18", - "parameters": [], - "result_type": null - }, - "body": { - "Block": { - "location": "3:19-7:6", - "metadata": null, - "directives": [ - { - "IfStatement": { - "location": "4:9-6:10", - "test": { - "BooleanLiteral": { - "location": "4:13-4:17", - "value": true - } - }, - "consequent": { - "Block": { - "location": "4:19-6:10", - "metadata": null, - "directives": [ - { - "SuperStatement": { - "location": "5:13-5:20", - "arguments": [] - } - } - ] - } - }, - "alternative": null - } - } - ] - } - } - } - } - }, - { - "FunctionDefinition": { - "location": "8:5-11:6", - "asdoc": null, - "attributes": [ - { - "Override": "8:5-8:13" - }, - { - "Protected": "8:14-8:23" - } - ], - "name": { - "Identifier": [ - "m", - "8:33-8:34" - ] - }, - "common": { - "location": "8:34-11:6", - "contains_yield": false, - "contains_await": false, - "signature": { - "location": "8:34-8:42", - "parameters": [], - "result_type": { - "VoidType": { - "location": "8:38-8:42" - } - } - }, - "body": { - "Block": { - "location": "8:43-11:6", - "metadata": null, - "directives": [ - { - "ExpressionStatement": { - "location": "9:9-9:18", - "expression": { - "Call": { - "location": "9:9-9:18", - "base": { - "Member": { - "location": "9:9-9:16", - "base": { - "Super": { - "location": "9:9-9:14", - "object": null - } - }, - "identifier": { - "location": "9:15-9:16", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "9:15-9:16" - ] - } - } - } - }, - "arguments": [] - } - } - } - }, - { - "ExpressionStatement": { - "location": "10:9-10:24", - "expression": { - "Call": { - "location": "10:9-10:24", - "base": { - "Member": { - "location": "10:9-10:22", - "base": { - "Super": { - "location": "10:9-10:20", - "object": [ - { - "ThisLiteral": { - "location": "10:15-10:19" - } - } - ] - } - }, - "identifier": { - "location": "10:21-10:22", - "attribute": false, - "qualifier": null, - "id": { - "Id": [ - "m", - "10:21-10:22" - ] - } - } - } - }, - "arguments": [] - } - } - } - } - ] - } - } - } - } - } - ] - } - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.css b/tests/parser/css/mediaQuery.css deleted file mode 100644 index 5e64391..0000000 --- a/tests/parser/css/mediaQuery.css +++ /dev/null @@ -1,5 +0,0 @@ -@media (application-dpi: 240) and (os-platform: "Windows"),,,,,,,,, { - .myStyleName1 { - fontSize: 30 - } -} \ No newline at end of file diff --git a/tests/parser/css/mediaQuery.diag b/tests/parser/css/mediaQuery.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/mediaQuery.tree b/tests/parser/css/mediaQuery.tree deleted file mode 100644 index 209ae54..0000000 --- a/tests/parser/css/mediaQuery.tree +++ /dev/null @@ -1,92 +0,0 @@ -{ - "location": "1:1-5:2", - "directives": [ - { - "MediaQuery": { - "location": "1:1-5:2", - "conditions": [ - { - "And": { - "location": "1:8-1:59", - "left": { - "ParenProperty": [ - { - "location": "1:9-1:29", - "name": [ - "applicationDpi", - "1:9-1:24" - ], - "value": { - "Number": { - "location": "1:26-1:29", - "value": 240.0, - "unit": null - } - } - }, - "1:8-1:30" - ] - }, - "right": { - "ParenProperty": [ - { - "location": "1:36-1:58", - "name": [ - "osPlatform", - "1:36-1:47" - ], - "value": { - "String": { - "location": "1:49-1:58", - "value": "Windows" - } - } - }, - "1:35-1:59" - ] - } - } - } - ], - "rules": [ - { - "location": "2:5-4:6", - "selectors": [ - { - "Base": { - "location": "2:5-2:18", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "2:5-2:18" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "3:9-3:21", - "name": [ - "fontSize", - "3:9-3:17" - ], - "value": { - "Number": { - "location": "3:19-3:21", - "value": 30.0, - "unit": null - } - } - } - ] - } - ] - } - } - ] -} \ No newline at end of file diff --git a/tests/parser/css/selectors.css b/tests/parser/css/selectors.css deleted file mode 100644 index fb64f56..0000000 --- a/tests/parser/css/selectors.css +++ /dev/null @@ -1,9 +0,0 @@ -.myStyleName1.anotherOne s|VGroup, #id1 { - fontSize: 24 -} - -.myStyleName1[attr^="."] { - color: red -} - -#myId1 #myId2 #myId3 {} \ No newline at end of file diff --git a/tests/parser/css/selectors.diag b/tests/parser/css/selectors.diag deleted file mode 100644 index e69de29..0000000 diff --git a/tests/parser/css/selectors.tree b/tests/parser/css/selectors.tree deleted file mode 100644 index 143402b..0000000 --- a/tests/parser/css/selectors.tree +++ /dev/null @@ -1,200 +0,0 @@ -{ - "location": "1:1-9:24", - "directives": [ - { - "Rule": { - "location": "1:1-3:2", - "selectors": [ - { - "Combinator": { - "location": "1:1-1:34", - "left": { - "Base": { - "location": "1:1-1:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "1:1-1:14" - ] - }, - { - "Class": [ - "anotherOne", - "1:14-1:25" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "1:26-1:34", - "namespace_prefix": [ - "s", - "1:26-1:27" - ], - "element_name": [ - "VGroup", - "1:28-1:34" - ], - "conditions": [] - } - }, - "combinator_type": "Descendant" - } - }, - { - "Base": { - "location": "1:36-1:40", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "id1", - "1:36-1:40" - ] - } - ] - } - } - ], - "properties": [ - { - "location": "2:5-2:17", - "name": [ - "fontSize", - "2:5-2:13" - ], - "value": { - "Number": { - "location": "2:15-2:17", - "value": 24.0, - "unit": null - } - } - } - ] - } - }, - { - "Rule": { - "location": "5:1-7:2", - "selectors": [ - { - "Base": { - "location": "5:1-5:25", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Class": [ - "myStyleName1", - "5:1-5:14" - ] - }, - { - "Attribute": { - "location": "5:14-5:25", - "name": [ - "attr", - "5:15-5:19" - ], - "operator": "BeginsWith", - "value": [ - ".", - "5:21-5:24" - ] - } - } - ] - } - } - ], - "properties": [ - { - "location": "6:5-6:15", - "name": [ - "color", - "6:5-6:10" - ], - "value": { - "Color": { - "location": "6:12-6:15", - "color_int": 16711680 - } - } - } - ] - } - }, - { - "Rule": { - "location": "9:1-9:24", - "selectors": [ - { - "Combinator": { - "location": "9:1-9:21", - "left": { - "Combinator": { - "location": "9:1-9:14", - "left": { - "Base": { - "location": "9:1-9:7", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId1", - "9:1-9:7" - ] - } - ] - } - }, - "right": { - "Base": { - "location": "9:8-9:14", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId2", - "9:8-9:14" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - }, - "right": { - "Base": { - "location": "9:15-9:21", - "namespace_prefix": null, - "element_name": null, - "conditions": [ - { - "Id": [ - "myId3", - "9:15-9:21" - ] - } - ] - } - }, - "combinator_type": "Descendant" - } - } - ], - "properties": [] - } - } - ] -} \ No newline at end of file