@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,497 @@
1
+ import {
2
+ InternalScannerError,
3
+ SemanticError,
4
+ SemanticWarning,
5
+ } from "../../scanner-error.ts";
6
+ import { NumericType, type SymbolTable } from "../symbol-table.ts";
7
+ import type { AbstractNode } from "../../ast/node/abstract-node.ts";
8
+ import { NodeKind } from "../../ast/node/enum/node-kind.ts";
9
+ import { StatementKind } from "../../ast/node/enum/statement-kind.ts";
10
+ import { ExpressionKind } from "../../ast/node/enum/expression-kind.ts";
11
+ import { TokenKind } from "../../ast/node/enum/token-kind.ts";
12
+ import type { BinaryExpression } from "../../ast/node/binary-expression.ts";
13
+ import type { UnaryExpression } from "../../ast/node/unary-expression.ts";
14
+ import type { ClassDeclaration } from "../../ast/node/class-declaration.ts";
15
+ import type { ClassDefinition } from "../../ast/node/class-definition.ts";
16
+ import type { ElementaryTypeDefinition } from "../../ast/node/elementary-type-definition.ts";
17
+ import type { ComputedElementaryTypeDefinition } from "../../ast/node/computed-elementary-type-definition.ts";
18
+ import type { Token } from "../../ast/node/token.ts";
19
+ import type { ParameterList } from "../../ast/node/parameter-list.ts";
20
+ import type { Parameter } from "../../ast/node/parameter.ts";
21
+ import type { ParameterValueList } from "../../ast/node/parameter-value-list.ts";
22
+ import { AbstractAnalysisNodeHandler } from "./abstract-analysis-node-handler.ts";
23
+ import {
24
+ getElementaryTypeKind,
25
+ getRequiredIdentifier,
26
+ getRequiredOperand,
27
+ getRequiredToken,
28
+ } from "../util/symbol-table-utils.ts";
29
+ import {
30
+ isElementaryType,
31
+ isIdentifier,
32
+ type OneToManyList,
33
+ } from "../../ast/util/types.ts";
34
+ import {
35
+ getNumericTypeFromElementaryTypeKind,
36
+ isArithmeticOperator,
37
+ isBitwiseOperator,
38
+ isLogicalOperator,
39
+ isRelationalOperator,
40
+ isShiftOperator,
41
+ resolveNumericType,
42
+ } from "../util/type-utils.ts";
43
+ import { BinaryOperatorKind } from "../../ast/node/enum/binary-operator-kind.ts";
44
+ import type { AbstractExpression } from "../../ast/node/abstract-expression.ts";
45
+ import type { NumberLiteral } from "../../ast/node/number-literal.ts";
46
+ import type { Identifier } from "../../ast/node/identifier.ts";
47
+
48
+ export class ValidateTypeNodeHandler extends AbstractAnalysisNodeHandler {
49
+ constructor(public readonly symbolTable: SymbolTable, strict: boolean) {
50
+ super(symbolTable, strict);
51
+
52
+ this.registerBeforeNodeHandler(
53
+ NodeKind.EXPRESSION,
54
+ ExpressionKind.BINARY,
55
+ (node) => this.validateBinaryExpression(node as BinaryExpression),
56
+ );
57
+ this.registerBeforeNodeHandler(
58
+ NodeKind.EXPRESSION,
59
+ ExpressionKind.UNARY,
60
+ (node) => this.validateUnaryExpression(node as UnaryExpression),
61
+ );
62
+ this.registerBeforeNodeHandler(
63
+ NodeKind.STATEMENT,
64
+ StatementKind.ELEMENTARY_TYPE_DEFINITION,
65
+ (node) =>
66
+ this.validateElementaryTypeDefinition(node as ElementaryTypeDefinition),
67
+ );
68
+ this.registerBeforeNodeHandler(
69
+ NodeKind.STATEMENT,
70
+ StatementKind.COMPUTED_ELEMENTARY_TYPE_DEFINITION,
71
+ (node) =>
72
+ this.validateComputedElementaryTypeDefinition(
73
+ node as ComputedElementaryTypeDefinition,
74
+ ),
75
+ );
76
+ this.registerBeforeNodeHandler(
77
+ NodeKind.STATEMENT,
78
+ StatementKind.CLASS_DEFINITION,
79
+ (node) => this.validateClassDefinition(node as ClassDefinition),
80
+ );
81
+ }
82
+
83
+ private validateClassDefinition(classDefinition: ClassDefinition): void {
84
+ if (!classDefinition.parameterValueList) {
85
+ return;
86
+ }
87
+
88
+ const classIdentifier = getRequiredIdentifier(
89
+ classDefinition.classIdentifier,
90
+ classDefinition,
91
+ this.strict,
92
+ );
93
+
94
+ if (!classIdentifier) {
95
+ return;
96
+ }
97
+
98
+ const classSymbol = this.symbolTable.lookupClass(classIdentifier.name);
99
+
100
+ if (!classSymbol) {
101
+ return;
102
+ }
103
+
104
+ const identifier = getRequiredIdentifier(
105
+ classDefinition.classIdentifier,
106
+ classDefinition,
107
+ this.strict,
108
+ );
109
+
110
+ if (!identifier) {
111
+ return;
112
+ }
113
+
114
+ const classDeclaration = classSymbol.node as ClassDeclaration;
115
+
116
+ let parameters: Parameter[] = [];
117
+
118
+ if (classDeclaration.parameterList) {
119
+ const parameterList = classDeclaration.parameterList as ParameterList;
120
+ parameters = parameterList.parameters.filter(
121
+ (p): p is Parameter => p.nodeKind === NodeKind.PARAMETER,
122
+ );
123
+ }
124
+
125
+ let values: OneToManyList<AbstractExpression | Identifier | NumberLiteral> =
126
+ [];
127
+
128
+ if (classDefinition.parameterValueList) {
129
+ const valueList = classDefinition
130
+ .parameterValueList as ParameterValueList;
131
+ values = valueList.values;
132
+ }
133
+
134
+ if ((parameters.length === 0) && (values.length > 0)) {
135
+ const error = new SemanticError(
136
+ `Class '${classIdentifier.name}' does not expect parameters, but ${values.length} provided`,
137
+ identifier.startToken!.getLocation(),
138
+ );
139
+
140
+ if (this.strict) {
141
+ throw error;
142
+ }
143
+
144
+ this.semanticErrors.push(error);
145
+
146
+ return;
147
+ }
148
+
149
+ if ((parameters.length > 0) && (values.length === 0)) {
150
+ const error = new SemanticError(
151
+ `Class '${classIdentifier.name}' expects ${parameters.length} parameter(s), but none provided`,
152
+ identifier.startToken!.getLocation(),
153
+ );
154
+
155
+ if (this.strict) {
156
+ throw error;
157
+ }
158
+
159
+ this.semanticErrors.push(error);
160
+
161
+ return;
162
+ }
163
+
164
+ if (values.length !== parameters.length) {
165
+ const error = new SemanticError(
166
+ `Class '${classIdentifier.name}' expects ${parameters.length} parameter(s), but ${values.length} provided`,
167
+ identifier.startToken!.getLocation(),
168
+ );
169
+
170
+ if (this.strict) {
171
+ throw error;
172
+ }
173
+
174
+ this.semanticErrors.push(error);
175
+
176
+ return;
177
+ }
178
+
179
+ for (let i = 0; i < parameters.length; i++) {
180
+ const parameter = parameters[i];
181
+ const parameterIdentifier = getRequiredIdentifier(
182
+ parameter.identifier,
183
+ parameter,
184
+ false,
185
+ );
186
+
187
+ if (!parameterIdentifier) {
188
+ continue;
189
+ }
190
+
191
+ const value = values[i] as AbstractNode;
192
+
193
+ let error: SemanticError | undefined = undefined;
194
+ let warning: SemanticWarning | undefined = undefined;
195
+
196
+ if (isElementaryType(parameter.elementaryType)) {
197
+ const elementaryTypeKind = getElementaryTypeKind(
198
+ parameter.elementaryType,
199
+ false,
200
+ );
201
+
202
+ if (elementaryTypeKind !== undefined) {
203
+ const parameterNumericType = getNumericTypeFromElementaryTypeKind(
204
+ elementaryTypeKind,
205
+ );
206
+ const valueNumericType = resolveNumericType(
207
+ value,
208
+ this.symbolTable,
209
+ );
210
+
211
+ // If the type cannot be determined (due to identifier not being defined etc.)
212
+ // then just continue as there will already be a semantic error undefined symbol
213
+ if (
214
+ (valueNumericType === undefined) ||
215
+ (parameterNumericType === undefined)
216
+ ) {
217
+ continue;
218
+ } else if (valueNumericType !== parameterNumericType) {
219
+ warning = new SemanticWarning(
220
+ `Coercion required: parameter type: ${
221
+ NumericType[parameterNumericType]
222
+ }, value type: ${NumericType[valueNumericType]}`,
223
+ value.getLocation(),
224
+ );
225
+ }
226
+ }
227
+ } else if (isIdentifier(parameter.classIdentifier)) {
228
+ const parameterClassSymbol = this.symbolTable.lookupClass(
229
+ parameter.classIdentifier.name,
230
+ );
231
+
232
+ if (parameterClassSymbol) {
233
+ const valueClassIdentifier = isIdentifier(value) ? value : undefined;
234
+
235
+ if (valueClassIdentifier) {
236
+ const valueClassSymbol = this.symbolTable.lookupClass(
237
+ valueClassIdentifier.name,
238
+ );
239
+
240
+ if (valueClassSymbol) {
241
+ // make sure the class declarations are the same by comparing valueClassSymbol.attributes.classType with parameterClassSymbol.attributes.classType
242
+ if (valueClassSymbol.attributes.classType === undefined) {
243
+ error = new SemanticError(
244
+ `Class type could not be resolved for value of parameter '${parameterIdentifier.name}'`,
245
+ value.getLocation(),
246
+ );
247
+ } else if (
248
+ parameterClassSymbol.attributes.classType === undefined
249
+ ) {
250
+ error = new SemanticError(
251
+ `Class type could not be resolved for parameter '${parameterIdentifier.name}'`,
252
+ parameterIdentifier.getLocation(),
253
+ );
254
+ } else if (
255
+ valueClassSymbol.attributes.classType !==
256
+ parameterClassSymbol.attributes.classType
257
+ ) {
258
+ warning = new SemanticWarning(
259
+ `Coercion required: parameter class type: ${parameterClassSymbol.attributes.classType}, value class type: ${valueClassSymbol.attributes.classType}`,
260
+ value.getLocation(),
261
+ );
262
+ }
263
+ }
264
+ }
265
+ }
266
+ } else {
267
+ continue;
268
+ }
269
+
270
+ if (warning) {
271
+ this.semanticWarnings.push(warning);
272
+ }
273
+
274
+ if (error) {
275
+ if (this.strict) {
276
+ throw error;
277
+ }
278
+
279
+ this.semanticErrors.push(error);
280
+ }
281
+ }
282
+ }
283
+
284
+ private validateElementaryTypeDefinition(
285
+ elementaryTypeDefinition: ElementaryTypeDefinition,
286
+ ): void {
287
+ this.validateElementaryTypeValueAndEndValue(elementaryTypeDefinition);
288
+ }
289
+
290
+ private validateComputedElementaryTypeDefinition(
291
+ computedElementaryTypeDefinition: ComputedElementaryTypeDefinition,
292
+ ): void {
293
+ this.validateElementaryTypeValueAndEndValue(
294
+ computedElementaryTypeDefinition,
295
+ );
296
+ }
297
+
298
+ private validateElementaryTypeValueAndEndValue(
299
+ definition: ElementaryTypeDefinition | ComputedElementaryTypeDefinition,
300
+ ): void {
301
+ // nothing to check if no value provided
302
+ if (definition.value === undefined) {
303
+ return;
304
+ }
305
+
306
+ const identifier = getRequiredIdentifier(
307
+ definition.identifier,
308
+ definition,
309
+ this.strict,
310
+ );
311
+
312
+ if (!identifier) {
313
+ return;
314
+ }
315
+
316
+ // get the symbol using the identifier.name
317
+ const symbol = this.symbolTable.lookupVariable(identifier.name);
318
+
319
+ if (!symbol) {
320
+ return;
321
+ }
322
+
323
+ const declaredType = symbol.attributes.numericType;
324
+
325
+ if (!declaredType) {
326
+ return;
327
+ }
328
+
329
+ const valueType = resolveNumericType(definition.value, this.symbolTable);
330
+
331
+ // If the type cannot be determined (due to identifier not being defined etc.)
332
+ // then just continue as there will already be a semantic error undefined symbol
333
+ if ((valueType !== undefined) && (valueType !== declaredType)) {
334
+ const warning = new SemanticWarning(
335
+ `Type coercion required for '${identifier.name}' value: expected ${
336
+ NumericType[declaredType]
337
+ }, got ${NumericType[valueType!]}`,
338
+ identifier.startToken!.getLocation(),
339
+ );
340
+
341
+ this.semanticWarnings.push(warning);
342
+ }
343
+
344
+ // nothing further to check if no end value provided
345
+ if (!(definition as ElementaryTypeDefinition).endValue) {
346
+ return;
347
+ }
348
+
349
+ const endValueType = resolveNumericType(
350
+ (definition as ElementaryTypeDefinition).endValue!,
351
+ this.symbolTable,
352
+ );
353
+
354
+ // If the type cannot be determined (due to identifier not being defined etc.)
355
+ // then just continue as there will already be a semantic error undefined symbol
356
+ if ((endValueType !== undefined) && (endValueType !== declaredType)) {
357
+ const warning = new SemanticWarning(
358
+ `Type coercion required for '${identifier.name}' end value: expected ${
359
+ NumericType[declaredType]
360
+ }, got ${NumericType[endValueType!]}`,
361
+ identifier.startToken!.getLocation(),
362
+ );
363
+
364
+ this.semanticWarnings.push(warning);
365
+ }
366
+ }
367
+
368
+ private validateBinaryExpression(binaryExpression: BinaryExpression): void {
369
+ const leftOperand = getRequiredOperand(
370
+ binaryExpression.leftOperand,
371
+ binaryExpression,
372
+ this.strict,
373
+ );
374
+
375
+ if (!leftOperand) {
376
+ return;
377
+ }
378
+
379
+ const rightOperand = getRequiredOperand(
380
+ binaryExpression.rightOperand,
381
+ binaryExpression,
382
+ this.strict,
383
+ );
384
+
385
+ if (!rightOperand) {
386
+ return;
387
+ }
388
+
389
+ const operatorToken = getRequiredToken(
390
+ binaryExpression.binaryOperator,
391
+ binaryExpression,
392
+ this.strict,
393
+ );
394
+
395
+ if (!operatorToken) {
396
+ return;
397
+ }
398
+
399
+ const operatorKind = binaryExpression.binaryOperatorKind;
400
+
401
+ if (operatorKind === undefined) {
402
+ throw new InternalScannerError(
403
+ "Unreachable code reached, operatorKind is undefined",
404
+ );
405
+ }
406
+
407
+ const leftOperandNumericType = resolveNumericType(
408
+ leftOperand,
409
+ this.symbolTable,
410
+ );
411
+ const rightOperandNumericType = resolveNumericType(
412
+ rightOperand,
413
+ this.symbolTable,
414
+ );
415
+
416
+ // If the type cannot be determined (due to identifier not being defined etc.)
417
+ // then just return as there will already be a semantic error undefined symbol
418
+ if (
419
+ (leftOperandNumericType === undefined) ||
420
+ (rightOperandNumericType === undefined)
421
+ ) {
422
+ return;
423
+ }
424
+
425
+ let isCoercionRequired = false;
426
+
427
+ if (
428
+ (operatorKind === BinaryOperatorKind.ASSIGNMENT) ||
429
+ isArithmeticOperator(operatorKind) ||
430
+ isRelationalOperator(operatorKind) || isLogicalOperator(operatorKind)
431
+ ) {
432
+ isCoercionRequired = leftOperandNumericType !== rightOperandNumericType;
433
+ }
434
+
435
+ if (isShiftOperator(operatorKind) || isBitwiseOperator(operatorKind)) {
436
+ if (
437
+ (leftOperandNumericType !== NumericType.INTEGER) ||
438
+ (rightOperandNumericType !== NumericType.INTEGER)
439
+ ) {
440
+ isCoercionRequired = true;
441
+ }
442
+ }
443
+
444
+ if (isCoercionRequired) {
445
+ const warning = new SemanticWarning(
446
+ `Different types in binary expression, coercion required: ${
447
+ NumericType[leftOperandNumericType]
448
+ } vs ${NumericType[rightOperandNumericType]}`,
449
+ operatorToken.getLocation(),
450
+ );
451
+ this.semanticWarnings.push(warning);
452
+ }
453
+ }
454
+
455
+ private validateUnaryExpression(unaryExpression: UnaryExpression): void {
456
+ const operand = getRequiredOperand(
457
+ unaryExpression.operand,
458
+ unaryExpression,
459
+ this.strict,
460
+ );
461
+
462
+ if (!operand) {
463
+ return;
464
+ }
465
+
466
+ const operandNumericType = resolveNumericType(
467
+ operand,
468
+ this.symbolTable,
469
+ );
470
+ // If the type cannot be determined (due to identifier not being defined etc.)
471
+ // then just return as there will already be a semantic error undefined symbol
472
+ if (operandNumericType === undefined) {
473
+ return;
474
+ }
475
+
476
+ if (unaryExpression.postfixOperator) {
477
+ const token = unaryExpression.postfixOperator as Token;
478
+
479
+ if (
480
+ (token.tokenKind === TokenKind.POSTFIX_INCREMENT) ||
481
+ (token.tokenKind === TokenKind.POSTFIX_DECREMENT)
482
+ ) {
483
+ if (operandNumericType !== NumericType.INTEGER) {
484
+ const warning = new SemanticWarning(
485
+ `Non-integer ${
486
+ token.tokenKind === TokenKind.POSTFIX_INCREMENT
487
+ ? "increment"
488
+ : "decrement"
489
+ } operand, coercion required: ${NumericType[operandNumericType]}`,
490
+ token.getLocation(),
491
+ );
492
+ this.semanticWarnings.push(warning);
493
+ }
494
+ }
495
+ }
496
+ }
497
+ }
@@ -0,0 +1,119 @@
1
+ import type { Specification } from "../ast/node/specification.ts";
2
+ import { dispatchNodeHandler } from "../parse-helper.ts";
3
+ import type { SemanticError, SemanticWarning } from "../scanner-error.ts";
4
+ import { BuildSymbolTableNodeHandler } from "./node-handler/build-symbol-table-node-handler.ts";
5
+ import type { Check } from "./checks/check.ts";
6
+ import { ValidateScopeNodeHandler } from "./node-handler/validate-scope-node-handler.ts";
7
+ import { ValidateTypeNodeHandler } from "./node-handler/validate-type-node-handler.ts";
8
+ import { SymbolTable } from "./symbol-table.ts";
9
+ import { SpecificCheckNodeHandler } from "./node-handler/specific-check-node-handler.ts";
10
+
11
+ export interface SdlAnalysisResult {
12
+ semanticErrors: Array<SemanticError>;
13
+ semanticWarnings: Array<SemanticWarning>;
14
+ specification: Specification;
15
+ symbolTable: SymbolTable;
16
+ }
17
+
18
+ export class SdlAnalyser {
19
+ strict: boolean = false;
20
+ checks: Check[] = [];
21
+
22
+ configure(options: { checks?: Check[]; strict?: boolean }): SdlAnalyser {
23
+ if (options.checks) {
24
+ this.checks = options.checks;
25
+ }
26
+
27
+ if (options.strict !== undefined) {
28
+ this.strict = options.strict;
29
+ }
30
+
31
+ return this;
32
+ }
33
+
34
+ analyse(specification: Specification): SdlAnalysisResult {
35
+ const symbolTable = new SymbolTable();
36
+
37
+ const buildSymbolTableNodeHandler = new BuildSymbolTableNodeHandler(
38
+ symbolTable,
39
+ this.strict,
40
+ );
41
+
42
+ dispatchNodeHandler(specification, buildSymbolTableNodeHandler);
43
+
44
+ symbolTable.resetScope();
45
+
46
+ const validateScopeNodeHandler = new ValidateScopeNodeHandler(
47
+ symbolTable,
48
+ this.strict,
49
+ );
50
+
51
+ dispatchNodeHandler(specification, validateScopeNodeHandler);
52
+
53
+ symbolTable.resetScope();
54
+
55
+ const validateTypeNodeHandler = new ValidateTypeNodeHandler(
56
+ symbolTable,
57
+ this.strict,
58
+ );
59
+
60
+ dispatchNodeHandler(specification, validateTypeNodeHandler);
61
+
62
+ symbolTable.resetScope();
63
+
64
+ const specificCheckNodeHandler = new SpecificCheckNodeHandler(
65
+ symbolTable,
66
+ this.strict,
67
+ this.checks,
68
+ );
69
+
70
+ dispatchNodeHandler(specification, specificCheckNodeHandler);
71
+
72
+ const allErrors = [
73
+ ...buildSymbolTableNodeHandler.semanticErrors,
74
+ ...validateScopeNodeHandler.semanticErrors,
75
+ ...validateTypeNodeHandler.semanticErrors,
76
+ ...specificCheckNodeHandler.semanticErrors,
77
+ ];
78
+
79
+ const seenErrors = new Set<string>();
80
+ const semanticErrors = allErrors.filter((error) => {
81
+ const key =
82
+ `${error.errorMessage}:${error.location?.row}:${error.location?.column}`;
83
+
84
+ if (seenErrors.has(key)) {
85
+ return false;
86
+ }
87
+
88
+ seenErrors.add(key);
89
+ return true;
90
+ });
91
+
92
+ const allWarnings = [
93
+ ...buildSymbolTableNodeHandler.semanticWarnings,
94
+ ...validateScopeNodeHandler.semanticWarnings,
95
+ ...validateTypeNodeHandler.semanticWarnings,
96
+ ...specificCheckNodeHandler.semanticWarnings,
97
+ ];
98
+
99
+ const seenWarnings = new Set<string>();
100
+ const semanticWarnings = allWarnings.filter((warning) => {
101
+ const key =
102
+ `${warning.errorMessage}:${warning.location?.row}:${warning.location?.column}`;
103
+
104
+ if (seenWarnings.has(key)) {
105
+ return false;
106
+ }
107
+
108
+ seenWarnings.add(key);
109
+ return true;
110
+ });
111
+
112
+ return {
113
+ semanticErrors,
114
+ semanticWarnings,
115
+ specification,
116
+ symbolTable,
117
+ };
118
+ }
119
+ }