@mpeggroup/mpeg-sdl-parser 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +337 -0
- package/bun.lock +65 -0
- package/dist/index.js +11829 -0
- package/grammar/sdl.ebnf.grammar +399 -0
- package/grammar/sdl.lezer.grammar +629 -0
- package/index.ts +83 -0
- package/package.json +61 -0
- package/src/analyser/checks/check-array-definition.ts +90 -0
- package/src/analyser/checks/check-array-element-access.ts +31 -0
- package/src/analyser/checks/check-class-declaration.ts +417 -0
- package/src/analyser/checks/check-computed-array-definition.ts +44 -0
- package/src/analyser/checks/check-computed-elementary-type-definition.ts +45 -0
- package/src/analyser/checks/check-elementary-type-definition.ts +167 -0
- package/src/analyser/checks/check-expression-binary.ts +242 -0
- package/src/analyser/checks/check-expression-lengthof.ts +34 -0
- package/src/analyser/checks/check-expression-unary.ts +166 -0
- package/src/analyser/checks/check-identifier.ts +71 -0
- package/src/analyser/checks/check-if-statement.ts +164 -0
- package/src/analyser/checks/check-map-declaration.ts +180 -0
- package/src/analyser/checks/check-map-definition.ts +118 -0
- package/src/analyser/checks/check-number-literal-float.ts +28 -0
- package/src/analyser/checks/check-parameter-list.ts +42 -0
- package/src/analyser/checks/check-specification.ts +53 -0
- package/src/analyser/checks/check-switch-statement.ts +206 -0
- package/src/analyser/checks/check.ts +20 -0
- package/src/analyser/create-sdl-analyser.ts +85 -0
- package/src/analyser/node-handler/abstract-analysis-node-handler.ts +626 -0
- package/src/analyser/node-handler/build-symbol-table-node-handler.ts +649 -0
- package/src/analyser/node-handler/specific-check-node-handler.ts +46 -0
- package/src/analyser/node-handler/validate-scope-node-handler.ts +290 -0
- package/src/analyser/node-handler/validate-type-node-handler.ts +497 -0
- package/src/analyser/sdl-analyser.ts +119 -0
- package/src/analyser/symbol-table.ts +388 -0
- package/src/analyser/util/symbol-table-utils.ts +458 -0
- package/src/analyser/util/type-utils.ts +238 -0
- package/src/ast/build/consume/consume-abstract-node.ts +199 -0
- package/src/ast/build/consume/consume-ast-node.ts +400 -0
- package/src/ast/build/consume/consume-primitive.ts +59 -0
- package/src/ast/build/consume/consume-trivia.ts +96 -0
- package/src/ast/build/consume/consume-white-space-and-missing-errors.ts +27 -0
- package/src/ast/build/node/build-aggregate-output-value.ts +57 -0
- package/src/ast/build/node/build-aligned-modifier.ts +99 -0
- package/src/ast/build/node/build-array-definition.ts +131 -0
- package/src/ast/build/node/build-array-element-access.ts +45 -0
- package/src/ast/build/node/build-base64-string-literal.ts +41 -0
- package/src/ast/build/node/build-binary-expression.ts +113 -0
- package/src/ast/build/node/build-binary-literal.ts +37 -0
- package/src/ast/build/node/build-bit-modifier.ts +86 -0
- package/src/ast/build/node/build-case-clause.ts +101 -0
- package/src/ast/build/node/build-class-declaration.ts +124 -0
- package/src/ast/build/node/build-class-definition.ts +56 -0
- package/src/ast/build/node/build-class-id-range.ts +32 -0
- package/src/ast/build/node/build-class-id.ts +19 -0
- package/src/ast/build/node/build-class-member-access.ts +27 -0
- package/src/ast/build/node/build-compound-statement.ts +33 -0
- package/src/ast/build/node/build-computed-array-definition.ts +53 -0
- package/src/ast/build/node/build-computed-elementary-type-definition.ts +100 -0
- package/src/ast/build/node/build-decimal-literal.ts +15 -0
- package/src/ast/build/node/build-default-clause.ts +76 -0
- package/src/ast/build/node/build-do-statement.ts +71 -0
- package/src/ast/build/node/build-elementary-type-definition.ts +164 -0
- package/src/ast/build/node/build-elementary-type-output-value.ts +25 -0
- package/src/ast/build/node/build-elementary-type.ts +36 -0
- package/src/ast/build/node/build-expandable-modifier.ts +68 -0
- package/src/ast/build/node/build-explicit-array-dimension.ts +37 -0
- package/src/ast/build/node/build-expression-statement.ts +31 -0
- package/src/ast/build/node/build-extended-class-id-range.ts +27 -0
- package/src/ast/build/node/build-extends-modifier.ts +41 -0
- package/src/ast/build/node/build-floating-point-literal.ts +15 -0
- package/src/ast/build/node/build-for-statement.ts +117 -0
- package/src/ast/build/node/build-hexadecimal-literal.ts +38 -0
- package/src/ast/build/node/build-identifier.ts +8 -0
- package/src/ast/build/node/build-if-statement.ts +82 -0
- package/src/ast/build/node/build-implicit-array-dimension.ts +78 -0
- package/src/ast/build/node/build-integer-literal.ts +15 -0
- package/src/ast/build/node/build-length-attribute.ts +48 -0
- package/src/ast/build/node/build-lengthof-expression.ts +45 -0
- package/src/ast/build/node/build-map-declaration.ts +110 -0
- package/src/ast/build/node/build-map-definition.ts +103 -0
- package/src/ast/build/node/build-map-entry.ts +33 -0
- package/src/ast/build/node/build-missing-error.ts +10 -0
- package/src/ast/build/node/build-multiple-character-literal.ts +65 -0
- package/src/ast/build/node/build-parameter-list.ts +50 -0
- package/src/ast/build/node/build-parameter-value-list.ts +54 -0
- package/src/ast/build/node/build-parameter.ts +47 -0
- package/src/ast/build/node/build-partial-array-dimension.ts +55 -0
- package/src/ast/build/node/build-specification.ts +24 -0
- package/src/ast/build/node/build-string-definition.ts +106 -0
- package/src/ast/build/node/build-switch-statement.ts +84 -0
- package/src/ast/build/node/build-token.ts +26 -0
- package/src/ast/build/node/build-unary-expression.ts +109 -0
- package/src/ast/build/node/build-unexpected-error.ts +14 -0
- package/src/ast/build/node/build-utf-string-literal.ts +110 -0
- package/src/ast/build/node/build-while-statement.ts +55 -0
- package/src/ast/build/util/array-dimension-kind-by-token-type-id-map.ts +167 -0
- package/src/ast/build/util/binary-operator-kind-by-token-type-id-map.ts +152 -0
- package/src/ast/build/util/build-context.ts +36 -0
- package/src/ast/build/util/class-id-kind-by-token-type-id-map.ts +160 -0
- package/src/ast/build/util/expression-kind-by-token-type-id-map.ts +168 -0
- package/src/ast/build/util/fetch-node.ts +433 -0
- package/src/ast/build/util/node-kind-by-token-type-id-map.ts +202 -0
- package/src/ast/build/util/statement-kind-by-token-type-id-map.ts +210 -0
- package/src/ast/build/util/string-literal-kind-by-token-type-id-map.ts +162 -0
- package/src/ast/build/util/token-kind-by-token-type-id-map.ts +337 -0
- package/src/ast/build-ast.ts +114 -0
- package/src/ast/node/abstract-array-definition.ts +17 -0
- package/src/ast/node/abstract-array-dimension.ts +20 -0
- package/src/ast/node/abstract-class-id.ts +13 -0
- package/src/ast/node/abstract-composite-node.ts +58 -0
- package/src/ast/node/abstract-elementary-type-definition.ts +29 -0
- package/src/ast/node/abstract-expression.ts +13 -0
- package/src/ast/node/abstract-leaf-node.ts +10 -0
- package/src/ast/node/abstract-node.ts +16 -0
- package/src/ast/node/abstract-statement.ts +13 -0
- package/src/ast/node/aggregate-output-value.ts +28 -0
- package/src/ast/node/aligned-modifier.ts +21 -0
- package/src/ast/node/array-definition.ts +44 -0
- package/src/ast/node/array-element-access.ts +24 -0
- package/src/ast/node/binary-expression.ts +28 -0
- package/src/ast/node/bit-modifier.ts +24 -0
- package/src/ast/node/case-clause.ts +30 -0
- package/src/ast/node/class-declaration.ts +39 -0
- package/src/ast/node/class-definition.ts +23 -0
- package/src/ast/node/class-id-range.ts +17 -0
- package/src/ast/node/class-id.ts +14 -0
- package/src/ast/node/class-member-access.ts +19 -0
- package/src/ast/node/compound-statement.ts +19 -0
- package/src/ast/node/computed-array-definition.ts +26 -0
- package/src/ast/node/computed-elementary-type-definition.ts +34 -0
- package/src/ast/node/default-clause.ts +26 -0
- package/src/ast/node/do-statement.ts +28 -0
- package/src/ast/node/elementary-type-definition.ts +49 -0
- package/src/ast/node/elementary-type-output-value.ts +19 -0
- package/src/ast/node/elementary-type.ts +18 -0
- package/src/ast/node/enum/array-dimension-kind.ts +11 -0
- package/src/ast/node/enum/binary-operator-kind.ts +41 -0
- package/src/ast/node/enum/class-id-kind.ts +12 -0
- package/src/ast/node/enum/elementary-type-kind.ts +13 -0
- package/src/ast/node/enum/expression-kind.ts +11 -0
- package/src/ast/node/enum/node-kind.ts +57 -0
- package/src/ast/node/enum/number-literal-kind.ts +17 -0
- package/src/ast/node/enum/statement-kind.ts +37 -0
- package/src/ast/node/enum/string-literal-kind.ts +13 -0
- package/src/ast/node/enum/string-variable-kind.ts +25 -0
- package/src/ast/node/enum/token-kind.ts +87 -0
- package/src/ast/node/expandable-modifier.ts +21 -0
- package/src/ast/node/explicit-array-dimension.ts +26 -0
- package/src/ast/node/expression-statement.ts +23 -0
- package/src/ast/node/extended-class-id-range.ts +20 -0
- package/src/ast/node/extends-modifier.ts +21 -0
- package/src/ast/node/for-statement.ts +29 -0
- package/src/ast/node/identifier.ts +12 -0
- package/src/ast/node/if-statement.ts +28 -0
- package/src/ast/node/implicit-array-dimension.ts +34 -0
- package/src/ast/node/length-attribute.ts +24 -0
- package/src/ast/node/length-of-expression.ts +21 -0
- package/src/ast/node/map-declaration.ts +34 -0
- package/src/ast/node/map-definition.ts +27 -0
- package/src/ast/node/map-entry.ts +18 -0
- package/src/ast/node/missing-error.ts +9 -0
- package/src/ast/node/number-literal.ts +18 -0
- package/src/ast/node/parameter-list.ts +25 -0
- package/src/ast/node/parameter-value-list.ts +29 -0
- package/src/ast/node/parameter.ts +20 -0
- package/src/ast/node/partial-array-dimension.ts +28 -0
- package/src/ast/node/specification.ts +21 -0
- package/src/ast/node/string-definition.ts +28 -0
- package/src/ast/node/string-literal.ts +21 -0
- package/src/ast/node/switch-statement.ts +32 -0
- package/src/ast/node/token.ts +20 -0
- package/src/ast/node/trivia.ts +13 -0
- package/src/ast/node/unary-expression.ts +31 -0
- package/src/ast/node/unexpected-error.ts +12 -0
- package/src/ast/node/while-statement.ts +26 -0
- package/src/ast/util/types.ts +138 -0
- package/src/ast/visitor/node-handler.ts +15 -0
- package/src/ast/visitor/node-visitor.ts +13 -0
- package/src/ast/visitor/traversing-visitor.ts +69 -0
- package/src/completion/completion-rules.ts +447 -0
- package/src/completion/get-potential-syntactic-tokens.ts +54 -0
- package/src/completion/get-potential-token-type-ids.ts +116 -0
- package/src/completion/hierarchical-map.ts +43 -0
- package/src/completion/rules/abstract-types.ts +174 -0
- package/src/completion/rules/aggregate-output-value-rules.ts +48 -0
- package/src/completion/rules/aligned-modifier-rules.ts +45 -0
- package/src/completion/rules/array-definition-rules.ts +87 -0
- package/src/completion/rules/array-element-access-rules.ts +22 -0
- package/src/completion/rules/assignment-expression-rules.ts +19 -0
- package/src/completion/rules/binary-expression-rules.ts +23 -0
- package/src/completion/rules/bit-modifier-rules.ts +25 -0
- package/src/completion/rules/case-clause-rules.ts +39 -0
- package/src/completion/rules/class-declaration-rules.ts +81 -0
- package/src/completion/rules/class-definition-rules.ts +28 -0
- package/src/completion/rules/class-id-range-rules.ts +17 -0
- package/src/completion/rules/class-id-rules.ts +9 -0
- package/src/completion/rules/class-member-access-rules.ts +7 -0
- package/src/completion/rules/compound-statement-rules.ts +25 -0
- package/src/completion/rules/computed-array-definition-rules.ts +25 -0
- package/src/completion/rules/computed-elementary-type-rules.ts +44 -0
- package/src/completion/rules/default-clause-rules.ts +23 -0
- package/src/completion/rules/do-statement-rules.ts +38 -0
- package/src/completion/rules/elementary-type-definition-rules.ts +62 -0
- package/src/completion/rules/elementary-type-output-value-rules.ts +13 -0
- package/src/completion/rules/elementary-type-rules.ts +18 -0
- package/src/completion/rules/expandable-modifier-rules.ts +21 -0
- package/src/completion/rules/explicit-array-dimension-rules.ts +22 -0
- package/src/completion/rules/expression-statement-rules.ts +22 -0
- package/src/completion/rules/extended-class-id-range-rules.ts +17 -0
- package/src/completion/rules/extends-modifier-rules.ts +17 -0
- package/src/completion/rules/for-statement-rules.ts +51 -0
- package/src/completion/rules/if-statement-rules.ts +42 -0
- package/src/completion/rules/implicit-array-dimension-rules.ts +21 -0
- package/src/completion/rules/length-attribute-rules.ts +19 -0
- package/src/completion/rules/lengthof-expression-rules.ts +23 -0
- package/src/completion/rules/map-declaration-rules.ts +45 -0
- package/src/completion/rules/map-definition-rules.ts +46 -0
- package/src/completion/rules/map-entry-rules.ts +17 -0
- package/src/completion/rules/parameter-list-rules.ts +21 -0
- package/src/completion/rules/parameter-rules.ts +17 -0
- package/src/completion/rules/parameter-value-list-rules.ts +27 -0
- package/src/completion/rules/partial-array-dimension-rules.ts +33 -0
- package/src/completion/rules/specification-rules.ts +37 -0
- package/src/completion/rules/string-definition-rules.ts +103 -0
- package/src/completion/rules/switch-statement-rules.ts +50 -0
- package/src/completion/rules/unary-expression-rules.ts +41 -0
- package/src/completion/rules/utf-string-literal-rules.ts +17 -0
- package/src/completion/rules/while-statement-rules.ts +38 -0
- package/src/lezer/context-tracker.ts +45 -0
- package/src/lezer/create-sdl-parser.ts +88 -0
- package/src/lezer/create-syntax-error-from-text-and-cursor.ts +110 -0
- package/src/lezer/create-syntax-error-from-text-and-position.ts +36 -0
- package/src/lezer/parser.terms.ts +129 -0
- package/src/lezer/parser.ts +63 -0
- package/src/lezer/props/fold-node-prop-source.ts +27 -0
- package/src/lezer/props/primitive-node-prop-source.ts +19 -0
- package/src/lezer/props/style-tags-node-prop-source.ts +188 -0
- package/src/lezer/props/syntactic-token-node-prop-source.ts +298 -0
- package/src/lezer/sdl-string-input.ts +46 -0
- package/src/location.ts +13 -0
- package/src/parse-helper.ts +93 -0
- package/src/prettier/prettier-plugin-sdl.ts +89 -0
- package/src/prettier/print-abstract-array-dimension.ts +84 -0
- package/src/prettier/print-abstract-class-id.ts +53 -0
- package/src/prettier/print-abstract-expression.ts +168 -0
- package/src/prettier/print-abstract-node.ts +224 -0
- package/src/prettier/print-abstract-statement.ts +124 -0
- package/src/prettier/print-aggregate-output-value.ts +35 -0
- package/src/prettier/print-aligned-modifier.ts +50 -0
- package/src/prettier/print-array-definition.ts +95 -0
- package/src/prettier/print-array-element-access.ts +14 -0
- package/src/prettier/print-bit-modifier.ts +48 -0
- package/src/prettier/print-case-clause.ts +58 -0
- package/src/prettier/print-class-declaration.ts +99 -0
- package/src/prettier/print-class-definition.ts +44 -0
- package/src/prettier/print-class-member-access.ts +13 -0
- package/src/prettier/print-computed-array-definition.ts +33 -0
- package/src/prettier/print-computed-elementary-type-definition.ts +60 -0
- package/src/prettier/print-default-clause.ts +39 -0
- package/src/prettier/print-do-statement.ts +31 -0
- package/src/prettier/print-elementary-type-definition.ts +108 -0
- package/src/prettier/print-elementary-type-output-value.ts +13 -0
- package/src/prettier/print-elementary-type.ts +28 -0
- package/src/prettier/print-expandable-modifier.ts +41 -0
- package/src/prettier/print-extends-modifier.ts +29 -0
- package/src/prettier/print-for-statement.ts +64 -0
- package/src/prettier/print-identifier.ts +10 -0
- package/src/prettier/print-if-statement.ts +76 -0
- package/src/prettier/print-length-attribute.ts +14 -0
- package/src/prettier/print-map-declaration.ts +75 -0
- package/src/prettier/print-map-definition.ts +67 -0
- package/src/prettier/print-map-entry.ts +22 -0
- package/src/prettier/print-number-literal.ts +84 -0
- package/src/prettier/print-parameter-list.ts +20 -0
- package/src/prettier/print-parameter-value-list.ts +20 -0
- package/src/prettier/print-parameter.ts +34 -0
- package/src/prettier/print-specification.ts +51 -0
- package/src/prettier/print-string-definition.ts +114 -0
- package/src/prettier/print-string-literal.ts +57 -0
- package/src/prettier/print-switch-statement.ts +46 -0
- package/src/prettier/print-token.ts +7 -0
- package/src/prettier/print-unexpected-error.ts +10 -0
- package/src/prettier/print-while-statement.ts +26 -0
- package/src/prettier/util/print-utils.ts +607 -0
- package/src/prettier/util/types.ts +40 -0
- package/src/scanner-error.ts +65 -0
- package/src/util/location-utils.ts +16 -0
- package/src/util/logger.ts +165 -0
- package/tests/analyser/create-sdl-analyser.test.ts +54 -0
- package/tests/analyser/get-sdl-analyser-test-scenarios.ts +80 -0
- package/tests/analyser/sdl-analyser-scenarios.test.ts +67 -0
- package/tests/analyser/semantic-error-scenarios.test.ts +40 -0
- package/tests/analyser/symbol-table.test.ts +188 -0
- package/tests/analyser/test-cases/array_definition.txt +50 -0
- package/tests/analyser/test-cases/class_declaration.txt +112 -0
- package/tests/analyser/test-cases/class_definition.txt +60 -0
- package/tests/analyser/test-cases/compound_statement.txt +63 -0
- package/tests/analyser/test-cases/computed_array_definition.txt +12 -0
- package/tests/analyser/test-cases/computed_elementary_type_definition.txt +39 -0
- package/tests/analyser/test-cases/do_statement.txt +16 -0
- package/tests/analyser/test-cases/elementary_type_definition.txt +58 -0
- package/tests/analyser/test-cases/expression.txt +159 -0
- package/tests/analyser/test-cases/for_statement.txt +55 -0
- package/tests/analyser/test-cases/if_statement.txt +57 -0
- package/tests/analyser/test-cases/map_declaration.txt +89 -0
- package/tests/analyser/test-cases/map_definition.txt +35 -0
- package/tests/analyser/test-cases/number_literal.txt +31 -0
- package/tests/analyser/test-cases/parameter_list.txt +16 -0
- package/tests/analyser/test-cases/scopes.txt +239 -0
- package/tests/analyser/test-cases/specification.txt +28 -0
- package/tests/analyser/test-cases/string_definition.txt +40 -0
- package/tests/analyser/test-cases/switch_statement.txt +96 -0
- package/tests/analyser/test-cases/while_statement.txt +16 -0
- package/tests/analyser/util/symbol-table-utils.test.ts +65 -0
- package/tests/ast/__snapshots__/build-ast.test.ts.snap +38897 -0
- package/tests/ast/build-ast.test.ts +463 -0
- package/tests/ast/visitor/traversing-visitor.test.ts +36 -0
- package/tests/completion/get-potential-syntactic-tokens.test.ts +89 -0
- package/tests/completion/get-potential-token-type-ids.test.ts +76 -0
- package/tests/completion/test-potential-syntactic-tokens-scenario.ts +24 -0
- package/tests/completion/test-potential-token-type-ids-scenario.ts +33 -0
- package/tests/fixtures/history-recording-node-handler.ts +232 -0
- package/tests/lezer/create-parse-error-from-text-and-position.test.ts +129 -0
- package/tests/lezer/create-sdl-parser.test.ts +15 -0
- package/tests/lezer/sdl-parser-scenarios.test.ts +24 -0
- package/tests/lezer/sdl-string-input.test.ts +12 -0
- package/tests/lezer/syntax-error-scenarios.test.ts +114 -0
- package/tests/lezer/test-cases/array_definition.txt +109 -0
- package/tests/lezer/test-cases/class_declaration.txt +141 -0
- package/tests/lezer/test-cases/class_definition.txt +89 -0
- package/tests/lezer/test-cases/comment.txt +335 -0
- package/tests/lezer/test-cases/compound_statement.txt +109 -0
- package/tests/lezer/test-cases/computed_array_definition.txt +33 -0
- package/tests/lezer/test-cases/computed_elementary_type_definition.txt +59 -0
- package/tests/lezer/test-cases/do_statement.txt +48 -0
- package/tests/lezer/test-cases/elementary_type_definition.txt +158 -0
- package/tests/lezer/test-cases/expression.txt +1203 -0
- package/tests/lezer/test-cases/for_statement.txt +183 -0
- package/tests/lezer/test-cases/if_statement.txt +183 -0
- package/tests/lezer/test-cases/invalid.txt +97 -0
- package/tests/lezer/test-cases/map_declaration.txt +152 -0
- package/tests/lezer/test-cases/map_definition.txt +59 -0
- package/tests/lezer/test-cases/number_literal.txt +273 -0
- package/tests/lezer/test-cases/specification.txt +38 -0
- package/tests/lezer/test-cases/string_definition.txt +263 -0
- package/tests/lezer/test-cases/string_literal.txt +303 -0
- package/tests/lezer/test-cases/switch_statement.txt +407 -0
- package/tests/lezer/test-cases/while_statement.txt +45 -0
- package/tests/parse-helper.test.ts +361 -0
- package/tests/prettier/__snapshots__/prettier-plugin-sdl.test.ts.snap +127 -0
- package/tests/prettier/prettier-plugin-sdl.test.ts +58 -0
- package/tests/prettier/print-array.test.ts +29 -0
- package/tests/prettier/print-class.test.ts +15 -0
- package/tests/prettier/print-do.test.ts +25 -0
- package/tests/prettier/print-elementary-type.test.ts +62 -0
- package/tests/prettier/print-error.test.ts +40 -0
- package/tests/prettier/print-expression.test.ts +17 -0
- package/tests/prettier/print-for.test.ts +23 -0
- package/tests/prettier/print-if.test.ts +71 -0
- package/tests/prettier/print-number-literal.test.ts +28 -0
- package/tests/prettier/print-specification.test.ts +54 -0
- package/tests/prettier/print-string.test.ts +36 -0
- package/tests/prettier/print-switch.test.ts +69 -0
- package/tests/prettier/print-while.test.ts +23 -0
- package/tests/prettier/test-prettier-scenario.ts +41 -0
- package/tests/prettier/util/print-utils.test.ts +665 -0
- package/tests/prettier/util/types.test.ts +38 -0
- package/tests/sample-specifications/invalid.sdl +24 -0
- package/tests/sample-specifications/prettified-invalid.sdl +28 -0
- package/tests/sample-specifications/prettified-various-elements-narrow.sdl +97 -0
- package/tests/sample-specifications/prettified-various-elements.sdl +90 -0
- package/tests/sample-specifications/sample.sdl +24 -0
- package/tests/sample-specifications/various-elements.sdl +88 -0
- package/tests/util/logger.test.ts +36 -0
- package/tsconfig.json +29 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
OneToManyList,
|
|
3
|
+
RequiredNode,
|
|
4
|
+
ZeroToManyList,
|
|
5
|
+
} from "../util/types.ts";
|
|
6
|
+
import { AbstractCompositeNode } from "./abstract-composite-node.ts";
|
|
7
|
+
import type { AbstractExpression } from "./abstract-expression.ts";
|
|
8
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
9
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
10
|
+
import type { Identifier } from "./identifier.ts";
|
|
11
|
+
import type { NumberLiteral } from "./number-literal.ts";
|
|
12
|
+
import type { Token } from "./token.ts";
|
|
13
|
+
|
|
14
|
+
export class ParameterValueList extends AbstractCompositeNode {
|
|
15
|
+
constructor(
|
|
16
|
+
public readonly openParenthesisPunctuator: RequiredNode<Token>,
|
|
17
|
+
public readonly values: OneToManyList<
|
|
18
|
+
AbstractExpression | Identifier | NumberLiteral
|
|
19
|
+
>,
|
|
20
|
+
public readonly commaPunctuators: ZeroToManyList<Token>,
|
|
21
|
+
public readonly closeParenthesisPunctuator: RequiredNode<Token>,
|
|
22
|
+
children: Array<AbstractNode>,
|
|
23
|
+
) {
|
|
24
|
+
super(
|
|
25
|
+
NodeKind.PARAMETER_VALUE_LIST,
|
|
26
|
+
children,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { OptionalNode, RequiredNode } from "../util/types.ts";
|
|
2
|
+
import { AbstractCompositeNode } from "./abstract-composite-node.ts";
|
|
3
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
4
|
+
import type { ElementaryType } from "./elementary-type.ts";
|
|
5
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
6
|
+
import type { Identifier } from "./identifier.ts";
|
|
7
|
+
|
|
8
|
+
export class Parameter extends AbstractCompositeNode {
|
|
9
|
+
constructor(
|
|
10
|
+
public readonly classIdentifier: OptionalNode<Identifier>,
|
|
11
|
+
public readonly elementaryType: OptionalNode<ElementaryType>,
|
|
12
|
+
public readonly identifier: RequiredNode<Identifier>,
|
|
13
|
+
children: Array<AbstractNode>,
|
|
14
|
+
) {
|
|
15
|
+
super(
|
|
16
|
+
NodeKind.PARAMETER,
|
|
17
|
+
children,
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { RequiredNode } from "../util/types.ts";
|
|
2
|
+
import { AbstractArrayDimension } from "./abstract-array-dimension.ts";
|
|
3
|
+
import type { AbstractExpression } from "./abstract-expression.ts";
|
|
4
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
5
|
+
import { ArrayDimensionKind } from "./enum/array-dimension-kind.ts";
|
|
6
|
+
import type { Identifier } from "./identifier.ts";
|
|
7
|
+
import type { NumberLiteral } from "./number-literal.ts";
|
|
8
|
+
import type { Token } from "./token.ts";
|
|
9
|
+
|
|
10
|
+
export class PartialArrayDimension extends AbstractArrayDimension {
|
|
11
|
+
constructor(
|
|
12
|
+
openBracketPunctuator: RequiredNode<Token>,
|
|
13
|
+
public readonly innerOpenBracketPunctuator: RequiredNode<Token>,
|
|
14
|
+
public readonly index: RequiredNode<
|
|
15
|
+
AbstractExpression | Identifier | NumberLiteral
|
|
16
|
+
>,
|
|
17
|
+
public readonly innerCloseBracketPunctuator: RequiredNode<Token>,
|
|
18
|
+
closeBracketPunctuator: RequiredNode<Token>,
|
|
19
|
+
children: Array<AbstractNode>,
|
|
20
|
+
) {
|
|
21
|
+
super(
|
|
22
|
+
ArrayDimensionKind.PARTIAL,
|
|
23
|
+
openBracketPunctuator,
|
|
24
|
+
closeBracketPunctuator,
|
|
25
|
+
children,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AbstractCompositeNode } from "./abstract-composite-node.ts";
|
|
2
|
+
import type { ClassDeclaration } from "./class-declaration.ts";
|
|
3
|
+
import type { ComputedElementaryTypeDefinition } from "./computed-elementary-type-definition.ts";
|
|
4
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
5
|
+
import type { MapDeclaration } from "./map-declaration.ts";
|
|
6
|
+
import type { ZeroToManyList } from "../util/types.ts";
|
|
7
|
+
|
|
8
|
+
export class Specification extends AbstractCompositeNode {
|
|
9
|
+
constructor(
|
|
10
|
+
globals: ZeroToManyList<
|
|
11
|
+
| ComputedElementaryTypeDefinition
|
|
12
|
+
| MapDeclaration
|
|
13
|
+
| ClassDeclaration
|
|
14
|
+
>,
|
|
15
|
+
) {
|
|
16
|
+
super(
|
|
17
|
+
NodeKind.SPECIFICATION,
|
|
18
|
+
globals,
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { OptionalNode, RequiredNode } from "../util/types.ts";
|
|
2
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
3
|
+
import { AbstractStatement } from "./abstract-statement.ts";
|
|
4
|
+
import type { AlignedModifier } from "./aligned-modifier.ts";
|
|
5
|
+
import { StatementKind } from "./enum/statement-kind.ts";
|
|
6
|
+
import type { Identifier } from "./identifier.ts";
|
|
7
|
+
import type { StringLiteral } from "./string-literal.ts";
|
|
8
|
+
import type { Token } from "./token.ts";
|
|
9
|
+
|
|
10
|
+
export class StringDefinition extends AbstractStatement {
|
|
11
|
+
constructor(
|
|
12
|
+
public readonly reservedKeyword: OptionalNode<Token>,
|
|
13
|
+
public readonly legacyKeyword: OptionalNode<Token>,
|
|
14
|
+
public readonly constKeyword: OptionalNode<Token>,
|
|
15
|
+
public readonly alignedModifier: OptionalNode<AlignedModifier>,
|
|
16
|
+
public readonly stringVariableKindToken: RequiredNode<Token>,
|
|
17
|
+
public readonly identifier: RequiredNode<Identifier>,
|
|
18
|
+
public readonly assignmentPunctuator: OptionalNode<Token>,
|
|
19
|
+
public readonly stringLiteral: OptionalNode<StringLiteral>,
|
|
20
|
+
public readonly semicolonPunctuator: RequiredNode<Token>,
|
|
21
|
+
children: Array<AbstractNode>,
|
|
22
|
+
) {
|
|
23
|
+
super(
|
|
24
|
+
StatementKind.STRING_DEFINITION,
|
|
25
|
+
children,
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { OneToManyList } from "../util/types.ts";
|
|
2
|
+
import { AbstractCompositeNode } from "./abstract-composite-node.ts";
|
|
3
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
4
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
5
|
+
import { StringLiteralKind } from "./enum/string-literal-kind.ts";
|
|
6
|
+
import type { Token } from "./token.ts";
|
|
7
|
+
|
|
8
|
+
export class StringLiteral extends AbstractCompositeNode {
|
|
9
|
+
constructor(
|
|
10
|
+
public readonly stringLiteralKind: StringLiteralKind,
|
|
11
|
+
public readonly value: string,
|
|
12
|
+
// an array to support multiple concatenated string literal tokens
|
|
13
|
+
public readonly literals: OneToManyList<Token>,
|
|
14
|
+
children: Array<AbstractNode>,
|
|
15
|
+
) {
|
|
16
|
+
super(
|
|
17
|
+
NodeKind.STRING_LITERAL,
|
|
18
|
+
children,
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AbstractExpression } from "./abstract-expression.ts";
|
|
2
|
+
import { AbstractStatement } from "./abstract-statement.ts";
|
|
3
|
+
import { StatementKind } from "./enum/statement-kind.ts";
|
|
4
|
+
import type { Identifier } from "./identifier.ts";
|
|
5
|
+
import type { NumberLiteral } from "./number-literal.ts";
|
|
6
|
+
import type { CaseClause } from "./case-clause.ts";
|
|
7
|
+
import type { DefaultClause } from "./default-clause.ts";
|
|
8
|
+
import type {
|
|
9
|
+
OptionalNode,
|
|
10
|
+
RequiredNode,
|
|
11
|
+
ZeroToManyList,
|
|
12
|
+
} from "../util/types.ts";
|
|
13
|
+
import type { Token } from "./token.ts";
|
|
14
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
15
|
+
|
|
16
|
+
export class SwitchStatement extends AbstractStatement {
|
|
17
|
+
constructor(
|
|
18
|
+
public readonly switchKeyword: RequiredNode<Token>,
|
|
19
|
+
public readonly openParenthesisPunctuator: RequiredNode<Token>,
|
|
20
|
+
public readonly expression: RequiredNode<
|
|
21
|
+
AbstractExpression | Identifier | NumberLiteral
|
|
22
|
+
>,
|
|
23
|
+
public readonly closeParenthesisPunctuator: RequiredNode<Token>,
|
|
24
|
+
public readonly openBracePunctuator: RequiredNode<Token>,
|
|
25
|
+
public readonly caseClauses: ZeroToManyList<CaseClause>,
|
|
26
|
+
public readonly defaultClause: OptionalNode<DefaultClause>,
|
|
27
|
+
public readonly closeBracePunctuator: RequiredNode<Token>,
|
|
28
|
+
children: Array<AbstractNode>,
|
|
29
|
+
) {
|
|
30
|
+
super(StatementKind.SWITCH, children);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { Location } from "../../location.ts";
|
|
2
|
+
import { AbstractLeafNode } from "./abstract-leaf-node.ts";
|
|
3
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
4
|
+
import type { TokenKind } from "./enum/token-kind.ts";
|
|
5
|
+
|
|
6
|
+
export class Token extends AbstractLeafNode {
|
|
7
|
+
constructor(
|
|
8
|
+
public readonly tokenKind: TokenKind,
|
|
9
|
+
public readonly text: string,
|
|
10
|
+
private readonly location: Location,
|
|
11
|
+
) {
|
|
12
|
+
super(
|
|
13
|
+
NodeKind.TOKEN,
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
getLocation(): Location {
|
|
18
|
+
return this.location;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Location } from "../../location.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Represents a parsed trivia item.
|
|
5
|
+
*
|
|
6
|
+
* @interface Trivia
|
|
7
|
+
* @property {string} text - The text content of the trivia.
|
|
8
|
+
* @property {Location} location - The location of the trivia.
|
|
9
|
+
*/
|
|
10
|
+
export interface Trivia {
|
|
11
|
+
readonly text: string;
|
|
12
|
+
readonly location: Location;
|
|
13
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { OptionalNode, RequiredNode } from "../util/types.ts";
|
|
2
|
+
import { AbstractExpression } from "./abstract-expression.ts";
|
|
3
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
4
|
+
import type { ArrayElementAccess } from "./array-element-access.ts";
|
|
5
|
+
import type { ClassMemberAccess } from "./class-member-access.ts";
|
|
6
|
+
import { ExpressionKind } from "./enum/expression-kind.ts";
|
|
7
|
+
import type { Identifier } from "./identifier.ts";
|
|
8
|
+
import type { NumberLiteral } from "./number-literal.ts";
|
|
9
|
+
import type { Token } from "./token.ts";
|
|
10
|
+
|
|
11
|
+
export class UnaryExpression extends AbstractExpression {
|
|
12
|
+
constructor(
|
|
13
|
+
public readonly unaryOperator: OptionalNode<Token>,
|
|
14
|
+
public readonly openParenthesisPunctuator: OptionalNode<Token>,
|
|
15
|
+
public readonly operand: RequiredNode<
|
|
16
|
+
| AbstractExpression
|
|
17
|
+
| Identifier
|
|
18
|
+
| NumberLiteral
|
|
19
|
+
>,
|
|
20
|
+
public readonly closeParenthesisPunctuator: OptionalNode<Token>,
|
|
21
|
+
public readonly arrayElementAccess: OptionalNode<ArrayElementAccess>,
|
|
22
|
+
public readonly classMemberAccess: OptionalNode<ClassMemberAccess>,
|
|
23
|
+
public readonly postfixOperator: OptionalNode<Token>,
|
|
24
|
+
children: Array<AbstractNode>,
|
|
25
|
+
) {
|
|
26
|
+
super(
|
|
27
|
+
ExpressionKind.UNARY,
|
|
28
|
+
children,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RequiredNode } from "../util/types.ts";
|
|
2
|
+
import { AbstractCompositeNode } from "./abstract-composite-node.ts";
|
|
3
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
4
|
+
import { NodeKind } from "./enum/node-kind.ts";
|
|
5
|
+
|
|
6
|
+
export class UnexpectedError extends AbstractCompositeNode {
|
|
7
|
+
constructor(
|
|
8
|
+
public readonly unexpectedToken: RequiredNode<AbstractNode>,
|
|
9
|
+
) {
|
|
10
|
+
super(NodeKind.UNEXPECTED_ERROR, [unexpectedToken]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RequiredNode } from "../util/types.ts";
|
|
2
|
+
import type { AbstractExpression } from "./abstract-expression.ts";
|
|
3
|
+
import type { AbstractNode } from "./abstract-node.ts";
|
|
4
|
+
import { AbstractStatement } from "./abstract-statement.ts";
|
|
5
|
+
import { StatementKind } from "./enum/statement-kind.ts";
|
|
6
|
+
import type { Identifier } from "./identifier.ts";
|
|
7
|
+
import type { NumberLiteral } from "./number-literal.ts";
|
|
8
|
+
import type { Token } from "./token.ts";
|
|
9
|
+
|
|
10
|
+
export class WhileStatement extends AbstractStatement {
|
|
11
|
+
constructor(
|
|
12
|
+
public readonly whileKeyword: RequiredNode<Token>,
|
|
13
|
+
public readonly openParenthesisPunctuator: RequiredNode<Token>,
|
|
14
|
+
public readonly condition: RequiredNode<
|
|
15
|
+
AbstractExpression | Identifier | NumberLiteral
|
|
16
|
+
>,
|
|
17
|
+
public readonly closeParenthesisPunctuator: RequiredNode<Token>,
|
|
18
|
+
public readonly statement: RequiredNode<AbstractStatement>,
|
|
19
|
+
children: Array<AbstractNode>,
|
|
20
|
+
) {
|
|
21
|
+
super(
|
|
22
|
+
StatementKind.WHILE,
|
|
23
|
+
children,
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import type { AbstractCompositeNode } from "../node/abstract-composite-node.ts";
|
|
2
|
+
import type { AbstractNode } from "../node/abstract-node.ts";
|
|
3
|
+
import type { AbstractStatement } from "../node/abstract-statement.ts";
|
|
4
|
+
import type { ComputedElementaryTypeDefinition } from "../node/computed-elementary-type-definition.ts";
|
|
5
|
+
import type { Identifier } from "../node/identifier.ts";
|
|
6
|
+
import { NodeKind } from "../node/enum/node-kind.ts";
|
|
7
|
+
import { TokenKind } from "../node/enum/token-kind.ts";
|
|
8
|
+
import type { MissingError } from "../node/missing-error.ts";
|
|
9
|
+
import type { Token } from "../node/token.ts";
|
|
10
|
+
import type { UnexpectedError } from "../node/unexpected-error.ts";
|
|
11
|
+
import { StatementKind } from "../node/enum/statement-kind.ts";
|
|
12
|
+
import type { ElementaryType } from "../node/elementary-type.ts";
|
|
13
|
+
import type { AbstractExpression } from "../node/abstract-expression.ts";
|
|
14
|
+
import type { ExpandableModifier } from "../node/expandable-modifier.ts";
|
|
15
|
+
import type { DefaultClause } from "../node/default-clause.ts";
|
|
16
|
+
import type { NumberLiteral } from "../node/number-literal.ts";
|
|
17
|
+
import type { CaseClause } from "../node/case-clause.ts";
|
|
18
|
+
import type { ExtendsModifier } from "../node/extends-modifier.ts";
|
|
19
|
+
import type { AlignedModifier } from "../node/aligned-modifier.ts";
|
|
20
|
+
import type { BitModifier } from "../node/bit-modifier.ts";
|
|
21
|
+
import { ExpressionKind } from "../node/enum/expression-kind.ts";
|
|
22
|
+
|
|
23
|
+
export type OptionalNode<T> = T | UnexpectedError | undefined;
|
|
24
|
+
|
|
25
|
+
export type RequiredNode<T> = T | MissingError | UnexpectedError;
|
|
26
|
+
|
|
27
|
+
export type ZeroToManyList<T> = Array<T | UnexpectedError>;
|
|
28
|
+
|
|
29
|
+
export type OneToManyList<T> = Array<T | MissingError | UnexpectedError>;
|
|
30
|
+
|
|
31
|
+
export function isCompositeNode(
|
|
32
|
+
node: AbstractNode | undefined,
|
|
33
|
+
): node is AbstractCompositeNode {
|
|
34
|
+
return node?.isComposite === true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function isToken(
|
|
38
|
+
node: AbstractNode | undefined,
|
|
39
|
+
): node is Token {
|
|
40
|
+
return node?.nodeKind === NodeKind.TOKEN;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function isUnexpectedError(
|
|
44
|
+
node: AbstractNode | undefined,
|
|
45
|
+
): node is UnexpectedError {
|
|
46
|
+
return node?.nodeKind === NodeKind.UNEXPECTED_ERROR;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export function isMissingError(
|
|
50
|
+
node: AbstractNode | undefined,
|
|
51
|
+
): node is MissingError {
|
|
52
|
+
return node?.nodeKind === NodeKind.TOKEN &&
|
|
53
|
+
((node as Token).tokenKind === TokenKind.ERROR_MISSING_TOKEN);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function isStatement(
|
|
57
|
+
node: AbstractNode | undefined,
|
|
58
|
+
): node is AbstractStatement {
|
|
59
|
+
return node?.nodeKind === NodeKind.STATEMENT &&
|
|
60
|
+
(Object.values(StatementKind) as number[]).includes(
|
|
61
|
+
(node as AbstractStatement).statementKind,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function isIdentifier(
|
|
66
|
+
node: AbstractNode | undefined,
|
|
67
|
+
): node is Identifier {
|
|
68
|
+
return node?.nodeKind === NodeKind.IDENTIFIER;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export function isElementaryType(
|
|
72
|
+
node: AbstractNode | undefined,
|
|
73
|
+
): node is ElementaryType {
|
|
74
|
+
return node?.nodeKind === NodeKind.ELEMENTARY_TYPE;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export function isAbstractExpression(
|
|
78
|
+
node: AbstractNode | undefined,
|
|
79
|
+
): node is AbstractExpression {
|
|
80
|
+
return node?.nodeKind === NodeKind.EXPRESSION;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function isUnaryExpression(
|
|
84
|
+
node: AbstractNode | undefined,
|
|
85
|
+
): node is AbstractExpression {
|
|
86
|
+
return (node?.nodeKind === NodeKind.EXPRESSION) &&
|
|
87
|
+
(node as AbstractExpression).expressionKind === ExpressionKind.UNARY;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export function isNumberLiteral(
|
|
91
|
+
node: AbstractNode | undefined,
|
|
92
|
+
): node is NumberLiteral {
|
|
93
|
+
return node?.nodeKind === NodeKind.NUMBER_LITERAL;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export function isComputedElementaryTypeDefinition(
|
|
97
|
+
node: AbstractNode | undefined,
|
|
98
|
+
): node is ComputedElementaryTypeDefinition {
|
|
99
|
+
return node?.nodeKind === NodeKind.STATEMENT &&
|
|
100
|
+
(node as AbstractStatement).statementKind ===
|
|
101
|
+
StatementKind.COMPUTED_ELEMENTARY_TYPE_DEFINITION;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export function isExpandableModifier(
|
|
105
|
+
node: AbstractNode | undefined,
|
|
106
|
+
): node is ExpandableModifier {
|
|
107
|
+
return node?.nodeKind === NodeKind.EXPANDABLE_MODIFIER;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function isAlignedModifier(
|
|
111
|
+
node: AbstractNode | undefined,
|
|
112
|
+
): node is AlignedModifier {
|
|
113
|
+
return node?.nodeKind === NodeKind.ALIGNED_MODIFIER;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
export function isExtendsModifier(
|
|
117
|
+
node: AbstractNode | undefined,
|
|
118
|
+
): node is ExtendsModifier {
|
|
119
|
+
return node?.nodeKind === NodeKind.EXTENDS_MODIFIER;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function isCaseClause(
|
|
123
|
+
node: AbstractNode | undefined,
|
|
124
|
+
): node is CaseClause {
|
|
125
|
+
return node?.nodeKind === NodeKind.CASE_CLAUSE;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function isDefaultClause(
|
|
129
|
+
node: AbstractNode | undefined,
|
|
130
|
+
): node is DefaultClause {
|
|
131
|
+
return node?.nodeKind === NodeKind.DEFAULT_CLAUSE;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function isBitModifier(
|
|
135
|
+
node: AbstractNode | undefined,
|
|
136
|
+
): node is BitModifier {
|
|
137
|
+
return node?.nodeKind === NodeKind.BIT_MODIFIER;
|
|
138
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { AbstractCompositeNode } from "../node/abstract-composite-node.ts";
|
|
2
|
+
import type { AbstractLeafNode } from "../node/abstract-leaf-node.ts";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Interface representing a handler for nodes in an abstract syntax tree.
|
|
6
|
+
*
|
|
7
|
+
* @interface NodeHandler
|
|
8
|
+
*/
|
|
9
|
+
export interface NodeHandler {
|
|
10
|
+
beforeVisit(node: AbstractCompositeNode): void;
|
|
11
|
+
|
|
12
|
+
visit(node: AbstractLeafNode): void;
|
|
13
|
+
|
|
14
|
+
afterVisit(node: AbstractCompositeNode): void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AbstractNode } from "../node/abstract-node.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Interface representing a visitor for nodes.
|
|
5
|
+
*/
|
|
6
|
+
export interface NodeVisitor {
|
|
7
|
+
/**
|
|
8
|
+
* Called when visiting a node.
|
|
9
|
+
* @param node The node to visit.
|
|
10
|
+
* @returns The result of the visit operation.
|
|
11
|
+
*/
|
|
12
|
+
visit(node: AbstractNode): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import getLogger from "../../util/logger.ts";
|
|
2
|
+
import type { AbstractLeafNode } from "../node/abstract-leaf-node.ts";
|
|
3
|
+
import type { AbstractNode } from "../node/abstract-node.ts";
|
|
4
|
+
import { NodeKind } from "../node/enum/node-kind.ts";
|
|
5
|
+
import type { NodeHandler } from "./node-handler.ts";
|
|
6
|
+
import type { NodeVisitor } from "./node-visitor.ts";
|
|
7
|
+
import { debugEnabled } from "../../util/logger.ts";
|
|
8
|
+
import { isCompositeNode, isToken } from "../util/types.ts";
|
|
9
|
+
|
|
10
|
+
const logger = getLogger("TraversingVisitor");
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A visitor that traverses nodes and delegates operations to a node handler.
|
|
14
|
+
*/
|
|
15
|
+
export class TraversingVisitor implements NodeVisitor {
|
|
16
|
+
constructor(public readonly nodeHandler: NodeHandler) {}
|
|
17
|
+
|
|
18
|
+
depth = 0;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Called when visiting a node.
|
|
22
|
+
* @param node The node to visit.
|
|
23
|
+
*/
|
|
24
|
+
visit(node: AbstractNode): void {
|
|
25
|
+
const indent = " ".repeat(this.depth);
|
|
26
|
+
|
|
27
|
+
if (debugEnabled) {
|
|
28
|
+
let tokenText = "";
|
|
29
|
+
if (isToken(node)) {
|
|
30
|
+
tokenText = ` => ${node.text}`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (node.leadingTrivia) {
|
|
34
|
+
tokenText += ` => leadingTrivia: ${
|
|
35
|
+
node.leadingTrivia.map((t) => `"${t.text.replace(/\n/g, "\\n")}"`)
|
|
36
|
+
.join(", ")
|
|
37
|
+
}`;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (node.trailingTrivia) {
|
|
41
|
+
tokenText += ` => trailingTrivia: ${
|
|
42
|
+
node.trailingTrivia.map((t) => `"${t.text.replace(/\n/g, "\\n")}"`)
|
|
43
|
+
.join(", ")
|
|
44
|
+
}`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
logger.debug(
|
|
48
|
+
"visit: %s %s%s",
|
|
49
|
+
indent,
|
|
50
|
+
NodeKind[node.nodeKind],
|
|
51
|
+
tokenText,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (isCompositeNode(node)) {
|
|
56
|
+
this.nodeHandler.beforeVisit(node);
|
|
57
|
+
|
|
58
|
+
for (const childNode of node.children) {
|
|
59
|
+
this.depth++;
|
|
60
|
+
this.visit(childNode);
|
|
61
|
+
this.depth--;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
this.nodeHandler.afterVisit(node);
|
|
65
|
+
} else {
|
|
66
|
+
this.nodeHandler.visit(node as AbstractLeafNode);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|