@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,110 @@
1
+ import { NodeKind } from "../../node/enum/node-kind.ts";
2
+ import { StringLiteral } from "../../node/string-literal.ts";
3
+ import { StringLiteralKind } from "../../node/enum/string-literal-kind.ts";
4
+ import type { BuildContext } from "../util/build-context.ts";
5
+ import { Token } from "../../node/token.ts";
6
+ import { fetchOneToManyList } from "../util/fetch-node.ts";
7
+ import { InternalScannerError } from "../../../scanner-error.ts";
8
+ import { getLocationFromTextPosition } from "../../../util/location-utils.ts";
9
+ import type { TreeCursor } from "@lezer/common";
10
+ import { Text } from "@codemirror/state";
11
+ import { isToken } from "../../util/types.ts";
12
+ import { TokenKind } from "../../node/enum/token-kind.ts";
13
+
14
+ const ESCAPED_BACKSLASH_REGEX = /\\\\/g;
15
+ const ESCAPED_DOUBLE_QUOTE_REGEX = /\\"/g;
16
+ const FOUR_HEXADECIMAL_UNIVERSAL_CHARACTER_NAME_REGEX = /\\u[0-9A-F]{4}/g;
17
+ const EIGHT_HEXADECIMAL_UNIVERSAL_CHARACTER_NAME_REGEX = /\\U[0-9A-F]{8}/g;
18
+
19
+ function getStringValueFromLiteralText(
20
+ literalText: string,
21
+ cursor: TreeCursor,
22
+ text: Text,
23
+ ): string {
24
+ let value = literalText.replaceAll(ESCAPED_DOUBLE_QUOTE_REGEX, "'")
25
+ .replaceAll(ESCAPED_BACKSLASH_REGEX, "\\");
26
+
27
+ value = value.replaceAll(
28
+ FOUR_HEXADECIMAL_UNIVERSAL_CHARACTER_NAME_REGEX,
29
+ (match) => {
30
+ if (!match.startsWith("\\u")) {
31
+ throw new InternalScannerError(
32
+ `Missing prefix "\\u" in universal character name: ${match}`,
33
+ getLocationFromTextPosition(text, cursor.from),
34
+ );
35
+ }
36
+
37
+ const codePoint = parseInt(match.substring(2), 16);
38
+
39
+ if (isNaN(codePoint)) {
40
+ throw new InternalScannerError(
41
+ `Unable to convert universal character name: ${codePoint} to code point number`,
42
+ getLocationFromTextPosition(text, cursor.from),
43
+ );
44
+ }
45
+
46
+ return String.fromCodePoint(0x1234);
47
+ },
48
+ );
49
+
50
+ value = value.replaceAll(
51
+ EIGHT_HEXADECIMAL_UNIVERSAL_CHARACTER_NAME_REGEX,
52
+ (match) => {
53
+ if (!match.startsWith("\\U")) {
54
+ throw new InternalScannerError(
55
+ `Missing prefix "\\U" in universal character name: ${match}`,
56
+ getLocationFromTextPosition(text, cursor.from),
57
+ );
58
+ }
59
+
60
+ const codePoint = parseInt(match.substring(2), 16);
61
+
62
+ if (isNaN(codePoint)) {
63
+ throw new InternalScannerError(
64
+ `Unable to convert universal character name: ${match} to code point number`,
65
+ getLocationFromTextPosition(text, cursor.from),
66
+ );
67
+ }
68
+
69
+ return String.fromCodePoint(codePoint);
70
+ },
71
+ );
72
+
73
+ return value;
74
+ }
75
+
76
+ export function buildUtfStringLiteral(
77
+ buildContext: BuildContext,
78
+ ): StringLiteral {
79
+ const literals = fetchOneToManyList<Token>(
80
+ buildContext,
81
+ NodeKind.TOKEN,
82
+ [
83
+ TokenKind.UTF_PREFIX,
84
+ TokenKind.DOUBLE_QUOTE,
85
+ TokenKind.UTF_STRING_LITERAL_CHARACTERS,
86
+ ],
87
+ );
88
+
89
+ let value = "";
90
+
91
+ for (const literal of literals) {
92
+ if (
93
+ isToken(literal) &&
94
+ (literal.tokenKind === TokenKind.UTF_STRING_LITERAL_CHARACTERS)
95
+ ) {
96
+ value += getStringValueFromLiteralText(
97
+ literal.text,
98
+ buildContext.cursor,
99
+ buildContext.text,
100
+ );
101
+ }
102
+ }
103
+
104
+ return new StringLiteral(
105
+ StringLiteralKind.UTF,
106
+ value,
107
+ literals,
108
+ [...literals],
109
+ );
110
+ }
@@ -0,0 +1,55 @@
1
+ import { NodeKind } from "../../node/enum/node-kind.ts";
2
+ import type { AbstractExpression } from "../../node/abstract-expression.ts";
3
+ import type { NumberLiteral } from "../../node/number-literal.ts";
4
+ import type { Identifier } from "../../node/identifier.ts";
5
+ import { WhileStatement } from "../../node/while-statement.ts";
6
+ import type { BuildContext } from "../util/build-context.ts";
7
+ import type { Token } from "../../node/token.ts";
8
+ import { fetchRequiredNode } from "../util/fetch-node.ts";
9
+ import { TokenKind } from "../../node/enum/token-kind.ts";
10
+ import type { AbstractStatement } from "../../node/abstract-statement.ts";
11
+
12
+ export function buildWhileStatement(
13
+ buildContext: BuildContext,
14
+ ): WhileStatement {
15
+ const whileKeyword = fetchRequiredNode<Token>(
16
+ buildContext,
17
+ NodeKind.TOKEN,
18
+ TokenKind.WHILE,
19
+ );
20
+ const openParenthesisPunctuator = fetchRequiredNode<Token>(
21
+ buildContext,
22
+ NodeKind.TOKEN,
23
+ TokenKind.OPEN_PARENTHESIS,
24
+ );
25
+ const condition = fetchRequiredNode<
26
+ AbstractExpression | Identifier | NumberLiteral
27
+ >(
28
+ buildContext,
29
+ [NodeKind.EXPRESSION, NodeKind.IDENTIFIER, NodeKind.NUMBER_LITERAL],
30
+ );
31
+ const closeParenthesisPunctuator = fetchRequiredNode<Token>(
32
+ buildContext,
33
+ NodeKind.TOKEN,
34
+ TokenKind.CLOSE_PARENTHESIS,
35
+ );
36
+ const statement = fetchRequiredNode<AbstractStatement>(
37
+ buildContext,
38
+ NodeKind.STATEMENT,
39
+ );
40
+
41
+ return new WhileStatement(
42
+ whileKeyword,
43
+ openParenthesisPunctuator,
44
+ condition,
45
+ closeParenthesisPunctuator,
46
+ statement,
47
+ [
48
+ whileKeyword,
49
+ openParenthesisPunctuator,
50
+ condition,
51
+ closeParenthesisPunctuator,
52
+ statement,
53
+ ],
54
+ );
55
+ }
@@ -0,0 +1,167 @@
1
+ import { ArrayDimensionKind } from "../../node/enum/array-dimension-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 arrayDimensionKindByTokenTypeId: Map<number, ArrayDimensionKind> =
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.ExplicitArrayDimension:
17
+ arrayDimensionKindByTokenTypeId.set(
18
+ tokenTypeId,
19
+ ArrayDimensionKind.EXPLICIT,
20
+ );
21
+ break;
22
+ case TokenTypeId.ImplicitArrayDimension:
23
+ arrayDimensionKindByTokenTypeId.set(
24
+ tokenTypeId,
25
+ ArrayDimensionKind.IMPLICIT,
26
+ );
27
+ break;
28
+ case TokenTypeId.PartialArrayDimension:
29
+ arrayDimensionKindByTokenTypeId.set(
30
+ tokenTypeId,
31
+ ArrayDimensionKind.PARTIAL,
32
+ );
33
+ break;
34
+ case TokenTypeId.AlignedModifier:
35
+ case TokenTypeId.AggregateOutputValue:
36
+ case TokenTypeId.ArrayDefinition:
37
+ case TokenTypeId.ClassDefinition:
38
+ case TokenTypeId.ClassDeclaration:
39
+ case TokenTypeId.CompoundStatement:
40
+ case TokenTypeId.ComputedArrayDefinition:
41
+ case TokenTypeId.ComputedElementaryTypeDefinition:
42
+ case TokenTypeId.DoStatement:
43
+ case TokenTypeId.ElementaryTypeDefinition:
44
+ case TokenTypeId.ExpressionStatement:
45
+ case TokenTypeId.ForStatement:
46
+ case TokenTypeId.IfStatement:
47
+ case TokenTypeId.MapDeclaration:
48
+ case TokenTypeId.StringDefinition:
49
+ case TokenTypeId.SwitchStatement:
50
+ case TokenTypeId.WhileStatement:
51
+ case TokenTypeId.AssignmentExpression:
52
+ case TokenTypeId.BinaryExpression:
53
+ case TokenTypeId.LengthofExpression:
54
+ case TokenTypeId.UnaryExpression:
55
+ case TokenTypeId.ArrayElementAccess:
56
+ case TokenTypeId.Base64StringLiteral:
57
+ case TokenTypeId.UtfStringLiteral:
58
+ case TokenTypeId.BitModifier:
59
+ case TokenTypeId.CaseClause:
60
+ case TokenTypeId.ClassId:
61
+ case TokenTypeId.ClassIdRange:
62
+ case TokenTypeId.ExtendedClassIdRange:
63
+ case TokenTypeId.ClassMemberAccess:
64
+ case TokenTypeId.DefaultClause:
65
+ case TokenTypeId.ElementaryType:
66
+ case TokenTypeId.ElementaryTypeOutputValue:
67
+ case TokenTypeId.ExpandableModifier:
68
+ case TokenTypeId.ExtendsModifier:
69
+ case TokenTypeId.LengthAttribute:
70
+ case TokenTypeId.MapDefinition:
71
+ case TokenTypeId.MapEntry:
72
+ case TokenTypeId.MultipleCharacterLiteral:
73
+ case TokenTypeId.Parameter:
74
+ case TokenTypeId.ParameterList:
75
+ case TokenTypeId.ParameterValueList:
76
+ case TokenTypeId.Specification:
77
+ case TokenTypeId._break:
78
+ case TokenTypeId._case:
79
+ case TokenTypeId._class:
80
+ case TokenTypeId._const:
81
+ case TokenTypeId._default:
82
+ case TokenTypeId._do:
83
+ case TokenTypeId._else:
84
+ case TokenTypeId._extends:
85
+ case TokenTypeId._for:
86
+ case TokenTypeId._if:
87
+ case TokenTypeId._switch:
88
+ case TokenTypeId._while:
89
+ case TokenTypeId.abstract:
90
+ case TokenTypeId.Addition:
91
+ case TokenTypeId.AlignmentBitCount8:
92
+ case TokenTypeId.AlignmentBitCount16:
93
+ case TokenTypeId.AlignmentBitCount32:
94
+ case TokenTypeId.AlignmentBitCount64:
95
+ case TokenTypeId.AlignmentBitCount128:
96
+ case TokenTypeId.aligned:
97
+ case TokenTypeId.Assignment:
98
+ case TokenTypeId.base64string:
99
+ case TokenTypeId.Base64StringLiteralCharacters:
100
+ case TokenTypeId.BinaryLiteral:
101
+ case TokenTypeId.bit:
102
+ case TokenTypeId.BitwiseAnd:
103
+ case TokenTypeId.BitwiseOr:
104
+ case TokenTypeId.BitwiseShiftLeft:
105
+ case TokenTypeId.BitwiseShiftRight:
106
+ case TokenTypeId.CloseBrace:
107
+ case TokenTypeId.CloseBracket:
108
+ case TokenTypeId.CloseParenthesis:
109
+ case TokenTypeId.Colon:
110
+ case TokenTypeId.Comma:
111
+ case TokenTypeId.Comment:
112
+ case TokenTypeId.computed:
113
+ case TokenTypeId.DecimalLiteral:
114
+ case TokenTypeId.Division:
115
+ case TokenTypeId.DoubleQuote:
116
+ case TokenTypeId.expandable:
117
+ case TokenTypeId.float:
118
+ case TokenTypeId.FloatingPointLiteral:
119
+ case TokenTypeId.HexadecimalLiteral:
120
+ case TokenTypeId.Identifier:
121
+ case TokenTypeId.int:
122
+ case TokenTypeId.IntegerLiteral:
123
+ case TokenTypeId.legacy:
124
+ case TokenTypeId.lengthof:
125
+ case TokenTypeId.LogicalAnd:
126
+ case TokenTypeId.LogicalOr:
127
+ case TokenTypeId.LookAhead:
128
+ case TokenTypeId.map:
129
+ case TokenTypeId.Modulus:
130
+ case TokenTypeId.MultipleCharacterLiteralCharacters:
131
+ case TokenTypeId.Multiplication:
132
+ case TokenTypeId.OpenBrace:
133
+ case TokenTypeId.OpenBracket:
134
+ case TokenTypeId.OpenParenthesis:
135
+ case TokenTypeId.Period:
136
+ case TokenTypeId.PostfixDecrement:
137
+ case TokenTypeId.PostfixIncrement:
138
+ case TokenTypeId.RangeOperator:
139
+ case TokenTypeId.reserved:
140
+ case TokenTypeId.RelationalEqual:
141
+ case TokenTypeId.RelationalGreaterThan:
142
+ case TokenTypeId.RelationalGreaterThanOrEqual:
143
+ case TokenTypeId.RelationalLessThan:
144
+ case TokenTypeId.RelationalLessThanOrEqual:
145
+ case TokenTypeId.RelationalNotEqual:
146
+ case TokenTypeId.Semicolon:
147
+ case TokenTypeId.SingleQuote:
148
+ case TokenTypeId.Subtraction:
149
+ case TokenTypeId.UnaryNegation:
150
+ case TokenTypeId.UnaryPlus:
151
+ case TokenTypeId.unsigned:
152
+ case TokenTypeId.utf16string:
153
+ case TokenTypeId.utf8list:
154
+ case TokenTypeId.utf8string:
155
+ case TokenTypeId.utfstring:
156
+ case TokenTypeId.UtfPrefix:
157
+ case TokenTypeId.UtfStringLiteralCharacters:
158
+ case TokenTypeId.Whitespace:
159
+ break;
160
+ default: {
161
+ const exhaustiveCheck: never = tokenTypeId;
162
+ throw new InternalScannerError(
163
+ "Unreachable code reached, tokenTypeId == " + exhaustiveCheck,
164
+ );
165
+ }
166
+ }
167
+ });
@@ -0,0 +1,152 @@
1
+ import type { BinaryOperatorKind } from "../../node/enum/binary-operator-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 binaryOperatorKindByTokenTypeId: Map<number, BinaryOperatorKind> =
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.ArrayDefinition:
17
+ case TokenTypeId.ComputedArrayDefinition:
18
+ case TokenTypeId.ComputedElementaryTypeDefinition:
19
+ case TokenTypeId.ClassDeclaration:
20
+ case TokenTypeId.ClassDefinition:
21
+ case TokenTypeId.CompoundStatement:
22
+ case TokenTypeId.DoStatement:
23
+ case TokenTypeId.ElementaryTypeDefinition:
24
+ case TokenTypeId.ExpressionStatement:
25
+ case TokenTypeId.ForStatement:
26
+ case TokenTypeId.IfStatement:
27
+ case TokenTypeId.MapDeclaration:
28
+ case TokenTypeId.MapDefinition:
29
+ case TokenTypeId.StringDefinition:
30
+ case TokenTypeId.SwitchStatement:
31
+ case TokenTypeId.WhileStatement:
32
+ case TokenTypeId.AlignedModifier:
33
+ case TokenTypeId.AggregateOutputValue:
34
+ case TokenTypeId.AssignmentExpression:
35
+ case TokenTypeId.BinaryExpression:
36
+ case TokenTypeId.LengthofExpression:
37
+ case TokenTypeId.UnaryExpression:
38
+ case TokenTypeId.ArrayElementAccess:
39
+ case TokenTypeId.Base64StringLiteral:
40
+ case TokenTypeId.UtfStringLiteral:
41
+ case TokenTypeId.BitModifier:
42
+ case TokenTypeId.CaseClause:
43
+ case TokenTypeId.ClassId:
44
+ case TokenTypeId.ClassIdRange:
45
+ case TokenTypeId.ExtendedClassIdRange:
46
+ case TokenTypeId.ClassMemberAccess:
47
+ case TokenTypeId.DefaultClause:
48
+ case TokenTypeId.ElementaryType:
49
+ case TokenTypeId.ElementaryTypeOutputValue:
50
+ case TokenTypeId.ExpandableModifier:
51
+ case TokenTypeId.ExplicitArrayDimension:
52
+ case TokenTypeId.ImplicitArrayDimension:
53
+ case TokenTypeId.PartialArrayDimension:
54
+ case TokenTypeId.ExtendsModifier:
55
+ case TokenTypeId.LengthAttribute:
56
+ case TokenTypeId.MapEntry:
57
+ case TokenTypeId.MultipleCharacterLiteral:
58
+ case TokenTypeId.Parameter:
59
+ case TokenTypeId.ParameterList:
60
+ case TokenTypeId.ParameterValueList:
61
+ case TokenTypeId.Specification:
62
+ case TokenTypeId._break:
63
+ case TokenTypeId._case:
64
+ case TokenTypeId._class:
65
+ case TokenTypeId._const:
66
+ case TokenTypeId._default:
67
+ case TokenTypeId._do:
68
+ case TokenTypeId._else:
69
+ case TokenTypeId._extends:
70
+ case TokenTypeId._for:
71
+ case TokenTypeId._if:
72
+ case TokenTypeId._switch:
73
+ case TokenTypeId._while:
74
+ case TokenTypeId.abstract:
75
+ case TokenTypeId.Addition:
76
+ case TokenTypeId.AlignmentBitCount8:
77
+ case TokenTypeId.AlignmentBitCount16:
78
+ case TokenTypeId.AlignmentBitCount32:
79
+ case TokenTypeId.AlignmentBitCount64:
80
+ case TokenTypeId.AlignmentBitCount128:
81
+ case TokenTypeId.aligned:
82
+ case TokenTypeId.Assignment:
83
+ case TokenTypeId.base64string:
84
+ case TokenTypeId.Base64StringLiteralCharacters:
85
+ case TokenTypeId.BinaryLiteral:
86
+ case TokenTypeId.bit:
87
+ case TokenTypeId.BitwiseAnd:
88
+ case TokenTypeId.BitwiseOr:
89
+ case TokenTypeId.BitwiseShiftLeft:
90
+ case TokenTypeId.BitwiseShiftRight:
91
+ case TokenTypeId.CloseBrace:
92
+ case TokenTypeId.CloseBracket:
93
+ case TokenTypeId.CloseParenthesis:
94
+ case TokenTypeId.Colon:
95
+ case TokenTypeId.Comma:
96
+ case TokenTypeId.Comment:
97
+ case TokenTypeId.computed:
98
+ case TokenTypeId.DecimalLiteral:
99
+ case TokenTypeId.Division:
100
+ case TokenTypeId.DoubleQuote:
101
+ case TokenTypeId.expandable:
102
+ case TokenTypeId.float:
103
+ case TokenTypeId.FloatingPointLiteral:
104
+ case TokenTypeId.HexadecimalLiteral:
105
+ case TokenTypeId.Identifier:
106
+ case TokenTypeId.int:
107
+ case TokenTypeId.IntegerLiteral:
108
+ case TokenTypeId.legacy:
109
+ case TokenTypeId.lengthof:
110
+ case TokenTypeId.LogicalAnd:
111
+ case TokenTypeId.LogicalOr:
112
+ case TokenTypeId.LookAhead:
113
+ case TokenTypeId.map:
114
+ case TokenTypeId.Modulus:
115
+ case TokenTypeId.MultipleCharacterLiteralCharacters:
116
+ case TokenTypeId.Multiplication:
117
+ case TokenTypeId.OpenBrace:
118
+ case TokenTypeId.OpenBracket:
119
+ case TokenTypeId.OpenParenthesis:
120
+ case TokenTypeId.Period:
121
+ case TokenTypeId.PostfixDecrement:
122
+ case TokenTypeId.PostfixIncrement:
123
+ case TokenTypeId.RangeOperator:
124
+ case TokenTypeId.reserved:
125
+ case TokenTypeId.RelationalEqual:
126
+ case TokenTypeId.RelationalGreaterThan:
127
+ case TokenTypeId.RelationalGreaterThanOrEqual:
128
+ case TokenTypeId.RelationalLessThan:
129
+ case TokenTypeId.RelationalLessThanOrEqual:
130
+ case TokenTypeId.RelationalNotEqual:
131
+ case TokenTypeId.Semicolon:
132
+ case TokenTypeId.SingleQuote:
133
+ case TokenTypeId.Subtraction:
134
+ case TokenTypeId.UnaryNegation:
135
+ case TokenTypeId.UnaryPlus:
136
+ case TokenTypeId.unsigned:
137
+ case TokenTypeId.utf16string:
138
+ case TokenTypeId.utf8list:
139
+ case TokenTypeId.utf8string:
140
+ case TokenTypeId.utfstring:
141
+ case TokenTypeId.UtfPrefix:
142
+ case TokenTypeId.UtfStringLiteralCharacters:
143
+ case TokenTypeId.Whitespace:
144
+ break;
145
+ default: {
146
+ const exhaustiveCheck: never = tokenTypeId;
147
+ throw new InternalScannerError(
148
+ "Unreachable code reached, tokenTypeId == " + exhaustiveCheck,
149
+ );
150
+ }
151
+ }
152
+ });
@@ -0,0 +1,36 @@
1
+ import { Text } from "@codemirror/state";
2
+ import type { TreeCursor } from "@lezer/common";
3
+ import type { AbstractNode } from "../../node/abstract-node.ts";
4
+ import type { Trivia } from "../../node/trivia.ts";
5
+
6
+ /**
7
+ * State information used during AST construction.
8
+ *
9
+ * @interface State
10
+ * @property {boolean} isEndOfSiblings - Indicates if there are no more sibling nodes to process.
11
+ * @property {AbstractNode} [nextNode] - The next node to be processed, if applicable.
12
+ * @property {string} indent - The current indentation level for logging purposes.
13
+ */
14
+ export interface State {
15
+ isEndOfSiblings: boolean;
16
+ nextNode?: AbstractNode;
17
+ indent: string;
18
+ }
19
+
20
+ /**
21
+ * State storage while building the AST.
22
+ *
23
+ * @interface BuildContext
24
+ * @property {TreeCursor} cursor - The current position in the parse tree.
25
+ * @property {Text} text - The source text that was parsed.
26
+ * @property {boolean} lenient - Whether to build the AST leniently, allowing error nodes.
27
+ * @property {State[]} stateStack - A stack of states used during AST construction.
28
+ * @property {Trivia[]} [unconsumedTrivia] - Any trivia not consumed. This should only be present for trailing trivia after the root node.
29
+ */
30
+ export interface BuildContext {
31
+ readonly cursor: TreeCursor;
32
+ readonly text: Text;
33
+ readonly lenient: boolean;
34
+ stateStack: State[];
35
+ unconsumedTrivia?: Trivia[];
36
+ }
@@ -0,0 +1,160 @@
1
+ import { ClassIdKind } from "../../node/enum/class-id-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 classIdKindByTokenTypeId: Map<number, ClassIdKind> = new Map();
8
+
9
+ /**
10
+ * Map parsed token type ID to AST token type enum.
11
+ * Exhaustive switch statement to ensure all token type IDs are handled.
12
+ */
13
+ Object.values(TokenTypeId).forEach((tokenTypeId) => {
14
+ switch (tokenTypeId) {
15
+ case TokenTypeId.ClassId:
16
+ classIdKindByTokenTypeId.set(tokenTypeId, ClassIdKind.SINGLE);
17
+ break;
18
+ case TokenTypeId.ClassIdRange:
19
+ classIdKindByTokenTypeId.set(tokenTypeId, ClassIdKind.RANGE);
20
+ break;
21
+ case TokenTypeId.ExtendedClassIdRange:
22
+ classIdKindByTokenTypeId.set(
23
+ tokenTypeId,
24
+ ClassIdKind.EXTENDED_RANGE,
25
+ );
26
+ break;
27
+ case TokenTypeId.AlignedModifier:
28
+ case TokenTypeId.AggregateOutputValue:
29
+ case TokenTypeId.ArrayDefinition:
30
+ case TokenTypeId.ClassDefinition:
31
+ case TokenTypeId.ClassDeclaration:
32
+ case TokenTypeId.CompoundStatement:
33
+ case TokenTypeId.ComputedArrayDefinition:
34
+ case TokenTypeId.ComputedElementaryTypeDefinition:
35
+ case TokenTypeId.DoStatement:
36
+ case TokenTypeId.ElementaryTypeDefinition:
37
+ case TokenTypeId.ExpressionStatement:
38
+ case TokenTypeId.ForStatement:
39
+ case TokenTypeId.IfStatement:
40
+ case TokenTypeId.MapDeclaration:
41
+ case TokenTypeId.StringDefinition:
42
+ case TokenTypeId.SwitchStatement:
43
+ case TokenTypeId.WhileStatement:
44
+ case TokenTypeId.AssignmentExpression:
45
+ case TokenTypeId.BinaryExpression:
46
+ case TokenTypeId.LengthofExpression:
47
+ case TokenTypeId.UnaryExpression:
48
+ case TokenTypeId.ArrayElementAccess:
49
+ case TokenTypeId.Base64StringLiteral:
50
+ case TokenTypeId.UtfStringLiteral:
51
+ case TokenTypeId.BitModifier:
52
+ case TokenTypeId.CaseClause:
53
+ case TokenTypeId.ClassMemberAccess:
54
+ case TokenTypeId.DefaultClause:
55
+ case TokenTypeId.ElementaryType:
56
+ case TokenTypeId.ElementaryTypeOutputValue:
57
+ case TokenTypeId.ExpandableModifier:
58
+ case TokenTypeId.ExplicitArrayDimension:
59
+ case TokenTypeId.ImplicitArrayDimension:
60
+ case TokenTypeId.PartialArrayDimension:
61
+ case TokenTypeId.ExtendsModifier:
62
+ case TokenTypeId.LengthAttribute:
63
+ case TokenTypeId.MapDefinition:
64
+ case TokenTypeId.MapEntry:
65
+ case TokenTypeId.MultipleCharacterLiteral:
66
+ case TokenTypeId.Parameter:
67
+ case TokenTypeId.ParameterList:
68
+ case TokenTypeId.ParameterValueList:
69
+ case TokenTypeId.Specification:
70
+ case TokenTypeId._break:
71
+ case TokenTypeId._case:
72
+ case TokenTypeId._class:
73
+ case TokenTypeId._const:
74
+ case TokenTypeId._default:
75
+ case TokenTypeId._do:
76
+ case TokenTypeId._else:
77
+ case TokenTypeId._extends:
78
+ case TokenTypeId._for:
79
+ case TokenTypeId._if:
80
+ case TokenTypeId._switch:
81
+ case TokenTypeId._while:
82
+ case TokenTypeId.abstract:
83
+ case TokenTypeId.Addition:
84
+ case TokenTypeId.AlignmentBitCount8:
85
+ case TokenTypeId.AlignmentBitCount16:
86
+ case TokenTypeId.AlignmentBitCount32:
87
+ case TokenTypeId.AlignmentBitCount64:
88
+ case TokenTypeId.AlignmentBitCount128:
89
+ case TokenTypeId.aligned:
90
+ case TokenTypeId.Assignment:
91
+ case TokenTypeId.base64string:
92
+ case TokenTypeId.Base64StringLiteralCharacters:
93
+ case TokenTypeId.BinaryLiteral:
94
+ case TokenTypeId.bit:
95
+ case TokenTypeId.BitwiseAnd:
96
+ case TokenTypeId.BitwiseOr:
97
+ case TokenTypeId.BitwiseShiftLeft:
98
+ case TokenTypeId.BitwiseShiftRight:
99
+ case TokenTypeId.CloseBrace:
100
+ case TokenTypeId.CloseBracket:
101
+ case TokenTypeId.CloseParenthesis:
102
+ case TokenTypeId.Colon:
103
+ case TokenTypeId.Comma:
104
+ case TokenTypeId.Comment:
105
+ case TokenTypeId.computed:
106
+ case TokenTypeId.DecimalLiteral:
107
+ case TokenTypeId.Division:
108
+ case TokenTypeId.DoubleQuote:
109
+ case TokenTypeId.expandable:
110
+ case TokenTypeId.float:
111
+ case TokenTypeId.FloatingPointLiteral:
112
+ case TokenTypeId.HexadecimalLiteral:
113
+ case TokenTypeId.Identifier:
114
+ case TokenTypeId.int:
115
+ case TokenTypeId.IntegerLiteral:
116
+ case TokenTypeId.legacy:
117
+ case TokenTypeId.lengthof:
118
+ case TokenTypeId.LogicalAnd:
119
+ case TokenTypeId.LogicalOr:
120
+ case TokenTypeId.LookAhead:
121
+ case TokenTypeId.map:
122
+ case TokenTypeId.Modulus:
123
+ case TokenTypeId.MultipleCharacterLiteralCharacters:
124
+ case TokenTypeId.Multiplication:
125
+ case TokenTypeId.OpenBrace:
126
+ case TokenTypeId.OpenBracket:
127
+ case TokenTypeId.OpenParenthesis:
128
+ case TokenTypeId.Period:
129
+ case TokenTypeId.PostfixDecrement:
130
+ case TokenTypeId.PostfixIncrement:
131
+ case TokenTypeId.RangeOperator:
132
+ case TokenTypeId.reserved:
133
+ case TokenTypeId.RelationalEqual:
134
+ case TokenTypeId.RelationalGreaterThan:
135
+ case TokenTypeId.RelationalGreaterThanOrEqual:
136
+ case TokenTypeId.RelationalLessThan:
137
+ case TokenTypeId.RelationalLessThanOrEqual:
138
+ case TokenTypeId.RelationalNotEqual:
139
+ case TokenTypeId.Semicolon:
140
+ case TokenTypeId.SingleQuote:
141
+ case TokenTypeId.Subtraction:
142
+ case TokenTypeId.UnaryNegation:
143
+ case TokenTypeId.UnaryPlus:
144
+ case TokenTypeId.unsigned:
145
+ case TokenTypeId.utf16string:
146
+ case TokenTypeId.utf8list:
147
+ case TokenTypeId.utf8string:
148
+ case TokenTypeId.utfstring:
149
+ case TokenTypeId.UtfPrefix:
150
+ case TokenTypeId.UtfStringLiteralCharacters:
151
+ case TokenTypeId.Whitespace:
152
+ break;
153
+ default: {
154
+ const exhaustiveCheck: never = tokenTypeId;
155
+ throw new InternalScannerError(
156
+ "Unreachable code reached, tokenTypeId == " + exhaustiveCheck,
157
+ );
158
+ }
159
+ }
160
+ });