From 0f3cf1669de83f97bfe85a93780875874d457e91 Mon Sep 17 00:00:00 2001 From: hydroper Date: Wed, 8 May 2024 18:44:20 +0000 Subject: [PATCH] Automated report --- .github/workflows/demo.yml | 41 - .gitignore | 1 - Cargo.lock | 639 -- Cargo.toml | 8 - LICENSE | 202 - README.md | 19 - 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 | 77 - crates/parser/diagnostics/diagnostics.rs | 175 - .../diagnostics_english_resources.rs | 76 - 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 | 5428 ----------------- 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 | 1307 ---- crates/parser/tree.rs | 165 - 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 | 82 - .../parser/tree/directive_injection_node.rs | 9 - 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 | 27 - 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 | 217 - 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 - .../parser/tree/package_concat_directive.rs | 10 - 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 | 230 - 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 -> 2513440 bytes demo/dist/as3_parser_demo_bg.wasm.d.ts | 8 + demo/src/lib.rs | 58 - 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 - 159 files changed, 247 insertions(+), 17734 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/directive_injection_node.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_concat_directive.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 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 f33f668..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.17" -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 e9b92ac..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# ActionScript 3 Parser - -

- - - -

- -ActionScript 3 parser in the Rust language. - -[Online demo](https://hydroper.github.io/as3parser/demo) - -## Documentation - -Refer to the [wiki](https://github.com/hydroper/as3parser/wiki) of this repository for various informations, including a getting started point. - -## 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 e3e195b..0000000 --- a/crates/parser/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "as3_parser" -version = "1.0.18" -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 6931fe4..0000000 --- a/crates/parser/diagnostics/diagnostic_kind.rs +++ /dev/null @@ -1,77 +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, - UnexpectedDirective = 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, - XmlClosingTagNameMustBeEquals = 1090, -} - -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 dd28ee6..0000000 --- a/crates/parser/diagnostics/diagnostics_english_resources.rs +++ /dev/null @@ -1,76 +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::UnexpectedDirective.id() => "Unexpected directive.".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::XmlClosingTagNameMustBeEquals.id() => "Closing tag name must be equals '{1}'.".into(), - // DiagnosticKind::K.id() => ".".into(), - }; -} 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 b71d433..0000000 --- a/crates/parser/parser/parser.rs +++ /dev/null @@ -1,5428 +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 is_public = self.peek(Token::Public); - let rns = self.parse_opt_reserved_namespace(); - let mut attributes: Vec = vec![]; - if let Some(rns) = rns { - // The public += ns.*; directive - if self.peek(Token::AddAssign) && is_public { - return self.parse_package_concat_directive(&rns.location(), context); - } - - // 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_package_concat_directive(&mut self, start: &Location, context: ParserDirectiveContext) -> (Rc, bool) { - self.push_location(start); - self.next(); - let mut package_name: Vec<(String, Location)> = vec![self.expect_identifier(false)]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - - 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 if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(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::PackageConcatDirective(PackageConcatDirective { - location: self.pop_location(), - package_name, - import_specifier, - })); - - if !(matches!(context, ParserDirectiveContext::PackageBlock)) { - self.add_syntax_error(&node.location(), DiagnosticKind::UnexpectedDirective, vec![]); - } - - (node, semicolon) - } - - 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 if self.peek(Token::Power) { - import_specifier = ImportSpecifier::Recursive(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. - // - // Note that interface methods must never have a body unlike in Java. - if (interface_method || has_native || has_abstract) && common.body.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainBody, diagarg![]); - } else if !(interface_method || 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::UnexpectedDirective, 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_1 = self.parse_xml_name(); - let closing_name_1 = self.process_mxml_tag_name(name_1, &namespace); - if let Ok(equal) = name.equals_name(&closing_name_1, &namespace) { - if !equal { - self.add_syntax_error(&closing_name_1.location, DiagnosticKind::XmlClosingTagNameMustBeEquals, diagarg![name.to_string(&namespace)]); - } - } - closing_name = Some(closing_name_1); - 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.non_greedy_expect_and_ie_xml_content(Token::XmlLtSlash); - if !self.tokenizer.characters().has_remaining() { - break; - } - } else if self.peek(Token::XmlLtSlash) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Eof, self.token.0.clone()]); - self.next_ie_xml_tag(); - let _ = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - 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 c1fb275..0000000 --- a/crates/parser/parser/tokenizer.rs +++ /dev/null @@ -1,1307 +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 e18f45d..0000000 --- a/crates/parser/tree.rs +++ /dev/null @@ -1,165 +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::*; -mod package_concat_directive; -pub use package_concat_directive::*; -mod directive_injection_node; -pub use directive_injection_node::*; - -// 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 2f0af6d..0000000 --- a/crates/parser/tree/directive.rs +++ /dev/null @@ -1,82 +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), - PackageConcatDirective(PackageConcatDirective), - DirectiveInjection(DirectiveInjectionNode), - 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::PackageConcatDirective(d) => d.location.clone(), - Self::DirectiveInjection(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/directive_injection_node.rs b/crates/parser/tree/directive_injection_node.rs deleted file mode 100644 index bb73b64..0000000 --- a/crates/parser/tree/directive_injection_node.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Node that allows modification to the directive sequence. -#[derive(Clone, Serialize, Deserialize)] -pub struct DirectiveInjectionNode { - pub location: Location, - pub directives: RefCell>>, -} \ 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 40b6cdf..0000000 --- a/crates/parser/tree/import_directive.rs +++ /dev/null @@ -1,27 +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), - Recursive(Location), - Identifier((String, Location)), -} - -impl ImportSpecifier { - pub fn location(&self) -> Location { - match self { - Self::Wildcard(l) | - Self::Recursive(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 d7dfbca..0000000 --- a/crates/parser/tree/mxml.rs +++ /dev/null @@ -1,217 +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, -} - -impl MxmlElement { - pub fn inner_text(&self) -> String { - let mut j = String::new(); - if let Some(c) = self.content.as_ref() { - for c1 in c.iter() { - j.push_str(&c1.inner_text()); - } - } - j - } -} - -#[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) - } - - pub fn to_string(&self, namespace: &Rc) -> String { - self.resolve_name(namespace).map(|(uri, localname)| { - if uri.is_empty() { - return localname; - } - format!("{uri}:{localname}") - }).unwrap_or("[error]".into()) - } -} - -#[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(), - } - } - - pub fn inner_text(&self) -> String { - match self { - Self::Characters((data, _)) => data.clone(), - Self::CData((data, _)) => data[" String::new(), - Self::ProcessingInstruction { .. } => String::new(), - Self::Element(e) => e.inner_text(), - } - } -} - -/// 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_concat_directive.rs b/crates/parser/tree/package_concat_directive.rs deleted file mode 100644 index dfed500..0000000 --- a/crates/parser/tree/package_concat_directive.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `public += ns.*;` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageConcatDirective { - pub location: Location, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} \ 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 f65afa6..0000000 --- a/crates/parser/tree/tree_semantics.rs +++ /dev/null @@ -1,230 +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, - InitializerField, - 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, - InitializerField, - 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 ba62f77..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" } -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 7614571..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" } -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..7d8639186a4c0764ede25eea89f30bafa90c9beb GIT binary patch literal 2513440 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%0Ad;U14>f;CeZ_RbFumDg#^SIA{x9pEKQI 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

2A{C853&BD(V_qd9EDyaNd2Xz50-@aGU5xkV_P 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


#3>Q?r7Cs2x{)GDDiceHT` zG2qNtVtuu@wB|jv)~120n%wEbn?qzFR-b#C_b)qYHvV5At)u+%4%J-qBTn*>jz!!$u9eJhS%Go7lX+ zP8#QN4F%UvWLEtK1iCP;zW?=1Gmp-v5#m0YZ^&chFg3khL zsv){oiW?48=-14a|FH@;kj#hZs;(xV;$)s*)au?gGcRMS;8^=T$Gox)F|VUle@W8) z6Eo4bx)SYeU~~U;#pC+U%V=VZ4p}YY<8&Hu9C$OV#vtTQ|FKzQQ}kX_Ys%8V-UGQj0p;r_#0xxL=)<3o)sd+)=hA(P0 z1{T);noYGE5($E8HzX1S!DU;3<1eZ4Pg$oI-PP_t- z-%W|=LqLCztOVJ$y7|X{JOb*IKhOzx2*lMFtl!-m^oMufdCacs4BNFyHVGFl^<-`c`c2N&;$eIKG$n~r?Cw)T z$<9HI-DrMnY?;{UE8#pw*1eyWFcZ4=?Lm9At^}P8&c;Sfjo&)$+4qz-xUTLRi!2WA8 zf!ARCNxQaqB+6@D9YuG<&XBc{KPSp|{P;?E*qm7TpD`bQ71*ep{xq!n<=q=IZjJUJ zSYTs1@}IG#W4x|Oz@0O6M>{qdxG0I|vAa>u)rskQ5%@Amp#(~w7OjT(So(? zZ)Di`Q#^5>#@y&o!N%yXuWr!61RK>HNOUMMpHSYiu^NJ-x%%H^sk!ujP8##Oaa5E8rtWBLNc%m@|6}1w zXwHVjC&AR_?0QBZegv>i=_sy4&BVy>4t8RbsPpqa(1<2VgyK zm-#R2Y^v=>Z%-o)+P&L9%_cECf9^kjpPA`6PLh-CG;x|b&73Wq=1vQzrIX^ca#}lW zoVHFoCzZeAo$j=EGT3%-Iy#-4&Q2GntFxt(>2!0pa<+CtPIsq=)6?nY^mh6+d2cBflih)$Qg{(|6Ab=-ws)iG7Y!Bu{4L8m&4c&ceZmzI3t}=&i0$g_tDM{ z3IBF<8v8HJ8RP7Pe>*#4opH`C&Uj~nv#Yb4vpceh&Ln3KXHRFcvzN2CGsT(e?Bh&x zraLp7na(U{UuQpOe`mHc$C>LK;2h{=JM*laVQ0RR

iNZ%VLN>Kt5yrLr1i)mv2VR5+E+BIgiiu~X$N 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 ulJcl2L$*M2^PML1`u!5d@Y;F>Rzq{?Jr8-M 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 z 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 VSHoa=>, - 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/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 d7c7409..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" } - -[[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