@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,665 @@
1
+ import type { Doc } from "prettier";
2
+ import { doc } from "prettier";
3
+ import { describe, expect, test } from "bun:test";
4
+ import { testPrettierScenario } from "../test-prettier-scenario.ts";
5
+ import {
6
+ addIndentedStatements,
7
+ addTrailingHardline,
8
+ addTrailingTriviaDoc,
9
+ endsWithHardline,
10
+ removeLeadingBlanklines,
11
+ removeTrailingBlankline,
12
+ removeTrailingHardline,
13
+ startsWithBlankLine,
14
+ } from "../../../src/prettier/util/print-utils.ts";
15
+
16
+ const { breakParent, hardline, ifBreak, label, line, indent, fill } =
17
+ doc.builders;
18
+
19
+ describe("Print Utils tests", () => {
20
+ test("endsWithHardline works as expected", () => {
21
+ expect(endsWithHardline("x")).toBe(false);
22
+ expect(endsWithHardline(hardline)).toBe(true);
23
+ expect(endsWithHardline(["x"])).toBe(false);
24
+ expect(endsWithHardline([hardline])).toBe(true);
25
+ expect(endsWithHardline([hardline, "x"])).toBe(false);
26
+ expect(endsWithHardline(["x", hardline])).toBe(true);
27
+ expect(endsWithHardline(indent("x"))).toBe(false);
28
+ expect(endsWithHardline(indent(hardline))).toBe(true);
29
+ expect(endsWithHardline(indent(["x"]))).toBe(false);
30
+ expect(endsWithHardline(indent([hardline]))).toBe(true);
31
+ expect(endsWithHardline(indent([hardline, "x"]))).toBe(false);
32
+ expect(endsWithHardline(indent(["x", hardline]))).toBe(true);
33
+ expect(endsWithHardline(indent(indent([[hardline, ["x"]]])))).toBe(false);
34
+ expect(endsWithHardline(indent(indent([["x", [hardline]]])))).toBe(true);
35
+ expect(endsWithHardline(fill(hardline))).toBe(true);
36
+ expect(endsWithHardline(fill(["x"]))).toBe(false);
37
+ expect(endsWithHardline(fill([hardline]))).toBe(true);
38
+ expect(endsWithHardline(fill([hardline, "x"]))).toBe(false);
39
+ expect(endsWithHardline(fill(["x", hardline]))).toBe(true);
40
+ expect(endsWithHardline(fill(["x", indent([[hardline, ["x"]]])]))).toBe(
41
+ false,
42
+ );
43
+ expect(endsWithHardline(fill([indent([["x", [hardline]]])]))).toBe(true);
44
+
45
+ // skipped break-parents
46
+ expect(endsWithHardline([hardline, breakParent])).toBe(true);
47
+ expect(
48
+ endsWithHardline(
49
+ fill([[["i"], ["++"]], [
50
+ ";",
51
+ line,
52
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée",
53
+ [hardline, breakParent],
54
+ ]]),
55
+ ),
56
+ ).toBe(true);
57
+
58
+ // ensure false positive doesn't occur
59
+ expect(endsWithHardline({ type: "line", hard: true })).toBe(false);
60
+ expect(endsWithHardline([{ type: "line", hard: true }])).toBe(false);
61
+ });
62
+
63
+ test("startsWithBlankLine works as expected", () => {
64
+ let doc: Doc = "x";
65
+ expect(startsWithBlankLine(doc)).toBe(false);
66
+
67
+ doc = ["", hardline, "x"];
68
+ expect(startsWithBlankLine(doc)).toBe(true);
69
+
70
+ doc = ["", hardline];
71
+ expect(startsWithBlankLine(doc)).toBe(true);
72
+
73
+ doc = [["", hardline], "x"];
74
+ expect(startsWithBlankLine(doc)).toBe(true);
75
+
76
+ doc = ["x", "", hardline];
77
+ expect(startsWithBlankLine(doc)).toBe(false);
78
+
79
+ doc = ["", "x", hardline];
80
+ expect(startsWithBlankLine(doc)).toBe(false);
81
+
82
+ doc = [hardline, "x"];
83
+ expect(startsWithBlankLine(doc)).toBe(false);
84
+
85
+ doc = ["", "x"];
86
+ expect(startsWithBlankLine(doc)).toBe(false);
87
+ });
88
+
89
+ test("removeLeadingBlanklines works as expected", () => {
90
+ let doc: Doc = "x";
91
+ doc = removeLeadingBlanklines(doc);
92
+ expect(doc).toEqual("x");
93
+
94
+ doc = ["", hardline, "x"];
95
+ doc = removeLeadingBlanklines(doc);
96
+ expect(doc).toEqual("x");
97
+
98
+ doc = ["", hardline];
99
+ doc = removeLeadingBlanklines(doc);
100
+ expect(doc).toEqual([]);
101
+
102
+ doc = [["", hardline], "x"];
103
+ doc = removeLeadingBlanklines(doc);
104
+ expect(doc).toEqual("x");
105
+
106
+ doc = ["x", "", hardline];
107
+ doc = removeLeadingBlanklines(doc);
108
+ expect(doc).toEqual(["x", "", hardline]);
109
+
110
+ doc = ["", "x", hardline];
111
+ doc = removeLeadingBlanklines(doc);
112
+ expect(doc).toEqual(["", "x", hardline]);
113
+
114
+ doc = [hardline, "x"];
115
+ doc = removeLeadingBlanklines(doc);
116
+ expect(doc).toEqual([hardline, "x"]);
117
+
118
+ doc = ["", "x"];
119
+ doc = removeLeadingBlanklines(doc);
120
+ expect(doc).toEqual(["", "x"]);
121
+
122
+ doc = ["", hardline, "", hardline, "x"];
123
+ doc = removeLeadingBlanklines(doc);
124
+ expect(doc).toEqual("x");
125
+
126
+ doc = ["", hardline, "", hardline];
127
+ doc = removeLeadingBlanklines(doc);
128
+ expect(doc).toEqual([]);
129
+
130
+ doc = [["", hardline], ["", hardline], "x"];
131
+ doc = removeLeadingBlanklines(doc);
132
+ expect(doc).toEqual("x");
133
+ });
134
+
135
+ test("removeTrailingBlankline works as expected", () => {
136
+ let doc: Doc = "x";
137
+ doc = removeTrailingBlankline(doc);
138
+ expect(doc).toEqual("x");
139
+
140
+ doc = ["x", "", hardline];
141
+ doc = removeTrailingBlankline(doc);
142
+ expect(doc).toEqual("x");
143
+
144
+ doc = ["", hardline];
145
+ doc = removeTrailingBlankline(doc);
146
+ expect(doc).toEqual([]);
147
+
148
+ doc = ["x", ["", hardline]];
149
+ doc = removeTrailingBlankline(doc);
150
+ expect(doc).toEqual("x");
151
+
152
+ doc = ["", hardline, "x"];
153
+ doc = removeTrailingBlankline(doc);
154
+ expect(doc).toEqual(["", hardline, "x"]);
155
+
156
+ doc = [hardline, "x", ""];
157
+ doc = removeTrailingBlankline(doc);
158
+ expect(doc).toEqual([hardline, "x", ""]);
159
+
160
+ doc = ["x", hardline];
161
+ doc = removeTrailingBlankline(doc);
162
+ expect(doc).toEqual(["x", hardline]);
163
+
164
+ doc = ["x", ""];
165
+ doc = removeTrailingBlankline(doc);
166
+ expect(doc).toEqual(["x", ""]);
167
+
168
+ doc = [fill([hardline, "}"]), hardline];
169
+ doc = removeTrailingBlankline(doc);
170
+ expect(doc).toEqual([fill([hardline, "}"]), hardline]);
171
+ });
172
+
173
+ test("removeTrailingHardline works as expected", () => {
174
+ let doc: Doc = "x";
175
+ doc = removeTrailingHardline(doc);
176
+ expect(doc).toEqual("x");
177
+
178
+ doc = hardline;
179
+ doc = removeTrailingHardline(doc);
180
+ expect(doc).toEqual("");
181
+
182
+ doc = ["x"];
183
+ doc = removeTrailingHardline(doc);
184
+ expect(doc).toEqual("x");
185
+
186
+ doc = ["x", hardline];
187
+ doc = removeTrailingHardline(doc);
188
+ expect(doc).toEqual("x");
189
+
190
+ doc = [hardline, "x"];
191
+ doc = removeTrailingHardline(doc);
192
+ expect(doc).toEqual([hardline, "x"]);
193
+
194
+ doc = [[["x", [hardline]]]];
195
+ doc = removeTrailingHardline(doc);
196
+ expect(doc).toEqual("x");
197
+
198
+ doc = [indent([["x", [hardline]]])];
199
+ doc = removeTrailingHardline(doc);
200
+ expect(doc).toEqual(indent("x"));
201
+
202
+ // no effect on single hardline as no array to remove it from
203
+ doc = indent(hardline);
204
+ doc = removeTrailingHardline(doc);
205
+ expect(doc).toEqual("");
206
+
207
+ doc = indent(["x", hardline]);
208
+ doc = removeTrailingHardline(doc);
209
+ expect(doc).toEqual(indent("x"));
210
+
211
+ // no effect on single hardline as no array to remove it from
212
+ doc = fill(hardline);
213
+ doc = removeTrailingHardline(doc);
214
+ expect(doc).toEqual("");
215
+
216
+ doc = fill(["x", hardline]);
217
+ doc = removeTrailingHardline(doc);
218
+ expect(doc).toEqual(fill(["x"]));
219
+
220
+ doc = fill([indent([["x", [hardline]]])]);
221
+ doc = removeTrailingHardline(doc);
222
+ expect(doc).toEqual(fill([indent("x")]));
223
+
224
+ doc = fill([[["i"], ["++"]], [
225
+ ";",
226
+ line,
227
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée",
228
+ [hardline],
229
+ ]]);
230
+ doc = removeTrailingHardline(doc);
231
+ expect(doc).toEqual(fill([[["i"], ["++"]], [
232
+ ";",
233
+ line,
234
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée",
235
+ ]]));
236
+
237
+ doc = fill([[["i"], ["++"]], [
238
+ ";",
239
+ line,
240
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée",
241
+ [hardline, breakParent],
242
+ ]]);
243
+ doc = removeTrailingHardline(doc);
244
+ expect(doc).toEqual(fill([[["i"], ["++"]], [
245
+ ";",
246
+ line,
247
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée",
248
+ [hardline, breakParent],
249
+ ]]));
250
+ });
251
+
252
+ test("addIndentedStatements works as expected", () => {
253
+ let doc: Doc[] = [];
254
+ doc = addIndentedStatements(doc, []);
255
+ expect(doc).toEqual([]);
256
+
257
+ doc = [];
258
+ doc = addIndentedStatements(
259
+ doc,
260
+ [],
261
+ "{",
262
+ "}",
263
+ );
264
+ expect(doc).toEqual([
265
+ indent("{"),
266
+ hardline,
267
+ "}",
268
+ ]);
269
+
270
+ doc = [];
271
+ doc = addIndentedStatements(
272
+ doc,
273
+ [
274
+ ["i", ";"],
275
+ ["j", ";"],
276
+ ],
277
+ );
278
+ expect(doc).toEqual([
279
+ indent([
280
+ hardline,
281
+ ["i", ";"],
282
+ hardline,
283
+ ["j", ";"],
284
+ ]),
285
+ hardline,
286
+ ]);
287
+
288
+ doc = [];
289
+ doc = addIndentedStatements(
290
+ doc,
291
+ [
292
+ ["i", ";"],
293
+ ["j", ";"],
294
+ ],
295
+ "{",
296
+ "}",
297
+ );
298
+ expect(doc).toEqual([
299
+ indent([
300
+ "{",
301
+ hardline,
302
+ ["i", ";"],
303
+ hardline,
304
+ ["j", ";"],
305
+ ]),
306
+ hardline,
307
+ "}",
308
+ ]);
309
+
310
+ doc = [];
311
+ doc = addIndentedStatements(
312
+ doc,
313
+ [
314
+ ["foo"],
315
+ ["bar"],
316
+ ],
317
+ );
318
+ expect(doc).toEqual([
319
+ indent([
320
+ hardline,
321
+ ["foo"],
322
+ hardline,
323
+ "bar",
324
+ ]),
325
+ hardline,
326
+ ]);
327
+ });
328
+
329
+ test("addIndentedStatements with blank lines works as expected", () => {
330
+ let doc: Doc[] = [];
331
+ doc = addIndentedStatements(
332
+ doc,
333
+ [],
334
+ ["", hardline, "{"],
335
+ "}",
336
+ );
337
+ expect(doc).toEqual([
338
+ indent("{"),
339
+ hardline,
340
+ "}",
341
+ ]);
342
+
343
+ doc = [];
344
+ doc = addIndentedStatements(
345
+ doc,
346
+ [],
347
+ "{",
348
+ [
349
+ label("leadingTrivia", ["", hardline]),
350
+ "}",
351
+ ],
352
+ );
353
+ expect(doc).toEqual([
354
+ indent(
355
+ "{",
356
+ ),
357
+ hardline,
358
+ "}",
359
+ ]);
360
+
361
+ doc = [];
362
+ doc = addIndentedStatements(
363
+ doc,
364
+ [
365
+ ["", hardline, "i", ";"],
366
+ ["j", ";"],
367
+ ],
368
+ );
369
+ expect(doc).toEqual([
370
+ indent([
371
+ hardline,
372
+ ["i", ";"],
373
+ hardline,
374
+ ["j", ";"],
375
+ ]),
376
+ hardline,
377
+ ]);
378
+
379
+ doc = [];
380
+ doc = addIndentedStatements(
381
+ doc,
382
+ [
383
+ ["i", ";"],
384
+ ["j", ";", "", hardline],
385
+ ],
386
+ );
387
+ expect(doc).toEqual([
388
+ indent([
389
+ hardline,
390
+ ["i", ";"],
391
+ hardline,
392
+ ["j", ";"],
393
+ ]),
394
+ hardline,
395
+ ]);
396
+ });
397
+
398
+ test("addIndentedStatements with trivia works as expected", () => {
399
+ let doc: Doc[] = [];
400
+ doc = addIndentedStatements(
401
+ doc,
402
+ [],
403
+ [
404
+ label("leadingTrivia", ["", hardline, "// foo"]),
405
+ "{",
406
+ label("trailingTrivia", ["", hardline, "// bar"]),
407
+ ],
408
+ "}",
409
+ );
410
+ expect(doc).toEqual([
411
+ indent([
412
+ label("leadingTrivia", "// foo"),
413
+ "{",
414
+ label("trailingTrivia", ["", hardline, "// bar"]),
415
+ ]),
416
+ hardline,
417
+ "}",
418
+ ]);
419
+
420
+ doc = [];
421
+ doc = addIndentedStatements(
422
+ doc,
423
+ [],
424
+ "{",
425
+ [
426
+ label("leadingTrivia", ["", hardline, "// foo", "", hardline]),
427
+ "}",
428
+ label("trailingTrivia", ["", hardline, "// bar"]),
429
+ ],
430
+ );
431
+ expect(doc).toEqual([
432
+ indent([
433
+ "{",
434
+ hardline,
435
+ label("leadingTrivia", ["", hardline, "// foo"]),
436
+ ]),
437
+ hardline,
438
+ ["}", label("trailingTrivia", ["", hardline, "// bar"])],
439
+ ]);
440
+ });
441
+
442
+ test("addTrailingHardline works as expected", () => {
443
+ let docs: Doc = ["class", "A"];
444
+
445
+ docs = addTrailingHardline(docs);
446
+ expect(docs).toEqual(["class", "A", hardline]);
447
+
448
+ docs = ["class", "A", hardline];
449
+ docs = addTrailingHardline(docs);
450
+ expect(docs).toEqual(["class", "A", hardline]);
451
+
452
+ docs = ["class", "A", ["{", [hardline]]];
453
+ docs = addTrailingHardline(docs);
454
+ expect(docs).toEqual(["class", "A", ["{", [hardline]]]);
455
+
456
+ docs = ["class", "A", ["{", [hardline, "{"]]];
457
+ docs = addTrailingHardline(docs);
458
+ expect(docs).toEqual(["class", "A", ["{", [hardline, "{"]], hardline]);
459
+ });
460
+
461
+ test("addTrailingTriviaDoc works as expected", () => {
462
+ let docs: Doc = ["class", "A", "{"];
463
+ const trailingTriviaDoc: Doc = ["// hello", hardline];
464
+
465
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
466
+ expect(docs).toEqual(["class", "A", [
467
+ "{",
468
+ ifBreak([line, " "], " "),
469
+ ["// hello", hardline],
470
+ ]]);
471
+
472
+ docs = ["class", "A", "}"];
473
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
474
+ expect(docs).toEqual(["class", "A", [
475
+ "}",
476
+ ifBreak([line, ""], " "),
477
+ ["// hello", hardline],
478
+ ]]);
479
+
480
+ docs = ["class", "A", ["{"]];
481
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
482
+ expect(docs).toEqual(["class", "A", [
483
+ ["{", ifBreak([line, " "], " "), ["// hello", hardline]],
484
+ ]]);
485
+
486
+ docs = [["class", "A", ["{"]]];
487
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
488
+ expect(docs).toEqual([["class", "A", [[
489
+ "{",
490
+ ifBreak([line, " "], " "),
491
+ ["// hello", hardline],
492
+ ]]]]);
493
+
494
+ docs = [["class", "A", ["{"], hardline], hardline];
495
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
496
+ expect(docs).toEqual([["class", "A", [[
497
+ "{",
498
+ ifBreak([line, " "], " "),
499
+ ["// hello", hardline],
500
+ ]], hardline], hardline]);
501
+
502
+ docs = [["class", "A", ["}"], hardline], hardline];
503
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
504
+ expect(docs).toEqual([["class", "A", [[
505
+ "}",
506
+ ifBreak([line, ""], " "),
507
+ ["// hello", hardline],
508
+ ]], hardline], hardline]);
509
+
510
+ docs = [["class", "A", ["}"], hardline], hardline];
511
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
512
+ expect(docs).toEqual([["class", "A", [[
513
+ "}",
514
+ ifBreak([line, ""], " "),
515
+ ["// hello", hardline],
516
+ ]], hardline], hardline]);
517
+
518
+ docs = [[]];
519
+ docs = addTrailingTriviaDoc(docs, trailingTriviaDoc);
520
+ expect(docs).toEqual([[
521
+ ["// hello", hardline],
522
+ ]]);
523
+ });
524
+
525
+ test("no trivia comment", async () => {
526
+ await testPrettierScenario(
527
+ "class A{}",
528
+ "class A {\n" +
529
+ "}\n",
530
+ "class A {\n" +
531
+ "}\n",
532
+ );
533
+ });
534
+
535
+ test("trivia comment on own line", async () => {
536
+ await testPrettierScenario(
537
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\nclass A{} ",
538
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
539
+ "class A {\n" +
540
+ "}\n",
541
+ "// Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
542
+ "class A {\n" +
543
+ "}\n",
544
+ );
545
+ });
546
+
547
+ test("trivia comment on own indented line", async () => {
548
+ await testPrettierScenario(
549
+ "class A{\n // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n }",
550
+ "class A {\n" +
551
+ " // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
552
+ "}\n",
553
+ "class A {\n" +
554
+ " // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
555
+ "}\n",
556
+ );
557
+ });
558
+
559
+ test("trivia comment following syntactic elements", async () => {
560
+ await testPrettierScenario(
561
+ "class A{\n i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n }",
562
+ "class A {\n" +
563
+ " i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
564
+ "}\n",
565
+ "class A {\n" +
566
+ " i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
567
+ "}\n",
568
+ );
569
+ });
570
+
571
+ test("trivia comment in between syntactic elements", async () => {
572
+ await testPrettierScenario(
573
+ "class A{\n i++ // odd but valid comment position\n; \n}",
574
+ "class A {\n" +
575
+ " i++ // odd but valid comment position\n" +
576
+ " ;\n" +
577
+ "}\n",
578
+ "class A {\n" +
579
+ " i++ // odd but valid comment position\n" +
580
+ " ;\n" +
581
+ "}\n",
582
+ );
583
+ });
584
+
585
+ test("trivia comment in between syntactic elements which are line wrapped", async () => {
586
+ await testPrettierScenario(
587
+ "class A{\n computed unsigned int adaptation_field_control // odd but valid comment position\n; \n}",
588
+ "class A {\n" +
589
+ " computed unsigned int adaptation_field_control // odd but valid comment position\n" +
590
+ " ;\n" +
591
+ "}\n",
592
+ "class A {\n" +
593
+ " computed unsigned int\n" +
594
+ " adaptation_field_control\n" +
595
+ " // odd but valid comment position\n" +
596
+ " ;\n" +
597
+ "}\n",
598
+ );
599
+ });
600
+
601
+ test("trivia comment trailing, leading and in between syntactic elements", async () => {
602
+ await testPrettierScenario(
603
+ "class A{\n // leading comment \n i++ // odd but valid comment position\n; // trailing comment \n // leading comment\n} // trailing comment\n\n",
604
+ "class A {\n" +
605
+ " // leading comment\n" +
606
+ " i++ // odd but valid comment position\n" +
607
+ " ; // trailing comment\n" +
608
+ " // leading comment\n" +
609
+ "} // trailing comment\n",
610
+ "class A {\n" +
611
+ " // leading comment\n" +
612
+ " i++ // odd but valid comment position\n" +
613
+ " ; // trailing comment\n" +
614
+ " // leading comment\n" +
615
+ "} // trailing comment\n",
616
+ );
617
+ });
618
+
619
+ test("trivia comments with intentional blank lines", async () => {
620
+ await testPrettierScenario(
621
+ "class A{\n\n j++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n\n\n // Another comment line with a blank line above\n\n\n // Another comment line with a blank line above\n i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n\n\n// Another comment line with a blank line\n\n}",
622
+ "class A {\n" +
623
+ // remove blank lines after opening brace
624
+ " j++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
625
+ // multiple blank lines after statement reduced to single blank line
626
+ "\n" +
627
+ " // Another comment line with a blank line above\n" +
628
+ // multiple blank lines between comments and another comment reduced to single blank line
629
+ "\n" +
630
+ " // Another comment line with a blank line above\n" +
631
+ " i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
632
+ // multiple blank lines after statement reduced to single blank line
633
+ "\n" +
634
+ " // Another comment line with a blank line\n" +
635
+ // remove blank lines before closing brace
636
+ "}\n",
637
+ "class A {\n" +
638
+ " j++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
639
+ "\n" +
640
+ " // Another comment line with a blank line above\n" +
641
+ "\n" +
642
+ " // Another comment line with a blank line above\n" +
643
+ " i++; // Le lorem ipsum est, en imprimerie, une suite de mots sans signification utilisée\n" +
644
+ "\n" +
645
+ " // Another comment line with a blank line\n" +
646
+ "}\n",
647
+ );
648
+ });
649
+
650
+ test("intentional blank lines", async () => {
651
+ await testPrettierScenario(
652
+ "class A{\n\n computed int a;\n\n}",
653
+ "class A {\n" +
654
+ // remove blank lines after opening brace
655
+ " computed int a;\n" +
656
+ // remove blank lines before closing brace
657
+ "}\n",
658
+ "class A {\n" +
659
+ // remove blank lines after opening brace
660
+ " computed int a;\n" +
661
+ // remove blank lines before closing brace
662
+ "}\n",
663
+ );
664
+ });
665
+ });
@@ -0,0 +1,38 @@
1
+ import { doc } from "prettier";
2
+ import { describe, expect, test } from "bun:test";
3
+ import {
4
+ isBreakParent,
5
+ isFill,
6
+ isHardline,
7
+ isIndent,
8
+ isLabel,
9
+ } from "../../../src/prettier/util/types.ts";
10
+
11
+ const { breakParent, hardline, label, line, indent, fill } = doc.builders;
12
+
13
+ describe("Type tests", () => {
14
+ test("isBreakParent works", () => {
15
+ expect(isBreakParent(breakParent)).toBe(true);
16
+ expect(isHardline(line)).toBe(false);
17
+ });
18
+
19
+ test("isFill works", () => {
20
+ expect(isFill(fill([line, "text", hardline]))).toBe(true);
21
+ expect(isFill(line)).toBe(false);
22
+ });
23
+
24
+ test("isHardline works", () => {
25
+ expect(isHardline(hardline)).toBe(true);
26
+ expect(isHardline(line)).toBe(false);
27
+ });
28
+
29
+ test("isIndent works", () => {
30
+ expect(isIndent(indent("indented"))).toBe(true);
31
+ expect(isIndent(line)).toBe(false);
32
+ });
33
+
34
+ test("isLabel works", () => {
35
+ expect(isLabel(label("my-label", "label"))).toBe(true);
36
+ expect(isLabel(line)).toBe(false);
37
+ });
38
+ });