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

- - - - - - -

- -ActionScript 3 parser in the Rust language. - -[Online demo](https://hydroper.github.io/as3parser/demo) - -## Documentation - -[Getting started](docs/getting-started.md) - -[Working with Diagnostics](docs/diagnostics.md) - -[Working with Locations](docs/locations.md) - -[Working with MXML](docs/working-with-mxml.md) - -[Working with CSS](docs/working-with-css.md) - -[Attaching Meaning](docs/attaching-meaning.md) - -[Reference Documents](docs/references.md) - -[New Syntax](docs/new-syntax.md) - -[Processing Deviations](docs/processing-deviations.md) - -[Building a Compiler](docs/building-a-compiler.md) - -## Wiki - -The [wiki](https://github.com/hydroper/as3parser/wiki) of this repository contains other introductory articles. - -## License - -Apache License 2.0, copyright 2024 Hydroper diff --git a/as3/promise/AggregateError.as b/as3/promise/AggregateError.as deleted file mode 100644 index c09f54c..0000000 --- a/as3/promise/AggregateError.as +++ /dev/null @@ -1,10 +0,0 @@ -package { - public class AggregateError extends Error { - public var errors: Array; - - public function AggregateError(errors: Array, message: String = "") { - super(message); - this.errors = errors.slice(0); - } - } -} \ No newline at end of file diff --git a/as3/promise/Promise.as b/as3/promise/Promise.as deleted file mode 100644 index 147b551..0000000 --- a/as3/promise/Promise.as +++ /dev/null @@ -1,354 +0,0 @@ -package { - import flash.utils.setTimeout; - import __AS3__.promise.*; - - /** - * The Promise object represents the eventual completion (or failure) - * of an asynchronous operation and its resulting value. - * - * For more information, consult [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise). - * - * # Examples - * - * ``` - * const promise = new Promise.<*>(function(resolve: Function, reject: Function): void { - * // - * }); - * - * promise - * .then(function(): * {}) - * .catch(function(error: *): * {}) - * .finally(function(): void {}); - * ``` - */ - public final class Promise. { - // Implementation based on - // https://github.com/taylorhakes/promise-polyfill - - private var m_state:Number = 0; - private var m_handled:Boolean = false; - private var m_value:* = undefined; - private var m_deferreds:Vector. = new Vector.; - - private static function bindFunction(fn:Function, thisArg:*):Function { - return function(...argumentsList):void { - fn.apply(thisArg, argumentsList); - }; - } - - public function Promise(fn: Function) { - doResolve(fn, this); - } - - private static function handle(self:Promise., deferred:PromiseHandler):void { - while (self.m_state === 3) { - self = self.m_value; - } - if (self.m_state === 0) { - self.m_deferreds.push(deferred); - return; - } - self.m_handled = true; - Promise.._immediateFn(function():void { - var cb:Function = self.m_state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self.m_state === 1 ? Promise..privateResolve : Promise..privateReject)(deferred.promise, self.m_value); - return; - } - var ret:* = undefined; - try { - ret = cb(self.m_value); - } - catch (e:*) { - Promise..privateReject(deferred.promise, e); - return; - } - Promise..privateResolve(deferred.promise, ret); - }); - } - - private static function privateResolve(self:Promise., newValue:*):void { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) { - throw new TypeError('A promise cannot be resolved with itself.'); - } - if (newValue is Promise) { - self.m_state = 3; - self.m_value = newValue; - Promise..finale(self); - return; - } - self.m_state = 1; - self.m_value = newValue; - Promise..finale(self); - } - catch (e:*) { - Promise..privateReject(self, e); - } - } - - private static function privateReject(self:Promise., newValue:*):void { - self.m_state = 2; - self.m_value = newValue; - Promise..finale(self); - } - - private static function finale(self:Promise.):void { - if (self.m_state === 2 && self.m_deferreds.length === 0) { - Promise.._immediateFn(function():void { - if (!self.m_handled) { - Promise.._unhandledRejectionFn(self.m_value); - } - }); - } - - for (var i:Number = 0, len:Number = self.m_deferreds.length; i < len; i++) { - handle(self, self.m_deferreds[i]); - } - self.m_deferreds = null; - } - - /** - * Takes a potentially misbehaving resolver function and make sure - * `onFulfilled` and `onRejected` are only called once. - * - * Makes no guarantees about asynchrony. - */ - private static function doResolve(fn:Function, self:Promise.):void { - var done:Boolean = false; - try { - fn( - function(value:*):* { - if (done) return; - done = true; - Promise..privateResolve(self, value); - }, - function(reason:*):* { - if (done) return; - done = true; - Promise..privateReject(self, reason); - } - ); - } - catch (ex:*) { - if (done) return; - done = true; - Promise..privateReject(self, ex); - } - } - - /** - * The `Promise.allSettled()` static method takes an iterable of promises - * as input and returns a single Promise. - * This returned promise fulfills when all of the input's promises settle - * (including when an empty iterable is passed), with an array of objects that - * describe the outcome of each promise. - * - * # Example - * - * ``` - * const promise1 = Promise..resolve(3); - * const promise2 = new Promise.(function(resolve: Function, reject: Function): void { - * setTimeout(reject, 100, "foo"); - * }); - * Promise..allSettled([promise1, promise2]) - * .then(function(results: Array): void { - * for each (const result in results) { - * trace(result.status); - * } - * }); - * // Expected output: - * // "fulfilled" - * // "rejected" - * ``` - * - * @return A `Promise` that is: - * - * - **Already fulfilled,** if the iterable passed is empty. - * - **Asynchronously fulfilled,** when all promises in the given - * iterable have settled (either fulfilled or rejected). - * The fulfillment value is an array of objects, each describing the - * outcome of one promise in the iterable, in the order of the promises passed, - * regardless of completion order. Each outcome object has the following properties: - * - `status`: A string, either `"fulfilled"` or `"rejected"`, indicating the eventual state of the promise. - * - `value`: Only present if `status` is `"fulfilled"`. The value that the promise was fulfilled with. - * - `reason`: Only present if `status` is `"rejected"`. The reason that the promise was rejected with. - * - * If the iterable passed is non-empty but contains no pending promises, - * the returned promise is still asynchronously (instead of synchronously) fulfilled. - */ - public static function allSettled(promises: Array): Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - function res(i:Number, val:*):void { - if (val is Promise) { - Promise(val).then( - function(val:*):* { - res(i, val); - }, - function(e:*):* { - args[i] = { status: 'rejected', reason: e }; - if (--remaining === 0) { - resolve(args); - } - } - ); - return; - } - args[i] = { status: 'fulfilled', value: val }; - if (--remaining === 0) { - resolve(args); - } - } - for (var i:Number = 0; i < args.length; ++i) { - res(i, args[i]); - } - }); - } // allSettled - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/any) - */ - public static function any(promises:Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - reject(undefined); - return; - } - var rejectionReasons:Array = []; - for (var i:Number = 0; i < args.length; ++i) { - try { - Promise..resolve(args[i]) - .then(resolve) - .catch(function(error:*):* { - rejectionReasons.push(error); - if (rejectionReasons.length === args.length) { - reject( - new AggregateError( - rejectionReasons, - 'All promises were rejected' - ) - ); - } - }); - } - catch (ex:*) { - reject(ex); - } - } - }); - } // any - - public function finally(callback:Function):Promise. { - return this.then( - function(value:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return value; - }); - }, - function(reason:*):* { - return Promise..resolve(callback()).then(function(_:*):* { - return Promise..reject(reason); - }); - } - ); - } - - public function catch(onRejected: Function):Promise. { - return this.then(null, onRejected); - } - - public function then(onFulfilled: function(T): U, onRejected: function(*): E = null):Promise.<*> { - var prom = new Promise.<*>(function(_a:*, _b:*):void {}); - Promise..handle(this, new PromiseHandler(onFulfilled, onRejected, prom)); - return prom; - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all) - */ - public static function all(promises: Array):Promise. { - return new Promise(function(resolve:Function, reject:Function):void { - var args:Array = promises.slice(0); - if (args.length === 0) { - resolve([]); - return; - } - var remaining:Number = args.length; - - function res(i:Number, val:*):void { - try { - if (val is Promise) { - Promise(val).then( - function(val): * { - res(i, val); - }, - reject - ); - return; - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } - catch (ex:*) { - reject(ex); - } - } - - for (var i:Number = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - } // all - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve) - */ - public static function resolve(value: *):Promise. { - if (value is Promise) { - return Promise.(value); - } - - return new Promise.(function(resolve: Function, reject: Function): void { - resolve(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject) - */ - public static function reject(value: *): Promise. { - return new Promise(function(resolve: Function, reject: Function): void { - reject(value); - }); - } - - /** - * [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/race) - */ - public static function race(promises:Array):Promise. { - return new Promise.(function(resolve:Function, reject:Function):void { - for each (var arg:* in promises) { - Promise..resolve(arg).then(resolve, reject); - } - }); - } - - private static function _immediateFn(fn:Function):void { - setTimeout(fn, 0); - } - - private static function _unhandledRejectionFn(err:*):void { - trace("Possible unhandled Promise rejection:", err); - } - } -} diff --git a/as3/promise/PromiseHandler.as b/as3/promise/PromiseHandler.as deleted file mode 100644 index 708f554..0000000 --- a/as3/promise/PromiseHandler.as +++ /dev/null @@ -1,16 +0,0 @@ -package __AS3__.promise { - /** - * @private - */ - public final class PromiseHandler { - public var onFulfilled: Function; - public var onRejected: Function; - public var promise: Promise; - - public function PromiseHandler(onFulfilled: Function, onRejected: Function, promise: Promise) { - this.onFulfilled = onFulfilled; - this.onRejected = onRejected; - this.promise = promise; - } - } -} diff --git a/crates/parser/Cargo.toml b/crates/parser/Cargo.toml deleted file mode 100644 index a1f551d..0000000 --- a/crates/parser/Cargo.toml +++ /dev/null @@ -1,34 +0,0 @@ -[package] -name = "as3_parser" -version = "1.0.8" -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 e03cb70..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, - DirectiveNotAllowedInInterface = 1058, - FailedParsingAsDocTag = 1059, - UnrecognizedAsDocTag = 1060, - UnrecognizedProxy = 1061, - EnumMembersMustBeConst = 1062, - ConstructorMustNotSpecifyResultType = 1063, - UnrecognizedMetadataSyntax = 1064, - FailedToIncludeFile = 1065, - ParentSourceIsNotAFile = 1066, - CircularIncludeDirective = 1067, - MalformedDestructuring = 1068, - XmlPrefixNotDefined = 1069, - RedefiningXmlAttribute = 1070, - InvalidXmlPi = 1071, - XmlPiUnknownAttribute = 1072, - XmlPiVersion = 1073, - XmlPiEncoding = 1074, - XmlMustConsistOfExactly1Element = 1075, - XmlNameAtMostOneColon = 1076, - UnexpectedCharacter = 1077, - InputEndedBeforeReachingClosingQuoteForString = 1078, - InputEndedBeforeReachingClosingSeqForCData = 1079, - InputEndedBeforeReachingClosingSeqForPi = 1080, - InputEndedBeforeReachingClosingSeqForXmlComment = 1081, - InputEndedBeforeReachingClosingSeqForMultiLineComment = 1082, - InputEndedBeforeReachingClosingSlashForRegExp = 1083, - InputEndedBeforeReachingClosingQuoteForAttributeValue = 1084, - ExpectingEitherSemicolonOrNewLineHere = 1085, - CssInvalidHexEscape = 1086, - ExpectingDirective = 1087, - ExpectingStatement = 1088, - Unexpected = 1089, - 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 192a7e7..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::DirectiveNotAllowedInInterface.id() => "Directive not allowed in interface.".into(), - DiagnosticKind::FailedParsingAsDocTag.id() => "Failed parsing contents of ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedAsDocTag.id() => "Unrecognized ASDoc tag: '@{1}'.".into(), - DiagnosticKind::UnrecognizedProxy.id() => "Unrecognized proxy: '{1}'.".into(), - DiagnosticKind::EnumMembersMustBeConst.id() => "Enumeration members must be 'const'.".into(), - DiagnosticKind::UnrecognizedMetadataSyntax.id() => "Unrecognized meta-data syntax.".into(), - DiagnosticKind::FailedToIncludeFile.id() => "Failed to include file.".into(), - DiagnosticKind::ParentSourceIsNotAFile.id() => "Parent source is not a file.".into(), - DiagnosticKind::CircularIncludeDirective.id() => "Circular include directive.".into(), - DiagnosticKind::MalformedDestructuring.id() => "Malformed destructuring.".into(), - DiagnosticKind::XmlPrefixNotDefined.id() => "Prefix not defined: '{1}'.".into(), - DiagnosticKind::RedefiningXmlAttribute.id() => "Redefining attribute: '{1}'.".into(), - DiagnosticKind::InvalidXmlPi.id() => "Invalid processing instruction.".into(), - DiagnosticKind::XmlPiUnknownAttribute.id() => "Unknown attribute at processing instruction: '{1}'.".into(), - DiagnosticKind::XmlPiVersion.id() => "XML version must be '1.0'.".into(), - DiagnosticKind::XmlPiEncoding.id() => "XML encoding must be either 'utf-8' or 'utf-16'.".into(), - DiagnosticKind::XmlMustConsistOfExactly1Element.id() => "Document must consist of exactly one element.".into(), - DiagnosticKind::XmlNameAtMostOneColon.id() => "XML name may have at most one colon.".into(), - DiagnosticKind::UnexpectedCharacter.id() => "Unexpected character. '{1}' is not allowed here".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString.id() => "Input ended before reaching the closing quotation mark for a string literal.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData.id() => "Input ended before reaching the closing ']]>' for a CDATA.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi.id() => "Input ended before reaching the closing '?>' for a processing instruction.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment.id() => "Input ended before reaching the closing '-->' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment.id() => "Input ended before reaching the closing '*/' for a comment.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp.id() => "Input ended before reaching the closing slash for a regular expression.".into(), - DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue.id() => "Input ended before reaching the closing quotation mark for an attribute value.".into(), - DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere.id() => "Expecting either a semicolon or a new line here.".into(), - DiagnosticKind::CssInvalidHexEscape.id() => "Invalid hexadecimal escape: '\\{1}'.".into(), - DiagnosticKind::ExpectingDirective.id() => "Expecting directive before {1}.".into(), - DiagnosticKind::ExpectingStatement.id() => "Expecting statement before {1}.".into(), - DiagnosticKind::Unexpected.id() => "Unexpected {1}.".into(), - DiagnosticKind::XmlClosingTagNameMustBeEquals.id() => "Closing tag name must be equals '{1}'.".into(), - // DiagnosticKind::K.id() => ".".into(), - }; -} \ No newline at end of file diff --git a/crates/parser/lib.rs b/crates/parser/lib.rs deleted file mode 100644 index c82a279..0000000 --- a/crates/parser/lib.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![feature(decl_macro)] -#![feature(try_blocks)] - -pub mod tree; -pub mod compilation_unit; -pub mod diagnostics; -pub mod operator; -pub mod parser; -pub mod util; - -pub mod ns; \ No newline at end of file diff --git a/crates/parser/ns.rs b/crates/parser/ns.rs deleted file mode 100644 index 09adc4b..0000000 --- a/crates/parser/ns.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! The `ns` module is an union of all of the parser modules. - -pub use crate::tree::*; -pub use crate::compilation_unit::*; -pub use crate::diagnostics::*; -pub use crate::operator::*; -pub use crate::parser::*; -pub use crate::util::*; \ No newline at end of file diff --git a/crates/parser/operator.rs b/crates/parser/operator.rs deleted file mode 100644 index bbad3db..0000000 --- a/crates/parser/operator.rs +++ /dev/null @@ -1,6 +0,0 @@ -//! Defines the ActionScript 3 operators. - -mod operator; -pub use operator::*; -mod operator_precedence; -pub use operator_precedence::*; \ No newline at end of file diff --git a/crates/parser/operator/operator.rs b/crates/parser/operator/operator.rs deleted file mode 100644 index 69cd19a..0000000 --- a/crates/parser/operator/operator.rs +++ /dev/null @@ -1,127 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents an ActionScript operator. -#[derive(Copy, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)] -pub enum Operator { - PostIncrement, - PostDecrement, - NonNull, - Delete, - Void, - Typeof, - Await, - Yield, - PreIncrement, - PreDecrement, - Positive, - Negative, - BitwiseNot, - LogicalNot, - - Power, - Multiply, - Divide, - Remainder, - Add, - Subtract, - ShiftLeft, - ShiftRight, - ShiftRightUnsigned, - Lt, - Gt, - Le, - Ge, - Instanceof, - In, - NotIn, - Is, - IsNot, - As, - Equals, - NotEquals, - StrictEquals, - StrictNotEquals, - BitwiseAnd, - BitwiseXor, - BitwiseOr, - LogicalAnd, - LogicalXor, - LogicalOr, - NullCoalescing, -} - -/// Represents binary operator associativity. -#[derive(Copy, Clone, PartialEq, Eq)] -pub enum BinaryAssociativity { - LeftToRight, - RightToLeft, -} - -/// Represents an ActionScript binary operator. -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct BinaryOperator(pub Operator, pub OperatorPrecedence, pub BinaryAssociativity); - -impl BinaryOperator { - pub fn operator(&self) -> Operator { - self.0 - } - - pub fn precedence(&self) -> OperatorPrecedence { - self.1 - } - - pub fn associativity(&self) -> BinaryAssociativity { - self.2 - } - - pub fn right_precedence(&self) -> OperatorPrecedence { - if self.operator() == Operator::NullCoalescing { - OperatorPrecedence::BitwiseOr - } else { - self.precedence().add(if self.associativity() == BinaryAssociativity::LeftToRight { 1 } else { 0 }).unwrap() - } - } -} - -impl TryFrom for BinaryOperator { - type Error = (); - /// Constructs `BinaryOperator` from abstract operator. - fn try_from(value: Operator) -> Result { - match value { - Operator::Multiply => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Divide => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Remainder => Ok(BinaryOperator(value, OperatorPrecedence::Multiplicative, BinaryAssociativity::LeftToRight)), - Operator::Add => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::Subtract => Ok(BinaryOperator(value, OperatorPrecedence::Additive, BinaryAssociativity::LeftToRight)), - Operator::ShiftLeft => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRight => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::ShiftRightUnsigned => Ok(BinaryOperator(value, OperatorPrecedence::Shift, BinaryAssociativity::LeftToRight)), - Operator::Lt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Gt => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Le => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Ge => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::As => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::In => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::NotIn => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Instanceof => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Is => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::IsNot => Ok(BinaryOperator(value, OperatorPrecedence::Relational, BinaryAssociativity::LeftToRight)), - Operator::Equals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::NotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::StrictNotEquals => Ok(BinaryOperator(value, OperatorPrecedence::Equality, BinaryAssociativity::LeftToRight)), - Operator::BitwiseAnd => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseAnd, BinaryAssociativity::LeftToRight)), - Operator::BitwiseXor => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseXor, BinaryAssociativity::LeftToRight)), - Operator::BitwiseOr => Ok(BinaryOperator(value, OperatorPrecedence::BitwiseOr, BinaryAssociativity::LeftToRight)), - Operator::LogicalAnd => Ok(BinaryOperator(value, OperatorPrecedence::LogicalAnd, BinaryAssociativity::LeftToRight)), - Operator::LogicalXor => Ok(BinaryOperator(value, OperatorPrecedence::LogicalXor, BinaryAssociativity::LeftToRight)), - Operator::LogicalOr => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - Operator::NullCoalescing => Ok(BinaryOperator(value, OperatorPrecedence::LogicalOrAndOther, BinaryAssociativity::LeftToRight)), - - Operator::Power => Ok(BinaryOperator(value, OperatorPrecedence::Exponentiation, BinaryAssociativity::RightToLeft)), - - _ => Err(()), - } - } -} \ No newline at end of file diff --git a/crates/parser/operator/operator_precedence.rs b/crates/parser/operator/operator_precedence.rs deleted file mode 100644 index 68b0abe..0000000 --- a/crates/parser/operator/operator_precedence.rs +++ /dev/null @@ -1,77 +0,0 @@ -use num_derive::FromPrimitive; -use num_traits::FromPrimitive; - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum OperatorPrecedence { - Postfix = 16, - Unary = 15, - Exponentiation = 14, - Multiplicative = 13, - Additive = 12, - Shift = 11, - Relational = 10, - Equality = 9, - BitwiseAnd = 8, - BitwiseXor = 7, - BitwiseOr = 6, - LogicalAnd = 5, - LogicalXor = 4, - /// Includes logical OR and nullish coalescing (`??`). - LogicalOrAndOther = 3, - /// Includes assignment operators, conditional operator, function expression and `yield` operator. - AssignmentAndOther = 2, - List = 1, -} - -impl OperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for OperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} - -#[derive(FromPrimitive)] -#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] -#[repr(u32)] -pub enum CssOperatorPrecedence { - Unary = 3, - MultiValue = 2, - Array = 1, -} - -impl CssOperatorPrecedence { - pub fn add(&self, value: u32) -> Option { - FromPrimitive::from_u32(*self as u32 + value) - } - - pub fn value_of(&self) -> u32 { - *self as u32 - } - - pub fn includes(&self, other: &Self) -> bool { - *self <= *other - } -} - -impl TryFrom for CssOperatorPrecedence { - type Error = (); - fn try_from(value: u32) -> Result { - if let Some(v) = FromPrimitive::from_u32(value as u32) { Ok(v) } else { Err(()) } - } -} \ No newline at end of file diff --git a/crates/parser/parser.rs b/crates/parser/parser.rs deleted file mode 100644 index 897a3e2..0000000 --- a/crates/parser/parser.rs +++ /dev/null @@ -1,23 +0,0 @@ -//! Defines the parser and the tokenizer. -//! -//! Using the methods of the `ParserFacade` structure is the most common way of parsing -//! programs until end-of-file. - -mod character_validator; -pub use character_validator::*; -mod context; -pub use context::*; -mod reserved_word; -pub use reserved_word::*; -mod parser; -pub use parser::*; -mod css_parser; -pub use css_parser::*; -mod css_tokenizer; -pub use css_tokenizer::*; -mod parser_error; -pub use parser_error::*; -mod token; -pub use token::*; -mod tokenizer; -pub use tokenizer::*; \ No newline at end of file diff --git a/crates/parser/parser/character_validator.rs b/crates/parser/parser/character_validator.rs deleted file mode 100644 index ef06b61..0000000 --- a/crates/parser/parser/character_validator.rs +++ /dev/null @@ -1,147 +0,0 @@ -//use lazy_regex::{Lazy, Regex, lazy_regex}; -use unicode_general_category::{get_general_category, GeneralCategory}; - -// pub(crate) static CR_OR_CRLF_REGEX: Lazy = lazy_regex!(r"\r\n?"); - -/// The `CharacterValidator` structure defines static methods for character -/// validation. -pub struct CharacterValidator; - -impl CharacterValidator { - /// Returns the count of indentation characters in a string. - pub fn indent_count(string: &str) -> usize { - let mut n: usize = 0; - for ch in string.chars() { - if !CharacterValidator::is_whitespace(ch) { - break; - } - n += 1; - } - n - } - - pub fn is_whitespace(ch: char) -> bool { - if ch == '\x20' || ch == '\x09' || ch == '\x08' - || ch == '\x0C' || ch == '\u{A0}' { - return true; - } - let category = get_general_category(ch); - category == GeneralCategory::SpaceSeparator - } - - pub fn is_line_terminator(ch: char) -> bool { - ch == '\x0A' || ch == '\x0D' || ch == '\u{2028}' || ch == '\u{2029}' - } - - pub fn is_bin_digit(ch: char) -> bool { - ch == '\x30' || ch == '\x31' - } - - pub fn is_dec_digit(ch: char) -> bool { - ch >= '\x30' && ch <= '\x39' - } - - pub fn is_hex_digit(ch: char) -> bool { - CharacterValidator::is_dec_digit(ch) || (ch >= '\x41' && ch <= '\x46') || (ch >= '\x61' && ch <= '\x66') - } - - /// Returns the mathematical value of a hexadecimal digit. - pub fn hex_digit_mv(ch: char) -> Option { - if ch >= 'A' && ch <= 'F' { - Some((ch as u32) - 0x41 + 10) - } else if ch >= 'a' && ch <= 'f' { - Some((ch as u32) - 0x61 + 10) - } else if ch >= '0' && ch <= '9' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - /// Returns the mathematical value of a binary digit. - pub fn bin_digit_mv(ch: char) -> Option { - if ch >= '0' && ch <= '1' { - Some((ch as u32) - 0x30) - } else { - None - } - } - - pub fn is_css_identifier_start(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') - } - - pub fn is_css_identifier_part(ch: char) -> bool { - (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' - } - - pub fn is_identifier_start(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_identifier_part(ch: char) -> bool { - if ch == '\x5f' || ch == '\x24' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::NonspacingMark, - GeneralCategory::SpacingMark, - GeneralCategory::ConnectorPunctuation, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_name_start(ch: char) -> bool { - if ch == '\x5f' || ch == ':' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - ].contains(&category) - } - - pub fn is_xml_name_part(ch: char) -> bool { - if ch == '\x5f' || ch == ':' || ch == '.' || ch == '-' { - return true; - } - let category = get_general_category(ch); - [ - GeneralCategory::LowercaseLetter, - GeneralCategory::UppercaseLetter, - GeneralCategory::ModifierLetter, - GeneralCategory::OtherLetter, - GeneralCategory::TitlecaseLetter, - GeneralCategory::LetterNumber, - GeneralCategory::DecimalNumber, - ].contains(&category) - } - - pub fn is_xml_whitespace(ch: char) -> bool { - ch == '\x20' || ch == '\x09' || ch == '\x0A' || ch == '\x0D' - } -} \ No newline at end of file diff --git a/crates/parser/parser/context.rs b/crates/parser/parser/context.rs deleted file mode 100644 index 3132d5b..0000000 --- a/crates/parser/parser/context.rs +++ /dev/null @@ -1,174 +0,0 @@ -use crate::ns::*; - -/// Context used to control the parsing of an expression. -#[derive(Clone)] -pub struct ParserExpressionContext { - pub min_precedence: OperatorPrecedence, - pub allow_in: bool, - pub allow_assignment: bool, -} - -impl Default for ParserExpressionContext { - fn default() -> Self { - Self { - min_precedence: OperatorPrecedence::List, - allow_in: true, - allow_assignment: true, - } - } -} - -#[derive(Clone)] -pub enum ParserDirectiveContext { - Default, - TopLevel, - PackageBlock, - ClassBlock { - name: String, - }, - InterfaceBlock, - EnumBlock, - ConstructorBlock { - super_statement_found: Rc>, - }, - WithControl { - super_statement_found: Option>>, - to_be_labeled: Option, - control_context: ParserControlFlowContext, - labels: HashMap, - }, -} - -impl ParserDirectiveContext { - pub fn may_contain_super_statement(&self) -> bool { - matches!(self, Self::ConstructorBlock { .. }) || matches!(self, Self::WithControl { .. }) - } - - pub fn super_statement_found(&self) -> bool { - match self { - Self::ConstructorBlock { super_statement_found } => super_statement_found.get(), - Self::WithControl { super_statement_found, .. } => super_statement_found.as_ref().or(Some(&Rc::new(Cell::new(false)))).unwrap().get(), - _ => false, - } - } - - pub fn set_super_statement_found(&self, value: bool) { - match self { - Self::ConstructorBlock { super_statement_found } => { super_statement_found.set(value) }, - Self::WithControl { super_statement_found, .. } => { - if let Some(found) = super_statement_found.as_ref() { - found.set(value); - } - }, - _ => {}, - } - } - - pub fn function_name_is_constructor(&self, name: &(String, Location)) -> bool { - if let ParserDirectiveContext::ClassBlock { name: ref name_1 } = self { - &name.0 == name_1 - } else { - false - } - } - - pub fn is_top_level_or_package(&self) -> bool { - matches!(self, ParserDirectiveContext::TopLevel) || matches!(self, ParserDirectiveContext::PackageBlock) - } - - pub fn is_type_block(&self) -> bool { - match self { - Self::ClassBlock { .. } | - Self::InterfaceBlock | - Self::EnumBlock => true, - _ => false, - } - } - - pub fn clone_control(&self) -> Self { - match self { - Self::WithControl { .. } => self.clone(), - _ => Self::Default, - } - } - - pub fn override_control_context(&self, label_only: bool, mut context: ParserControlFlowContext) -> Self { - let mut prev_context = None; - let mut label = None; - let mut super_statement_found: Option>> = None; - let mut labels = match self { - Self::WithControl { control_context, labels, to_be_labeled: label1, super_statement_found: super_found_1 } => { - prev_context = Some(control_context.clone()); - label = label1.clone(); - super_statement_found = super_found_1.clone(); - labels.clone() - }, - _ => HashMap::new(), - }; - if let Some(label) = label.clone() { - labels.insert(label, context.clone()); - } - if label_only { - context = prev_context.unwrap_or(ParserControlFlowContext { - breakable: false, - iteration: false, - }); - } - Self::WithControl { control_context: context, labels, to_be_labeled: None, super_statement_found } - } - - pub fn put_label(&self, label: String) -> Self { - match self { - Self::WithControl { control_context, labels, to_be_labeled: _, super_statement_found } => Self::WithControl { - to_be_labeled: Some(label), - control_context: control_context.clone(), - labels: labels.clone(), - super_statement_found: super_statement_found.clone(), - }, - _ => Self::WithControl { - to_be_labeled: Some(label), - control_context: ParserControlFlowContext { - breakable: false, - iteration: false, - }, - labels: HashMap::new(), - super_statement_found: match self { - Self::ConstructorBlock { super_statement_found } => Some(super_statement_found.clone()), - _ => None, - }, - }, - } - } - - pub fn is_label_defined(&self, label: String) -> bool { - self.resolve_label(label).is_some() - } - - pub fn resolve_label(&self, label: String) -> Option { - if let Self::WithControl { labels, .. } = &self { labels.get(&label).map(|c| c.clone()) } else { None } - } - - pub fn is_break_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.breakable } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.breakable } else { false } - } - } - - pub fn is_continue_allowed(&self, label: Option) -> bool { - if let Some(label) = label { - let context = self.resolve_label(label); - if let Some(context) = context { context.iteration } else { false } - } else { - if let Self::WithControl { control_context, .. } = &self { control_context.iteration } else { false } - } - } -} - -#[derive(Clone)] -pub struct ParserControlFlowContext { - pub breakable: bool, - pub iteration: bool, -} \ No newline at end of file diff --git a/crates/parser/parser/css_parser.rs b/crates/parser/parser/css_parser.rs deleted file mode 100644 index c7f64a1..0000000 --- a/crates/parser/parser/css_parser.rs +++ /dev/null @@ -1,847 +0,0 @@ -use crate::ns::*; -use num_traits::ToPrimitive; - -pub struct CssParser<'input> { - tokenizer: CssTokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - expecting_token_error: bool, -} - -impl<'input> CssParser<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: CssTokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - None - } - } - - fn peek_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_identifier(&mut self) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - None - } - } - - fn consume_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(name1) = self.token.0.clone() { - if name1 == name { - self.next(); - return true; - } - } - false - } - - /// Expects a token in non-greedy mode: if it fails, does not skip any token. - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn expect_identifier(&mut self) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn expect_unitless_number(&mut self) -> Option { - if let Token::CssNumber { value, .. } = self.token.0.clone() { - self.expecting_token_error = false; - self.next(); - Some(value) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - None - } - } - - fn expect_string(&mut self) -> (String, Location) { - if let Token::String(v) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (v, location) - } else { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof); - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(CssDirective::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_property_value(&self, location: &Location) -> Rc { - Rc::new(CssPropertyValue::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn _create_invalidated_selector(&self, location: &Location) -> Rc { - Rc::new(CssSelector::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_selector_condition(&self, location: &Location) -> Rc { - Rc::new(CssSelectorCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_media_query_condition(&self, location: &Location) -> Rc { - Rc::new(CssMediaQueryCondition::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn eof(&self) -> bool { - matches!(self.token.0, Token::Eof) - } - - pub fn parse_document(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut directives: Vec> = vec![]; - while !self.eof() { - directives.push(self.parse_directive()); - } - let loc = self.pop_location(); - Rc::new(CssDocument { - location: if just_eof { - self.token.1.clone() - } else { - loc - }, - directives, - }) - } - - fn parse_directive(&mut self) -> Rc { - if let Some(rule) = self.parse_opt_rule() { - Rc::new(CssDirective::Rule(rule)) - } else if self.peek(Token::CssAtNamespace) { - self.mark_location(); - self.next(); - let prefix = self.expect_identifier(); - let uri = if self.expecting_token_error { - (String::new(), self.tokenizer.cursor_location()) - } else { - self.expect_string() - }; - if !self.expecting_token_error { - self.expect(Token::CssSemicolons); - } - let loc = self.pop_location(); - Rc::new(CssDirective::NamespaceDefinition(CssNamespaceDefinition { - location: loc, - prefix, - uri, - })) - } else if self.peek(Token::CssAtMedia) { - self.parse_media_query() - } else if self.peek(Token::CssAtFontFace) { - self.parse_font_face() - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - let d = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.next(); - d - } - } - - fn parse_media_query(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut conditions: Vec> = vec![]; - let condition = self.parse_opt_media_query_condition(); - if let Some(condition) = condition { - conditions.push(condition); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - loop { - if let Some(condition) = self.parse_opt_media_query_condition() { - conditions.push(condition); - } else if self.eof() || self.peek(Token::BlockOpen) { - break; - } else if !self.consume(Token::Comma) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - let mut rules: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - while !(self.eof() || self.peek(Token::BlockClose)) { - if let Some(rule) = self.parse_opt_rule() { - rules.push(Rc::new(rule)); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.next(); - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::MediaQuery(CssMediaQuery { - location: self.pop_location(), - conditions, - rules, - })) - } - - fn parse_font_face(&mut self) -> Rc { - self.mark_location(); - self.next(); - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - Rc::new(CssDirective::FontFace(CssFontFace { - location: self.pop_location(), - properties, - })) - } - - fn parse_opt_media_query_condition(&mut self) -> Option> { - let mut base: Option> = None; - if self.peek_keyword("only") { - self.mark_location(); - self.next(); - let id = self.expect_identifier(); - base = Some(Rc::new(CssMediaQueryCondition::OnlyId { - location: self.pop_location(), - id, - })); - } - if let Some(id) = self.consume_identifier() { - base = Some(Rc::new(CssMediaQueryCondition::Id(id))); - } - if self.peek(Token::ParenOpen) { - self.mark_location(); - let property = self.parse_arguments().unwrap().parse_property(); - let loc = self.pop_location(); - base = Some(Rc::new(CssMediaQueryCondition::ParenProperty((property, loc)))); - } - if let Some(mut base) = base.clone() { - while self.consume_keyword("and") { - self.push_location(&base.location()); - if let Some(right) = self.parse_opt_media_query_condition() { - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right, - }); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - base = Rc::new(CssMediaQueryCondition::And { - location: self.pop_location(), - left: base, - right: self.create_invalidated_media_query_condition(&self.tokenizer.cursor_location()), - }); - } - } - return Some(base); - } - base - } - - fn parse_arguments(&mut self) -> Result { - if !self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token.1, DiagnosticKind::Expecting, diagarg![Token::ParenOpen, self.token.0.clone()]); - return Err(ParserError::Common); - } - let (byte_range, token) = self.tokenizer.scan_arguments(); - self.previous_token = self.token.clone(); - self.token = token; - self.next(); - Ok(CssParserFacade(self.compilation_unit(), ParserOptions { - byte_range: Some(byte_range), - ..self.options() - })) - } - - fn parse_opt_rule(&mut self) -> Option { - let mut selectors: Vec> = vec![self.parse_opt_selector()?]; - while self.consume(Token::Comma) { - if let Some(s) = self.parse_opt_selector() { - selectors.push(s); - } else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - } - } - let mut properties: Vec> = vec![]; - self.expect(Token::BlockOpen); - if !self.expecting_token_error { - self.consume(Token::CssSemicolons); - while !(self.eof() || self.peek(Token::BlockClose)) { - properties.push(self.parse_property()); - if !self.consume(Token::CssSemicolons) { - break; - } - } - self.expect(Token::BlockClose); - } - self.push_location(&selectors[0].location()); - Some(CssRule { - location: self.pop_location(), - selectors, - properties, - }) - } - - fn parse_opt_selector(&mut self) -> Option> { - let mut base = self.parse_opt_base_selector()?; - - // Parse descendant combinators - while let Some(right) = self.parse_opt_base_selector() { - self.push_location(&base.location()); - base = Rc::new(CssSelector::Combinator(CssCombinatorSelector { - location: self.pop_location(), - left: base, - right, - combinator_type: CssCombinatorType::Descendant, - })); - } - - Some(base) - } - - fn parse_opt_base_selector(&mut self) -> Option> { - self.mark_location(); - let mut namespace_prefix: Option<(String, Location)> = None; - let mut element_name: Option<(String, Location)> = self.consume_identifier(); - let mut conditions: Vec> = vec![]; - if self.consume(Token::Pipe) { - namespace_prefix = element_name.clone(); - element_name = Some(self.expect_identifier()); - } - // Parse conditions as long as they are not separated by whitespace - while (element_name.is_none() && conditions.is_empty()) || (self.token.1.first_offset() - self.previous_token.1.last_offset() == 0) { - if let Some(condition) = self.parse_opt_selector_condition() { - conditions.push(condition); - } else { - break; - } - } - if element_name.is_none() && conditions.is_empty() { - self.pop_location(); - return None; - } - Some(Rc::new(CssSelector::Base(CssBaseSelector { - location: self.pop_location(), - namespace_prefix, - element_name, - conditions, - }))) - } - - fn parse_selector_condition(&mut self) -> Rc { - let Some(c) = self.parse_opt_selector_condition() else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_selector_condition(&self.tokenizer.cursor_location()); - }; - c - } - - fn parse_opt_selector_condition(&mut self) -> Option> { - if self.peek(Token::Dot) { - self.mark_location(); - self.next(); - let class_name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Class((class_name, self.pop_location())))); - } - if let Token::CssHashWord(id_value) = self.token.0.clone() { - let loc = self.token.1.clone(); - self.next(); - return Some(Rc::new(CssSelectorCondition::Id((id_value, loc)))); - } - if self.peek(Token::Colon) { - self.mark_location(); - self.next(); - if self.consume_keyword("not") { - let condition = if let Ok(a) = self.parse_arguments() { - a.parse_selector_condition() - } else { - self.duplicate_location(); - let loc = self.pop_location(); - self.create_invalidated_selector_condition(&loc) - }; - return Some(Rc::new(CssSelectorCondition::Not { - location: self.pop_location(), - condition, - })); - } else { - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::Pseudo((name, self.pop_location())))); - } - } - if self.peek(Token::ColonColon) { - self.mark_location(); - self.next(); - let name = self.expect_identifier().0; - return Some(Rc::new(CssSelectorCondition::PseudoElement((name, self.pop_location())))); - } - if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let name = self.expect_identifier(); - let mut operator: Option = None; - let mut value: Option<(String, Location)> = None; - while let Some(t1) = self.consume_attribute_operator() { - operator = Some(t1); - } - while let Token::String(s1) = self.token.0.clone() { - value = Some((s1, self.token.1.clone())); - self.next(); - } - self.expect(Token::SquareClose); - return Some(Rc::new(CssSelectorCondition::Attribute { - location: self.pop_location(), - name, - operator, - value, - })); - } - None - } - - fn consume_attribute_operator(&mut self) -> Option { - if self.consume(Token::CssBeginsWith) { - Some(CssAttributeOperator::BeginsWith) - } else if self.consume(Token::CssEndsWith) { - Some(CssAttributeOperator::EndsWith) - } else if self.consume(Token::CssContains) { - Some(CssAttributeOperator::Contains) - } else if self.consume(Token::CssListMatch) { - Some(CssAttributeOperator::ListMatch) - } else if self.consume(Token::CssHreflangMatch) { - Some(CssAttributeOperator::HreflangMatch) - } else if self.consume(Token::Assign) { - Some(CssAttributeOperator::Equals) - } else { - None - } - } - - fn parse_property(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(); - let mut value = self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - if !self.expecting_token_error { - self.expect(Token::Colon); - if !self.expecting_token_error { - value = self.parse_property_value(CssOperatorPrecedence::Array); - } - } - Rc::new(CssProperty::new(self.pop_location(), name, value)) - } - - fn parse_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Rc { - let Some(v) = self.parse_opt_property_value(min_precedence) else { - self.add_syntax_error(&self.token.1, DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - return self.create_invalidated_property_value(&self.tokenizer.cursor_location()); - }; - v - } - - fn parse_opt_property_value(&mut self, min_precedence: CssOperatorPrecedence) -> Option> { - let base: Option>; - let t1 = self.token.0.clone(); - - // #HHH - // #HHHHHH - if let Token::CssHashWord(word) = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - if let Ok(v) = CssColorPropertyValue::from_hex(loc.clone(), &word) { - base = Some(Rc::new(CssPropertyValue::Color(v))); - } else { - base = Some(self.create_invalidated_property_value(&loc)); - } - // "..." - // '...' - } else if let Token::String(value) = t1 { - self.mark_location(); - self.next(); - base = Some(Rc::new(CssPropertyValue::String(CssStringPropertyValue { - location: self.pop_location(), - value - }))); - // DECIMAL - } else if let Token::CssNumber { value, unit } = t1 { - self.mark_location(); - self.next(); - let loc = self.pop_location(); - base = Some(Rc::new(CssPropertyValue::Number(CssNumberPropertyValue { - location: loc, - value, - unit, - }))); - } else if let Some(id) = self.peek_identifier() { - self.mark_location(); - self.next(); - let color_int = css_color_constant_to_int(&id.0); - // COLOR_NAME such as "red" - if let Some(color_int) = color_int { - base = Some(Rc::new(CssPropertyValue::Color(CssColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - // rgb(...) - } else if id.0 == "rgb" && self.peek(Token::ParenOpen) { - if let Some(color_int) = self.parse_arguments().unwrap().parse_rgb() { - base = Some(Rc::new(CssPropertyValue::RgbColor(CssRgbColorPropertyValue { - location: self.pop_location(), - color_int, - }))); - } else { - let loc = self.pop_location(); - base = Some(self.create_invalidated_property_value(&loc)); - } - } else if id.0 == "ClassReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::ClassReference(CssClassReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "PropertyReference" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::PropertyReference(CssPropertyReferencePropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "url" && self.peek(Token::ParenOpen) { - let url = self.parse_arguments().unwrap().parse_text(); - let mut format: Option<(String, Location)> = None; - if self.consume_keyword("format") { - if let Ok(a) = self.parse_arguments() { - format = Some(a.parse_text()); - } - } - base = Some(Rc::new(CssPropertyValue::Url(CssUrlPropertyValue { - location: self.pop_location(), - url, - format, - }))); - } else if id.0 == "local" && self.peek(Token::ParenOpen) { - let name = self.parse_arguments().unwrap().parse_text(); - base = Some(Rc::new(CssPropertyValue::Local(CssLocalPropertyValue { - location: self.pop_location(), - name, - }))); - } else if id.0 == "Embed" && self.peek(Token::ParenOpen) { - let entries = self.parse_arguments().unwrap().parse_embed_entries(); - base = Some(Rc::new(CssPropertyValue::Embed(CssEmbedPropertyValue { - location: self.pop_location(), - entries, - }))); - } else { - if self.peek(Token::ParenOpen) { - self.add_syntax_error(&self.token_location(), DiagnosticKind::Unexpected, diagarg![self.token.0.clone()]); - self.parse_arguments().unwrap(); - } - base = Some(Rc::new(CssPropertyValue::Identifier(CssIdentifierPropertyValue { - location: self.pop_location(), - value: id.0, - }))); - } - } else if self.peek(Token::Plus) || self.peek(Token::Minus) - || self.peek(Token::Times) || self.peek(Token::Div) { - base = Some(self.create_invalidated_property_value(&self.token.1)); - self.next(); - } else { - return None; - } - - let mut base = base.unwrap(); - - loop { - if self.peek(Token::Comma) && min_precedence.includes(&CssOperatorPrecedence::Array) { - self.push_location(&base.location()); - let mut elements: Vec> = vec![base]; - while self.consume(Token::Comma) { - elements.push(self.parse_property_value(CssOperatorPrecedence::MultiValue)); - } - base = Rc::new(CssPropertyValue::Array(CssArrayPropertyValue { - location: self.pop_location(), - elements, - })); - } else if min_precedence.includes(&CssOperatorPrecedence::MultiValue) { - if let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - self.push_location(&base.location()); - let mut values: Vec> = vec![base, mv1]; - while let Some(mv1) = self.parse_opt_property_value(CssOperatorPrecedence::MultiValue.add(1).unwrap()) { - values.push(mv1); - } - base = Rc::new(CssPropertyValue::MultiValue(CssMultiValuePropertyValue { - location: self.pop_location(), - values, - })); - } else { - break; - } - } else { - break; - } - } - - Some(base) - } - - fn parse_embed_entry(&mut self) -> Rc { - self.mark_location(); - if let Some(key) = self.consume_identifier() { - if self.consume(Token::Assign) { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: Some(key), - value, - }) - } else { - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value: key, - }) - } - } else { - let value = self.expect_string(); - Rc::new(CssEmbedEntry { - location: self.pop_location(), - key: None, - value, - }) - } - } -} - -fn rgb_bytes_to_integer(r: f64, g: f64, b: f64) -> u32 { - (calc_rgb_byte(r) << 16) | (calc_rgb_byte(g) << 8) | calc_rgb_byte(b) -} - -fn calc_rgb_byte(value: f64) -> u32 { - // Integer - if value.round() == value { - value.round().to_u32().unwrap_or(0).clamp(0, 255) - // Float - } else { - (value * 255.0).round().to_u32().unwrap_or(0).clamp(0, 255) - } -} - -/// A simplified interface for executing the CSS parser. -pub struct CssParserFacade<'input>(pub &'input Rc, pub ParserOptions); - -impl<'input> CssParserFacade<'input> { - fn create_parser(&self) -> CssParser<'input> { - CssParser::new(self.0, &self.1) - } - - /// Parses `CssDocument` until end-of-file. - pub fn parse_document(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - parser.parse_document() - } - - /// Parses either a string or return source text as is. - pub fn parse_text(&self) -> (String, Location) { - let mut parser = self.create_parser(); - while parser.tokenizer.consume_whitespace() { - // Consumed whitespace - } - let d = parser.tokenizer.characters().peek_or_zero(); - if ['"', '\''].contains(&d) { - parser.next(); - let mut v: (String, Location) = ("".into(), parser.tokenizer.cursor_location()); - while let Token::String(v1) = parser.token.0.clone() { - v = (v1, parser.token.1.clone()); - parser.next(); - } - parser.expect_eof(); - v - } else { - let mut s = String::new(); - let i = parser.tokenizer.characters().index(); - while let Some(ch) = parser.tokenizer.characters_mut().next() { - s.push(ch); - } - let j = parser.tokenizer.characters().index(); - (s, Location::with_offsets(parser.compilation_unit(), i, j)) - } - } - - /// Parses `CssSelectorCondition` until end-of-file. - pub fn parse_selector_condition(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_selector_condition(); - parser.expect_eof(); - r - } - - pub fn parse_property(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property(); - parser.expect_eof(); - r - } - - pub fn parse_property_value(&self) -> Rc { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.parse_property_value(CssOperatorPrecedence::Array); - parser.expect_eof(); - r - } - - pub fn parse_rgb(&self) -> Option { - let mut parser = self.create_parser(); - parser.next(); - let r = parser.expect_unitless_number()?; - let g: f64; - let b: f64; - if parser.consume(Token::Comma) { - g = parser.expect_unitless_number()?; - parser.expect(Token::Comma); - b = parser.expect_unitless_number()?; - } else { - g = parser.expect_unitless_number()?; - b = parser.expect_unitless_number()?; - } - parser.expect_eof(); - Some(rgb_bytes_to_integer(r, g, b)) - } - - pub fn parse_embed_entries(&self) -> Vec> { - let mut parser = self.create_parser(); - let mut entries: Vec> = vec![]; - parser.next(); - if !parser.eof() { - entries.push(parser.parse_embed_entry()); - } - while parser.consume(Token::Comma) { - entries.push(parser.parse_embed_entry()); - } - parser.expect_eof(); - entries - } -} diff --git a/crates/parser/parser/css_tokenizer.rs b/crates/parser/parser/css_tokenizer.rs deleted file mode 100644 index 8c12cae..0000000 --- a/crates/parser/parser/css_tokenizer.rs +++ /dev/null @@ -1,434 +0,0 @@ -use crate::ns::*; -use std::str::FromStr; - -pub struct CssTokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> CssTokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - pub fn characters_mut(&mut self) -> &mut CharacterReader<'input> { - &mut self.characters - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - pub fn scan(&mut self) -> (Token, Location) { - while self.consume_whitespace() || self.consume_comment() { - // Do nothing - } - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - if let Some(id) = self.consume_css_id() { - return (Token::Identifier(id), start.combine_with(self.cursor_location())); - } - - // DECIMAL - // DECIMAL.PART - if CharacterValidator::is_dec_digit(ch) { - self.characters.next(); - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - } - return self.finish_number(start); - } - - if ch == '#' { - self.characters.next(); - let mut word = String::new(); - loop { - let ch = self.characters.peek_or_zero(); - if (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || - (ch >= '0' && ch <= '9') || ch == '-' || ch == '_' { - word.push(ch); - self.characters.next(); - } else { - break; - } - } - if word.is_empty() { - self.add_unexpected_error(); - word = INVALIDATED_IDENTIFIER.to_owned(); - } - return (Token::CssHashWord(word), start.combine_with(self.cursor_location())); - } - - if ch == '@' { - // @namespace - if self.characters.peek_seq(10) == "@namespace" { - self.characters.skip_count_in_place(10); - return (Token::CssAtNamespace, start.combine_with(self.cursor_location())); - } - // @font-face - if self.characters.peek_seq(10) == "@font-face" { - self.characters.skip_count_in_place(10); - return (Token::CssAtFontFace, start.combine_with(self.cursor_location())); - } - // @media - if self.characters.peek_seq(6) == "@media" { - self.characters.skip_count_in_place(6); - return (Token::CssAtMedia, start.combine_with(self.cursor_location())); - } - } - - if ch == '!' && self.characters.peek_seq(10) == "!important" { - self.characters.skip_count_in_place(10); - return (Token::CssImportant, start.combine_with(self.cursor_location())); - } - - match ch { - // . - // .DECIMAL - '.' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - return self.finish_number(start); - } - (Token::Dot, start.combine_with(self.cursor_location())) - }, - '"' | '\'' => { - self.scan_string(ch, start) - }, - ';' => { - while self.characters.peek_or_zero() == ';' { - self.characters.next(); - } - (Token::CssSemicolons, start.combine_with(self.cursor_location())) - }, - '^' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssBeginsWith, start.combine_with(self.cursor_location())) - } - }, - '$' => { - self.characters.next(); - if self.characters.peek_or_zero() != '=' { - self.add_unexpected_error(); - self.characters.next(); - self.scan() - } else { - self.characters.next(); - (Token::CssEndsWith, start.combine_with(self.cursor_location())) - } - }, - '*' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssContains, start.combine_with(self.cursor_location())) - } else { - (Token::Times, start.combine_with(self.cursor_location())) - } - }, - '~' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssListMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Tilde, start.combine_with(self.cursor_location())) - } - }, - '|' => { - self.characters.next(); - if self.characters.peek_or_zero() == '=' { - self.characters.next(); - (Token::CssHreflangMatch, start.combine_with(self.cursor_location())) - } else { - (Token::Pipe, start.combine_with(self.cursor_location())) - } - }, - '{' => { - self.characters.next(); - (Token::BlockOpen, start.combine_with(self.cursor_location())) - }, - '}' => { - self.characters.next(); - (Token::BlockClose, start.combine_with(self.cursor_location())) - }, - '[' => { - self.characters.next(); - (Token::SquareOpen, start.combine_with(self.cursor_location())) - }, - ']' => { - self.characters.next(); - (Token::SquareClose, start.combine_with(self.cursor_location())) - }, - '(' => { - self.characters.next(); - (Token::ParenOpen, start.combine_with(self.cursor_location())) - }, - ')' => { - self.characters.next(); - (Token::ParenClose, start.combine_with(self.cursor_location())) - }, - ',' => { - self.characters.next(); - (Token::Comma, start.combine_with(self.cursor_location())) - }, - '%' => { - self.characters.next(); - (Token::Percent, start.combine_with(self.cursor_location())) - }, - '=' => { - self.characters.next(); - (Token::Assign, start.combine_with(self.cursor_location())) - }, - ':' => { - self.characters.next(); - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - (Token::ColonColon, start.combine_with(self.cursor_location())) - } else { - (Token::Colon, start.combine_with(self.cursor_location())) - } - }, - '>' => { - self.characters.next(); - (Token::Gt, start.combine_with(self.cursor_location())) - }, - '+' => { - self.characters.next(); - (Token::Plus, start.combine_with(self.cursor_location())) - }, - _ => { - if self.characters.reached_end() { - return (Token::Eof, start); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan() - }, - } - } - - pub fn consume_whitespace(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if [' ', '\t', '\n', '\r'].contains(&ch) { - self.characters.next(); - true - } else { - false - } - } - - fn consume_comment(&mut self) -> bool { - if self.characters.peek_or_zero() == '/' && self.characters.peek_at_or_zero(1) == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - true - } else { - false - } - } - - fn consume_css_id(&mut self) -> Option { - let i = self.characters.index(); - let mut prefix_n = 0; - if self.characters.peek_or_zero() == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - if self.characters.peek_at_or_zero(prefix_n) == '_' { - prefix_n += 1; - } - } - } else if self.characters.peek_or_zero() == '-' { - prefix_n += 1; - } - if CharacterValidator::is_css_identifier_start(self.characters.peek_at_or_zero(prefix_n)) { - self.characters.skip_count_in_place(prefix_n + 1); - while CharacterValidator::is_css_identifier_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - return Some(self.compilation_unit.text()[i..self.characters.index()].to_owned()); - } - None - } - - fn finish_number(&mut self, start: Location) -> (Token, Location) { - let digits = &self.compilation_unit.text()[start.first_offset..self.characters.index()]; - let mut mv = f64::from_str(digits).unwrap_or(f64::NAN); - let mut unit: Option = None; - if self.characters.peek_or_zero() == '%' { - self.characters.next(); - mv /= 100.0; - } else { - unit = self.consume_css_id(); - } - (Token::CssNumber { - value: mv, - unit, - }, start.combine_with(self.cursor_location())) - } - - fn scan_string(&mut self, delim: char, start: Location) -> (Token, Location) { - let mut builder = String::new(); - self.characters.next(); - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if ch == '\\' { - let mut loc = self.cursor_location(); - self.characters.next(); - let mut digits = String::new(); - for _ in 0..6 { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_hex_digit(ch) { - digits.push(ch); - self.characters.next(); - } else { - break; - } - } - if digits.is_empty() { - self.add_unexpected_error(); - } else { - loc = loc.combine_with(self.cursor_location()); - let mv = u32::from_str_radix(&digits, 16).ok().and_then(|mv| char::from_u32(mv)); - if let Some(mv) = mv { - builder.push(mv); - } else { - self.add_syntax_error(&loc, DiagnosticKind::CssInvalidHexEscape, diagarg![digits]); - } - } - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - let loc = start.combine_with(self.cursor_location()); - (Token::String(builder), loc) - } - - pub fn scan_arguments(&mut self) -> ((usize, usize), (Token, Location)) { - let i = self.characters.index(); - let mut j: usize; - let mut nesting = 1; - let token: (Token, Location); - loop { - j = self.characters.index(); - let ch = self.characters.peek_or_zero(); - if ch == ')' { - self.characters.next(); - nesting -= 1; - if nesting == 0 { - token = (Token::ParenClose, Location::with_offsets(&self.compilation_unit, j, self.characters.index())); - break; - } - } else if ch == '(' { - self.characters.next(); - nesting += 1; - } else if self.characters.reached_end() { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::Expecting, diagarg![Token::ParenClose, Token::Eof]); - token = (Token::Eof, self.cursor_location()); - break; - } else { - self.characters.next(); - } - } - ((i, j), token) - } -} \ No newline at end of file diff --git a/crates/parser/parser/parser.rs b/crates/parser/parser/parser.rs deleted file mode 100644 index d424750..0000000 --- a/crates/parser/parser/parser.rs +++ /dev/null @@ -1,5376 +0,0 @@ -use crate::ns::*; -use lazy_regex::*; - -pub struct Parser<'input> { - tokenizer: Tokenizer<'input>, - previous_token: (Token, Location), - token: (Token, Location), - locations: Vec, - activations: Vec, - ignore_xml_whitespace: bool, - expecting_token_error: bool, -} - -impl<'input> Parser<'input> { - /// Constructs a parser. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - Self { - tokenizer: Tokenizer::new(compilation_unit, options), - previous_token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - token: (Token::Eof, Location::with_offset(&compilation_unit, 0)), - locations: vec![], - activations: vec![], - ignore_xml_whitespace: options.ignore_xml_whitespace, - expecting_token_error: false, - } - } - - fn options(&self) -> ParserOptions { - ParserOptions { - ignore_xml_whitespace: self.ignore_xml_whitespace, - ..default() - } - } - - fn compilation_unit(&self) -> &Rc { - self.tokenizer.compilation_unit() - } - - fn token_location(&self) -> Location { - self.token.1.clone() - } - - fn mark_location(&mut self) { - self.locations.push(self.token.1.clone()); - } - - fn duplicate_location(&mut self) { - self.locations.push(self.locations.last().unwrap().clone()); - } - - fn push_location(&mut self, location: &Location) { - self.locations.push(location.clone()); - } - - fn pop_location(&mut self) -> Location { - self.locations.pop().unwrap().combine_with(self.previous_token.1.clone()) - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_error(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - fn patch_syntax_error(&self, original: DiagnosticKind, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().diagnostics.borrow().is_empty() { - return; - } - if self.compilation_unit().diagnostics.borrow().last().unwrap().kind == original { - let loc = self.compilation_unit().diagnostics.borrow_mut().pop().unwrap().location(); - self.compilation_unit().add_diagnostic(Diagnostic::new_syntax_error(&loc, kind, arguments)); - } - } - - /* - fn add_warning(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit().prevent_equal_offset_warning(location) { - return; - } - self.compilation_unit().add_diagnostic(Diagnostic::new_warning(location, kind, arguments)); - } - */ - - fn next(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_div(); - } - - fn next_ie_xml_tag(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_tag(); - } - - fn next_ie_xml_content(&mut self) { - self.previous_token = self.token.clone(); - self.token = self.tokenizer.scan_ie_xml_content(); - } - - fn peek(&self, token: Token) -> bool { - self.token.0 == token - } - - fn peek_identifier(&self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - return Some((id, location)); - } - } - None - } - } - - fn peek_context_keyword(&self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { id == name && self.token.1.character_count() == name.len() } else { false } - } - - fn consume(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next(); - true - } else { - false - } - } - - fn consume_and_ie_xml_tag(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_tag(); - true - } else { - false - } - } - - fn consume_and_ie_xml_content(&mut self, token: Token) -> bool { - if self.token.0 == token { - self.next_ie_xml_content(); - true - } else { - false - } - } - - fn consume_identifier(&mut self, reserved_words: bool) -> Option<(String, Location)> { - if let Token::Identifier(id) = self.token.0.clone() { - let location = self.token.1.clone(); - self.next(); - Some((id, location)) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - let location = self.token.1.clone(); - self.next(); - return Some((id, location)); - } - } - None - } - } - - fn _consume_context_keyword(&mut self, name: &str) -> bool { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.next(); - true - } else { - false - } - } else { - false - } - } - - fn expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - let expecting_identifier_name = token.is_identifier_name(); - while self.token.0 != Token::Eof && (if expecting_identifier_name { self.token.0.is_identifier_name() } else { true }) { - self.next(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next(); - } - } - - fn non_greedy_expect_virtual_semicolon(&mut self) { - self.expecting_token_error = false; - if !self.parse_semicolon() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - } - } - - fn expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_tag(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - /// Expects a token; but if it fails, does not skip any token. - fn non_greedy_expect_and_ie_xml_tag(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_tag(); - } - } - - fn expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next_ie_xml_content(); - if self.token.0 == token { - return; - } - } - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn non_greedy_expect_and_ie_xml_content(&mut self, token: Token) { - if self.token.0 != token { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![token.clone(), self.token.0.clone()]); - } else { - self.expecting_token_error = false; - self.next_ie_xml_content(); - } - } - - fn expect_identifier(&mut self, reserved_words: bool) -> (String, Location) { - if let Token::Identifier(id) = self.token.0.clone() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - (id, location) - } else { - if reserved_words { - if let Some(id) = self.token.0.reserved_word_name() { - self.expecting_token_error = false; - let location = self.token.1.clone(); - self.next(); - return (id, location); - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - /* - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if let Some(id) = self.consume_identifier(reserved_words) { - return id; - } else { - self.next(); - } - } - */ - (INVALIDATED_IDENTIFIER.to_owned(), self.tokenizer.cursor_location()) - } - } - - fn _expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - while self.token.0 != Token::Eof && self.token.0.is_identifier_name() { - if self._consume_context_keyword(name) { - return; - } else { - self.next(); - } - } - } - - fn non_greedy_expect_context_keyword(&mut self, name: &str) { - if let Token::Identifier(id) = self.token.0.clone() { - if id == name && self.token.1.character_count() == name.len() { - self.expecting_token_error = false; - self.next(); - return; - } - } - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![format!("'{name}'"), self.token.0.clone()]); - } - - /// Expects a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn _expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if self.consume_type_parameters_gt() { - return; - } - } - } - } - - fn non_greedy_expect_type_parameters_gt(&mut self) { - self.expecting_token_error = false; - if !self.consume_type_parameters_gt() { - self.expecting_token_error = true; - self.add_syntax_error(&self.token_location(), DiagnosticKind::Expecting, diagarg![Token::Gt, self.token.0.clone()]); - } - } - - /// Consumes a greater-than symbol. If the facing token is not greater-than, - /// but starts with a greater-than symbol, the first character is shifted off - /// from the facing token. - fn consume_type_parameters_gt(&mut self) -> bool { - match self.token.0 { - Token::Gt => { - self.next(); - true - }, - Token::Ge => { - self.token.0 = Token::Assign; - self.token.1.first_offset += 1; - true - }, - Token::RightShift => { - self.token.0 = Token::Gt; - self.token.1.first_offset += 1; - true - }, - Token::RightShiftAssign => { - self.token.0 = Token::Ge; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShift => { - self.token.0 = Token::RightShift; - self.token.1.first_offset += 1; - true - }, - Token::UnsignedRightShiftAssign => { - self.token.0 = Token::RightShiftAssign; - self.token.1.first_offset += 1; - true - }, - _ => { - false - }, - } - } - - fn offending_token_is_inline_or_higher_indented(&self) -> bool { - if !self.previous_token.1.line_break(&self.token.1) { - return true; - } - let i1 = self.compilation_unit().get_line_indent(self.previous_token.1.first_line_number()); - let i2 = self.compilation_unit().get_line_indent(self.token.1.first_line_number()); - i2 > i1 - } - - pub fn expect_eof(&mut self) { - self.expect(Token::Eof) - } - - fn create_invalidated_expression(&self, location: &Location) -> Rc { - Rc::new(Expression::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - fn create_invalidated_directive(&self, location: &Location) -> Rc { - Rc::new(Directive::Invalidated(InvalidatedNode { - location: location.clone(), - })) - } - - pub fn parse_expression(&mut self, context: ParserExpressionContext) -> Rc { - if let Some(exp) = self.parse_opt_expression(context) { - exp - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - pub fn parse_opt_expression(&mut self, context: ParserExpressionContext) -> Option> { - let exp: Option> = self.parse_opt_start_expression(context.clone()); - - // Parse subexpressions - if let Some(exp) = exp { - return Some(self.parse_subexpressions(exp, context.clone())); - } - None - } - - fn parse_subexpressions(&mut self, mut base: Rc, context: ParserExpressionContext) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Increment) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostIncrement, - })); - } else if self.peek(Token::Decrement) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, - operator: Operator::PostDecrement, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - // `not in` - } else if self.token.0 == Token::Not && context.allow_in && context.min_precedence.includes(&OperatorPrecedence::Relational) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - self.non_greedy_expect(Token::In); - base = self.parse_binary_operator(base, Operator::NotIn, OperatorPrecedence::Relational.add(1).unwrap(), context.clone()); - // ConditionalExpression - } else if self.peek(Token::Question) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.push_location(&base.location()); - self.next(); - let consequent = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - let mut alternative = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - alternative = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - } - base = Rc::new(Expression::Conditional(ConditionalExpression { - location: self.pop_location(), - test: base, consequent, alternative, - })); - } else if let Some(binary_operator) = self.check_binary_operator(context.clone()) { - let BinaryOperator(operator, required_precedence, _) = binary_operator; - if context.min_precedence.includes(&required_precedence) { - self.next(); - base = self.parse_binary_operator(base, operator, binary_operator.right_precedence(), context.clone()); - } else { - break; - } - // AssignmentExpression - } else if self.peek(Token::Assign) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - if !left.is_valid_assignment_left_hand_side() { - self.add_syntax_error(&left.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: None, right, - })); - // CompoundAssignment and LogicalAssignment - } else if let Some(compound) = self.token.0.compound_assignment() { - if context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) && context.allow_assignment { - self.push_location(&base.location()); - self.next(); - let left = base.clone(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Assignment(AssignmentExpression { - location: self.pop_location(), - left, compound: Some(compound), right, - })); - } else { - break; - } - } else if self.peek(Token::Comma) && context.min_precedence.includes(&OperatorPrecedence::List) { - self.push_location(&base.location()); - self.next(); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..context.clone() - }); - base = Rc::new(Expression::Sequence(SequenceExpression { - location: self.pop_location(), - left: base, right, - })); - } else { - break; - } - } - - base - } - - fn parse_binary_operator(&mut self, base: Rc, mut operator: Operator, right_precedence: OperatorPrecedence, context: ParserExpressionContext) -> Rc { - // The left operand of a null-coalescing operation must not be - // a logical AND, XOR or OR operation. - if operator == Operator::NullCoalescing { - if let Expression::Unary(UnaryExpression { expression, operator, .. }) = base.as_ref() { - if [Operator::LogicalAnd, Operator::LogicalXor, Operator::LogicalOr].contains(&operator) { - self.add_syntax_error(&expression.location(), DiagnosticKind::IllegalNullishCoalescingLeftOperand, vec![]); - } - } - } - - if operator == Operator::Is && self.consume(Token::Not) { - operator = Operator::IsNot; - } - - self.push_location(&base.location()); - let right = self.parse_expression(ParserExpressionContext { - min_precedence: right_precedence, - ..context - }); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - left: base, operator, right, - })) - } - - fn check_binary_operator(&self, context: ParserExpressionContext) -> Option { - if let Some(operator) = self.token.0.to_binary_operator() { - if operator == Operator::In && !context.allow_in { - return None; - } - BinaryOperator::try_from(operator).ok() - } else { - None - } - } - - fn parse_optional_chaining(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - self.duplicate_location(); - let mut operation = Rc::new(Expression::OptionalChainingPlaceholder(OptionalChainingPlaceholder { - location: base.location(), - })); - if self.peek(Token::ParenOpen) { - let arguments: Vec> = self.parse_arguments(); - if arguments.len() == 1 && self.peek(Token::ColonColon) { - self.duplicate_location(); - let ql = self.pop_location(); - let q = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: arguments[0].clone(), - })); - let identifier = self.finish_qualified_identifier(false, ql, q); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, - identifier, - })); - } else { - operation = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base: operation, arguments - })); - } - } else if self.peek(Token::SquareOpen) { - let asdoc = self.parse_asdoc(); - self.next(); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - operation = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: operation, asdoc, key, - })); - } else { - let identifier = self.parse_qualified_identifier(); - operation = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: operation, identifier - })); - } - - // Parse postfix subexpressions - operation = self.parse_optional_chaining_subexpressions(operation); - - Rc::new(Expression::OptionalChaining(OptionalChainingExpression { - location: self.pop_location(), - base, expression: operation, - })) - } - - fn parse_optional_chaining_subexpressions(&mut self, mut base: Rc) -> Rc { - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::OptionalChaining) { - base = self.parse_optional_chaining(base); - } else if self.peek(Token::SquareOpen) { - self.next(); - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base, asdoc: None, key, location: self.pop_location() - })); - } else if self.consume(Token::Descendants) { - self.push_location(&base.location()); - let id = self.parse_qualified_identifier(); - base = Rc::new(Expression::Descendants(DescendantsExpression { - location: self.pop_location(), - base, - identifier: id, - })); - } else if self.peek(Token::ParenOpen) { - self.push_location(&base.location()); - let arguments = self.parse_arguments(); - base = Rc::new(Expression::Call(CallExpression { - location: self.pop_location(), - base, - arguments, - })); - } else if self.peek(Token::Exclamation) && !self.previous_token.1.line_break(&self.token.1) { - self.push_location(&base.location()); - self.next(); - base = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::NonNull, - })); - } else { - break; - } - } - - base - } - - fn parse_dot_subexpression(&mut self, base: Rc) -> Rc { - self.push_location(&base.location()); - if self.peek(Token::ParenOpen) { - let paren_location = self.token_location(); - let paren_exp = self.parse_paren_list_expression(); - if !matches!(paren_exp.as_ref(), Expression::Sequence(_)) && self.peek(Token::ColonColon) { - let q = Rc::new(Expression::Paren(ParenExpression { - location: paren_location.clone(), - expression: paren_exp.clone(), - })); - let id = self.finish_qualified_identifier(false, paren_location, q); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } else { - Rc::new(Expression::Filter(FilterExpression { - location: self.pop_location(), - base, test: paren_exp - })) - } - } else if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })) - } else { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier: id - })) - } - } - - /// Ensures a parameter list consists of zero or more required parameters followed by - /// zero or more optional parameters optionally followed by a rest parameter. - fn validate_parameter_list(&mut self, params: Vec<(ParameterKind, Location)>) { - let mut least_kind = ParameterKind::Required; - let mut has_rest = false; - for (param_kind, param_loc) in params { - if !least_kind.may_be_followed_by(param_kind) { - self.add_syntax_error(¶m_loc, DiagnosticKind::WrongParameterPosition, vec![]); - } - least_kind = param_kind; - if param_kind == ParameterKind::Rest && has_rest { - self.add_syntax_error(¶m_loc, DiagnosticKind::DuplicateRestParameter, vec![]); - } - has_rest = param_kind == ParameterKind::Rest; - } - } - - fn parse_opt_start_expression(&mut self, context: ParserExpressionContext) -> Option> { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - Some(self.parse_expression_starting_with_identifier((id, id_location))) - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - }))) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - }))) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - }))) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - }))) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - }))) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Some(Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - }))) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - // Parentheses - } else if self.peek(Token::ParenOpen) { - Some(self.parse_paren_list_expr_or_qual_id()) - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Some(Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - }))) - } else { - Some(self.parse_xml_element_or_xml_list(start)) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - Some(self.parse_array_initializer()) - // NewExpression - } else if self.peek(Token::New) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - let start = self.token_location(); - self.next(); - Some(self.parse_new_expression(start)) - } else if self.peek(Token::BlockOpen) { - Some(self.parse_object_initializer()) - } else if self.peek(Token::Function) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - Some(self.parse_function_expression(context.clone())) - // SuperExpression - } else if self.peek(Token::Super) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - Some(self.parse_super_expression_followed_by_property_operator()) - // AwaitExpression - } else if self.peek(Token::Await) && context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::Unary, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_await = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Await, - }))) - // YieldExpression - } else if self.peek(Token::Yield) && context.min_precedence.includes(&OperatorPrecedence::AssignmentAndOther) { - self.mark_location(); - let operator_token = self.token.clone(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - if let Some(activation) = self.activations.last_mut() { - activation.uses_yield = true; - } else { - self.add_syntax_error(&operator_token.1, DiagnosticKind::NotAllowedHere, diagarg![operator_token.0]); - } - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator: Operator::Yield, - }))) - // Miscellaneous prefix unary expressions - } else if let Some((operator, subexp_precedence)) = self.check_prefix_operator() { - if context.min_precedence.includes(&OperatorPrecedence::Unary) { - self.mark_location(); - self.next(); - let base = self.parse_expression(ParserExpressionContext { min_precedence: subexp_precedence, ..default() }); - Some(Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - expression: base, operator, - }))) - } else { - None - } - // ImportMeta - } else if self.peek(Token::Import) && context.min_precedence.includes(&OperatorPrecedence::Postfix) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Dot); - self.non_greedy_expect_context_keyword("meta"); - Some(Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - }))) - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Some(Rc::new(Expression::QualifiedIdentifier(id))) - } else { - None - } - } - - fn parse_expression_starting_with_identifier(&mut self, id: (String, Location)) -> Rc { - let id_location = id.1.clone(); - let id = id.0; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } - - fn check_prefix_operator(&self) -> Option<(Operator, OperatorPrecedence)> { - match self.token.0 { - Token::Delete => Some((Operator::Delete, OperatorPrecedence::Postfix)), - Token::Void => Some((Operator::Void, OperatorPrecedence::Unary)), - Token::Typeof => Some((Operator::Typeof, OperatorPrecedence::Unary)), - Token::Increment => Some((Operator::PreIncrement, OperatorPrecedence::Postfix)), - Token::Decrement => Some((Operator::PreDecrement, OperatorPrecedence::Postfix)), - Token::Plus => Some((Operator::Positive, OperatorPrecedence::Unary)), - Token::Minus => Some((Operator::Negative, OperatorPrecedence::Unary)), - Token::Tilde => Some((Operator::BitwiseNot, OperatorPrecedence::Unary)), - Token::Exclamation => Some((Operator::LogicalNot, OperatorPrecedence::Unary)), - _ => None, - } - } - - fn parse_function_expression(&mut self, context: ParserExpressionContext) -> Rc { - self.mark_location(); - self.next(); - let mut name = None; - if let Token::Identifier(id) = self.token.0.clone() { - name = Some((id, self.token.1.clone())); - self.next(); - } - let common = self.parse_function_common(true, ParserDirectiveContext::Default, context.allow_in); - Rc::new(Expression::Function(FunctionExpression { - location: self.pop_location(), - name, - common, - })) - } - - fn parse_function_common(&mut self, function_expr: bool, block_context: ParserDirectiveContext, allow_in: bool) -> Rc { - self.mark_location(); - self.duplicate_location(); - let mut params: Vec> = vec![]; - let mut return_annotation = Some(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - params.push(self.parse_parameter()); - while self.consume(Token::Comma) { - params.push(self.parse_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - return_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - } - self.validate_parameter_list(params.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let signature_location = self.pop_location(); - - // Enter activation - self.activations.push(ParserActivation::new()); - - // Body - let body = if self.peek(Token::BlockOpen) { - Some(FunctionBody::Block(Rc::new(self.parse_block(block_context)))) - } else if !(self.offending_token_is_inline_or_higher_indented() || self.peek(Token::ParenOpen)) { - None - } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }).map(|e| FunctionBody::Expression(e)) - }; - - // Body is required by function expressions - if body.is_none() && function_expr { - self.non_greedy_expect(Token::BlockOpen); - } - - // Exit activation - let activation = self.activations.pop().unwrap(); - - Rc::new(FunctionCommon { - location: self.pop_location(), - contains_await: activation.uses_await, - contains_yield: activation.uses_yield, - signature: FunctionSignature { - location: signature_location, - parameters: params, - result_type: return_annotation, - }, - body, - }) - } - - fn parse_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let binding: Rc = Rc::new(self.parse_variable_binding(true)); - let has_initializer = binding.initializer.is_some(); - let location = self.pop_location(); - if rest && has_initializer { - self.add_syntax_error(&location.clone(), DiagnosticKind::MalformedRestParameter, vec![]); - } - Rc::new(Parameter { - location, - destructuring: binding.destructuring.clone(), - default_value: binding.initializer.clone(), - kind: if rest { - ParameterKind::Rest - } else if has_initializer { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_object_initializer(&mut self) -> Rc { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut fields: Vec> = vec![]; - while !self.peek(Token::BlockClose) { - fields.push(self.parse_field()); - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::BlockClose); - - Rc::new(Expression::ObjectInitializer(ObjectInitializer { - location: self.pop_location(), - fields, - })) - } - - fn parse_field(&mut self) -> Rc { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - let subexp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - return Rc::new(InitializerField::Rest((subexp, self.pop_location()))); - } - - let name = self.parse_field_name(); - - let non_null = self.consume(Token::Exclamation); - let mut value = None; - - if self.consume(Token::Colon) { - value = Some(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } else if !matches!(name.0, FieldName::Identifier(_)) { - self.non_greedy_expect(Token::Colon); - } - - Rc::new(InitializerField::Field { - name, - non_null, - value, - }) - } - - fn parse_field_name(&mut self) -> (FieldName, Location) { - if let Token::String(value) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::StringLiteral(Rc::new(Expression::StringLiteral(StringLiteral { - location: location.clone(), - value: value.clone(), - }))), location) - } else if let Token::Number(value, suffix) = &self.token.0.clone() { - let location = self.token_location(); - self.next(); - (FieldName::NumericLiteral(Rc::new(Expression::NumericLiteral(NumericLiteral { - location: location.clone(), - value: value.clone(), - suffix: *suffix, - }))), location) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - self.next(); - let key_expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - let location = self.pop_location(); - (FieldName::Brackets(key_expr), location) - } else { - let id = self.parse_non_attribute_qualified_identifier(); - let l = id.location.clone(); - (FieldName::Identifier(id), l) - } - } - - fn parse_new_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - if self.consume(Token::Lt) { - let element_type = self.parse_type_expression(); - self.non_greedy_expect_type_parameters_gt(); - let mut elements: Vec = vec![]; - self.non_greedy_expect(Token::SquareOpen); - if !self.expecting_token_error { - while !self.peek(Token::SquareClose) { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - } - Rc::new(Expression::VectorLiteral(VectorLiteral { - location: self.pop_location(), - element_type, - elements, - })) - } else { - let base = self.parse_new_subexpression(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - Rc::new(Expression::New(NewExpression { - location: self.pop_location(), - base, arguments, - })) - } - } - - fn parse_new_expression_start(&mut self) -> Rc { - if self.peek(Token::New) { - let start = self.token_location(); - self.next(); - self.parse_new_expression(start) - } else if self.peek(Token::Super) { - self.parse_super_expression_followed_by_property_operator() - } else { - self.parse_primary_expression() - } - } - - fn parse_super_expression_followed_by_property_operator(&mut self) -> Rc { - self.mark_location(); - self.duplicate_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let super_expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - - if self.consume(Token::SquareOpen) { - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base: super_expr, asdoc: None, key, - })) - } else { - self.non_greedy_expect(Token::Dot); - let identifier = self.parse_qualified_identifier(); - Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: super_expr, identifier, - })) - } - } - - fn parse_arguments(&mut self) -> Vec> { - self.non_greedy_expect(Token::ParenOpen); - let mut arguments = vec![]; - if !self.peek(Token::ParenClose) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - while self.consume(Token::Comma) { - arguments.push(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - } - self.non_greedy_expect(Token::ParenClose); - arguments - } - - fn parse_new_subexpression(&mut self) -> Rc { - let mut base = self.parse_new_expression_start(); - loop { - if self.consume(Token::SquareOpen) { - self.push_location(&base.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - base = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - location: self.pop_location(), - base, asdoc: None, key, - })); - } else if self.consume(Token::Dot) { - self.push_location(&base.location()); - if self.consume(Token::Lt) { - let mut arguments = vec![]; - arguments.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - arguments.push(self.parse_type_expression()); - } - self.non_greedy_expect_type_parameters_gt(); - base = Rc::new(Expression::WithTypeArguments(ExpressionWithTypeArguments { - location: self.pop_location(), - base, arguments - })); - } else { - let identifier = self.parse_qualified_identifier(); - base = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base, identifier, - })); - } - } else { - break; - } - } - base - } - - fn parse_primary_expression(&mut self) -> Rc { - if let Token::Identifier(id) = self.token.0.clone() { - let id_location = self.token_location(); - self.next(); - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id == "embed" && self.previous_token.1.character_count() == "embed".len() { - return self.finish_embed_expression(id_location); - } - */ - - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - id - } - } else if self.peek(Token::Null) { - self.mark_location(); - self.next(); - Rc::new(Expression::NullLiteral(NullLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::False) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: false, - })) - } else if self.peek(Token::True) { - self.mark_location(); - self.next(); - Rc::new(Expression::BooleanLiteral(BooleanLiteral { - location: self.pop_location(), - value: true, - })) - } else if let Token::Number(n, suffix) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::NumericLiteral(NumericLiteral { - location: self.pop_location(), - value: n, - suffix, - })) - } else if let Token::String(ref s) = self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value: s.clone(), - })) - } else if self.peek(Token::This) { - self.mark_location(); - self.next(); - Rc::new(Expression::ThisLiteral(ThisLiteral { - location: self.pop_location(), - })) - } else if self.peek(Token::Div) || self.peek(Token::DivideAssign) { - self.mark_location(); - self.token = self.tokenizer.scan_regexp_literal(self.token.1.clone(), if self.peek(Token::DivideAssign) { "=".into() } else { "".into() }); - let Token::RegExp { ref body, ref flags } = self.token.0.clone() else { - panic!(); - }; - self.next(); - Rc::new(Expression::RegExpLiteral(RegExpLiteral { - location: self.pop_location(), - body: body.clone(), flags: flags.clone(), - })) - // `@` - } else if self.peek(Token::Attribute) { - self.mark_location(); - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - // Parentheses - } else if self.peek(Token::ParenOpen) { - return self.parse_paren_list_expr_or_qual_id(); - // XMLList, XMLElement, XMLMarkup - } else if self.peek(Token::Lt) { - if let Some(token) = self.tokenizer.scan_xml_markup(self.token_location()) { - self.token = token; - } - let start = self.token_location(); - if let Token::XmlMarkup(content) = &self.token.0.clone() { - self.mark_location(); - self.next(); - Rc::new(Expression::XmlMarkup(XmlMarkupExpression { - location: self.pop_location(), - markup: content.clone(), - })) - } else { - self.parse_xml_element_or_xml_list(start) - } - // ArrayInitializer - } else if self.peek(Token::SquareOpen) { - self.parse_array_initializer() - } else if self.peek(Token::BlockOpen) { - self.parse_object_initializer() - // QualifiedIdentifier - } else if - self.peek(Token::Times) - || self.peek(Token::Public) || self.peek(Token::Private) - || self.peek(Token::Protected) || self.peek(Token::Internal) { - let id = self.parse_qualified_identifier(); - Rc::new(Expression::QualifiedIdentifier(id)) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - /* - fn finish_embed_expression(&mut self, start: Location) -> Rc { - self.push_location(&start); - let descriptor = self.parse_object_initializer().clone(); - let Expression::ObjectInitializer(descriptor) = descriptor.as_ref() else { - panic!(); - }; - return Rc::new(Expression::Embed(EmbedExpression { - location: self.pop_location(), - description: descriptor.clone(), - })); - } - */ - - fn parse_array_initializer(&mut self) -> Rc { - self.mark_location(); - - let asdoc = self.parse_asdoc(); - - self.non_greedy_expect(Token::SquareOpen); - - let mut elements: Vec = vec![]; - - while !self.peek(Token::SquareClose) { - let mut ellipses = false; - while self.consume(Token::Comma) { - elements.push(Element::Elision); - ellipses = true; - } - if !ellipses { - if self.peek(Token::Ellipsis) { - self.mark_location(); - self.next(); - elements.push(Element::Rest((self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }), self.pop_location()))); - } else { - elements.push(Element::Expression(self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }))); - } - } - if !self.consume(Token::Comma) { - break; - } - } - self.non_greedy_expect(Token::SquareClose); - Rc::new(Expression::ArrayLiteral(ArrayLiteral { - location: self.pop_location(), - asdoc, - elements, - })) - } - - fn parse_xml_element_or_xml_list(&mut self, start: Location) -> Rc { - self.next_ie_xml_tag(); - if self.consume_and_ie_xml_content(Token::Gt) { - self.push_location(&start); - let content = self.parse_xml_content(); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - self.non_greedy_expect(Token::Gt); - return Rc::new(Expression::XmlList(XmlListExpression { - location: self.pop_location(), - content, - })); - } - - self.push_location(&start); - let element = Rc::new(self.parse_xml_element(start, true)); - return Rc::new(Expression::Xml(XmlExpression { - location: self.pop_location(), - element, - })); - } - - /// Parses XMLElement starting from its XMLTagContent. - fn parse_xml_element(&mut self, start: Location, ends_at_ie_div: bool) -> XmlElement { - self.push_location(&start); - let name = self.parse_xml_tag_name(); - let mut attributes: Vec> = vec![]; - let mut attribute_expression: Option> = None; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - attribute_expression = Some(expr); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - break; - } else if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = XmlAttributeValue::Value(("".into(), self.token.1.clone())); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_tag(Token::BlockClose); - value = XmlAttributeValue::Expression(expr); - } else { - value = XmlAttributeValue::Value(self.parse_xml_attribute_value()); - } - } - attributes.push(Rc::new(XmlAttribute { - location: self.pop_location(), - name, value - })); - } else { - break; - } - } - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty; - - if ends_at_ie_div { - is_empty = self.consume(Token::XmlSlashGt); - } else { - is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - } - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_xml_content()); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - closing_name = Some(self.parse_xml_tag_name()); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - if ends_at_ie_div { - self.non_greedy_expect(Token::Gt); - } else { - self.non_greedy_expect_and_ie_xml_content(Token::Gt); - } - } - - XmlElement { - location: self.pop_location(), - name, - attributes, - attribute_expression, - content, - closing_name, - } - } - - fn parse_xml_attribute_value(&mut self) -> (String, Location) { - if let Token::XmlAttributeValue(value) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_tag(); - return (value, location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlAttributeValue, diagarg![self.token.0.clone()]); - ("".into(), self.tokenizer.cursor_location()) - } - } - - fn parse_xml_tag_name(&mut self) -> XmlTagName { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - self.expect_and_ie_xml_tag(Token::BlockClose); - XmlTagName::Expression(expr) - } else { - XmlTagName::Name(self.parse_xml_name()) - } - } - - fn parse_xml_name(&mut self) -> (String, Location) { - if let Token::XmlName(name) = self.token.0.clone() { - let name_location = self.token_location(); - self.next_ie_xml_tag(); - return (name, name_location); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingXmlName, diagarg![self.token.0.clone()]); - (INVALIDATED_IDENTIFIER.into(), self.tokenizer.cursor_location()) - } - } - - /// Parses XMLContent until a ` Vec> { - let mut content = vec![]; - while !self.peek(Token::XmlLtSlash) { - if self.consume(Token::BlockOpen) { - let expr = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::AssignmentAndOther, ..default() }); - self.expect_and_ie_xml_content(Token::BlockClose); - content.push(Rc::new(XmlContent::Expression(expr))); - } else if let Token::XmlMarkup(markup) = self.token.0.clone() { - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Markup((markup, location)))); - } else if let Token::XmlText(text) = self.token.0.clone() { - if self.tokenizer.characters().reached_end() { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - break; - } - let location = self.token_location(); - self.next_ie_xml_content(); - content.push(Rc::new(XmlContent::Characters((text, location)))); - } else if self.consume_and_ie_xml_tag(Token::Lt) { - let start = self.token_location(); - let element = self.parse_xml_element(start, false); - content.push(Rc::new(XmlContent::Element(Rc::new(element)))); - } else if self.peek(Token::Eof) { - break; - } else { - self.expect_and_ie_xml_content(Token::XmlLtSlash); - } - } - content - } - - fn finish_paren_list_expr_or_qual_id(&mut self, start: Location, left: Rc) -> Rc { - if self.peek(Token::ColonColon) && !matches!(left.as_ref(), Expression::Sequence(_)) { - self.push_location(&start); - let ql = self.pop_location(); - let left = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: left, - })); - let id = self.finish_qualified_identifier(false, ql, left); - return Rc::new(Expression::QualifiedIdentifier(id)); - } - self.push_location(&start); - return Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression: left, - })); - } - - /// Parses either a ParenListExpression, (), or a QualifiedIdentifier - fn parse_paren_list_expr_or_qual_id(&mut self) -> Rc { - let start = self.token_location(); - self.non_greedy_expect(Token::ParenOpen); - - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - - self.non_greedy_expect(Token::ParenClose); - self.finish_paren_list_expr_or_qual_id(start, expr) - } - - fn parse_opt_reserved_namespace(&mut self) -> Option> { - let loc = self.token.1.clone(); - if self.consume(Token::Public) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Public(loc)))) - } else if self.consume(Token::Private) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Private(loc)))) - } else if self.consume(Token::Protected) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Protected(loc)))) - } else if self.consume(Token::Internal) { - Some(Rc::new(Expression::ReservedNamespace(ReservedNamespaceExpression::Internal(loc)))) - } else { - None - } - } - - fn parse_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = self.consume(Token::Attribute); - if attribute && self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - return QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Brackets(brackets), - }; - } - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - fn parse_non_attribute_qualified_identifier(&mut self) -> QualifiedIdentifier { - self.mark_location(); - - let attribute = false; - - // public, private, protected, internal - if let Some(qual) = self.parse_opt_reserved_namespace() { - if self.peek(Token::ColonColon) { - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, qual); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((qual.to_reserved_namespace_string().unwrap(), qual.location())), - }; - return id; - } - } - - let mut id: Option = None; - - // IdentifierName - if let Token::Identifier(id_1) = self.token.0.clone() { - id = Some(id_1); - } else { - if let Some(id_1) = self.token.0.reserved_word_name() { - id = Some(id_1); - } else if self.peek(Token::Times) { - id = Some("*".to_owned()); - } - } - - if let Some(id) = id { - let id_location = self.token_location(); - self.next(); - if self.peek(Token::ColonColon) { - let id = QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - let id = Rc::new(Expression::QualifiedIdentifier(id)); - let ql = self.pop_location(); - return self.finish_qualified_identifier(attribute, ql, id); - } else { - let id = QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id((id, id_location.clone())), - }; - return id; - } - } - - // (q)::x - if self.peek(Token::ParenOpen) { - let qual = self.parse_paren_expression(); - let ql = self.pop_location(); - let qual = Rc::new(Expression::Paren(ParenExpression { - location: ql.clone(), - expression: qual, - })); - return self.finish_qualified_identifier(attribute, ql, qual); - } - - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - - /// Expects a colon-colon and finishes a qualified identifier. - fn finish_qualified_identifier(&mut self, attribute: bool, start_location: Location, qual: Rc) -> QualifiedIdentifier { - self.push_location(&start_location); - self.non_greedy_expect(Token::ColonColon); - - // `::` may be followed by one of { IdentifierName, `*`, Brackets } - - // IdentifierName - if let Some(id) = self.consume_identifier(true) { - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(id), - } - // `*` - } else if self.peek(Token::Times) { - let id_location = self.token_location(); - self.next(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("*".into(), id_location)), - } - // Brackets - } else if self.peek(Token::SquareOpen) { - let brackets = self.parse_brackets(); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Brackets(brackets), - } - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingIdentifier, diagarg![self.token.0.clone()]); - QualifiedIdentifier { - location: self.pop_location(), - attribute, - qualifier: Some(qual), - id: QualifiedIdentifierIdentifier::Id(("".into(), self.tokenizer.cursor_location())), - } - } - } - - fn parse_brackets(&mut self) -> Rc { - self.non_greedy_expect(Token::SquareOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::SquareClose); - expr - } - - fn parse_paren_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_paren_list_expression(&mut self) -> Rc { - self.non_greedy_expect(Token::ParenOpen); - let expr = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - allow_in: true, - ..default() - }); - self.non_greedy_expect(Token::ParenClose); - expr - } - - fn parse_typed_destructuring(&mut self) -> TypedDestructuring { - self.mark_location(); - let mut destructuring: Rc; - if self.peek(Token::BlockOpen) { - destructuring = self.parse_object_initializer(); - } else if self.peek(Token::SquareOpen) { - destructuring = self.parse_array_initializer(); - } else { - let id = self.expect_identifier(true); - let id = QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }; - destructuring = Rc::new(Expression::QualifiedIdentifier(id)); - } - if self.consume(Token::Exclamation) { - self.push_location(&destructuring.location()); - destructuring = Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::NonNull, - expression: destructuring.clone(), - })); - } - if !destructuring.is_valid_destructuring() { - self.add_syntax_error(&destructuring.location(), DiagnosticKind::MalformedDestructuring, vec![]) - } - let type_annotation = if self.consume(Token::Colon) { Some(self.parse_type_expression()) } else { None }; - TypedDestructuring { - location: self.pop_location(), - destructuring, - type_annotation, - } - } - - pub fn parse_type_expression(&mut self) -> Rc { - let start = self.token_location(); - let (mut base, wrap_nullable) = self.parse_type_expression_start(); - - loop { - if self.consume(Token::Dot) { - base = self.parse_dot_subexpression(base); - } else if self.consume(Token::Question) { - self.push_location(&base.location()); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } else if self.consume(Token::Exclamation) { - self.push_location(&base.location()); - base = Rc::new(Expression::NonNullableType(NonNullableTypeExpression { - location: self.pop_location(), - base, - })); - } else { - break; - } - } - - if wrap_nullable { - self.push_location(&start); - base = Rc::new(Expression::NullableType(NullableTypeExpression { - location: self.pop_location(), - base, - })); - } - - base - } - - fn parse_type_expression_start(&mut self) -> (Rc, bool) { - // Allow a `?` prefix to wrap a type into nullable. - let wrap_nullable = self.consume(Token::Question); - - // Parenthesized - if self.peek(Token::ParenOpen) { - self.mark_location(); - let expression = self.parse_type_expression(); - (Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })), wrap_nullable) - } - // `function` - else if self.peek(Token::Function) { - (self.parse_function_type_expression(), wrap_nullable) - // `void` - } else if self.peek(Token::Void) { - self.mark_location(); - self.next(); - (Rc::new(Expression::VoidType(VoidTypeExpression { - location: self.pop_location(), - })), wrap_nullable) - // [T] - // [T1, T2, ...Tn] - } else if self.peek(Token::SquareOpen) { - let mut elements = vec![]; - self.mark_location(); - self.next(); - elements.push(self.parse_type_expression()); - if self.consume(Token::SquareClose) { - (Rc::new(Expression::ArrayType(ArrayTypeExpression { - location: self.pop_location(), - expression: elements[0].clone(), - })), wrap_nullable) - } else { - self.non_greedy_expect(Token::Comma); - elements.push(self.parse_type_expression()); - while self.consume(Token::Comma) { - if self.peek(Token::SquareClose) { - break; - } - elements.push(self.parse_type_expression()); - } - self.non_greedy_expect(Token::SquareClose); - (Rc::new(Expression::TupleType(TupleTypeExpression { - location: self.pop_location(), - expressions: elements, - })), wrap_nullable) - } - } else if self.peek(Token::Times) { - let location = self.token_location(); - self.next(); - (Rc::new(Expression::AnyType(AnyTypeExpression { - location, - })), wrap_nullable) - // Identifier - } else { - let id = self.parse_qualified_identifier(); - (Rc::new(Expression::QualifiedIdentifier(id)), wrap_nullable) - } - } - - fn parse_function_type_expression(&mut self) -> Rc { - self.mark_location(); - self.next(); - - let mut parameters = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - if !self.peek(Token::ParenClose) { - parameters.push(self.parse_function_type_parameter()); - while self.consume(Token::Comma) { - parameters.push(self.parse_function_type_parameter()); - } - } - self.non_greedy_expect(Token::ParenClose); - self.validate_parameter_list(parameters.iter().map(|p| (p.kind, p.location.clone())).collect::>()); - } - - let mut result_type = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Colon); - if !self.expecting_token_error { - result_type = self.parse_type_expression(); - } - Rc::new(Expression::FunctionType(FunctionTypeExpression { - location: self.pop_location(), - parameters, - result_type: Some(result_type), - })) - } - - fn parse_function_type_parameter(&mut self) -> Rc { - self.mark_location(); - let rest = self.consume(Token::Ellipsis); - let type_expression: Option> = if rest && self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_type_expression()) - }; - let optional = !rest && self.consume(Token::Assign); - let location = self.pop_location(); - Rc::new(FunctionTypeParameter { - location, - type_expression, - kind: if rest { - ParameterKind::Rest - } else if optional { - ParameterKind::Optional - } else { - ParameterKind::Required - }, - }) - } - - fn parse_variable_binding(&mut self, allow_in: bool) -> VariableBinding { - let destructuring = self.parse_typed_destructuring(); - let initializer = if self.consume(Token::Assign) { - Some(self.parse_expression(ParserExpressionContext { - allow_in, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })) - } else { - None - }; - VariableBinding { - destructuring, - initializer, - } - } - - fn parse_semicolon(&mut self) -> bool { - self.consume(Token::Semicolon) || self.peek(Token::BlockClose) || self.previous_token.1.line_break(&self.token.1) - } - - fn parse_substatement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.parse_statement(context) - } - - fn parse_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - // ExpressionStatement or LabeledStatement - if let Token::Identifier(id) = &self.token.0.clone() { - let id = (id.clone(), self.token_location()); - self.next(); - self.parse_statement_starting_with_identifier(context, id) - // SuperStatement or ExpressionStatement with `super` - } else if self.peek(Token::Super) { - self.mark_location(); - self.next(); - let arguments = if self.peek(Token::ParenOpen) { Some(self.parse_arguments()) } else { None }; - let mut semicolon = false; - if arguments.is_some() { - semicolon = self.parse_semicolon(); - } - if !semicolon && (self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - if !(self.peek(Token::Dot) || self.peek(Token::SquareOpen)) { - self.non_greedy_expect(Token::Dot); - } - self.duplicate_location(); - // ExpressionStatement (`super`...) - let mut expr = Rc::new(Expression::Super(SuperExpression { - location: self.pop_location(), - object: arguments, - })); - expr = self.parse_subexpressions(expr, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: expr, - })), semicolon) - } else { - // SuperStatement - let node = Rc::new(Directive::SuperStatement(SuperStatement { - location: self.pop_location(), - arguments: arguments.unwrap(), - })); - - // Check whether super statement is allowed here - let allowed_here; - if context.may_contain_super_statement() { - allowed_here = !context.super_statement_found(); - context.set_super_statement_found(true); - } else { - allowed_here = false; - } - - if !allowed_here { - self.add_syntax_error(&node.location(), DiagnosticKind::NotAllowedHere, diagarg![Token::Super]); - } - - (node, semicolon) - } - // EmptyStatement - } else if self.peek(Token::Semicolon) { - self.mark_location(); - self.next(); - (Rc::new(Directive::EmptyStatement(EmptyStatement { - location: self.pop_location(), - })), true) - // Block - } else if self.peek(Token::BlockOpen) { - let context = if context.is_top_level_or_package() || context.is_type_block() { - context.clone() - } else { - context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }) - }; - let block = self.parse_block(context); - (Rc::new(Directive::Block(block)), true) - // IfStatement - } else if self.peek(Token::If) { - self.parse_if_statement(context) - // SwitchStatement - // `switch type` - } else if self.peek(Token::Switch) { - self.parse_switch_statement(context) - // DoStatement - } else if self.peek(Token::Do) { - self.parse_do_statement(context) - // WhileStatement - } else if self.peek(Token::While) { - self.parse_while_statement(context) - // ForStatement - // `for..in` - // `for each` - } else if self.peek(Token::For) { - self.parse_for_statement(context) - // WithStatement - } else if self.peek(Token::With) { - self.parse_with_statement(context) - // BreakStatement - } else if self.peek(Token::Break) { - self.parse_break_statement(context) - // ContinueStatement - } else if self.peek(Token::Continue) { - self.parse_continue_statement(context) - // ReturnStatement - } else if self.peek(Token::Return) { - self.parse_return_statement(context) - // ThrowStatement - } else if self.peek(Token::Throw) { - self.parse_throw_statement(context) - // TryStatement - } else if self.peek(Token::Try) { - self.parse_try_statement(context) - // `default xml namespace = expression` - } else if self.peek(Token::Default) { - self.parse_default_xml_namespace_statement() - // ExpressionStatement - } else { - self.mark_location(); - - // Store offset for patching error - let i = self.tokenizer.characters().index(); - - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Patch error - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingExpression, DiagnosticKind::ExpectingStatement, diagarg![self.token.0.clone()]); - } - - let semicolon = if exp.is_invalidated() { - self.next(); - true - } else { self.parse_semicolon() }; - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - } - - fn parse_statement_starting_with_identifier(&mut self, context: ParserDirectiveContext, id: (String, Location)) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - - // LabeledStatement - if self.consume(Token::Colon) { - let (substatement, semicolon) = self.parse_substatement(context.put_label(id.0.clone())); - let labeled = Rc::new(Directive::LabeledStatement(LabeledStatement { - location: self.pop_location(), - label: id.clone(), - substatement, - })); - return (labeled, semicolon); - } - - let mut exp: Rc; - - /* - // EmbedExpression - if self.peek(Token::BlockOpen) && id.0 == "embed" && self.previous_token.1.character_count() == "embed".len() { - exp = self.finish_embed_expression(id_location); - } else { - */ - { - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - if self.peek(Token::ColonColon) { - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - exp = Rc::new(Expression::QualifiedIdentifier(id)); - } else { - exp = id; - } - } - - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_qualified_identifier_statement_or_normal_config(&mut self, context: ParserDirectiveContext, id: (String, Location), asdoc: Option>) -> (Rc, bool) { - self.push_location(&id.1); - let id_location = id.1.clone(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - self.push_location(&id_location.clone()); - let ql = self.pop_location(); - let id = self.finish_qualified_identifier(false, ql, id); - let mut exp = Rc::new(Expression::QualifiedIdentifier(id)); - exp = self.parse_subexpressions(exp, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&exp, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } - - fn parse_opt_normal_config(&mut self, exp: &Rc, asdoc: Option>, context: ParserDirectiveContext) -> Option<(Rc, bool)> { - if self.peek_annotatable_directive_identifier_name() { - match exp.to_normal_configuration_identifier(self) { - Ok(Some((q, constant_name, metadata))) => { - self.push_location(&exp.location()); - let mut context = AnnotatableContext { - start_location: exp.location(), - asdoc: self.parse_asdoc().or(asdoc), - attributes: metadata, - context, - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - let (directive, semicolon) = self.parse_annotatable_directive(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive, - })), semicolon)); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - if self.peek(Token::BlockOpen) { - if let Some((q, constant_name)) = exp.to_normal_configuration_identifier_no_metadata() { - self.push_location(&exp.location()); - let block = self.parse_block(context); - return Some((Rc::new(Directive::NormalConfigurationDirective(NormalConfigurationDirective { - location: self.pop_location(), - namespace: q, - constant_name, - directive: Rc::new(Directive::Block(block)), - })), true)); - } - } - None - } - - fn parse_block(&mut self, context: ParserDirectiveContext) -> Block { - self.mark_location(); - self.non_greedy_expect(Token::BlockOpen); - let mut directives = vec![]; - if !self.expecting_token_error { - let mut semicolon = false; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - self.non_greedy_expect(Token::BlockClose); - } - Block { - location: self.pop_location(), - directives, - } - } - - fn parse_if_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut consequent: Rc = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let mut alternative: Option> = None; - let semicolon; - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - consequent = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if self.expecting_token_error { - semicolon = self.parse_semicolon(); - } else { - let (consequent_1, semicolon_1) = self.parse_substatement(context.clone()); - consequent = consequent_1; - if self.peek(Token::Else) { - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - self.next(); - let (alternative_2, semicolon_2) = self.parse_substatement(context.clone()); - alternative = Some(alternative_2); - semicolon = semicolon_2; - } else { - semicolon = semicolon_1; - } - } - } - (Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, consequent, alternative, - })), semicolon) - } - - fn parse_switch_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.peek_context_keyword("type") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_switch_type_statement(context); - } - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchStatement(SwitchStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - let mut semicolon = false; - while !self.peek(Token::BlockClose) { - if !cases.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - if !(self.peek(Token::Case) || self.peek(Token::Default)) { - break; - } - self.mark_location(); - let mut labels = vec![]; - loop { - if self.peek(Token::Case) { - self.mark_location(); - self.next(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Case((exp, self.pop_location()))); - } else if self.peek(Token::Default) { - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::Colon); - labels.push(CaseLabel::Default(self.pop_location())); - } else { - break; - } - } - let mut directives = vec![]; - semicolon = false; - while !(self.peek(Token::BlockClose) || self.peek(Token::Case) || self.peek(Token::Default)) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - cases.push(Case { - location: self.pop_location(), - labels, - directives, - }); - } - cases - } - - fn parse_switch_type_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - let mut discriminant = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut cases: Vec = vec![]; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - discriminant = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - self.non_greedy_expect(Token::BlockOpen); - if !self.expecting_token_error { - cases = self.parse_type_case_elements(context); - self.non_greedy_expect(Token::BlockClose); - } - } - } - (Rc::new(Directive::SwitchTypeStatement(SwitchTypeStatement { - location: self.pop_location(), - discriminant, cases, - })), true) - } - - fn parse_type_case_elements(&mut self, context: ParserDirectiveContext) -> Vec { - let mut cases = vec![]; - while !self.peek(Token::BlockClose) && !self.peek(Token::Eof) { - if self.peek(Token::Default) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter: None, - block, - }); - } else { - self.mark_location(); - self.non_greedy_expect(Token::Case); - if !self.expecting_token_error { - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = Some(self.parse_typed_destructuring()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - cases.push(TypeCase { - location: self.pop_location(), - parameter, - block, - }); - } - } - } - } - } - cases - } - - fn parse_do_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Body - let (body, semicolon_1) = self.parse_substatement(context); - if !semicolon_1 { - self.non_greedy_expect_virtual_semicolon(); - } - - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::While); - if !self.expecting_token_error { - test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::ParenClose); - } - } - - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::DoStatement(DoStatement { - location: self.pop_location(), - body, test, - })), semicolon) - } - - fn parse_while_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // Test - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let mut body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon: bool; - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let (body_1, semicolon_1) = self.parse_substatement(context); - body = body_1; - semicolon = semicolon_1; - } else { - semicolon = self.parse_semicolon(); - } - } else { - semicolon = self.parse_semicolon(); - } - - (Rc::new(Directive::WhileStatement(WhileStatement { - location: self.pop_location(), - test, body, - })), semicolon) - } - - /// Parses `for`, `for..in` or `for each`. - fn parse_for_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(false, ParserControlFlowContext { - breakable: true, - iteration: true, - }); - self.mark_location(); - self.next(); - - // `for each` - if self.peek_context_keyword("each") { - self.forbid_line_break_before_token(); - self.next(); - return self.parse_for_each_statement(context); - } - - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init: None, test: None, update: None, body, - })), semicolon); - } - - let init_variable = if self.peek(Token::Var) || self.peek(Token::Const) { - Some(self.parse_simple_variable_definition(false)) - } else { - None - }; - - if init_variable.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_variable(context, init_variable.unwrap()); - } - - let mut init_exp = if init_variable.is_none() && !self.peek(Token::Semicolon) { - self.parse_opt_expression(ParserExpressionContext { - allow_in: false, - min_precedence: OperatorPrecedence::Postfix, - ..default() - }) - } else { - None - }; - - if init_exp.is_some() && self.consume(Token::In) { - return self.parse_for_in_statement_with_left_exp(context, init_exp.unwrap()); - } - - if init_exp.is_none() && init_variable.is_none() && !self.peek(Token::Semicolon) { - init_exp = Some(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } else if let Some(exp) = init_exp.as_ref() { - init_exp = Some(self.parse_subexpressions(exp.clone(), ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::List, ..default() - })); - } - - let init = if let Some(exp) = init_exp.as_ref() { - Some(ForInitializer::Expression(exp.clone())) - } else if let Some(variable) = init_variable.as_ref() { - Some(ForInitializer::VariableDefinition(Rc::new(variable.clone()))) - } else { - None - }; - - self.non_greedy_expect(Token::Semicolon); - let test = if self.peek(Token::Semicolon) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::Semicolon); - let update = if self.peek(Token::ParenClose) { - None - } else { - Some(self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - })) - }; - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForStatement(ForStatement { - location: self.pop_location(), - init, test, update, body, - })), semicolon) - } - - fn parse_for_each_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.non_greedy_expect(Token::ParenOpen); - if self.expecting_token_error { - let left = ForInBinding::Expression(self.create_invalidated_expression(&self.tokenizer.cursor_location())); - let right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - let body = self.create_invalidated_directive(&self.tokenizer.cursor_location()); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon); - } - - let left = if self.peek(Token::Var) || self.peek(Token::Const) { - self.mark_location(); - let kind = (if self.peek(Token::Var) { VariableDefinitionKind::Var } else { VariableDefinitionKind::Const }, self.token_location()); - self.next(); - let binding = self.parse_variable_binding(false); - if let Some(init) = &binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - ForInBinding::VariableDefinition(Rc::new(SimpleVariableDefinition { - location: self.pop_location(), - kind, - bindings: vec![Rc::new(binding)], - })) - } else { - ForInBinding::Expression(self.parse_expression(ParserExpressionContext { - allow_in: false, min_precedence: OperatorPrecedence::Postfix, ..default() - })) - }; - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::In); - if !self.expecting_token_error { - right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: true, left, right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_variable(&mut self, context: ParserDirectiveContext, left: SimpleVariableDefinition) -> (Rc, bool) { - let variable_binding = left.bindings[0].clone(); - - if let Some(init) = &variable_binding.initializer { - self.add_syntax_error(&init.location(), DiagnosticKind::IllegalForInInitializer, vec![]); - } - - if left.bindings.len() > 1 { - self.add_syntax_error(&left.kind.1.clone(), DiagnosticKind::MultipleForInBindings, vec![]); - } - - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::VariableDefinition(Rc::new(left)), right, body, - })), semicolon) - } - - fn parse_for_in_statement_with_left_exp(&mut self, context: ParserDirectiveContext, left: Rc) -> (Rc, bool) { - let right = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::ForInStatement(ForInStatement { - location: self.pop_location(), - each: false, left: ForInBinding::Expression(left), right, body, - })), semicolon) - } - - fn parse_simple_variable_definition(&mut self, allow_in: bool) -> SimpleVariableDefinition { - self.mark_location(); - let kind: VariableDefinitionKind; - let kind_location = self.token_location(); - if self.consume(Token::Const) { - kind = VariableDefinitionKind::Const; - } else { - self.non_greedy_expect(Token::Var); - kind = VariableDefinitionKind::Var; - } - let mut bindings = vec![Rc::new(self.parse_variable_binding(allow_in))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(allow_in))); - } - SimpleVariableDefinition { - location: self.pop_location(), - kind: (kind, kind_location), - bindings, - } - } - - fn parse_with_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let context = context.override_control_context(true, ParserControlFlowContext { - breakable: true, - iteration: false, - }); - self.mark_location(); - self.next(); - - let mut object = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - object = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - } - self.non_greedy_expect(Token::ParenClose); - - // Body - let (body, semicolon) = self.parse_substatement(context); - - (Rc::new(Directive::WithStatement(WithStatement { - location: self.pop_location(), - object, body, - })), semicolon) - } - - fn parse_break_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::BreakStatement(BreakStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_break_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalBreak, vec![]); - } - - (node, semicolon) - } - - fn parse_continue_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let label = if self.previous_token.1.line_break(&self.token.1) { None } else { self.consume_identifier(false) }; - let label_location = label.clone().map(|label| label.1.clone()); - let label = label.map(|label| label.0.clone()); - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ContinueStatement(ContinueStatement { - location: self.pop_location(), - label: label.clone().map(|l| (l.clone(), label_location.clone().unwrap())), - })); - - if label.is_some() && !context.is_label_defined(label.clone().unwrap()) { - self.add_syntax_error(&label_location.unwrap(), DiagnosticKind::UndefinedLabel, diagarg![label.clone().unwrap()]); - } else if !context.is_continue_allowed(label) { - self.add_syntax_error(&node.location(), DiagnosticKind::IllegalContinue, vec![]); - } - - (node, semicolon) - } - - fn parse_return_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let expression = if self.previous_token.1.line_break(&self.token.1) { None } else { - self.parse_opt_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }) - }; - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ReturnStatement(ReturnStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_throw_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let line_break = self.previous_token.1.line_break(&self.token.1); - - let expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - - if line_break { - self.add_syntax_error(&expression.location(), DiagnosticKind::ExpressionMustNotFollowLineBreak, vec![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ThrowStatement(ThrowStatement { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_try_statement(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - let context = context.clone_control(); - let block = Rc::new(self.parse_block(context.clone())); - let mut catch_clauses: Vec = vec![]; - let mut finally_clause: Option = None; - let mut found_catch = false; - loop { - if self.peek(Token::Catch) { - found_catch = true; - self.mark_location(); - self.next(); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - let parameter = self.parse_typed_destructuring(); - self.non_greedy_expect(Token::ParenClose); - if !self.expecting_token_error { - let block = Rc::new(self.parse_block(context.clone())); - catch_clauses.push(CatchClause { - location: self.pop_location(), - parameter, - block, - }); - } - } - } else if self.peek(Token::Finally) { - self.mark_location(); - self.next(); - let block = Rc::new(self.parse_block(context.clone())); - finally_clause = Some(FinallyClause { - location: self.pop_location(), - block, - }); - break; - } else { - break; - } - } - if !found_catch && finally_clause.is_none() { - self.non_greedy_expect(Token::Catch); - } - - let node = Rc::new(Directive::TryStatement(TryStatement { - location: self.pop_location(), - block, catch_clauses, finally_clause, - })); - - (node, true) - } - - fn parse_default_xml_namespace_statement(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("xml"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.forbid_line_break_before_token(); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - allow_in: true, - allow_assignment: false, - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - }); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement { - location: self.pop_location(), - right: expression, - })); - - (node, semicolon) - } - - fn forbid_line_break_before_token(&mut self) { - if self.previous_token.1.line_break(&self.token.1) { - self.add_syntax_error(&self.token.1.clone(), DiagnosticKind::TokenMustNotFollowLineBreak, vec![]); - } - } - - fn parse_directive(&mut self, context: ParserDirectiveContext) -> (Rc, bool) { - let asdoc: Option> = if self.peek(Token::SquareOpen) { None } else { self.parse_asdoc() }; - // ConfigurationDirective or Statement - if let Token::Identifier(id) = &self.token.0 { - let id = (id.clone(), self.token_location()); - self.next(); - - if id.0 == "include" && id.1.character_count() == "include".len() && matches!(self.token.0, Token::String(_)) && !self.previous_token.1.line_break(&self.token.1) { - return self.parse_include_directive(context, id.1); - } - - if self.peek(Token::BlockOpen) && &id.0 == "configuration" && id.1.character_count() == "configuration".len() { - return self.parse_configuration_directive(context, id.1); - } - - // If there is a line break or offending token is "::", - // do not proceed into parsing an expression attribute or annotatble directive. - let eligible_attribute_or_directive - = !self.previous_token.1.line_break(&self.token.1) - && !(matches!(self.token.0, Token::ColonColon)); - - if eligible_attribute_or_directive && (self.peek_annotatable_directive_identifier_name() || self.lookbehind_is_annotatable_directive_identifier_name()) { - let mut context1: AnnotatableContext; - - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) - && id.1.character_count() == id.0.len() - && self.token.0.is_identifier_name() { - context1 = AnnotatableContext { - start_location: id.1.clone(), - asdoc, - attributes: vec![], - context: context.clone(), - directive_context_keyword: Some(id.clone()), - }; - // self.parse_attribute_keywords_or_expressions(&mut context); - } else { - let mut first_attr_expr = self.parse_expression_starting_with_identifier(id); - first_attr_expr = self.parse_subexpressions(first_attr_expr, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - - // Do not proceed into parsing an annotatable directive - // if there is a line break after an expression attribute, - // or if the offending token is not an identifier name, - // or if the expression attribute is not a valid access modifier. - if !first_attr_expr.valid_access_modifier() || self.previous_token.1.line_break(&self.token.1) || !(matches!(self.token.0, Token::Identifier(_)) || self.token.0.is_reserved_word()) { - self.push_location(&first_attr_expr.location()); - - // Parse CONFIG::VAR_NAME - if let Some(result) = self.parse_opt_normal_config(&first_attr_expr, asdoc.clone(), context.clone()) { - return result; - } - - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: first_attr_expr, - })), semicolon); - } - - let first_attr = self.keyword_or_expression_attribute_from_expression(&first_attr_expr); - - context1 = AnnotatableContext { - start_location: first_attr.location(), - asdoc, - attributes: vec![first_attr], - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context1); - } - return self.parse_annotatable_directive(context1); - } else if self.peek(Token::ColonColon) { - self.parse_qualified_identifier_statement_or_normal_config(context, id, asdoc) - } else { - self.parse_statement_starting_with_identifier(context, id) - } - } else if self.peek(Token::Import) { - self.parse_import_directive_or_expression_statement(context) - } else if self.peek(Token::SquareOpen) { - self.mark_location(); - let exp = self.parse_expression(ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - if self.peek_annotatable_directive_identifier_name() { - match exp.to_metadata(self) { - Ok(Some(metadata)) => { - let mut context = AnnotatableContext { - start_location: self.pop_location(), - asdoc: self.parse_asdoc(), - attributes: metadata, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - }, - Ok(None) => {}, - Err(MetadataRefineError1(MetadataRefineError::Syntax, loc)) => { - self.add_syntax_error(&loc, DiagnosticKind::UnrecognizedMetadataSyntax, diagarg![]); - }, - } - } - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: exp, - })), semicolon) - } else if self.peek(Token::Public) || self.peek(Token::Private) || self.peek(Token::Protected) - || self.peek(Token::Internal) || self.peek(Token::Var) || self.peek(Token::Const) - || self.peek(Token::Function) || self.peek(Token::Class) || self.peek(Token::Interface) { - let rns = self.parse_opt_reserved_namespace(); - let mut attributes: Vec = vec![]; - if let Some(rns) = rns { - // Do not proceed into parsing an annotatable directive - // if there is a "::" token. - if matches!(self.token.0, Token::ColonColon) { - self.push_location(&rns.location()); - let rns = Rc::new(Expression::QualifiedIdentifier(self.finish_qualified_identifier(false, rns.location(), rns))); - let rns = self.parse_subexpressions(rns, ParserExpressionContext { - allow_in: true, min_precedence: OperatorPrecedence::List, ..default() - }); - let semicolon = self.parse_semicolon(); - return (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression: rns, - })), semicolon); - } - attributes.push(rns.to_reserved_namespace_attribute().unwrap()); - } - let mut context = AnnotatableContext { - start_location: self.token_location(), - asdoc, - attributes, - context: context.clone(), - directive_context_keyword: None, - }; - self.parse_attribute_keywords_or_expressions(&mut context); - return self.parse_annotatable_directive(context); - } else if self.peek(Token::Use) { - self.parse_use_namespace_directive() - } else { - let i = self.tokenizer.characters().index(); - let r = self.parse_statement(context); - if i == self.tokenizer.characters().index() { - self.patch_syntax_error(DiagnosticKind::ExpectingStatement, DiagnosticKind::ExpectingDirective, diagarg![self.token.0.clone()]); - } - r - } - } - - fn parse_directives(&mut self, context: ParserDirectiveContext) -> Vec> { - let mut directives = vec![]; - let mut semicolon = false; - while !self.peek(Token::Eof) { - if !directives.is_empty() && !semicolon { - self.non_greedy_expect_virtual_semicolon(); - } - let (directive, semicolon_1) = self.parse_directive(context.clone()); - directives.push(directive); - semicolon = semicolon_1; - } - directives - } - - fn parse_expression_attribute(&mut self, id: &(String, Location)) -> Rc { - let mut result = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - loop { - if self.peek(Token::Dot) { - self.push_location(&result.location()); - self.next(); - let id = self.parse_qualified_identifier(); - result = Rc::new(Expression::Member(MemberExpression { - location: self.pop_location(), - base: result, identifier: id - })); - } else if self.consume(Token::SquareOpen) { - self.push_location(&result.location()); - let key = self.parse_expression(ParserExpressionContext { allow_in: true, min_precedence: OperatorPrecedence::List, ..default() }); - self.non_greedy_expect(Token::SquareClose); - result = Rc::new(Expression::ComputedMember(ComputedMemberExpression { - base: result, asdoc: None, key, location: self.pop_location() - })); - } else { - break; - } - } - result - } - - fn report_modifier_errors(&self, context: &AnnotatableContext) { - let mut i = 0usize; - while i < context.attributes.len() { - let a = &context.attributes[i]; - if Attribute::has(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAttribute, diagarg![]); - } - if Attribute::is_duplicate_access_modifier(&context.attributes[..i], &a) { - self.add_syntax_error(&a.location(), DiagnosticKind::DuplicateAccessModifier, diagarg![]); - } - i += 1; - } - } - - fn parse_annotatable_directive(&mut self, context: AnnotatableContext) -> (Rc, bool) { - if self.peek(Token::Var) || self.peek(Token::Const) { - self.report_modifier_errors(&context); - self.parse_variable_definition(context) - } else if self.consume(Token::Function) { - self.report_modifier_errors(&context); - self.parse_function_definition(context) - } else if self.consume(Token::Class) { - self.report_modifier_errors(&context); - self.parse_class_definition(context) - } else if context.has_directive_context_keyword("enum") { - self.report_modifier_errors(&context); - self.parse_enum_definition(context) - } else if context.has_directive_context_keyword("namespace") { - self.report_modifier_errors(&context); - self.parse_namespace_definition(context) - } else if self.consume(Token::Interface) { - self.report_modifier_errors(&context); - self.parse_interface_definition(context) - } else if context.has_directive_context_keyword("type") { - self.report_modifier_errors(&context); - self.parse_type_definition(context) - } else { - // In case there is a series of inline modifiers, - // report semicolon error between each. - let mut i = 0usize; - let mut error = false; - while i < context.attributes.len() { - if !context.attributes[i].is_metadata() { - let loc1 = context.attributes[i].location(); - if i + 1 < context.attributes.len() { - let loc2 = context.attributes[i + 1].location(); - if !loc1.line_break(&loc2) { - self.add_syntax_error(&loc2, DiagnosticKind::ExpectingEitherSemicolonOrNewLineHere, vec![]); - error = true; - } - } - } - i += 1; - } - - if !error { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingDirectiveKeyword, diagarg![self.token.0.clone()]); - } - self.push_location(&context.start_location); - let loc = self.pop_location(); - (self.create_invalidated_directive(&loc), true) - } - } - - pub(crate) fn refine_metadata(&self, exp: &Rc, asdoc: Option>) -> Result, MetadataRefineError> { - if let Expression::Call(CallExpression { base, arguments, .. }) = exp.as_ref() { - let Ok(name) = self.refine_metadata_name(base) else { - return Err(MetadataRefineError::Syntax); - }; - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: Some(self.refine_metadata_entries(arguments)?), - })) - } else { - if let Ok(name) = self.refine_metadata_name(exp) { - Ok(Rc::new(Metadata { - location: exp.location(), - asdoc, - name, - entries: None, - })) - } else { - Err(MetadataRefineError::Syntax) - } - } - } - - fn refine_metadata_name(&self, exp: &Rc) -> Result<(String, Location), MetadataRefineError> { - if let Expression::QualifiedIdentifier(id) = exp.as_ref() { - if id.attribute { - return Err(MetadataRefineError::Syntax); - } - let qual = id.qualifier.as_ref().and_then(|q| q.to_identifier_name().map(|n| n.0)); - if id.qualifier.is_some() && qual.is_none() { - return Err(MetadataRefineError::Syntax); - } - if let QualifiedIdentifierIdentifier::Id((s, _)) = &id.id { - if s == "*" { Err(MetadataRefineError::Syntax) } else { Ok((if let Some(q) = qual { format!("{q}::{s}") } else { s.to_string() }, exp.location())) } - } else { - Err(MetadataRefineError::Syntax) - } - } else { - Err(MetadataRefineError::Syntax) - } - } - - fn refine_metadata_entries(&self, list: &Vec>) -> Result>, MetadataRefineError> { - let mut r = Vec::>::new(); - for entry in list { - r.push(self.refine_metadata_entry(&entry)?); - } - Ok(r) - } - - fn refine_metadata_entry(&self, exp: &Rc) -> Result, MetadataRefineError> { - match exp.as_ref() { - Expression::Assignment(AssignmentExpression { compound, left, right, location }) => { - if compound.is_some() { - return Err(MetadataRefineError::Syntax); - } - let key = self.refine_metadata_name(left)?; - if matches!(right.as_ref(), Expression::QualifiedIdentifier(_)) { - return Err(MetadataRefineError::Syntax); - } - let value = self.refine_metadata_value(right)?; - Ok(Rc::new(MetadataEntry { - location: location.clone(), - key: Some(key), - value: Rc::new(value), - })) - }, - _ => { - let value = self.refine_metadata_value(exp)?; - Ok(Rc::new(MetadataEntry { - location: exp.location(), - key: None, - value: Rc::new(value), - })) - }, - } - } - - fn refine_metadata_value(&self, exp: &Rc) -> Result { - match exp.as_ref() { - Expression::QualifiedIdentifier(_) => { - let name = self.refine_metadata_name(&exp)?; - Ok(MetadataValue::IdentifierString(name)) - }, - Expression::StringLiteral(StringLiteral { value, .. }) => Ok(MetadataValue::String((value.clone(), exp.location()))), - _ => Err(MetadataRefineError::Syntax), - } - } - - fn parse_import_directive_or_expression_statement(&mut self, _context: ParserDirectiveContext) -> (Rc, bool) { - self.mark_location(); - self.next(); - if self.consume(Token::Dot) { - self.duplicate_location(); - self.non_greedy_expect_context_keyword("meta"); - let mut expression = Rc::new(Expression::ImportMeta(ImportMeta { - location: self.pop_location(), - })); - expression = self.parse_subexpressions(expression, ParserExpressionContext { - allow_in: true, - min_precedence: OperatorPrecedence::List, - ..default() - }); - let semicolon = self.parse_semicolon(); - (Rc::new(Directive::ExpressionStatement(ExpressionStatement { - location: self.pop_location(), - expression, - })), semicolon) - } else { - let mut alias: Option<(String, Location)> = None; - let mut package_name: Vec<(String, Location)> = vec![]; - let mut import_specifier = ImportSpecifier::Wildcard(self.token_location()); - let id1 = self.expect_identifier(false); - if self.consume(Token::Assign) { - alias = Some(id1.clone()); - package_name.push(self.expect_identifier(false)); - } else { - package_name.push(id1); - } - - if !self.peek(Token::Dot) { - self.non_greedy_expect(Token::Dot); - } - - while self.consume(Token::Dot) { - if self.peek(Token::Times) { - import_specifier = ImportSpecifier::Wildcard(self.token_location()); - self.next(); - break; - } else { - let id1 = self.expect_identifier(true); - if !self.peek(Token::Dot) { - import_specifier = ImportSpecifier::Identifier(id1.clone()); - break; - } else { - package_name.push(id1.clone()); - } - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::ImportDirective(ImportDirective { - location: self.pop_location(), - alias, - package_name, - import_specifier, - })); - - (node, semicolon) - } - } - - fn parse_include_directive(&mut self, context: ParserDirectiveContext, start: Location) -> (Rc, bool) { - self.push_location(&start); - let source_path_location = self.token_location(); - let Token::String(source) = &self.token.0.clone() else { - panic!(); - }; - let source = source.clone(); - self.next(); - let semicolon = self.parse_semicolon(); - - let nested_compilation_unit: Rc; - - // Select origin file path - let origin_file_path = if let Some(file_path) = self.tokenizer.compilation_unit().file_path.clone() { - Some(file_path) - } else { - std::env::current_dir().ok().map(|d| d.to_string_lossy().into_owned()) - }; - - // Resolve source - if let Some(origin_file_path) = origin_file_path { - let sub_file_path = file_paths::FlexPath::from_n_native([origin_file_path.as_ref(), "..", source.as_ref()]).to_string_with_flex_separator(); - if self.tokenizer.compilation_unit().include_directive_is_circular(&sub_file_path) { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::CircularIncludeDirective, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } else { - if let Ok(content) = std::fs::read_to_string(&sub_file_path) { - nested_compilation_unit = CompilationUnit::new(Some(sub_file_path.clone()), content); - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::FailedToIncludeFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - } - } else { - self.add_syntax_error(&source_path_location.clone(), DiagnosticKind::ParentSourceIsNotAFile, vec![]); - - // Use a placeholder compilation unit - nested_compilation_unit = CompilationUnit::new(None, "".into()); - } - - // Let it be such that the sub compilation unit is subsequent of - // the super compilation unit. - nested_compilation_unit.set_included_from(Some(self.tokenizer.compilation_unit().clone())); - - // Add sub compilation unit to super compilation unit - self.tokenizer.compilation_unit().add_nested_compilation_unit(nested_compilation_unit.clone()); - - // Parse directives from replacement source - let (nested_packages, nested_directives) = parse_include_directive_source(nested_compilation_unit.clone(), context); - - // Delegate sub compilation unit errors to super compilation unit - if nested_compilation_unit.invalidated() { - self.tokenizer.compilation_unit().invalidated.set(true); - } - - let node = Rc::new(Directive::IncludeDirective(IncludeDirective { - location: self.pop_location(), - source, - nested_packages, - nested_directives, - nested_compilation_unit: nested_compilation_unit.clone(), - })); - - (node, semicolon) - } - - fn parse_use_namespace_directive(&mut self) -> (Rc, bool) { - self.mark_location(); - self.next(); - let mut expression = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect_context_keyword("namespace"); - if !self.expecting_token_error { - expression = self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::List, - ..default() - }); - } - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::UseNamespaceDirective(UseNamespaceDirective { - location: self.pop_location(), - expression, - })); - - (node, semicolon) - } - - fn parse_variable_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_static = Attribute::find_static(&attributes).is_some(); - self.push_location(&start_location); - let kind_location = self.token_location(); - let kind = if self.consume(Token::Const) { - VariableDefinitionKind::Const - } else { - self.non_greedy_expect(Token::Var); - VariableDefinitionKind::Var - }; - let mut bindings = vec![Rc::new(self.parse_variable_binding(true))]; - while self.consume(Token::Comma) { - bindings.push(Rc::new(self.parse_variable_binding(true))); - } - - // Forbid destructuring bindings in enumerations. - if !has_static && matches!(context, ParserDirectiveContext::EnumBlock) { - if kind != VariableDefinitionKind::Const { - self.add_syntax_error(&kind_location, DiagnosticKind::EnumMembersMustBeConst, diagarg![]); - } - for binding in &bindings { - let malformed = !matches!(binding.destructuring.destructuring.as_ref(), Expression::QualifiedIdentifier(_)) - || binding.destructuring.type_annotation.is_some(); - if malformed { - self.add_syntax_error(&binding.location(), DiagnosticKind::MalformedEnumMember, diagarg![]); - } - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - let node = Rc::new(Directive::VariableDefinition(VariableDefinition { - location: self.pop_location(), - asdoc, - attributes, - kind: (kind, kind_location), - bindings, - })); - - (node, semicolon) - } - - fn parse_function_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - let has_native = Attribute::find_native(&attributes).is_some(); - let has_abstract = Attribute::find_abstract(&attributes).is_some(); - self.push_location(&start_location); - let mut name = self.expect_identifier(true); - let mut getter = false; - let mut setter = false; - if self.peek_identifier(true).is_some() { - getter = Token::is_context_keyword(&self.previous_token, "get"); - setter = Token::is_context_keyword(&self.previous_token, "set"); - if getter || setter { - name = self.expect_identifier(true); - } - } - let constructor = !getter && !setter && context.function_name_is_constructor(&name); - let name = if getter { - FunctionName::Getter(name) - } else if setter { - FunctionName::Setter(name) - } else if constructor { - FunctionName::Constructor(name) - } else { - FunctionName::Identifier(name) - }; - let block_context = if constructor { - ParserDirectiveContext::ConstructorBlock { super_statement_found: Rc::new(Cell::new(false)) } - } else { - ParserDirectiveContext::Default - }; - let common = self.parse_function_common(false, block_context, true); - let semicolon = if common.has_block_body() { true } else { self.parse_semicolon() }; - - /* - if constructor && common.signature.result_type.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::ConstructorMustNotSpecifyResultType, diagarg![]); - } - */ - - // Not all kinds of functions may be generators. - if common.contains_yield && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeGenerator, diagarg![]); - } - - // Not all kinds of functions may be asynchronous. - if common.contains_await && (constructor || getter || setter) { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMayNotBeAsynchronous, diagarg![]); - } - - let interface_method = matches!(context, ParserDirectiveContext::InterfaceBlock); - - // Body verification. - // - // Interface methods are skipped in the verification as they - // may omit body. - if !interface_method { - if (has_native || has_abstract) && common.body.is_some() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainBody, diagarg![]); - } else if !(has_native || has_abstract) && common.body.is_none() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustContainBody, diagarg![]); - } - } - - // Interface methods must not contain any annotations except for meta-data. - if !attributes.is_empty() && interface_method { - if !attributes.last().unwrap().is_metadata() { - self.add_syntax_error(&name.location(), DiagnosticKind::FunctionMustNotContainAnnotations, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => { - if !context.is_type_block() { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - Attribute::Final(_) | - Attribute::Override(_) | - Attribute::Abstract(_) => { - if !context.is_type_block() || constructor { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - }, - - Attribute::Native(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let node = Rc::new(Directive::FunctionDefinition(FunctionDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - common, - })); - - (node, semicolon) - } - - fn parse_class_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression()); - } - let mut implements_clause: Option>> = None; - if self.consume(Token::Implements) { - implements_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::ClassBlock { - name: name.0.clone(), - })); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Static(_) => {}, - Attribute::Final(_) => {}, - Attribute::Dynamic(_) => {}, - Attribute::Abstract(_) => {}, - - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::ClassDefinition(ClassDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - implements_clause, - block, - })); - - (node, true) - } - - fn parse_enum_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, mut attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let mut as_clause: Option> = None; - if self.consume(Token::As) { - as_clause = Some(self.parse_type_expression()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::EnumBlock)); - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let mut is_set = false; - let metadata = Attribute::find_metadata(&attributes); - for metadata in metadata { - if metadata.name.0 == "Set" { - is_set = true; - Attribute::remove_metadata(&mut attributes, &metadata); - } - } - - let node = Rc::new(Directive::EnumDefinition(EnumDefinition { - location: self.pop_location(), - asdoc, - attributes, - is_set, - name: name.clone(), - as_clause, - block, - })); - - (node, true) - } - - fn parse_interface_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let name = self.expect_identifier(true); - let type_parameters = self.parse_type_parameters_opt(); - let mut extends_clause: Option>> = None; - if self.consume(Token::Extends) { - extends_clause = Some(self.parse_type_expression_list()); - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::InterfaceBlock)); - - // Interface block must only contain function definitions - for directive in block.directives.iter() { - if !(matches!(directive.as_ref(), Directive::FunctionDefinition(_))) { - self.add_syntax_error(&directive.location(), DiagnosticKind::DirectiveNotAllowedInInterface, diagarg![]); - } - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&name.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let node = Rc::new(Directive::InterfaceDefinition(InterfaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - name: name.clone(), - type_parameters, - extends_clause, - block, - })); - - (node, true) - } - - fn parse_type_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::Assign); - if !self.expecting_token_error { - right = self.parse_type_expression(); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - // Nested classes not allowed - if !context.is_top_level_or_package() { - self.add_syntax_error(&left.1, DiagnosticKind::NestedClassesNotAllowed, diagarg![]); - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::TypeDefinition(TypeDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_namespace_definition(&mut self, context: AnnotatableContext) -> (Rc, bool) { - let AnnotatableContext { start_location, asdoc, attributes, context, .. } = context; - self.push_location(&start_location); - let left = self.expect_identifier(true); - let mut right: Option> = None; - if self.consume(Token::Assign) { - right = Some(self.parse_expression(ParserExpressionContext { - min_precedence: OperatorPrecedence::AssignmentAndOther, - ..default() - })); - } - - for a in &attributes { - if a.is_metadata() { - continue; - } - match a { - Attribute::Expression(_) | - Attribute::Public(_) | - Attribute::Private(_) | - Attribute::Protected(_) | - Attribute::Internal(_) => { - self.verify_visibility(&a, &context); - }, - Attribute::Static(_) => {}, - _ => { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - }, - } - } - - let semicolon = self.parse_semicolon(); - - let node = Rc::new(Directive::NamespaceDefinition(NamespaceDefinition { - location: self.pop_location(), - asdoc, - attributes, - left: left.clone(), - right, - })); - - (node, semicolon) - } - - fn parse_type_expression_list(&mut self) -> Vec> { - let mut list = vec![self.parse_type_expression()]; - while self.consume(Token::Comma) { - list.push(self.parse_type_expression()); - } - list - } - - fn verify_visibility(&self, a: &Attribute, context: &ParserDirectiveContext) { - let mut unallowed = false; - match a { - Attribute::Expression(_) => {}, - Attribute::Public(_) => {}, - Attribute::Private(_) | - Attribute::Protected(_) => { - if !context.is_type_block() { - unallowed = true; - } - }, - Attribute::Internal(_) => {}, - _ => {} - } - if unallowed { - // Unallowed attribute - self.add_syntax_error(&a.location(), DiagnosticKind::UnallowedAttribute, diagarg![]); - } - } - - fn parse_type_parameters_opt(&mut self) -> Option>> { - if !self.consume(Token::Dot) { - return None; - } - let mut list: Vec> = vec![]; - self.non_greedy_expect(Token::Lt); - if !self.expecting_token_error { - list.push(self.parse_type_parameter()); - while self.consume(Token::Comma) { - list.push(self.parse_type_parameter()); - } - self.non_greedy_expect_type_parameters_gt(); - } - Some(list) - } - - fn parse_type_parameter(&mut self) -> Rc { - self.mark_location(); - let name = self.expect_identifier(false); - Rc::new(TypeParameter { - location: self.pop_location(), - name, - }) - } - - fn parse_configuration_directive(&mut self, context: ParserDirectiveContext, start_location: Location) -> (Rc, bool) { - self.push_location(&start_location); - self.non_greedy_expect(Token::BlockOpen); - let subdirective = self.parse_configuration_subdirective(context.clone()); - self.non_greedy_expect(Token::BlockClose); - (Rc::new(Directive::ConfigurationDirective(ConfigurationDirective { - location: self.pop_location(), - directive: subdirective, - })), true) - } - - fn parse_configuration_subdirective(&mut self, context: ParserDirectiveContext) -> Rc { - if self.peek(Token::If) { - self.mark_location(); - self.next(); - let mut test = self.create_invalidated_expression(&self.tokenizer.cursor_location()); - self.non_greedy_expect(Token::ParenOpen); - if !self.expecting_token_error { - test = self.parse_configuration_expression(); - } - self.non_greedy_expect(Token::ParenClose); - let consequent = Rc::new(Directive::Block(self.parse_block(context.clone()))); - let mut alternative: Option> = None; - if self.consume(Token::Else) { - alternative = Some(self.parse_configuration_subdirective(context.clone())); - } - Rc::new(Directive::IfStatement(IfStatement { - location: self.pop_location(), - test, - consequent, - alternative, - })) - } else { - Rc::new(Directive::Block(self.parse_block(context.clone()))) - } - } - - fn parse_configuration_expression(&mut self) -> Rc { - let mut base = self.parse_configuration_primary_expression(); - if self.consume(Token::LogicalAnd) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalAnd, - left: base.clone(), - right, - })); - } else if self.consume(Token::LogicalOr) { - self.push_location(&base.location()); - let right = self.parse_configuration_expression(); - base = Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: Operator::LogicalOr, - left: base.clone(), - right, - })); - } - base - } - - fn parse_configuration_primary_expression(&mut self) -> Rc { - if let Token::Identifier(_) = &self.token.0.clone() { - self.mark_location(); - let mut id = self.expect_identifier(false); - let mut qual: Option> = None; - if self.consume(Token::ColonColon) { - qual = Some(Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id.1.clone(), - attribute: false, - qualifier: None, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - }))); - id = self.expect_identifier(true); - } - let id_location = self.pop_location(); - let id = Rc::new(Expression::QualifiedIdentifier(QualifiedIdentifier { - location: id_location.clone(), - attribute: false, - qualifier: qual, - id: QualifiedIdentifierIdentifier::Id(id.clone()), - })); - let equality: Option = if self.consume(Token::Assign) { - Some(Operator::Equals) - } else if self.consume(Token::NotEquals) { - Some(Operator::NotEquals) - } else { - None - }; - if let Some(equality) = equality { - self.push_location(&id.location()); - self.mark_location(); - let mut value: String = "".into(); - if let Some((value_1, _)) = self.consume_identifier(false) { - value = value_1; - } else { - if let Token::String(s) = &self.token.0 { - value = s.clone(); - self.next(); - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingStringLiteral, diagarg![self.token.0.clone()]); - while self.token.0 != Token::Eof { - self.next(); - if let Token::String(s) = self.token.0.clone() { - self.pop_location(); - self.mark_location(); - value = s; - self.next(); - } - } - } - } - let right = Rc::new(Expression::StringLiteral(StringLiteral { - location: self.pop_location(), - value, - })); - Rc::new(Expression::Binary(BinaryExpression { - location: self.pop_location(), - operator: equality, - left: id.clone(), - right, - })) - } else { - id - } - } else if self.peek(Token::ParenOpen) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_expression(); - self.non_greedy_expect(Token::ParenClose); - Rc::new(Expression::Paren(ParenExpression { - location: self.pop_location(), - expression, - })) - } else if self.peek(Token::Exclamation) { - self.mark_location(); - self.next(); - let expression = self.parse_configuration_primary_expression(); - Rc::new(Expression::Unary(UnaryExpression { - location: self.pop_location(), - operator: Operator::LogicalNot, - expression, - })) - } else { - self.add_syntax_error(&self.token_location(), DiagnosticKind::ExpectingExpression, diagarg![self.token.0.clone()]); - self.create_invalidated_expression(&self.tokenizer.cursor_location()) - } - } - - fn keyword_or_expression_attribute_from_expression(&self, expr: &Rc) -> Attribute { - match expr.as_ref() { - Expression::QualifiedIdentifier(id) => { - if id.qualifier.is_some() || id.attribute { - return Attribute::Expression(expr.clone()); - } - match &id.id { - QualifiedIdentifierIdentifier::Id((id, location)) => { - if let Some(attr) = Attribute::from_identifier_name(&id, &location) { - return attr; - } - Attribute::Expression(expr.clone()) - }, - _ => Attribute::Expression(expr.clone()), - } - }, - _ => Attribute::Expression(expr.clone()), - } - } - - fn keyword_attribute_from_previous_token(&self) -> Option { - self.previous_token.0.to_attribute(&self.previous_token.1) - } - - fn _keyword_or_expression_attribute_from_previous_token(&mut self) -> Option { - if let Some(a) = self.keyword_attribute_from_previous_token() { - return Some(a); - } - match &self.previous_token.0 { - Token::Identifier(id) => Some(Attribute::Expression(self.parse_expression_attribute(&(id.clone(), self.previous_token.1.clone())))), - _ => None, - } - } - - fn parse_keyword_or_expression_attribute(&mut self) -> Option { - if let Some(a) = self.token.0.to_attribute(&self.token.1) { - self.next(); - return Some(a); - } - match &self.token.0 { - Token::Identifier(_) => { - let id = self.expect_identifier(false); - Some(Attribute::Expression(self.parse_expression_attribute(&id))) - }, - _ => None, - } - } - - fn peek_annotatable_directive_identifier_name(&self) -> bool { - if self.token.0.to_attribute(&self.token.1).is_some() { - return true; - } - match self.token.0 { - Token::Identifier(_) => true, - Token::Var | - Token::Const | - Token::Function | - Token::Class | - Token::Interface => true, - _ => false, - } - } - - fn lookbehind_is_annotatable_directive_identifier_name(&self) -> bool { - self.keyword_attribute_from_previous_token().is_some() - || matches!(&self.previous_token.0, Token::Identifier(_)) - || Token::is_context_keyword(&self.previous_token, "enum") - || Token::is_context_keyword(&self.previous_token, "type") - || Token::is_context_keyword(&self.previous_token, "namespace") - } - - fn parse_attribute_keywords_or_expressions(&mut self, context: &mut AnnotatableContext) { - if context.directive_context_keyword.is_some() { - unreachable!(); - } - loop { - if let Some(a) = self.parse_keyword_or_expression_attribute() { - if let Attribute::Expression(e) = &a { - let id = e.to_identifier_name(); - if let Some(id) = id { - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - context.directive_context_keyword = Some(id); - break; - } - } - } - let last_attribute_is_identifier = context.attributes.last().map_or(false, |a| !a.is_metadata()); - if last_attribute_is_identifier { - self.forbid_line_break_before_token(); - } - context.attributes.push(a); - // self.next(); - } else { - if let Some(id) = self.peek_identifier(false) { - self.forbid_line_break_before_token(); - if ["enum", "type", "namespace"].contains(&id.0.as_ref()) { - self.next(); - context.directive_context_keyword = Some(id); - } - } - break; - } - } - // For meta-data that are not one of certain Flex meta-data, - // delegate the respective ASDoc to the annotatable directive. - let mut new_attributes = Vec::::new(); - for attr in &context.attributes { - if let Attribute::Metadata(metadata) = attr { - if !is_flex_documentable_meta_data(&metadata.name.0) && metadata.asdoc.is_some() { - new_attributes.push(Attribute::Metadata(Rc::new(Metadata { - location: metadata.location.clone(), - asdoc: None, - name: metadata.name.clone(), - entries: metadata.entries.clone(), - }))); - context.asdoc = metadata.asdoc.clone(); - } else { - new_attributes.push(attr.clone()); - } - } else { - new_attributes.push(attr.clone()); - } - } - context.attributes = new_attributes; - } - - pub fn parse_package_definition(&mut self) -> Rc { - self.mark_location(); - let asdoc = self.parse_asdoc(); - self.non_greedy_expect(Token::Package); - let mut name = vec![]; - if let Some(name1) = self.consume_identifier(false) { - name.push(name1.clone()); - while self.consume(Token::Dot) { - name.push(self.expect_identifier(true)); - } - } - let block = Rc::new(self.parse_block(ParserDirectiveContext::PackageBlock)); - Rc::new(PackageDefinition { - location: self.pop_location(), - asdoc, - name, - block, - }) - } - - pub fn parse_program(&mut self) -> Rc { - self.mark_location(); - let just_eof = self.peek(Token::Eof); - let mut packages = vec![]; - while self.peek(Token::Package) { - packages.push(self.parse_package_definition()); - } - let directives = self.parse_directives(ParserDirectiveContext::TopLevel); - Rc::new(Program { - location: if just_eof { - self.pop_location(); - self.token.1.clone() - } else { - self.pop_location() - }, - packages, - directives, - }) - } - - pub fn parse_asdoc(&mut self) -> Option> { - let comments = self.compilation_unit().comments.borrow(); - let last_comment = comments.last().map(|last_comment| last_comment.clone()); - drop(comments); - last_comment.and_then(|comment| { - if comment.is_asdoc(&self.token.1) { - self.compilation_unit().comments_mut().pop(); - let location = comment.location(); - let comment_prefix_length: usize = 3; - let location1 = Location::with_offsets(self.compilation_unit(), location.first_offset + comment_prefix_length, location.last_offset - 2); - let content = &comment.content.borrow()[1..]; - let (main_body, tags) = self.parse_asdoc_content(&location1, content); - Some(Rc::new(AsDoc { - location, - main_body, - tags, - })) - } else { - None - } - }) - } - - fn parse_asdoc_content(&mut self, location: &Location, content: &str) -> (Option<(String, Location)>, Vec<(AsDocTag, Location)>) { - let lines = self.split_asdoc_lines(location, content); - - let mut main_body: Option<(String, Location)> = None; - let mut tags: Vec<(AsDocTag, Location)> = vec![]; - let mut i = 0; - let line_count = lines.len(); - - let mut building_content_tag_name: Option<(String, Location)> = None; - let mut building_content: Vec<(String, Location)> = vec![]; - let mut inside_code_block = false; - - while i < line_count { - let line = &lines[i]; - let tag = if inside_code_block { None } else { - regex_captures!(r"^([\s\t]*\@)([^\s\t]+)(.*)", &line.content) - }; - if let Some((_, tag_prefix, tag_name, tag_content)) = tag { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &tag_content) { - inside_code_block = true; - } - let tag_name_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() - 1, line.location.first_offset() + tag_prefix.len() + tag_name.len()); - building_content_tag_name = Some((tag_name.into(), tag_name_location)); - let tag_content_location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + tag_prefix.len() + tag_name.len(), line.location.last_offset()); - building_content.push((tag_content.into(), tag_content_location)); - - if ["private", "inheritDoc"].contains(&tag_name) { - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - building_content_tag_name = None; - building_content.clear(); - } - } else { - if regex_is_match!(r"^[\s\t]*```([^`]|$)", &line.content) { - inside_code_block = !inside_code_block; - } - building_content.push((line.content.clone(), line.location.clone())); - } - i += 1; - } - - self.parse_asdoc_tag_or_main_body( - &mut building_content_tag_name, - &mut building_content, - &mut main_body, - &mut tags, - ); - - (main_body, tags) - } - - fn split_asdoc_lines(&mut self, location: &Location, content: &str) -> Vec { - let mut builder = String::new(); - let mut lines = vec![]; - let mut _line_number = location.first_line_number(); - let mut index = location.first_offset(); - let mut line_first_offset = index; - let mut characters = content.chars(); - while let Some(ch) = characters.next() { - if CharacterValidator::is_line_terminator(ch) { - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - index += ch.len_utf8(); - // sequence - if ch == '\r' && characters.clone().next().unwrap_or('\x00') == '\n' { - index += '\n'.len_utf8(); - characters.next(); - } - builder = String::new(); - _line_number += 1; - line_first_offset = index; - } else { - builder.push(ch); - index += ch.len_utf8(); - } - } - lines.push(ParserAsDocLine { - content: builder, - location: Location::with_offsets(self.compilation_unit(), line_first_offset, index), - }); - for line in &mut lines { - let line_content = line.content.to_owned(); - let prefix = regex_captures!(r"^\s*(\*\s?)", &line_content); - if let Some((prefix, _)) = prefix { - line.content = line.content[prefix.len()..].to_owned(); - line.location = Location::with_offsets(self.compilation_unit(), line.location.first_offset() + prefix.len(), line.location.last_offset()); - } - } - - lines - } - - fn parse_asdoc_tag_or_main_body( - &self, - building_content_tag_name: &mut Option<(String, Location)>, - building_content: &mut Vec<(String, Location)>, - main_body: &mut Option<(String, Location)>, - tags: &mut Vec<(AsDocTag, Location)> - ) { - if let Some((tag_name, ref tag_location)) = building_content_tag_name.as_ref() { - match tag_name.as_ref() { - // @author Author text - "author" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Author(content), location)); - }, - - // @copy reference - "copy" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some(reference) = self.parse_asdoc_reference(&content, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::Copy(reference), location)); - } - }, - - // @created Date text - "created" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Created(content), location)); - }, - - // @default value - "default" => { - let (reference, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Default(reference), location)); - }, - - // @deprecated - "deprecated" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - let mut message: Option = None; - - if !regex_is_match!(r"^\s*$", &text) { - message = Some(text.clone()); - } - - tags.push((AsDocTag::Deprecated { message }, location)); - }, - - // @eventType typeOrConstant - "eventType" => { - let (_, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - tags.push((AsDocTag::EventType(exp), location)); - }, - - // @example text - "example" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Example(text), location)); - }, - - // @inheritDoc - "inheritDoc" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::InheritDoc, location)); - }, - - // @internal text - "internal" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Internal(text), location)); - }, - - // @langversion text - "langversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Langversion(text), location)); - }, - - // @param paramName description - "param" => { - let (content, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - if let Some((_, name, description)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - tags.push((AsDocTag::Param { name: name.into(), description: description.trim_start().into() }, location)); - } else { - tags.push((AsDocTag::Param { name: content, description: "".into() }, location)); - } - }, - - // @playerversion text - "playerversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Playerversion(text), location)); - }, - - // @private - "private" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be empty - if !regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Private, location)); - }, - - // @productversion text - "productversion" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - - // Content must be non empty - if regex_is_match!(r"^\s*$", &text) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - - tags.push((AsDocTag::Productversion(text), location)); - }, - - // @return text - "return" => { - let (text, location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Return(text), location)); - }, - - // @see reference [displayText] - "see" => { - let (content, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - let reference: String; - let display_text: Option; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - if let Some((_, reference_1, display_text_1)) = regex_captures!(r"(?x) ([^\s]+) (.*)", &content) { - reference = reference_1.to_owned(); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + reference.len()); - display_text = Some(display_text_1.trim().to_owned()); - } else { - reference = content; - display_text = None; - } - if let Some(reference) = self.parse_asdoc_reference(&reference, &reference_loc, &tag_location, &tag_name) { - tags.push((AsDocTag::See { reference, display_text }, location)); - } - }, - - // @throws className description - "throws" => { - let (class_name_and_description, c_location) = join_asdoc_content(building_content); - let location = tag_location.combine_with(c_location.clone()); - - let class_name_and_description = regex_captures!(r"^([^\s]+)(\s.*)?", &class_name_and_description); - - if let Some((_, class_name, description)) = class_name_and_description { - let description = description.trim().to_owned(); - let description = if description.is_empty() { - None - } else { - Some(description) - }; - let mut reference_loc = c_location.shift_whitespace(&self.compilation_unit().text()[c_location.first_offset()..c_location.last_offset()]); - reference_loc = Location::with_offsets(self.compilation_unit(), reference_loc.first_offset(), reference_loc.first_offset() + class_name.len()); - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_type_expression(); - tags.push((AsDocTag::Throws { class_reference: exp, description }, location)); - } else { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - }, - - // @version Version text - "version" => { - let (content, location) = join_asdoc_content(building_content); - // Content must be non empty - if regex_is_match!(r"^\s*$", &content) { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.clone()]); - } - let location = tag_location.combine_with(location); - tags.push((AsDocTag::Version(content), location)); - }, - - // Unrecognized tag - _ => { - self.add_syntax_error(&tag_location, DiagnosticKind::UnrecognizedAsDocTag, diagarg![tag_name.clone()]); - }, - } - } else if !building_content.is_empty() { - let content = join_asdoc_content(building_content); - if !content.0.is_empty() { - *main_body = Some(content); - } - } - - *building_content_tag_name = None; - building_content.clear(); - } - - fn parse_asdoc_reference(&self, reference: &str, reference_loc: &Location, tag_location: &Location, tag_name: &str) -> Option> { - let split: Vec<&str> = reference.split("#").collect(); - if split.len() > 2 { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - let mut base: Option> = None; - let base_text: String = split[0].to_owned(); - let instance_property_text: Option<(String, Location)> = split.get(1).and_then(|&f| if f.is_empty() { None } else { - Some((f.to_owned(), Location::with_offsets(self.compilation_unit(), reference_loc.first_offset() + base_text.len() + 1, reference_loc.last_offset()))) - }); - - if !base_text.is_empty() { - let parser_options = ParserOptions { - byte_range: Some((reference_loc.first_offset(), reference_loc.first_offset() + base_text.len())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_expression(); - base = Some(exp); - } - - let mut instance_property: Option> = None; - if let Some(text) = instance_property_text { - let parser_options = ParserOptions { - byte_range: Some((text.1.first_offset(), text.1.last_offset())), - ..self.options() - }; - let exp = ParserFacade(self.compilation_unit(), parser_options).parse_qualified_identifier(); - instance_property = Some(Rc::new(exp)); - } - - if base.is_none() && instance_property.is_none() { - self.add_syntax_error(&tag_location, DiagnosticKind::FailedParsingAsDocTag, diagarg![tag_name.to_owned()]); - return None; - } - Some(Rc::new(AsDocReference { base, instance_property, })) - } - - /// Parses MXMLElement starting from its XMLTagContent. - fn parse_mxml_element(&mut self, start: Location, namespace: &Rc, encoding: &mut String) -> MxmlElement { - self.push_location(&start); - let namespace = Rc::new(MxmlNamespace::new(Some(namespace))); - let name = self.parse_xml_name(); - let mut attributes: Vec> = vec![]; - let mut plain_attributes: Vec = vec![]; - while self.consume_and_ie_xml_tag(Token::XmlWhitespace) { - if matches!(self.token.0, Token::XmlName(_)) { - self.mark_location(); - let name = self.parse_xml_name(); - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - self.non_greedy_expect_and_ie_xml_tag(Token::Assign); - let mut value = ("".into(), self.token.1.clone()); - if !self.expecting_token_error { - self.consume_and_ie_xml_tag(Token::XmlWhitespace); - value = self.parse_xml_attribute_value(); - } - let attrib = PlainMxmlAttribute { - location: self.pop_location(), - name, - value, - }; - self.process_mxml_xmlns_attribute(&mut attributes, &attrib, &namespace); - plain_attributes.push(attrib); - } else { - break; - } - } - - for attrib in &plain_attributes { - self.process_mxml_attribute(&mut attributes, &attrib, &namespace); - } - - let name = self.process_mxml_tag_name(name, &namespace); - - let mut content: Option>> = None; - let mut closing_name: Option = None; - - let is_empty = self.consume_and_ie_xml_content(Token::XmlSlashGt); - - if !is_empty { - self.expect_and_ie_xml_content(Token::Gt); - content = Some(self.parse_mxml_content(false, &namespace, encoding)); - self.non_greedy_expect_and_ie_xml_tag(Token::XmlLtSlash); - let name_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 fb43f34..0000000 --- a/crates/parser/parser/tokenizer.rs +++ /dev/null @@ -1,1305 +0,0 @@ -use crate::ns::*; - -pub struct Tokenizer<'input> { - compilation_unit: Rc, - characters: CharacterReader<'input>, -} - -impl<'input> Tokenizer<'input> { - /// Constructs a tokenizer. - pub fn new(compilation_unit: &'input Rc, options: &ParserOptions) -> Self { - let text: &'input str = compilation_unit.text(); - let compilation_unit = compilation_unit.clone(); - let characters: CharacterReader<'input>; - if let Some(range) = options.byte_range { - characters = CharacterReader::from_offset(&text[0..range.1], range.0); - } else { - characters = CharacterReader::from(text); - } - Self { - compilation_unit, - characters, - } - } - - pub fn compilation_unit(&self) -> &Rc { - &self.compilation_unit - } - - pub fn characters(&self) -> &CharacterReader<'input> { - &self.characters - } - - fn add_syntax_error(&self, location: &Location, kind: DiagnosticKind, arguments: Vec>) { - if self.compilation_unit.prevent_equal_offset_error(location) { - return; - } - self.compilation_unit.add_diagnostic(Diagnostic::new_syntax_error(location, kind, arguments)); - } - - /// Scans for an *InputElementDiv* token. - pub fn scan_ie_div(&mut self) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_whitespace(ch) { - self.characters.next(); - } else if self.consume_line_terminator() || self.consume_comment() { - // Consumed line terminator or comment - } else { - break; - } - } - if let Some(result) = self.scan_identifier() { - return result; - } - if let Some(result) = self.scan_dot_or_numeric_literal() { - return result; - } - if let Some(result) = self.scan_string_literal(false) { - return result; - } - let start = self.cursor_location(); - match self.characters.peek_or_zero() { - ',' => { - // Comma - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Comma, location); - }, - '(' => { - // ParenOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenOpen, location); - }, - ')' => { - // ParenClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ParenClose, location); - }, - '[' => { - // SquareOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareOpen, location); - }, - ']' => { - // SquareClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SquareClose, location); - }, - '{' => { - // BlockOpen - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockOpen, location); - }, - '}' => { - // BlockClose - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BlockClose, location); - }, - ':' => { - self.characters.next(); - // ColonColon - if self.characters.peek_or_zero() == ':' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::ColonColon, location); - } - // Colon - let location = start.combine_with(self.cursor_location()); - return (Token::Colon, location); - }, - '=' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictEquals, location); - } - // Equals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Equals, location); - } - // Assign - let location = start.combine_with(self.cursor_location()); - return (Token::Assign, location); - }, - '!' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // StrictNotEquals - if ch == '=' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::StrictNotEquals, location); - } - // NotEquals - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NotEquals, location); - } - // Exclamation - let location = start.combine_with(self.cursor_location()); - return (Token::Exclamation, location); - }, - '?' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // OptionalChaining - if ch == '.' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::OptionalChaining, location); - } - // NullCoalescingAssign - if ch == '?' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescingAssign, location); - } - // NullCoalescing - if ch == '?' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::NullCoalescing, location); - } - // Question - let location = start.combine_with(self.cursor_location()); - return (Token::Question, location); - }, - ';' => { - // Semicolon - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Semicolon, location); - }, - '<' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Le - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Le, location); - } - // LeftShiftAssign - if ch == '<' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShiftAssign, location); - } - // LeftShift - if ch == '<' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LeftShift, location); - } - // Lt - let location = start.combine_with(self.cursor_location()); - return (Token::Lt, location); - }, - '>' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Ge - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Ge, location); - } - // RightShiftAssign - if ch == '>' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShiftAssign, location); - } - // UnsignedRightShiftAssign - if ch == '>' && self.characters.peek_seq(3) == ">>=" { - self.characters.skip_count_in_place(3); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShiftAssign, location); - } - // UnsignedRightShift - if ch == '>' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::UnsignedRightShift, location); - } - // RightShift - if ch == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RightShift, location); - } - // Gt - let location = start.combine_with(self.cursor_location()); - return (Token::Gt, location); - }, - '@' => { - // Attribute - self.characters.next(); - if let Some(token) = self.scan_string_literal(true) { - return token; - } - let location = start.combine_with(self.cursor_location()); - return (Token::Attribute, location); - }, - '+' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Increment - if ch == '+' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Increment, location); - } - // AddAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::AddAssign, location); - } - // Plus - let location = start.combine_with(self.cursor_location()); - return (Token::Plus, location); - }, - '-' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // Decrement - if ch == '-' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Decrement, location); - } - // SubtractAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::SubtractAssign, location); - } - // Minus - let location = start.combine_with(self.cursor_location()); - return (Token::Minus, location); - }, - '*' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // PowerAssign - if ch == '*' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::PowerAssign, location); - } - // Power - if ch == '*' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Power, location); - } - // MultiplyAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::MultiplyAssign, location); - } - // Times - let location = start.combine_with(self.cursor_location()); - return (Token::Times, location); - }, - '/' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // DivideAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::DivideAssign, location); - } - // Div - let location = start.combine_with(self.cursor_location()); - return (Token::Div, location); - }, - '%' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // RemainderAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::RemainderAssign, location); - } - // Percent - let location = start.combine_with(self.cursor_location()); - return (Token::Percent, location); - }, - '&' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalAndAssign - if ch == '&' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAndAssign, location); - } - // LogicalAnd - if ch == '&' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalAnd, location); - } - // BitwiseAndAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseAndAssign, location); - } - // BitwiseAnd - let location = start.combine_with(self.cursor_location()); - return (Token::Ampersand, location); - }, - '^' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalXorAssign - if ch == '^' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXorAssign, location); - } - // LogicalXor - if ch == '^' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalXor, location); - } - // BitwiseXorAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseXorAssign, location); - } - // BitwiseXor - let location = start.combine_with(self.cursor_location()); - return (Token::Hat, location); - }, - '|' => { - self.characters.next(); - let ch = self.characters.peek_or_zero(); - // LogicalOrAssign - if ch == '|' && self.characters.peek_at_or_zero(1) == '=' { - self.characters.skip_count_in_place(2); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOrAssign, location); - } - // LogicalOr - if ch == '|' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::LogicalOr, location); - } - // BitwiseOrAssign - if ch == '=' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::BitwiseOrAssign, location); - } - // BitwiseOr - let location = start.combine_with(self.cursor_location()); - return (Token::Pipe, location); - }, - '~' => { - // BitwiseNot - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::Tilde, location); - }, - _ => { - if self.characters.has_remaining() { - self.add_unexpected_error(); - self.characters.next(); - return self.scan_ie_div(); - // Eof - } else { - return (Token::Eof, start) - } - }, - } - } - - /// Scans regular expression after a `/` or `/=` token has been scanned by - /// `scan_ie_div`. - pub fn scan_regexp_literal(&mut self, start: Location, mut body: String) -> (Token, Location) { - loop { - let ch = self.characters.peek_or_zero(); - if ch == '/' { - self.characters.next(); - break; - } else if ch == '\\' { - self.characters.next(); - body.push('\\'); - let ch = self.characters.peek_or_zero(); - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_unexpected_error(); - self.consume_line_terminator(); - } else { - self.characters.next(); - body.push(ch); - } - } else if CharacterValidator::is_line_terminator(ch) { - body.push('\n'); - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSlashForRegExp); - break; - } else { - body.push(ch); - self.characters.next(); - } - } - - let mut flags = String::new(); - while let Some((ch, _)) = self.consume_identifier_part() { - flags.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - (Token::RegExp { body, flags }, location) - } - - fn character_ahead_location(&self) -> Location { - if self.characters.reached_end() { - return self.cursor_location(); - } - let offset = self.characters.index(); - let mut next_characters = self.characters.clone(); - next_characters.next().unwrap(); - Location::with_offsets(&self.compilation_unit, offset, next_characters.index()) - } - - pub fn cursor_location(&self) -> Location { - let offset = self.characters.index(); - Location::with_offset(&self.compilation_unit, offset) - } - - fn add_unexpected_error(&self) { - if self.characters.has_remaining() { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::UnexpectedCharacter, diagarg![self.characters.peek_or_zero().to_string()]) - } else { - self.add_syntax_error(&self.cursor_location(), DiagnosticKind::UnexpectedEnd, vec![]) - } - } - - fn add_unexpected_eof_error(&self, kind: DiagnosticKind) { - self.add_syntax_error(&self.cursor_location(), kind, vec![]); - } - - // LineTerminator - fn consume_line_terminator(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch == '\x0D' && self.characters.peek_at_or_zero(1) == '\x0A' { - self.characters.skip_count_in_place(2); - // self.line_number += 1; - return true; - } - if CharacterValidator::is_line_terminator(ch) { - self.characters.next(); - // self.line_number += 1; - return true; - } - false - } - - fn consume_comment(&mut self) -> bool { - let ch = self.characters.peek_or_zero(); - if ch != '/' { - return false; - } - let ch2 = self.characters.peek_at_or_zero(1); - if ch2 == '/' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - while !CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) && self.characters.has_remaining() { - self.characters.skip_in_place(); - } - let location = start.combine_with(self.cursor_location()); - self.consume_line_terminator(); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: false, - content: RefCell::new(self.compilation_unit.text()[(location.first_offset() + 2)..location.last_offset()].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - if ch2 == '*' { - let start = self.cursor_location(); - self.characters.skip_count_in_place(2); - - loop { - if self.characters.peek_or_zero() == '*' && self.characters.peek_at_or_zero(1) == '/' { - self.characters.skip_count_in_place(2); - break; - } else if self.consume_line_terminator() { - // Consumed LineTerminator - } else if self.characters.has_remaining() { - self.characters.skip_in_place(); - } else { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForMultiLineComment); - break; - } - } - - let location = start.combine_with(self.cursor_location()); - - let i = location.first_offset() + 2; - let j = decrease_last_offset(i, location.last_offset(), 2); - - self.compilation_unit.add_comment(Rc::new(Comment { - multiline: true, - content: RefCell::new(self.compilation_unit.text()[i..j].to_owned()), - location: RefCell::new(location), - })); - - return true; - } - false - } - - fn scan_identifier(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let mut escaped = false; - let Some((ch, escaped_2)) = self.consume_identifier_start() else { - return None; - }; - escaped = escaped || escaped_2; - let mut name = String::new(); - name.push(ch); - while let Some((ch, escaped_2)) = self.consume_identifier_part() { - escaped = escaped || escaped_2; - name.push(ch); - } - - let location = start.combine_with(self.cursor_location()); - if !escaped { - if let Some(token) = As3ReservedWord::token(name.as_ref()) { - return Some((token, location)); - } - } - Some((Token::Identifier(name), location)) - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_start(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_start(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Returns a tuple in the form (*character*, *escaped*). - fn consume_identifier_part(&mut self) -> Option<(char, bool)> { - let ch = self.characters.peek_or_zero(); - if CharacterValidator::is_identifier_part(ch) { - self.characters.next(); - return Some((ch, false)); - } - if self.characters.peek_or_zero() == '\\' { - self.characters.next(); - return Some((self.expect_unicode_escape_sequence(), true)); - } - None - } - - /// Expects UnicodeEscapeSequence starting from `u`. - fn expect_unicode_escape_sequence(&mut self) -> char { - let start = self.cursor_location(); - if self.characters.peek_or_zero() != 'u' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - - // Scan \uXXXX - if CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - let r = char::from_u32(self.expect_hex_digit() << 12 - | (self.expect_hex_digit() << 8) - | (self.expect_hex_digit() << 4) - | self.expect_hex_digit()); - let Some(r) = r else { - self.add_syntax_error(&start.combine_with(self.cursor_location()), DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - return r; - } - - // Scan \u{} - if self.characters.peek_or_zero() != '{' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - } - if self.characters.peek_or_zero() != '}' { - self.add_unexpected_error(); - return '\x5F'; - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - let r = u32::from_str_radix(&self.compilation_unit.text()[(start.first_offset + 2)..(location.last_offset - 1)], 16); - let Ok(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - let r = char::from_u32(r); - let Some(r) = r else { - self.add_syntax_error(&location, DiagnosticKind::InvalidEscapeValue, vec![]); - return '\x5F'; - }; - r - } - - fn expect_hex_digit(&mut self) -> u32 { - let ch = self.characters.peek_or_zero(); - let mv = CharacterValidator::hex_digit_mv(ch); - if mv.is_none() { - self.add_unexpected_error(); - return 0x5F; - } - self.characters.next(); - mv.unwrap() - } - - fn scan_dot_or_numeric_literal(&mut self) -> Option<(Token, Location)> { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - let mut initial_dot = false; - if ch == '.' { - initial_dot = true; - self.characters.next(); - - let seq = self.characters.peek_seq(2); - // Ellipsis - if seq == ".." { - self.characters.skip_count_in_place(2); - return Some((Token::Ellipsis, start.combine_with(self.cursor_location()))); - } - let ch = seq.get(..1).map(|ch| ch.chars().next().unwrap()).unwrap_or('\x00'); - // Descendants - if ch == '.' { - self.characters.next(); - return Some((Token::Descendants, start.combine_with(self.cursor_location()))); - } - // Dot - if !CharacterValidator::is_dec_digit(ch) { - return Some((Token::Dot, start.combine_with(self.cursor_location()))); - } - - // NumericLiteral - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else if ch == '0' { - self.characters.next(); - let ch_2 = self.characters.peek_or_zero(); - - // HexLiteral - if ['X', 'x'].contains(&ch_2) { - self.characters.next(); - return self.scan_hex_literal(start.clone()); - } - - // BinLiteral; - if ['B', 'b'].contains(&ch_2) { - self.characters.next(); - return self.scan_bin_literal(start.clone()); - } - } else if CharacterValidator::is_dec_digit(ch) { - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } else { - return None; - } - - if !initial_dot && self.characters.peek_or_zero() == '.' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - // Decimal exponent - if ['E', 'e'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - if ['+', '-'].contains(&self.characters.peek_or_zero()) { - self.characters.next(); - } - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_dec_digit(); - } - } - - let string = self.compilation_unit.text()[start.first_offset..self.characters.index()].to_owned(); - - let mut suffix = NumberSuffix::None; - if self.characters.peek_or_zero() == 'f' || self.characters.peek_or_zero() == 'F' { - suffix = NumberSuffix::F; - self.characters.next(); - } - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - - Some((Token::Number(string, suffix), location)) - } - - fn scan_hex_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_hex_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn scan_bin_literal(&mut self, start: Location) -> Option<(Token, Location)> { - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - while CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.characters.next(); - self.consume_underscore_followed_by_bin_digit(); - } - - let suffix = NumberSuffix::None; - self.unallow_numeric_suffix(); - - let location = start.combine_with(self.cursor_location()); - let s = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - Some((Token::Number(s, suffix), location)) - } - - fn consume_underscore_followed_by_dec_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_hex_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_hex_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn consume_underscore_followed_by_bin_digit(&mut self) { - if self.characters.peek_or_zero() == '_' { - self.characters.next(); - if !CharacterValidator::is_bin_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - self.characters.next(); - } - } - - fn unallow_numeric_suffix(&self) { - if CharacterValidator::is_identifier_start(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - } - - fn scan_string_literal(&mut self, raw: bool) -> Option<(Token, Location)> { - let delim = self.characters.peek_or_zero(); - if !['"', '\''].contains(&delim) { - return None; - } - let mut start = self.cursor_location(); - // Include the "@" punctuator as part of raw string literals - if raw { - start = Location::with_offset(&start.compilation_unit(), start.first_offset() - 1); - } - - self.characters.next(); - - // Triple string literal - if self.characters.peek_or_zero() == delim && self.characters.peek_at_or_zero(1) == delim { - self.characters.skip_count_in_place(2); - return self.scan_triple_string_literal(delim, start, raw); - } - - let mut value = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - value.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim { - self.characters.next(); - break; - } else if CharacterValidator::is_line_terminator(ch) { - self.add_syntax_error(&self.character_ahead_location(), DiagnosticKind::StringLiteralMustBeTerminatedBeforeLineBreak, vec![]); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - break; - } else { - value.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - Some((Token::String(value), location)) - } - - fn scan_triple_string_literal(&mut self, delim: char, start: Location, raw: bool) -> Option<(Token, Location)> { - let mut lines: Vec = vec![]; - let mut builder = String::new(); - - if raw { - loop { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } else { - loop { - if let Some(s) = self.consume_escape_sequence() { - builder.push_str(&s); - } else { - let ch = self.characters.peek_or_zero(); - if ch == delim && self.characters.peek_at_or_zero(1) == delim && self.characters.peek_at_or_zero(2) == delim { - self.characters.skip_count_in_place(3); - lines.push(builder.clone()); - break; - } else if CharacterValidator::is_line_terminator(ch) { - lines.push(builder.clone()); - builder.clear(); - self.consume_line_terminator(); - } else if !self.characters.has_remaining() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForString); - lines.push(builder.clone()); - builder.clear(); - break; - } else { - builder.push(ch); - self.characters.next(); - } - } - } - } - - let location = start.combine_with(self.cursor_location()); - - if lines[0].is_empty() && lines.len() > 1 { - lines.remove(0); - } - - let last_line = lines.pop().unwrap(); - - let base_indent = CharacterValidator::indent_count(&last_line); - - let mut lines: Vec = lines.iter().map(|line| { - let indent = CharacterValidator::indent_count(line); - line[usize::min(base_indent, indent)..].to_owned() - }).collect(); - - let last_line = last_line[base_indent..].to_owned(); - if !last_line.is_empty() { - lines.push(last_line); - } - - let value = lines.join("\n"); - Some((Token::String(value), location)) - } - - fn consume_escape_sequence(&mut self) -> Option { - if self.characters.peek_or_zero() != '\\' { - return None; - } - self.characters.next(); - if !self.characters.has_remaining() { - self.add_unexpected_error(); - return Some("".into()); - } - if self.consume_line_terminator() { - return Some("".into()); - } - let ch = self.characters.peek_or_zero(); - match ch { - '\'' | '"' | '\\' => { - self.characters.next(); - Some(ch.into()) - }, - 'u' => { - Some(self.expect_unicode_escape_sequence().into()) - }, - 'x' => { - self.characters.next(); - let v = (self.expect_hex_digit() << 4) | self.expect_hex_digit(); - let v = char::from_u32(v).unwrap(); - Some(v.into()) - }, - 'b' => { - self.characters.next(); - Some('\x08'.into()) - }, - 'f' => { - self.characters.next(); - Some('\x0C'.into()) - }, - 'n' => { - self.characters.next(); - Some('\x0A'.into()) - }, - 'r' => { - self.characters.next(); - Some('\x0D'.into()) - }, - 't' => { - self.characters.next(); - Some('\x09'.into()) - }, - 'v' => { - self.characters.next(); - Some('\x0B'.into()) - }, - '0' => { - self.characters.next(); - if CharacterValidator::is_dec_digit(self.characters.peek_or_zero()) { - self.add_unexpected_error(); - } - Some('\x00'.into()) - }, - ch => { - if CharacterValidator::is_dec_digit(ch) { - self.add_unexpected_error(); - } - self.characters.next(); - Some(ch.into()) - }, - } - } - - /// Scans for an *InputElementXMLTag* token. - pub fn scan_ie_xml_tag(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - // XmlName - if CharacterValidator::is_xml_name_start(ch) { - self.characters.next(); - while CharacterValidator::is_xml_name_part(self.characters.peek_or_zero()) { - self.characters.next(); - } - let location = start.combine_with(self.cursor_location()); - let name = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - return (Token::XmlName(name), location); - } - - // XmlWhitespace - if CharacterValidator::is_xml_whitespace(ch) { - while CharacterValidator::is_xml_whitespace(self.characters.peek_or_zero()) { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - let location = start.combine_with(self.cursor_location()); - return (Token::XmlWhitespace, location); - } - - match ch { - // Assign - '=' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Assign, location) - }, - - // Gt - '>' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::Gt, location) - }, - - // XmlSlashGt - '/' => { - self.characters.next(); - if self.characters.peek_or_zero() != '>' { - self.add_unexpected_error(); - /* - while self.characters.has_remaining() { - self.characters.next(); - if self.characters.peek_or_zero() == '>' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - } - */ - let location = start.combine_with(self.cursor_location()); - return (Token::XmlSlashGt, location); - } - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::XmlSlashGt, location) - }, - - // XmlAttributeValue - '"' | '\'' => { - let delim = ch; - self.characters.next(); - while self.characters.peek_or_zero() != delim && self.characters.has_remaining() { - if !self.consume_line_terminator() { - self.characters.next(); - } - } - if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingQuoteForAttributeValue); - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlAttributeValue(value), location); - } - let value = self.compilation_unit.text()[(start.first_offset + 1)..self.cursor_location().first_offset].to_owned(); - self.characters.next(); - - let location = start.combine_with(self.cursor_location()); - (Token::XmlAttributeValue(value), location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - self.add_unexpected_error(); - self.characters.next(); - self.scan_ie_xml_tag() - }, - } - } - - /// Scans for an *InputElementXMLContent* token. - pub fn scan_ie_xml_content(&mut self) -> (Token, Location) { - let start = self.cursor_location(); - let ch = self.characters.peek_or_zero(); - - match ch { - '<' => { - self.characters.next(); - - // XmlMarkup - if let Some(r) = self.scan_xml_markup(start.clone()) { - return r; - } - - // XmlLtSlash - if self.characters.peek_or_zero() == '/' { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - return (Token::XmlLtSlash, location); - } - - // Lt - let location = start.combine_with(self.cursor_location()); - (Token::Lt, location) - }, - - // BlockOpen - '{' => { - self.characters.next(); - let location = start.combine_with(self.cursor_location()); - (Token::BlockOpen, location) - }, - - // XmlName - _ => { - if self.characters.reached_end() { - return (Token::Eof, self.cursor_location()); - } - loop { - let ch = self.characters.peek_or_zero(); - if ['<', '{'].contains(&ch) { - break; - } - if CharacterValidator::is_line_terminator(ch) { - self.consume_line_terminator(); - } else if self.characters.has_remaining() { - self.characters.next(); - } else { - break; - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - (Token::XmlText(content), location) - }, - } - } - - /// Attempts to scan a XMLMarkup token after a `<` character. - pub fn scan_xml_markup(&mut self, start: Location) -> Option<(Token, Location)> { - // XMLComment - if self.characters.peek_seq(3) == "!--" { - self.characters.skip_count_in_place(3); - loop { - if self.characters.peek_or_zero() == '-' && self.characters.peek_seq(3) == "-->" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForXmlComment); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLCDATA - if self.characters.peek_seq(8) == "![CDATA[" { - self.characters.skip_count_in_place(8); - loop { - if self.characters.peek_or_zero() == ']' && self.characters.peek_seq(3) == "]]>" { - self.characters.skip_count_in_place(3); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForCData); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - // XMLPI - if self.characters.peek_or_zero() == '?' { - self.characters.next(); - loop { - if self.characters.peek_or_zero() == '?' && self.characters.peek_at_or_zero(1) == '>' { - self.characters.skip_count_in_place(2); - break; - } else if CharacterValidator::is_line_terminator(self.characters.peek_or_zero()) { - self.consume_line_terminator(); - } else if self.characters.reached_end() { - self.add_unexpected_eof_error(DiagnosticKind::InputEndedBeforeReachingClosingSeqForPi); - break; - } else { - self.characters.next(); - } - } - - let location = start.combine_with(self.cursor_location()); - let content = self.compilation_unit.text()[location.first_offset..location.last_offset].to_owned(); - - return Some((Token::XmlMarkup(content), location)); - } - - None - } -} \ No newline at end of file diff --git a/crates/parser/tree.rs b/crates/parser/tree.rs deleted file mode 100644 index 3fc4e2c..0000000 --- a/crates/parser/tree.rs +++ /dev/null @@ -1,161 +0,0 @@ -//! Defines the syntactic nodes produced by the parser. - -mod invalidated_node; -pub use invalidated_node::*; - -// Expressions -mod expression; -pub use expression::*; -mod qualified_identifier; -pub use qualified_identifier::*; -mod paren_expression; -pub use paren_expression::*; -mod null_literal; -pub use null_literal::*; -mod boolean_literal; -pub use boolean_literal::*; -mod numeric_literal; -pub use numeric_literal::*; -mod string_literal; -pub use string_literal::*; -mod this_literal; -pub use this_literal::*; -mod regexp_literal; -pub use regexp_literal::*; -mod xml_expression; -pub use xml_expression::*; -mod array_literal; -pub use array_literal::*; -mod vector_literal; -pub use vector_literal::*; -mod object_initializer; -pub use object_initializer::*; -mod function_expression; -pub use function_expression::*; -mod import_meta; -pub use import_meta::*; -mod new_expression; -pub use new_expression::*; -mod member_expression; -pub use member_expression::*; -mod computed_member_expression; -pub use computed_member_expression::*; -mod descendants_expression; -pub use descendants_expression::*; -mod filter_expression; -pub use filter_expression::*; -mod super_expression; -pub use super_expression::*; -mod call_expression; -pub use call_expression::*; -mod expression_with_type_arguments; -pub use expression_with_type_arguments::*; -mod unary_expression; -pub use unary_expression::*; -mod optional_chaining_expression; -pub use optional_chaining_expression::*; -mod binary_expression; -pub use binary_expression::*; -mod conditional_expression; -pub use conditional_expression::*; -mod assignment_expression; -pub use assignment_expression::*; -mod sequence_expression; -pub use sequence_expression::*; -mod type_expression; -pub use type_expression::*; -mod reserved_namespace_expression; -pub use reserved_namespace_expression::*; - -// Destructuring -mod destructuring; -pub use destructuring::*; - -// Statements -mod empty_statement; -pub use empty_statement::*; -mod expression_statement; -pub use expression_statement::*; -mod super_statement; -pub use super_statement::*; -mod block; -pub use block::*; -mod labeled_statement; -pub use labeled_statement::*; -mod if_statement; -pub use if_statement::*; -mod switch_statement; -pub use switch_statement::*; -mod do_statement; -pub use do_statement::*; -mod while_statement; -pub use while_statement::*; -mod for_statement; -pub use for_statement::*; -mod continue_statement; -pub use continue_statement::*; -mod break_statement; -pub use break_statement::*; -mod with_statement; -pub use with_statement::*; -mod return_statement; -pub use return_statement::*; -mod throw_statement; -pub use throw_statement::*; -mod try_statement; -pub use try_statement::*; -mod default_xml_namespace_statement; -pub use default_xml_namespace_statement::*; - -// Directives -mod directive; -pub use directive::*; -mod configuration_directive; -pub use configuration_directive::*; -mod import_directive; -pub use import_directive::*; -mod use_namespace_directive; -pub use use_namespace_directive::*; -mod include_directive; -pub use include_directive::*; -mod normal_configuration_directive; -pub use normal_configuration_directive::*; - -// Miscellaneous -mod attributes; -pub use attributes::*; -mod asdoc; -pub use asdoc::*; -mod type_parameter; -pub use type_parameter::*; - -// Definitions -mod variable_definition; -pub use variable_definition::*; -mod function_definition; -pub use function_definition::*; -mod class_definition; -pub use class_definition::*; -mod enum_definition; -pub use enum_definition::*; -mod interface_definition; -pub use interface_definition::*; -mod type_definition; -pub use type_definition::*; -mod namespace_definition; -pub use namespace_definition::*; -mod package_definition; -pub use package_definition::*; -mod program; -pub use program::*; - -// MXML document -mod mxml; -pub use mxml::*; - -// CSS -mod css; -pub use css::*; - -mod tree_semantics; -pub use tree_semantics::*; \ No newline at end of file diff --git a/crates/parser/tree/array_literal.rs b/crates/parser/tree/array_literal.rs deleted file mode 100644 index 3ddf080..0000000 --- a/crates/parser/tree/array_literal.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayLiteral { - pub location: Location, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub elements: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum Element { - Elision, - Expression(Rc), - Rest((Rc, Location)), -} \ No newline at end of file diff --git a/crates/parser/tree/asdoc.rs b/crates/parser/tree/asdoc.rs deleted file mode 100644 index 95d7756..0000000 --- a/crates/parser/tree/asdoc.rs +++ /dev/null @@ -1,52 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDoc { - pub location: Location, - pub main_body: Option<(String, Location)>, - pub tags: Vec<(AsDocTag, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum AsDocTag { - Author(String), - Copy(Rc), - Created(String), - Default(String), - Deprecated { - message: Option, - }, - EventType(Rc), - Example(String), - InheritDoc, - Internal(String), - Langversion(String), - Param { - name: String, - description: String, - }, - Playerversion(String), - Private, - Productversion(String), - Return(String), - See { - reference: Rc, - display_text: Option, - }, - Throws { - class_reference: Rc, - description: Option, - }, - Version(String), -} - -/// An ASDoc reference consisting of an optional base and -/// an optional instance property fragment (`#x`). -#[derive(Clone, Serialize, Deserialize)] -pub struct AsDocReference { - /// Base expression. - pub base: Option>, - /// Instance property fragment following the hash character. - pub instance_property: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/assignment_expression.rs b/crates/parser/tree/assignment_expression.rs deleted file mode 100644 index fbcfe64..0000000 --- a/crates/parser/tree/assignment_expression.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct AssignmentExpression { - pub location: Location, - pub compound: Option, - /// Assignment left-hand side. - /// - /// If the left-hand side is an `ObjectInitializer` or an `ArrayLiteral` - /// and there is no compound assignment, it is a destructuring pattern. - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/attributes.rs b/crates/parser/tree/attributes.rs deleted file mode 100644 index 6e248d0..0000000 --- a/crates/parser/tree/attributes.rs +++ /dev/null @@ -1,170 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum Attribute { - Metadata(Rc), - Expression(Rc), - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), - Final(Location), - Native(Location), - Static(Location), - Abstract(Location), - Override(Location), - Dynamic(Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Metadata { - pub location: Location, - pub asdoc: Option>, - pub name: (String, Location), - pub entries: Option>>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MetadataEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum MetadataValue { - IdentifierString((String, Location)), - String((String, Location)), -} - -impl MetadataValue { - pub fn location(&self) -> Location { - match self { - Self::IdentifierString((_, l)) => l.clone(), - Self::String((_, l)) => l.clone(), - } - } -} - -impl Attribute { - pub fn location(&self) -> Location { - match self { - Self::Expression(m) => m.location(), - Self::Metadata(m) => m.location.clone(), - Self::Public(a) => a.clone(), - Self::Private(a) => a.clone(), - Self::Protected(a) => a.clone(), - Self::Internal(a) => a.clone(), - Self::Final(a) => a.clone(), - Self::Native(a) => a.clone(), - Self::Static(a) => a.clone(), - Self::Abstract(a) => a.clone(), - Self::Override(a) => a.clone(), - Self::Dynamic(a) => a.clone(), - } - } - - pub fn has_access_modifier(list: &[Attribute]) -> bool { - for a in list { - match a { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => return true, - _ => {} - } - } - false - } - - pub fn remove_metadata(list: &mut Vec, metadata: &Rc) { - for i in 0..list.len() { - if let Attribute::Metadata(metadata_1) = &list[i] { - if Rc::ptr_eq(&metadata_1, metadata) { - list.remove(i); - break; - } - } - } - } - - pub fn find_metadata(list: &[Attribute]) -> Vec> { - let mut r = vec![]; - for a in list { - match &a { - Self::Metadata(e) => { - r.push(e.clone()); - }, - _ => {}, - } - } - r - } - pub fn find_expression(list: &[Attribute]) -> Option> { for a in list { match &a { Self::Expression(e) => return Some(e.clone()), _ => {} } }; None } - pub fn find_public(list: &[Attribute]) -> Option { for a in list { match &a { Self::Public(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_private(list: &[Attribute]) -> Option { for a in list { match &a { Self::Private(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_protected(list: &[Attribute]) -> Option { for a in list { match &a { Self::Protected(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_internal(list: &[Attribute]) -> Option { for a in list { match &a { Self::Internal(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_final(list: &[Attribute]) -> Option { for a in list { match &a { Self::Final(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_native(list: &[Attribute]) -> Option { for a in list { match &a { Self::Native(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_static(list: &[Attribute]) -> Option { for a in list { match &a { Self::Static(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_abstract(list: &[Attribute]) -> Option { for a in list { match &a { Self::Abstract(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_override(list: &[Attribute]) -> Option { for a in list { match &a { Self::Override(l) => return Some(l.clone()), _ => {} } }; None } - pub fn find_dynamic(list: &[Attribute]) -> Option { for a in list { match &a { Self::Dynamic(l) => return Some(l.clone()), _ => {} } }; None } - - pub fn has(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Public(_) => Self::find_public(list).is_some(), - Self::Private(_) => Self::find_private(list).is_some(), - Self::Protected(_) => Self::find_protected(list).is_some(), - Self::Internal(_) => Self::find_internal(list).is_some(), - Self::Final(_) => Self::find_final(list).is_some(), - Self::Native(_) => Self::find_native(list).is_some(), - Self::Static(_) => Self::find_static(list).is_some(), - Self::Abstract(_) => Self::find_abstract(list).is_some(), - Self::Override(_) => Self::find_override(list).is_some(), - Self::Dynamic(_) => Self::find_dynamic(list).is_some(), - _ => false, - } - } - - pub fn is_duplicate_access_modifier(list: &[Attribute], attribute: &Attribute) -> bool { - match attribute { - Self::Expression(_) | - Self::Public(_) | - Self::Private(_) | - Self::Protected(_) | - Self::Internal(_) => Self::find_expression(list).is_some() || Self::find_public(list).is_some() || Self::find_private(list).is_some() || Self::find_protected(list).is_some() || Self::find_internal(list).is_some(), - _ => false, - } - } - - pub fn is_metadata(&self) -> bool { matches!(self, Self::Metadata(_)) } - pub fn is_public(&self) -> bool { matches!(self, Self::Public(_)) } - pub fn is_private(&self) -> bool { matches!(self, Self::Private(_)) } - pub fn is_protected(&self) -> bool { matches!(self, Self::Protected(_)) } - pub fn is_internal(&self) -> bool { matches!(self, Self::Internal(_)) } - pub fn is_final(&self) -> bool { matches!(self, Self::Final(_)) } - pub fn is_native(&self) -> bool { matches!(self, Self::Native(_)) } - pub fn is_static(&self) -> bool { matches!(self, Self::Static(_)) } - pub fn is_abstract(&self) -> bool { matches!(self, Self::Abstract(_)) } - pub fn is_override(&self) -> bool { matches!(self, Self::Override(_)) } - pub fn is_dynamic(&self) -> bool { matches!(self, Self::Dynamic(_)) } - - pub fn from_identifier_name(name: &str, location: &Location) -> Option { - if location.character_count() != name.chars().count() { - return None; - } - match name.as_ref() { - "final" => Some(Attribute::Final(location.clone())), - "native" => Some(Attribute::Native(location.clone())), - "static" => Some(Attribute::Static(location.clone())), - "abstract" => Some(Attribute::Abstract(location.clone())), - "override" => Some(Attribute::Override(location.clone())), - "dynamic" => Some(Attribute::Dynamic(location.clone())), - _ => None, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/binary_expression.rs b/crates/parser/tree/binary_expression.rs deleted file mode 100644 index 26bee27..0000000 --- a/crates/parser/tree/binary_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BinaryExpression { - pub location: Location, - pub operator: Operator, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/block.rs b/crates/parser/tree/block.rs deleted file mode 100644 index 1349d32..0000000 --- a/crates/parser/tree/block.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Block statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct Block { - pub location: Location, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/boolean_literal.rs b/crates/parser/tree/boolean_literal.rs deleted file mode 100644 index 537f41f..0000000 --- a/crates/parser/tree/boolean_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BooleanLiteral { - pub location: Location, - pub value: bool, -} \ No newline at end of file diff --git a/crates/parser/tree/break_statement.rs b/crates/parser/tree/break_statement.rs deleted file mode 100644 index 4b75262..0000000 --- a/crates/parser/tree/break_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct BreakStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/call_expression.rs b/crates/parser/tree/call_expression.rs deleted file mode 100644 index 2f502b2..0000000 --- a/crates/parser/tree/call_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct CallExpression { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/class_definition.rs b/crates/parser/tree/class_definition.rs deleted file mode 100644 index fb9d6b3..0000000 --- a/crates/parser/tree/class_definition.rs +++ /dev/null @@ -1,14 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ClassDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>, - pub implements_clause: Option>>, - pub block: Rc, -} diff --git a/crates/parser/tree/computed_member_expression.rs b/crates/parser/tree/computed_member_expression.rs deleted file mode 100644 index c869f5e..0000000 --- a/crates/parser/tree/computed_member_expression.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ComputedMemberExpression { - pub location: Location, - pub base: Rc, - /// ASDoc. Always ignore this field; it is used solely - /// when parsing meta-data. - pub asdoc: Option>, - pub key: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/conditional_expression.rs b/crates/parser/tree/conditional_expression.rs deleted file mode 100644 index cbf1f8d..0000000 --- a/crates/parser/tree/conditional_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ConditionalExpression { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/configuration_directive.rs b/crates/parser/tree/configuration_directive.rs deleted file mode 100644 index c22fccf..0000000 --- a/crates/parser/tree/configuration_directive.rs +++ /dev/null @@ -1,33 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `configuration {}` directive. -/// -/// # Syntax -/// -/// The directive consists of a block -/// of `if..else` branches, whose -/// condition is one of the following expressions: -/// -/// ```plain -/// // Check whether constant is "true" -/// q::x -/// x -/// // Check whether constant is "v" -/// k="v" -/// k=v // QualifiedIdentifier == StringLiteral -/// // Check whether constant is not "v" -/// k!="v" -/// k!=v // QualifiedIdentifier != StringLiteral -/// -/// x && y -/// x || y -/// -/// (x) -/// !x -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct ConfigurationDirective { - pub location: Location, - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/continue_statement.rs b/crates/parser/tree/continue_statement.rs deleted file mode 100644 index 70338d7..0000000 --- a/crates/parser/tree/continue_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ContinueStatement { - pub location: Location, - pub label: Option<(String, Location)>, -} \ No newline at end of file diff --git a/crates/parser/tree/css.rs b/crates/parser/tree/css.rs deleted file mode 100644 index c10a14f..0000000 --- a/crates/parser/tree/css.rs +++ /dev/null @@ -1,471 +0,0 @@ -use std::{marker::PhantomData, str::FromStr}; - -use crate::ns::*; -use num_traits::ToPrimitive; -use serde::{Serialize, Deserialize}; - -/// CSS3 selector combinators. -/// -/// See also: [CSS3 selectors: combinators](http://www.w3.org/TR/css3-selectors/#combinators). -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssCombinatorType { - Descendant, - Child, - Preceded, - Sibling, -} - -impl ToString for CssCombinatorType { - /// Symbol that represents the combinator type. - fn to_string(&self) -> String { - match self { - Self::Descendant => " ".into(), - Self::Child => ">".into(), - Self::Preceded => "+".into(), - Self::Sibling => "~".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssDirective { - Invalidated(InvalidatedNode), - FontFace(CssFontFace), - MediaQuery(CssMediaQuery), - NamespaceDefinition(CssNamespaceDefinition), - Rule(CssRule), -} - -impl CssDirective { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::FontFace(v) => v.location.clone(), - Self::MediaQuery(v) => v.location.clone(), - Self::NamespaceDefinition(v) => v.location.clone(), - Self::Rule(v) => v.location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssPropertyValue { - Invalidated(InvalidatedNode), - /// Example: `yellow, #fff` - Array(CssArrayPropertyValue), - /// Example: `1px solid red` - MultiValue(CssMultiValuePropertyValue), - /// Example: `yellow`, `#fff` - Color(CssColorPropertyValue), - /// Example: `10, 10.0, 10pt` - Number(CssNumberPropertyValue), - /// Example: `rgb(10% 10% 10%)`, `rgb(10%, 10%, 10%)` - RgbColor(CssRgbColorPropertyValue), - /// Example: `"string"` - String(CssStringPropertyValue), - /// Example: `solid`, `_serif` - Identifier(CssIdentifierPropertyValue), - /// `ClassReference(...)` - ClassReference(CssClassReferencePropertyValue), - /// `PropertyReference(...)` - PropertyReference(CssPropertyReferencePropertyValue), - //// `url(...) [format(...)]` - Url(CssUrlPropertyValue), - /// `local(...)` - Local(CssLocalPropertyValue), - /// `Embed(...)` - Embed(CssEmbedPropertyValue), -} - -impl CssPropertyValue { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Array(v) => v.location.clone(), - Self::MultiValue(v) => v.location.clone(), - Self::Color(v) => v.location.clone(), - Self::Number(v) => v.location.clone(), - Self::RgbColor(v) => v.location.clone(), - Self::String(v) => v.location.clone(), - Self::Identifier(v) => v.location.clone(), - Self::ClassReference(v) => v.location.clone(), - Self::PropertyReference(v) => v.location.clone(), - Self::Url(v) => v.location.clone(), - Self::Local(v) => v.location.clone(), - Self::Embed(v) => v.location.clone(), - } - } - - pub fn as_array(&self) -> Option<&CssArrayPropertyValue> { - let Self::Array(v) = self else { return None; }; - Some(v) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelector { - Invalidated(InvalidatedNode), - Base(CssBaseSelector), - Combinator(CssCombinatorSelector), -} - -impl CssSelector { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Base(v) => v.location.clone(), - Self::Combinator(v) => v.location.clone(), - } - } -} - -/// Array property values are comma-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// fillColors: #FFFFFF, #CCCCCC, #FFFFFF, #EEEEEE; -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssArrayPropertyValue { - pub location: Location, - pub elements: Vec>, -} - -/// Multi-value property values are space-separated values in CSS properties. -/// -/// For example: -/// -/// ```css -/// 1px solid blue -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMultiValuePropertyValue { - pub location: Location, - pub values: Vec>, -} - -/// A CSS base selector. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssBaseSelector { - pub location: Location, - pub namespace_prefix: Option<(String, Location)>, - pub element_name: Option<(String, Location)>, - pub conditions: Vec>, -} - -/// Supported condition types for [`CssSelectorCondition`]. -#[derive(Clone, Serialize, Deserialize)] -pub enum CssSelectorCondition { - Invalidated(InvalidatedNode), - /// For example: `s|Label.className` - Class((String, Location)), - /// For example: `s|Label#idValue` - Id((String, Location)), - /// For example: `s|Label:loadingState` - Pseudo((String, Location)), - /// For example: `s|Label::loadingState` - PseudoElement((String, Location)), - /// For example: `s|Panel:not(:first-child)` - Not { - location: Location, - condition: Rc, - }, - /// For example: `s|Label[loadingState]` - Attribute { - location: Location, - name: (String, Location), - operator: Option, - value: Option<(String, Location)>, - }, -} - -impl CssSelectorCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Class((_, l)) => l.clone(), - Self::Id((_, l)) => l.clone(), - Self::Pseudo((_, l)) => l.clone(), - Self::PseudoElement((_, l)) => l.clone(), - Self::Not { location, .. } => location.clone(), - Self::Attribute { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub enum CssAttributeOperator { - Equals, - BeginsWith, - EndsWith, - Contains, - ListMatch, - HreflangMatch, -} - -impl ToString for CssAttributeOperator { - fn to_string(&self) -> String { - match self { - Self::Equals => "=".into(), - Self::BeginsWith => "^=".into(), - Self::EndsWith => "$=".into(), - Self::Contains => "*=".into(), - Self::ListMatch => "~=".into(), - Self::HreflangMatch => "|=".into(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssColorPropertyValue { - pub fn from_hex(location: Location, token_text: &str) -> Result { - let mut token_text = if token_text.starts_with('#') { token_text.to_owned() } else { - "#".to_owned() + token_text - }; - if token_text.len() == 4 { - let mut six = String::new(); - let chars: Vec<_> = token_text.chars().collect(); - six.push('#'); - six.push(chars[1]); - six.push(chars[1]); - six.push(chars[2]); - six.push(chars[2]); - six.push(chars[3]); - six.push(chars[3]); - token_text = six; - } - Ok(Self { - location, - color_int: u32::from_str_radix(&token_text[1..], 16).map_err(|_| ParserError::Common)?.clamp(0x000000, 0xFFFFFF), - }) - } - - pub fn text(&self) -> String { - self.location.text() - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNumberPropertyValue { - pub location: Location, - pub value: f64, - pub unit: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRgbColorPropertyValue { - pub location: Location, - pub color_int: u32, -} - -impl CssRgbColorPropertyValue { - pub fn from_raw_arguments(location: &Location, raw_arguments: &[String]) -> Result { - Ok(CssRgbColorPropertyValue { - location: location.clone(), - color_int: (Self::parse_component(&raw_arguments[0])? << 16) - | (Self::parse_component(&raw_arguments[1])? << 8) - | Self::parse_component(&raw_arguments[2])?, - }) - } - - fn parse_component(input: &str) -> Result { - let i = input.find('%'); - let v: u32; - if let Some(i) = i { - let percent = f64::from_str(&input[..i]).map_err(|_| ParserError::Common)?.clamp(0.0, 100.0); - v = (255.0 * (percent / 100.0)).round().to_u32().ok_or(ParserError::Common)?; - } else if input.contains('.') { - let ratio = f64::from_str(input).map_err(|_| ParserError::Common)?.clamp(0.0, 1.0); - v = (255.0 * ratio).round().to_u32().ok_or(ParserError::Common)?; - } else { - v = u32::from_str(input).map_err(|_| ParserError::Common)?; - } - Ok(v.clamp(0, 255)) - } -} - -/// A CSS text is a string value written without quotes. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssStringPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssIdentifierPropertyValue { - pub location: Location, - pub value: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssClassReferencePropertyValue { - pub location: Location, - /// Name or "null". - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssPropertyReferencePropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssUrlPropertyValue { - pub location: Location, - pub url: (String, Location), - pub format: Option<(String, Location)>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssLocalPropertyValue { - pub location: Location, - pub name: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedPropertyValue { - pub location: Location, - pub entries: Vec>, -} - -/// Represents a key-value entry for an `Embed` function call property value. -/// It may be a keyless entry. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssEmbedEntry { - pub location: Location, - pub key: Option<(String, Location)>, - pub value: (String, Location), -} - -/// A CSS selector containing a combinator. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssCombinatorSelector { - pub location: Location, - pub left: Rc, - pub right: Rc, - pub combinator_type: CssCombinatorType, -} - -/// The root object of a CSS DOM. The CSS3 DOM objects serve not only IDE -/// features in code model, but also CSS compilation. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssDocument { - pub location: Location, - pub directives: Vec>, -} - -/// CSS DOM for an `@font-face` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct CssFontFace { - pub location: Location, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssProperty { - pub location: Location, - pub name: (String, Location), - pub value: Rc, - #[serde(skip)] - _phantom: PhantomData<()>, -} - -impl CssProperty { - pub fn new(location: Location, name: (String, Location), value: Rc) -> Self { - Self { - location, - name: (Self::normalize(&name.0), name.1), - value, - _phantom: PhantomData::default(), - } - } - - /// Normalize CSS property names to camel-case style names. Names already in - /// camel-case will be returned as-is. - fn normalize(name: &str) -> String { - let mut split = name.split('-').map(|s| s.to_owned()).collect::>(); - let mut v = split[0].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_lowercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[0] = v1; - for i in 1..split.len() { - let mut v = split[i].chars(); - let mut v1 = String::new(); - if let Some(ch) = v.next() { - v1.push_str(&ch.to_uppercase().to_string()); - for ch in v { - v1.push(ch); - } - } - split[i] = v1; - } - split.join("") - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssMediaQuery { - pub location: Location, - pub conditions: Vec>, - pub rules: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CssMediaQueryCondition { - Invalidated(InvalidatedNode), - /// Identifier. Example: "screen". - Id((String, Location)), - /// The `only` keyword followed by an identifier. - /// Example: "only screen". - OnlyId { - location: Location, - id: (String, Location), - }, - /// A parenthesized property, such as - /// `(application-dpi: 240)`. - ParenProperty((Rc, Location)), - /// A `condition1 and condition2` expression. - And { - location: Location, - left: Rc, - right: Rc, - }, -} - -impl CssMediaQueryCondition { - pub fn location(&self) -> Location { - match self { - Self::Invalidated(v) => v.location.clone(), - Self::Id((_, l)) => l.clone(), - Self::OnlyId { location, .. } => location.clone(), - Self::ParenProperty((_, l)) => l.clone(), - Self::And { location, .. } => location.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssRule { - pub location: Location, - pub selectors: Vec>, - pub properties: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CssNamespaceDefinition { - pub location: Location, - pub prefix: (String, Location), - pub uri: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/default_xml_namespace_statement.rs b/crates/parser/tree/default_xml_namespace_statement.rs deleted file mode 100644 index 08084e2..0000000 --- a/crates/parser/tree/default_xml_namespace_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DefaultXmlNamespaceStatement { - pub location: Location, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/descendants_expression.rs b/crates/parser/tree/descendants_expression.rs deleted file mode 100644 index d4e7bce..0000000 --- a/crates/parser/tree/descendants_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct DescendantsExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/destructuring.rs b/crates/parser/tree/destructuring.rs deleted file mode 100644 index 3205c3d..0000000 --- a/crates/parser/tree/destructuring.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypedDestructuring { - pub location: Location, - pub destructuring: Rc, - pub type_annotation: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/directive.rs b/crates/parser/tree/directive.rs deleted file mode 100644 index 7506e0e..0000000 --- a/crates/parser/tree/directive.rs +++ /dev/null @@ -1,78 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Directive attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Directive { - EmptyStatement(EmptyStatement), - ExpressionStatement(ExpressionStatement), - SuperStatement(SuperStatement), - Block(Block), - LabeledStatement(LabeledStatement), - IfStatement(IfStatement), - SwitchStatement(SwitchStatement), - SwitchTypeStatement(SwitchTypeStatement), - DoStatement(DoStatement), - WhileStatement(WhileStatement), - ForStatement(ForStatement), - ForInStatement(ForInStatement), - BreakStatement(BreakStatement), - ContinueStatement(ContinueStatement), - WithStatement(WithStatement), - ReturnStatement(ReturnStatement), - ThrowStatement(ThrowStatement), - DefaultXmlNamespaceStatement(DefaultXmlNamespaceStatement), - TryStatement(TryStatement), - Invalidated(InvalidatedNode), - ConfigurationDirective(ConfigurationDirective), - ImportDirective(ImportDirective), - UseNamespaceDirective(UseNamespaceDirective), - IncludeDirective(IncludeDirective), - NormalConfigurationDirective(NormalConfigurationDirective), - VariableDefinition(VariableDefinition), - FunctionDefinition(FunctionDefinition), - ClassDefinition(ClassDefinition), - EnumDefinition(EnumDefinition), - InterfaceDefinition(InterfaceDefinition), - TypeDefinition(TypeDefinition), - NamespaceDefinition(NamespaceDefinition), -} - -impl Directive { - pub fn location(&self) -> Location { - match self { - Self::EmptyStatement(d) => d.location.clone(), - Self::ExpressionStatement(d) => d.location.clone(), - Self::SuperStatement(d) => d.location.clone(), - Self::Block(d) => d.location.clone(), - Self::LabeledStatement(d) => d.location.clone(), - Self::IfStatement(d) => d.location.clone(), - Self::SwitchStatement(d) => d.location.clone(), - Self::SwitchTypeStatement(d) => d.location.clone(), - Self::DoStatement(d) => d.location.clone(), - Self::WhileStatement(d) => d.location.clone(), - Self::ForStatement(d) => d.location.clone(), - Self::ForInStatement(d) => d.location.clone(), - Self::BreakStatement(d) => d.location.clone(), - Self::ContinueStatement(d) => d.location.clone(), - Self::WithStatement(d) => d.location.clone(), - Self::ReturnStatement(d) => d.location.clone(), - Self::ThrowStatement(d) => d.location.clone(), - Self::DefaultXmlNamespaceStatement(d) => d.location.clone(), - Self::TryStatement(d) => d.location.clone(), - Self::Invalidated(d) => d.location.clone(), - Self::ConfigurationDirective(d) => d.location.clone(), - Self::ImportDirective(d) => d.location.clone(), - Self::UseNamespaceDirective(d) => d.location.clone(), - Self::IncludeDirective(d) => d.location.clone(), - Self::NormalConfigurationDirective(d) => d.location.clone(), - Self::VariableDefinition(d) => d.location.clone(), - Self::FunctionDefinition(d) => d.location.clone(), - Self::ClassDefinition(d) => d.location.clone(), - Self::EnumDefinition(d) => d.location.clone(), - Self::InterfaceDefinition(d) => d.location.clone(), - Self::TypeDefinition(d) => d.location.clone(), - Self::NamespaceDefinition(d) => d.location.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/do_statement.rs b/crates/parser/tree/do_statement.rs deleted file mode 100644 index 2c6400e..0000000 --- a/crates/parser/tree/do_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `do..while` statement. -#[derive(Clone, Serialize, Deserialize)] -pub struct DoStatement { - pub location: Location, - pub body: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/empty_statement.rs b/crates/parser/tree/empty_statement.rs deleted file mode 100644 index 73ac431..0000000 --- a/crates/parser/tree/empty_statement.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EmptyStatement { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/enum_definition.rs b/crates/parser/tree/enum_definition.rs deleted file mode 100644 index b1892eb..0000000 --- a/crates/parser/tree/enum_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct EnumDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub is_set: bool, - pub name: (String, Location), - pub as_clause: Option>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression.rs b/crates/parser/tree/expression.rs deleted file mode 100644 index 25e77da..0000000 --- a/crates/parser/tree/expression.rs +++ /dev/null @@ -1,276 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Expression attached with a source location. -#[derive(Clone, Serialize, Deserialize)] -pub enum Expression { - QualifiedIdentifier(QualifiedIdentifier), - Paren(ParenExpression), - NullLiteral(NullLiteral), - BooleanLiteral(BooleanLiteral), - NumericLiteral(NumericLiteral), - StringLiteral(StringLiteral), - ThisLiteral(ThisLiteral), - RegExpLiteral(RegExpLiteral), - Xml(XmlExpression), - XmlMarkup(XmlMarkupExpression), - XmlList(XmlListExpression), - ArrayLiteral(ArrayLiteral), - VectorLiteral(VectorLiteral), - ObjectInitializer(ObjectInitializer), - Function(FunctionExpression), - ImportMeta(ImportMeta), - New(NewExpression), - Member(MemberExpression), - ComputedMember(ComputedMemberExpression), - Descendants(DescendantsExpression), - Filter(FilterExpression), - Super(SuperExpression), - Call(CallExpression), - WithTypeArguments(ExpressionWithTypeArguments), - Unary(UnaryExpression), - OptionalChaining(OptionalChainingExpression), - OptionalChainingPlaceholder(OptionalChainingPlaceholder), - Binary(BinaryExpression), - Conditional(ConditionalExpression), - Assignment(AssignmentExpression), - Sequence(SequenceExpression), - NullableType(NullableTypeExpression), - NonNullableType(NonNullableTypeExpression), - AnyType(AnyTypeExpression), - VoidType(VoidTypeExpression), - ArrayType(ArrayTypeExpression), - TupleType(TupleTypeExpression), - FunctionType(FunctionTypeExpression), - Invalidated(InvalidatedNode), - ReservedNamespace(ReservedNamespaceExpression), -} - -impl Expression { - pub fn location(&self) -> Location { - match self { - Self::QualifiedIdentifier(e) => e.location.clone(), - Self::Paren(e) => e.location.clone(), - Self::NullLiteral(e) => e.location.clone(), - Self::BooleanLiteral(e) => e.location.clone(), - Self::NumericLiteral(e) => e.location.clone(), - Self::StringLiteral(e) => e.location.clone(), - Self::ThisLiteral(e) => e.location.clone(), - Self::RegExpLiteral(e) => e.location.clone(), - Self::Xml(e) => e.location.clone(), - Self::XmlMarkup(e) => e.location.clone(), - Self::XmlList(e) => e.location.clone(), - Self::ArrayLiteral(e) => e.location.clone(), - Self::VectorLiteral(e) => e.location.clone(), - Self::ObjectInitializer(e) => e.location.clone(), - Self::Function(e) => e.location.clone(), - Self::ImportMeta(e) => e.location.clone(), - Self::New(e) => e.location.clone(), - Self::Member(e) => e.location.clone(), - Self::ComputedMember(e) => e.location.clone(), - Self::Descendants(e) => e.location.clone(), - Self::Filter(e) => e.location.clone(), - Self::Super(e) => e.location.clone(), - Self::Call(e) => e.location.clone(), - Self::WithTypeArguments(e) => e.location.clone(), - Self::Unary(e) => e.location.clone(), - Self::OptionalChaining(e) => e.location.clone(), - Self::OptionalChainingPlaceholder(e) => e.location.clone(), - Self::Binary(e) => e.location.clone(), - Self::Conditional(e) => e.location.clone(), - Self::Assignment(e) => e.location.clone(), - Self::Sequence(e) => e.location.clone(), - Self::NullableType(e) => e.location.clone(), - Self::NonNullableType(e) => e.location.clone(), - Self::AnyType(e) => e.location.clone(), - Self::VoidType(e) => e.location.clone(), - Self::ArrayType(e) => e.location.clone(), - Self::TupleType(e) => e.location.clone(), - Self::FunctionType(e) => e.location.clone(), - Self::Invalidated(e) => e.location.clone(), - Self::ReservedNamespace(e) => e.location(), - } - } - - pub(crate) fn to_metadata(&self, parser: &Parser) -> Result>, MetadataRefineError1> { - match self { - Self::ArrayLiteral(ArrayLiteral { elements, asdoc, .. }) => { - if elements.len() != 1 { - return Ok(None); - } - if let Element::Expression(ref exp) = elements[0] { - Ok(Some(vec![Attribute::Metadata(parser.refine_metadata(exp, asdoc.clone()).map_err(|e| MetadataRefineError1(e, exp.location()))?)])) - } else { - Ok(None) - } - }, - Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) => { - let a = base.to_metadata(parser)?; - if a.is_none() { - return Ok(None); - } - let mut a = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - Ok(Some(a)) - }, - _ => Ok(None), - } - } - - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name_or_asterisk(), - _ => None, - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - match self { - Self::QualifiedIdentifier(id) => id.to_identifier_name(), - _ => None, - } - } - - pub fn valid_access_modifier(&self) -> bool { - match self { - Self::QualifiedIdentifier(id) => id.is_identifier_token(), - Self::Member(e) => e.base.valid_access_modifier(), - Self::ComputedMember(e) => e.base.valid_access_modifier(), - _ => false, - } - } - - pub(crate) fn to_reserved_namespace_string(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_string()) - } else { - None - } - } - - pub(crate) fn to_reserved_namespace_attribute(&self) -> Option { - if let Self::ReservedNamespace(e) = self { - Some(e.to_attribute()) - } else { - None - } - } - - pub fn is_invalidated(&self) -> bool { - matches!(self, Self::Invalidated(_)) - } - - pub fn is_non_null_operation(&self) -> bool { - match self { - Self::Unary(expr) => expr.operator == Operator::NonNull, - _ => false, - } - } - - pub fn is_valid_assignment_left_hand_side(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::Unary(e) => e.expression.is_valid_assignment_left_hand_side(), - Self::ArrayLiteral(_) | Self::ObjectInitializer(_) => self.is_valid_destructuring(), - _ => true, - } - } - - pub fn is_valid_destructuring(&self) -> bool { - match self { - Self::Invalidated(_) => true, - Self::QualifiedIdentifier(id) => !id.attribute && id.qualifier.is_none() && match &id.id { - QualifiedIdentifierIdentifier::Id(id) => id.0 != "*", - _ => false, - }, - Self::ArrayLiteral(expr) => { - for el in &expr.elements { - match el { - Element::Elision => {}, - Element::Expression(expr) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - Element::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::ObjectInitializer(init) => { - for field in init.fields.iter() { - match field.as_ref() { - InitializerField::Field { value, .. } => { - if let Some(val) = value { - if !val.is_valid_destructuring() { - return false; - } - } - }, - InitializerField::Rest((expr, _)) => { - if !expr.is_valid_destructuring() { - return false; - } - }, - } - } - true - }, - Self::Unary(expr) => expr.operator == Operator::NonNull && expr.expression.is_valid_destructuring(), - _ => false, - } - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier(&self, parser: &Parser) -> Result)>, MetadataRefineError1> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return Ok(None); - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Ok(Some((q, id.clone(), vec![]))); - } - } - } - } - if let Self::ComputedMember(ComputedMemberExpression { base, asdoc, key, .. }) = self { - let a = base.to_normal_configuration_identifier(parser)?; - if a.is_none() { - return Ok(None); - } - let (ns, name, mut a) = a.unwrap(); - if matches!(key.as_ref(), Self::Sequence(_)) { - return Ok(None); - } - a.push(Attribute::Metadata(parser.refine_metadata(key, asdoc.clone()).map_err(|e| MetadataRefineError1(e, key.location()))?)); - return Ok(Some((ns, name, a))); - } - Ok(None) - } - - /// `CONFIG::VAR_NAME` - pub(crate) fn to_normal_configuration_identifier_no_metadata(&self) -> Option<((String, Location), (String, Location))> { - if let Self::QualifiedIdentifier(id) = self { - if id.attribute { - return None; - } - if let Some(q) = &id.qualifier { - if let Some(q) = q.to_identifier_name() { - if let QualifiedIdentifierIdentifier::Id(id) = &id.id { - return Some((q, id.clone())); - } - } - } - } - None - } -} \ No newline at end of file diff --git a/crates/parser/tree/expression_statement.rs b/crates/parser/tree/expression_statement.rs deleted file mode 100644 index 779fc81..0000000 --- a/crates/parser/tree/expression_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/expression_with_type_arguments.rs b/crates/parser/tree/expression_with_type_arguments.rs deleted file mode 100644 index 8cf5e84..0000000 --- a/crates/parser/tree/expression_with_type_arguments.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `o.<...>` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ExpressionWithTypeArguments { - pub location: Location, - pub base: Rc, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/filter_expression.rs b/crates/parser/tree/filter_expression.rs deleted file mode 100644 index 734b6e7..0000000 --- a/crates/parser/tree/filter_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Filter operation `o.(condition)`. -#[derive(Clone, Serialize, Deserialize)] -pub struct FilterExpression { - pub location: Location, - pub base: Rc, - pub test: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/for_statement.rs b/crates/parser/tree/for_statement.rs deleted file mode 100644 index f648a97..0000000 --- a/crates/parser/tree/for_statement.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForStatement { - pub location: Location, - pub init: Option, - pub test: Option>, - pub update: Option>, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInitializer { - Expression(Rc), - VariableDefinition(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ForInStatement { - pub location: Location, - pub each: bool, - pub left: ForInBinding, - pub right: Rc, - pub body: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ForInBinding { - Expression(Rc), - VariableDefinition(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_definition.rs b/crates/parser/tree/function_definition.rs deleted file mode 100644 index 6da842e..0000000 --- a/crates/parser/tree/function_definition.rs +++ /dev/null @@ -1,111 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: FunctionName, - pub common: Rc, -} - -impl FunctionDefinition { - /// Indicates whether the function definition is not a getter, setter, - /// or constructor. - pub fn is_normal(&self) -> bool { - matches!(self.name, FunctionName::Identifier(_)) - } - pub fn is_getter(&self) -> bool { - matches!(self.name, FunctionName::Getter(_)) - } - pub fn is_setter(&self) -> bool { - matches!(self.name, FunctionName::Setter(_)) - } - pub fn is_constructor(&self) -> bool { - matches!(self.name, FunctionName::Constructor(_)) - } - pub fn name_identifier(&self) -> (String, Location) { - match &self.name { - FunctionName::Identifier(name) => name.clone(), - FunctionName::Getter(name) => name.clone(), - FunctionName::Setter(name) => name.clone(), - FunctionName::Constructor(name) => name.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionName { - Identifier((String, Location)), - Getter((String, Location)), - Setter((String, Location)), - /// A `FunctionName` is a `Constructor` variant - /// when the corresponding function definition is a constructor. - Constructor((String, Location)), -} - -impl FunctionName { - pub fn location(&self) -> Location { - match self { - Self::Identifier((_, l)) => l.clone(), - Self::Getter((_, l)) => l.clone(), - Self::Setter((_, l)) => l.clone(), - Self::Constructor((_, l)) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionCommon { - pub location: Location, - /// Indicates whether the corresponding function - /// contains the `yield` operator. - pub contains_yield: bool, - /// Indicates whether the corresponding function - /// contains the `await` operator. - pub contains_await: bool, - pub signature: FunctionSignature, - pub body: Option, -} - -impl FunctionCommon { - pub(crate) fn has_block_body(&self) -> bool { - if let Some(ref body) = self.body { matches!(body, FunctionBody::Block(_)) } else { false } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionSignature { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Parameter { - pub location: Location, - pub kind: ParameterKind, - pub destructuring: TypedDestructuring, - pub default_value: Option>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -#[repr(u32)] -pub enum ParameterKind { - Required = 1, - Optional = 2, - Rest = 3, -} - -impl ParameterKind { - pub fn may_be_followed_by(&self, other: Self) -> bool { - (*self as u32) <= (other as u32) - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FunctionBody { - Expression(Rc), - Block(Rc), -} \ No newline at end of file diff --git a/crates/parser/tree/function_expression.rs b/crates/parser/tree/function_expression.rs deleted file mode 100644 index 377512e..0000000 --- a/crates/parser/tree/function_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionExpression { - pub location: Location, - pub name: Option<(String, Location)>, - pub common: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/if_statement.rs b/crates/parser/tree/if_statement.rs deleted file mode 100644 index cf84ca0..0000000 --- a/crates/parser/tree/if_statement.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IfStatement { - pub location: Location, - pub test: Rc, - pub consequent: Rc, - pub alternative: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/import_directive.rs b/crates/parser/tree/import_directive.rs deleted file mode 100644 index cbf86a1..0000000 --- a/crates/parser/tree/import_directive.rs +++ /dev/null @@ -1,25 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportDirective { - pub location: Location, - pub alias: Option<(String, Location)>, - pub package_name: Vec<(String, Location)>, - pub import_specifier: ImportSpecifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum ImportSpecifier { - Wildcard(Location), - Identifier((String, Location)), -} - -impl ImportSpecifier { - pub fn location(&self) -> Location { - match self { - Self::Wildcard(l) => l.clone(), - Self::Identifier((_, l)) => l.clone(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/import_meta.rs b/crates/parser/tree/import_meta.rs deleted file mode 100644 index be968ce..0000000 --- a/crates/parser/tree/import_meta.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// The `import.meta` expression. -#[derive(Clone, Serialize, Deserialize)] -pub struct ImportMeta { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/include_directive.rs b/crates/parser/tree/include_directive.rs deleted file mode 100644 index 01faef3..0000000 --- a/crates/parser/tree/include_directive.rs +++ /dev/null @@ -1,12 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct IncludeDirective { - pub location: Location, - pub source: String, - #[serde(skip)] - pub nested_compilation_unit: Rc, - pub nested_packages: Vec>, - pub nested_directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/interface_definition.rs b/crates/parser/tree/interface_definition.rs deleted file mode 100644 index 00dcb67..0000000 --- a/crates/parser/tree/interface_definition.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct InterfaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub name: (String, Location), - pub type_parameters: Option>>, - pub extends_clause: Option>>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/invalidated_node.rs b/crates/parser/tree/invalidated_node.rs deleted file mode 100644 index f15957d..0000000 --- a/crates/parser/tree/invalidated_node.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a construct that failed to parse. -#[derive(Clone, Serialize, Deserialize)] -pub struct InvalidatedNode { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/labeled_statement.rs b/crates/parser/tree/labeled_statement.rs deleted file mode 100644 index 81cb248..0000000 --- a/crates/parser/tree/labeled_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct LabeledStatement { - pub location: Location, - pub label: (String, Location), - pub substatement: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/member_expression.rs b/crates/parser/tree/member_expression.rs deleted file mode 100644 index 66bb70e..0000000 --- a/crates/parser/tree/member_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct MemberExpression { - pub location: Location, - pub base: Rc, - pub identifier: QualifiedIdentifier, -} \ No newline at end of file diff --git a/crates/parser/tree/mxml.rs b/crates/parser/tree/mxml.rs deleted file mode 100644 index 1ee0f1c..0000000 --- a/crates/parser/tree/mxml.rs +++ /dev/null @@ -1,195 +0,0 @@ -use std::collections::BTreeMap; - -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Mxml { - pub location: Location, - pub version: XmlVersion, - pub encoding: String, - pub content: Vec>, -} - -#[derive(Copy, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub enum XmlVersion { - /// XML version 1.0. - Version10, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlElement { - pub location: Location, - pub name: MxmlName, - /// Attribute list, including `xmlns` and `xmlns:` namespace prefixes. - pub attributes: Vec>, - /// The namespace mapping relative to the XML element. - #[serde(skip)] - pub namespace: Rc, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlAttribute { - pub location: Location, - /// Indicates whether the attribute is a `xmlns` or `xmlns:` attribute. - pub xmlns: bool, - pub name: MxmlName, - /// Attribute value. The location data includes the quotes. - pub value: (String, Location), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct MxmlName { - pub location: Location, - /// The unresolved prefix of the name. - pub prefix: Option, - pub name: String, -} - -impl MxmlName { - pub fn resolve_prefix(&self, namespace: &Rc) -> Result { - let Some(p) = self.prefix.as_ref() else { - return if let Some(v) = namespace.get(MxmlNamespace::DEFAULT_NAMESPACE) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(MxmlNamespace::DEFAULT_NAMESPACE.into())) - }; - }; - if let Some(v) = namespace.get(p) { - Ok(v) - } else { - Err(MxmlNameError::PrefixNotDefined(p.clone())) - } - } - - pub fn resolve_name(&self, namespace: &Rc) -> Result<(String, String), MxmlNameError> { - let p = self.resolve_prefix(namespace)?; - Ok((p, self.name.clone())) - } - - pub fn equals_name(&self, other: &Self, namespace: &Rc) -> Result { - if self.name != other.name { - return Ok(false); - } - let p1 = self.resolve_prefix(namespace)?; - let p2 = other.resolve_prefix(namespace)?; - Ok(&p1 == &p2) - } - - 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(), - } - } -} - -/// Mapping of namespace prefixes. -#[derive(Clone, PartialEq)] -pub struct MxmlNamespace { - parent: Option>, - mappings: RefCell>, -} - -impl Default for MxmlNamespace { - fn default() -> Self { - Self::new(None) - } -} - -impl MxmlNamespace { - /// Returns the prefix used for the default XML namespace. - pub const DEFAULT_NAMESPACE: &'static str = ""; - - /// Constructs an empty set of namespace mappings. - pub fn new(parent: Option<&Rc>) -> Self { - let mut ns = Self { - parent: parent.map(|p| p.clone()), - mappings: RefCell::new(BTreeMap::new()), - }; - if ns.parent.is_none() { - ns.mappings.get_mut().insert(Self::DEFAULT_NAMESPACE.into(), "".into()); - ns.mappings.get_mut().insert("xmlns".into(), "http://www.w3.org/xml/xmlns".into()); - } - ns - } - - pub fn includes(&self, prefix: &str) -> bool { - self.mappings.borrow().contains_key(prefix) || match &self.parent { - Some(p) => p.includes(prefix), - None => false, - } - } - - /// Retrieves the value of a prefix either in the actual - /// set of mappings or in the parent set of mappings. - pub fn get(&self, prefix: &str) -> Option { - if let Some(value) = self.mappings.borrow().get(prefix) { - return Some(value.clone()); - } - self.parent.as_ref().and_then(|p| p.get(prefix)) - } - - pub fn set(&self, prefix: &str, value: &str) { - self.mappings.borrow_mut().insert(prefix.to_owned(), value.to_owned()); - } - - pub fn delete(&self, prefix: &str) -> bool { - self.mappings.borrow_mut().remove(prefix).is_some() - } - - pub fn clear(&self) { - self.mappings.borrow_mut().clear(); - } - - /// Returns the actual set of prefix mappings. - pub fn listing(&self) -> BTreeMap { - self.mappings.borrow().clone() - } - - /// Returns a concatenation of the parent set of prefix mappings - /// and the actual set of prefix mappings. - pub fn full_listing(&self) -> BTreeMap { - let mut listing = self.parent.as_ref().map_or(BTreeMap::new(), |p| p.full_listing()); - listing.extend(self.listing()); - listing - } -} diff --git a/crates/parser/tree/namespace_definition.rs b/crates/parser/tree/namespace_definition.rs deleted file mode 100644 index 1f77880..0000000 --- a/crates/parser/tree/namespace_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NamespaceDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/new_expression.rs b/crates/parser/tree/new_expression.rs deleted file mode 100644 index 862e2da..0000000 --- a/crates/parser/tree/new_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NewExpression { - pub location: Location, - pub base: Rc, - pub arguments: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/normal_configuration_directive.rs b/crates/parser/tree/normal_configuration_directive.rs deleted file mode 100644 index 3083db8..0000000 --- a/crates/parser/tree/normal_configuration_directive.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Represents a `CONFIG::x ...` directive. -#[derive(Clone, Serialize, Deserialize)] -pub struct NormalConfigurationDirective { - pub location: Location, - /// The namespace, most commonly the `CONFIG` identifier. - pub namespace: (String, Location), - /// The constant name without including the qualifier. - pub constant_name: (String, Location), - pub directive: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/null_literal.rs b/crates/parser/tree/null_literal.rs deleted file mode 100644 index 6f286b7..0000000 --- a/crates/parser/tree/null_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/numeric_literal.rs b/crates/parser/tree/numeric_literal.rs deleted file mode 100644 index b695ebd..0000000 --- a/crates/parser/tree/numeric_literal.rs +++ /dev/null @@ -1,157 +0,0 @@ -use crate::ns::*; -use num_bigint::BigInt; -use serde::{Serialize, Deserialize}; -use std::str::FromStr; -use conv::ValueFrom; -use num_traits::ToPrimitive; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NumericLiteral { - pub location: Location, - /// The numeric value in character representation. Such representation may be parsed - /// through data type specific methods such as [`NumericLiteral::parse_double()`]. - pub value: String, - pub suffix: NumberSuffix, -} - -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq)] -pub enum NumberSuffix { - None, - F, -} - -impl NumericLiteral { - /// Parses a double-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_double(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f64::value_from(n).map_err(|_| ParserError::Common)); - } - } - f64::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a single-precision floating point either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_float(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common) - .and_then(|n| f32::value_from(n).map_err(|_| ParserError::Common)); - } - } - f32::from_str(&(if negative { "-" } else { "" }.to_owned() + &s)).map_err(|_| ParserError::Common) - } - - /// Parses a signed long either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_long(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i64::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i64::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a signed integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = i32::from_str_radix(&(if negative { "-" } else { "" }.to_owned() + &s[2..]), 2); - return n.map_err(|_| ParserError::Common); - } - } - i32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses an unsigned integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_uint(&self) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let n = u32::from_str_radix(&s[2..], 16); - return n.map_err(|_| ParserError::Common); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let n = u32::from_str_radix(&s[2..], 2); - return n.map_err(|_| ParserError::Common); - } - } - u32::from_str(&s).map_err(|_| ParserError::Common) - } - - /// Parses a big integer either in - /// decimal, binary (`0b`) or hexadecimal (`0x`) notation. - pub fn parse_big_int(&self, negative: bool) -> Result { - let s = self.value.replace('_', ""); - if s.starts_with('0') { - if s[1..].starts_with('x') || s[1..].starts_with('X') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::hex_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 16); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } else if s[1..].starts_with('b') || s[1..].starts_with('B') { - let mut digits: Vec = vec![]; - for ch in s[2..].chars() { - digits.push(CharacterValidator::bin_digit_mv(ch).unwrap().to_u8().unwrap()); - } - let n = BigInt::from_radix_be(if negative { num_bigint::Sign::Minus } else { num_bigint::Sign::Plus }, &digits, 2); - return n.map_or(Err(ParserError::Common), |n| Ok(n)); - } - } - BigInt::from_str(&s).map_err(|_| ParserError::Common) - } -} - -mod tests { - #[allow(unused)] - use crate::ns::*; - #[allow(unused)] - use std::rc::Rc; - - #[test] - fn test_minimum_maximum() { - // Long.MIN_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x8000_0000_0000_0000".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MIN, literal.parse_long(true).unwrap()); - - // Long.MAX_VALUE - let literal = NumericLiteral { - location: Location::with_offset(&Rc::new(CompilationUnit::default()), 0), - value: "0x7FFF_FFFF_FFFF_FFFF".to_owned(), - suffix: NumberSuffix::None, - }; - assert_eq!(i64::MAX, literal.parse_long(false).unwrap()); - } -} \ No newline at end of file diff --git a/crates/parser/tree/object_initializer.rs b/crates/parser/tree/object_initializer.rs deleted file mode 100644 index d7e6cbb..0000000 --- a/crates/parser/tree/object_initializer.rs +++ /dev/null @@ -1,63 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ObjectInitializer { - pub location: Location, - pub fields: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum InitializerField { - Field { - name: (FieldName, Location), - /// Non-null operator used for destructuring. - non_null: bool, - value: Option>, - }, - Rest((Rc, Location)), -} - -impl InitializerField { - pub fn location(&self) -> Location { - match self { - Self::Field { ref name, ref value, .. } => { - value.clone().map_or(name.1.clone(), |v| name.1.combine_with(v.location())) - }, - Self::Rest((_, ref l)) => l.clone(), - } - } - - pub fn shorthand(&self) -> Option<&QualifiedIdentifier> { - if let Self::Field { name, .. } = self { - if let FieldName::Identifier(qid) = &name.0 { - Some(qid) - } else { - None - } - } else { - None - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum FieldName { - Identifier(QualifiedIdentifier), - Brackets(Rc), - StringLiteral(Rc), - NumericLiteral(Rc), -} - -impl FieldName { - pub(crate) fn id(&self) -> Option<&QualifiedIdentifier> { - let Self::Identifier(id) = &self else { - return None; - }; - Some(id) - } - - pub fn id_equals(&self, name: &str) -> bool { - self.id().map(|name1| name == name1.to_identifier_name_or_asterisk().map(|id| id.0.clone()).unwrap_or("".into())).unwrap_or(false) - } -} \ No newline at end of file diff --git a/crates/parser/tree/optional_chaining_expression.rs b/crates/parser/tree/optional_chaining_expression.rs deleted file mode 100644 index b78c630..0000000 --- a/crates/parser/tree/optional_chaining_expression.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// An expression followed by optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingExpression { - pub location: Location, - pub base: Rc, - /// Optional chaining operations. - /// - /// An `OptionalChainingPlaceholder` node is is the topmost expression - /// in the `expression` field. - pub expression: Rc, -} - -/// Internal expression used as the topmost expression -/// of a sequence of optional chaining operations. -#[derive(Clone, Serialize, Deserialize)] -pub struct OptionalChainingPlaceholder { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/package_definition.rs b/crates/parser/tree/package_definition.rs deleted file mode 100644 index 8b447ce..0000000 --- a/crates/parser/tree/package_definition.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct PackageDefinition { - pub location: Location, - pub asdoc: Option>, - pub name: Vec<(String, Location)>, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/paren_expression.rs b/crates/parser/tree/paren_expression.rs deleted file mode 100644 index ee3a330..0000000 --- a/crates/parser/tree/paren_expression.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ParenExpression { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/program.rs b/crates/parser/tree/program.rs deleted file mode 100644 index 2cabb41..0000000 --- a/crates/parser/tree/program.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct Program { - pub location: Location, - pub packages: Vec>, - pub directives: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/qualified_identifier.rs b/crates/parser/tree/qualified_identifier.rs deleted file mode 100644 index 34d2cf2..0000000 --- a/crates/parser/tree/qualified_identifier.rs +++ /dev/null @@ -1,49 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct QualifiedIdentifier { - pub location: Location, - pub attribute: bool, - pub qualifier: Option>, - pub id: QualifiedIdentifierIdentifier, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum QualifiedIdentifierIdentifier { - Id((String, Location)), - Brackets(Rc), -} - -impl QualifiedIdentifier { - pub fn to_identifier_name_or_asterisk(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - Some(id.clone()) - } else { - None - } - } - } - - pub fn to_identifier_name(&self) -> Option<(String, Location)> { - if self.attribute || self.qualifier.is_some() { - None - } else { - if let QualifiedIdentifierIdentifier::Id(id) = &self.id { - if id.0 == "*" { None } else { Some(id.clone()) } - } else { - None - } - } - } - - pub fn is_identifier_token(&self) -> bool { - self.qualifier.is_none() && !self.attribute && match &self.id { - QualifiedIdentifierIdentifier::Id((id, _)) => id != "*", - _ => false, - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/regexp_literal.rs b/crates/parser/tree/regexp_literal.rs deleted file mode 100644 index 366bf7a..0000000 --- a/crates/parser/tree/regexp_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct RegExpLiteral { - pub location: Location, - pub body: String, - pub flags: String, -} \ No newline at end of file diff --git a/crates/parser/tree/reserved_namespace_expression.rs b/crates/parser/tree/reserved_namespace_expression.rs deleted file mode 100644 index 0e6e509..0000000 --- a/crates/parser/tree/reserved_namespace_expression.rs +++ /dev/null @@ -1,41 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub enum ReservedNamespaceExpression { - Public(Location), - Private(Location), - Protected(Location), - Internal(Location), -} - -impl ReservedNamespaceExpression { - pub fn location(&self) -> Location { - match self { - Self::Public(l) => l.clone(), - Self::Private(l) => l.clone(), - Self::Protected(l) => l.clone(), - Self::Internal(l) => l.clone(), - } - } - - pub fn to_attribute(&self) -> Attribute { - match self { - Self::Public(l) => Attribute::Public(l.clone()), - Self::Private(l) => Attribute::Private(l.clone()), - Self::Protected(l) => Attribute::Protected(l.clone()), - Self::Internal(l) => Attribute::Internal(l.clone()), - } - } -} - -impl ToString for ReservedNamespaceExpression { - fn to_string(&self) -> String { - match self { - Self::Public(_) => "public".into(), - Self::Private(_) => "private".into(), - Self::Protected(_) => "protected".into(), - Self::Internal(_) => "internal".into(), - } - } -} \ No newline at end of file diff --git a/crates/parser/tree/return_statement.rs b/crates/parser/tree/return_statement.rs deleted file mode 100644 index d31d41a..0000000 --- a/crates/parser/tree/return_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ReturnStatement { - pub location: Location, - pub expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/sequence_expression.rs b/crates/parser/tree/sequence_expression.rs deleted file mode 100644 index c6b9dfc..0000000 --- a/crates/parser/tree/sequence_expression.rs +++ /dev/null @@ -1,10 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Sequence expression (`x, y`). -#[derive(Clone, Serialize, Deserialize)] -pub struct SequenceExpression { - pub location: Location, - pub left: Rc, - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/string_literal.rs b/crates/parser/tree/string_literal.rs deleted file mode 100644 index 2361c16..0000000 --- a/crates/parser/tree/string_literal.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct StringLiteral { - pub location: Location, - pub value: String, -} \ No newline at end of file diff --git a/crates/parser/tree/super_expression.rs b/crates/parser/tree/super_expression.rs deleted file mode 100644 index 8d47cdd..0000000 --- a/crates/parser/tree/super_expression.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// Super expression. -/// -/// The super expression must always be followed by a property operator. -/// When the super expression appears in evaluation, the immediately -/// following property operator is limited to access a property from the base class -/// or invoke a method of the base class. -/// -/// ``` -/// super.f() -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperExpression { - pub location: Location, - pub object: Option>>, -} \ No newline at end of file diff --git a/crates/parser/tree/super_statement.rs b/crates/parser/tree/super_statement.rs deleted file mode 100644 index 22a520a..0000000 --- a/crates/parser/tree/super_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SuperStatement { - pub location: Location, - pub arguments: Vec>, -} \ No newline at end of file diff --git a/crates/parser/tree/switch_statement.rs b/crates/parser/tree/switch_statement.rs deleted file mode 100644 index 652ec62..0000000 --- a/crates/parser/tree/switch_statement.rs +++ /dev/null @@ -1,46 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct Case { - pub location: Location, - pub labels: Vec, - pub directives: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum CaseLabel { - Case((Rc, Location)), - Default(Location), -} - -impl CaseLabel { - pub fn location(&self) -> Location { - match self { - Self::Case((_, l)) => l.clone(), - Self::Default(l) => l.clone(), - } - } -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SwitchTypeStatement { - pub location: Location, - pub discriminant: Rc, - pub cases: Vec, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeCase { - pub location: Location, - /// Case parameter. If `None`, designates a `default {}` case. - pub parameter: Option, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/this_literal.rs b/crates/parser/tree/this_literal.rs deleted file mode 100644 index 4d4eeaf..0000000 --- a/crates/parser/tree/this_literal.rs +++ /dev/null @@ -1,7 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThisLiteral { - pub location: Location, -} \ No newline at end of file diff --git a/crates/parser/tree/throw_statement.rs b/crates/parser/tree/throw_statement.rs deleted file mode 100644 index 48b71ff..0000000 --- a/crates/parser/tree/throw_statement.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct ThrowStatement { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/tree_semantics.rs b/crates/parser/tree/tree_semantics.rs deleted file mode 100644 index 9a04581..0000000 --- a/crates/parser/tree/tree_semantics.rs +++ /dev/null @@ -1,228 +0,0 @@ -use crate::ns::*; -use by_address::ByAddress; - -const LARGE_BYTES: usize = 26_000; - -/// Represents a mapping of nodes to meaning (*symbols*). -/// -/// A limited set of nodes may be mapped to symbols within this -/// structure through using the implemented `TreeSemanticsAccessor` -/// methods, such as `.get()` and `.set()`. -pub struct TreeSemantics { - common: TreeSemantics1, - large_units: RefCell>, TreeSemantics1>>, -} - -impl TreeSemantics { - pub fn new() -> Self { - Self { - common: TreeSemantics1::new(), - large_units: RefCell::new(HashMap::new()), - } - } -} - -/// Defines access methods for the `TreeSemantics` structure, -/// used for attaching semantics to the syntactic tree, -/// where `T` is the node type, and `S` is the symbol type. -pub trait TreeSemanticsAccessor { - fn get(&self, node: &Rc) -> Option; - fn set(&self, node: &Rc, symbol: Option); - fn delete(&self, node: &Rc) -> bool; - fn has(&self, node: &Rc) -> bool; -} - -macro impl_semantics_with_loc_call { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location().compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_with_loc_field { - (struct $tree_semantics_id:ident, $($nodetype:ident),*$(,)?) => { - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.get(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.and_then(|m1| m1.get(node)) - } - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.set(node, symbol); - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu.clone())); - if let Some(m1) = m1 { - m1.set(node, symbol); - } else { - let m1 = TreeSemantics1::new(); - m1.set(node, symbol); - large_units.insert(ByAddress(cu), m1); - } - } - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.delete(node) - } else { - let mut large_units = self.large_units.borrow_mut(); - let m1 = large_units.get_mut(&ByAddress(cu)); - m1.map(|m1| m1.delete(node)).unwrap_or(false) - } - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - let cu = node.location.compilation_unit(); - if cu.text().len() < LARGE_BYTES { - self.common.has(node) - } else { - let large_units = self.large_units.borrow(); - let m1 = large_units.get(&ByAddress(cu)); - m1.map(|m1| m1.has(node)).unwrap_or(false) - } - } - } - )* - }, -} - -macro impl_semantics_1 { - (struct $tree_semantics_1_id:ident, fn $new_id:ident, $($nodetype:ident),*$(,)?) => { - #[allow(non_snake_case)] - struct $tree_semantics_1_id { - $($nodetype: RefCell>, Option>>,)* - } - - impl $tree_semantics_1_id { - pub fn $new_id() -> Self { - Self { - $($nodetype: RefCell::new(HashMap::new()),)* - } - } - } - - $( - impl TreeSemanticsAccessor<$nodetype, S> for $tree_semantics_1_id { - fn get(&self, node: &Rc<$nodetype>) -> Option { - self.$nodetype.borrow().get(&NodeAsKey(node.clone())).map(|v| v.clone().unwrap()) - } - fn set(&self, node: &Rc<$nodetype>, symbol: Option) { - self.$nodetype.borrow_mut().insert(NodeAsKey(node.clone()), symbol); - } - fn delete(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow_mut().remove(&NodeAsKey(node.clone())).is_some() - } - fn has(&self, node: &Rc<$nodetype>) -> bool { - self.$nodetype.borrow().contains_key(&NodeAsKey(node.clone())) - } - } - )* - }, -} - -impl_semantics_with_loc_call!( - struct TreeSemantics, - Expression, - Directive, - MxmlContent, - CssDirective, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, -); - -impl_semantics_with_loc_field!( - struct TreeSemantics, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - Mxml, - MxmlElement, - MxmlAttribute, - CssProperty, - CssRule, - CssDocument, - QualifiedIdentifier, -); - -impl_semantics_1!( - struct TreeSemantics1, - fn new, - Expression, - Directive, - FunctionCommon, - Block, - Program, - SimpleVariableDefinition, - QualifiedIdentifier, - Mxml, - MxmlContent, - MxmlElement, - MxmlAttribute, - CssDirective, - CssRule, - CssMediaQueryCondition, - CssSelectorCondition, - CssPropertyValue, - CssSelector, - CssProperty, - CssDocument, -); \ No newline at end of file diff --git a/crates/parser/tree/try_statement.rs b/crates/parser/tree/try_statement.rs deleted file mode 100644 index 31a1922..0000000 --- a/crates/parser/tree/try_statement.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TryStatement { - pub location: Location, - pub block: Rc, - pub catch_clauses: Vec, - pub finally_clause: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct CatchClause { - pub location: Location, - pub parameter: TypedDestructuring, - pub block: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FinallyClause { - pub location: Location, - pub block: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_definition.rs b/crates/parser/tree/type_definition.rs deleted file mode 100644 index 95dce41..0000000 --- a/crates/parser/tree/type_definition.rs +++ /dev/null @@ -1,11 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub left: (String, Location), - pub right: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/type_expression.rs b/crates/parser/tree/type_expression.rs deleted file mode 100644 index 0b0eec9..0000000 --- a/crates/parser/tree/type_expression.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct NullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct NonNullableTypeExpression { - pub location: Location, - pub base: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct AnyTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VoidTypeExpression { - pub location: Location, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct ArrayTypeExpression { - pub location: Location, - pub expression: Rc, -} - -/// A tuple type expression consisting of at least two elements. -#[derive(Clone, Serialize, Deserialize)] -pub struct TupleTypeExpression { - pub location: Location, - pub expressions: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeExpression { - pub location: Location, - pub parameters: Vec>, - pub result_type: Option>, -} - -/// ```plain -/// function(T, T=, ...) -/// function(...[T]) -/// ``` -#[derive(Clone, Serialize, Deserialize)] -pub struct FunctionTypeParameter { - pub location: Location, - pub kind: ParameterKind, - /// Possibly `None` for the rest parameter. - pub type_expression: Option>, -} \ No newline at end of file diff --git a/crates/parser/tree/type_parameter.rs b/crates/parser/tree/type_parameter.rs deleted file mode 100644 index adf800c..0000000 --- a/crates/parser/tree/type_parameter.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -/// A type parameter as in `function f.(): void {}`. -#[derive(Clone, Serialize, Deserialize)] -pub struct TypeParameter { - pub location: Location, - pub name: (String, Location), -} \ No newline at end of file diff --git a/crates/parser/tree/unary_expression.rs b/crates/parser/tree/unary_expression.rs deleted file mode 100644 index 64fbcc3..0000000 --- a/crates/parser/tree/unary_expression.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UnaryExpression { - pub location: Location, - pub operator: Operator, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/use_namespace_directive.rs b/crates/parser/tree/use_namespace_directive.rs deleted file mode 100644 index 7317395..0000000 --- a/crates/parser/tree/use_namespace_directive.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct UseNamespaceDirective { - pub location: Location, - pub expression: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/variable_definition.rs b/crates/parser/tree/variable_definition.rs deleted file mode 100644 index 234492f..0000000 --- a/crates/parser/tree/variable_definition.rs +++ /dev/null @@ -1,36 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableDefinition { - pub location: Location, - pub asdoc: Option>, - pub attributes: Vec, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Copy, Clone, Serialize, Deserialize, PartialEq, Eq)] -pub enum VariableDefinitionKind { - Var, - Const, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct SimpleVariableDefinition { - pub location: Location, - pub kind: (VariableDefinitionKind, Location), - pub bindings: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct VariableBinding { - pub destructuring: TypedDestructuring, - pub initializer: Option>, -} - -impl VariableBinding { - pub fn location(&self) -> Location { - self.initializer.as_ref().map_or(self.destructuring.location.clone(), |init| self.destructuring.location.combine_with(init.location())) - } -} \ No newline at end of file diff --git a/crates/parser/tree/vector_literal.rs b/crates/parser/tree/vector_literal.rs deleted file mode 100644 index e506ed8..0000000 --- a/crates/parser/tree/vector_literal.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct VectorLiteral { - pub location: Location, - pub element_type: Rc, - pub elements: Vec, -} \ No newline at end of file diff --git a/crates/parser/tree/while_statement.rs b/crates/parser/tree/while_statement.rs deleted file mode 100644 index 2f20a97..0000000 --- a/crates/parser/tree/while_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WhileStatement { - pub location: Location, - pub test: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/with_statement.rs b/crates/parser/tree/with_statement.rs deleted file mode 100644 index 0f254c3..0000000 --- a/crates/parser/tree/with_statement.rs +++ /dev/null @@ -1,9 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct WithStatement { - pub location: Location, - pub object: Rc, - pub body: Rc, -} \ No newline at end of file diff --git a/crates/parser/tree/xml_expression.rs b/crates/parser/tree/xml_expression.rs deleted file mode 100644 index 06857a8..0000000 --- a/crates/parser/tree/xml_expression.rs +++ /dev/null @@ -1,57 +0,0 @@ -use crate::ns::*; -use serde::{Serialize, Deserialize}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlExpression { - pub location: Location, - pub element: Rc, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlMarkupExpression { - pub location: Location, - pub markup: String, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlListExpression { - pub location: Location, - pub content: Vec>, -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlElement { - pub location: Location, - pub name: XmlTagName, - pub attributes: Vec>, - pub attribute_expression: Option>, - pub content: Option>>, - pub closing_name: Option, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlTagName { - Name((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub struct XmlAttribute { - pub location: Location, - pub name: (String, Location), - pub value: XmlAttributeValue, -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlAttributeValue { - Value((String, Location)), - Expression(Rc), -} - -#[derive(Clone, Serialize, Deserialize)] -pub enum XmlContent { - Characters((String, Location)), - Markup((String, Location)), - Element(Rc), - Expression(Rc), -} \ No newline at end of file diff --git a/crates/parser/util.rs b/crates/parser/util.rs deleted file mode 100644 index 256a627..0000000 --- a/crates/parser/util.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Miscellaneous. - -mod arena; -pub use arena::*; - -pub use by_address::ByAddress as NodeAsKey; - -mod character_reader; -pub use character_reader::*; - -mod escaping; -pub use escaping::*; - -mod css; -pub use css::*; - -pub use std::cell::{Cell, RefCell}; -pub use std::collections::{HashMap, HashSet}; -pub use std::rc::{Rc, Weak}; - -pub fn default() -> T { - T::default() -} - -/// Counts the first whitespace characters of a string. -pub fn count_first_whitespace_characters(input: &str) -> usize { - input.chars().count() - input.trim_start().chars().count() -} - -/// Decreases the last offset of a range without ever going behind the first offset. -pub fn decrease_last_offset(first_offset: usize, mut last_offset: usize, count: usize) -> usize { - for _ in 0..count { - last_offset = if first_offset < last_offset { last_offset - 1 } else { last_offset }; - } - last_offset -} \ No newline at end of file diff --git a/crates/parser/util/arena.rs b/crates/parser/util/arena.rs deleted file mode 100644 index e9027f4..0000000 --- a/crates/parser/util/arena.rs +++ /dev/null @@ -1,19 +0,0 @@ -use std::{cell::RefCell, rc::{Rc, Weak}}; - -pub struct Arena { - data: RefCell>>, -} - -impl Arena { - pub fn new() -> Self { - Self { - data: RefCell::new(vec![]), - } - } - - pub fn allocate(&self, value: T) -> Weak { - let obj = Rc::new(value); - self.data.borrow_mut().push(obj.clone()); - Rc::downgrade(&obj) - } -} \ No newline at end of file diff --git a/crates/parser/util/character_reader.rs b/crates/parser/util/character_reader.rs deleted file mode 100644 index c6af904..0000000 --- a/crates/parser/util/character_reader.rs +++ /dev/null @@ -1,138 +0,0 @@ -use std::str::CharIndices; - -/// `CharacterReader` may be used for iterating characters from left-to-right -/// in a string with miscellaneous operation methods. -#[derive(Clone)] -pub struct CharacterReader<'a> { - length: usize, - start_offset: usize, - char_indices: CharIndices<'a>, -} - -impl<'a> CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string starting at the given offset. - pub fn from_offset(value: &'a str, offset: usize) -> Self { - CharacterReader { length: value.len(), start_offset: offset, char_indices: value[offset..].char_indices() } - } - - /// Indicates if there are remaining code points to read. - pub fn has_remaining(&self) -> bool { - self.clone().char_indices.next().is_some() - } - - /// Indicates if the reader has reached the end of the string. - pub fn reached_end(&self) -> bool { - self.clone().char_indices.next().is_none() - } - - /// Skips a code point in the reader. This is equivalent to - /// calling `next()`. - pub fn skip_in_place(&mut self) { - self.next(); - } - - /// Skips the given number of code points in the reader. - pub fn skip_count_in_place(&mut self, count: usize) { - for _ in 0..count { - if self.next().is_none() { - break; - } - } - } - - /// Returns the current byte offset in the string. - pub fn index(&self) -> usize { - self.clone().char_indices.next().map_or(self.length, |(i, _)| self.start_offset + i) - } - - /// Returns the next code point. If there are no code points - /// available, returns U+00. - pub fn next_or_zero(&mut self) -> char { - self.char_indices.next().map_or('\x00', |(_, cp)| cp) - } - - /// Peeks the next code point. - pub fn peek(&self) -> Option { - self.clone().char_indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point. If there are no code points - /// available, returns U+00. - pub fn peek_or_zero(&self) -> char { - self.clone().next_or_zero() - } - - /// Peeks the next code point at the given zero based code point index. - pub fn peek_at(&self, index: usize) -> Option { - let mut indices = self.clone().char_indices; - for _ in 0..index { - if indices.next().is_none() { - break; - } - } - indices.next().map(|(_, cp)| cp) - } - - /// Peeks the next code point at the given zero based code point index. - /// If there are no code points available, returns U+00. - pub fn peek_at_or_zero(&self, index: usize) -> char { - self.peek_at(index).unwrap_or('\x00') - } - - /// Peeks a number of code points until the string's end. - pub fn peek_seq(&self, num_code_points: u64) -> String { - let mut r = String::new(); - let mut next_indices = self.char_indices.clone(); - for _ in 0..num_code_points { - match next_indices.next() { - None => { - break; - }, - Some(cp) => { - r.push(cp.1); - } - } - } - r - } -} - -impl<'a> From<&'a str> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a str) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> From<&'a String> for CharacterReader<'a> { - /// Constructs a `CharacterReader` from a string. - fn from(value: &'a String) -> Self { - CharacterReader { length: value.len(), start_offset: 0, char_indices: value.char_indices() } - } -} - -impl<'a> Iterator for CharacterReader<'a> { - type Item = char; - - fn next(&mut self) -> Option { - self.char_indices.next().map(|(_, cp)| cp) - } -} - -#[cfg(test)] -mod test { - use super::CharacterReader; - #[test] - fn test() { - let mut reader = CharacterReader::from("foo"); - assert!(reader.has_remaining()); - assert_eq!(reader.peek_seq(5), "foo"); - assert_eq!(reader.peek_seq(1), "f"); - assert_eq!(reader.peek_or_zero(), 'f'); - for _ in 0..3 { - reader.next(); - } - assert_eq!(reader.peek_or_zero(), '\x00'); - assert!(reader.reached_end()); - } -} \ No newline at end of file diff --git a/crates/parser/util/css.rs b/crates/parser/util/css.rs deleted file mode 100644 index fa1fbf8..0000000 --- a/crates/parser/util/css.rs +++ /dev/null @@ -1,163 +0,0 @@ -use std::collections::HashMap; -use lazy_static::lazy_static; -use maplit::hashmap; - -/// Converts a CSS [color constant](http://www.w3schools.com/css/css_colorsfull.asp) into an integer. -pub fn css_color_constant_to_int(name: &str) -> Option { - COLOR_MAP.get(&name.to_lowercase()).map(|i| *i) -} - -lazy_static! { - /// Map color constant names to 24-bit RGB integer values. - /// - /// See also: [CSS colors](http://www.w3schools.com/css/css_colorsfull.asp) - static ref COLOR_MAP: HashMap = hashmap! { - "black".into() => 0x000000, - "navy".into() => 0x000080, - "darkblue".into() => 0x00008b, - "mediumblue".into() => 0x0000cd, - "blue".into() => 0x0000ff, - "darkgreen".into() => 0x006400, - "green".into() => 0x008000, - "teal".into() => 0x008080, - "darkcyan".into() => 0x008b8b, - "deepskyblue".into() => 0x00bfff, - "darkturquoise".into() => 0x00ced1, - "mediumspringgreen".into() => 0x00fa9a, - "lime".into() => 0x00ff00, - "springgreen".into() => 0x00ff7f, - "aqua".into() => 0x00ffff, - "cyan".into() => 0x00ffff, - "midnightblue".into() => 0x191970, - "dodgerblue".into() => 0x1e90ff, - "lightseagreen".into() => 0x20b2aa, - "forestgreen".into() => 0x228b22, - "seagreen".into() => 0x2e8b57, - "darkslategray".into() => 0x2f4f4f, - "darkslategrey".into() => 0x2f4f4f, - "limegreen".into() => 0x32cd32, - "mediumseagreen".into() => 0x3cb371, - "turquoise".into() => 0x40e0d0, - "royalblue".into() => 0x4169e1, - "steelblue".into() => 0x4682b4, - "darkslateblue".into() => 0x483d8b, - "mediumturquoise".into() => 0x48d1cc, - "indigo ".into() => 0x4b0082, - "darkolivegreen".into() => 0x556b2f, - "cadetblue".into() => 0x5f9ea0, - "cornflowerblue".into() => 0x6495ed, - "mediumaquamarine".into() => 0x66cdaa, - "dimgray".into() => 0x696969, - "dimgrey".into() => 0x696969, - "slateblue".into() => 0x6a5acd, - "olivedrab".into() => 0x6b8e23, - "slategray".into() => 0x708090, - "slategrey".into() => 0x708090, - "lightslategray".into() => 0x778899, - "lightslategrey".into() => 0x778899, - "mediumslateblue".into() => 0x7b68ee, - "lawngreen".into() => 0x7cfc00, - "chartreuse".into() => 0x7fff00, - "aquamarine".into() => 0x7fffd4, - "maroon".into() => 0x800000, - "purple".into() => 0x800080, - "olive".into() => 0x808000, - "gray".into() => 0x808080, - "grey".into() => 0x808080, - "skyblue".into() => 0x87ceeb, - "lightskyblue".into() => 0x87cefa, - "blueviolet".into() => 0x8a2be2, - "darkred".into() => 0x8b0000, - "darkmagenta".into() => 0x8b008b, - "saddlebrown".into() => 0x8b4513, - "darkseagreen".into() => 0x8fbc8f, - "lightgreen".into() => 0x90ee90, - "mediumpurple".into() => 0x9370d8, - "darkviolet".into() => 0x9400d3, - "palegreen".into() => 0x98fb98, - "darkorchid".into() => 0x9932cc, - "yellowgreen".into() => 0x9acd32, - "sienna".into() => 0xa0522d, - "brown".into() => 0xa52a2a, - "darkgray".into() => 0xa9a9a9, - "darkgrey".into() => 0xa9a9a9, - "lightblue".into() => 0xadd8e6, - "greenyellow".into() => 0xadff2f, - "paleturquoise".into() => 0xafeeee, - "lightsteelblue".into() => 0xb0c4de, - "powderblue".into() => 0xb0e0e6, - "firebrick".into() => 0xb22222, - "darkgoldenrod".into() => 0xb8860b, - "mediumorchid".into() => 0xba55d3, - "rosybrown".into() => 0xbc8f8f, - "darkkhaki".into() => 0xbdb76b, - "silver".into() => 0xc0c0c0, - "mediumvioletred".into() => 0xc71585, - "indianred ".into() => 0xcd5c5c, - "peru".into() => 0xcd853f, - "chocolate".into() => 0xd2691e, - "tan".into() => 0xd2b48c, - "lightgray".into() => 0xd3d3d3, - "lightgrey".into() => 0xd3d3d3, - "palevioletred".into() => 0xd87093, - "thistle".into() => 0xd8bfd8, - "orchid".into() => 0xda70d6, - "goldenrod".into() => 0xdaa520, - "crimson".into() => 0xdc143c, - "gainsboro".into() => 0xdcdcdc, - "plum".into() => 0xdda0dd, - "burlywood".into() => 0xdeb887, - "lightcyan".into() => 0xe0ffff, - "lavender".into() => 0xe6e6fa, - "darksalmon".into() => 0xe9967a, - "violet".into() => 0xee82ee, - "palegoldenrod".into() => 0xeee8aa, - "lightcoral".into() => 0xf08080, - "khaki".into() => 0xf0e68c, - "aliceblue".into() => 0xf0f8ff, - "honeydew".into() => 0xf0fff0, - "azure".into() => 0xf0ffff, - "sandybrown".into() => 0xf4a460, - "wheat".into() => 0xf5deb3, - "beige".into() => 0xf5f5dc, - "whitesmoke".into() => 0xf5f5f5, - "mintcream".into() => 0xf5fffa, - "ghostwhite".into() => 0xf8f8ff, - "salmon".into() => 0xfa8072, - "antiquewhite".into() => 0xfaebd7, - "linen".into() => 0xfaf0e6, - "lightgoldenrodyellow".into() => 0xfafad2, - "oldlace".into() => 0xfdf5e6, - "red".into() => 0xff0000, - "fuchsia".into() => 0xff00ff, - "magenta".into() => 0xff00ff, - "deeppink".into() => 0xff1493, - "orangered".into() => 0xff4500, - "tomato".into() => 0xff6347, - "hotpink".into() => 0xff69b4, - "coral".into() => 0xff7f50, - "darkorange".into() => 0xff8c00, - "lightsalmon".into() => 0xffa07a, - "orange".into() => 0xffa500, - "lightpink".into() => 0xffb6c1, - "pink".into() => 0xffc0cb, - "gold".into() => 0xffd700, - "peachpuff".into() => 0xffdab9, - "navajowhite".into() => 0xffdead, - "moccasin".into() => 0xffe4b5, - "bisque".into() => 0xffe4c4, - "mistyrose".into() => 0xffe4e1, - "blanchedalmond".into() => 0xffebcd, - "papayawhip".into() => 0xffefd5, - "lavenderblush".into() => 0xfff0f5, - "seashell".into() => 0xfff5ee, - "cornsilk".into() => 0xfff8dc, - "lemonchiffon".into() => 0xfffacd, - "floralwhite".into() => 0xfffaf0, - "snow".into() => 0xfffafa, - "yellow".into() => 0xffff00, - "lightyellow".into() => 0xffffe0, - "ivory".into() => 0xfffff0, - "white".into() => 0xffffff, - }; -} \ No newline at end of file diff --git a/crates/parser/util/escaping.rs b/crates/parser/util/escaping.rs deleted file mode 100644 index ffa020f..0000000 --- a/crates/parser/util/escaping.rs +++ /dev/null @@ -1,11 +0,0 @@ -/// Escapes XML special characters. -pub fn escape_xml(characters: &str) -> String { - let escaped = htmlentity::entity::encode(characters.as_ref(), &htmlentity::entity::EncodeType::NamedOrHex, &htmlentity::entity::CharacterSet::SpecialChars); - String::from_utf8_lossy(&escaped.bytes().into_owned()).into_owned() -} - -/// Unescapes XML entities conforming to HTML entities. -pub fn unescape_xml(input: &str) -> String { - let unescaped = htmlentity::entity::decode(input.as_ref()); - String::from_utf8_lossy(&unescaped.bytes().into_owned()).into_owned() -} \ No newline at end of file diff --git a/crates/parser_test/Cargo.toml b/crates/parser_test/Cargo.toml deleted file mode 100644 index fc873d6..0000000 --- a/crates/parser_test/Cargo.toml +++ /dev/null @@ -1,23 +0,0 @@ -[package] -name = "as3_parser_test" -version = "0.4.0" -edition = "2021" -authors = ["hydroper "] -repository = "https://github.com/hydroper/as3_parser" -keywords = ["actionscript", "as3", "parser"] -description = "ActionScript 3 Parser Test" -license = "Apache-2.0" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bin]] -name = "as3_parser_test" -path = "main.rs" - -[dependencies] -clap = { version = "4.4.8", features = ["derive"] } -file_paths = "1.0.0" -as3_parser = { path = "../parser", version = "1.0" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" diff --git a/crates/parser_test/main.rs b/crates/parser_test/main.rs deleted file mode 100644 index 6abee8f..0000000 --- a/crates/parser_test/main.rs +++ /dev/null @@ -1,62 +0,0 @@ -use clap::Parser; -use file_paths::FlexPath; -use std::{env, fs, io}; -use as3_parser::ns::*; - -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Arguments { - #[arg(short, long)] - source_path: String, - - #[arg(short, long)] - file_log: bool, - - #[arg(short, long)] - mxml: bool, - - #[arg(short, long)] - css: bool, -} - -fn main() -> io::Result<()> { - let arguments = Arguments::parse(); - let source_path = FlexPath::from_n_native([env::current_dir().unwrap().to_string_lossy().into_owned().as_ref(), arguments.source_path.as_ref()]).to_string_with_flex_separator(); - - // Canonicalize path - // let source_path = std::path::Path::new(&source_path).canonicalize().unwrap().to_string_lossy().into_owned(); - - let source_path_ast_json = FlexPath::new_native(&source_path).change_extension(".tree").to_string_with_flex_separator(); - let source_path_diagnostics = FlexPath::new_native(&source_path).change_extension(".diag").to_string_with_flex_separator(); - let source_content = fs::read_to_string(&source_path)?; - let compilation_unit = CompilationUnit::new(Some(source_path), source_content); - if arguments.mxml { - let document = ParserFacade(&compilation_unit, default()).parse_mxml(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else if arguments.css { - let document = CssParserFacade(&compilation_unit, default()).parse_document(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&document).unwrap())?; - } - } else { - let program = ParserFacade(&compilation_unit, default()).parse_program(); - if arguments.file_log { - fs::write(&source_path_ast_json, serde_json::to_string_pretty(&program).unwrap())?; - } - } - let mut diagnostics = vec![]; - compilation_unit.sort_diagnostics(); - for diagnostic in compilation_unit.nested_diagnostics() { - diagnostics.push(diagnostic.format_english()); - } - if arguments.file_log { - fs::write(&source_path_diagnostics, diagnostics.join("\n"))?; - } else { - for diagnostic in diagnostics { - println!("{diagnostic}"); - } - } - Ok(()) -} \ No newline at end of file diff --git a/demo/Cargo.toml b/demo/Cargo.toml deleted file mode 100644 index 4c5f005..0000000 --- a/demo/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "as3_parser_demo" -version = "0.1.0" -edition = "2021" - -[lib] -crate-type = ["cdylib"] - -[dependencies] -as3_parser = { path = "../crates/parser", version = "1.0" } -maplit = "1.0.2" -serde = { version = "1.0.192", features = ["rc", "derive"] } -serde_json = "1.0.108" -wasm-bindgen = "0.2.92" - -[dependencies.web-sys] -version = "0.3.4" -features = ["Document", "Window"] \ No newline at end of file diff --git a/demo/dist/as3_parser_demo.d.ts b/demo/dist/as3_parser_demo.d.ts new file mode 100644 index 0000000..68bc12b --- /dev/null +++ b/demo/dist/as3_parser_demo.d.ts @@ -0,0 +1,40 @@ +/* tslint:disable */ +/* eslint-disable */ +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input: string, source_type: string): string; + +export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; + +export interface InitOutput { + readonly memory: WebAssembly.Memory; + readonly parse: (a: number, b: number, c: number, d: number, e: number) => void; + readonly __wbindgen_add_to_stack_pointer: (a: number) => number; + readonly __wbindgen_malloc: (a: number, b: number) => number; + readonly __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number; + readonly __wbindgen_free: (a: number, b: number, c: number) => void; +} + +export type SyncInitInput = BufferSource | WebAssembly.Module; +/** +* Instantiates the given `module`, which can either be bytes or +* a precompiled `WebAssembly.Module`. +* +* @param {SyncInitInput} module +* +* @returns {InitOutput} +*/ +export function initSync(module: SyncInitInput): InitOutput; + +/** +* If `module_or_path` is {RequestInfo} or {URL}, makes a request and +* for everything else, calls `WebAssembly.instantiate` directly. +* +* @param {InitInput | Promise} module_or_path +* +* @returns {Promise} +*/ +export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; diff --git a/demo/dist/as3_parser_demo.js b/demo/dist/as3_parser_demo.js new file mode 100644 index 0000000..0e1f671 --- /dev/null +++ b/demo/dist/as3_parser_demo.js @@ -0,0 +1,199 @@ +let wasm; + +let WASM_VECTOR_LEN = 0; + +let cachedUint8Memory0 = null; + +function getUint8Memory0() { + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; +} + +const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); + +const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' + ? function (arg, view) { + return cachedTextEncoder.encodeInto(arg, view); +} + : function (arg, view) { + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length + }; +}); + +function passStringToWasm0(arg, malloc, realloc) { + + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); + WASM_VECTOR_LEN = buf.length; + return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7F) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + ptr = realloc(ptr, len, offset, 1) >>> 0; + } + + WASM_VECTOR_LEN = offset; + return ptr; +} + +let cachedInt32Memory0 = null; + +function getInt32Memory0() { + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; +} + +const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); + +if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; + +function getStringFromWasm0(ptr, len) { + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); +} +/** +* @param {string} input +* @param {string} source_type +* @returns {string} +*/ +export function parse(input, source_type) { + let deferred3_0; + let deferred3_1; + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + const ptr0 = passStringToWasm0(input, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len0 = WASM_VECTOR_LEN; + const ptr1 = passStringToWasm0(source_type, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + wasm.parse(retptr, ptr0, len0, ptr1, len1); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + deferred3_0 = r0; + deferred3_1 = r1; + return getStringFromWasm0(r0, r1); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); + } +} + +async function __wbg_load(module, imports) { + if (typeof Response === 'function' && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === 'function') { + try { + return await WebAssembly.instantiateStreaming(module, imports); + + } catch (e) { + if (module.headers.get('Content-Type') != 'application/wasm') { + console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); + + } else { + throw e; + } + } + } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + + } else { + return instance; + } + } +} + +function __wbg_get_imports() { + const imports = {}; + imports.wbg = {}; + + return imports; +} + +function __wbg_init_memory(imports, maybe_memory) { + +} + +function __wbg_finalize_init(instance, module) { + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; + + + return wasm; +} + +function initSync(module) { + if (wasm !== undefined) return wasm; + + const imports = __wbg_get_imports(); + + __wbg_init_memory(imports); + + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } + + const instance = new WebAssembly.Instance(module, imports); + + return __wbg_finalize_init(instance, module); +} + +async function __wbg_init(input) { + if (wasm !== undefined) return wasm; + + if (typeof input === 'undefined') { + input = new URL('as3_parser_demo_bg.wasm', import.meta.url); + } + const imports = __wbg_get_imports(); + + if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { + input = fetch(input); + } + + __wbg_init_memory(imports); + + const { instance, module } = await __wbg_load(await input, imports); + + return __wbg_finalize_init(instance, module); +} + +export { initSync } +export default __wbg_init; diff --git a/demo/dist/as3_parser_demo_bg.wasm b/demo/dist/as3_parser_demo_bg.wasm new file mode 100644 index 0000000000000000000000000000000000000000..7c9e5aa02bd4df0e41dc68fe5591567782537150 GIT binary patch literal 2501076 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⪼QvJd29)9H(Jgb>fzap33+$w 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

}=)ynK&{^)lPy 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 P5?ui`DW96Rv*|M zzQlM8d^M~xX2UnZo#D&iyI}P(J%9MP$<@}sHM!d24Oo3ob@(Z)aZ+{o1FXEX#-4U! zSl&&r)5*9C+znP4@8x*UGM`yMEc5-`nImHs_gK{w#!X z-MgEwnDJM{OHAi8xXk!QpKE_(OnSAjd~1)L<*>>!j2%b8x?WQsI}O&Dqds;qth^@S z)TOY>JAM$yiE;ZMc^(OtO%J}!uh>zju_e%}Jqo_nbk2hBf>quD^oM)lG$*={|K~avhK5CSMPo8e_e0Yq{y1h5TSx_NU;_QLyUsCgjJPPIvfZlMigi z{YY44j1A(t23EPmmzjK!PaPTGi=Q{a>PrJ@i(6r}=|J+j$9NF@FsyukCa))8+25M9 z&%qieuS5PSthvzj@JF!9zBe{MHT|Bx=Y3`J2RVMfF}eKz!FX^x5}g{_pNRfC#+oyC zG5!LTEI5sAA@XckzWtTZ8&+Ayka-R)AGYAjH=WCf4>TRMORn)C{M-yyxjrWhhh<;S zh>kRQ7utF&Sa}WYN1rqKo7B%FlMg|Es`1EntZ5i;2G20gL}xavdd`3s7)xGaI>XT~ zhvom>HVmd?ct=(y%pL^o- zItA4g(XO{6`%F@$xMq_wGSZU`V-`IF1{`Z6B&un()n*L09sPTOm z9$`9P!DEa^lkc{$@*Ru*1mj%nPcoe`=ryE=WtKN#K!zx(*oJf1sz{+`8pVQI5z;qU*L1Nb&r{b3XA+yl#> zKJY`v8jBt`z5#yLcq?>Xgq5}i{*%csN9QeAKHPv0@0h$dIv>IE;U?st!t%ch@-L06 z@&6msKahPt7|(&d(?k6e(eDT=-&5f(#wWu)VEMmoJH{^KaquRv^3wCk17P_e`?;|E z)H@tEGx?U-$v6ERpZOImo4PME7FNEC(3t?My>^DD!m@cgW#0u>yBE>!yTP4d)%k2# zW4r1n2J0I3LAciB55R}R8uOomPc=RZzS#7igl~j(kK;M`L0Hes==}Af=|4xlZ^J6r z>+rkA^5+9seyUG?49kB#d;FE@i2n|&uC9f@hgJ4N;h$iY{cyPB8DZKZ;jXZB&V+lw z>9G1TH>tNXz-)1_;!YfQid=IR0 zDeZ&CAHk0re?FLgWBhM?e%|RIe+gFK)AQkP!+Q2f&xd~nr^Ek(e}L8Z^sIQNGednH z?>%A3Z-o29^5JO8o(s$WeQAr$Vb#e{{2T$V3y*@gGWiDhxt;NR_DzOW56@C>Q%qmH z8!Vf;$2Y?`m-t?=?4OBzUsyiqSXcgIEPH=ULEbFk@b zh5SfZ`98upf2`@>ik%Zou0DARtb9+VTxS}e3ZG{>8lx^Uxt_nh43^Iu!q*sY-;QGy zPD4J9a0{$_ug1v^OYEZ;EiEjIp&$o|H<2ecGcURmfLWb)s@M;L28 z^Eg;#-;}hc!m6t`;4_T}`K)u9eh>67HogYF!gS{0^EGf9X{B?W$seUp-emgQBEQ3Q z9-uPrgjH|%Ab${+pW;X1bojTF{drjDn%}{1z*?Vq0saV9*>6GrbK{%guVL9)7ygII zC$-~uqp<3KDsu1aP-iOgjXT42?LBLQdhaK{F#Ey zJmVeUQLy~k5&K)2{`Tl^1IwRnFgD(FdieAWI1Tv%^mjD*pU8I_Ec*lK+k2S&T;zMf z@?Sj9bQY4f$T%1M{fs*xuQGk{QdmB0M%x`=yg%}TVU0E2_eb{*;EFaV#ZZp0BzRPq5 z`rLPfWwVO355np{(s>G2|B*khn7(vghh?(@{htfxcN@PCKLjh^qu@tP|2X(5SU!kfG`W0!+4PTwUo-jf@Y|*@{)_1>hd+bm+usyS zz6|-du*PupleBZg{-%DC39G!Sw@qN(>ruVs!)fq?RNin{b=aRU3YPu#sq?Y0>SSG? zxrfPbBJE`34jk7z8{de0cUX1uHuBjfPlM+fw}*>h*?a~2r6%u>ywc?7Ag_gGM|_~^ z3`Xa0SU&6C{gEdBJMrUT)w%BDpKN>qd^)VWz9F0gtBl*Cc)rPXfBzC#<=wp<_f}xp z8AHFl*7$sMZZw?-@Zok?HfNxJxA98k55Tg&Imh5iSa#k>qyNFO|25$m(|H8_=V95o z6Mo6$gDCGGVWrI@-&alNKICs1KZO2!u$Cm<%ZG=N|IOsP;OBS7&#?1H zSZP3rSe7l%@0cFWBz8jrvSU%qi_clHo{f%LY>gB?|$?wPKfw279 zm-@^#`6%Q=Vfi2)1*^Q*6UG?d2akj0&t2Hu-sF2?X9rkm_kwqUWq%Gl-E?GgCakpI z6ZSFrdDxj}@^6tB8J~-MKUnA1EwNK=`ri>>0;{~+^rs)f%4;C{hnUV?#E*cLR`L^I z<@k@2w=Z9(gAzv4k&1~ddjRzv{0ZYFc?q%}Zh;Ixl z-$BR+8V`myhvmO?^59@zgnUa_{uEFrV`166g0P+GA3(knV3qL>^e37A-S8CC*YDkS zF`ZkGPd6QfK{$T;L~CGIl|}I zgJq{T^?VVmvMBAPrX!nInU3t-U^?C5TVUmt*B}3kv*4A+J>aKIzYqG)!OBbg5-cC& z&nqUs6@Jt7pWqz&4y<~6ny>dwr;|^AFnJzz{<-OEUHU8Ig~-1#{k_ot!Q@Y3^Cwt! z*p>2jz96iV^+}rn%b)ECJx#8AxH+)u1oV89rgH}J*~VAF`@+gsI)x^`pLhu@pU=Rz zGSjI;zuI&@M7|VOfAEnXV)Bvjk*2>fe7v#lWt?iP^@OvHC!=#AEIYOE)=`EUyS zzVT`Br>4JmJNkz4UhsFYeA90pe}q+6vi~!z{x%*#+J&KfGejSaUYD-EvrSHrYJhE3uNXg1TYm^E-`CUVudtpmn1TFTSpLiA55}_jGpu^( z?$Z_*h4pY7W$y&bXK@y+w14IJ-N5(@`b>`TPuS^etlzW_GCqbn*$kFHh16j_ta{GF z&K9uRYYTXs>7ee7H=VPH>;S7Bv(VWUmJcfX4AU9wvn~nC{!@%O`@$;AZRjj8x%zMs zthBv-`W7r7#FfUXw>slz;R9jWymugLyRg#UiTo&IJtu!WEZ=^IpQpnrO9^})oCa@< z4;R47Yfd}QyA+lkt#@5zItOC&8dyHBpp4hU%J&}lW>{$pNV@`7+Jn)**Ys~i=K<51 zkIti}voHJn%eTn2w> zTuj<;j9=}`niwpfbwBrKlb?sY!^L6!h}VN<^BO{T|Qk8KLe&tdedp|H~GnT?UAUpa_l+~iZqa9ddUPT^~NSoXEXwG*ssE6wrtf@Sk2 z!alI_eGI{TSoR-y7mL2iICcgxo!%coEe2mF2hEFj0 zZ{SmncOdOqu=>~lau*&-Z`j5i$O=W))mT zx94D${d)9&XF4~+zlUXK8i`&toqXbNn9k$a{Ilt7hn){iUPQZmV)6yF#g}kr(uuz} z9o6~2VEJ$+-0qT)&w|%6J{4XMmJg@HnXt+td2cw~09HL{tm|j`8tZaRu5oN6EPphN zqv`yaecq*EUhDVg_=Q#fkMq?TR{gI)-qmzs?HKco3*p|TzdedMrmx@8`=-;Aw1Z4% zIAhBYlaHdj`LOCiJO)--?jhf8VAa)2@MO~$?+mMtO+kN8)6p0{&vZKbv^6X{(kV5$ zbSh2$6Z>k7-%MjJXZ$DRhnW7Q=pO~khvC%oNhTi#p8=~*^lZ;L##&3i0LI1O??7H` z`djwr7&rbKX|FT=81--ytaf=F`3jTk9D0xGkMilSu*%YpwtEbgKX(pfEPypX)HB-y(}ENG%s2oRv-Huc@C^{N#BQ+*I0bZh2`f~ za6a4-{w;ovGWpiXw>JIvDDOmAcAjC3-O+dl1Uth@I|rT)E8j)*pFK@pM!s`k&8sh= zyo+JYpD%?Ef@M>GL*OvuLVP$1mYp96Cz$+nbWVYl*E|xPX*%WYI0j7qBl|9a)m{_P zxyx0(D9_-H#MOh1RZ zdKp$di{CPNcldqN{~rC1jTht37qIfZmhhFyYmk2ntA2{{=by0JOZDJg9v&}e!|TE7 z1M;mGtbQWj2EnSUQ>g#VVA*+sO!7^xzr!#JmQBgGhSTAvNjn)<{rBll`@$-Vc!tTl z!F$89U)hfKF#adyDuk8Sv-FciCjSZ_%3#?nMZel~)aRF&j(!h&ps{>7%yj-mnxkO( zc@1rJqRC%I=Tzg5>8oeL^5+xyJmYK0_hMN2UPRg}V3kqNz25|@TzVGkPLp>;f2HYb zP45XY2!SYQ!0w#NJB>iU#SoY<^SkqaA zd|Q*NToaAu+Z5Azj&_^|tNt&b4riE79ql+9mT&W^^LZv8Oxi+|?+uq4_oA*UVfizP ze5+ykSpqMC(_rZ=GagUc17O(~A7=W`u(8OVytINu7K0fc?iX;Os>B@c)hWnMY#o*&wBpk4&xum>u%H0jrj*mUP@jM z!}7l!@+Xbc;O9+Wf5Y%4V?D?63M~7-rHrqe{yONtW84A$$n^D_^v_KH5q$X4bRLGk zHU2lYel(rkF#I#Dx>`!xb+|IDlbw;TYkU>^(v7#o|E{q7*^94C*~^6Yo6odB=3PtJ>!+XbaKW+}G<(i&$MQg z(J?bPZ%qz7PRMgjz8kLu^m)liEw37*@(XHw-s82Tlvh}mE%z73Vii8`46EVQWJQb> zq~S2}hz->XL`cVrM0mf{0l{mK{qh2utg@D5J})`rO(*445pQ3q<1H4vg<^Rv=~aK! z3h!LcAHCIR-cCHcXyKTmg|U$%MhxF-L{Y3@%V*UVkD070TtexJ=GRrt zudQT_6#E<=L72iesO0&)#t@F~n@XIQ5Gtu(S6e)E%-Eox*Hwl6lg?c;oi}^LrdHGj znea;7qGhlVFr^IzkNH(3cbJ)%$Xw7jRVLo92VRM4=Eg&o)xcEYookZF~xQGxV zh}C}=5qyG68;!fPPg~j&^rC4?i4TaRjmBNt4xPe$_e)8;n0OhXoS=53nY}8){)B2m z4WX7$M_58wN?1l%PGHDUch{S!bSwm~JN9|SR=FR%OwQ*}XH;`Nfw#+-*80VI>mJIs zGaP;x4l8|LkFv-H##$+aZ#MF4d5vI1D|nGsID9suwY0LXtVqY;0le^#{21dZD~1LU z*$M}Ur2cvUWeLXz=C-iLX>DCNh`PI+u#)g0VZF|o^l!a*uYjRC9BJs(450M)3SJAt zP^dv(Bhgrj5*`V`NTcB_wv6;TH?00RP?H}Y3-T)}=j-Kc1w}O)7at%G_0cT}S%h5~ zv}Q0O9|)_DDQF%yxxA`&`P9(GNot|#l{LHZnjGGWw{+LoB8U4>m%q@6&UIXR@|ezP zC%AUib-aRnACJyt!tR8*ghhk`URcIUs46S`VqP;CD;n$9#L9~EN^9op+%$iox*p?b zZpDyQt$AMJR#_O1!9m|vO;g9~Wd`HXk?V$i$Hh;y_`&FOF~1LCdnn;B!jS|gKMFpY za2TP$4a2@(Bp2f)syYc$EMD8i3vTIUoXdlLM|X=YtK$7$v7)l&-Z7-rM`PEqgf&^p zoGxJ*f9}ll1K17*?iN>gY^hEYLrCZB97dz++VVJp8>^3pPavE~SjbBtc{^AkM-lHH z<87GMrmNox3o4eER4!#kF)VM)h@dTls-!8uqKq2TZ)hKuQT3=#diulyPL2#J%g3gt zr*jM!F81RNj-8PbPd~D2X0Q&SbI(Zx^;djM?Og-ghf`>D>1S zlS0i8UHoa{nh&gMeurxtFWI^GJs~p5%O1 z)ulug)K=$L6=(`u5gdSbU|)5xk_<<)UHv{%%y6?7>_9%4)}st*hYWrd7E^7Wf>d9Gwd|J{I^4{B@kDPsJy9ocD&ayJrUThW7ZY zHmZLZm21!nPNKO(R=+e%yJO3S@`^y-9b8*5bQp8#ErY(K7rNz_QjbA3dhg+v<{ekj zSRCf@_|?S66K`uzc$I3IJSocv{n&v41yaU z&V&;KI-@Bh*+woy$h9<9H=uM9j6DX6}Qzt{Ut!+Zh}dXRyy34tW7JC#V<6 zTXUK(*lxkLt=rM{s8LyAJL=k8{l2a9b^Yf?%Xgmj9~WOtT*sS>x1$Yu{sMlrwtwB! zBkW)Iu~q+?#J0Kq^$j}eUryKcuQgTY!}EqSZUm!7&@Z_d)#N@HIQ;BPZy|Z>Z)W&x zU0nBN`bXk=R&^8NYs#m_Ml{zCR^XS$GuIDX-1P$&U(@}dsk)lhGpwt(Ifo8kBX!Z> zxvH?Tyu4Cp$NbixuDo;bD|)_q7@rp)(|Dz8qF<{0YS&M0KNolH=i+Ow{Ti&x;EqW2hBO6@xvo=trKaiar+hDCKBJ=_OGeBY^u*aY(8(W4r~78o4ehz zA?ccl&GU1EtvGispCKYX2l@T|S-VcuT3B)EvV_i@2}AcO7<$0IbH_@vzhA_QQ(5dv zXbnkk#mwkj)dxZ6Kb;?3T}h^STrkj#W$98^wf@veelRHwFNHX(7P8F83szZ6V{z`y zUYWu3%WJAWn;Tm)dRyP*+?I*2=gWVB%5nkWLc%oGD7pM+0@3{1;zig~A6b3>wJRXPZQPRc7=V2SfWLeNs4{CbX7iKcXP&DxOEw|beo)eL$RJg3#_wFL;G4F zOIB&L+{tRI9!s=FlNCnuGHCK?X+3qx?vRtyvuFF9R`tgY8QB@(fAu4MG#)haal5m# z1I_TOQ}78!a)$YyVPk|oWOu^}R#rwrzs)Gyxzfps)2&-Z zMu1sa34h4GXU{BomH6azYRH6qe8B-I#todBR)C3NAftCiR`1@uojI^~M(^IP>m^KZfJSFckpm{sAx*rJ)Pox9MNTP49Y85* zK9_$^4n_zW@yFCCQk0KU2EHni$Uj2^Kt^N)O5`6T2&^k@>L)pW_L7w=e@0LWd?8z97x|=?KfAr{ zw1&!Qef_KaE`K^fP;9Gzv#m1m3CogP|2?z9+BZ!$G+JO!p37`#J4mdrz)ZL&_zrcY z$S3G>!M1nM7HCM!j&S3?6ZNl#4?gXC20JM}-Nrug{GA}O4g8A4$tXj0sD2+beOM8p z(Tu>7oJp;J^C&y4g&sY#Fc3ec9QyE+_YLT5lN=Rj<9}%z32xAUg%JG zWWuf@678?bi5z{6XOo<1B1UIXOY>0;+xa6t_(n&%q->+!3N! zB7f@N+|TKz9;i=bqzU&mm}f-D96%?-=%**sAZ82UVUno1c+2(Z$z-A@_b4*GMBi!D z`Dj^`Z|JA{4o@FU;sP}%RY4-$C^BITKjtj)pdb<^&GI4zPQj>q&9DwI4wujyHi}2) zQ(+Z`HiBIsx;jQU9>Py3ijOyea$qOijdG&C5mBrrXW8+cTsrB)cZ=uSTzu&YEcAEn z_iEQbZ~(-I6Fa8k@#f7Zr*B+8S+B8tT68!zm`Sqz231-p4372qz>*j~5=56xwPgo1 zo1jOx@NzSLAhZzNagvkMA=QDk@wTghp7EJZJda*+st1`~1O20(R?7u+MV_{C`eFB~ z*Z+bsJ269Y+L0{-f8^W}*P!19a!Q;}!d#OMK1AX1$-;IvC*h1v8L9fsdy|!VMc0BPsD$o><+sy+lL_tGu1TF1 z@3hR>G?PTr5LI#TtyG{@dDxB`rlQxkP202lWXL{E>nHD3l4MCV78*>nUk?O{(X=s& zT8Oa9OYdoZ{VS3tfz*+8MW*+%WS@A=xxG2{`dh;PusmV^4Ei&eI(=NnS$5knQ7gWc zFmVBtC_+nI-?@C7-O6M2Vi|MS zMB%aDY*G}$W{Wms(D#D^Cdy0U(M`mgwjAEEh^!A=o3-!+E;Z)6efn4}$FH?0pa!zU z$8|orV-s&SNW&4R74zjT(Yq|Gz)4wY?%m9%MOh>Yx@xrQcLLfnrK_2?%p0e{%T{^daBm1-{&Q+e=-KcvP?&6Um9uH#NTMPGdV=aFB zIVc|SVCI|9&*_!;1b0F@1fT5e&g*7&R&dAHdg}+fbvr!#bY556cJ27$k>OAle0R;3 z%s#z>RIF;dPY;&e!#N1|T=*$fVm=bYbCNneV}kB}H~Fz~!)=m|f_3<0C`3L^(Y9P+ zYlP-2xG5ZbDHh&94+rl)2>8b*Q0fz0GPaW?nq(?uFA zOUk9dUXX29?BR#|AIgI7#=n%NtI{<23G!I`m8fcJORHH8Ra)2zfkH#OS4-ARJ2l!u zEzLAE&{FLt^-_+SL^P5rA&gM!@z9!h#P%A%hI3v6hW`^L5?v=jt@6Wlu2v;ledSg3 zcJ(v#Cq;5Ox>+p7;o#V z9Hy%JC>tiidiIWwCg?pP*WXPRC?`zAchgt(jqkN7LAUsYdMHS~6_!YD>hb(szOCLy zX8sMLu5^M+8NR|xn&8TX1BinWJUX9$nD(?3Tr^z1_d?T0k-W6o}U|e)XpA)4O+v-~zR$ z#ND#EQSLfqqU){^(n6;m>&X=z_tzPMr8^0sI&=ABnYSp%@*xSt&jhIb8pMj)q;>)o7HY1$6+P5aJtMe~@-y<-Ru*5G@6yY~Lnj9zO z5z;JOv*}fB*g76V$OI;k~P7hPYs_T48`a2HyM zt?jq;uAaDa)Z$O@tF*W_2e?ee<7)^aD{ z)wo!RHvE-;Hu#l)8t)x#v1b)J=_01@r{3J$Cpnv6G#0o<^J|;3s?>B8{rF*@xUy^o$$Z>`gFuupEU_|@ zcdht1Yc1MFropYqVvVXc+2Z8X3tSC;3)T{UqxIID zzpfse(`#tIOUpL;_i9pq+vDPFqnC+MR;gT^ZN%`ZVnhD6Ko-xgVcq!dc)v_Yk||th zOMdJzzWCM0u_RaTuj|o+dc)G@MoI zr8eFrWfP4goQ_|~MRzAyJ;Xjr6O0WFyOT)cNa<1!_J-3+>QW_b&CiBXCFvz1an)72 z34t9~T-(}cD6@%5OHksd3GZFRvnP4$Zi47nY)Zs;cJK$f^f!FmhrgYaC}IkkPQsH= zfUOk82BXT;e)b1M?joq*{6Mam{*h!8$K&dB>eiJXOI8J;OF?Qmp(uAa66NFe9^wX@ z!_^ntB+r6K10qujGuFKncNbZ$88NmBXr|rYF-UPI;)~6+QWTnt(our`qS^_(OVm&3 zth!P>mvDG#*rror8zN0dQz!#&`-K6pmJNSF9$3;YWzUB!-F6kKs!ftKT-au$kxC7! zH~b4q>V?UF|0Y|&;`30wWciGXf@&5v86XmbBE7JBs%l{I^OPTxEi>A!&>qVpO z)xb2#l`$B&;}JK+J3(ZtRRWy)OKM+17p0)Y7(EM(}Lq59AVW5ptB0wxmDQ?)UovqEirf;FU()3@npaB-*PxDh(cr#>FtT2t1kKHU6A4>L zDfXMYO0?N^WWL_QeBx@>(Sr$(rWATaAv^MrR%HHTGm?fUR6+H{ttP;#^}l9QZ$TnO zP;WsZMG&2~ML7AQsts!+QS+-!@={CUtMsuVs(U3p^|HD}r+0RXUM*_jCi+?JQva74 zaCPus>V7kByV5nkjT>rSb*;w#Kn-YcagWfkZTRFA?-T)~lsfeaJb5=M;x_@^9$ATU zV0G=+f4m0NCcmH)K^I8MFPeX_H|h`1zH^&h*BQ2}O*SbPF3m(6Tb)guVdKk8zaXqm z#r%S9{y)kpQDZH1D)Nhu7N&@*1q-GK!kJPB=uR^^`)(lBnlm&R-|u4 zRc=KL{=yi!W{6|dg}5*R(fy4SYIVi&EF#$^V_f4u3n`atk!Z?=S|l1#N~bsgM1wbH&4tH1u~a!jIc3<}~VWO}T*$=B4ib=(R;9X+YUTE=`b+UOeP{ zYcfrs-N08<`81#&h<-h3^h1}%YN1d3P0sb|!}k1YQc_Ea)u)z{or7At(fHWfG>Ow! z%6W`vu%4DO5(f6|MteN36rI(MCVEYSZ=DY9hf1rR*Z)TYRL@r*{{<|(@jvndo-<|yjN|P7#D;3 zb#H_HpQ-HR5+}uimvp9-|9__3jTOXdAXw+%D|NjiHJ(&q|22`wV=!*eZmd31<&Dmc z;yV&&$i~QxiL#yCzfx{Cr)K_Zj3-|OwkoDS4I8|?drj6`t38M&Sd)(YXKd*hZ)y+- z#tf}!CkBH6B?&zaHi`v03H?yw;*o4DeIN-qG#x?9E3h9=*vS4?RvUkcC+X9gg$^Zb zjsB|YMjcGCQO|)?hf?Dy=`EVbA=;bk|4o*LQ~&3r3BOxMO?sSUs!7e1ok|!NnU(0D z7)tE7o&OIvasPjP5d0yv|J7nA`d*}j2qUrZ?<*wQ3p_Hv02@iz4~^EUT}dU;;H zHw>x!Tj4F=4qt^dEw{d=G)I`1BiWAfw(z#}Mtfttt=h=%&<86z7 z+j--?3EuYJL~oKe+1tU}5!n=Ps<)H3vp3D##oN`}&71D+?(N~t@Me0mygj|WyxHE~ z-ag(OZ?3nmH_w~zEwFMHcniHkuc+R?SiByJ>+MU{R(mXJMkhH%!!g+@@k#?r`+1Aw z`M0dS%i{XwUd0;lrV@Kq-u?|(s%}75zeF`&tykwQ@s@hayye~j-hmuRgS~^|X%F@e z@ecJ4BYt=wJHk8CJ1U@~y<@y%q2s*cy%W3>gLEf(Cwr$rr+TLaI?AtQ^|Ds0B{gt* zv$c7KcV@FXiJZ=Ag>E91=Y zYhY~+tgV5yHL$h@*4Dt<8dzHcYinR_4Xmw!wKcG|2G-WV+8S6}18ZyGKT!kcdl#%- zyZsf{Kx^+FuGRlvs(}kzefRi(sq|~ha$$Z+WqB;Wx~`%kR-K<$SWvyFGQT>usI;cG zdU<|Lbzy#KMNw>7USV}XZLB7*v~uW{#luGzjTo_TVZrb%h7B8DoL^T_T3A^W8@ecl ziGs4Bg=j9StX@8JSl*U-!vY&llviEz)vLN8?(sm0$D<{lS62~RRuwC(jTQN18(ZcV zlc680uCA;e>!;UN`XvPwMP;#wxMp*|t|sOW#=*gUWwk%JCRR{gSTfizkJXk`7S(uO z)oYnNn&NpUv)zL2>X$KaZD>JVZDn~uZ2=`4mA7S3vbx&Rvi#E8ST#lS{z!g{$nTJL z9*@YheZEzdm1W9z+UsGy^U^#X%JJgy#l%NM;_cddJi^oVeuWK!XQdTO3d%~0{Fci0+S+O}cH})`bOCwRP1T3e@|<_^_Bf4_Vja5vMhm_wc;o^su0R1syM+ zgR!(?k+Ss0y_w0QHlBAk<@MRR_&vn?N8&4qZ$dnGyJbVt{m5tTfpcp%%}o+%Z|MjvZT9v9!9NDtE{Nzp}!o+boz| zUA@4kAJxS!raWB;9SCdY_$p(pnoqx^XAK>mH_V2sveJb?UElatCJ#AzJi-?CEmzkY ztmE+*oaedyV_=OpZQb|W@jmYD@Oax*7&qZv|;L!&hfx9>-WF@k{|$7skrUXrbX-r8JQ@oqYBs zpG`W3eWIYICRQDkytts0jy2XV&nvB&A1kk_U7kCnty{>Q2|Vv@{L;DLD%wcnl8awW zd_3{C_N29A@JsK6WANK-H3pZkZEg(i^=>!@J6$&hUqO1;m#&1bA-KMDEqoo}dP0Fe zskEl5tbk5cUR4$=k5$x$owhp07)v+O@gGbD{KPb&Y`J#>Y4xG&dN&f7zSPtf=8xWL z^vF@g!;2P z*~9?5f->!l&7WzsZfqHSDywHK$FpU*>FHsfh`m1VWd`{VnOIp~rH(eUvU2;UnGgefzoNd&X`-$(Nymlt9g>{9CW3@F8Aalp=gD|6hi3~>5J>=vg zsw$VRsmgC)vRzbMkWZCXF~$d-dcud{81)o=TIU*0M)bLuAJ&Oq&ZyvrbH>tQ%|4eF zR5KS1D%&rrjMcQEt0l`9R+kp(N{Wjo&D%c5*ZuJEZyekjR~nkrmV6YBr)}t0aJ>>% zK{zfPMV_VjqL;v&TP{O>k+yTx)Qn(x)U-K(2>n3XCm)}pV5$o ztOvohQ#Ra_us&e}LN7vZLbSXa5^qU)H$pFm(1)-wVG}~sPLzH2wZvv$^!gF{69y0l z5(W{bQ&zP{lm{dKp7KURF0vtnO$m>qzZu)j2}22agnYs&lA4<)?!1 zY!dIsv(eESgiBKgZybqlLg&$Zq^0#R*54yMgH5O?EU8pY6_hPy!6dlUVzRu$1kT%^ zXYvCb#sxc;o=GXkHx_sM|9}tUSH*`Jb;ZS{%j$XXD)~=|-+wL)pEhRa<#Q+SeJ81r4*%>E*rlezLww(CL{KP)AF zH0L4JkK2D5@$HDWy3M9)1+`vvd7b{68O(W|{X4K9t*={C>g&DK_Dj(}hWd=w@932J zUx4qM5?p)e95ReBoa2$CK^OtM{a+!A_F;{Wqma4%8Y`pwSETH}GiCpAlqZ`1MZ||k z>^+$h|JvehI0jTOZDeJ*yo#lX{Dmw&a!M*(%n51Pmzn&$igOWl&eXwk@&44Q%J571 zR8_h-wxm3qk9GMflb?%mPN%WtgPSKdvxMrMMmqJYi`nY>z|HI28tNXJiB7F3u4LbB z1lJcv(tgvcV=Uy*?lAv@um!NFy0Wfnerb>>nr2J(NtbF1bVpm9rVQd^h;K#EIHB{& zSa@r~X$0jvj;+#5S(|P6+Lqw1Gq!`r6P%9|;Oz?G3SQK3ny@F>JYv@wPMhWVX^zIU^L}Mv`y4q;zxGzoYu4`f{**5nTEv>C8oE zLP;e}R!~z~xVWH@GDXX?FZ;J&UK^Vct4)$?Ep(Syd0|OP8Rp03Ba)7h1#$UEl9k8G zb?=G_h~`y*PI$c)t6m6eELNQt!Yrc(r}_DKSVUZYYhR2l$7FG78S^FL#l+Pv+P4U1 zJ+ru=rZ&l!66ECt%jQ?aV%#p%75Xl^TN2bz)SpuHeyMTImP+Px_adgz?SpSJ`5`Ok z7D6_`#Se%3M&dWZn@8fez?($ky0+3ea7a402qW_ID4W(@HuuAE1&rtM6#F!u`rB;l zgTd#WZ^L7>71vL{RMj!Ygy(}zzRTo?$h1FWQ$MyXotL*zGT3 z{|IC*egp9#k@$_oH;cq?Cf+Z4r>q@y@6Vp9{!ZNML z*NpYO(f`QweA3-YovZ$5%$%^t%-kXDVNHpB8WStnYRq#w($mLnZziqIF>b%}`7#ps zNABWRrNp&9*Eh2NCgR&h;#!M{?q5M%^LS_P&XoAw#3!(yb27_KxkEPpJ{-G8vX!qz zu?oc87q6_y-3b}$p4-Rj8cWYZ!=1<%uwUox$E|EmuQ0sNm|Im^w9V#za3*G3Q&w5K z%@FnB<4C9T@#!17dc!pnfk1 zo=AxFo2nl(J)L)#(Iz^UTKj1i|5(a+ydFrQomWpB7qm9(Hqj5qIeK`l&#+WbSX#Rr zsHmu{<;HShA)TFZwbjBFBg9T_9O8p;ZcMc+*XWDofOQ4)TWw8DJ+NG zJ(>d|^845~y}FVmqgoakJTJQMK=c&Xm@69xS=`w?nD`+C{s-aEl>OBy@xzEG@|qgC zWy5UF-MuNRtX!-^%5CQ}i)V2r9u1dF;?Z#Ld`6|XDAbUsuC{m#k6e|N(v0)%EK{TT zB1b`OY2o|^_t{LYKoio6;2!OK6CL_fCVwo*^G>ks*=$ue7qjio_D0*@&$b8g-`VzE zwyLua*{ZF7V5{r1^?we}V}004e@4o^vBRk^SJ!v4KYDNM2==*az9Zpq-W}c>JBqlw z-Z>g}_rIcTdq4K#_rIow&n``^sH&@V>v2)ptO_@MpH)#)S5;M6&Epj_YFXJVUsPF} z)Mt(%zlhRqtY($5B1x~0NGIzF1-t2nAIFkL=XaG={oLJm3%0t?hU_?WTt7S>KEVQ; z;FGv%zUH2-d!E%G&Hp}Oy9L{}KA*TJDu%VoN_w`g{wN-O&O__Zp}u?m!o}V57tv!h z$|q8JACop3PC|Av;S|ED1nG173Xbn6YkgxtT2@jx9oZR#Xj;v25e0S}pNU`rX`|sR zWM@axo&!%Io!UIg=OVv|w9%kzq4NnB5H8eyf?I!y^2NwsC2cfZg6ubhO9__|R7N?h zO_VQ3klj8jDO`c&H>P2KjW-M#Htpt|Ms8>IOnv_pSJS&=xMTeT%=E zL#1`d3dWg}h?f#~YixO3l;U>q8HbMg$n@}@K1&V0-AX7aSi&u8Epiu@az`Y7QcOOt z+=wA(|2YPMZrI|&3M=9L>w;p2V!v`Br_UuieJ*4@!}kknd9borC+dsHzb|PXWUKLc zk#eo8vgAsU(0vshjlB&#oavXc(9RUMtg>Q}_b>D`CU@_c6|`wxd`u?pSmDRKkms%q;2(gL1nixrkqc|4XFJTBogb#E$H#zp+qwf_pXx~@xI8;YI- zqH9A@`8?Xgtqn!x(X}BR8~hK#O>zC?wV`O*0(8RWj8)$ZyS1TPU{_aK8@iQvgKI;a z=x<}6I|nR+ZEYxdDJanirv~$_U?!y64V3N0M<=(LxOB>a>1Dy$F zWz%BCwdIvHwL6qn*VOJ#-&7wAyWfuVwpmqE>|tLXjhaUPVU7_w-??)tkMMALl;nf1 zjqW12^ZeZ@@q1F@_ol?vCeifwrNr+~i9e7Me=sF}SW5h%l=#Y&_`@mjM~GW(>#}ga z%2G{yp~6a@eJu=DO_rAOC^R+XZ_Cr|T&#>8yUT>xU+VttcEL;nEgheCVrc@ zELNjCzdRQj93?&n3HQ24 LOIYK+HVn^4B(T~o>ZvU~gllHe^Uu|$L}E{k_s|90^gi0=@IUqoEjxmq3cYlFus7&G+S3O(gkF_=jKmmI}q z!9|1B(KehkG^cPjhY^p~VT`!0rQH4si??;1>55e=M}F6E{(dFLYA$ZL_^reTMdA+< z*L9uS|9ndPb>d^#-`Y=n1%_iH_#_0Wq}~7T*Kpdp-L$L_ZMV@JgTtv9*DlkDs~uc? zPD=cel=#z@p5G8L47lHzE#(?K5YcJt27 zedf(fWaGayV*uemsa`&x*^*4o=V2tC3DAtXrj7+I)~cSgcGu=9zMS8qIM%dI>*5oL z4~@hp+Wxk#?_iBb%Q5-fcjUk7eo97`SA#EFFCR>BajjG9SZ>KW-kaFyhpyJ~+<0{a zagCR)UB}DG%nH_ahO^Z%>g>67JQshEeOkwJ@h6m5B>p6<@$J=a;g~QHRvBG<7OcMI z;2+&`We0d33SU-h9 z%HI=L8*tcpe}FkzC+XjTJaI=kxgJWCH*Dpl%dyjmsY!=6gstS0LKm73keje2$JTE^6 zubFv4z5K(2G~bn2M=N!do#n;Y)-pNSDB{OhSZkuIUk}0a=MDXCHEAwpzt+I1;E{Pv zAN|2R%TUUr{&tZ)m?t2)%Hw%leD?9}B(}OoqIDwGnTwC0EIRgFd~4$Qk@&X62c*Qa zBJn9H`ns>B>l0^hC*qpxyST<_-S={F9kbE+pDgZ{c(}IJ?>D*r;%Ci~bbn4s_nyTI z{F?IcR8m>Dh##La#qy-fbSMb#z%K81;b>XEHXCmLKT_h~rRaZ?vR?~GTCZ^F+Y{Fs zK{OuS-!VnMOG-R5C7zvPPw}X|^;6=y2N~Vpk9f4M2d2a;iAVd!8N}7kBfX594%M}( zoy?W*67-{O{ZHm{BO~SinRqn+e-n@TcQAvH_S?NGx^iKOUtC>T?$fHleM+B)7ku6L zi2ZQ`)@>uUbuFU%vu$_`2GlBmAUuhIDX#C865>D4cFJ>%jT*3K@jd)r$@_ABm3;=_sSICJ{* zi0fXHi!Vxvs~<-9KTBM5Q+-?-J(n6SQ%?J^FST~gld)kq=NZUWbDp+t$FLtK?zc}T zUtMFmIhKpNIhBjMIn@k}Zc{ZFCNBy`&&e9sW>zoXfg@*XMfjURPvawpND$h1-6!c> zRT%!SxsyKm7}x|VhEyNK(Y;o^6u#E0Ryt|?o({^RUu{U>Vo60X}vMDn?q zxQ<7&gDd^ua?*wQ@T#mk86Id&KSg1FYeU3@pL zQ=(;=krLl0B|a}DzAzrQYDVJI!fyOnd#NThc^lD|LJ@*5r15~ns^(Z!;{8D zBEbd4G(TJicI$`b{6URUepv6vs%lEPgU6DGdrDJx_3XE?L3fV(u5+i(jq&H&-18v1 zPsz+#cMgN65o`QhZZc_EW%!mu-0XTr_@qtv=Q_fl>jdU&+|AG6mpWC!vo$QWaQ9L- zEcN#)!dV!9Q^o4^3;fV{_8D!gE}`%_+=lHN%*U##OUrqVbxHUaUbrvPH$0!}cPeD> z>1vsyCU|5iQJsy96!aL47S*-UrxFwWWH{#~UFS8QIvBtFZMN}w95j!^b$&U&17Ji; z*cyo~&2?SOR5$k@r6ES&e`E|2@JGk`TgOO|7h&gvrvXm0@XW5u#RGZCcxGt5z1n z5QY#!Sd5Bj)vCp4D28DOL#PZx2qA>u^L^j1Yn|QreEj+C^ZouFzdd?(p6~PjKKD82 zKIb~u^*&$dz_QMl{O8uoJtuIndrshD_nhFbl*#8r?ktmU>FpbOKUvDM?SArd;I#R- zp8@#01@DKCqiffDZhr3m)Wz#;-k#yl;#Ou5*R^?>zl&X&zl%pPuASp`1roTK^*q0xJwW_$}SD%b?EmtA{sUY*#zEw4l585SSZ%Eny$DffdG z|F^%aY=5BI8C6ySS2BL9s6yr-YJ_D^>M<@Yoq|+1&%u9sPsUXXcSeB=LVmy8_|~q* z_9>Q;k=28%!igl-<5DqL!;K5nU>S7N_|I^i(TVZh^f&OEW!EM4JLdhf-`_u-=aigO ziu;=8v5I*{Fn-H_A;FJj-^uo)gY{OQICi! zcm8oxCgw-AKIc3SMKj;CCOmW($E$*Zx$ZWXAIYr$kk9n+ z=wLnJ?sV-pse<*jeZ!8aJ?Z}4znv9MH0917p=KleUtbr+b|Wf8kITr<^Lc-R?fDpm zQC7FmMseNbw1WIZ9^oervHu4RA4FcS?8)ZIfu>z4`PsRFI?mh%27b@^S@9Wm4k$XN zt?xRx1#XAC;eOc8vfOXK)h8X8O`^YPX{p}+Khl5Lv_Lw`X5;@vfA4r!AGW3UK|Qw& zBtDDj9Xxh#;se|Mt{;#(9miq+=`{M9q9_s>ncf^j1m;Nr)LJ9*-2VtZ!ehQAOJ z*AaWy`}u`wse?R})=x>n zI^)!u&uu==uRF&H%!WfeP`lhapJj}r23pPL{}{^~nvrLx=isz~8qq`9O$Vlp%*vuf zB{hDEm9=u=VUc&9zcJ69&tRIblNBWF9M=5#jCUUPd`2Ja)W9_WvD>%9n1`N!j;C!B zjRXSu3pr#0`Iws~3pU5gnlgEuH7l6lPYdSbv`SM}AIiVJPw@JJo#@h*-q%CR;3AF- z-h+J2XW^sm{H%dZ(tMlQb-wNad~P~dc4yDe-FC6>%o|&s?vd1C3(PW*wR#M>Px7<9 zN*yR{C?5uJXrDY$p ztTWlBEx2z4uKxmy=NcgHgy1#67cA4RL%n}&!j@c*W@Yb931C>K8rCVFW#7j|mzBk~ z;I?SC4o&6%G0n^W-THLo9;b!dS~puCO7#L4#T&Ffx3Mkk-0$Lhal7|)@k-pjLl=j$ z&wIyjN9-N{C}JBwQS*28-n;s{2F?!*YRPRMycP{)H|JyijUO~S&h7Wi&Ov+PH75qI z3nPj9!RA?4w%{()tk~0cY2W7Mo-TIfo~+K_`rCOSs>yct2sInw|N3jxmi{7Cj`{mX zKjV5^B8uL}9q()UjtY1nV9$x%cjU^VUF^!DUF^!DUF^z8UF_;&yV%vmcCo9A?c)E_ zb+Pxd6FPq!_P)Jww_dJ{)y1xi)y1xiwWYtyX&JeJ{6_2h1&^t-S;u`@R~Os&XU~7a zW1E*{y4aOvy4aOvT0JRqJ7?@;^8|POVr`uEBesoV+r{codE?3SwEBL2hS~IOaUOF8 zEBkV`wv6YgX}tqwdKAp%C{vG>_3==4Jn1<}y03PCADrAaa6k1CU3)gwNSB`!-&b_) zJiT4u5Ce}kty#knUOXoxQY0m+Rb^B zGIH1~-i<@sfwb|HT;2u^%cKZ%%y=%H^4$PiV%`{9C)oTbe|(y4MDeAsmac8nSLoVr z^v85g19!t>SOqokCTxapz&Eh1uPt0k}_UbM^mDrvGxcD?;R<$X(FgW$jW#7ee znS~t()~G49S)*zfSnFv{Wi9wS7Wz2eH!nU|ww}eh*?#EaS$Kpez8?1jhkfvOimvV7 z1x#NA*TcVG@09fH9_%H7bdL5K7`>0d?mDt~KTLL3e#XQpyoV;R+xU_P2g?hRIltI` z;o=Fzc8+y%Ct^QwQ@gO8#UCpD@l=yiA6~EH+s6E@{)?MWANHSpJn=|ktH0c0pF40V z|MyCzmk$Y+NmtXgb9Ex!iFD6k8`wFi#nv_0;HFnfPDbF%+0Jq&usr+ywqw}EM-m@H z?26b`d5nT~pRec?&Sea9>wF$3R$J$eOv9!QV9%qx@fbdrHx881HD$zXKCCm-j!>Q< zN;=5j65N+<-j-8=#yh;vZp@Utl!G8C(LtYp1pi*7?L z+rOsxKHPqjy=Oto2Jb3WX4$oy-`;n{vpDuicT9A}|978@tHjj6YaV=crv=-FUBo)u z_se^?{^1*%nyw6jFOy@VoppL}AF^|ZeRrh zm$4jgyeee;sF3mPT;mYj!gE;B;r5_14tsI-u_Fzp_e=r$R;NFXr zvz*C;`68xe=T177>FtkA>g(f~R~7TJEjK=x$1pFDl!^WzlpDz4K=Xur-T`50qxg?k z7zKu(8t>Ml9XFD8ee8ZayILE!uKo;Oe&?$?BY17@#dZzDd;6E7n^))POjSo=oc z!HGZ9UVg|)H!rZdfnVyhyg+Rzzi#>b>~B=h31%lCapXz?blkjY{=-WL~5a{B&h3__I0M`1bDG6n|>QgbBR)ojMD|Nr8Ysa6hkFA^07q_<0b}w(ADHit*w|95i z`bIL$*7s!GKCiir-#;XdQ|z|S|JTa9mJJVZ)!WU7LQ86~+y=hqBH07kf_XEerGROLnvB85Wqj>Ab`|z2n-mb#M8V zcbJu5d2-41?Q1DT>>U7BD=(NGSFg6Vx{QI#Gv5G~?Y_f-_`mRzhhu5q`){B52=s_6JR3P{4+0g=tU#X?)hLEZ=ulb6RX4 zu=0_R!jXKIeIeg@H`d3_WiGaLKgbi?XRvD>`*Y*i=dpe+w(r~<+kRnji+-LzDDR0s zJNUcOo9)|?<-6FG|G3zd|G3zd|Fqcp>K&HZS%IPt-!|4WjrHq7fnN{0E`E#Hwwt?t z^Ok)SjtZ82wAeZ}FH7>xWqDRE{v47$9+`j32|Mth%;G2Q})4M(vnLR#O zAl&r++Qf6(HhX`qyYIW0<+$^y-S>H8yYKVHcAw{s?LN&L7lw>q#Q2`~KO{+HvP z@}_3Xxq@N&+4(7%?h)6RKv_qN?KWy&;CtoVw!Sf}=O#D+T)Z0}(5|^%Z1vIY_uU&? z*{q8X(r|ZfS;sIdA9V41xZQhr<4&IVGu)0TH~f>3xFICA_4SUwp12#h>0b_sza#d0 zhFg7l`+RQvXkxn_ad9`|6Nufp#(p2HJk7;-5Zm-FeuUWCO#b^X>^~PG>Ny{8_2MN^ zoR*44xAo<)+|$9aL5g4~cJ3Z0l$2Mm#7a7naqv2)+T{PRNu7 z@^4yt29JYzs%hDP^7x?~V_8?pYESb5wF~w12^M{XJoydwKc- z4ommwIg`?cF%;@@P+KMD7tRk}Bd=HYeY$qv@ey6SW^SZw*KXgd+vm2VcvG0AIvNvvK?>vC$aZz# z_iWtiu~I#f{V146=_b$coAE$@8^K0o`dd81=in++r)qa@%D>;||Ku9@Po59uj|pBc z*h$#7n~V1+?iv#F2()SV-V6_%BQ(98(>i;GyXy%zzaAmO-SvqZZr8pMp6M+f;ECP! ziyPlvzqt4c#t)oxv_4mb#MctrImnHF2XTK-JfGN}1-aqZhs2MC#5Kf$bF!BAg5qF# zR3NKUpp^y$22a@A9#C`e>(4G%V9bzr*YF% zY8n^6MQmk{E`FQXJHF-V@_s(Mmka!cX#Kw;_I`g~hfKeX*t1Qrx4q-OgFzoVn6Zk%lNW0Q&ksc3a!v${X63nu3+5s zGnn4KR~N4#_U?1*i0wQ2JJ*%oZE=@pTg=wFx@Fx-Y|lwtZ25QW`*XR}g9V5xK2C_VxQ>=x6m?+_2y=&J$8n5;NGB%y8R>-EjA4-HnmYaJwFG z!}+Rsxk_GsQ`L4iBIC?qTsx-SxPe3L4@RwKJlp1Oyx{K-rKvpAwRLI?Stlze51$as zuTJMj|kQ`3ykC)c298Ff34SI=Qz9n zwQH25iEVwOAPrjVv+L%igk_9jndLATbl)9#y0Y`vjH97PFiRB4SMqi+jh%1Zw5xDC zH@J8?Zu=vPP+pPdN6zr{;Bj*S-O%GEhkkb4xM88kO$o#8xN*ZnkDJ8|x8ueQ|4+wF zE#umHx^e&PxY^ElcHFq}TpRYLBq$8?X9S-cxp9JZOZ)oc>2Key>u;C7o>xNpMl;;| zc|woL!jR#1OwOYpyOqz5$%XQV)V1T-9Y0m-7ff;#cm-wCcjWFhqZr?PZ+0zbzuj*7 z(Bm}x!r=F{CtdGx>S8yaL}p<3aW1xej&@FVvE?WA#`VO5Ji{A_DIIJY|Fe+Tu3=8` z47c)EyRUTfuOp7~#IF)}_r$Le+wYtk|8-*f{de)x#D{s}=ZL$6#CG58#;;+xH-08$ ze2cxq*AjcT&wOJ0t#k9U`%1qjwtETh^6lQi8?Oq9SBJ!pDQ>ZI$)DU~)K3cDW4L<) z7rT1^7rSeG7rSeG7rSx;&ar>%JUTbCt*;awffoDhA$7afv#bexcZaae?K^exf2!Lx zdh-9ae6xV%O=R6%`DPjGYWH|{Oh14>2n!&A*v?%G@kPL4*K*sjc`cp{>595o0e}Q$k@});zKjvYdX9;n+ z`t7QIONp1kU%mEp>t**Pc3yLFB(dFFyV%Mu?L6aR+wOK=aB&r}T?4y#4e?2y*v?Z! zJn@?vZlBRUi?JN90Pp8sLA+A^?Apx6vvWozxMdy00Q*gMaVKJ{Kj7kF#P(b1;uK=< zy5|ym*S(n7*7bxw$M!xZx>wI06TcZa=%c8kyLXH1+U2N-&Ye2O_>Vl|@D9JtDZ6!6 z>0OV!_x@Eg8ee#8W8H?@$5$<1x^P*|=4bA#eDsonHFrP#&=dE~zwN0Tu6ek8^@7K8 zmQ+{GE4lIFD~oQq_U7CVZvV0V%Pqfr_|C^aTwU??r{8b;ZRP`0MqfB0 zVf^_6hCTSj{m(tQ>D3pXef!;)KihuKSFVoHKkX(3a;^J(c22hA%dqqD(7+oDn)iR4 z{>}GkvI{c4cUs#=+&Fo|veN8&;uyy9?gLLSPOz$V^J$;-PMbU}J2*~WU|QQLY`?I5 z&gR*>X(7q!xoLsL9LxDPnE%2Syfa`(SyK6xgyXO?%*scp(Y>ofm z8EyOg;JJSt%eCK87rSR5-nf%zxO)cThJV5^J5RZ|Atc@u61!(0Zv2-SZsi3ocF#au z?4E(R*gf-bv3n-sV)xA1#qRmBi{0~M7rSTDF3#ilwBJJebN$>i=@$KdniYrypXF9g zY5vUF#qN5}#qN5}#qN60#qRpf#dq)-?KzB#-E*OxkMUI?)1n`E=hE!cE}9zLA5Z5b z*^zZ?en-o1=d|EGZ8Tjwk9y03;^}Aiv~E~l;O=^70nS*4+dZHg9(qq(#BjT(b;JMD zJ#8uD+V8X*_s{NWYZ=e(Y2A2#bWgjDaqJqvjT3tB+PYdMo$$F5jJp-1@llkc-`U$i?3Ckn88pLoS}n_U+^Oj8<-K_pNTYm6KUH zyo+xM8UI#d?`N>*Z{GRMCbs*0H+`*!x9Dl%56*+tGn(J$y4c<4y7haP^|Ry2#qTRl zqs1|mh12XUUuuvWd=wIB(-0_k^W|LJw%PaBlLN)d+}ymPiR~QW;{L?;n;lw)Q_Fn# z>U}TKwQEsx`*X3Iek0R&roW3f5qI>&n~5Vm@rT6T@3vksSB6dRonOc2b=ScEq+B$; zkmvL;6aLrVaT&{;%;$CAsi)4P?^!;VoloquSy_>l2YKt$d1J3X&v-Aui(vciOYkzh z0(D^JR#sN^I;@8`!0!3pf_iuxtUg`bOx__K!aEGJXQ{SMXXD=3>$XpBfcL=G!S=}y zU?XgT&F~>Kz(?>gd;*Q|DSQSt|FtZCeF&e^-&?=Z8+&~V<9z{Nf~~_>uob?BZ{Sp zg_kzJ#&)s0#`eaY_-rnA*Vrz0*Vry@U|hTAcCl?6Z|ttI-Een}?P7P0?P7P0?P7P0 z?P7P0?PB*^?PB-a=3@8T=3@8T=3?(}o9pL(+gfaY`jax$4wp4Q@3`1qW4qX0W4qX0 zW4qX0Q@hw*Q}5uoap&Y;aBo}{68{JqwF{Q34_ zxZ7^~;@)@s?MLjE-3AXf@kz_|PP0G#|NXwi75CqG$6xvt!F}l&wwGNyw7~LNA^wHD z=7?)P4Gc=es$@!RNcVEZ460U0i}kc;cIIKm1WX zyaV{|+;`s&PxIu%^A0O+S=43S2x4x4Kv^9*f&^E*EFxcKsXY>31G( z>)^(@0q+cdR1duPs{d`-T`9}+mfiion_KNa?X#(Aq_d{j;qTnpa{a;n=B`5n<@r|! zpGDa{lzrDdd+xm6uV)yC;~(ZS*}^cpmiec3*PB`_2i{-4GnYyDtme5)T$M_5Ep+<@H*~%mTTo^ z-q@b&9n5~=&R6yu>y7O<`}fCxM=R>_zObjI&rsfv<2&Hm;O9Aob^qh@Q=qMF;HN(L zS~E*XGv%1$Rf{l>Dos>mZkkVm=HupjBe9h!ySN5F3jVCFk9T|B%|WBRNbB9)>4D}dfog<3$LDg}&kmH`#~c?OeawVj|LMHv zN+H>;2eJpctnaa06!r*|jPxLTSP$DdPi~g|y_;`YNw8caDm4E){q1;cmj7Mj+P1R4 z4#XLB?Y@IkIa=mD(oEyjvaeZ6gSeA1UD{y=Z zEzjQO$5#CPp`DgGF|B8MTE@ime0!Nz;7C%~!+(q~hjp{xdj!vaE?&Zk$Mzc+e?=TY{MS}2@F_fNw{t#QIo53b{^`E{pT4WCl&Kk( zTg^_ci*E?t-=D+wuyg4^Rh45BIF^5qQ%jA>$rNY}W|(dHi_rekJe0Ew}o5G97^YbF;=kAY=!rj%Tce*aFfA5^^X(S}-O6;y}BJtp}hG0IT zf4`0Y-hEX0?BIQrUH{to;{We;99nYw=TFO?mJ&><Ci{HXKg~V1r&<+0@x9{1-+i~ymej)ZQuNCKYJD%M57Tfj3WZDdz zY?VgwQMUx!AGvX!W}L%4(^%X6z;ir(=Dj$s?cUiP*LG(R>k1b96L=G={o0)DTgZIv z+P$0Sc_ns5H(;v ziCfQJxSPi*^o(Hmzu%{WZ4mROXXU39^oZ^mqkMg2o#nHzLV-(nU#nY#`?R%VvTJu2 zUmg-)Mr`-iZumOl<2-SLhBsw48=p=JAewb3=VBGh37q4#yiXY4@0s47Cq{bWpEN(W zyzhzaUf;#m?#I@*f4}}6`^Wa{AKP)~u)z%T&T9m*cimHn?RaqWnjA9R>c84^K{vdZ z*zN@iJ^k*apZ)&3ajedw9kVXBXD3$n;9ZaEkZJ6>gH2<{vYXDHOW1t>YTZ9K-SO;0 zR<_|{`;GOkPZIII47Y15H_qwwvt>=mYWmiKmF(@iOBqk2$l&8ZYppYW64ySrw+%dF zbJI`LGCk7=u9yQi27UVu%VFN-Ok?K}H%*bIad9TGt*6~Px_;?eFWw)PokJl|=;{RC zhrsyZbK3^aS#G+!HJyuZBerWM7cU{UZQ$akiS4}O;>U@-+pHDGqMdgGhYQ<+7Y=1- zksxSXnq>e=B^aMJn{}{zIs0?-d5ihjcK!V|X5ebqK2BseyZG(ezpKBnFnA5@>D&De z`ySoZ&Hr%L>#xoK;-+avXqx^>vHfEyNVBp}H@}}4=G}K{HLe>T&3UXd<6FBf*RLo2 zY#m&DKC$M!|p^|qAaf6>Gnt`$?wkjOx``1gYsg}bR+5aA3ksJ>mlb= z_ITRfd#1bPPp9h|-PLZ{y=X%+@&%K}bZsG`*6-ct>4=mXqOkL_S zQCZ;`r$9!SlD2a`WlU%11$$o3DJ_7#gV=4y`5OM;_nm@2+)JkXVc(HW`@yo1&+$63 zU5m^Fw+`*Nhw^?_dsn-Sn+YjdL5Z?Hew>HzZyVGXBDl;U&cTc&490Y}@-!KCS1>k@JV&ep1(+>r%kH zZ2gZ*$l=vN!v=yYI4hW%q&OAca;+c{!OW)9oEM!FL{|*wrL?)yNFMyTAOLc>@nQ zxMp-Ko;lrTzj^j&>vjVEPp|WK-iuqSsVpn__Ql-OHjt0uH$I#FW&|46{rd$>O&i~9 za(3|5iM~5nMk4dxn`PMd?Vdfx@L4zo2RIS;#(hKLlZb!6Uyz+~j5T4-wVxLYrsPm? z)neC_=^44b0v9aoOl-VS_XhJ)*73#IzUIz|*0|iZHBGBYxkn0!;B(Z#4{NYKqkHNy zGI>ak7#CQE2LH|s4N<|wlKcn<68gEB2VZEPKRuB2D{zJIyCH#7@$ZKBNSQ`E4!`FJ zu=NbSb18Ci$|N#AlAeMF%L)NA{S$bTmkl7#SRgxMT52~fQF9!hLYlyg zth}@=()VXf&0yUEpVHDOGErb_OeG^(ioMe5PnHyz#~&=IMZZe7gLayp{VUOJSC7?or{6y=ZH9_ z;WELO!uaE0Jfs3Yr-Aa|iFDH;11ea}6!e0ga4cB;yyKt`oB+o|UpNtB;UqX2`avA@hk-Bv;$aXBfx%$)=T3ps;WQWu z*0yyRSkCw}Aqhsna2N?zFXwDH3(kR2a2}is=Y!P?90M0X3XFyEFb>in6(+(2$bfX1 z1Q)_&uzJbakOlVqAP4dw7p6cyOoOTL8(-%Py3?T$E{02BCfIS22ZMIO;R^a)4p%}k zB-3ve-K*g&-0Jw1;Mc)>VCCWG!Oi$hFcu#V-{To{)8P($F7(5*As75$b*bjlzZC9= z```g6gCd44q`LsFz#pNz7-r$+beF)j_;pZ$FNc+|0&b??YPyy11XRHfunwMuwVtl^ ztAXd?IZxO6y$H4Nf~RZ!UWS*T4qk!R;8j=;ufv=02Gqk_@D98U8{l2I0X~5DVH0eG z4`DNW1P$;Bd<>sLBYX~@!56RvzJf2|8~7H!_H?b^cd!j^g*EUaY=@uWC-?<+z;Ey? zgt5(huq#-Z&Th~O_JG}CPY8#-!O9@_f!44e>r01Wth=a4ICg>2Mkhg+#F5*)t%U=_f-DT*mZQ**xG{xDjT+z@*l&uf|cK_V0W_L(kI|aSOeAYCOidSgO&R{18ZR&JPU8Y zb5H}%Lzj*me{^4jt6&yf1J}Y$a5LDt-U4&rR^(@a&<{?A z%Ne&n-8dKkR}c@RTTJ=*{eU>E{czHjx7td5b@E4qqtPN!?{0~`uxz%Xb7`$Jo> zbvuA=JFs;-knTZnFtmq5;7~XWI)IfA9s#y)N7D5}N3eD4MAxlbXFLLqf-cY%BB2{} z2V1wJ=|({h=n1{R2Vt-a>HrEePKUHfw3?iu4WnI)J>zC z3KL-hWI#Ghf(v0XWI{G%!9|b*d5{ZJARnf|RG1D0a52n)nNSFq!XP;cl1*_rg6eA4=hVxDOtHGFSi)!Xj7*55q(7 z2rPyr@F*;Wa##+_U(*aBa{m+&=gg>T^-_zt$g5AZ$w2;1Rj_z8Z29q=3c3Sqmkufndd3+x81!1A^2 z4tqj4>?JzhL4u=kKBpd-9!4I9G6C4E* z&=tBsH;9Czp*vXJzbNPhR=%DB<6u0bLK;kfiI5H%a3NS(dnQbVEXal&xCn9~5AtCO zOoeGs0Mo&8#aV8(LYN7cz@<`JW zCqsXTg8?uQ20=Uwh9PhYB*3X~8k`Q63vVc#0mC2(&V=DG0+L}QoCVg%BMf$dU7;21 z2D`%^5Dt67Ua&W`hJ9dP*bmyk{?HZo90UhLdpHCRg~Ol&91cgok>H1p&xD{@L+hH!;0e8Y(Fc0pAd*EIuh52wF+z(~&06Yi_U?D7m zhu~pY43EI0ums9sDJ+BKPys7oC9Hx&g1J}ZJPy*M(4R9mOhMVAKxCQ3Gt#BLM4s+oS zxD)Pzd2lz}1NTBH%!m8nekg+n;6Ydb3t2;cNH?zJ+b@9efWzz;^f%eu7`%SNIKPa-T7t zdy{ABhFO6l>v2Q0T2g+U?2>JcsK=yz^RY`r^9J56cS+=oB?M-5{!W1FcOmCY&Z+ffl+WC zoD1i}Xcz+*KnmOiW7Qo`cO0ZaDolh4kOAp12`+@mkO|q41s6dMfqa+-Q(-z3 zz{M~FWup}>~q;? z{D9qTKHXBdAMS$(pbQqkgRlq|!o%unJbfYN&+A;W2mu zs$dN~2~R;aJOfX|I#>(O!L#r@)WD1I0=xvZ@Cv*PuRzf2k<^@f{pMYY=)1Z0X~6`;ZtaY&*3xp0=B?c@Fjc=Tj5*y2EK!B@B@4gKf-qS z8GeFaU4u>|d zKeUAdpdB0tk~k5P!3BW2QGr;U}a8LjojLm|wBZ^6oSo`=)f?I*!H_z2FRtfx2Rz(tS?d5{lN zU@A<50+fvp82i}DZ@E*JmAHYV~1e@VQXn>F4WB3Fb;Zs-%tDq8A!(;F`RKXMQ zB&>mIcnY3|XJ9R?gJ z914d)2RIy#fFr>V9ibC+h6p$cx}^-uyg z!VPc}%!XUwX1EpR!0m7w+yQgpF1Qo!hIw!=+ynEW6z+%n-~lLu1@Is&f`#xfJOq!x zVpsx?!cr)Q<**D^Kn1LVm9QEr;c<8jo`5P?15d(JPz}$()36TK!gKH}JP$SSBD?@E zK`p!jFT<-)2d~3x@CK}hx8O~98|vX*cn98t4e$ZH51U{kd!fJR79)~J;0-l65 zPz_JP)9?(eg>~>8yaWTdw~B*7Fc1bqJe&eU;8aL}S=^i1eVBFao@^*2!Z0`k&V(cw z0mES=B*WQo7Mug4;5;}N&WF)31}=aU7z^WJ9Hc=iOoR!L0qHOaE`-UD370_;TmhHE zl~4>Av80bQXB zbc0AZ8oEOdh=N|w6OM)6a2)i36X19_5n|vZ=nMTI7W%` zLp^*C-@$SyrEFzB+z0nV89V?F!U9+bi{K%67#71L@F*;Sa##w>U^!I43RnrNpb}QY zWAHds!4vQ#tbuBH3Z8~%U@feJXW==hf#=}`coAyhC3qQLfjW2MH@!+0(j#&f|i%Id;+CK$#u z!7$3}!YHc?<2hg$&jG`D4j9IBz%ZTzhVdLQjOT!1l-Y&x3^0smfMGlX4C5JK7|#I1 zxM&OWg~2YcE3|^$V0YL9!eLL?3-*TAun+7D`#~GnAKJnJ&<+lSgWzCj4~M{^a2Rxe z!{G=x68z8+IzeZMfTN%bbcK3&8{UC;VFSDe@52YM5jMeQ_z)W4Bls9TfkyZgK7-F; z3w!}z!dI{rzJ_n$Ti6EQ!T0b3Y=~k#!Q)T`Pr#F~ z2CCsHcp9F8wXhDJh3B9Ko`)CUMW}_B;AMCP>flv)4PJ-acMJ2)g*)I*xC`dN-Ea@w z3#Bk0?uRmX03L(|un-o(L+~&xhDYF0SOVp+6qZ8;tbmoU3MyeWJPuWm0~bLq~>OJO?%KJiGueLM^-mFT*QP2d~0w@H(uA zH{eZp3+mx*cn98v4e%bk4ra=KrhZ%4&6v9ln1TKX*7ytud5X8e^7y_q20-Oq`!Re3)L*Wb<21#%x z42Kbr3?tzzI2%U6IdCqV2czM9xB$jLCo27Qh6p$cx<)WCIP3{~!QRjs z_JMt2KWGE{Lt8ii+QETv5F8Bc;Se|!4ucMGI2-{-f*(4<0E$uC+!t*7G7xVkAB4A; z$KxI3gK@un2p%Cn1&@?l{qZQd)gzCVTYd6Aax3eL!MW7+B|@C~55?oe7V(MFOXY3_Ck3I zUL+rf7t6=vv*f9Gi98LTEuVnTkx#_u%G2?A@(jFGej#2axAM`2xP7inC|Cc(ze>UN4`DZ;)HNf{pS5yg@!4ZIB z>yMDXh)2q6@hJIAc(mN={r8bu{r?zw9Ud#U_5g8mYZnkNe;rSdTRVY7`5SnW+}aH! z%dP#uD7m#G7%jK<1Y_mat{_#u0Z*4(JA+L5`*@E013X{85igK$!VBe_@gn($c(J?z zpCz|4`4Zf=`NuFv{XfCy${X={@=x(n`Db{U{BwMvd<(u<{smqx{}Qi|e}z}dx8hau zukmX6H~3olw|I?w8(u5_4zH7ckFS?+$Lr-k;v3{Y;Tz@FmZU+x18*d=f_l2>a%fs*;@?CIWS#Uq!6>lZyvf39e=Tg$wTE08pM!pB$P9Bc8m+y&pkne^2 z<$L21axQ~>k@9`;DEYp4w0u9jkGu^YBi|p7mAA#?$@+0sZ`H^_O+>aN?JK}}%PI!^LGhQr@z-P&i z!b{{`@Y(XN_#Am8K3CoipC|8*m&%XE%j8k`LU|8-vAicrQ`6+m~JOOVlKMijqKOJu;PsH2HhvFUNXW)MMFg!w@gh$HH z#G~ZH@o4!7ypKE?kCBhWW94Vzaq_eAc=;$iL4FRNC_fiZlAnhs%SYp*-t8^1Ja-@_X>n@_X^I@=`oiJ|9n)--l<) z@5giGWq7{)0lYx|AYLe6fEURZ;>Ges_$>KiyhQ#8K3o1MK1aR;pDQoN=gF7irSfHX znS43EP+oyAmao9e5S-78c(}Y4ZzF#RZ;#ukFY{jq`75|zUWZ4>U&SNkui;Vh z*YRlidc2SP4LnBvCLSw)3y+i6S)~x67?<xo86mf}n~`#ByBQ_7ww%#&Ys=Y3 zZf!ebGAQa%*E+B)2xF#d2$NI!kVCP)p?226eXF z+N92rN8xkj)<$)n+}fy?%B{_6ncUi}E|gmv*2Qvb!&)x4HmwzMt9Mf=x3;ZS@>slD z-Va|Zw>mmCa;tMwE04qLKe6^TV12}@)39k zxwT>U%dHK2gxuP)N6M`odzAbHb|=2-Q&w#@PBZ*7_r8|Xs0)tN2QIMyC|mih7cCfbUi`BmZFPB^UxCXyq(t&VaZjq?H?tNzx0K2BbX$IGqVe}epFJW+0K(39lWzCIbZ z?O^S~N8@w??cUSX-`dLO$lt;Xa9jU+yijg!+Kc4x;KlNH@mcZ>c!~Tye74-$yw8z; zfX|h0#OKL3;iYnG6JI8`Hu4MQ)<%A@+}g~S%dO3Ph1}ZESIVsoeUetGx zjeU*W+Su31t<8O%+}hl)ms=bBdb#Bw*nr!%{TgqOTU+}r8s}SltK9MhY{TgU@*MaU z2dDjk9^trcb8D~PT5j$7+sLimemnWkczgLTcnA5fxL^Jo9wGO&;CQWvb;4uO1=+1TD~tnR=yveDsO|Q z%lF4K<<`b82e<8i0A8T}*5?MD?bdMC+~ol z$`8lOEZVjkl5?gNMtlePwIh=6@{S zPW`RDWqb8M4)?47@py#%1Uyn6gGb3v#G~bX@jmjC@ECb49xLyM$H}dIXFP7}(;rV% z|2RBJJ^)YFI0Ny~xNZMIc)G@k$1~-F@f`UOJYRkaULa4v3+1QcMRIFLT8!KJoQ{{M zeD_*Qu;zFp&_;XC9L zaNncBeR3k+N}i5~%QNuS@(b}c@=16*c_!XoJ{j*I&%*ukY&=4qgGb6Q!lUH5c(gnZ z?<3F0W8_otSou^uPCgBfmlxm(^67Y@d#OYpJsOYu~B5uPr; z49}Ebi|5F%!}H}Oc!B(Syik4vUL?N}FP6{7XUT8EOXN4>v*owobL4aIx$;}_dGg!v zQu*z8nS3t3P<{u#Sbis7F24(}kk7*_<#*#%@_X=V`MvmBc`05apO4qd@5Afl_v7p3 zWq7^(0epk}L42cp0p1{Ah&Rd?;alVn;alYo{Q{=WooB`?Rr ztzli6{ zYw-g4OL(FDWxPoK3SKO)!)M7~#Y^O`;j`th<8$Qe@wxIh@Okn#@lyF)c$vH&UnqYY zUo3wIFPFcISI9TumGbxSD*5|(wfqBot$ZV1Bj1GA$~WV6@(=O#@&>$K{t>=G{xQB$ z{t4b7Z^RqrpW<8OpW$2OpX1x)Tk!4jFYq1mFL7UaaR2`bZzbP~hs(dlTg$(}+sMDg z+sU`#?d9L$9pvBRe)$i0gnT<5DgP0VlK+H9%YVlE$aml|@?Y>+`LB4K{5L#a?%R$1 zUmk`h%6Gw&cjL`EK}V`R@2w`5t(x-176J%Pn6|rrh%NuUmv{-KWg39HVKd3@(`GYFumQSckZux|&<(6M)t=x~-$UEY-@=kc2yfeOD9)Z`( zkHR;|yWkt;UGWCFA(J>-{L4x$LTy=R zQmWi?A*IVLCsL-|awFx)Ek{zm+;Sxq$Sr45q1cPsgj|8F;n)LVT@! z5?&+E#B1e~@j7`HzFwY<*UK$O)&}`S_(pjy-XPDz8|C@<7Wou>t9&ZHO>Vihw#zNY z)(*Ml+VU+6?*Eo^tCiexZ-vV(2Ulyk<>G21x13z<Gyia%+1VE4MbdadK;m8!xvuxe0P>o0}-NHo8f2Ypa_qw>G<@ zp#ZIf%|)<(HbZf%v<%PkjFz1(s_ZID}TsEu;V z5!E2KTv3g3%NeyrZn>kj$}NY~Ho4`J+Ag=8Qaj|9TgtaQxc^&@saA5!H5D$moKvmk zmV2s=+;UL0lW)Y^%QxX2;t`d`ZnfOnS;&yFqSkc{j?fO>cwT+V(cet&Q&%xwZA(Dz`Sj+vL{v zce~u$0Pm1nTVP*BaR0Y9!L8)hHaJ{vZG>CPt*vkyxwRQ?C%3l4?d8^nxP#o<68q)W zrZ_@wZHpu2*2XwWZf%XD<<{o7kKEcG$H=V>a;)6iBFD+CO>(^4+9oH+t&MV`+}bK9 z$*s+DvfSD(kCIy(=FxI%%RE+YZJJZ%*0woaZf%@1<<{0YM{aGN^X1m|xj=4hpbO>J z7P?4oZK8|i);4;U+}cQ&$gQpPY`L|Wo+G!m({tt4hI*dd+ESOwtxa{A+}c(zlv^9? z#d2$FT`spa*A;SWdtE8FHrQ2iYl~eiw>H^p<<>U4Ms97iYvo(w}<-g!NFKC4vv#sZjA)F<=ITa?U|J2+f0^Q-px^R%fC5VZh1Jz z$}Jyfs@(E&rpqlqXQtfpbmqt{UuVAD@^%);Eq`aB-12x9$t|B}vE1@{&XQYx&l0)i z`J64ce4lgVmiKe6-12|UlUp9pQn}>=Et6Yb(1mi#54u=xc|yzOmM^qIZh1p1<(5CR zN^W^XtL2tYbgkU-iq^<2zi6%8@{HEWE#K&Rx#b0WVNE_sqm$XrC z`AN6PEl=rIx#cU}Cbzt$+vS$ObcfvXnEF-*_Xo>o+DdNuG{WVUW2m*<@=LUl`^ZPv zP9BE0m+yjiknf87<*o1t`EGcme0Mxbz6TyH56An+_rzo5d*QM2z417CYdl`Q51t_3 z7f+P$hbPI~;K}m+@lo=&_-Oe7_*i*6JXL-mo-RKK&y*jG=g8aR`SL^X0{NkMq5Lqs zNZtW2mLHDKk{^MW$dANl%l-Hqc}IM%yc0f8-We~IN8n}hqwt0DF8E@3SG-&viC4(G z;g$04c$NHUyjmWGua)<}YveugT6r(LP9BY~mmh=I%X{M+o-98T zA0;1-kCu%l9@^kS*`FVJed^BDxKOdhZzW^_h zkHKfl$KrEvd(N1G&y$bC%QVh-e4#uQUo20<%jFaB3i(95Ql5@i$usb3`Gxpe`6RqX zo{87WC*yVUEPTB@8?Tq=;2Y!@;Tz?-c!N9-Z zDues^47`>6Vmw@4h_{x{#M{U(!Q06%#oNn^@DB3JaKHR=JVJg29w{%zqvTiO(ekVC zKJu&a82KzbR(=g0C%+btmtTh`$V>1<`So~`{02N(ej`3gJ{un`zX=~JzZp-J--4&h z=ir(0Tk#zEU3flj`{6x!q57BNMe_N0vHU)Kmi&IaL|%r^mOp^ckw1vfl`p{O$rs|K z@+P(6+XPOe};@TW!tSmevR%gb+dqA%qY@XoOhX+7?0x zp%Fp|@eSd5f7XXPj{AO&=Qy74AMfLOl~kK+KXsmGu)P9@*sVC!UWvo(RXE&UjU((f z9BHq?QTAFKZLh;Ib~}!>U&V3uYdGG19VgfwIMIFsC)sb}Wcw|gVt3+H`)!w?D*%_D8tL{umeAJ-EbPk4x=OaGCunF1LGeh5Z?> zv_HpH_7}L??!z_qm$=sc3fI|R<9fRvH`w3cM*CabWPgX7?E&0ke~(-3A8?!fBW||` zafkgA?zDf#UG{%)w>^Y=>|b!N{VVRXf5ZLuFdndf$Ak7Cc*y<}58Ht~c>X^(^86oz zgY1oPu)Q%3v4e1^y$KGpH^t%hW;ntQ#*y~sILh7vN84NC7&`>V+FRi`dutqTZ-W!; zP@HIQi<9i_aI(EUPO-yqs=WhFv%_(^y)(|RcfpzVt~lF{z`6ErIM0s6`Sw^`Xph51 z_MW)dj>0AOUbxgAkIU@6ak(9hE9`x6rM)k%viHN)b_}kuC*WFpBCfM1;d(n3H`x2* zMtd@DvJb$`b{uZ855%qZLAcF67`NN;xWhgKciM;IF8eUtZ71L!`*7TAYd3hGeI)L; z6Y+pO1rOR&@sK?Y58FvN@chX0e>x7blX0+p6b`YE#-a8xILuDL;r6jO!ag2H+Ou(# zeIkywPsTC!DLB?X4aeE1<9Pc_oM30-L^}&7*>iBRJr}3g**MkC!D;q9oNmv@8Fntt zv=`uP`z)MmFT{Cv9?rKH;X->cF0z;4Vmlv~*k|KXy8xHjOL4hfh%4-6xYE|1@GARU zTy1M7c#W;y;I+1Phu7KKAzp85cX)$+A#SuwaFcxrZniJQE%s%&)h@+t_T{+Uz5;jH zSK>~)40qXA;cokC++$yZd+l=EXJ3o^?d$M>eLWtuEAWtg10J?-#DV6K=l@MO$gae} z_RToNz6FQcx8g9n3WwXb;RyS79BJQyqwH!NZQqGwZ0)L#weQApb`6fV@4*T7y*San z4=35RIN81*r`QkRRQo}kX4m0#`yrfRKa4Z&M{u@Xk8|xuai0Ac&bJ@Og?0ljvY)`k z_EWgTZo;MZa$IIVhs*8fafRKCEA1C?71rPPuE4c^eH*T`*Wh}4EpD*a;YPb1H`yJy z*?t4J*j>2Qeh;_V@8fp+1KeTv;7)rz?y^6_-F6@DvA@K<_E)&i{u=k&{dmCs5f9o! zc*y<*58J=uzzZYK^WSigJ&c3x@ndFCILdE73rE|TIL6MxvGyDs zXV1m)b~aA1b8wd{dG^^j z-!8y~_EKDA7vf@j87{HU!KL=OxXdoX<@R~F!ag5Y+85v|yBJs77vdWGB3x@xC zUV8=Zvs-b$y%G=DtMH(`8V}iRc-UTp122v|x7XqzdmRq8+i{5fDh{<@!(sO8INa{Q z5%wE6(tZ<1*>B-!yA#LQZ{t||9UN!Bi{tGsoM69)6YckLlKlZrw!3kP{UJ`ZKf-DD z$2i^Y!5Q{?oN0f8v+YlDuHB3C?9Xt%{W&hQzraOyA1=1P#3gnhhUdRM2AA0z;c|Op zTww>{N_!JrWp9eB?agqF9gJ)3&2gQ*1+KTZ#0_=`ZnU?;P4?Ef+1>`X*t%QMYU_SQ zo4p-wx3|X~w(eSV+B@Jbdq>=D>)u6=t-BY!w(ei_*}8+#Z|fe$fUUb2gSPHt4B5Jq zF>LEzM&PB9=YJ#)vd7|JdmIk2_r#%g6b`fZ!r}IK9AWQ`BkgD$W$%Nd?R{~Ky&sOX zV{n{30ms`Dae_SwC)%+%$=)9)+mmsMeE?3i<8YdNAWpXr!Ws6#IMa^D+4dng*FF^I z*@xkLI{_EkhvOpq2wZF*iA(H6Txw6jW%g8DZcoD%b`q|%r{gMn2ClYe;u<>{*V;$n zI{Ro`Zy$pj>=fK+AB&spS-9Cg4!78;xYa%$x7jD)c6&DNu+wm-eIo9%Pr}{y$+*W( z$G!F`xX(Tn_uHr80XqW^+Na|o`wTp6pNRu4BhUX#9AszVV0#V@vFGAYI~#}DIXK*& zha>FyIMU9=QT75HZJ&i>?1ebi&cku`A{=io#tHTkoM`9cB)b47+e>kZy$q+?=ioH^ zBAjktj5F*KoM~Tzv+YZ9u6-HKvrBQleK{_)ufRq2mAKe0!zK1rxYWKHm)Y0ga=RQ? z*w^Ap`#M}@UyrNp3S48~fNSj=ah-h=uD2_3gMBk@v~R&p_N}|s$J@{1 z1iJ|*+RJg0{TxoVpT{Y7GfuT%z-ji2INg2;XV@(`(|#Fe+ppkUdj-z3TXDX<5*OO5 zaFM+l7u#*P#9o6-?X|efUWd!=c3fen?PRt^3fiw(dm7*}4}UZ|iP!g01_}iMH-YC)v6uoowr_bc(I} z(y6xYOsCnpH=Sn?Skt^3sZw(e9H+PYU=Wb1Bqv90^n zCARKZm)g2#U1sa9b-Atk))ltyTvyty}o%Jry_D z({Q7mgq!T?xY^dNtrlCiw_0u8-fFXTi>uw%4XzHXzbDaMt}a_QxqAFIy3y5Z>qb|f zt(#r_wr+L}*t+30XzPa8kgc0u!?tdE1y+na&voM~$kvUoU|To8LTugq3bl0uEX>vo zuy9*9!6Izk1dFtFBP`0+jj(82H^X9V-3*Jhbwe!9o`d7-6+epb)ziT*3Gg!`%;{5Uxo|qQe0$Tj*D&G zG%K-n>TTUj zYp``gtxX-nie6#sl^~c+l1jw;@|M-G*)5bPKeOJpXm$Ey&i5w_sa0-$HENd<(U8 z11`+g4Y+VyH{l}egK(sMFpje0akPC1jxNyCt($hmwr<*$ z*t&67YU{>bnXQ|5<+g6#RoJ?LS83}8UX`tzc-8hvxW+yi*V^g0&OQa#+o$3N`!w8W zXW%AVH}#tBGjNN2CT_Jeahsim+wD2H!=8&f?QGm-=iqL89`3Q{<6b)#_t^_@zpa~n z1GaAX4cfZlH)QLk->|Kleu0%E&wt(c3$o9{!S?w$#J&KB+Qm4`z7U7o7vTu|VjO9g z;3)eN9Bp5UW9-XttX+!Z?8|YyeFaXiuf&PAZVM*ax;2<=UyD<0-5gA{b%QX?)(ygR zTQ>>6Bd--9dc zdvT?GAFi@%akYIvuCX7$wf2L!&aT7t_CvVAei%2}kKiV|9yi;M;uiZc+-f)AHv0+O zZa;}TY~4TXv>S1kt(%P9_A|K0eirxIO}Niqj{EKB@PPe19<-bBko^K4wqL}7RU^;; zmvE5Xf`jdsaftm24z*X{FuN6p+beN|y$VO#t8tXwhNJB@IL2O!V{P4zjI(u1GTwd% zC)n@eM7s+o+3(?GTel`t?4NO}t^1d0c0NwG&&C;c0nW6S;%vJR=i19~o_!9^x6j3e zb`dVJ&%?#``MAWs0GHauxXiu~m)jTN3j1PQX_w$C`x0DjUy5t&%W$n-itFslalL&7 zZm_S!jdmGsvaiC;_SLw>z6Q72<+#nh7Ps5i;ST$H+-XCl0ai!lCxvILxlW;r2Z^!oC+r z+V|loyB0^=_v0A*0UT>Th~w-!9B)5_6YPg^qWuU?vg>iO{U}bcAH%8k<2cQ3!0GlA zIKzGtXWCEUY`YQX+E3#=`x%^XKZ^_PCR}7M$Hn$@xWs-Qm)gy^%zgov+b`k@`z2gy zkNuP9zda6D+k4^~I||p@d*M2JJg&F*#tn8fZnXEoP4>RH+1?Mg*fF@(o`BoziMZXK zggfk5+-d7RYL`73ciRWx9y<>A+6Ur3`ykwJAB+cV-Blg5bzgPJJ`@kzQ*fYdz-`6t-G=nw(iST+PX7aW$WH-wXM6eHMZ{0*4ny5 zTW9MYZN06#v<B_=Q`=z-}9t-H1zw(i?@+PZVw zW$WH;x2?OkJ+|)O_S(9G+h>o({kHDn4%oVnJ80`p?vSl}xx=>Z<_6Y`JpXk+H^`30 z!S+5l#NHQ&+WX-!I|hf_6L5q*5l7mSaFiX3qwW21j6E60+6Uk`I}XR&2jT?#Ae?9) zjFaqmoNOP0Q|v==s(lzvvlDQ-eK^jrkHDGskvQ8<#JTnqoM%tP`SvtiXeZ$!dpa(* zXW$ZhCN8y;ahZJ-F1L@y74|W>(oVru_OZCyo`q}d<8ZC5yTo<2?i1JBx>MX>Z@5=% z>uzzAt^38zw(c0W*t%!jYU{3Xo2~oC?Y8b5ci6gj+-d9XahI+8$KAH>Aotk1humxH zE^?p!GVZr^Cwaiuz2re#caw)~-A^92bw@d{cI5f5d&)t!?kWe{y008!>&|kht$WL1 zw(c&6+q%CTVe1Zaq^*0*QMT?fN87s39AoQFbF8g<&2e@YjjrkWty|bVwr*ng+PaP1XX{3GzpY!@ z1Ga8v58Aq&J!I>K_OPv6+JSW=&wt(24zhJyJJ{BZ?GRhHwnJ^*+zzvKdpq3L4ekhA zx40v1-QW-qsE81Y5Vf6K&n}PO^2|JK5Ha?-X0N zzEf@8LQk`G6FuG5ZS)LVH_|h0-Ad24bu&HJ*6s8>TQ}76ZQW8Yv~^Rx$i4>`+q$t{ zV(Zp=sjZvqWwvgwm)p9*USaDNd!?{YgIvsc@?(OzTgR(q|jo9%VBZnxLl8*aGU z4ZOb5egZeyy6xUn41ct=sV3wr-jC*t%)n zYwNaopRF6`{kCqM57@eSK4|Oq`H-y}=)<;dp$FPWp8vXu9%Sn_da$h<=^?gmrH9(O znI2~Ac6zw28|o3ZZmCDwx~U#z>$ZBdtsCnxwr;J*+Pb+OXY2NQysaDT3AS#rC)&En zo@DDbd$O$??J2fywWr#;*`8+Wc6++58}1plZn$ZEYtsC!owr;)W+q(H) zXzTWSk*yo>#kOw2m)N=qUux?%e3`8q@#VH|#aGz68DDAZc6^ns8}ik*Zpqi!x+!04 z>$ZHI-Gb}wmvMvr3U0Jl;3m5jH`^<5i@gfB+N*J!-G+OOk2y94*zZ{Pv@O+0A7g@^1;JZ!&>1Fw!e|KGtu_PaRP?!qDVdpOj7ABWi= z;BdPeN7x_YNc$rkWq*vL?H(Lsug9_WCpgaj6vx}WIKlo5C)%ImB>M}TZ1>?5`%9c^ ze}&WRuW`EFk2CCVaHjn&&bGh9x%L3gv%kmr_7Awwt_kP)Z{LH9?R#;FeIG8hYjK%< zKQ6Z)z!mm`xYDk}RrW);+I|?<*pJ{^yB^oskK%g!G2CE3jvMU;++;t2o9!oYi~SUC zwHtAp{WNa3pTQmWv$)f4!d>=q+-*OHd+g_NuicFM>=$sq{URQ)U&4cS3m&px#>4h2 zIPluY^M3^nvRiSmy%LAmt8l2j8i(0!INV-?BkZ*}(q4z7>~BnPO#s^iS}DK$?n9-_S-nceg~)8@8UGO3#Z%f;SBqIoN0f6v+Zu2Yk!FI?2mB1 z{V^`I6BqORx2ND@dnzumr{PjN376T^ak)JMSJ*RgrJanc?4xkCeKfAIkHNKe3a+z{ z#r5_q++ZJv8|_rwWFL>4?Gtc|JsY>$X}HZk5x3hX;ST#`+-axdF8dVRZJ&yJ?9*_s zoq_x8({aCj1|G1_#DjJw9&&5G@HV(FPaELt*huZUTn4OEm?FBf( zJ_|?M3vra4hokL9IL2O#W9=n4&d$g2_SrbWF2ITQQk-NL;$(XnPO;CysrI=z%`U>} z_IWtNJ|Ab=7vOBW80Xp-;yn8zoNr%@3+({ML5u7$xY*tZm)INQQacEj*_+^UdsAFt zZ-y)FU|eNyj;rl0aE-ksuC+sOoxK&Vx3|U(_BOcD4#iFOwz%2e4!79b<5oKix7j=3 zc6&$MVef=H?Qq;>?~J?cU2u=REAF);aG$*!?zeZx1NI(x(2m4I_E~%O zILMB|!S-G_#2$}B?Y(iB9gV~7eQ<=mFOIbL!%=n&j=`{M+A zGETG)z)5x-PPPxkDfU4))jk-f+3`5tJ_KjjhvH28Fq~~C;9UD~oM#__^X(&Xp`D0} z>?yd|o{CHCX}I*Sx0yZdsG}n1W-ZN$oVO$|d%@!Qk&AQA$tj4Om$e{oDfgZ3*)A}b z|8=AN)O+#x*ULw28VDT3%hU3*mM)!oUSZDC6S5Z1&j}pP5HJ6wH#7x*Qg-8mdCvxtR?3}+o#&25&0^9NL{q=G` zFYnCD(--9zo|m$Ke>p2Jo{tg4>(o@d;q$?xUq6l4rz}~raP;evc-;v(`8kCP3KuL{ z{Li=7y~t@<`Gw00a{lptX6W@x7SGKp{O8-xeXHhkOk&Nh4sCoW!~Z_3h~f4yz8 z-pAkHXa9UZNAb^Q7iJX{PG6k8;W1?fN|~|2(@xm%k{(W8Qjk4m>D&bi{>H4F`B{ZI zdeI+u6#wU+ZFoO_|BJlqzrEp~jQUskXQN))@K2Mo^5*^h_WbjIy!`iDjQY3yHh#^5 z#o0MU|N8H8G~eFES&MRx;W60%4O8&aWpn=V{eCR3TeM*DqAcEl{u}=FwzKg3f}EV} z^8){P-W|v5r}2!Q!4rDAo@%^rp1uKI9oWp?+}7hZ#8WGDhlUa?Lp&d7mB14=q&2Ed%Hj%ZC0~g zU;@pg`Lvv-@XybuGl&MRtxUgUWKOzg4@PqQ)f~@?=oT7YwE+|;CC^C6L!Hfd_YsEy)Us8Bz zB=5WAwCw}?@Hi=#cQmPB+2X}H1(PPu%_^9`WKu!S`~^!33(lLgv|#R}4gc{c&Mn|M zx^&`#B@+&sxBtP}lPAxalePbWv9bHl(_7~hO;~!~;=-(=39%F7Cmyij-^*Q4FsZO0 zYw^-N{>_O6{B#s(U#eaX><`*nkmjA!Mi$KWf+Xwa? z^|{3TAMYb8uP`!yK|Vj*|L^}zQ+Yppnf~A3&qwEv z+vw%JN4;Fn%M(YveBZxbe)eB)-^9yW+xpl0YyQ_ie}R`ZHuBd$e~p(TN4>0j>7zfM z?yZl0c?-VyfAq_n{_ADk3LpK?b$5L9%aOc1`ukcpxJUnU-SZy(vTkCJexB%__2`#% zZ+rC1y1702W!*d0&l7)rd$0Z1%h&zu<)#06x$s{v>u&St_t(VBqrbmb@bc*I-#7mC z@&|tV|F6HE^DBK(e$L!Neq!11)5($oewo)VqZ@uIiTuY8+4?iL52TIywtmUS(vOAz z(#QIrAJV+f@XYN4$B+70{r}yM^*=xC`52}D`dHuncR$vKpBe`E7%8K^JwN<+KZbtl zSd>+;Fh{@Uq-Fi{`|hXz{>Pfb&-`<9{UKZUc)>OJ{&5@jU;J2llK~i&`e4ueg7X#$B;grel9qc^c*{mQc2%$C(vxt$J5WX`nH`!CzF1RokFLQZoBL5 zcn@ArpU|h&OP`T;3w_Sx7t}{z(pU5~_0u=>EqzA=^gaDRKhhxmL_gCI{X)OeZ!}E5 z(;uXLvn@QnOs~)iYNeH=kH3n?)zn67Xf3Uyc6yawqt~f}-k>+>E$XDV=^g5#_vn54 zfV$~J`iP3gjQn0xzv0=KHX{DFX@D<52y8~1(&iLQTatb+xfSuhBm&#e*0e2!()P3+ z?Lc9q-!JY+I}?9}8`zb0q1`Bg_MqKqEJf0uG>-K9!zkLD#?w9&P5aTlG=XAh5>2E7 zXfhp0`hDTSbPyd%hfo3?Mn}-$lt}u0-&C4HNi>aS&~!?snRE;tO~+CS>Gy{Ez2EVa zO0($%I+4=oWIBmXp>#TpPNmZ+gU+NgD2p;_F3q7F%BJ}=j}}laEu^z(5#`YmT1;nC zJ}spJT1JI*E}cVsd1c^y9?zpPFLe=s1ZL!&(PC!Bd=S|V-vkV&Ga8yNvo)J)T3V4Mr&yGs7JkS z9ktWiQIC4vYxF90(ChRjy+NJy7QI7nQy0BU@6&tKO&`#8^f7%z>#2u6rBCQH>ZLE} zbNZ6{=xh3lzM+2lj=rTI=tuf~)T3Va6AjYM^b-9-L-ZT{O25-E{Yih&7{1Q}v@vZ& zn@|vKM*8!@<`hg@lKwog6@}0?v^8x@p|m}1M>~-I9I+GaNcuBIIPFTi&~6k#d(iH5 z7oWqPJdUHiD2nvwit)4$Mbmz?FHIo*8DtVor2Q$D^yiAnq}?b9JRU~3^M2>?vi6N= z&&X6>H-$=g{Z%~b&l)pn1|3DobPOF$$5IL%N3%$~PZp8(o?ODee}&!$T}{_h1!ZIm{VosixRQVN5RaN~dW^>;KK2tl zK1uqs)Uz`GOtVn8@$1!c(oVs%dCaG!R6ys_IrKaIL4VSZR8No6WAr$+)2s9vJwZ=W z2R%iN^fdiM&(O2fL~qa_>F*Bz`uNY`0eYUE=INwgOJATD=_P8Rcj#sMo?f99)JiL9 z6}?TXsg2gq__6%><8d8bL1lCmT}?O8jik@@CaR>HNuTR2bSqWS=+9N(U;4hfokxAH zcaT0;{n~#g-9>j(4e4{ehxEDLNBUg#sL#8W?xzPxpYwxMM-P!c=ZATGgv#kUx}M%8 zeZKns)#s(}M|~gaedyb+kE!pY*Xcd#q7UeO`jEQmWBQ2JQxAPgpU`L2OJC6E^d%W)2efsb53tdcqeO~%L)A!}mG(`WQALuvwl`f!Sx{y+X_%)DD zpxKm0C(=oDGNscgbSj-j8FV_GL1$7d?N5_Qx04RwF^+UQ=|CP2qJt@(4xvNoFiN1q z=?Kzor6YMvq$#BPN>h2%Z6)1Qnue2TI?bS&luSp_(WF~T$MBd!$I>i1jzVc$+K%+O zZO>yE>2uqG#~o=W3a6cE7uuB~XgAuO^ttW9V3X`3ZlDUfiEgBusgiD`Tj(~bqC4nzx|6EuZn}%^p&Gi6?xp*wmL8-B=pm}3N9bXC zl9G_^d(t@Ci=t?68c(|QtlQ7J?W|kRy5$^0y4|c>&RH~v=2AB4p6@);{a)Se z)xBQb>D7H+-R0FiUfto<{axMN)xBNa+0}hr-PP4SUER^u{aoG6)xBKZ$<=*a{eMT@ z!_^&J-M=lNOXyO%j7mxOY_FjGX)+x^adaRZL(chX>=l;MEVPL?J&~rBJC{Ft|ILy z(rzN{B+@P-?I6Diqnla-GdH~%{ptwS+mWWY1S;WW|%d*teIuaDr-hrv&ouC)-1AS zkTrX(nPbfwYsOf!#hNMBEU{*YH9M@CVa*C_Mp(1KnhDk{ux5ZY`>UB>&H8G_SF^pE z>D4T+W_UHbtC?NR>S{(;v$>kd)hw=Na5a0YnOn`;YQ|QxwVJ8bEUji}H9M=BSL5&&AMvFRkN*{Y1MtlUr6^Hb;nWn8+Er)_ak*TQuiWtCsOwz zbr*6we(st~VH8KZ(-Ab5rqDQ=O8Wi9U)Hbb`|`S@X%6YvR_$QY?j_wL)*WKqAJ*Mr z-5b`OVci$jU18l5)*WHp57yma-3!*8VBH7SU0~e<)*WEo|JB`J-TT#@U)}fBU0>bv z)g52m@73L2-RsqzUft)_U0&Ve)g4~l-__k+-P_fjUESB!U0vPN)g4{k&(+;r-OJUT zTK06eZI!bTl1HDRdmoqT?x*X446DBBjyE zbP}CH>2w;MN~co>ok?d<7TrOaew@qW9Lk|=nosj+0p-#{I*S%j9xb88bT;MFQYxTj zR7mI2IdmQs(FJrqT}Z`rF|bqbQP7+HFPyyOXYMuT}L-i1>Hn9 z(#=#!`gZBt_%Tnjdw8s&`{-V}pK9qrdVn6HI(md2rbnrs9;e6X32LCH=t+8-8tGYj zhL%$kJx|Zk3)D<6(Tnslwa^NBg;r84t)^A9hT3Qyt)*9~onEKc=nd+ix9ClJn>y)T zdWYVlF8YAprw^%{KBkXoJ@wG1^a*`Nz4QfrPG3?VeNA7{H`Gtx(YN$H4bYGD1N}sU z^dI_}exV`yjee!yX_)?`KPZ?#CvQ$$(3TWJThZ3E4e1Ly#?VHzF$K{kv?*;y;j}aD zLc3A~?M9)rEp12JQyA?)(XUqO1L+_-n3CxzI+~856grj?X$noHX_Q3M=@dGRPNy^Jc$!To(#e!d z3+OCbNO`n~7Sj^Sq%4|4b19p0Xdca{=jeHAqcyaa*3tX)0qK5%?k0RiU(>Jj8Y?>?K3zbc(J&R!c~ndn(vPIS*I7fy@U&k@E9ot!h>Y?@Y34Kbv^cj6lUr--? zNzc%;)I`haIeMO&=>>X`UZNIynO>n4)JiL96|JT=T0?7T9ktV|^cuZRvHZScf0|4O zP#hgd2hqV4PlwQPX8MMu*yltRbSEIN)->3BMU zW>XrSNGH+BluoD6sdO4;(CKsrok{w_k}PhqqJ?MOROIPFZk(5@6gyV35n2Sw6Y8b^Cl6zxUhX>W?AeQ00Wk78&7O{7Vb zMVYjazjxN%=nHw&*X!tOd~$jHd^(F3P#!I$gjQMjGmwddWxQ;r>T*irDte4HPQ3*9KArz^b);D zFH;MxpjT)mwbE)@MQf;y*3nvemD=fbdX3(o4tk5;q_?S)-lccwJ?f$l=zaQ-y6I#3 zh}KgNeM+BDKYdN#(l_)Y{XjMR8Q>nem+qrlx}P4P2dR!8qKD}bs;5WkF?yUD=m~m~ zo}xy2nx3I&sfm`;bM!nl(+l(>y+keaGQC18sFhaIYI>ElPgnbOwLe$;bf;4iX+N&^ zwzzG@Gw_PlEE ztMO4{41J+9i*s=ck+%c?!C+QX{7tlGP(J*?WZs=ce)tExS#+M}wys@j{X zJ*wK1s=cY&i>f`Td-CVFakLjj(cUzk_MvFnkM^Yr6hqomI+3)ObTVlVsrHf{Ob5{+ z6i#MU(2;ZmO`$}ZMpJ1zCDBZpK}S(C9YaUcv6MpE+c}Glr&Q8j&J##`IJKAa zWIBmXp>#TpPNmZ+gU+NgD2p;_F3q7F%BJ}=j}}laEu^z(5#^EgRxYOV={zc?3uJyC zyqL#}=n^WS%jid?xwrw z9;%`H=w7;?YUx3GfF7bcn#aeFAZjn-v-AutrzU!yo}(A2 znO>q7>1Ar674!;K(xtqw>-c_X!>eg6ts(6b)PBKt=^c8Hy69)pzCi6}tl{rg?xB0> zKB}er=>d9>>gXYQm>!{edXyfc$EksypeN}mYNV&>8G4qQXgNJc&r>tKKrhlu)Iu-Q zE3|@IX(g?q)zn67Xf3Uyc6yawqt~f}-k>+>E$XDV=^c8Py68Q6pFW^&`j9@NkEw^& z(PX8MMu*yltRbSEIN)- zNxQvHpxKm0C(=oDGHFNGDRe50rE#<;MbTa~p7y3_+K2X~{V0Ye&_tR!lOxnq$ zT};}+q}@x}xuji7+OeeFN{OUhO4^|`jkGgKyOL&*b|Yygl6E0!2aNIOwD?M%DSt`tGL z(eAVdMbcOrM|)Bf?M35hZ_*AQ?e5Xe9_{MUjvnpi(M}%i;_0FF^a*`Rz4RG!d81u7+Hs@ZHri>UT{hZbqun*yS)*Mw4fF&( zNl%e>JUva%(6iJ;%jr3Ko|@?edXZkD7J8Xpp%v6hD`^$2rZ!qbYiS*|)2s9vy-pqU z2E9pdk@m4@4~zD%Xzz;lt!U4R_N!>GiuS40koKo&Z;JM%Xitjvqi8RR_MvDGiuRvq z?}_%EXwQlEn{3!?!lU+>Xn%?JmS|sz_LOKpiT09cABpymX#a@z_h@gA_Vs8_kM{Fu zFOT-|oJ&P?9%z_D*Qu#D+Z+JZi6m_DN`ug!V^hZ-n+m zXitRpLufCA_CaV5g!VsZ?}PR|XwQT8J7}+i_Bm*egZ4LQZ-e$VXitOoGiWb^_AzJ= zgZ3|I?}GL%XwQQ7D`>BR_9wPm1=VXfKNPp=b|^_Md3)iT0gn&x!V%Xs<~P z-9z`%eN;>L(*yJ%)zL%rFg-%`^e8<>k5dCZK~Iu)3TT&rb_i&9fOZCGSAcc|Xg7d% z0%#Y2b^vJhUo-!j_1BEQX8SeMuUUT0@N0HoGy9s=*Nnbq^EH#NS$xglYxZ6<_nNiW zjJ;;-wNpa7B(y`~KGMzz?TXNj2x|+?^Os-~eHG`|!Tg}{R)>bpNnyuALt!8O8 zL#x?Y&CKeH5693(v@r#dX2vxut{HL7hHEBVv*4Nm*X*}uzBTKu8E?&YYo=SX+?wIm z?6zjMHLI-|ZOvwDCR?-En!(oWwPvn0YpogUNE%C1_-mAUz9yZ|C@_^8>}j~sPQp$0 zblhyuz%BMn+-mFV$J=au9eKO0uP5)Y^>=-pnBVFKQmEUnKNk1c`daf|TVHeDXQ$$R zTVI1dVC!qq2kqH-2(T=`Bj3goVUVq_QxCTF_39zEzHU9#*4M9x+4?&6a61b} z*mH2CJr_sW**MzH!7=tc9Ba?Vads|_w-?|9`z)Mj>+eUCu)bY+l;YPf!m0LRoMtb< z>2^NOu+PSsb^*?|m*QNk_g_f)e*H4NY@dURY|RxE+eNs!!9ezI%_Bz~Zx8pYZ zRorgt>;5}zef@u@-GRGo%>#7XnhWT$-@?7N<^=lew{gF%xq$&&^8Z`Q4yV}zINkmpXV^dBO#4TiZ4csH`zM@d z|BUnPAzWzxf{W~5aj~sgk`j9um)gJMGW!o)Zu3X4K!vTJTr2G{xXRuLSKAxo8k^r% z2WoA8D;cP>H^ue#X1Ku)#*OyoxXIoEH``m{7MtG&1zPQ`aGSj~Znw9=9d;=0w711w z_I9}2-X8bZVYt`c0r%NE;(mK4JYe(NlE9$7Gaj;c!Nc~hI52s%y*m!E z_rRfcBo4F3;&6K$j}j~tPQq38bX;xEz%}+vTx%!eI{Ro`Zy$pj>=fK+AB&spS-9Cg z4!78;xYa%$x7jD)c6&DNu+wm-eIo9%Pr}{y$+*W($G!F`xX(Tn_uHr80XqW^+Na|o z`wTp6pNRvxBhUX#9AszVV0#V@vFGAYI~#}DIXK*&ha>FyIMU9=QT75HZJ&i>?1ebi z&cku`A{=k?+wDMty#y!P`8dfw8zF;tKmRTxpl$D*JL=ZC`??7t zU54xIt8l%2HEyu4!Hsq~ZnCe#&Gz-U#je1u_6@krz7e7ap?j#=~|E4lEdX&fkNB?0a#reIE|7YjLQ3KMu1W zz~T0TIKr;Ok@iD4%C5)J_M}PPQ z{VYzin{c|l9B0_gIMaRsXWK8~T)P$LVLfkG;zD~BF1Au{~z zj_d7LaU8~n z&7{WKF*wfFjB32C8Px<^GpmWVW>%AI&9Elhnqf_`HPf1E>+5dPY|XZ&+nROFun)(X zw!TIu+t%0IiTQjwl zwq|UrY|YqK+nTwpu{CpBYikC#&eqoz)!X`7qXt`FYt(4Z#!a?n*qd$5u(#NnWpA}L z$KGb2hTCoZzw{0}6L;EKxXYf4yKVh{{vKQZFTU5##eMby+;8ju&kxx88mmED|L=at zUV?{heO*-`Z{+!3fP-w!(g)l68m$n!1c%y};xPL%9B%7t10w7)9BE&LqwK43w0#YZ zvCDC+eIt&u^|c1^w!Z!#!PeJqCSo2o%qpk&^=I>nRJ#DD*_vfex6i>D_PIFI)+}na zt(nwZTeGQowq{%N?JIDht$E@i`zl;)YreR|)(mf{ty$hOTQj}o_6@kg){Ji@=9|4? zF1gyT*L-q~t=ZaIzl~;<>-~DoEH~Ji#cjkqZ1{TD7F)Bs?O5;s4&3Rt*9>!)U$0r_ z9=~2Q&Aql}oBQk<-0!#79Pps68RubJbIw7FMxJk)cMi5SvmAo;IcWAd%&*rBbhxdr znT_zxhO*j+tu;FWp^K8vW7h%2s=W&VOz8RPL^)KLZzg~0h74}QG(r&?3etXSY z*VvjPud_8<-e7AUz6tZ&iw$$}&9-L5Tl_W~X5{_)HeTOu>uZ!d{5ETGmtU{>`EI)% z_t={I@3mjUeYR%M`)$qF4`6*iXfAvR^RQv=J!tXB>oqGMV!w;Sus;7T9Byl-J;Ht; zN7^6YD7za++aKZ>TQl#m_QyER?!oc)dYoWuCO*;DjC_)<8Tn*eGxI67X693E&CsXW znxRj(zr-1~X6iF-&Ddw#nz7HdHFKY5Yvw-R)(n23tsMkKSl_qb;}To5_GNyXA91;@ zeE}7ihYfoUs{Qu=;T5%h8_nz2*_!LGw>7ulVE=|2?cZ^e{ReKg|HLhJAc$Wp?J>B` z-Uzqb8{-Z;2zT0>;4XVp+-+}$d+cD`Yj2MG>@9G=y(J#7L-3%z6&|v;#>4hDIIv{o zc^Ha=>}_$dtr@=%tndHrahPAPnZIzqeg_=s*YAjdw-V5j3<8h(AH!iZH zak0G*F0nPsSc>)e?1#(!`WRecPr#M-L|kQ0!qs*xuCe#WwYKIf>#*Mc0l2}h*Suw; zUw)&k&oMaKuTQ}-_OUqD zo`vJ=<8Zv4iWBVPaiVp;8LvbpSif)&c>B~n;cwa&%@RBd|YGa;#zwFuCvd= z_4Y#CVCUgRdl7E37vpAo32w3TajShcZnFz;yS)^5*oC;$UWU8ub8xqPF7C05aIbwH z?z7Lw{q_ZTz%Isv_Jw%Jz6cN77vsR$BhTj&9AsaDgYBzvh^fX(KZMKdhjF?62(GZ} zai#qzuCgD))%N4K#%{p1_7k|yeiGN)PvHi;5jWaT<0ktV+-yIKTkIy>YA?ra_H(%1 zejaz&&A8Kk0e9Ii;%@sT++(-kUi)R-XTO5`?G<>yZpDN4N<3t*!o&7z94Huh{`!sN-HQwD&v23b zIWD%pz$JDcF15eJW%gIN-2NI@*!{TD{svds-{NZfJ6vNA;9C28Txb7)>+K(LgFT2F z?VoUy{WEU1|ASlXA>3;Jg4^t0al8E+?y!e(r~Nzbvj4!{_Mf=N4s62n-yVbe?2T~0 zy)hoJgYcle2_CXH#l!YyIIwi&`LF#vLH34yJ+}7sgxK2O6KZRJPnfNJKH;|Z`9#>- z?-OZjzfY8{eLvB*_Wi`z+W!-4YyVH2t$jf8w)O!f*xC=2Xlp-ElC6C~$+q?drP$gZ zlxk~#P@1iMLg}{l31!&YFO+FV;%s{?&b7zkJbO=^Z%5%mdoNsMkH^LK-nhipexg!a z`-;kJ?JFv`wZEvs*8ZYOTlTK;6s<*XcsKM5*p+;Lf zhnj5d9%{C=gQ&&UE}~XjJBiwC?IvoswWFxR)~=#XTRV%oZ0#=Uwi9uWJq7pL+G*5h zYqwFqtsO@Lwssv2+S++EWNY`)u&o_Pfx?mJzjh%7+1iN|Y-=}Ch^-w-p|*ACs%{5-CT`!32w44 z!OixixW&EgSKXOhiuL84%?dL4J;dZ{%fW;$kuFcu&o*25L>gpp|)mz!)(p|hTEC}j<7Wg z9BFGNILg*+aI~!%;TT)9!m+kyhU09_4#(S?Ax^M0OPpwHrZ~ygY;m%!8RHaNv&N~m zW{%Tr%^s)QnnBL6HH(~SYbH6{)@*XFtr_J!TeHgfwst`k+S&`E;67Ws zulnr`JFsl+!Wy)-6KlxUZmeNjJF)`jj6DCfD=Wy>&a7ZtyR$-U?a&IfwM#3^)=sT( zTf4O)Z0*>Jw6$w1%GS=UXj`+gF}7xAV{OgO#@U*ojkjxYf_*(7p_JcUtuEQzz zLparb7^m5f;B>nlXV{P8O#3mMZ9k54?FO7@KY{b@Cvl7t*|xwTWM{?y+CPz4q(4&+fqe_8WM>eiIMc zZ{Z=k6A#;O1bQC(lNGXrekf*PRH4rp^mqEaf1CBPP9MAN%j{w+3v$B_Ln%-{tBnrU*mMUA7|L# z;7t2loNa%HbL|0~XMd0L?H_QV{Ua{22XV3e6E3lbaH;(ZF0+5d<@Rs5!XCzz_V2jL z)(+!ptiLbS4&z!|JBsUV?I&)uwa>5_>+iR<=djJzPU23#jdllj+uE(sYirMDKi2;T z)V|FDTYEPLZSCJ2vbBeE*w#MIK+(v*tG%2-w)S%d+uG9^VryS#sI9%7VYc>nhTGcX z8DVRmXQZvYo>8{;dq&&Z^BH4n-)F3?y`OQm_J79P+5?(kYaeK$t-YX0w)TT2+u9SF zVryS$s;#}DX}0!-)O$Ay`zP;_Kz0X+Cy4w zYaeNet-YkBw)T^j+1gWDZfjp@g{{4%mA3YmR@vHPT5W5eX^pLY8nw1|4At4%FHvs? z*hkl3kHL-hM!3n|7&qHNxW(QCx7wTHHhVMNZU^HIdvn}rZ-Kk)EpfLUf_v<(aId{J z?z6YS{dOoGu(!p7_I7y4-X0IzVK{K!$n$>(9Axi^gYBJgh#ihY?VWL$y$cSvcf}EQ z1dg~T2W-V-O-Q8>}w3n$s*ak9NPPO+nLs=W_Rv-id6 z_I^0Sj=`Ds1e|S8#JTn)oM*@4e0zUfXivsP_5rxqj>9GPfw5kINWci;sN`3JZPVQhwRyS*iOTN^GBZlC*mOc zBphs?j6>{n9BQ9}!|YRWxP2OqurqL^eL9Y^&%n|4nK;JI#IabvZf45-oH^&roYR~+=Q!ugG?Qph#D>`H#%7Hbk}!x3 zVGu$XgxD}>ZD`k^-3?iv`}4dW*EHGveE)cVZtrim9_Mj?Uf1iqeqGn=$GpyU&QqL( z>%|ws^Ta8*QJjVsh%@jaaV@-9Tn8@^&w-bU>)~bM26(x6F5D!(2wowc2d@-g46hbn z0ym52!)wHi@LKVu@H+8jaEthIc)fT5yg|GW-YC8TZWUh%ZxSzpH;b==w}`KX+r+;-w1aX{~qoETR;2* z+)L$6aBuN#aE|zoa3AsQaISa-+*f=DoF~2$&KKVW7l>EF!^L;Qh2m9kk@z0CSiBl8 z5#I}!itmHV#P`E9#Le(5@dI$V_(3=%eh7|;*T6CH!*Ejk2%HiB39c8fh3APMg&W0> z!3)HX!;8f0;Kkx6;3eWG;iclI;AP?#c)9p#xJmpByh8jeyi&X#UM+qOZWcceuMxih zuN7~A*NI<*Tf{HH>%}j_8^jyojpA3}R`ILwCh=?VW^pULMf^J4CVm6nDt;5*Cf)>Z z7rzC!i{FNKh~I&CiZ{c%#P7nsd0wA?5AG`dGu%zQ1@10>AMPRk0PZRN5bh;zgL{iV zf^)Ld05`P0n#5>@a_#bdm{7*O|{uf*?-U-hWe+xH?zk?TuzlRrz zcfpIrKfp`G|Av=}e}tEbeaF!M#a-Yg@m}x>@!s%CaaVY?cptb~yf3^)ydS()+znnQ z-XCre9{{fx9|&&{cZWBMe+IXT4}v#|4~933d%#=7hrn&(L*cFB!{BY=p73_@;c&aS z7raA!B)n7n3wW3KDA;$g*Z+INUBySk-NZR?ck!`s5AktuPx0|^FL58ZxA+7&M|>jO zM|={TE6#=cicf~~#HYad;#1)QabI}2_%ygs+z&1i_lJwcd2oq%09+~_2$zWm!8649 z@GS9QxLiC04v9~PBjN%$CLRhW#lzr?_zbvSJRF`UJ`-*f+i!y}5T6Y%5*NaY#UtP) z;*s!D@hEtixCmY@9t}5%i{TaGaqvps zc!PK*yixosxK(^Uyh-ebH;c>RE#d&&Ca!?Dii7YraR}Zn4#Vx@N_dC33f?J>z`Mjz z*msH7|7XKp#no^(aSZM*u7P`q<8V)L0`4VF!o9^8!a3p;+((>-bHy3BuecV@6Wi~E z=ZojS1!DV6@Zn|{dRbf*nUI2SZu!?ULw92E)_SzW#UWW8RE;}S>ns#a`6H< zBwh$d#8<#E@s)5=ya>*SuY&8vSHttfzlIydi{S<0Yv4uVYvIM>>)<8gCGb-5_3$$B z4e)aDZ{Q~JQh0^;J3auHt*)ZsPmk?&AC59^z)Wr}zQ5m-r#Lw|Fg_BYqU_BYq6d6+aI56|aNy#81Nc zus!d67A{oz2DnK4B3vwf2`&-843~;G!e!!Cc!v0Oc$RoGTrPeW4vF7`BjP{9F>xE5 z6n_L~#D9V7#oOR{;?Lkl@#pXY@fYwS@pgEz_#1eMcqhD6{4Kmp{2jbp{5{+x-UY7^ zpLi_&9JasFPJx@nr^0K+1K}1;KM7thE{8XW1Mo(11>7nQ!kfe)c(XVRZxL6*ZQ?3; zt2hF06G!3g;@NP!xEkIej=?*{HSjKR9QHMOeK-Mk6(`|t;tS#K;uPFNoQ8XfGjK0) zE!JTTka!&&5kCRP#81LW@l$X{+yd8&pN8j&pMe|2&%z7D z>)}P>=itTS=iw#d7vQDh4e&DYi|}&sOK_9;Wq5^nBfL`l3cOnUD%>o74PGN|h1ZH- zhu4YUfLp|G!t2GG;0@xp;Em$9;a2fG@FwwQc(eFjc#HTwxJ~?Lc&m5|yiNQ*yj}bO z+%EnQ-XU&-cZxrPcZolSeV2Ou{}Z^Ycq`mZ{1>>p_*1xt_^)tJ@iw@Z_%pb-*w>f- zFYW^O5$^@(iuZ>5io3#j;(g$J@xE|@ct3c!xEow3-XAU!9{?AN4}?p^-QiO4&)_og zLGTRm!SF1x<*g_eTmFiW_)s_^J`9eDEw4pVd^nsD9|6~kE#JjFvE{vJ6kGm_1!BvC zu}EzBFcym~FUAtF<;Pemwmccj#Fj5(xi|-I5+4h%5FZDx6dw<-7WaXh#V5dP#3#aQ z#V5h*#JO;b_+)s!_!M}9_*8hKxG&r)J`LU^?gwuc_lLKL^WZk|0C=l-AiPaH2;MHv zhug)2;T_^3@J{jR@Gfxy?7PhC|3l%f;$d(%@fmP;@o>0@_)NH`_$;`W_-wehxDd_} zkAVA#N5Z+{QE*>z5u7I;4d;u;zy;#5@NjW4Tqqs~7m3Hi#o`HYiMRwV6;FiA#FO9| z;>qwVaVcCbJ_inor@#^MR5&IsgOlQEa7H{Gt{0yR&lAsp8^tr>1>*DIMdDwZV^Y}_2Sv^ z25~jKQ5=I?#WnCIaU9+(PQY8lNw`g%g13s(@HTNRyj@%ew~H@s2ui;$rVz{sP8aPjU zEu1gD4lWQcfrpE)hYQ6wz(wNUz{TRFaEbUvxK#XGxJ>*zc!qcxJWG5NTrR#D4vBvc zN5sqFnD`brDgFbT5#I{ei<{ti;@jXx@gLy@;@jax;uY{>@g49I@tyEe@m=sT@k)5P z_-?pKyb4|+z6V|@UJb7n-wQX3?}OKf?}yilo8fih2jCX*gYbIsL+}Ri8hE4lVYpTN z2)s%BCwQ}XExbkiDBLD~4Bje!9Ns2g2X7ZY0k?~vgm;Laf_I8r;9cUUVc!C;|33qF z6+a7i6R(H6i=Tsgh@XdhieG?xi8sK##V^7+;+Nn);+NrE@kY3>_!T%${3@I;ehn@V zx5C54ufv7nH{c@in{css6I>#G3oaGE4VQ`EfoF&}!?VQi!sX)k;E?#wa74TXj)~ug zlj0BHjQB&iUfc%H6MqCZia&-Ih(CcBiNAmsi?_o|#D9aAivJET6Mqda7k>jci7lV= z3bEyNUMaTx&a1_i=eb#I`JUH^E${PMvE_eWC$>D$En>?Dyr|beq`nNpBTfUg>RO%P+lMY0M&W zL+xAW^?%Dp-BoOPsk@0SKXrGp<*Du=wtUq+#g@0am)P=G_ZDaKSc@&6bsw?iwayh= ze(Szs%X6J4wtUz5V#|A7Ah!J1!^M^dyHISovx>x)ORHFHxwJ~emRqY-Tm+YiN5eD3 zmTPO4*m7@`i!Jw7NNl;dB4W$I6@%?LiRI{mWnN>*D|r?^ja>q9A8ah%ki~BY&pMHiY@2YYO&=2YZhA$ur*@K3AR>j zIlmUC>I z*m90-7h4XpcCqCk+ab1`WIM%{lWdpRa+LY5@cOysDC;V=oMqj_mb0w8*m9Wl5HEmx ziWkDY#Fo>nx7c!=<%liESs$_GJj)eZ&a=K^%Yl|Bwj5~rV#|qEAhw)n!^M^(tx#+^ z(u%~EGp$%`InzqSmP4&nY&q1*#FkTShS+kd%@SLVwQ{lLSPO|Q=UPN;IoD!h%fXfu zA9ojhUVJ=UFYW`+6Q2M#icf?Wh);qSiF4t_;*;SeV$0#SRBSojmWeH=+j6nxcxw_{ zj<*$J%lWoaY&qXni!BFSv)FRLtr1&JxV7RT@H+A7aErJAUN0UBZx9cIH;T`ITgAiS zO=8O_w^@7^yhVIA+$JuBw~9x=+r%T`?cz~zySND6As!9y6pw*-iO0geE4}_-40jce zgS&|>XI*!(<*@4^wj6dn#g@~qm)LUJ^%h%>yBx9Qxa%XfoOiim%X!yVY&r1q#Fhgu zUu-$?3dGal;o@`QLh%f^NIVlR7M}-~h<^o_if6%PV#}#FLwo@|OYDcs#pQ5F9DpO@ z3OFVX!bx!m&WOWsy|@ydC$54U#SwUcI0`QkTh6}4V$0#TL~J?ymWnN>-!ie~^jj{r z9DhyX26%;dF1%8F5xiPF4{jD;46hMi0XX&_;xs7 zyaFx|-vJL7-w79r?}CfOE8$}C-EfI`65xKX?oULbxHUL<}DUMzkbULsxxFBLxlFB3lrFBd-r zH;G%|72>DimEvdM)#7L2X7PG>jrciut@wF(o%jW~MZ5uCFMbi;AbttnD7M^@tzye1 zxk>ysyjlDXyhXejZWF%?Zxvgv$!+3)!rR4`|FT`2gm;K9gm;Ql@Gfy0_Fd)m{|ww! zTnl#-*TLPzbKoB0dbp>!0q!N93-=aZ1m}q7!F|LR!@1&1;J)JdaGtmk&KF+_7lAOz7~#&uY;4~ zC2&T3JzOuo0iGxR4csVR3NH}f2rm-<7G5m=9lS)m3|=a}30@|?8D1{_J=`Q-4zCd3 z06>b(c!E3~~!E42Tgx860hg-xe;Pv7=;0@wC;f>6KUjug)KMZ#hKLU3b z{|W9PUJLgWKMMB}KL+;}KMv=J*TH?nPr$k2C*i*0r{FyCu|LxP#mB(~;^X1r;y!Sp z_yo8}d?H*dJ_#-n=fb7pli@P)Dew&OsqiduU$|U+8XOY$gCpYpa7>&BC&iW@H6tDf z*NX?i^ThdZqj)g9Ks*FqBt9KpEVjI=OT?C6b*Xq5yi7a-UM?O9H;G5VE5t?cO7UoT zwRjBNEFKH55f{U2#pB?0;_+~ccmlj$Tmo+pPlPv$C&8`a$?zs|DZE*H4!lJ?1#S~h zg|~{!;BDe*@OJTZxLtfMyhA(#-YK35?-HK}`+n{9e_vN};EB7y-Nbvr-Nk#uJ;Yt% zp5lGrUgCY>-s1h>9I@q*?IX5)vbkc*E8ACW`DOFOmS;9!Z24vj#FlqFKvm~^3#@zEl+Kk*z(oR5L@2bSz^myTQ0Udwjr_QvyF%?uWd|h`E8S8 z%X6C%TfWk@z@xvG{m+iMS8ERD1%wOnf4|TznGTB+i9b zh);%Bicf)8i%*4{#eLy5;?v-@;(qWtaeuf)oCmKL4}dp_2f`c0gWy(iKD#BYaPefgP;7aL zi^P_nxL9m?ic7?nueelfd5g=$mcMw0*zy?95?emwalWcbpVk z-s6ne@*mfWEf4ZMvE@T<6t}<QPE#LvKs#m~Y^#OvXu;^*LH;^*Pz;uqj1vE@}> zA-4R=E5(*)d9~Q`EjNoT@A4Y4@peR!Mr19-dmL%3bs2JaAm1n(4o4DS+u0{gD<`u|qA ztN1T)H}R)%cky509^!3qPw{7PFY)JaZ}As!j(9uVNBlQ9SNwOlulP$iPuvdYi@$;k z#9zb1#oxe%;vI02_#bew_@8iz_+N0Tcqd#Y{uZ7g{tlic{vIwDTW;%+*m7J)#Fpzi zCbpc{NwMX=&WJ4scD>kgVb2p=PV7dp<;Gqhwj9}u#Fi_2vDk8EFA-br?4@GMp}kCO zxwMyyEvI&q*m7&H5L=Gzm14`ay;^KJx0}V5dwY%8a&WH|TQ2T(V#~?hBDUPz>&2F% zdxO|=b#D|~&hA#RAq{d{%<+cyNWG$dN;A$zgf!QNMFx!Ci>mXkeSY`NJB#FnFdxY%;F7m6)sdy&|3w-<{ohkJ>* z87>t+0GEj^xBCq78hDoYVYpmuIp0HK%l#e^TMqb`*mA)q#g-F3BevY|^FwQm<&&h~b(yl)zvXuC zDz+T&-Ncsby}Q_QzV{GY?)RQz%K_g@Y`Nfji!CR7j@WX;_Yqr;_*}8&itj77obh>L z%N?IDwjA;WV#_5zTx>bz3&oaOzDV2x7mJ^UOT^E>rQ&DdGVywNhWI&nmiT$NT>JtY z5^sPb;uqnV_$4?gei_b)H^TMeSKxW#SK&tSYw!YbE4)bjI=oo?2E0W4CcIR<30@|C z3tldM8*UQ61FsNohF6N;g;$H;gPX;FhS!LK>P%}Nc<$cSo{>cMBD-|6+aCx6F&nl7e5O( ziPys`#LvMi#m~d5#V^3k;tlW`@r&?U@k{VJ@yl?Fcq6=C{0h85{3^Ur{2JUUZiP3A zUxzn~-+;G>--O%5o8YbDx8QB!x8d#Lci?vMW_XAAU3jPXJ$RS+&#>=$um5j>yNch3 zyNN%5yNf@Bdx#6;^ndXPxR-b&+*>>f&Jh>EeZ-^TT=5vVuXrq+CoYEb#pB=t@pyQ+ zcmiA~E`f{06X9auSBS&#N^vE; zT3iJ;izDzFaTH!Fo(-=PSHmsh7`$Fw18)$=;f>-1+$v7Oo5UBwo5d-3i#QFpi8Jt4 zaV@+}TnBF#&w<;;_3#dH1H4l_7v3el2=?9J_5XQrSMkMgH}NHKckz6ytX;o<|~LUDJvNc=OnSbPv% zB0d-{759M4#D~B$#D~JO#D~G<;+}9wd^j8t9|6b2KZldzUT{WyBwR241w2oD6x=B8 z4KENM4KEV^5?(Am23{i0ftQMpg_ntsgO`hshnvKG;1%K%;FaPN;nm`k;AU|yyheO7 zyjFY)yiR;7+#>D^uNR*NZxHu`H;Vhit>Qd*lXw8USv(NlA|3>{iSyyD;=%AX@ep{s z_;k2kTmbJ74~2J%hrzqVXTZMSc>RAk+*N!g+)aEI++BP&+(TRl_Y{wSdx=NFy~U&8 z9C09>4yQ8FL_DW55RHXH!*bH$SY^M;SfDDMdvd?pcr=&@g>z3{^Q*&rQ9hO!)z#dMd!L{u5M&QCY<)|@xJNQO$jH%nW*iUv8hCDG7$^;v-_m;JkGUwB;vt9W<-po z#{)KbCmfjy#Dft&!(%#HG^?3#=Xsn*JjQl*Fpv)Wqw#b&o@TLi;hNf5ChCtx{nEHEAqr~3B` z22xdt{;60~U> zkQ1#*#=F|XE`o+R=PCzyE^F%5)ld28( z&6!s}FQ-0d_?g~0Di*DYX8f5%CJ;N>m-|bv9fr~w?fm3o%ZJ-J&d@*jY1)qZ8scAc zidX%l{`Q~L*K+_J(rNlvY4^iB#UBvoc8b6LN&Uyf{De`*^8Z4d-zolrIEVQ3{6PZ; zXv6#J@Loee*5&bSKZV6=v|K`?{8VReDQS`Eo}VF z)ia&0D`0KC#@y+*Nytuyo?PZU=^6>nlHof`ATU(#I z`_{`>M@uWp1LwSUeI~u+vYQ&J7u3Y(C8oscuDS5iITzniJ8SmT;^6rsCg1tD+h2I{ zqt{=4{@p*n`uWa3eEH-5i;Ic*$=Hr~95Fu++Yyf^KA}^5EpcI|*z#4`eBJz> zA)ZeBpB+9N59ORix6TAonVb_(%(0km&LQC5dm4Ef_}?)v%TIFhf1OvNvN9dc3P@z*=?iBmpxq%%kdQ- z?_F2znrqu_|7K8T%#D>@!*gDWR|JwODyCK;_!MB!W1z7gu=t$(^_u=C@#XI4%k?p;jWF{w*$eEpp#&e=^h)s=g z0kgZxInfMT8jk0jl~bFJ&J7P6HgUv^nke1fN`1ad`*_>@KW)oB`U#t`l=&62UJs%p zkc+LqTl+-lldiu<;n~Rgd%u2X=H!O!BLQwv!l9G@*LHPnrn12H^zkS3^p&$dYw0A` z<}QAi_|#7E8e+aSMP9UqF{wn&s7N4{?WfhOGpCcR&VYmL2yPAG{h)hvYxiC!dHdlKmS^{=|9LHla%g1# zl;Sop(=omEU%T)4&*{C32IqG!8jN?;{2yjo>sMpL+yDn+{!!fLRwYsmQ-i5!G83#! z2V=nzRbemmkFL+y-yMl~dMv#r!tJSlRLqWqlz(I@9H^ek?P@q4413YJiB!lV#znG> zp=bm;5Ba44J{PT$Y<*0RNiF!>XfygJvh&H)+^ap0UPoxI9_TQXi%vm#XdoJd z2BV>9I4VM8Q8Ai;CZcKRTr>-vkNhZzDp3MmC|!nMjuxV;(Y0s^x&hsYZbCPs<;&E&9fW$ILs2d|1r0^RQ4t!0 ziqUv95lutW(F}ARI$tWsgQyZEP$Rk=EkujawP*>t0j)%<&_n29^e9?~)}!aq2J{ko z1-*sdM(?8!P#gLLeTu$BU!iZ1owU27gHR82C@Ml@P%#>hCZRHPF7l%wszeDi7tKeP zqRY`j^jmZ@dH_9y9!F0|E%@{3CFwPM6M9?PjDLteMPH(?(Ko0If5;3&g=i8gMKjT* z=rXiGx&pr%Ek?JaJEXhtCr}GokDiw{;IE=q^e)cWG$7&oX1G#_1xZbnV$bM$w#6ZwA5e9V3s5JE8KLxWWQf~F=|9>&?Crx%hGNdzAJ&ly9Q9k^Qb@8?xVj{2J{* z|3vmXj@@%;7j!l%L}k*2xM{w$1YeF?Q9Ih}SWo-mrUTGn=y2&s{Akoivfqg`?L)*>63V@=z5@ zNb~XEq9$}FT8ZvM&FB%d7Cnht(DP^mdKI;zx6x+w0ct}(qW=9n?UTp$qhnEjGyn}o z1!y=Lfqsi_LN}vZ(5>h;^c~uTenk5W;QeR-x)wE|r%*fk5!u7KrzYZ)IA^Y4z0eQH zcL!~FC+7lmDze|VNTCe67|lmtp`YKyv5byGi;#Vn*1n5q-$AtR9=<8Ph1+)vzeXpm zWOqx2cp5dL=TIwp7qy{(q3@+1@YC*Q|D&m>9L+pKwr44sH_(J(X|or%sy6HzHTA2p)y zP+=E7=S4qAjeGI=D{4Zms7>r!Zu#l#_8G^ zSR4Cl<5q3Fs*O|i?c2pSWIwhGO+)3V3N@mI=t|U#9z>5JU$-v4eNZ>)0DLey9TlMA z(%JYlRF3LUBl-hsLtmpE=pV?pe;423Ch9Ys0F=%UPPZF-+{aj6{2aV9Hmerx*qu$`&Nt^k&U&qF_tzS z&i6C+KgvTxQR6|h6S@bjM$PB}^aJXBFw;tTcqvMvg{T>=M{Vez$k(HbZw#tLwP-$i z3_T;Y;@eO=`WE>PVY~zyg3d-oXe=s4X;ddQ;_K0iXd`+Ry@$3)zC*kC4nc>Z)6rRI z1ZqTApheQv_%-M{bPKu_twhb}bJUK$MZUvmFSHNpjt)jW&|xSSor3bvKr{#qMnlmV zs0fWk#b^SWh)Sh%ant!Ih$>MGB~b?XdUBkhQZy4?fC8uyJ%?V9TJd*L`MKe(fU59Q!ccHt{Bgl6&>yNsj{n3GF2pT30$InD(qp_$I z%|zuWjH*xs%|_RvCFpwe8?+2Hp}SGrFF78N?-=?GIus2>%25<0(UYhJy@*=T-%vZ+ zfqd0$H!4J1MVT1au1WwQ-!GZm1VJ3LT4%M}5$V=oFNP zYS49(?<2<5p*(aZDn#SZBx%XV>|@k|zD2EDan$x#u7_wF`U3q8{T;QVetloPbKvOyv7J=X4rt~Y^biU-rO#xJaLQ)kz8^urxWzZbdfaak~q(=NI^lS8cbQ`)I-GS~# z_n^m7-dC(MDn(J0L|38q@7d4DM)Q1lClA{1+RHcePkZ?a(a~%7^5vl0Ufs*rjM~1S zekbMMc@N~rAGSBwzrB6;AJ0Q|9z1=C_GeB%Lpjny+|(pB@@&Io6C8kY(aEU4RkE@P z%F@kyX&aCKDz6lyI#5Ll)DbO^N>6K+jYFR z>v(s^t?QS8ctao^j7Ht(TR+fM3+WRhrj8mnZbUjAtzrz-h$8*ji^KK)qG(l=5ktvHV1&I?Fv^e5PCLk!!So@Usv4arESNh$J=wK980G7z=*rUJq0a3(uZX|{w9 z-LgghF-@i+8U8QR`O7G;h*ghd{9JWK_NAt(B3V(vCxC%?f>DuySTIpj5skC>pl!@3 zSL`3<%DwHk;fbM9_F`1Ycu3x2v44!mR!k!#Qh|zCI9oB!MM3_BnO`ztLmLxuK5h*1 z=^_-21macU^qdGEE^4+c#VhomODUgQdP`%udrr&1u;hQ4)+_EbZ7eY-oU)nkIp30w z;!e}XE31S5m-U!5X2PidzA}swWw674ETF8TxYGh^S?B+Oe5afTs*Q zI9^*5PDO*&BRWbZc_mCm!!dRxS`lS5VnbaZ6%E8Q)wY*A3a5L8OdDksZz^0pZrmu$ z;#5^tI#HVnQZ{9*f9%vOdlivR6~&z^W_PL>-?^eX*{Nni=^j;`YdTldbgG!xxgy=E zVru7#Os9&n&K0%Qooc2{*rTd*P3MZbP8HKTDiWCpLxHr@ojy|3xy(P&E8Js3J3H(-m7Nzt;mUxGG441@-3W>zufpGP{Id3;u)ows zS1`z;D4e7ZF`OVo;E0n}pePz(Z~>=NSWpwngae})dEpGfeEKWm&_Je;mbC*`X30bu_36zgH2l*w6ousQLLby>0*g=Z7S>)1{KheJ9WQ~E?X6> z3RYBk<4mky*f0}s57dNhZ;y3DN~~F3g&}PbToW4*wNC4Y2Go_hHruuDsp)t_oI4PA>~r1Lo@StIG|0i}U0OSh^kIN|H0bS(C|5PFUA(Ei z9m3m2sW=)>2KnwmFq#gIn>yLfRyII=cAzGajxb6#9;gYAC-6_T$Ulj2cGY;!2b_NV z+3!c#*uS8aWOp04N7(}JuE>xHtL%FeVrv|m+TL&HqS@*A?96|;?pb&1xSY9boGxaa zu3@0NYJu)L1$JDSjCINf-NgrVmmAPsV8D(`it+CExvRz=*NLB87&@*4u?l*rMoe|w zZMgF@{WYBJ`>{m0BvEBIV*be~4qv-B3McI@DdrV3*2)g*jzaEcI_B1KZ_@#~Ch&EU z$V3zmSX;#d19V0556Cv2wWlc%iw4p*g@1&R-HxRuW$((k&$Pi`yHEU_#4ZeS?(&~g z%l(LdR3sd%wla(OW{L$No1kdV2|}GG*nM-g$K6!+uB*~sZ3dit_E-d^ot9CZUC4x= zEQQkD({x(@jzNL(j4ssK-ll7~bwXiwT%?<1x($+y*Cn!l6=d%M*gftKgalpEjtwp? zUe*8C)spisXD4sEj&qlHT1#+R@hUoP)FOxSBJteT#-N8*1%+rA7fmHTeQgG7t>AY0tG1|5PhtnmOrYu!ajWO~pmc&MtN; z^S)}u!IY}zI_=eQmfl^(ty=Yk_Hs@w-w(OYh_~v~I`Lv0$1lqx0B?Sz~o-H@@X%7x$WUZ7>u3j|Ewc+em+DZ9JH% z&9;!0+nz{vDsq2BX>DqQ|FI(3JGB3}E#qd)4*mglmJ_SF`8q+O+RFC0S<7yA$Go$V z?e-3E%TJ}VS0U?AjL~I`dm@$nD=XW>rmCdQzEMff;;K)JXSZ#-ia5!4l+`8b(sL?y z9{_VW)n~f~eV+YU&mlRZ)5*bN-H3o`tID1tEU;s>KEe6eUPAU#oyF?V_L1KA^}6MH z{v~l&o{M~gGqlRL*QlPpeenHo9+&wJk-PXPVtbC~rq3m|r+%ksx_sQ;KNRndkH+`! zR6mLMz)tluHT?y+&9@r2_qliuF+-|+SK;>E#ar-0@cVFvP5GY2569oeZJ5&Eah^K* zzQS!i{wa6y_o{dE`?q2@zb-}I``!Gy691g}9EIC3rhGiRee$z#+n#Z_t@kwCwxa?+ z2v6d+KJNW#V%uM}xUKhIw1dU&{a35}R@|2Rh~k$Of2{aliVqs?t=CDo4QCpK+k9u> z_Wp$81&V)<+w$D{-9l{p^#R=W^Rt@nJ>2H=C2sAv6X&t2??>FWulpEpdwby)pP+bv z;% zZ9NC#)_+E+dCUBcI~r**!qWSkGqMj z{at&lR_xm6e#NeR9wfH;KO%n&x8=WzTYG$h+xqXot-baw_S*j#+}i&P+?ID1Zrf8V zckvWrYkxO=nWjG%w{|X;pX3EoEIO8+y3c;+wxs}GO_jJJlytI z32yD|;!0xc4=LQ%r%~}@#W&-&{JU^l|3?%*tN0Dv_WxUWH~f9v+V3me+Hc?SUb(A3 zh}hQ0)gMl5{qHE;=6?!q%X9JR#CD!@{c|$0wdeMey#0R;u`R!MZqMxZoyv%9KCV7U zY}=Q>ZNBqxTR%7b5@Or#Kj8MhdvTloQQW3~9=G*#@83vl``1nXy6WBZ?+{x%e1_X{ ze!y-0d=tF>wm)wB$;F2dTfLjUC$TN>7xEm{ACKF4w;yi(+{FdN)}Mx}eyrTZQ;2Q; z({Nkv`M6CVz^#8~aO+PlUa0!3a9jUdaBDC3{uRWweXjlyVmt4?g4^}tQ{3A9dzBwr z;w{hBAEDUQ|AN@o?`Yh%FBiA{J{Y(5D8jA1$EbWNZu@@*ZtWDp?R_pzsN79|k?OBd z`3<-&&&~fvVw=CK{~fVypSwQXO>Eoat`AQV+x~FZhv$fG`R@AAs@Pp0{;b$tA3i0v z^>){XuT}4^4?ie&*N1Ksz4^QA!(ocu_2HMqHa~ZLI7RjD`Y>3ryFL^W+x~Uehl#|t zpWXFg7P0lO3pn4JR}$O)iKu*Ejx&o>#MW;v$L&1o>K7B+{=E*jesL#m`_ILX6I=VW z;P$>3d#YsRP`>dBewm2naZ!j?f7-^jf#Jd+jiZ9+j_eAQPn@C z`qxzN;`fPd|GD-3n%K5~2X4#tP4@bSiw`8W@}J|j9er?{-o+;p+xqpzZGDF0c3yDD zUlFnG&$0M%coff`|8QH61-P}xBHY^lCdIelwq5t&HvI#*?avn6_V;tR?f=(Q?w0=n z@h>TN%iBe4=cNR0%R9K#n~z)GFNtmY-11H#w&l9z6%bo{yXB2g{bbzM=K|c;&&46d zvo&2kZu`x}3yEzze~a6C-HqG!xcEL|+g}ghc71&Xx9h8m|ElS?E!IBv^35x4VD0dDQ*;$eyhava+Hy6Sk`#r4p(YdH0`K4;^$zEf~3cl9%ft=$jg zeYTv4rgw2Qu`RC#xAR&(ZtLrow~*N0e&~ZpPxa>Kraz3> z-rozietWFk#iwX`x4dD*wtw9G&Lp<=n1ow@DaUR7)3`17O5E1h#aAhI)Bjp=A^pMj z^EJfgZvXy{*w)L{HxXNZa`kr-+x}aH+jc*KTf4aUY1Kc6+k9Td?R?|nw~1~0-TmjE z6}$V-Hey?zyZ`)DvAh2q&~L!>0sa94^7`dXACTwI8!*6N05H&CU>2BUAkz%8l0lT@ z8{`9n4F>!3Y+5EA$jq3~rem@}M1w3Ehz+#&@RocE^ZnU3^1i`DgDo0}4IIKGL;QI| zC>-J+FoeP(RyYV7bUJmX`|}F00)O66Y^XnPTAU#Vd;n>`V&tf9Kwe(mfC2o+2AbeO zcs?4OS4R;g6b#~ZU>&9T1L`Or%gT#W{+P zSA3G68#g{0)Oz}d+?jGhUVmsD;BX{vFn$ES)ZN#?!T>Gt1y=$+Pid}oHR_xlVS+Q%c zHHuw(tyS#WYaMat_IgUOYp-V%yY_lcv1_jlid}oXtk|{JtBPHFy{_1`*CxfTz1~sm z+Uq^VuD#w@?AohMv1_kS6ub8NRIzKX&lJ1%+OF8Om-j(Mc8Cj~tMZt36puzj{*o*Q zgFKVB0a0TTDLxyp&x*sHp5WRC$&4M?{YW<$4>CC)Br}4djz{_aX=(eY-y4HukLB$- zJr6qL*@vs0=j6)vn47okV0vmT1Fou=AHVsK;vsuOx}l~b5gVn5ParI`aTJ|qX+tVH z&y7(N4DyKap-@FQ#fS+D{Cq4#lpPSpeAyhH!`pg}c0u-Ih{~TlxgKM2=XvuZ6zm>8 z^2|i{c*H%5lcsct~<5U;LV!J;J(7b9o23M#c z;eBl5A`Oy?W!p5C+5OO76V!G*99O&7*gmiigS;I*5z@a}=v+9^Zx;o9L*VzvUc30ZR1-qA_U2Xe?F&y4e;jMbc zeVpR$fR0Z$ym0Q^*xcmYG|$E&-ftHT!0mcA1h;#d5xCvsOvLS;YBFxm0^Bq0>BM%g zG7GnR#u#q*W*6f&y*t0pC${;z_b*WW6}TwyXCz>Z1ZvR+e~ch@mJio|6jPZx9i`#h;6&v{@btGi{1PWCARk+hgpwx|({bw$5#0L2MYwH`>%SK(cKva_Vt2e;s@V0n%N4u+wNSBJpDT&2eL9XG z)w}Ke4Y6&nTfb$*w!JRCo!HiY1#bJz{Y~wTpH-CGarKaV9d6s>+V4rlu79*BcKhcU zVr!pP+}hzo+?Mb9&*#K8e|P+TLu~8e*5_Nj&-LG*-Y<5GdGmGs`RBy8J#Kw_5!?E@ zpymnCnIUu_Mk4GuEwUbjM&t#u93jVZAr9!y8ml z6_`7gVI=+$mE14+&zm#5iYQ>g+&QyLVwELhVs$0cV|AI5>1D~J1~_OegD#(T^~{vj zO|P%#E$5v(zT-UV&U-&S59VCxZRc_FKJpWB+n?^U85j4Z-2N8L$F2XIh1-3vi$@UK zejBCwiMX|si>Ir825$4eK!qOeE2!u@#~%?{q)(A>&H#J&-$n9r!KySa$C>U@_Xg?$?wN) z{oQ%x0b*OORvLR=Q#&$H!!5A)l1?*-Gac|x4@5XH(t$ejOrUzCy+G9!;ds?Z z#QP1+B7rD3BGu864k{wm>54=$F%s1zDig+8PX!`;!y!^*zx(UGMv0^RvK<9ktF4NT zMA=pA@JMK6Z6q41u$N$<+I}RDJ5#>lz{nn6Dj0{sTLLk@+>kBtkLW03B7S)}6&;lw zDsRM3HoHa%s7)9aXY-2$Y|b@|c1tn*%|?-gjXmdk59u1-Jc<#L9t9(*v<((Z#7AXc zgNbBj6k;%@_nNGUk7`J!68?$Nc!I?yQyGh+iA<260FK%p45J(bRbkUJNX8~_NU=wv z!BKMJScsP6_k@c)3x(?fMJOJqV!JF7MFZ7E{K9nFKcc!eRU0x4WQp-=MK)$QlzmC3 zGNIaJtOz9<7_cl4S2ZL@BmRzwckYN*Ze^W1Y?vK58l?kq!>l#bjE*%}Ck)Fnk?3fY zU=VUxUKLKH#-b`_XPk9@Bzr94pkNnP?WRP$YHV$Mb|4n;k4-Rmt11z%naHx}>aHLY z8Osek@A6*xS#Cz-#WNARU-v8=W^get4A`r#s-4Z7GtsefVn%^xm%zMPKy9j~wmL$+ z=ft&)J!Y`6jX?Is92?cfc#WDWqp3uMzkV75)DropD5Nq$QEfbt06oj3iUS$eE8@M< z^^0x97~he}zD84lVpK(A^7D$G$7<(9YT{L;fkBz3-pj?v ztKq6L!46mEz;Gm*P;;q`S54+;&WrKvalqiS>{-M1B<&TA)7crC7aHflMhx4p31-L5 zB?FOIpe{PDbD5ttvcjKCn4&EL@t;oVmD+c+Y%Rv&d>4ij%y?wSyRmt7fS(kNPRPDi zGtq=VLm=WWiQ4wK?SeVf3A0wMt#zJAxjk1Mn8W+$@LuK-i!y{fH32c|nMGLSh}DXx zc^VM&ws-<#6zTm_t;9byyA!G-d{t+Hy+9~2djhIvF5WBO;h4kOXF^0!9nGYxkVl21%THJrZe*3X`+*a0^YWiQwkc)%h!Tc;9<8e3<+ zYcmnC3k=OTsj~4CJ*#P`A%lQjOxaPB9B{_2nH1nj3O|6&L203*cxV#)*ov|hoiJ5l zN6;jO>PPH~UqOq;nK8Ko0+SG);c8kNCh%LgD`B{Ebz)L=f>$1^L~1A1@)FO!=oFIl z&LENO##IGsCRfo_6WNy-d#5@&neRB6Ct|^Bp0n|G?<4}-A){O zO*A-}RV~euS7diXDl?=oov5--X@yfg%of&m%*(4Gc3Vq5KdN8t&Acp26xB9VMQT$v z@w6;)ThI_-JZ3{6VaIC+n`#1+5#KyDG^?#*V6&ZMvpXUgh}D#$1|B%_ z=&b{4gQbC5|0uo;Q5>jEayP-L6JR45MP5~k(wrHMc~q0+yn~XZ>3}7XaHq^05q-okYs^J6V1zZ#P$N@qukf8y87-^UReNIzexf}v718iqj99qcTsdq=OieWK z+JIfq3hN<9GZl3~tO~zg`97=raqRca* z3Xt3KIUJPE$&r#hWWpRmbif*{E*j2Q*>s%CYN`yehqEs{S>xLTnLtf6R%S1d9s4YU z`vazClQ{F+tFe{T@qj&6TZRa|*Gi`6u7P!qWU69SEH+Sv_-nwuMu}-1zRVnmmw85% z$+&k#Q;{;niezMQmYB#S%1|vw>NGoAInfzsJzgD8%!yC)tS%6p&UOZ(Y-=Vm9aYy} zm}PU$D8WeL-0bTdI>)()n~qV;$3nhYY{VpFwMf*bYwH`rbE7j+C~CxObS8>M=dwu^ zfw}zF`h~TDRQNm>`ln`Nsw?KwTjn-2G|c6nuRiTP*SJ`I8E((5TzrM%t8sfCvs`hL zdXPwdSHBOj{Tsev>bE@le&DiQC`hV{n^~izjLNsqz`Pt*?t`DK5utJ*(s{ zjuYE_=g1pzd%uepC|-oya+kR02o{D5&|f8LS1c#G=Wa9jSTxb=gbxILFUu-4li7ay$nFx;j;Qtskoi0%2G>rZ*Ack>@Y zZ2M=J{4DuM+}3}*+{IIf?YYY=c_nV|ckyguTaTo?PW5vYH_Banh3c=y?K#VD72k~8 z{=E&i_FN@@Nae2nF=Bh};okoov90$j^0#nXKNr7CZ1ZiC|5f#0;I>`=kh}Ot)$d*B zE$1NIrgL#GVw-<&+}iV4xrWVoP&LirWA&3`#=^J~JbKdn-HA8zaah}^|b65D=R zFMkQQ_rI#?-d6mc;*W9L&!5TLRqpC{65ILJZQlV6-uw=dABx-i-TaSK`O&zo?@4kO z4R-fdKCjAM{HE&P!EJp$ zRQ!qJFL2x6uKsJquKrt1|AV~CTyKBugWLKXD0lH8sy|%iN6B4$EU~S}$?^fX?OzuU zRy-89^(vIRcr3BCPpNz+Ztp)|(}mdFDZxp-v|4Z@r z@*iI`(5m9cX#_zJ5x#hmL>|WpBmIvDFhg!Pjku2-yxSu!CUhj_QPucP__U~p| zy5*Pc`Pc00ah7iR9edtwKTB=-eNx-$I#NI1EpM~uKPB~dr&zk>gZBIpQt$h5OSk;1 zJ%5VS_rFH!`@7{lG5+_f0IBuh7E8B$E6e)1ftHm?y}#8-t>5)5-EvcwwSI(<`hIOm z{d;#lbB`_GN9y1AA@%(tNd3EqEZy>>_PqOk!))2@Z%5ecM_Z1w=iPFQEl(!(`%Jf- zWjV*vJwK0S{XXvZi?iiL_PQmOZh3`0znawFv)+~iN&Vf4w!D?p&;QiYEhpRaUs@g{ z_3ys1JYipV%RjNKpW}YsDSQ5$z5c4DTh1Qq|9jluo7PwRFoBSk~`T z-LfvJ<68sE#-!dax7^H@Lr8tU_LgorjAgwK-7Nc%H$Hz->*Zil`+*2s9%awF*N?Sj zcRU(z%dWp6)|Q_p^>b!ey5-p{tA64|%a=+0e7F1>%i0gWOX_@TjXm#{*W0q&ep$6Q%kKSR-sb!1l&1#sv0(#--l$Z*QNGORh6BUyxlsvwqmFhs7eu%)^ymPJMHM`) zD(L%E_^c74xXf=422!Uj(k+MD zvits7Yjs?WS$kfmePg(#TkgfO)`dQ#*6DthZn?ibKfrRJc~3T&(B&%*2BK;p8vCT`_Jmm2H5wDBGqmiPwMY=%M)$c^=oA9=WyGOdq1;o zJF)ifpCYwxKWq82n&Y*>0%WiCf zkExr}J*Dp6&7JJO85aNF?%j0D?%vE%Y}*W}{BQT_W$^n{V_E;5f$Q3{#grO@Q zKtDW#+0eYHJFpX<;d7+mB!0s=T*M`0p35?Vone1W#dMQEuElz6g`2xFgU4r4fR$6q znm|&@qbWjhFCwA&)1$El>#zw)*n<@O3O81F04qs$kLIL|xFF$&Kk9!rse zWAMr|?g8$@Q<#mPp#dpQ!K>hxjeJs%EAl@=(GijO8D1sY_J~J1yvj^_gffUiKo#!w zKrZA(0aQUXbV6qnM&66=rYG4C{V@om@iJb+3arE?Xwrtp2r;e5m!UcM-oQd!hvwX? z2{-57Y#ztKtH-$jg3ua~7>5`nAPJu#1=r!#=Xb$497P(gLv!`L9Y>}yC*Ea}x!y9* z8CQSY_2%X5my1hXoC*87x&{~Jc1$6oN7#$8}RInX?;ZZ6j4JYI=4SZn5$ zV;mPO3-WVw_FeZe#|*CfvXR-y>|}N_2bqJ+N#-PTk-5m+WNtDKnTO0v<|Xry`N;fa zezE{rfGkKBBny#6y!ZI|a+SYT&IhpF<5te;0&xfGV+occ)%;9qPVsh}gLT1!<{&9Y z%u!NO%`sALbWY@8o)Z&JN?$XLoQ~%(3%}r3%;3G3`*P9Of{(Eli6)tp%eW3NH$MY~ zQ4_(?9O1D@z*FqY|H-+8HHYw74CZr|SIqll0zNkDNX^l^37;d`sB@+~DxeCgp*m`! z9vYzuLeUGlXq*dq&<>inSN_V}z0dHvX(sa=zVGuj&Exx5=knddYg6Fn^!<&;87NfD zKfiC*IeyFW^&qsv-O!xB{V^W#I1A13JDLmgv6zo|WN4XzmozVL8Z;-b27W07H-}6R zkH;VuOHe1s?{2a)mSY9J#dm1Jv7sp@o0H@j1XS=FN6G}ej!G3d6d?IRv2sf}uGpy&TL-g{tTbFNOKX;O%7| zDpbc&{1bD1B{9#}mj8x1zZNmCm*)KXH1ix?UN-N5=3=tBmIAnXBteK#@|1+}9?1Yi z;VT@%c{3vi`*m!?c6^Fm*o{5#*cTPXaP~D(Sjj#`F0gH0ga!&LfI=vaAT&ZK{%9`h z_CXw9&;|FRhlwBuV1!8^SK>H+MvL;Cf8Z>9IDH3+@fG~$k$Z5mBKt?YQi<~gT!arL zEAuPkF-$-#rsI(+wC9n6lgNM%>Ll=0XDrQNem3Sna|LUD;CN_WU~zK*cdf@cCsra6 zZ@$H`6(5+*q--<6oO2AuRn}o~bIG>l7~c*fO$6(FB+B!dN&_^)`&fZ=a5!a-R^ChW zMFcM33cOrwA}ELw=#HNF4e8)edqb_0WZ)7sK;mr(LgqQeLs^zK$UL`r8p}Rt&h8<&FNkv}G-I8RT^DgZ;%R~Nn&5-!!xET8@1e*4wL?9Ben5$&nS%R!{(|^O) zQng+&P@U$eFNZ)3WgXj!Zb582=!t%qjhC?sAL68G&N?Xfn7tJ^XT+_Q{U(wzcoFmQ zCRQS;3j1LcszG}UnoGSlg3%AL_!*a=In_0X`arlj)MI)43gYo!nM2*`unSdVcT3(N>4|F8fq?i`kUm=H4#CHc%R&th+N1&wA_TioP*NbiO~I6S+RG$vh`= zdzQn|6CU$(w#8c<7d0p5U978N7{@v~0m-bRav3x$ydtcl#jwsK<>onzV|^TtiHO0s z1=x?_6i!2(#+{(K`NrcD)`4BP4j+CAV%XioPr@bWTGGy;w0j2&Kq_n{(lLLwR?5y`eZ0=qa@(43yp zycZ)e8e@=brt+Rhao&##$d!wJO_W3#G(!l6=jMIE2;Q5=(3SnWJZ{?LXWxtmF#sv1 zMFEbN=!sr<5Cbq4F=$cHuMH^=VgRD?IG#WZhOkct#%cXc9nrl%P6B?r#I-oOR@EM=+_n2Rfe~-)X;UPYA$uMDj?lJ|_ zu%NQvYH|aTuoa(I@%x2LN7)+eUr-VEARPB&SWUKRjKD~Y#RR0);^*U5w#l+6hhWrV z+msZ1hYf6-TeW?@&HM5W>k%UGAVy+5UPak=`T4j5&*2Juh-IDo1bc8u>)#TNv4}9< zQqDgRiq3FzPCmfn2vodII|8%W_U9o5nr}Wf+kc#EK8W>MbEb!wYMhIUm%*IW2*yjO z$U0gHDo&_{V6?=Ii%YDRT}(Gpp1_m1V)nDne1+Fp2Ns}rQTC@;gm-ZnK6tdtWDISw z7$mT+oYOkPF<}`Fn;?z}{Sb-qh(YGLJmXnjjuh6R)40YuBp(IQMn*X6$i0|ueyl*> z4Bn{BdWMZi#3$H|WE{hH=10;$yqGp4(r^WlOZfW`i`_`ZA$)^WMDkgWLoBx72vU)>jQ$K{;1UuJa$Lh_ zxPl>A3Km^LL9+X8S`}i2`=kxpLxNkygj{Ba_9QR`p12@NgWFh9eMQjny zW1u;+Yd0WIG3PRhpf>877NmrjyGUtgI+9(`!$gqsgc(PUM~s<4&ctlvo#tnw2AAClPToxxT3l&qUFhjnv4)|#JKC(mF{WxsDpIgTHYll4#XAwQ~`dr0YG z?jyS)0+E=5SCL>6N!f#BMA!0*A?4$`9J>+uj_38q%y;P@$85ZScr3wX6Tmu`3wcop zMNtw#sEn$pja64@kHKS|>5O}!IdR?G>YAH80Pz{jJ&l#vgw06CUZf(J&t2-FIa-=f zvK3mRE!snKEQg^xdZHg9;pSW(%i|}_1acx`p}Cl!$1J>n*YQ1k2w>gHhI(jLlAs(M#J9Z%r8Su{XHz3s9MP9%qT!k*0w?H@s;R<{RIL|tdTTmP& z&8?)AF}IQB5QIvoiW;b8g30=5h)}de7-F#v-UZHg;O3y7#kM3la{0xx{m7em565vG z8TtIaDa3vXJ2)1|ZgY*K+t^#iHnAM*kccGq;X7~!=kZw;zulyqW*>V7RajT0mU);Q zgnI0Io8fczxiX4%cpT!)i>$XVVX3)DUP2oC((|azzOoKt**C7iCL|)I2=ksJ1DD_x zWqxurLTkigC)}LQu_gKUaC0|%QOq@ua7@H3#Nl6aqWkAW&-g9CJB7ig0=yvzWgTyg z8y6B-4~v=-q?9tHNhxarNvVt~sA+1Gb}$_to_`B;J#h+$imaJJ3S z*liAzatvqT-NHJCVrYQ`{0uiYdq6ST(a4DcD2yT~hN`HJVAMl>G(;0LM;o-q-ROkQ z=wbSj1Mo10A{wI*TRgzq0XG+XY>5ExLwt-+;g#h3!p#vM&z$h5;WJ5P0=$cesu1A4 zh5@u$hhvlp9nA3%Zf^MDJdQ#Nenke(!5hLc0paL{KIo4D7=sCz1#bh}E}}6Wv6zP0 zn2Y&X1n)_aL};Q~T9c1kOA zk(6t=j+W$m%V@>^;x2?E2HTO0H2i`LoIxzd$bIlG@;9Ie+9Mpj z5Q(XnjpbO)e&YjtXD;Pqdq;2f5fZ_^LC$dwDHm}Ko7e})jPh)A_@xH>5$xtzw;yk? zP0K8{Us;7UxVo5sk4U!J0f^twa~we`V%dhC!89|2oQYXjfH*9HSIjS*lwBpbUIecc`*+-q8VE)R=CV#p zEbDXYO1!QOZHjgQ-Zy(WPQ&{uzAy%Lk>qZ?+L=2MgB`(4ztQ*pa&pr&T z`E1)D#T4P9_N|D;(?~KwA7}Fx?#bqT#OJvY`|vGd`79-j&r|=St=U(%!TWrMvTd>7O!l+SBOwRBKfb~hwB)@MuQ=-+`k20?M3!Vf1Mju~ zFAwse5$;4=gkvb8F$*u^T`a*zNaLJEylB?{spK?1{~2UjfR_t-a4X89JSw0fDx*5Q zpV;0Ij$Y`82+TVb;Jt@tr~RJfy_dJlUf%yNa2DrLn)kgNf=~s)rasvcq3DEg^urXq zfJi=*!MMtC`Wh~?%~9UK#Rqk2mlpyxV!-kOz5@AC1t|G$&gi1nm)yUO2{QAlVXlA6D{t z;mRuhKHk59_>%W%A1>e`JpT6l2sBm6I;e|!xW`10L+~PAMGC%00_%3#$!uOE=Rz{g zq?2+jH}4C+1vd0#i+OPoXouA?LGaTnC# zJ(iQa$LUzXHX$ElEv_%-_dtVu9D{MU@d~n@AQ(;H6=oU1=!M-y{Mr;{KZ0h({Q9xY zNE!Ay;@!&Ev4GD`BKa%^Vh|p|U_6i6cmXfrHN;~H(#r99AapqGO8m+;bP8!-a2&y7 zU()A-5x)d@AE3@Dze{|Evi}0xIy&>2gkdP6F%qNkq!~}f;5EF71gynoY{3ukA@Xtn z{X-nf`CR0gLVnXpdCojfzJ%9IJSmH@1n-%3q+I5+lu!BW#Am{4vmeAdKC47*!FD{n zjP@JS_$IJc(F5h1r+`AAOOsiEVQS zy5;xF!M;u=nMB$iNqCjdOTziA?!|hxxkP-_nM4NL-c{`2v)hGpIFFiad-4dMKZE&3+PjO#!kPN}wceMME^kooI%3 z2uCj@uwKYmmN-$7i#RU~i@w-N;|`8`I; z7>vatyoF_0j?c^}J`0(QXYdLZBLN>F30shY1Mse}FUHH*g$!K6L26QtsxHOL?sY7d z-Mc*(hZ02d**=ficmb~=4j-DGeTd$Amu*Rp}x4rI^#nU>&j-NU@yKj`^iH%jkDNt#V_<4`wb+U>!c6S zv>%_uc+9|aco8pS4qnAVEW%2x##*e$2E^uO|ADDUz$&ambYc1d5zTSoacnVbOY-j# zT8i}x31!$WF}n`?5=0NC&j?BQ6d5a6$8Zi;a1GZHxH7=I170%cqzFbkgkvjy+DrQr zUMk0T%w|9HKGJ^Rc#I!$62Ia%WZ*iEvTmj#gMExV!Fng3n{ljDe9hk~qxf4#V;o{|$UM&PJ_b`U4a>0t z>#-4uW)GQ+!#IK;%?0uzn(#MEINREa3fcc{9;A%di+e%*nQmUGj79$YrQAG4DR24j z)2hIIR$K=5(pY|ibn_G~UR>O($g-QKXy=mRUNe^6JVo)#ihJyCJvUELp7)D;-C1_? z6n&gf+~aiAbMq9XtSs*JV%g18^x6l-z1}Rld5RucQ`{TOvYV&q<8}VmyLpOYH~Pm{ zck>iYV_AC{H&4-PEYD=w%~RxU@&CSVo}#a|`tK)m^G1!`R$Qfwo|`A?$=Xp0zRP-+Y&v)}gjb&NyhnpuV{PW@}CHLGsQAvAv|5d{^h-`URiK&iN6h;b!-rsa{g`V3YX3RrjZUM0Y=! zJ9mz!?_2j%WbGH%{S~UqasA_}W6j+DckRTi=gq3mssYt#jlmOm9l8&rL?EZFxE(=g zi@VVo;pl;0rVlB7O$0dsvG@QVVFNaqEu^~-<8vOTAoKkgX)OPO%=cqlWjR}Uzuctc zLot*vrODe-(Nrd-s;N%aLLD?f6VsdwL0fb{7c-fB8Xm`@anN93^oZ%ApCG zp(R4m2JK8oG933pbxEq*O~Mu&#@D!vt0;bu?~4X#gf0lja71GoW?(UvVhcWj>Uwni z&5Qidao8P?)Q`~`)%Yl+ubDtfGp+$k3!~a|X&2--k(B36-U?hpMSfGAlt-)h4IyQi zi6Ui$8A;0HMzwA7gZYV+ljc`a(#_NS5%P?gM#>EH94XJ6*`&N^UMA%g^BO6K%n?$q znF^c>N+nZ;lxn6sDLqYZQXVjQgL%J@-xMUJuqjGP2~&!c(xxmaGfgpzWX(Y;2Z+EnRn9w4Qk$;&n@ElgihRC_D~OoYezGeTHTLZRAQsn7Rm zfX)a*2(K6Y7l;_dLFX3oCf>#@jz!|?NU!JSJQ}C-ay|!F$K&dYFXgA}2qA_1j?f;E z_#ppz{+)|?f8gq>ALVzE9Q-blhGRGZ-4}H=rntY@bG^+iS@@Bcm?*K2C|GJ~QPI;7NDa>ak zuAQg8X3;$?lAoVh7}Zf5k$4CXBMR>RHg})LM%p*x`oYwH5`uV6lyu!@ByEu=k@fxu z4q2Yu%J-DAxDA1(2`Sn5yCjFnOG*Kw`d0}utvt3J^v9D}YTS9J;v6m;k9DL3%9x6zR5hVwPq=<^^(Rcl zbf{k;9-l(@Dl|b0qwxbo;|KJI>R5FxdABSd67ez$)_*xfUCZt6%?`<)cW& zF=XHr)PFBI>0AEKj1$m{fA;|Tna48t!^tPWGJzP#8r} z3{_Db!KjD&Xox0gVICm+A_D#4?(dk)W0`^(cpkIyBIaN&UdMd%1{sG%cngcM6z^j# zQp_LSm#_QrRbwowGuHLVzQ)~$@2+!A;p@-gdCbO(Sd67ujSsOF8_iKN^L_TN9$bBr zS?{k`&7G@fc6E2|dYZ14_Q#V@J@XX2g4eMUtFay%O%k~s0fqP+P!IJHiguWUr|`5< zzqszZSAX~-ylr%EeF9ctH8z?g@)K+~Uz4hXx-obb=Y*kf_x-BwdKy$isQWf`pQdW6 zB^=$*8-3B=3?v`Ma75#AOv3Z#&)S!|@8hrD->G{$GvC*l!15}5h>x)eNoEVV4LjlP zg6R3$MHSVaT%&#(+Ol%gyJr=K_^6FG@djQ z$rV^>J|sWFT5Lp;Q4PMU!#~R7H2jRyIE%kp7w!6g9#}@Z3F`m(7T$XtXAZJ|!FITM ze(#dMp5NX7m9?M9-M<}pg})co@ps47XmO3>4rbv+>_7&tK;va(9w#GfztqFDo&L%= z8N5UPsrxo#vvEBU@koJ}-Ctj*dW%rpg$_`?;p2#f?&pk$yDu)8$Lc@R{hV3*&$8Ah z{#X0cZdTWLv+GVCHCH*2$K)d$qA~77bEA7obw7vdBS#|^s*}uG$EEw(O2FO!leMnd z%g1|xA}EFuD238c{X`_jBNp?KgdO-4$Kmc93C+*%gGlJUkyxl6)7>|cwO&m17!}~I z3%l#Vs>`?ys?Biq8Etv2>v5By>&2hI)d^&$&Dt0v@ECNhP9|doT-|o|qSPQk^&R4_ zH>)o6F{n0FCSw&g;}f_#(XV+dnd?MraGgunyF&3->f9FdI@OhagTGrx+Jbr%arJSk z8|@F(c{ML4!UGG%= zOAWYwVbz=d*>(9krFoxBD^fDobEL3*%zQ_R>ZT+=>Y=F#C*=W5hiY&n0jhV+T-R3n zHhypO7^!-;->bI@rY@(Q`Mr9c={%lDLS7)G$f|=_Rb$vJk zx?f7yK3kz3T-~C(560Eyy6ea(gZ=fms>7{=P_)JXWUjycxBmGkf4z(DGmw{{`wUdG zr+P8fyol=eRQIC#z0CCwH@jY~`*U=?+Fhr0^)l{yt*e`Hb!fW4_DA)=|9`xWkoo$7 zyPoapj2cr@q&g$j7m2R-FNf-kPD0naPvXz6|GWBXcYVUuCH?C@6aRfCv@mYeG3fq4 zUC(#-HM#m-SLf))d*KA*MtzOD?*AKYP>mlHS>8V`+!S&ea&rzYj_eNq~l#^jx7YMPVM(u9(7muW*vJ99VL0i8@|Qo>AEQtmU|NaAxtiwhmV!Qd2l+Vo`Qc}zpr0g>XNcqYfCgp1! zMXEVQ%6H}jDLNI7YKB_$mhIAhL{a>-mF<(l!462P?q$!>CzlH24ZCBG?1N?}u! zlwzg?DWyzlQp%d!NzoX2Qr=V`rIM*aN;Ol1lv<_^DRqs;+G~R5CWH)y#_y2!rUNOR zOlMNUkhv~q1lLAHV_b;FxDZz#Gn>cq9^ClLdwIMc2cfaB zNI7YKB_$napqd-GXs(bNOD8x7+b;T>0i+BxgGhPQ3?XHhi6Ui$8A;0HW(+A$m~o^` zFfpV|G8zL+W|~=~ykK4;WsZ53l(}XeDGN*-DGSXaQr)TEMf%zQ`6 z3G)LfKbe!H{A$ukIc3g}a?V^J<&wEV$~EI7C4g&rlHKGaCAY~-N`6z2l)|PcDH=0J zN|;ills08ax!nYkQr=V`rIOK@2U5+{Af=Y6LrNrcFGord`pR$(x-Z+^Z|3@+Z&qIx zP>#PJ*-cJTa+|!Qx-Eh+6y2U0qj&ZLByuB6;&x{=bu^dhB?=}St4=}*c4 zGmw-)=223Hm|>(unGvLnG>?-q#ymmFI5UBi7&D2K$z}>EQ_XZzo;5Q`nPpxeW${ zK&}fw^`ojAt%6`QMkrKA>gq=$c{~WwaP^{7c|04hA|CG|0j`d84Ud1Xj&uiKPl2l= zJ;>uU{D91Lq!(DuSKhA>Ss2Ak9a0*YCZse+3$#NAbTLnp5?qsQ3;oSN@?kt;29u(( z#6;spxv`@(w%BN>zI2kAOv)59m6Yk`SyE=2S){yRULs|Vd6ks8W*#XEOdKf-%_36X zHt&+M#4ICaxmiKVO0$}j56v1<)|&OCY&40aY&Kg-*=BZ-@~QcZl-(wol)dIlQudpJ zq#QCwNI7a!NjYY|BXxc67o%EVIb&{C@7sztyRtCFMTTjg%gy z7b$&AUs58B#@>+uW*{kp%%h|XF{(|LNoF!BQ_NISrkiI;nQ3N`@`8DZlsQIYn8{qD z8fdA&^*yO%s*qC6)F7pnsYBL9ebbPX#-<4=%}fhYLQE@CTAQ|{v^O0{>0~;S5@x!R za-Zo&N)OYEls={}DG{bWDFe(vQU;kvNf}~>krHJ_kYn+r8Ba=#nMBHDGli6?Mq|f` zYR%;ZqcLsf;8io1lzCYX{9CQglzD{M~waS0}IWs8uKL?vMYo`@!6J21&R2>)s=W`|IAz&~Z^8 zU2s3TV-TLgJbZ+;SZ_9xuFgG~$3G+cet%tiV^VeNL+}jZunu41H{_;cnd{rj9{i8>?cG?;T;D#6<;?Z%8s}Oy?tfJ0eg~Z^s&l6s^v1Z>lWFrz z#|yL>HX_k%CbvLy8f?Q3QzRFcanK1GcP-i+AiqW`j^hXXh@YYPii+m;3nn|_9VFl+ z&OrB@OUXR64^S2rPzhB~4I00&7c|bByAN^~kB>p)ZfG7Pjr-OdEupdBxU|k8O`GnaN~YX;_+l`Fq_D2 z*nv;+8Fu4aXk2JFolIH2zU^bDTU^{kV7j|Pm4&Ym8oLG0ip~h*@ z{5x)(hL${TgLe46d3M}*r;~VI^E2!+$>cs9Fkg|W(7X$0P?uUgX@I6^k1kkgJ|H(> zCv*?wt<>(7Mnlt>lqRMn83N7k@id;nRLq2%-$U~_Y&RNXwI#Zv7y2O*58@#V!Z3`$ zC_IIkm}Ook7eM0>YE0%^sCm=a1FBd8KO$D+FY8s8_Itd?O8#KP>DQHXzsl0^!652!KyvAZO zRwD@~Otq!{abH`Lat}2A>o`n6f>}j=fHn9Sn~;dj<|LVpbI|y9-z{Swi(l|7H1Cdh z*ZHgw1dRuzF=Qnzo8Rc{)c+%Znvd+riCidv!pJ;+bO_5Qpz*mX7W9w1q5J;dgS$_- zU16?I<0(vm#)Zs=JJAlh?^;G;6f}m{Q%Jx%xcjkn5i1+2K;!YXg~sm~X*4e1Q&^28 zxbcbHI0H3rp?(Bz+#KDzEUD1=U%EJ^albSkh{p12i9Z_8>p`CXz45#n7U%bZ8&4#G z$6K+Y#J`X0mBiz(p>dCbOLDCr%b;-t-S|f}IWK97;L`uk@eW$@wNP^x*&2J{#>+_K zvBu1hfHK^7hx%xOW@w4_rYqS8GcXr*Zu|Fffb~)e!HfxnU@o{df*a?fYm|SS4~?_!kF$|Ak9G=1yJd34Rj=R2KJ%BD+H9|8C#pC8_QsyD^_)~v% zoFsRjyT%`B1l{{DzaU+CoJ7ix{&CdWaE_*Nl~mB4jv8#z(i|-@-b^IrJ+qROgXRJ$ zZr+kyxflu>ZG!ynCFMzs#|%7&Tg&@}l5Nn*%qCyP>zIdlvxt;;%=@J5K{CED`$#zp z%|8-Uf&N~MH=2iJHNM6%tf}O;nG`o4NmOO_@kpw|`38321Tx@*SB>Kj=Hei}#uZ$L zuR8rgyqRs#9`~Rc`%HO|eWg5vhmqgscN(UME5_5yKgC!&s^MnNN00%48dh{v-^j1Z;~<#yx+yQIQBs`(W3finGe-LmwK076rzo4pv8?>a*@ZE z;OddTU*fMtj^@}asuh+qP@S;qel?z^YJYFk|FTX*;|;_iHuvw3PvYvpZdTuQvpOzU zcjW4gR8u6bPN<*9dWuNHDT^m7%m<`=Y__nDZNnEx#R;6muO^-J;c?b2(Y(D=FpYIY zHU|17lAEy`$vBEs{EBp3!*$H#vziZ&_qZg2P#)7U1ATZOWiT}Ukj9xX=O4K`xC`IP*-?b$nM(^f%M)H6-UW>EX~R;Z0D-Azx@ zwRaGe$zs5Ig4z>A3ZGG7X*WN$EW3~Aub9?{JGQZ#6@6OkI!L|Ee z;qhxw`#(5S`@aQ`)d!HdA7ClV30Q^I_z)T|_^@{p5+2US*YQ2l@o;{Y@fb8O&i6QthdIZI!dOhi_eh5u@A_fRUo_tJ_t5+Y z;j|5VAq9sJ#Cb=3gmMnh0kbg|kJ5*&d3{~|eHzDi&D-ndwRH3Lw&PeGh7@QHsaTG) zndghr{BpgJ0L@1h%JEL~kcFccqJ#WKkxw8N(-BVp!&8`o>4>aITLeEtb6<|G!u4`o ztLb;M`vG38%XM04KJ{w28=5D|&1V|R)`Gq(7aI%kpeegSl%Tp;}9}% z3E@lmdyuh=WfY;kQyRGg=<`D;#zJ!jYVL+(+30sb5PiIw*Y{@kDa7ZX&jCI2aIYDj zKn&dc3~t=`l6n2}OWkbz_)z+WH8%4EOvD0cUI)$RkPgj16#+N@l$+1NjWh4Yadz`j z-Cmgc`_L8lV;eNCtea;jgX5FtZE3`@B?Kurgk#YB4{n}^aQ5vQH$4T15YB$N7n1NP zH2!=uq_H2?d<$-TSvPLF8=pI#{g=jj4rl+Q@h+3F51L0%^Dwx17u-0ZS?5=X<+}4L zaN}UQ@u4HXTy1dK4u&#P1#1JxtYg3F;XVTuN*0D%>+_rnmiTgS42Kjjg&{& zhGeiAO3H8(P0C|t6e-)x_oV!2ekSD?^BXCXtNBeKWvZD@%ClxBDYMKAq`YM2kn*be zij>3VDk*o=_Nz!rWmA=uyG%DydYE3M^f7sYdEb!F6d1>bzlNkVHcd!rW?GOEVp@^X+O#L7m+3=FUz3M@kTf%WNQp2HlA`|t5ra4^H)FH2 zUq&n@<5@G4ls8RqPTHmDfu494&tbONNhaeYe#1HB1bpx~Ugt3R$wDZKTTso^C8dFBOiEKULkrWIY=;i$h%N}nz37R)CW0J@ zF^I*}=6O~=~7AfzTO=KdrnH{7g zo5SQ0q``-~IiAWeMB_EHk(Ax$22c&=lpITuP!8`rrXfKnz|-9M0ncuEU1~oGZlP5_~AhxqLY^MhNal z1csRrq>MrgzCkK}MmjFT2RHs<8LlY>;t9lH8CKvtd~8CT##Ne+^wP!54;hxX`#F!VINNqNBZBV{6D@S)j8%0BGJ*CvBJg>%M7O8y{@ zkEo8?h(r_~!${0B3&=QZMlw#phv#TZ%|aF0P$B4q2#l)1dyiMl*_!O%QMs01Rk9{( zqYfUyaE!o2yoxxyYgUl5#w3!m!z7b((4>;muQu-wUN>h+9}d)Ey~9=b5E|_FD)|~b z+ITq-Y-W*i9O($G=Qr~$zK$J8Morp!A-D)1K6{t1;|sHol*2fMT8sJn(G(#Vix_Oj zZX8A`?q9;+f(eMh9&?yH3ZH4bl<$Ks2t#l5!B!l`1$fJ7Mq~~K@!Dj5lr%1tGe1$_eid6hy(#b2h4j&45w5w3X zG$W;@=|YB~A7XF?K4hnDo(m1o2(!!rG7bxojO&P@{k{Nk*o#zLg%1^J)7L~Ngkc+<^n|>1(v{$nr$(E}qf1~1|@ zEWlzUz=sY6`2DaNi8zBxs9KQE1x*oAh}W2 zF7%yr#b``~8!vb(kCX8e(s3C+G^9^O?nW5KAO>mX9O=U?^xMl_h{04dos{Rz8>B47 z3YPEjLlho|4-e2s zBo876JCTgTTIQO-M_7Yz;6q#bkiyU#5g3LTtV1Gp!H2T+G2MomsDt+Kp*ej{aX5qP z$W7mV9^^xQ6gQsW@v%lSb>#D#A#f|>lJuCqAL15PR5{3C4N>N-f#He#>MX5faTV_pA08{v5sOIo<}@VaRTW$ z4IeH}C2`<65_xCx{0jOy%~eu-rou|L57b8(?!*1)jsbWCQMkH_f3u!@S2nPW35daT z%);xK2aOx<+Y{i`PGJSFL{sg z1bpbW&u;-K@mPpOcnj}hF_xQkq--#skdkY^Uw*OxN|@V8X=*}9X=~b(9njUhbAX?T z&kr(|I-WbsdxChAK>EI6%)(TT$*2Jza;N!~Cd=RsQ;C!ssDt5n9<$*?tz�EfIo_ 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

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