@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,164 @@
1
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
2
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
3
+ import type { IfStatement } from "../../ast/node/if-statement.ts";
4
+ import type { AbstractStatement } from "../../ast/node/abstract-statement.ts";
5
+ import type { SymbolTable } from "../symbol-table.ts";
6
+ import type { Check, CheckResult } from "./check.ts";
7
+ import {
8
+ isCaseClause,
9
+ isDefaultClause,
10
+ isStatement,
11
+ } from "../../ast/util/types.ts";
12
+ import type { SwitchStatement } from "../../ast/node/switch-statement.ts";
13
+
14
+ export function collectMemberVariableNames(
15
+ statement: AbstractStatement,
16
+ ): Set<string> {
17
+ const names = new Set<string>();
18
+
19
+ function traverse(stmt: AbstractStatement) {
20
+ // Check if this statement declares a member variable
21
+ if (stmt.nodeKind === NodeKind.STATEMENT) {
22
+ switch (stmt.statementKind) {
23
+ case StatementKind.ELEMENTARY_TYPE_DEFINITION:
24
+ case StatementKind.COMPUTED_ELEMENTARY_TYPE_DEFINITION:
25
+ case StatementKind.ARRAY_DEFINITION:
26
+ case StatementKind.COMPUTED_ARRAY_DEFINITION:
27
+ case StatementKind.STRING_DEFINITION:
28
+ case StatementKind.CLASS_DEFINITION:
29
+ case StatementKind.MAP_DEFINITION: {
30
+ // These statements have an identifier property that represents the variable name
31
+ const stmtWithIdentifier = stmt as { identifier?: { name?: string } };
32
+ if (stmtWithIdentifier.identifier?.name) {
33
+ names.add(stmtWithIdentifier.identifier.name);
34
+ }
35
+ break;
36
+ }
37
+ case StatementKind.COMPOUND: {
38
+ // Recursively check compound statements
39
+ const compoundStmt = stmt as { statements?: AbstractStatement[] };
40
+ if (compoundStmt.statements) {
41
+ for (const nestedStmt of compoundStmt.statements) {
42
+ traverse(nestedStmt);
43
+ }
44
+ }
45
+ break;
46
+ }
47
+ case StatementKind.IF: {
48
+ // Recursively check if statements
49
+ const ifStmt = stmt as IfStatement;
50
+
51
+ if (!isStatement(ifStmt.ifStatement)) {
52
+ break;
53
+ }
54
+
55
+ traverse(ifStmt.ifStatement);
56
+
57
+ if (isStatement(ifStmt.elseStatement)) {
58
+ traverse(ifStmt.elseStatement);
59
+ }
60
+ break;
61
+ }
62
+ case StatementKind.SWITCH: {
63
+ // Recursively check switch statements
64
+ const switchStmt = stmt as SwitchStatement;
65
+
66
+ if (switchStmt.caseClauses) {
67
+ for (const caseClause of switchStmt.caseClauses) {
68
+ if (isCaseClause(caseClause) && caseClause.statements) {
69
+ for (const nestedStmt of caseClause.statements) {
70
+ traverse(nestedStmt as AbstractStatement);
71
+ }
72
+ }
73
+ }
74
+ }
75
+ if (
76
+ isDefaultClause(switchStmt.defaultClause) &&
77
+ switchStmt.defaultClause.statements
78
+ ) {
79
+ for (const nestedStmt of switchStmt.defaultClause.statements) {
80
+ traverse(nestedStmt as AbstractStatement);
81
+ }
82
+ }
83
+ break;
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ traverse(statement);
90
+
91
+ return names;
92
+ }
93
+
94
+ function collectAllBranchMemberNames(
95
+ statement: AbstractStatement,
96
+ ): Set<string> {
97
+ const allNames = new Set<string>();
98
+
99
+ function addBranchNames(stmt: AbstractStatement) {
100
+ const names = collectMemberVariableNames(stmt);
101
+ for (const name of names) {
102
+ allNames.add(name);
103
+ }
104
+
105
+ // Recursively check nested if statements (else if chains)
106
+ if (stmt.statementKind === StatementKind.IF) {
107
+ const ifStmt = stmt as IfStatement;
108
+ if (isStatement(ifStmt.elseStatement)) {
109
+ addBranchNames(ifStmt.elseStatement);
110
+ }
111
+ }
112
+ }
113
+
114
+ addBranchNames(statement);
115
+
116
+ return allNames;
117
+ }
118
+
119
+ export const checkIfStatement: Check = {
120
+ nodeKind: NodeKind.STATEMENT,
121
+ subKind: StatementKind.IF,
122
+ checkFunc: function (
123
+ ifStatement: IfStatement,
124
+ symbolTable: SymbolTable,
125
+ _strict: boolean,
126
+ ): CheckResult[] {
127
+ const results: CheckResult[] = [];
128
+
129
+ const classScope = symbolTable.getEnclosingClassScope();
130
+ if (!classScope) {
131
+ return results;
132
+ }
133
+
134
+ if (!isStatement(ifStatement.ifStatement)) {
135
+ return results;
136
+ }
137
+
138
+ const ifMemberNames = collectMemberVariableNames(ifStatement.ifStatement);
139
+
140
+ // Handle else if chains by collecting all member names from the else branch
141
+ let elseMemberNames = new Set<string>();
142
+ if (isStatement(ifStatement.elseStatement)) {
143
+ elseMemberNames = collectAllBranchMemberNames(ifStatement.elseStatement);
144
+ }
145
+
146
+ const overlappingNames: string[] = [];
147
+ for (const name of ifMemberNames) {
148
+ if (elseMemberNames.has(name)) {
149
+ overlappingNames.push(name);
150
+ }
151
+ }
152
+
153
+ if (overlappingNames.length > 0) {
154
+ results.push({
155
+ message:
156
+ "This if-then-else clauses may result in duplicate class member variables being declared simultaneously.",
157
+ location: ifStatement.startToken!.getLocation(),
158
+ isWarning: true,
159
+ });
160
+ }
161
+
162
+ return results;
163
+ },
164
+ };
@@ -0,0 +1,180 @@
1
+ import type { MapDeclaration } from "../../ast/node/map-declaration.ts";
2
+ import type { MapEntry } from "../../ast/node/map-entry.ts";
3
+ import type { AggregateOutputValue } from "../../ast/node/aggregate-output-value.ts";
4
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
5
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
6
+ import { isIdentifier, isNumberLiteral } from "../../ast/util/types.ts";
7
+ import { ScopeKind, type SymbolTable } from "../symbol-table.ts";
8
+ import type { Check, CheckResult } from "./check.ts";
9
+
10
+ function countOutputValues(outputValue: AggregateOutputValue): number {
11
+ return outputValue.outputValues.length;
12
+ }
13
+
14
+ function checkOutputValuesTypeMatch(
15
+ declaration: MapDeclaration,
16
+ symbolTable: SymbolTable,
17
+ ): CheckResult[] {
18
+ const results: CheckResult[] = [];
19
+
20
+ if (declaration.outputElementaryType !== undefined) {
21
+ for (const entry of declaration.mapEntries) {
22
+ if (entry.nodeKind !== NodeKind.MAP_ENTRY) {
23
+ continue;
24
+ }
25
+ const mapEntry = entry as MapEntry;
26
+ if (
27
+ mapEntry.outputValue &&
28
+ mapEntry.outputValue.nodeKind === NodeKind.AGGREGATE_OUTPUT_VALUE
29
+ ) {
30
+ const outputValue = mapEntry.outputValue as AggregateOutputValue;
31
+ if (countOutputValues(outputValue) !== 1) {
32
+ results.push({
33
+ message:
34
+ "The type and number of constituent values within the aggregate output values of the map declaration must match the corresponding constituent types within the map's output_type.",
35
+ location: outputValue.startToken!.getLocation(),
36
+ });
37
+ }
38
+ }
39
+ }
40
+ } else if (
41
+ declaration.outputClassIdentifier !== undefined &&
42
+ isIdentifier(declaration.outputClassIdentifier)
43
+ ) {
44
+ const className = declaration.outputClassIdentifier.name;
45
+ const classScope = symbolTable.getGlobalScope().children.find(
46
+ (scope) => scope.name === className && scope.kind === ScopeKind.CLASS,
47
+ );
48
+
49
+ if (classScope?.classMemberSymbols) {
50
+ const expectedMemberCount = classScope.classMemberSymbols.size;
51
+
52
+ for (const entry of declaration.mapEntries) {
53
+ if (entry.nodeKind !== NodeKind.MAP_ENTRY) {
54
+ continue;
55
+ }
56
+ const mapEntry = entry as MapEntry;
57
+ if (
58
+ mapEntry.outputValue &&
59
+ mapEntry.outputValue.nodeKind === NodeKind.AGGREGATE_OUTPUT_VALUE
60
+ ) {
61
+ const outputValue = mapEntry.outputValue as AggregateOutputValue;
62
+ if (countOutputValues(outputValue) !== expectedMemberCount) {
63
+ results.push({
64
+ message:
65
+ "The type and number of constituent values within the aggregate output values of the map declaration must match the corresponding constituent types within the map's output_type.",
66
+ location: outputValue.startToken!.getLocation(),
67
+ });
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+
74
+ return results;
75
+ }
76
+
77
+ function hasParsableMembers(
78
+ className: string,
79
+ symbolTable: SymbolTable,
80
+ visited: Set<string>,
81
+ ): boolean {
82
+ if (visited.has(className)) {
83
+ return false;
84
+ }
85
+ visited.add(className);
86
+
87
+ const classScope = symbolTable.getGlobalScope().children.find(
88
+ (scope) => scope.name === className && scope.kind === ScopeKind.CLASS,
89
+ );
90
+
91
+ if (!classScope?.classMemberSymbols) {
92
+ return false;
93
+ }
94
+
95
+ for (const memberEntries of classScope.classMemberSymbols.values()) {
96
+ for (const entry of memberEntries) {
97
+ if (entry.symbol.attributes.isComputed !== true) {
98
+ return true;
99
+ }
100
+ if (
101
+ entry.symbol.attributes.classType &&
102
+ hasParsableMembers(
103
+ entry.symbol.attributes.classType,
104
+ symbolTable,
105
+ visited,
106
+ )
107
+ ) {
108
+ return true;
109
+ }
110
+ }
111
+ }
112
+
113
+ return false;
114
+ }
115
+
116
+ function checkParsableClassOutput(
117
+ declaration: MapDeclaration,
118
+ symbolTable: SymbolTable,
119
+ ): CheckResult[] {
120
+ if (
121
+ declaration.outputClassIdentifier === undefined ||
122
+ !isIdentifier(declaration.outputClassIdentifier)
123
+ ) {
124
+ return [];
125
+ }
126
+
127
+ const className = declaration.outputClassIdentifier.name;
128
+
129
+ if (hasParsableMembers(className, symbolTable, new Set())) {
130
+ return [{
131
+ message:
132
+ "Declaring a map with an output_value consisting of a class with parsable members will result in undefined behaviour.",
133
+ location: declaration.outputClassIdentifier.startToken!.getLocation(),
134
+ isWarning: true,
135
+ }];
136
+ }
137
+
138
+ return [];
139
+ }
140
+
141
+ function checkUniqueInputValues(declaration: MapDeclaration): CheckResult[] {
142
+ const results: CheckResult[] = [];
143
+ const seenValues = new Map<number, boolean>();
144
+
145
+ for (const entry of declaration.mapEntries) {
146
+ if (entry.nodeKind !== NodeKind.MAP_ENTRY) {
147
+ continue;
148
+ }
149
+ const mapEntry = entry as MapEntry;
150
+ if (isNumberLiteral(mapEntry.inputValue)) {
151
+ const value = mapEntry.inputValue.value;
152
+ if (seenValues.has(value)) {
153
+ results.push({
154
+ message: "Input values in a map declaration must be unique.",
155
+ location: mapEntry.inputValue.startToken!.getLocation(),
156
+ });
157
+ } else {
158
+ seenValues.set(value, true);
159
+ }
160
+ }
161
+ }
162
+
163
+ return results;
164
+ }
165
+
166
+ export const checkMapDeclaration: Check = {
167
+ nodeKind: NodeKind.STATEMENT,
168
+ subKind: StatementKind.MAP_DECLARATION,
169
+ checkFunc: function (
170
+ declaration: MapDeclaration,
171
+ symbolTable: SymbolTable,
172
+ _strict,
173
+ ): CheckResult[] {
174
+ return [
175
+ ...checkOutputValuesTypeMatch(declaration, symbolTable),
176
+ ...checkParsableClassOutput(declaration, symbolTable),
177
+ ...checkUniqueInputValues(declaration),
178
+ ];
179
+ },
180
+ };
@@ -0,0 +1,118 @@
1
+ import type { MapDefinition } from "../../ast/node/map-definition.ts";
2
+ import type { MapDeclaration } from "../../ast/node/map-declaration.ts";
3
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
4
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
5
+ import { isIdentifier } from "../../ast/util/types.ts";
6
+ import type { SymbolTable } from "../symbol-table.ts";
7
+ import type { Check, CheckResult } from "./check.ts";
8
+ import type { ElementaryType } from "../../ast/node/elementary-type.ts";
9
+ import { ElementaryTypeKind } from "../../ast/node/enum/elementary-type-kind.ts";
10
+ import { getElementaryTypeKind } from "../util/symbol-table-utils.ts";
11
+
12
+ function checkMapTypeMatchesDeclaration(
13
+ definition: MapDefinition,
14
+ symbolTable: SymbolTable,
15
+ strict: boolean,
16
+ ): CheckResult[] {
17
+ const results: CheckResult[] = [];
18
+
19
+ if (!isIdentifier(definition.mapIdentifier)) {
20
+ return results;
21
+ }
22
+
23
+ const mapSymbol = symbolTable.lookupMap(definition.mapIdentifier.name);
24
+ if (!mapSymbol) {
25
+ return results;
26
+ }
27
+
28
+ const mapDeclaration = mapSymbol.node as MapDeclaration;
29
+
30
+ // Compare element types
31
+ const defHasElementaryType = definition.elementaryType !== undefined;
32
+ const declHasElementaryType =
33
+ mapDeclaration.outputElementaryType !== undefined;
34
+ const defHasClassType = definition.classIdentifier !== undefined;
35
+ const declHasClassType = mapDeclaration.outputClassIdentifier !== undefined;
36
+
37
+ if (
38
+ defHasElementaryType !== declHasElementaryType ||
39
+ defHasClassType !== declHasClassType
40
+ ) {
41
+ const location = definition.elementaryType?.startToken?.getLocation() ||
42
+ definition.classIdentifier?.startToken?.getLocation() ||
43
+ definition.mapIdentifier.startToken!.getLocation();
44
+ results.push({
45
+ message:
46
+ "The type of the map definition must match the output_type of the map declaration.",
47
+ location,
48
+ });
49
+ } else if (defHasElementaryType && declHasElementaryType) {
50
+ // Both have elementary types - compare them
51
+ const defType = definition.elementaryType! as ElementaryType;
52
+ const declType = mapDeclaration.outputElementaryType! as ElementaryType;
53
+
54
+ const defTypeKind = getElementaryTypeKind(defType, strict);
55
+ const declTypeKind = getElementaryTypeKind(declType, strict);
56
+
57
+ const isIntegerCompatible = (
58
+ k1: ElementaryTypeKind | undefined,
59
+ k2: ElementaryTypeKind | undefined,
60
+ ): boolean => {
61
+ if (k1 === undefined || k2 === undefined) return false;
62
+ const intTypes = new Set([
63
+ ElementaryTypeKind.INTEGER,
64
+ ElementaryTypeKind.UNSIGNED_INTEGER,
65
+ ]);
66
+ return intTypes.has(k1) && intTypes.has(k2);
67
+ };
68
+
69
+ if (
70
+ defType.nodeKind !== declType.nodeKind ||
71
+ (defTypeKind !== declTypeKind &&
72
+ !isIntegerCompatible(defTypeKind, declTypeKind))
73
+ ) {
74
+ results.push({
75
+ message:
76
+ "The type of the map definition must match the output_type of the map declaration.",
77
+ location: definition.elementaryType!.startToken!.getLocation(),
78
+ });
79
+ }
80
+ } else if (defHasClassType && declHasClassType) {
81
+ // Both have class types - compare them
82
+ if (
83
+ isIdentifier(definition.classIdentifier) &&
84
+ isIdentifier(mapDeclaration.outputClassIdentifier)
85
+ ) {
86
+ if (
87
+ definition.classIdentifier.name !==
88
+ mapDeclaration.outputClassIdentifier.name
89
+ ) {
90
+ results.push({
91
+ message:
92
+ "The type of the map definition must match the output_type of the map declaration.",
93
+ location: definition.classIdentifier.startToken!.getLocation(),
94
+ });
95
+ }
96
+ }
97
+ }
98
+
99
+ return results;
100
+ }
101
+
102
+ export const checkMapDefinition: Check = {
103
+ nodeKind: NodeKind.STATEMENT,
104
+ subKind: StatementKind.MAP_DEFINITION,
105
+ checkFunc: function (
106
+ definition: MapDefinition,
107
+ symbolTable: SymbolTable,
108
+ strict: boolean,
109
+ ): CheckResult[] {
110
+ const results: CheckResult[] = [];
111
+
112
+ results.push(
113
+ ...checkMapTypeMatchesDeclaration(definition, symbolTable, strict),
114
+ );
115
+
116
+ return results;
117
+ },
118
+ };
@@ -0,0 +1,28 @@
1
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
2
+ import { NumberLiteralKind } from "../../ast/node/enum/number-literal-kind.ts";
3
+ import type { NumberLiteral } from "../../ast/node/number-literal.ts";
4
+ import type { Check, CheckResult } from "./check.ts";
5
+
6
+ export const checkNumberLiteralFloat: Check = {
7
+ nodeKind: NodeKind.NUMBER_LITERAL,
8
+ subKind: NumberLiteralKind.FLOATING_POINT,
9
+ checkFunc: function (
10
+ node: NumberLiteral,
11
+ _symbolTable,
12
+ _strict,
13
+ ): CheckResult[] {
14
+ const results: CheckResult[] = [];
15
+
16
+ if (Object.is(node.value, -0)) {
17
+ results.push({
18
+ message:
19
+ "Usage of signed zero for a floating point literal will lead to undefined behaviour.",
20
+ location: node.startToken?.getLocation() ||
21
+ node.leadingTrivia?.[0]?.location!,
22
+ isWarning: true,
23
+ });
24
+ }
25
+
26
+ return results;
27
+ },
28
+ };
@@ -0,0 +1,42 @@
1
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
2
+ import type { Parameter } from "../../ast/node/parameter.ts";
3
+ import type { ParameterList } from "../../ast/node/parameter-list.ts";
4
+ import { getRequiredIdentifier } from "../util/symbol-table-utils.ts";
5
+ import type { Check, CheckResult } from "./check.ts";
6
+
7
+ export const checkParameterList: Check = {
8
+ nodeKind: NodeKind.PARAMETER_LIST,
9
+ checkFunc: function (
10
+ node: ParameterList,
11
+ _symbolTable,
12
+ strict: boolean,
13
+ ): CheckResult[] {
14
+ const results: CheckResult[] = [];
15
+
16
+ for (const param of node.parameters) {
17
+ if (param.nodeKind !== NodeKind.PARAMETER) {
18
+ continue;
19
+ }
20
+ const parameter = param as Parameter;
21
+
22
+ // Check if both elementaryType and classIdentifier are undefined/null
23
+ // This indicates a string type parameter which is not supported
24
+ if (!parameter.elementaryType && !parameter.classIdentifier) {
25
+ const identifier = getRequiredIdentifier(
26
+ parameter.identifier,
27
+ parameter,
28
+ strict,
29
+ );
30
+ if (identifier) {
31
+ results.push({
32
+ message:
33
+ "String variables are not supported in class parameter lists.",
34
+ location: identifier.startToken!.getLocation(),
35
+ });
36
+ }
37
+ }
38
+ }
39
+
40
+ return results;
41
+ },
42
+ };
@@ -0,0 +1,53 @@
1
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
2
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
3
+ import type { Specification } from "../../ast/node/specification.ts";
4
+ import type { ComputedElementaryTypeDefinition } from "../../ast/node/computed-elementary-type-definition.ts";
5
+ import { isStatement } from "../../ast/util/types.ts";
6
+ import type { Check, CheckResult } from "./check.ts";
7
+
8
+ export const checkSpecification: Check = {
9
+ nodeKind: NodeKind.SPECIFICATION,
10
+ checkFunc: function (
11
+ node: Specification,
12
+ _symbolTable,
13
+ _strict,
14
+ ): CheckResult[] {
15
+ const results: CheckResult[] = [];
16
+
17
+ for (const child of node.children) {
18
+ if (!isStatement(child)) {
19
+ continue;
20
+ }
21
+
22
+ const statement = child;
23
+
24
+ if (
25
+ statement.statementKind ===
26
+ StatementKind.COMPUTED_ELEMENTARY_TYPE_DEFINITION
27
+ ) {
28
+ const definition = statement as ComputedElementaryTypeDefinition;
29
+ if (definition.constKeyword === undefined) {
30
+ results.push({
31
+ message:
32
+ "The only items that may be present in global scope are: constant computed elementary variable definitions, map declarations, class declarations.",
33
+ location: child.startToken?.getLocation() ||
34
+ child.leadingTrivia?.[0]?.location!,
35
+ });
36
+ }
37
+ } else if (statement.statementKind === StatementKind.MAP_DECLARATION) {
38
+ continue;
39
+ } else if (statement.statementKind === StatementKind.CLASS_DECLARATION) {
40
+ continue;
41
+ } else {
42
+ results.push({
43
+ message:
44
+ "The only items that may be present in global scope are: constant computed elementary variable definitions, map declarations, class declarations.",
45
+ location: child.startToken?.getLocation() ||
46
+ child.leadingTrivia?.[0]?.location!,
47
+ });
48
+ }
49
+ }
50
+
51
+ return results;
52
+ },
53
+ };