@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,168 @@
|
|
|
1
|
+
import { ExpressionKind } from "../../node/enum/expression-kind.ts";
|
|
2
|
+
import { InternalScannerError } from "../../../scanner-error.ts";
|
|
3
|
+
|
|
4
|
+
// Generated by Lezer from the SDL grammar
|
|
5
|
+
import * as TokenTypeId from "../../../lezer/parser.terms.ts";
|
|
6
|
+
|
|
7
|
+
export const expressionKindByTokenTypeId: Map<number, ExpressionKind> =
|
|
8
|
+
new Map();
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Map parsed token type ID to AST token type enum.
|
|
12
|
+
* Exhaustive switch statement to ensure all token type IDs are handled.
|
|
13
|
+
*/
|
|
14
|
+
Object.values(TokenTypeId).forEach((tokenTypeId) => {
|
|
15
|
+
switch (tokenTypeId) {
|
|
16
|
+
case TokenTypeId.AssignmentExpression:
|
|
17
|
+
case TokenTypeId.BinaryExpression:
|
|
18
|
+
expressionKindByTokenTypeId.set(
|
|
19
|
+
tokenTypeId,
|
|
20
|
+
ExpressionKind.BINARY,
|
|
21
|
+
);
|
|
22
|
+
break;
|
|
23
|
+
case TokenTypeId.UnaryExpression:
|
|
24
|
+
expressionKindByTokenTypeId.set(
|
|
25
|
+
tokenTypeId,
|
|
26
|
+
ExpressionKind.UNARY,
|
|
27
|
+
);
|
|
28
|
+
break;
|
|
29
|
+
case TokenTypeId.LengthofExpression:
|
|
30
|
+
expressionKindByTokenTypeId.set(
|
|
31
|
+
tokenTypeId,
|
|
32
|
+
ExpressionKind.LENGTHOF,
|
|
33
|
+
);
|
|
34
|
+
break;
|
|
35
|
+
|
|
36
|
+
case TokenTypeId.AlignedModifier:
|
|
37
|
+
case TokenTypeId.AggregateOutputValue:
|
|
38
|
+
case TokenTypeId.ArrayDefinition:
|
|
39
|
+
case TokenTypeId.ClassDefinition:
|
|
40
|
+
case TokenTypeId.ClassDeclaration:
|
|
41
|
+
case TokenTypeId.CompoundStatement:
|
|
42
|
+
case TokenTypeId.ComputedArrayDefinition:
|
|
43
|
+
case TokenTypeId.ComputedElementaryTypeDefinition:
|
|
44
|
+
case TokenTypeId.DoStatement:
|
|
45
|
+
case TokenTypeId.ElementaryTypeDefinition:
|
|
46
|
+
case TokenTypeId.ExpressionStatement:
|
|
47
|
+
case TokenTypeId.ForStatement:
|
|
48
|
+
case TokenTypeId.IfStatement:
|
|
49
|
+
case TokenTypeId.MapDeclaration:
|
|
50
|
+
case TokenTypeId.StringDefinition:
|
|
51
|
+
case TokenTypeId.SwitchStatement:
|
|
52
|
+
case TokenTypeId.WhileStatement:
|
|
53
|
+
case TokenTypeId.ArrayElementAccess:
|
|
54
|
+
case TokenTypeId.Base64StringLiteral:
|
|
55
|
+
case TokenTypeId.UtfStringLiteral:
|
|
56
|
+
case TokenTypeId.BitModifier:
|
|
57
|
+
case TokenTypeId.CaseClause:
|
|
58
|
+
case TokenTypeId.ClassId:
|
|
59
|
+
case TokenTypeId.ClassIdRange:
|
|
60
|
+
case TokenTypeId.ExtendedClassIdRange:
|
|
61
|
+
case TokenTypeId.ClassMemberAccess:
|
|
62
|
+
case TokenTypeId.DefaultClause:
|
|
63
|
+
case TokenTypeId.ElementaryType:
|
|
64
|
+
case TokenTypeId.ElementaryTypeOutputValue:
|
|
65
|
+
case TokenTypeId.ExpandableModifier:
|
|
66
|
+
case TokenTypeId.ExplicitArrayDimension:
|
|
67
|
+
case TokenTypeId.ImplicitArrayDimension:
|
|
68
|
+
case TokenTypeId.PartialArrayDimension:
|
|
69
|
+
case TokenTypeId.ExtendsModifier:
|
|
70
|
+
case TokenTypeId.LengthAttribute:
|
|
71
|
+
case TokenTypeId.MapDefinition:
|
|
72
|
+
case TokenTypeId.MapEntry:
|
|
73
|
+
case TokenTypeId.MultipleCharacterLiteral:
|
|
74
|
+
case TokenTypeId.Parameter:
|
|
75
|
+
case TokenTypeId.ParameterList:
|
|
76
|
+
case TokenTypeId.ParameterValueList:
|
|
77
|
+
case TokenTypeId.Specification:
|
|
78
|
+
case TokenTypeId._break:
|
|
79
|
+
case TokenTypeId._case:
|
|
80
|
+
case TokenTypeId._class:
|
|
81
|
+
case TokenTypeId._const:
|
|
82
|
+
case TokenTypeId._default:
|
|
83
|
+
case TokenTypeId._do:
|
|
84
|
+
case TokenTypeId._else:
|
|
85
|
+
case TokenTypeId._extends:
|
|
86
|
+
case TokenTypeId._for:
|
|
87
|
+
case TokenTypeId._if:
|
|
88
|
+
case TokenTypeId._switch:
|
|
89
|
+
case TokenTypeId._while:
|
|
90
|
+
case TokenTypeId.abstract:
|
|
91
|
+
case TokenTypeId.Addition:
|
|
92
|
+
case TokenTypeId.AlignmentBitCount8:
|
|
93
|
+
case TokenTypeId.AlignmentBitCount16:
|
|
94
|
+
case TokenTypeId.AlignmentBitCount32:
|
|
95
|
+
case TokenTypeId.AlignmentBitCount64:
|
|
96
|
+
case TokenTypeId.AlignmentBitCount128:
|
|
97
|
+
case TokenTypeId.aligned:
|
|
98
|
+
case TokenTypeId.Assignment:
|
|
99
|
+
case TokenTypeId.base64string:
|
|
100
|
+
case TokenTypeId.Base64StringLiteralCharacters:
|
|
101
|
+
case TokenTypeId.BinaryLiteral:
|
|
102
|
+
case TokenTypeId.bit:
|
|
103
|
+
case TokenTypeId.BitwiseAnd:
|
|
104
|
+
case TokenTypeId.BitwiseOr:
|
|
105
|
+
case TokenTypeId.BitwiseShiftLeft:
|
|
106
|
+
case TokenTypeId.BitwiseShiftRight:
|
|
107
|
+
case TokenTypeId.CloseBrace:
|
|
108
|
+
case TokenTypeId.CloseBracket:
|
|
109
|
+
case TokenTypeId.CloseParenthesis:
|
|
110
|
+
case TokenTypeId.Colon:
|
|
111
|
+
case TokenTypeId.Comma:
|
|
112
|
+
case TokenTypeId.Comment:
|
|
113
|
+
case TokenTypeId.computed:
|
|
114
|
+
case TokenTypeId.DecimalLiteral:
|
|
115
|
+
case TokenTypeId.Division:
|
|
116
|
+
case TokenTypeId.DoubleQuote:
|
|
117
|
+
case TokenTypeId.expandable:
|
|
118
|
+
case TokenTypeId.float:
|
|
119
|
+
case TokenTypeId.FloatingPointLiteral:
|
|
120
|
+
case TokenTypeId.HexadecimalLiteral:
|
|
121
|
+
case TokenTypeId.Identifier:
|
|
122
|
+
case TokenTypeId.int:
|
|
123
|
+
case TokenTypeId.IntegerLiteral:
|
|
124
|
+
case TokenTypeId.legacy:
|
|
125
|
+
case TokenTypeId.lengthof:
|
|
126
|
+
case TokenTypeId.LogicalAnd:
|
|
127
|
+
case TokenTypeId.LogicalOr:
|
|
128
|
+
case TokenTypeId.LookAhead:
|
|
129
|
+
case TokenTypeId.map:
|
|
130
|
+
case TokenTypeId.Modulus:
|
|
131
|
+
case TokenTypeId.MultipleCharacterLiteralCharacters:
|
|
132
|
+
case TokenTypeId.Multiplication:
|
|
133
|
+
case TokenTypeId.OpenBrace:
|
|
134
|
+
case TokenTypeId.OpenBracket:
|
|
135
|
+
case TokenTypeId.OpenParenthesis:
|
|
136
|
+
case TokenTypeId.Period:
|
|
137
|
+
case TokenTypeId.PostfixDecrement:
|
|
138
|
+
case TokenTypeId.PostfixIncrement:
|
|
139
|
+
case TokenTypeId.RangeOperator:
|
|
140
|
+
case TokenTypeId.reserved:
|
|
141
|
+
case TokenTypeId.RelationalEqual:
|
|
142
|
+
case TokenTypeId.RelationalGreaterThan:
|
|
143
|
+
case TokenTypeId.RelationalGreaterThanOrEqual:
|
|
144
|
+
case TokenTypeId.RelationalLessThan:
|
|
145
|
+
case TokenTypeId.RelationalLessThanOrEqual:
|
|
146
|
+
case TokenTypeId.RelationalNotEqual:
|
|
147
|
+
case TokenTypeId.Semicolon:
|
|
148
|
+
case TokenTypeId.SingleQuote:
|
|
149
|
+
case TokenTypeId.Subtraction:
|
|
150
|
+
case TokenTypeId.UnaryNegation:
|
|
151
|
+
case TokenTypeId.UnaryPlus:
|
|
152
|
+
case TokenTypeId.unsigned:
|
|
153
|
+
case TokenTypeId.utf16string:
|
|
154
|
+
case TokenTypeId.utf8list:
|
|
155
|
+
case TokenTypeId.utf8string:
|
|
156
|
+
case TokenTypeId.utfstring:
|
|
157
|
+
case TokenTypeId.UtfPrefix:
|
|
158
|
+
case TokenTypeId.UtfStringLiteralCharacters:
|
|
159
|
+
case TokenTypeId.Whitespace:
|
|
160
|
+
break;
|
|
161
|
+
default: {
|
|
162
|
+
const exhaustiveCheck: never = tokenTypeId;
|
|
163
|
+
throw new InternalScannerError(
|
|
164
|
+
"Unreachable code reached, tokenTypeId == " + exhaustiveCheck,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
});
|
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
import getLogger, { debugEnabled } from "../../../util/logger.ts";
|
|
2
|
+
import type { BuildContext } from "./build-context.ts";
|
|
3
|
+
import type { AbstractNode } from "../../node/abstract-node.ts";
|
|
4
|
+
import { consumeAbstractNode } from "../consume/consume-abstract-node.ts";
|
|
5
|
+
import { NodeKind } from "../../node/enum/node-kind.ts";
|
|
6
|
+
import { InternalScannerError } from "../../../scanner-error.ts";
|
|
7
|
+
import type { Token } from "../../node/token.ts";
|
|
8
|
+
import {
|
|
9
|
+
isMissingError,
|
|
10
|
+
isToken,
|
|
11
|
+
isUnexpectedError,
|
|
12
|
+
type OneToManyList,
|
|
13
|
+
type OptionalNode,
|
|
14
|
+
type RequiredNode,
|
|
15
|
+
type ZeroToManyList,
|
|
16
|
+
} from "../../util/types.ts";
|
|
17
|
+
import type { AbstractStatement } from "../../node/abstract-statement.ts";
|
|
18
|
+
import { TokenKind } from "../../node/enum/token-kind.ts";
|
|
19
|
+
import { StatementKind } from "../../node/enum/statement-kind.ts";
|
|
20
|
+
import type { Identifier } from "../../node/identifier.ts";
|
|
21
|
+
import type { NumberLiteral } from "../../node/number-literal.ts";
|
|
22
|
+
import type { StringLiteral } from "../../node/string-literal.ts";
|
|
23
|
+
import { MissingError } from "../../node/missing-error.ts";
|
|
24
|
+
import { getLocationFromTextPosition } from "../../../util/location-utils.ts";
|
|
25
|
+
import type { AbstractArrayDimension } from "../../node/abstract-array-dimension.ts";
|
|
26
|
+
import type { ClassId } from "../../node/class-id.ts";
|
|
27
|
+
import { ArrayDimensionKind } from "../../node/enum/array-dimension-kind.ts";
|
|
28
|
+
import { ClassIdKind } from "../../node/enum/class-id-kind.ts";
|
|
29
|
+
|
|
30
|
+
const logger = getLogger("fetchNode");
|
|
31
|
+
|
|
32
|
+
function getRequestLogMessage(
|
|
33
|
+
requestedNodeKind?: number[] | number,
|
|
34
|
+
requestedSubKind?: number[] | number,
|
|
35
|
+
): string {
|
|
36
|
+
const nodeKindStr = Array.isArray(requestedNodeKind)
|
|
37
|
+
? requestedNodeKind.map((kind) => NodeKind[kind]).join(", ")
|
|
38
|
+
: requestedNodeKind !== undefined
|
|
39
|
+
? NodeKind[requestedNodeKind]
|
|
40
|
+
: "any";
|
|
41
|
+
let message = ` for ${nodeKindStr}`;
|
|
42
|
+
|
|
43
|
+
if (requestedSubKind !== undefined) {
|
|
44
|
+
switch (requestedNodeKind) {
|
|
45
|
+
case NodeKind.TOKEN:
|
|
46
|
+
if (Array.isArray(requestedSubKind)) {
|
|
47
|
+
message += `, [${
|
|
48
|
+
requestedSubKind
|
|
49
|
+
.map((subKind) => TokenKind[subKind])
|
|
50
|
+
.join(", ")
|
|
51
|
+
}]`;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
message += `, ${TokenKind[requestedSubKind]}`;
|
|
55
|
+
break;
|
|
56
|
+
case NodeKind.STATEMENT:
|
|
57
|
+
if (Array.isArray(requestedSubKind)) {
|
|
58
|
+
message += `, [${
|
|
59
|
+
requestedSubKind
|
|
60
|
+
.map((subKind) => StatementKind[subKind])
|
|
61
|
+
.join(", ")
|
|
62
|
+
}]`;
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
message += `, ${StatementKind[requestedSubKind]}`;
|
|
66
|
+
break;
|
|
67
|
+
case NodeKind.ARRAY_DIMENSION:
|
|
68
|
+
if (Array.isArray(requestedSubKind)) {
|
|
69
|
+
message += `, [${
|
|
70
|
+
requestedSubKind
|
|
71
|
+
.map((subKind) => ArrayDimensionKind[subKind])
|
|
72
|
+
.join(", ")
|
|
73
|
+
}]`;
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
message += `, ${ArrayDimensionKind[requestedSubKind]}`;
|
|
77
|
+
break;
|
|
78
|
+
case NodeKind.CLASS_ID:
|
|
79
|
+
if (Array.isArray(requestedSubKind)) {
|
|
80
|
+
message += `, [${
|
|
81
|
+
requestedSubKind
|
|
82
|
+
.map((subKind) => ClassIdKind[subKind])
|
|
83
|
+
.join(", ")
|
|
84
|
+
}]`;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
message += `, ${ClassIdKind[requestedSubKind]}`;
|
|
88
|
+
break;
|
|
89
|
+
default:
|
|
90
|
+
throw new InternalScannerError(
|
|
91
|
+
`requestedSubKind matching not implemented for node kind: ${nodeKindStr}`,
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return message;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function getNodeDetailsLogMessage(node: AbstractNode): string {
|
|
100
|
+
let message = "";
|
|
101
|
+
if (isToken(node)) {
|
|
102
|
+
message += ` ${node.text.replaceAll("\n", "\\n")}`;
|
|
103
|
+
} else if (node.nodeKind === NodeKind.IDENTIFIER) {
|
|
104
|
+
message += ` ${
|
|
105
|
+
(node as unknown as Identifier).name.replaceAll("\n", "\\n")
|
|
106
|
+
}`;
|
|
107
|
+
} else if (node.nodeKind === NodeKind.NUMBER_LITERAL) {
|
|
108
|
+
message += ` ${(node as unknown as NumberLiteral).value}`;
|
|
109
|
+
} else if (node.nodeKind === NodeKind.STRING_LITERAL) {
|
|
110
|
+
message += ` ${(node as unknown as StringLiteral).value}`;
|
|
111
|
+
}
|
|
112
|
+
return message;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function fetchAstNode<T extends AbstractNode>(
|
|
116
|
+
buildContext: BuildContext,
|
|
117
|
+
optional: boolean,
|
|
118
|
+
requestedNodeKind?: number[] | number,
|
|
119
|
+
requestedSubKind?: number[] | number,
|
|
120
|
+
): T | undefined {
|
|
121
|
+
if (Array.isArray(requestedNodeKind) && (requestedSubKind !== undefined)) {
|
|
122
|
+
throw new InternalScannerError(
|
|
123
|
+
`Cannot specify multiple requestedNodeKind when specifying requestedSubKind.`,
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// use a node if we already have one from a previous call
|
|
128
|
+
const currentState =
|
|
129
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
130
|
+
let node = currentState.nextNode as T | undefined;
|
|
131
|
+
delete currentState.nextNode;
|
|
132
|
+
|
|
133
|
+
// consume a node if we don't already have one
|
|
134
|
+
if (node === undefined) {
|
|
135
|
+
node = consumeAbstractNode(buildContext) as T;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// if we still don't have a node
|
|
139
|
+
if (node === undefined) {
|
|
140
|
+
// if the node was optional, return
|
|
141
|
+
if (optional) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// if the node was required, and we have reached end of siblings, fabricate a MissingError node
|
|
146
|
+
// to satisfy the consumption request for remaining siblings
|
|
147
|
+
if (currentState.isEndOfSiblings) {
|
|
148
|
+
logger.debug(
|
|
149
|
+
currentState.indent +
|
|
150
|
+
"fabricating MissingError node at end of siblings" +
|
|
151
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind),
|
|
152
|
+
);
|
|
153
|
+
const location = getLocationFromTextPosition(
|
|
154
|
+
buildContext.text,
|
|
155
|
+
buildContext.cursor.from,
|
|
156
|
+
);
|
|
157
|
+
|
|
158
|
+
return new MissingError(location) as unknown as T;
|
|
159
|
+
}
|
|
160
|
+
// if the node was required, throw an error
|
|
161
|
+
throw new InternalScannerError(
|
|
162
|
+
`Required node of kind ${
|
|
163
|
+
Array.isArray(requestedNodeKind)
|
|
164
|
+
? requestedNodeKind
|
|
165
|
+
.map((kind) => NodeKind[kind])
|
|
166
|
+
.join(", ")
|
|
167
|
+
: requestedNodeKind !== undefined
|
|
168
|
+
? NodeKind[requestedNodeKind]
|
|
169
|
+
: "any"
|
|
170
|
+
}, but no node was available.`,
|
|
171
|
+
);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// return unexpected error node even if optional
|
|
175
|
+
if (isUnexpectedError(node)) {
|
|
176
|
+
return node;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// return missing error node if required
|
|
180
|
+
if (!optional && isMissingError(node)) {
|
|
181
|
+
return node;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (
|
|
185
|
+
Array.isArray(requestedNodeKind)
|
|
186
|
+
? requestedNodeKind.includes(node.nodeKind)
|
|
187
|
+
: requestedNodeKind !== undefined
|
|
188
|
+
? node.nodeKind === requestedNodeKind
|
|
189
|
+
: true
|
|
190
|
+
) {
|
|
191
|
+
// return the node if it matches the requested kind and there is no subKind requested
|
|
192
|
+
if (requestedSubKind === undefined) {
|
|
193
|
+
return node;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// return the node if it matches the requested kind and subKind
|
|
197
|
+
let subKind: number;
|
|
198
|
+
switch (node.nodeKind) {
|
|
199
|
+
case NodeKind.TOKEN:
|
|
200
|
+
subKind = (node as unknown as Token).tokenKind;
|
|
201
|
+
break;
|
|
202
|
+
case NodeKind.STATEMENT:
|
|
203
|
+
subKind = (node as unknown as AbstractStatement).statementKind;
|
|
204
|
+
break;
|
|
205
|
+
case NodeKind.ARRAY_DIMENSION:
|
|
206
|
+
subKind =
|
|
207
|
+
(node as unknown as AbstractArrayDimension).arrayDimensionKind;
|
|
208
|
+
break;
|
|
209
|
+
case NodeKind.CLASS_ID:
|
|
210
|
+
subKind = (node as unknown as ClassId).classIdKind;
|
|
211
|
+
break;
|
|
212
|
+
default:
|
|
213
|
+
throw new InternalScannerError(
|
|
214
|
+
`SubKind matching not implemented for node kind: ${
|
|
215
|
+
NodeKind[node.nodeKind]
|
|
216
|
+
}`,
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
if (Array.isArray(requestedSubKind)) {
|
|
220
|
+
if (requestedSubKind.includes(subKind)) {
|
|
221
|
+
return node;
|
|
222
|
+
}
|
|
223
|
+
} else {
|
|
224
|
+
if (requestedSubKind === subKind) {
|
|
225
|
+
return node;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
if (optional) {
|
|
231
|
+
// if it was optional and the node kind did not match
|
|
232
|
+
// store the node for the next call and return undefined
|
|
233
|
+
if (currentState.nextNode) {
|
|
234
|
+
throw new InternalScannerError(
|
|
235
|
+
`Logic error: buildContext.nextNode should be undefined before storing a node.`,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
currentState.nextNode = node;
|
|
239
|
+
|
|
240
|
+
return undefined;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
throw new InternalScannerError(
|
|
244
|
+
"Logic error: should have returned a node by now.",
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export function fetchRequiredNode<T extends AbstractNode>(
|
|
249
|
+
buildContext: BuildContext,
|
|
250
|
+
requestedNodeKind?: number[] | number,
|
|
251
|
+
requestedSubKind?: number[] | number,
|
|
252
|
+
): RequiredNode<T> {
|
|
253
|
+
const currentState =
|
|
254
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
255
|
+
if (debugEnabled) {
|
|
256
|
+
logger.debug(
|
|
257
|
+
currentState.indent + "required node request" +
|
|
258
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " ...",
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
const node = fetchAstNode<T>(
|
|
262
|
+
buildContext,
|
|
263
|
+
false,
|
|
264
|
+
requestedNodeKind,
|
|
265
|
+
requestedSubKind,
|
|
266
|
+
);
|
|
267
|
+
|
|
268
|
+
if (debugEnabled) {
|
|
269
|
+
let message = currentState.indent + "=> required node result" +
|
|
270
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " => ";
|
|
271
|
+
message += `${NodeKind[node!.nodeKind]}`;
|
|
272
|
+
message += getNodeDetailsLogMessage(node!);
|
|
273
|
+
logger.debug(message);
|
|
274
|
+
}
|
|
275
|
+
return node!;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export function fetchOptionalNode<T extends AbstractNode>(
|
|
279
|
+
buildContext: BuildContext,
|
|
280
|
+
requestedNodeKind?: number[] | number,
|
|
281
|
+
requestedSubKind?: number[] | number,
|
|
282
|
+
): OptionalNode<T> | undefined {
|
|
283
|
+
const currentState =
|
|
284
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
285
|
+
if (debugEnabled) {
|
|
286
|
+
logger.debug(
|
|
287
|
+
currentState.indent + "optional node request" +
|
|
288
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + "",
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
const node = fetchAstNode<T>(
|
|
292
|
+
buildContext,
|
|
293
|
+
true,
|
|
294
|
+
requestedNodeKind,
|
|
295
|
+
requestedSubKind,
|
|
296
|
+
) as OptionalNode<T>;
|
|
297
|
+
if (debugEnabled) {
|
|
298
|
+
if (node) {
|
|
299
|
+
let message = currentState.indent + "=> optional node result" +
|
|
300
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " => ";
|
|
301
|
+
message += `${NodeKind[node.nodeKind]}`;
|
|
302
|
+
message += getNodeDetailsLogMessage(node);
|
|
303
|
+
logger.debug(message);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return node;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
export function fetchZeroToManyList<T extends AbstractNode>(
|
|
310
|
+
buildContext: BuildContext,
|
|
311
|
+
requestedNodeKind: number[] | number,
|
|
312
|
+
requestedSubKind?: number[] | number,
|
|
313
|
+
): ZeroToManyList<T> {
|
|
314
|
+
const currentState =
|
|
315
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
316
|
+
const nodes: ZeroToManyList<T> = [];
|
|
317
|
+
if (debugEnabled) {
|
|
318
|
+
logger.debug(
|
|
319
|
+
currentState.indent + "zero to many list node request" +
|
|
320
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " ...",
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
let node = fetchOptionalNode<T>(
|
|
324
|
+
buildContext,
|
|
325
|
+
requestedNodeKind,
|
|
326
|
+
requestedSubKind,
|
|
327
|
+
);
|
|
328
|
+
while (node !== undefined) {
|
|
329
|
+
nodes.push(node);
|
|
330
|
+
node = fetchOptionalNode<T>(
|
|
331
|
+
buildContext,
|
|
332
|
+
requestedNodeKind,
|
|
333
|
+
requestedSubKind,
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
if (debugEnabled) {
|
|
337
|
+
if (nodes.length > 0) {
|
|
338
|
+
logger.debug(
|
|
339
|
+
currentState.indent + "=> zero to many list node result" +
|
|
340
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) +
|
|
341
|
+
" => count: " + nodes.length,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
return nodes;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
export function fetchOneToManyList<T extends AbstractNode>(
|
|
349
|
+
buildContext: BuildContext,
|
|
350
|
+
requestedNodeKind: number[] | number,
|
|
351
|
+
requestedSubKind?: number[] | number,
|
|
352
|
+
): OneToManyList<T> {
|
|
353
|
+
const currentState =
|
|
354
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
355
|
+
const nodes: OneToManyList<T> = [];
|
|
356
|
+
if (debugEnabled) {
|
|
357
|
+
logger.debug(
|
|
358
|
+
currentState.indent + "one to many list node request" +
|
|
359
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " ...",
|
|
360
|
+
);
|
|
361
|
+
}
|
|
362
|
+
let node = fetchRequiredNode<T>(
|
|
363
|
+
buildContext,
|
|
364
|
+
requestedNodeKind,
|
|
365
|
+
requestedSubKind,
|
|
366
|
+
) as OptionalNode<T>;
|
|
367
|
+
while (node !== undefined) {
|
|
368
|
+
nodes.push(node);
|
|
369
|
+
node = fetchOptionalNode<T>(
|
|
370
|
+
buildContext,
|
|
371
|
+
requestedNodeKind,
|
|
372
|
+
requestedSubKind,
|
|
373
|
+
);
|
|
374
|
+
}
|
|
375
|
+
if (debugEnabled) {
|
|
376
|
+
logger.debug(
|
|
377
|
+
currentState.indent + "=> one to many list node result" +
|
|
378
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) +
|
|
379
|
+
" => count: " + nodes.length,
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
return nodes;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
export function fetchOneToManyCommaSeparatedList<T extends AbstractNode>(
|
|
386
|
+
buildContext: BuildContext,
|
|
387
|
+
requestedNodeKind: number[] | number,
|
|
388
|
+
requestedSubKind?: number[] | number,
|
|
389
|
+
): { nodes: OneToManyList<T>; commaPunctuators: ZeroToManyList<Token> } {
|
|
390
|
+
const currentState =
|
|
391
|
+
buildContext.stateStack[buildContext.stateStack.length - 1];
|
|
392
|
+
const nodes: OneToManyList<T> = [];
|
|
393
|
+
const commaPunctuators: ZeroToManyList<Token> = [];
|
|
394
|
+
if (debugEnabled) {
|
|
395
|
+
logger.debug(
|
|
396
|
+
currentState.indent + "one to many comma separated list node request" +
|
|
397
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) + " ...",
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
let node = fetchRequiredNode<T>(
|
|
401
|
+
buildContext,
|
|
402
|
+
requestedNodeKind,
|
|
403
|
+
requestedSubKind,
|
|
404
|
+
) as OptionalNode<T>;
|
|
405
|
+
while (node !== undefined) {
|
|
406
|
+
nodes.push(node);
|
|
407
|
+
|
|
408
|
+
// now try to fetch a comma and if not found break
|
|
409
|
+
// otherwise continue to fetch the next node
|
|
410
|
+
const commaPunctuator = fetchOptionalNode<Token>(
|
|
411
|
+
buildContext,
|
|
412
|
+
NodeKind.TOKEN,
|
|
413
|
+
TokenKind.COMMA,
|
|
414
|
+
);
|
|
415
|
+
if (commaPunctuator === undefined) {
|
|
416
|
+
break;
|
|
417
|
+
}
|
|
418
|
+
commaPunctuators.push(commaPunctuator);
|
|
419
|
+
node = fetchOptionalNode<T>(
|
|
420
|
+
buildContext,
|
|
421
|
+
requestedNodeKind,
|
|
422
|
+
requestedSubKind,
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
if (debugEnabled) {
|
|
426
|
+
logger.debug(
|
|
427
|
+
currentState.indent + "=> one to many comma separated list node result" +
|
|
428
|
+
getRequestLogMessage(requestedNodeKind, requestedSubKind) +
|
|
429
|
+
" => count: " + nodes.length,
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
return { nodes, commaPunctuators };
|
|
433
|
+
}
|