@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.
Files changed (375) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +337 -0
  3. package/bun.lock +65 -0
  4. package/dist/index.js +11829 -0
  5. package/grammar/sdl.ebnf.grammar +399 -0
  6. package/grammar/sdl.lezer.grammar +629 -0
  7. package/index.ts +83 -0
  8. package/package.json +61 -0
  9. package/src/analyser/checks/check-array-definition.ts +90 -0
  10. package/src/analyser/checks/check-array-element-access.ts +31 -0
  11. package/src/analyser/checks/check-class-declaration.ts +417 -0
  12. package/src/analyser/checks/check-computed-array-definition.ts +44 -0
  13. package/src/analyser/checks/check-computed-elementary-type-definition.ts +45 -0
  14. package/src/analyser/checks/check-elementary-type-definition.ts +167 -0
  15. package/src/analyser/checks/check-expression-binary.ts +242 -0
  16. package/src/analyser/checks/check-expression-lengthof.ts +34 -0
  17. package/src/analyser/checks/check-expression-unary.ts +166 -0
  18. package/src/analyser/checks/check-identifier.ts +71 -0
  19. package/src/analyser/checks/check-if-statement.ts +164 -0
  20. package/src/analyser/checks/check-map-declaration.ts +180 -0
  21. package/src/analyser/checks/check-map-definition.ts +118 -0
  22. package/src/analyser/checks/check-number-literal-float.ts +28 -0
  23. package/src/analyser/checks/check-parameter-list.ts +42 -0
  24. package/src/analyser/checks/check-specification.ts +53 -0
  25. package/src/analyser/checks/check-switch-statement.ts +206 -0
  26. package/src/analyser/checks/check.ts +20 -0
  27. package/src/analyser/create-sdl-analyser.ts +85 -0
  28. package/src/analyser/node-handler/abstract-analysis-node-handler.ts +626 -0
  29. package/src/analyser/node-handler/build-symbol-table-node-handler.ts +649 -0
  30. package/src/analyser/node-handler/specific-check-node-handler.ts +46 -0
  31. package/src/analyser/node-handler/validate-scope-node-handler.ts +290 -0
  32. package/src/analyser/node-handler/validate-type-node-handler.ts +497 -0
  33. package/src/analyser/sdl-analyser.ts +119 -0
  34. package/src/analyser/symbol-table.ts +388 -0
  35. package/src/analyser/util/symbol-table-utils.ts +458 -0
  36. package/src/analyser/util/type-utils.ts +238 -0
  37. package/src/ast/build/consume/consume-abstract-node.ts +199 -0
  38. package/src/ast/build/consume/consume-ast-node.ts +400 -0
  39. package/src/ast/build/consume/consume-primitive.ts +59 -0
  40. package/src/ast/build/consume/consume-trivia.ts +96 -0
  41. package/src/ast/build/consume/consume-white-space-and-missing-errors.ts +27 -0
  42. package/src/ast/build/node/build-aggregate-output-value.ts +57 -0
  43. package/src/ast/build/node/build-aligned-modifier.ts +99 -0
  44. package/src/ast/build/node/build-array-definition.ts +131 -0
  45. package/src/ast/build/node/build-array-element-access.ts +45 -0
  46. package/src/ast/build/node/build-base64-string-literal.ts +41 -0
  47. package/src/ast/build/node/build-binary-expression.ts +113 -0
  48. package/src/ast/build/node/build-binary-literal.ts +37 -0
  49. package/src/ast/build/node/build-bit-modifier.ts +86 -0
  50. package/src/ast/build/node/build-case-clause.ts +101 -0
  51. package/src/ast/build/node/build-class-declaration.ts +124 -0
  52. package/src/ast/build/node/build-class-definition.ts +56 -0
  53. package/src/ast/build/node/build-class-id-range.ts +32 -0
  54. package/src/ast/build/node/build-class-id.ts +19 -0
  55. package/src/ast/build/node/build-class-member-access.ts +27 -0
  56. package/src/ast/build/node/build-compound-statement.ts +33 -0
  57. package/src/ast/build/node/build-computed-array-definition.ts +53 -0
  58. package/src/ast/build/node/build-computed-elementary-type-definition.ts +100 -0
  59. package/src/ast/build/node/build-decimal-literal.ts +15 -0
  60. package/src/ast/build/node/build-default-clause.ts +76 -0
  61. package/src/ast/build/node/build-do-statement.ts +71 -0
  62. package/src/ast/build/node/build-elementary-type-definition.ts +164 -0
  63. package/src/ast/build/node/build-elementary-type-output-value.ts +25 -0
  64. package/src/ast/build/node/build-elementary-type.ts +36 -0
  65. package/src/ast/build/node/build-expandable-modifier.ts +68 -0
  66. package/src/ast/build/node/build-explicit-array-dimension.ts +37 -0
  67. package/src/ast/build/node/build-expression-statement.ts +31 -0
  68. package/src/ast/build/node/build-extended-class-id-range.ts +27 -0
  69. package/src/ast/build/node/build-extends-modifier.ts +41 -0
  70. package/src/ast/build/node/build-floating-point-literal.ts +15 -0
  71. package/src/ast/build/node/build-for-statement.ts +117 -0
  72. package/src/ast/build/node/build-hexadecimal-literal.ts +38 -0
  73. package/src/ast/build/node/build-identifier.ts +8 -0
  74. package/src/ast/build/node/build-if-statement.ts +82 -0
  75. package/src/ast/build/node/build-implicit-array-dimension.ts +78 -0
  76. package/src/ast/build/node/build-integer-literal.ts +15 -0
  77. package/src/ast/build/node/build-length-attribute.ts +48 -0
  78. package/src/ast/build/node/build-lengthof-expression.ts +45 -0
  79. package/src/ast/build/node/build-map-declaration.ts +110 -0
  80. package/src/ast/build/node/build-map-definition.ts +103 -0
  81. package/src/ast/build/node/build-map-entry.ts +33 -0
  82. package/src/ast/build/node/build-missing-error.ts +10 -0
  83. package/src/ast/build/node/build-multiple-character-literal.ts +65 -0
  84. package/src/ast/build/node/build-parameter-list.ts +50 -0
  85. package/src/ast/build/node/build-parameter-value-list.ts +54 -0
  86. package/src/ast/build/node/build-parameter.ts +47 -0
  87. package/src/ast/build/node/build-partial-array-dimension.ts +55 -0
  88. package/src/ast/build/node/build-specification.ts +24 -0
  89. package/src/ast/build/node/build-string-definition.ts +106 -0
  90. package/src/ast/build/node/build-switch-statement.ts +84 -0
  91. package/src/ast/build/node/build-token.ts +26 -0
  92. package/src/ast/build/node/build-unary-expression.ts +109 -0
  93. package/src/ast/build/node/build-unexpected-error.ts +14 -0
  94. package/src/ast/build/node/build-utf-string-literal.ts +110 -0
  95. package/src/ast/build/node/build-while-statement.ts +55 -0
  96. package/src/ast/build/util/array-dimension-kind-by-token-type-id-map.ts +167 -0
  97. package/src/ast/build/util/binary-operator-kind-by-token-type-id-map.ts +152 -0
  98. package/src/ast/build/util/build-context.ts +36 -0
  99. package/src/ast/build/util/class-id-kind-by-token-type-id-map.ts +160 -0
  100. package/src/ast/build/util/expression-kind-by-token-type-id-map.ts +168 -0
  101. package/src/ast/build/util/fetch-node.ts +433 -0
  102. package/src/ast/build/util/node-kind-by-token-type-id-map.ts +202 -0
  103. package/src/ast/build/util/statement-kind-by-token-type-id-map.ts +210 -0
  104. package/src/ast/build/util/string-literal-kind-by-token-type-id-map.ts +162 -0
  105. package/src/ast/build/util/token-kind-by-token-type-id-map.ts +337 -0
  106. package/src/ast/build-ast.ts +114 -0
  107. package/src/ast/node/abstract-array-definition.ts +17 -0
  108. package/src/ast/node/abstract-array-dimension.ts +20 -0
  109. package/src/ast/node/abstract-class-id.ts +13 -0
  110. package/src/ast/node/abstract-composite-node.ts +58 -0
  111. package/src/ast/node/abstract-elementary-type-definition.ts +29 -0
  112. package/src/ast/node/abstract-expression.ts +13 -0
  113. package/src/ast/node/abstract-leaf-node.ts +10 -0
  114. package/src/ast/node/abstract-node.ts +16 -0
  115. package/src/ast/node/abstract-statement.ts +13 -0
  116. package/src/ast/node/aggregate-output-value.ts +28 -0
  117. package/src/ast/node/aligned-modifier.ts +21 -0
  118. package/src/ast/node/array-definition.ts +44 -0
  119. package/src/ast/node/array-element-access.ts +24 -0
  120. package/src/ast/node/binary-expression.ts +28 -0
  121. package/src/ast/node/bit-modifier.ts +24 -0
  122. package/src/ast/node/case-clause.ts +30 -0
  123. package/src/ast/node/class-declaration.ts +39 -0
  124. package/src/ast/node/class-definition.ts +23 -0
  125. package/src/ast/node/class-id-range.ts +17 -0
  126. package/src/ast/node/class-id.ts +14 -0
  127. package/src/ast/node/class-member-access.ts +19 -0
  128. package/src/ast/node/compound-statement.ts +19 -0
  129. package/src/ast/node/computed-array-definition.ts +26 -0
  130. package/src/ast/node/computed-elementary-type-definition.ts +34 -0
  131. package/src/ast/node/default-clause.ts +26 -0
  132. package/src/ast/node/do-statement.ts +28 -0
  133. package/src/ast/node/elementary-type-definition.ts +49 -0
  134. package/src/ast/node/elementary-type-output-value.ts +19 -0
  135. package/src/ast/node/elementary-type.ts +18 -0
  136. package/src/ast/node/enum/array-dimension-kind.ts +11 -0
  137. package/src/ast/node/enum/binary-operator-kind.ts +41 -0
  138. package/src/ast/node/enum/class-id-kind.ts +12 -0
  139. package/src/ast/node/enum/elementary-type-kind.ts +13 -0
  140. package/src/ast/node/enum/expression-kind.ts +11 -0
  141. package/src/ast/node/enum/node-kind.ts +57 -0
  142. package/src/ast/node/enum/number-literal-kind.ts +17 -0
  143. package/src/ast/node/enum/statement-kind.ts +37 -0
  144. package/src/ast/node/enum/string-literal-kind.ts +13 -0
  145. package/src/ast/node/enum/string-variable-kind.ts +25 -0
  146. package/src/ast/node/enum/token-kind.ts +87 -0
  147. package/src/ast/node/expandable-modifier.ts +21 -0
  148. package/src/ast/node/explicit-array-dimension.ts +26 -0
  149. package/src/ast/node/expression-statement.ts +23 -0
  150. package/src/ast/node/extended-class-id-range.ts +20 -0
  151. package/src/ast/node/extends-modifier.ts +21 -0
  152. package/src/ast/node/for-statement.ts +29 -0
  153. package/src/ast/node/identifier.ts +12 -0
  154. package/src/ast/node/if-statement.ts +28 -0
  155. package/src/ast/node/implicit-array-dimension.ts +34 -0
  156. package/src/ast/node/length-attribute.ts +24 -0
  157. package/src/ast/node/length-of-expression.ts +21 -0
  158. package/src/ast/node/map-declaration.ts +34 -0
  159. package/src/ast/node/map-definition.ts +27 -0
  160. package/src/ast/node/map-entry.ts +18 -0
  161. package/src/ast/node/missing-error.ts +9 -0
  162. package/src/ast/node/number-literal.ts +18 -0
  163. package/src/ast/node/parameter-list.ts +25 -0
  164. package/src/ast/node/parameter-value-list.ts +29 -0
  165. package/src/ast/node/parameter.ts +20 -0
  166. package/src/ast/node/partial-array-dimension.ts +28 -0
  167. package/src/ast/node/specification.ts +21 -0
  168. package/src/ast/node/string-definition.ts +28 -0
  169. package/src/ast/node/string-literal.ts +21 -0
  170. package/src/ast/node/switch-statement.ts +32 -0
  171. package/src/ast/node/token.ts +20 -0
  172. package/src/ast/node/trivia.ts +13 -0
  173. package/src/ast/node/unary-expression.ts +31 -0
  174. package/src/ast/node/unexpected-error.ts +12 -0
  175. package/src/ast/node/while-statement.ts +26 -0
  176. package/src/ast/util/types.ts +138 -0
  177. package/src/ast/visitor/node-handler.ts +15 -0
  178. package/src/ast/visitor/node-visitor.ts +13 -0
  179. package/src/ast/visitor/traversing-visitor.ts +69 -0
  180. package/src/completion/completion-rules.ts +447 -0
  181. package/src/completion/get-potential-syntactic-tokens.ts +54 -0
  182. package/src/completion/get-potential-token-type-ids.ts +116 -0
  183. package/src/completion/hierarchical-map.ts +43 -0
  184. package/src/completion/rules/abstract-types.ts +174 -0
  185. package/src/completion/rules/aggregate-output-value-rules.ts +48 -0
  186. package/src/completion/rules/aligned-modifier-rules.ts +45 -0
  187. package/src/completion/rules/array-definition-rules.ts +87 -0
  188. package/src/completion/rules/array-element-access-rules.ts +22 -0
  189. package/src/completion/rules/assignment-expression-rules.ts +19 -0
  190. package/src/completion/rules/binary-expression-rules.ts +23 -0
  191. package/src/completion/rules/bit-modifier-rules.ts +25 -0
  192. package/src/completion/rules/case-clause-rules.ts +39 -0
  193. package/src/completion/rules/class-declaration-rules.ts +81 -0
  194. package/src/completion/rules/class-definition-rules.ts +28 -0
  195. package/src/completion/rules/class-id-range-rules.ts +17 -0
  196. package/src/completion/rules/class-id-rules.ts +9 -0
  197. package/src/completion/rules/class-member-access-rules.ts +7 -0
  198. package/src/completion/rules/compound-statement-rules.ts +25 -0
  199. package/src/completion/rules/computed-array-definition-rules.ts +25 -0
  200. package/src/completion/rules/computed-elementary-type-rules.ts +44 -0
  201. package/src/completion/rules/default-clause-rules.ts +23 -0
  202. package/src/completion/rules/do-statement-rules.ts +38 -0
  203. package/src/completion/rules/elementary-type-definition-rules.ts +62 -0
  204. package/src/completion/rules/elementary-type-output-value-rules.ts +13 -0
  205. package/src/completion/rules/elementary-type-rules.ts +18 -0
  206. package/src/completion/rules/expandable-modifier-rules.ts +21 -0
  207. package/src/completion/rules/explicit-array-dimension-rules.ts +22 -0
  208. package/src/completion/rules/expression-statement-rules.ts +22 -0
  209. package/src/completion/rules/extended-class-id-range-rules.ts +17 -0
  210. package/src/completion/rules/extends-modifier-rules.ts +17 -0
  211. package/src/completion/rules/for-statement-rules.ts +51 -0
  212. package/src/completion/rules/if-statement-rules.ts +42 -0
  213. package/src/completion/rules/implicit-array-dimension-rules.ts +21 -0
  214. package/src/completion/rules/length-attribute-rules.ts +19 -0
  215. package/src/completion/rules/lengthof-expression-rules.ts +23 -0
  216. package/src/completion/rules/map-declaration-rules.ts +45 -0
  217. package/src/completion/rules/map-definition-rules.ts +46 -0
  218. package/src/completion/rules/map-entry-rules.ts +17 -0
  219. package/src/completion/rules/parameter-list-rules.ts +21 -0
  220. package/src/completion/rules/parameter-rules.ts +17 -0
  221. package/src/completion/rules/parameter-value-list-rules.ts +27 -0
  222. package/src/completion/rules/partial-array-dimension-rules.ts +33 -0
  223. package/src/completion/rules/specification-rules.ts +37 -0
  224. package/src/completion/rules/string-definition-rules.ts +103 -0
  225. package/src/completion/rules/switch-statement-rules.ts +50 -0
  226. package/src/completion/rules/unary-expression-rules.ts +41 -0
  227. package/src/completion/rules/utf-string-literal-rules.ts +17 -0
  228. package/src/completion/rules/while-statement-rules.ts +38 -0
  229. package/src/lezer/context-tracker.ts +45 -0
  230. package/src/lezer/create-sdl-parser.ts +88 -0
  231. package/src/lezer/create-syntax-error-from-text-and-cursor.ts +110 -0
  232. package/src/lezer/create-syntax-error-from-text-and-position.ts +36 -0
  233. package/src/lezer/parser.terms.ts +129 -0
  234. package/src/lezer/parser.ts +63 -0
  235. package/src/lezer/props/fold-node-prop-source.ts +27 -0
  236. package/src/lezer/props/primitive-node-prop-source.ts +19 -0
  237. package/src/lezer/props/style-tags-node-prop-source.ts +188 -0
  238. package/src/lezer/props/syntactic-token-node-prop-source.ts +298 -0
  239. package/src/lezer/sdl-string-input.ts +46 -0
  240. package/src/location.ts +13 -0
  241. package/src/parse-helper.ts +93 -0
  242. package/src/prettier/prettier-plugin-sdl.ts +89 -0
  243. package/src/prettier/print-abstract-array-dimension.ts +84 -0
  244. package/src/prettier/print-abstract-class-id.ts +53 -0
  245. package/src/prettier/print-abstract-expression.ts +168 -0
  246. package/src/prettier/print-abstract-node.ts +224 -0
  247. package/src/prettier/print-abstract-statement.ts +124 -0
  248. package/src/prettier/print-aggregate-output-value.ts +35 -0
  249. package/src/prettier/print-aligned-modifier.ts +50 -0
  250. package/src/prettier/print-array-definition.ts +95 -0
  251. package/src/prettier/print-array-element-access.ts +14 -0
  252. package/src/prettier/print-bit-modifier.ts +48 -0
  253. package/src/prettier/print-case-clause.ts +58 -0
  254. package/src/prettier/print-class-declaration.ts +99 -0
  255. package/src/prettier/print-class-definition.ts +44 -0
  256. package/src/prettier/print-class-member-access.ts +13 -0
  257. package/src/prettier/print-computed-array-definition.ts +33 -0
  258. package/src/prettier/print-computed-elementary-type-definition.ts +60 -0
  259. package/src/prettier/print-default-clause.ts +39 -0
  260. package/src/prettier/print-do-statement.ts +31 -0
  261. package/src/prettier/print-elementary-type-definition.ts +108 -0
  262. package/src/prettier/print-elementary-type-output-value.ts +13 -0
  263. package/src/prettier/print-elementary-type.ts +28 -0
  264. package/src/prettier/print-expandable-modifier.ts +41 -0
  265. package/src/prettier/print-extends-modifier.ts +29 -0
  266. package/src/prettier/print-for-statement.ts +64 -0
  267. package/src/prettier/print-identifier.ts +10 -0
  268. package/src/prettier/print-if-statement.ts +76 -0
  269. package/src/prettier/print-length-attribute.ts +14 -0
  270. package/src/prettier/print-map-declaration.ts +75 -0
  271. package/src/prettier/print-map-definition.ts +67 -0
  272. package/src/prettier/print-map-entry.ts +22 -0
  273. package/src/prettier/print-number-literal.ts +84 -0
  274. package/src/prettier/print-parameter-list.ts +20 -0
  275. package/src/prettier/print-parameter-value-list.ts +20 -0
  276. package/src/prettier/print-parameter.ts +34 -0
  277. package/src/prettier/print-specification.ts +51 -0
  278. package/src/prettier/print-string-definition.ts +114 -0
  279. package/src/prettier/print-string-literal.ts +57 -0
  280. package/src/prettier/print-switch-statement.ts +46 -0
  281. package/src/prettier/print-token.ts +7 -0
  282. package/src/prettier/print-unexpected-error.ts +10 -0
  283. package/src/prettier/print-while-statement.ts +26 -0
  284. package/src/prettier/util/print-utils.ts +607 -0
  285. package/src/prettier/util/types.ts +40 -0
  286. package/src/scanner-error.ts +65 -0
  287. package/src/util/location-utils.ts +16 -0
  288. package/src/util/logger.ts +165 -0
  289. package/tests/analyser/create-sdl-analyser.test.ts +54 -0
  290. package/tests/analyser/get-sdl-analyser-test-scenarios.ts +80 -0
  291. package/tests/analyser/sdl-analyser-scenarios.test.ts +67 -0
  292. package/tests/analyser/semantic-error-scenarios.test.ts +40 -0
  293. package/tests/analyser/symbol-table.test.ts +188 -0
  294. package/tests/analyser/test-cases/array_definition.txt +50 -0
  295. package/tests/analyser/test-cases/class_declaration.txt +112 -0
  296. package/tests/analyser/test-cases/class_definition.txt +60 -0
  297. package/tests/analyser/test-cases/compound_statement.txt +63 -0
  298. package/tests/analyser/test-cases/computed_array_definition.txt +12 -0
  299. package/tests/analyser/test-cases/computed_elementary_type_definition.txt +39 -0
  300. package/tests/analyser/test-cases/do_statement.txt +16 -0
  301. package/tests/analyser/test-cases/elementary_type_definition.txt +58 -0
  302. package/tests/analyser/test-cases/expression.txt +159 -0
  303. package/tests/analyser/test-cases/for_statement.txt +55 -0
  304. package/tests/analyser/test-cases/if_statement.txt +57 -0
  305. package/tests/analyser/test-cases/map_declaration.txt +89 -0
  306. package/tests/analyser/test-cases/map_definition.txt +35 -0
  307. package/tests/analyser/test-cases/number_literal.txt +31 -0
  308. package/tests/analyser/test-cases/parameter_list.txt +16 -0
  309. package/tests/analyser/test-cases/scopes.txt +239 -0
  310. package/tests/analyser/test-cases/specification.txt +28 -0
  311. package/tests/analyser/test-cases/string_definition.txt +40 -0
  312. package/tests/analyser/test-cases/switch_statement.txt +96 -0
  313. package/tests/analyser/test-cases/while_statement.txt +16 -0
  314. package/tests/analyser/util/symbol-table-utils.test.ts +65 -0
  315. package/tests/ast/__snapshots__/build-ast.test.ts.snap +38897 -0
  316. package/tests/ast/build-ast.test.ts +463 -0
  317. package/tests/ast/visitor/traversing-visitor.test.ts +36 -0
  318. package/tests/completion/get-potential-syntactic-tokens.test.ts +89 -0
  319. package/tests/completion/get-potential-token-type-ids.test.ts +76 -0
  320. package/tests/completion/test-potential-syntactic-tokens-scenario.ts +24 -0
  321. package/tests/completion/test-potential-token-type-ids-scenario.ts +33 -0
  322. package/tests/fixtures/history-recording-node-handler.ts +232 -0
  323. package/tests/lezer/create-parse-error-from-text-and-position.test.ts +129 -0
  324. package/tests/lezer/create-sdl-parser.test.ts +15 -0
  325. package/tests/lezer/sdl-parser-scenarios.test.ts +24 -0
  326. package/tests/lezer/sdl-string-input.test.ts +12 -0
  327. package/tests/lezer/syntax-error-scenarios.test.ts +114 -0
  328. package/tests/lezer/test-cases/array_definition.txt +109 -0
  329. package/tests/lezer/test-cases/class_declaration.txt +141 -0
  330. package/tests/lezer/test-cases/class_definition.txt +89 -0
  331. package/tests/lezer/test-cases/comment.txt +335 -0
  332. package/tests/lezer/test-cases/compound_statement.txt +109 -0
  333. package/tests/lezer/test-cases/computed_array_definition.txt +33 -0
  334. package/tests/lezer/test-cases/computed_elementary_type_definition.txt +59 -0
  335. package/tests/lezer/test-cases/do_statement.txt +48 -0
  336. package/tests/lezer/test-cases/elementary_type_definition.txt +158 -0
  337. package/tests/lezer/test-cases/expression.txt +1203 -0
  338. package/tests/lezer/test-cases/for_statement.txt +183 -0
  339. package/tests/lezer/test-cases/if_statement.txt +183 -0
  340. package/tests/lezer/test-cases/invalid.txt +97 -0
  341. package/tests/lezer/test-cases/map_declaration.txt +152 -0
  342. package/tests/lezer/test-cases/map_definition.txt +59 -0
  343. package/tests/lezer/test-cases/number_literal.txt +273 -0
  344. package/tests/lezer/test-cases/specification.txt +38 -0
  345. package/tests/lezer/test-cases/string_definition.txt +263 -0
  346. package/tests/lezer/test-cases/string_literal.txt +303 -0
  347. package/tests/lezer/test-cases/switch_statement.txt +407 -0
  348. package/tests/lezer/test-cases/while_statement.txt +45 -0
  349. package/tests/parse-helper.test.ts +361 -0
  350. package/tests/prettier/__snapshots__/prettier-plugin-sdl.test.ts.snap +127 -0
  351. package/tests/prettier/prettier-plugin-sdl.test.ts +58 -0
  352. package/tests/prettier/print-array.test.ts +29 -0
  353. package/tests/prettier/print-class.test.ts +15 -0
  354. package/tests/prettier/print-do.test.ts +25 -0
  355. package/tests/prettier/print-elementary-type.test.ts +62 -0
  356. package/tests/prettier/print-error.test.ts +40 -0
  357. package/tests/prettier/print-expression.test.ts +17 -0
  358. package/tests/prettier/print-for.test.ts +23 -0
  359. package/tests/prettier/print-if.test.ts +71 -0
  360. package/tests/prettier/print-number-literal.test.ts +28 -0
  361. package/tests/prettier/print-specification.test.ts +54 -0
  362. package/tests/prettier/print-string.test.ts +36 -0
  363. package/tests/prettier/print-switch.test.ts +69 -0
  364. package/tests/prettier/print-while.test.ts +23 -0
  365. package/tests/prettier/test-prettier-scenario.ts +41 -0
  366. package/tests/prettier/util/print-utils.test.ts +665 -0
  367. package/tests/prettier/util/types.test.ts +38 -0
  368. package/tests/sample-specifications/invalid.sdl +24 -0
  369. package/tests/sample-specifications/prettified-invalid.sdl +28 -0
  370. package/tests/sample-specifications/prettified-various-elements-narrow.sdl +97 -0
  371. package/tests/sample-specifications/prettified-various-elements.sdl +90 -0
  372. package/tests/sample-specifications/sample.sdl +24 -0
  373. package/tests/sample-specifications/various-elements.sdl +88 -0
  374. package/tests/util/logger.test.ts +36 -0
  375. 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
+ }