@aster-cloud/aster-lang-ts 1.0.30 → 1.0.32

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 (297) hide show
  1. package/dist/scripts/aster.js +11 -26
  2. package/dist/scripts/aster.js.map +1 -1
  3. package/dist/scripts/corpus-loader.d.ts +17 -0
  4. package/dist/scripts/corpus-loader.d.ts.map +1 -0
  5. package/dist/scripts/corpus-loader.js +60 -0
  6. package/dist/scripts/corpus-loader.js.map +1 -0
  7. package/dist/scripts/emit-classfiles-core.js +5 -13
  8. package/dist/scripts/emit-classfiles-core.js.map +1 -1
  9. package/dist/scripts/emit-classfiles.js +7 -12
  10. package/dist/scripts/emit-classfiles.js.map +1 -1
  11. package/dist/scripts/generate_error_codes.js +2 -0
  12. package/dist/scripts/generate_error_codes.js.map +1 -1
  13. package/dist/scripts/golden.js +4 -1
  14. package/dist/scripts/golden.js.map +1 -1
  15. package/dist/scripts/test-lossless-golden.js +2 -1
  16. package/dist/scripts/test-lossless-golden.js.map +1 -1
  17. package/dist/scripts/validate_error_codes.js +1 -0
  18. package/dist/scripts/validate_error_codes.js.map +1 -1
  19. package/dist/scripts/verify-lexicon-sync.js +5 -1
  20. package/dist/scripts/verify-lexicon-sync.js.map +1 -1
  21. package/dist/src/ast/ast.d.ts +1 -1
  22. package/dist/src/ast/ast.d.ts.map +1 -1
  23. package/dist/src/ast/ast.js +2 -1
  24. package/dist/src/ast/ast.js.map +1 -1
  25. package/dist/src/browser.d.ts +7 -0
  26. package/dist/src/browser.d.ts.map +1 -1
  27. package/dist/src/browser.js +4 -0
  28. package/dist/src/browser.js.map +1 -1
  29. package/dist/src/cli/utils/gradle-env.d.ts +9 -0
  30. package/dist/src/cli/utils/gradle-env.d.ts.map +1 -0
  31. package/dist/src/cli/utils/gradle-env.js +18 -0
  32. package/dist/src/cli/utils/gradle-env.js.map +1 -0
  33. package/dist/src/cli/utils/out-dir.d.ts +18 -0
  34. package/dist/src/cli/utils/out-dir.d.ts.map +1 -0
  35. package/dist/src/cli/utils/out-dir.js +49 -0
  36. package/dist/src/cli/utils/out-dir.js.map +1 -0
  37. package/dist/src/cnl-printer.d.ts +10 -0
  38. package/dist/src/cnl-printer.d.ts.map +1 -0
  39. package/dist/src/cnl-printer.js +360 -0
  40. package/dist/src/cnl-printer.js.map +1 -0
  41. package/dist/src/config/lexicons/de-DE.d.ts.map +1 -1
  42. package/dist/src/config/lexicons/de-DE.js +8 -2
  43. package/dist/src/config/lexicons/de-DE.js.map +1 -1
  44. package/dist/src/config/lexicons/en-US.d.ts.map +1 -1
  45. package/dist/src/config/lexicons/en-US.js +8 -4
  46. package/dist/src/config/lexicons/en-US.js.map +1 -1
  47. package/dist/src/config/lexicons/hi-IN.d.ts.map +1 -1
  48. package/dist/src/config/lexicons/hi-IN.js +8 -2
  49. package/dist/src/config/lexicons/hi-IN.js.map +1 -1
  50. package/dist/src/config/lexicons/template.d.ts.map +1 -1
  51. package/dist/src/config/lexicons/template.js +12 -0
  52. package/dist/src/config/lexicons/template.js.map +1 -1
  53. package/dist/src/config/lexicons/zh-CN.d.ts.map +1 -1
  54. package/dist/src/config/lexicons/zh-CN.js +9 -3
  55. package/dist/src/config/lexicons/zh-CN.js.map +1 -1
  56. package/dist/src/config/semantic.d.ts +6 -0
  57. package/dist/src/config/semantic.d.ts.map +1 -1
  58. package/dist/src/config/semantic.js +8 -0
  59. package/dist/src/config/semantic.js.map +1 -1
  60. package/dist/src/config/token-kind.d.ts +12 -0
  61. package/dist/src/config/token-kind.d.ts.map +1 -1
  62. package/dist/src/config/token-kind.js +18 -0
  63. package/dist/src/config/token-kind.js.map +1 -1
  64. package/dist/src/core/core_ir.d.ts +1 -1
  65. package/dist/src/core/core_ir.d.ts.map +1 -1
  66. package/dist/src/core/core_ir.js +3 -1
  67. package/dist/src/core/core_ir.js.map +1 -1
  68. package/dist/src/core/interpreter.d.ts.map +1 -1
  69. package/dist/src/core/interpreter.js +222 -18
  70. package/dist/src/core/interpreter.js.map +1 -1
  71. package/dist/src/cst/cst_printer.d.ts.map +1 -1
  72. package/dist/src/cst/cst_printer.js +66 -32
  73. package/dist/src/cst/cst_printer.js.map +1 -1
  74. package/dist/src/diagnostics/diagnostics.d.ts +1 -0
  75. package/dist/src/diagnostics/diagnostics.d.ts.map +1 -1
  76. package/dist/src/diagnostics/diagnostics.js +1 -0
  77. package/dist/src/diagnostics/diagnostics.js.map +1 -1
  78. package/dist/src/diagnostics/error_codes.d.ts +10 -2
  79. package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
  80. package/dist/src/diagnostics/error_codes.js +64 -0
  81. package/dist/src/diagnostics/error_codes.js.map +1 -1
  82. package/dist/src/effects/effect_inference.js +1 -1
  83. package/dist/src/effects/effect_inference.js.map +1 -1
  84. package/dist/src/formatter.d.ts +3 -0
  85. package/dist/src/formatter.d.ts.map +1 -1
  86. package/dist/src/formatter.js +8 -261
  87. package/dist/src/formatter.js.map +1 -1
  88. package/dist/src/frontend/transformers.d.ts.map +1 -1
  89. package/dist/src/frontend/transformers.js +10 -2
  90. package/dist/src/frontend/transformers.js.map +1 -1
  91. package/dist/src/governance/controls-registry.data.d.ts +40 -0
  92. package/dist/src/governance/controls-registry.data.d.ts.map +1 -0
  93. package/dist/src/governance/controls-registry.data.js +35 -0
  94. package/dist/src/governance/controls-registry.data.js.map +1 -0
  95. package/dist/src/governance/controls.d.ts +23 -0
  96. package/dist/src/governance/controls.d.ts.map +1 -0
  97. package/dist/src/governance/controls.js +77 -0
  98. package/dist/src/governance/controls.js.map +1 -0
  99. package/dist/src/index.d.ts +4 -0
  100. package/dist/src/index.d.ts.map +1 -1
  101. package/dist/src/index.js +2 -0
  102. package/dist/src/index.js.map +1 -1
  103. package/dist/src/lower_to_core.js +1 -1
  104. package/dist/src/lower_to_core.js.map +1 -1
  105. package/dist/src/lsp/completion.d.ts +22 -1
  106. package/dist/src/lsp/completion.d.ts.map +1 -1
  107. package/dist/src/lsp/completion.js +42 -1
  108. package/dist/src/lsp/completion.js.map +1 -1
  109. package/dist/src/lsp/debounce-map.d.ts +16 -0
  110. package/dist/src/lsp/debounce-map.d.ts.map +1 -0
  111. package/dist/src/lsp/debounce-map.js +32 -0
  112. package/dist/src/lsp/debounce-map.js.map +1 -0
  113. package/dist/src/lsp/server.js +6 -8
  114. package/dist/src/lsp/server.js.map +1 -1
  115. package/dist/src/lsp/utils.d.ts.map +1 -1
  116. package/dist/src/lsp/utils.js +2 -0
  117. package/dist/src/lsp/utils.js.map +1 -1
  118. package/dist/src/lsp/workspace/file-watcher.d.ts +1 -0
  119. package/dist/src/lsp/workspace/file-watcher.d.ts.map +1 -1
  120. package/dist/src/lsp/workspace/file-watcher.js +24 -14
  121. package/dist/src/lsp/workspace/file-watcher.js.map +1 -1
  122. package/dist/src/manifest.d.ts +2 -0
  123. package/dist/src/manifest.d.ts.map +1 -1
  124. package/dist/src/manifest.js.map +1 -1
  125. package/dist/src/package/manifest-parser.d.ts +10 -0
  126. package/dist/src/package/manifest-parser.d.ts.map +1 -1
  127. package/dist/src/package/manifest-parser.js +27 -28
  128. package/dist/src/package/manifest-parser.js.map +1 -1
  129. package/dist/src/package/manifest-schema.d.ts +15 -0
  130. package/dist/src/package/manifest-schema.d.ts.map +1 -0
  131. package/dist/src/package/manifest-schema.js +116 -0
  132. package/dist/src/package/manifest-schema.js.map +1 -0
  133. package/dist/src/parser/context.d.ts +2 -0
  134. package/dist/src/parser/context.d.ts.map +1 -1
  135. package/dist/src/parser/context.js +1 -0
  136. package/dist/src/parser/context.js.map +1 -1
  137. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  138. package/dist/src/parser/decl-parser.js +26 -10
  139. package/dist/src/parser/decl-parser.js.map +1 -1
  140. package/dist/src/parser/expr-stmt-parser.d.ts +4 -1
  141. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  142. package/dist/src/parser/expr-stmt-parser.js +199 -6
  143. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  144. package/dist/src/parser/import-parser.d.ts +12 -0
  145. package/dist/src/parser/import-parser.d.ts.map +1 -1
  146. package/dist/src/parser/import-parser.js +28 -0
  147. package/dist/src/parser/import-parser.js.map +1 -1
  148. package/dist/src/parser.js +1 -1
  149. package/dist/src/parser.js.map +1 -1
  150. package/dist/src/typecheck/browser.d.ts +3 -0
  151. package/dist/src/typecheck/browser.d.ts.map +1 -1
  152. package/dist/src/typecheck/browser.js +10 -1
  153. package/dist/src/typecheck/browser.js.map +1 -1
  154. package/dist/src/typecheck/context.d.ts +3 -0
  155. package/dist/src/typecheck/context.d.ts.map +1 -1
  156. package/dist/src/typecheck/context.js.map +1 -1
  157. package/dist/src/typecheck/expression.d.ts +6 -0
  158. package/dist/src/typecheck/expression.d.ts.map +1 -1
  159. package/dist/src/typecheck/expression.js +54 -2
  160. package/dist/src/typecheck/expression.js.map +1 -1
  161. package/dist/src/typecheck/generics.d.ts.map +1 -1
  162. package/dist/src/typecheck/generics.js +3 -0
  163. package/dist/src/typecheck/generics.js.map +1 -1
  164. package/dist/src/typecheck/governance.d.ts +43 -0
  165. package/dist/src/typecheck/governance.d.ts.map +1 -0
  166. package/dist/src/typecheck/governance.js +162 -0
  167. package/dist/src/typecheck/governance.js.map +1 -0
  168. package/dist/src/typecheck/module.d.ts.map +1 -1
  169. package/dist/src/typecheck/module.js +10 -1
  170. package/dist/src/typecheck/module.js.map +1 -1
  171. package/dist/src/typecheck/statement.d.ts.map +1 -1
  172. package/dist/src/typecheck/statement.js +2 -2
  173. package/dist/src/typecheck/statement.js.map +1 -1
  174. package/dist/src/typecheck/type_system.d.ts.map +1 -1
  175. package/dist/src/typecheck/type_system.js +4 -0
  176. package/dist/src/typecheck/type_system.js.map +1 -1
  177. package/dist/src/typecheck/verdict_signatures.d.ts +19 -0
  178. package/dist/src/typecheck/verdict_signatures.d.ts.map +1 -0
  179. package/dist/src/typecheck/verdict_signatures.js +23 -0
  180. package/dist/src/typecheck/verdict_signatures.js.map +1 -0
  181. package/dist/src/types/base.d.ts +2 -0
  182. package/dist/src/types/base.d.ts.map +1 -1
  183. package/dist/test/helpers/sibling-source.d.ts +10 -0
  184. package/dist/test/helpers/sibling-source.d.ts.map +1 -0
  185. package/dist/test/helpers/sibling-source.js +20 -0
  186. package/dist/test/helpers/sibling-source.js.map +1 -0
  187. package/dist/test/unit/allocation-budget.test.d.ts +2 -0
  188. package/dist/test/unit/allocation-budget.test.d.ts.map +1 -0
  189. package/dist/test/unit/allocation-budget.test.js +160 -0
  190. package/dist/test/unit/allocation-budget.test.js.map +1 -0
  191. package/dist/test/unit/apply-call.test.js +5 -0
  192. package/dist/test/unit/apply-call.test.js.map +1 -1
  193. package/dist/test/unit/canonicalizer/possessive-anchor.test.js +10 -0
  194. package/dist/test/unit/canonicalizer/possessive-anchor.test.js.map +1 -1
  195. package/dist/test/unit/cli/gradle-env-guard.test.d.ts +2 -0
  196. package/dist/test/unit/cli/gradle-env-guard.test.d.ts.map +1 -0
  197. package/dist/test/unit/cli/gradle-env-guard.test.js +53 -0
  198. package/dist/test/unit/cli/gradle-env-guard.test.js.map +1 -0
  199. package/dist/test/unit/cli/gradle-env.test.d.ts +2 -0
  200. package/dist/test/unit/cli/gradle-env.test.d.ts.map +1 -0
  201. package/dist/test/unit/cli/gradle-env.test.js +31 -0
  202. package/dist/test/unit/cli/gradle-env.test.js.map +1 -0
  203. package/dist/test/unit/cli/out-dir.test.d.ts +2 -0
  204. package/dist/test/unit/cli/out-dir.test.d.ts.map +1 -0
  205. package/dist/test/unit/cli/out-dir.test.js +96 -0
  206. package/dist/test/unit/cli/out-dir.test.js.map +1 -0
  207. package/dist/test/unit/eval-regression-poker-straight-high.test.d.ts +2 -0
  208. package/dist/test/unit/eval-regression-poker-straight-high.test.d.ts.map +1 -0
  209. package/dist/test/unit/eval-regression-poker-straight-high.test.js +61 -0
  210. package/dist/test/unit/eval-regression-poker-straight-high.test.js.map +1 -0
  211. package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts +2 -0
  212. package/dist/test/unit/formatter-corpus-roundtrip.test.d.ts.map +1 -0
  213. package/dist/test/unit/formatter-corpus-roundtrip.test.js +190 -0
  214. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -0
  215. package/dist/test/unit/formatter-roundtrip.test.d.ts +2 -0
  216. package/dist/test/unit/formatter-roundtrip.test.d.ts.map +1 -0
  217. package/dist/test/unit/formatter-roundtrip.test.js +125 -0
  218. package/dist/test/unit/formatter-roundtrip.test.js.map +1 -0
  219. package/dist/test/unit/governance/controls-registry-parity.test.d.ts +2 -0
  220. package/dist/test/unit/governance/controls-registry-parity.test.d.ts.map +1 -0
  221. package/dist/test/unit/governance/controls-registry-parity.test.js +28 -0
  222. package/dist/test/unit/governance/controls-registry-parity.test.js.map +1 -0
  223. package/dist/test/unit/governance/controls-registry-profiles.test.d.ts +2 -0
  224. package/dist/test/unit/governance/controls-registry-profiles.test.d.ts.map +1 -0
  225. package/dist/test/unit/governance/controls-registry-profiles.test.js +106 -0
  226. package/dist/test/unit/governance/controls-registry-profiles.test.js.map +1 -0
  227. package/dist/test/unit/governance/governance-check.test.d.ts +2 -0
  228. package/dist/test/unit/governance/governance-check.test.d.ts.map +1 -0
  229. package/dist/test/unit/governance/governance-check.test.js +169 -0
  230. package/dist/test/unit/governance/governance-check.test.js.map +1 -0
  231. package/dist/test/unit/governance/profile-check.test.d.ts +2 -0
  232. package/dist/test/unit/governance/profile-check.test.d.ts.map +1 -0
  233. package/dist/test/unit/governance/profile-check.test.js +139 -0
  234. package/dist/test/unit/governance/profile-check.test.js.map +1 -0
  235. package/dist/test/unit/governance/verdict-typecheck.test.d.ts +2 -0
  236. package/dist/test/unit/governance/verdict-typecheck.test.d.ts.map +1 -0
  237. package/dist/test/unit/governance/verdict-typecheck.test.js +80 -0
  238. package/dist/test/unit/governance/verdict-typecheck.test.js.map +1 -0
  239. package/dist/test/unit/interpreter/verdict-builtins.test.d.ts +2 -0
  240. package/dist/test/unit/interpreter/verdict-builtins.test.d.ts.map +1 -0
  241. package/dist/test/unit/interpreter/verdict-builtins.test.js +72 -0
  242. package/dist/test/unit/interpreter/verdict-builtins.test.js.map +1 -0
  243. package/dist/test/unit/list-numeric-fail-loud.test.d.ts +2 -0
  244. package/dist/test/unit/list-numeric-fail-loud.test.d.ts.map +1 -0
  245. package/dist/test/unit/list-numeric-fail-loud.test.js +83 -0
  246. package/dist/test/unit/list-numeric-fail-loud.test.js.map +1 -0
  247. package/dist/test/unit/lossless-mirror.test.d.ts +2 -0
  248. package/dist/test/unit/lossless-mirror.test.d.ts.map +1 -0
  249. package/dist/test/unit/lossless-mirror.test.js +41 -0
  250. package/dist/test/unit/lossless-mirror.test.js.map +1 -0
  251. package/dist/test/unit/lossless-reflow.test.d.ts +2 -0
  252. package/dist/test/unit/lossless-reflow.test.d.ts.map +1 -0
  253. package/dist/test/unit/lossless-reflow.test.js +84 -0
  254. package/dist/test/unit/lossless-reflow.test.js.map +1 -0
  255. package/dist/test/unit/lowering/lowering.test.js +35 -35
  256. package/dist/test/unit/lowering/lowering.test.js.map +1 -1
  257. package/dist/test/unit/lsp/control-completion.test.d.ts +2 -0
  258. package/dist/test/unit/lsp/control-completion.test.d.ts.map +1 -0
  259. package/dist/test/unit/lsp/control-completion.test.js +46 -0
  260. package/dist/test/unit/lsp/control-completion.test.js.map +1 -0
  261. package/dist/test/unit/lsp/debounce-map.test.d.ts +2 -0
  262. package/dist/test/unit/lsp/debounce-map.test.d.ts.map +1 -0
  263. package/dist/test/unit/lsp/debounce-map.test.js +47 -0
  264. package/dist/test/unit/lsp/debounce-map.test.js.map +1 -0
  265. package/dist/test/unit/lsp/file-watcher-restart.test.d.ts +2 -0
  266. package/dist/test/unit/lsp/file-watcher-restart.test.d.ts.map +1 -0
  267. package/dist/test/unit/lsp/file-watcher-restart.test.js +40 -0
  268. package/dist/test/unit/lsp/file-watcher-restart.test.js.map +1 -0
  269. package/dist/test/unit/manifest-parser.test.js +8 -0
  270. package/dist/test/unit/manifest-parser.test.js.map +1 -1
  271. package/dist/test/unit/manifest-schema.test.d.ts +7 -5
  272. package/dist/test/unit/manifest-schema.test.d.ts.map +1 -1
  273. package/dist/test/unit/manifest-schema.test.js +48 -10
  274. package/dist/test/unit/manifest-schema.test.js.map +1 -1
  275. package/dist/test/unit/mapping/redos-budget.test.js +60 -23
  276. package/dist/test/unit/mapping/redos-budget.test.js.map +1 -1
  277. package/dist/test/unit/parser/governance-sugar.test.d.ts +2 -0
  278. package/dist/test/unit/parser/governance-sugar.test.d.ts.map +1 -0
  279. package/dist/test/unit/parser/governance-sugar.test.js +258 -0
  280. package/dist/test/unit/parser/governance-sugar.test.js.map +1 -0
  281. package/dist/test/unit/parser/module-header.test.d.ts +2 -0
  282. package/dist/test/unit/parser/module-header.test.d.ts.map +1 -0
  283. package/dist/test/unit/parser/module-header.test.js +25 -0
  284. package/dist/test/unit/parser/module-header.test.js.map +1 -0
  285. package/dist/test/unit/parser/positional-annotation-args.test.d.ts +2 -0
  286. package/dist/test/unit/parser/positional-annotation-args.test.d.ts.map +1 -0
  287. package/dist/test/unit/parser/positional-annotation-args.test.js +26 -0
  288. package/dist/test/unit/parser/positional-annotation-args.test.js.map +1 -0
  289. package/dist/test/unit/parser/prefix-operator-call.test.d.ts +2 -0
  290. package/dist/test/unit/parser/prefix-operator-call.test.d.ts.map +1 -0
  291. package/dist/test/unit/parser/prefix-operator-call.test.js +185 -0
  292. package/dist/test/unit/parser/prefix-operator-call.test.js.map +1 -0
  293. package/dist/test/unit/scripts/corpus-loader.test.d.ts +2 -0
  294. package/dist/test/unit/scripts/corpus-loader.test.d.ts.map +1 -0
  295. package/dist/test/unit/scripts/corpus-loader.test.js +85 -0
  296. package/dist/test/unit/scripts/corpus-loader.test.js.map +1 -0
  297. package/package.json +1 -1
@@ -0,0 +1,185 @@
1
+ /**
2
+ * 前缀运算符调用 `<op>(a, b)`:与 Java AsterParser.operatorCall 对齐。
3
+ * 降为与中缀写法相同的 Call(Name(规范符号), [a, b]),`=` 与中缀一样规范为 `==`;恰好 2 个参数。
4
+ */
5
+ import { describe, test } from 'node:test';
6
+ import assert from 'node:assert/strict';
7
+ import { canonicalize } from '../../../src/frontend/canonicalizer.js';
8
+ import { lex } from '../../../src/frontend/lexer.js';
9
+ import { parse, parseWithLexicon } from '../../../src/parser.js';
10
+ import { ZH_CN } from '../../../src/config/lexicons/zh-CN.js';
11
+ import { lowerModule } from '../../../src/lower_to_core.js';
12
+ import { typecheckModule } from '../../../src/typecheck.js';
13
+ function toCore(source) {
14
+ const result = parse(lex(canonicalize(source)));
15
+ const errors = result.diagnostics.filter((d) => d.severity === 'error');
16
+ if (errors.length > 0)
17
+ throw new Error(errors.map((d) => `${d.code} ${d.message}`).join('\n'));
18
+ return lowerModule(result.ast);
19
+ }
20
+ function zhToCore(source) {
21
+ const result = parseWithLexicon(lex(canonicalize(source, ZH_CN), ZH_CN), ZH_CN);
22
+ const errors = result.diagnostics.filter((d) => d.severity === 'error');
23
+ if (errors.length > 0)
24
+ throw new Error(errors.map((d) => `${d.code} ${d.message}`).join('\n'));
25
+ return lowerModule(result.ast);
26
+ }
27
+ function stripOrigins(o) {
28
+ if (Array.isArray(o))
29
+ return o.map(stripOrigins);
30
+ if (!o || typeof o !== 'object')
31
+ return o;
32
+ const out = {};
33
+ for (const [k, v] of Object.entries(o)) {
34
+ if (k !== 'origin')
35
+ out[k] = stripOrigins(v);
36
+ }
37
+ return out;
38
+ }
39
+ function ruleReturning(expr, ret) {
40
+ return `Module m.\n\nRule r given x as Int, y as Int, produce ${ret}:\n Return ${expr}.\n`;
41
+ }
42
+ // [前缀运算符, 等价中缀写法, 返回类型]
43
+ const CASES = [
44
+ ['<', 'x < y', 'Bool'],
45
+ ['>', 'x > y', 'Bool'],
46
+ ['<=', 'x <= y', 'Bool'],
47
+ ['>=', 'x >= y', 'Bool'],
48
+ ['!=', 'x != y', 'Bool'],
49
+ ['==', 'x == y', 'Bool'],
50
+ ['=', 'x = y', 'Bool'],
51
+ ['+', 'x + y', 'Int'],
52
+ ['-', 'x - y', 'Int'],
53
+ ['*', 'x * y', 'Int'],
54
+ ['/', 'x / y', 'Int'],
55
+ ];
56
+ describe('前缀运算符调用', () => {
57
+ for (const [op, infix, ret] of CASES) {
58
+ test(`${op}(x, y) 与 ${infix} 的 Core IR 相同`, () => {
59
+ const prefix = toCore(ruleReturning(`${op}(x, y)`, ret));
60
+ assert.deepEqual(stripOrigins(prefix), stripOrigins(toCore(ruleReturning(infix, ret))));
61
+ assert.deepEqual(typecheckModule(prefix).filter((d) => d.severity === 'error'), []);
62
+ });
63
+ }
64
+ test('= 规范为 ==', () => {
65
+ const func = toCore(ruleReturning('=(x, y)', 'Bool')).decls[0];
66
+ const ret = func.body.statements[0];
67
+ assert.equal(ret.expr.target.name, '==');
68
+ });
69
+ test('实参可为任意表达式,且前缀调用可作中缀操作数', () => {
70
+ assert.deepEqual(stripOrigins(toCore(ruleReturning('>=(x plus 1, y) and =(x, 2)', 'Bool'))), stripOrigins(toCore(ruleReturning('x plus 1 at least y and x = 2', 'Bool'))));
71
+ });
72
+ test('参数个数不是 2 时报错(与 Java 同一消息)', () => {
73
+ assert.throws(() => toCore(ruleReturning('+(x, y, x)', 'Int')), /前缀操作符调用需要 2 个参数,但实际为 3/);
74
+ assert.throws(() => toCore(ruleReturning('>=(x)', 'Bool')), /前缀操作符调用需要 2 个参数,但实际为 1/);
75
+ });
76
+ });
77
+ // 以下各组与 aster-lang-core 实测一致(Canonicalizer + AsterParser + AstBuilder)。
78
+ function boolRule(expr) {
79
+ return `Module m.\n\nRule r given a as Bool, b as Bool, x as Int, y as Int, produce Bool:\n Return ${expr}.\n`;
80
+ }
81
+ function zhRule(expr) {
82
+ return `模块 m。\n\n规则 评估 给定 甲,乙,产出:\n 返回 ${expr}。\n`;
83
+ }
84
+ const WORD_CALL_REJECTED = /运算符词 '([a-z ]+)' 不能用作前缀调用/;
85
+ describe('运算符词前缀调用(en-US):Java operatorCall 只认符号', () => {
86
+ // [源码表达式, 报错中的运算符词]
87
+ const REJECTED = [
88
+ ['and(a, b)', 'and'],
89
+ ['or(a, b)', 'or'],
90
+ ['and(a)', 'and'],
91
+ ['plus(x, y) > 0', 'plus'],
92
+ ['minus(x, y) > 0', 'minus'],
93
+ ['times(x, y) > 0', 'times'],
94
+ ['modulo(x, y) > 0', 'modulo'],
95
+ ];
96
+ for (const [expr, word] of REJECTED) {
97
+ test(`${expr} 被拒绝`, () => {
98
+ assert.throws(() => toCore(boolRule(expr)), new RegExp(`运算符词 '${word}' 不能用作前缀调用;只有符号运算符 < > <= >= != == = \\+ - \\* / 可以写成 op\\(a, b\\)`));
99
+ });
100
+ }
101
+ // 多词运算符原本就被两引擎拒绝(TS 报通用语法错误),锁定现状
102
+ const MULTI_WORD_REJECTED = [
103
+ ['divided by(x, y) > 0', WORD_CALL_REJECTED],
104
+ ['integer divided by(x, y) > 0', WORD_CALL_REJECTED],
105
+ ['less than(x, y)', WORD_CALL_REJECTED],
106
+ ['greater than(x, y)', WORD_CALL_REJECTED],
107
+ ['more than(x, y)', WORD_CALL_REJECTED],
108
+ ['at least(x, y)', WORD_CALL_REJECTED],
109
+ ['at most(x, y)', WORD_CALL_REJECTED],
110
+ ['equals to(x, y)', WORD_CALL_REJECTED],
111
+ ['not equal to(x, y)', /Expected '\.' at end of statement/],
112
+ ['less than or equal to(x, y)', /Expected '\.' at end of statement/],
113
+ ['is less than(x, y)', /Expected '\)' after expression/],
114
+ ['not(a, b)', /Expected '\)' after expression/],
115
+ ];
116
+ for (const [expr, message] of MULTI_WORD_REJECTED) {
117
+ test(`${expr} 被拒绝`, () => {
118
+ assert.throws(() => toCore(boolRule(expr)), message);
119
+ });
120
+ }
121
+ test('中缀 and/or 不受影响', () => {
122
+ assert.doesNotThrow(() => toCore(boolRule('a and b or a')));
123
+ });
124
+ test('not(a) 是一元 not 作用于括号表达式,与 not a 相同', () => {
125
+ assert.deepEqual(stripOrigins(toCore(boolRule('not(a)'))), stripOrigins(toCore(boolRule('not a'))));
126
+ });
127
+ test('en-US 下 under/over 是软关键词:under(x, y) 是普通函数调用', () => {
128
+ for (const word of ['under', 'over']) {
129
+ const func = toCore(boolRule(`${word}(x, y)`)).decls[0];
130
+ const call = func.body.statements[0].expr;
131
+ assert.equal(call.target.name, word);
132
+ }
133
+ });
134
+ test('大小写不同的同名标识符是普通函数调用(Java lexer 区分大小写)', () => {
135
+ for (const name of ['Plus', 'pLus', 'And']) {
136
+ const func = toCore(boolRule(`${name}(x, y)`)).decls[0];
137
+ const call = func.body.statements[0].expr;
138
+ assert.equal(call.target.name, name);
139
+ }
140
+ });
141
+ });
142
+ describe('运算符词前缀调用(非英语词法表):Java Canonicalizer 把可映射的运算符词翻成符号', () => {
143
+ // [中文运算符词或英文关键词, 对应符号]
144
+ const ACCEPTED = [
145
+ ['加上', '+'],
146
+ ['减去', '-'],
147
+ ['乘以', '*'],
148
+ ['除以', '/'],
149
+ ['小于', '<'],
150
+ ['大于', '>'],
151
+ ['多于', '>'],
152
+ ['等于', '=='],
153
+ ['至少', '>='],
154
+ ['至多', '<='],
155
+ ['不足', '<'],
156
+ ['超过', '>'],
157
+ ['plus', '+'],
158
+ ['under', '<'],
159
+ ];
160
+ for (const [word, symbol] of ACCEPTED) {
161
+ test(`${word}(甲,乙) 与 ${symbol}(甲,乙) 的 Core IR 相同`, () => {
162
+ assert.deepEqual(stripOrigins(zhToCore(zhRule(`${word}(甲,乙)`))), stripOrigins(zhToCore(zhRule(`${symbol}(甲,乙)`))));
163
+ });
164
+ }
165
+ const REJECTED = [
166
+ ['并且(真值,假值)', 'and'],
167
+ ['或者(真值,假值)', 'or'],
168
+ ['取模(甲,乙)', 'modulo'],
169
+ ['整除(甲,乙)', 'integer divided by'],
170
+ ['and(真值,假值)', 'and'],
171
+ ['modulo(甲,乙)', 'modulo'],
172
+ ];
173
+ for (const [expr, word] of REJECTED) {
174
+ test(`${expr} 被拒绝`, () => {
175
+ assert.throws(() => zhToCore(zhRule(expr)), new RegExp(`运算符词 '${word}' 不能用作前缀调用`));
176
+ });
177
+ }
178
+ test('参数个数不是 2 时报与符号前缀调用相同的错误', () => {
179
+ assert.throws(() => zhToCore(zhRule('加上(甲)')), /前缀操作符调用需要 2 个参数,但实际为 1/);
180
+ });
181
+ test('不是(真值) 仍是一元 not', () => {
182
+ assert.deepEqual(stripOrigins(zhToCore(zhRule('不是(真值)'))), stripOrigins(zhToCore(zhRule('不是 真值'))));
183
+ });
184
+ });
185
+ //# sourceMappingURL=prefix-operator-call.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefix-operator-call.test.js","sourceRoot":"","sources":["../../../../test/unit/parser/prefix-operator-call.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AACtE,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,uCAAuC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,SAAS,MAAM,CAAC,MAAc;IAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/F,OAAO,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACjD,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IAC1C,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,QAAQ;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAY,EAAE,GAAW;IAC9C,OAAO,yDAAyD,GAAG,eAAe,IAAI,KAAK,CAAC;AAC9F,CAAC;AAED,wBAAwB;AACxB,MAAM,KAAK,GAAqD;IAC9D,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;IACtB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;IACxB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;IACxB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;IACxB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC;IACxB,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;IACtB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;IACrB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;IACrB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;IACrB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC;CACtB,CAAC;AAEF,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACvB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,GAAG,EAAE,YAAY,KAAK,eAAe,EAAE,GAAG,EAAE;YAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE;QACpB,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAc,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAgB,CAAC;QACnD,MAAM,CAAC,KAAK,CAAG,GAAG,CAAC,IAAkB,CAAC,MAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,SAAS,CACd,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,6BAA6B,EAAE,MAAM,CAAC,CAAC,CAAC,EAC1E,YAAY,CAAC,MAAM,CAAC,aAAa,CAAC,+BAA+B,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;QAC1F,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,wEAAwE;AACxE,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,+FAA+F,IAAI,KAAK,CAAC;AAClH,CAAC;AAED,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,mCAAmC,IAAI,KAAK,CAAC;AACtD,CAAC;AAED,MAAM,kBAAkB,GAAG,2BAA2B,CAAC;AAEvD,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;IACtD,oBAAoB;IACpB,MAAM,QAAQ,GAA6C;QACzD,CAAC,WAAW,EAAE,KAAK,CAAC;QACpB,CAAC,UAAU,EAAE,IAAI,CAAC;QAClB,CAAC,QAAQ,EAAE,KAAK,CAAC;QACjB,CAAC,gBAAgB,EAAE,MAAM,CAAC;QAC1B,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC5B,CAAC,iBAAiB,EAAE,OAAO,CAAC;QAC5B,CAAC,kBAAkB,EAAE,QAAQ,CAAC;KAC/B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAC5B,IAAI,MAAM,CAAC,SAAS,IAAI,oEAAoE,CAAC,CAC9F,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,MAAM,mBAAmB,GAA6C;QACpE,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;QAC5C,CAAC,8BAA8B,EAAE,kBAAkB,CAAC;QACpD,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;QACvC,CAAC,oBAAoB,EAAE,kBAAkB,CAAC;QAC1C,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;QACvC,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;QACtC,CAAC,eAAe,EAAE,kBAAkB,CAAC;QACrC,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;QACvC,CAAC,oBAAoB,EAAE,mCAAmC,CAAC;QAC3D,CAAC,6BAA6B,EAAE,mCAAmC,CAAC;QACpE,CAAC,oBAAoB,EAAE,gCAAgC,CAAC;QACxD,CAAC,WAAW,EAAE,gCAAgC,CAAC;KAChD,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,mBAAmB,EAAE,CAAC;QAClD,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACxD,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAc,CAAC;YACrE,MAAM,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAiB,CAAC,IAAiB,CAAC;YACxE,MAAM,CAAC,KAAK,CAAE,IAAI,CAAC,MAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAChD,KAAK,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAc,CAAC;YACrE,MAAM,IAAI,GAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAiB,CAAC,IAAiB,CAAC;YACxE,MAAM,CAAC,KAAK,CAAE,IAAI,CAAC,MAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IACjE,uBAAuB;IACvB,MAAM,QAAQ,GAA6C;QACzD,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,IAAI,CAAC;QACZ,CAAC,IAAI,EAAE,IAAI,CAAC;QACZ,CAAC,IAAI,EAAE,IAAI,CAAC;QACZ,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,IAAI,EAAE,GAAG,CAAC;QACX,CAAC,MAAM,EAAE,GAAG,CAAC;QACb,CAAC,OAAO,EAAE,GAAG,CAAC;KACf,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,WAAW,MAAM,oBAAoB,EAAE,GAAG,EAAE;YACtD,MAAM,CAAC,SAAS,CACd,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAC9C,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,QAAQ,GAA6C;QACzD,CAAC,WAAW,EAAE,KAAK,CAAC;QACpB,CAAC,WAAW,EAAE,IAAI,CAAC;QACnB,CAAC,SAAS,EAAE,QAAQ,CAAC;QACrB,CAAC,SAAS,EAAE,oBAAoB,CAAC;QACjC,CAAC,YAAY,EAAE,KAAK,CAAC;QACrB,CAAC,aAAa,EAAE,QAAQ,CAAC;KAC1B,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;QACpC,IAAI,CAAC,GAAG,IAAI,MAAM,EAAE,GAAG,EAAE;YACvB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,SAAS,IAAI,YAAY,CAAC,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,wBAAwB,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC3B,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=corpus-loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corpus-loader.test.d.ts","sourceRoot":"","sources":["../../../../test/unit/scripts/corpus-loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,85 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import fs from 'node:fs';
4
+ import os from 'node:os';
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+ import { assertCorpusFrom, loadCorpus, corpusLoaderPath, CORPUS_PATH_ENV } from '../../../scripts/corpus-loader.js';
8
+ // ★issue #194:corpus-regression 工作流设置 ASTER_LANG_TEST_PATH,golden.ts 却静态
9
+ // import npm 包,变量零读取。这里守住两件事:变量生效、生效与否可被察觉。
10
+ describe('corpus-loader:ASTER_LANG_TEST_PATH 必须生效且可验证', () => {
11
+ const sample = (absPath) => ({ absPath, meta: { tier: 1 } });
12
+ it('样本全部位于 checkout 之下 → 通过', () => {
13
+ const root = path.join(os.tmpdir(), 'aster-lang-test');
14
+ const mod = { listSamples: () => [sample(path.join(root, 'corpus', 'a.aster'))] };
15
+ assert.doesNotThrow(() => assertCorpusFrom(mod, root));
16
+ });
17
+ it('★样本来自别处(例如 node_modules 里的 npm 版本)→ 失败并指出来源', () => {
18
+ const root = path.join(os.tmpdir(), 'aster-lang-test');
19
+ const stray = path.join(os.tmpdir(), 'node_modules', 'pkg', 'corpus', 'a.aster');
20
+ const mod = { listSamples: () => [sample(stray)] };
21
+ assert.throws(() => assertCorpusFrom(mod, root), new RegExp(`未生效.*${stray.replace(/[/\\]/g, '.')}`));
22
+ });
23
+ it('同名前缀目录不算「位于其下」', () => {
24
+ const root = path.join(os.tmpdir(), 'aster-lang-test');
25
+ const mod = { listSamples: () => [sample(`${root}-other${path.sep}a.aster`)] };
26
+ assert.throws(() => assertCorpusFrom(mod, root), /未生效/);
27
+ });
28
+ it('空样本集也视为未生效', () => {
29
+ assert.throws(() => assertCorpusFrom({ listSamples: () => [] }, '/x'), /未生效/);
30
+ });
31
+ // ★issue #203:ESM loader 对模块路径 realpath,样本 absPath 是真实路径;root 若只
32
+ // path.resolve,经过任意一层符号链接就被误判「未生效」。两侧都按真实路径比较。
33
+ it('★root 经符号链接、样本为真实路径(或反之)→ 通过', () => {
34
+ const base = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-link-'));
35
+ try {
36
+ const real = path.join(base, 'real');
37
+ fs.mkdirSync(path.join(real, 'corpus'), { recursive: true });
38
+ const file = path.join(real, 'corpus', 'a.aster');
39
+ fs.writeFileSync(file, '');
40
+ const link = path.join(base, 'link');
41
+ fs.symlinkSync(real, link);
42
+ const viaReal = { listSamples: () => [sample(fs.realpathSync.native(file))] };
43
+ assert.doesNotThrow(() => assertCorpusFrom(viaReal, link));
44
+ const viaLink = { listSamples: () => [sample(path.join(link, 'corpus', 'a.aster'))] };
45
+ assert.doesNotThrow(() => assertCorpusFrom(viaLink, real));
46
+ }
47
+ finally {
48
+ fs.rmSync(base, { recursive: true, force: true });
49
+ }
50
+ });
51
+ it('★loadCorpus:变量指向符号链接的 checkout → 生效,样本来自该 checkout', async () => {
52
+ // 按 issue 复现步骤:把 npm 包的 loader 与语料复制成 checkout 布局,再经软链加载。
53
+ const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.resolve('@aster-cloud/aster-lang-test'))), '..');
54
+ const base = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-checkout-'));
55
+ try {
56
+ const real = path.join(base, 'real');
57
+ fs.cpSync(path.join(pkgRoot, 'corpus'), path.join(real, 'corpus'), { recursive: true });
58
+ fs.mkdirSync(path.dirname(corpusLoaderPath(real)), { recursive: true });
59
+ fs.copyFileSync(path.join(pkgRoot, 'dist', 'loader.js'), corpusLoaderPath(real));
60
+ const link = path.join(base, 'link');
61
+ fs.symlinkSync(real, link);
62
+ const mod = await loadCorpus({ [CORPUS_PATH_ENV]: link });
63
+ const samples = mod.listSamples();
64
+ assert.ok(samples.length > 0);
65
+ assert.ok(samples[0].absPath.startsWith(fs.realpathSync.native(real) + path.sep));
66
+ }
67
+ finally {
68
+ fs.rmSync(base, { recursive: true, force: true });
69
+ }
70
+ });
71
+ it('未设置变量 → 回退到 npm 依赖', async () => {
72
+ const mod = await loadCorpus({});
73
+ assert.equal(typeof mod.listSamples, 'function');
74
+ });
75
+ it('★变量指向没有 loader 产物的目录 → 失败并提示构建', async () => {
76
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'aster-corpus-missing-'));
77
+ try {
78
+ await assert.rejects(loadCorpus({ [CORPUS_PATH_ENV]: dir }), /pnpm run build/);
79
+ }
80
+ finally {
81
+ fs.rmSync(dir, { recursive: true, force: true });
82
+ }
83
+ });
84
+ });
85
+ //# sourceMappingURL=corpus-loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"corpus-loader.test.js","sourceRoot":"","sources":["../../../../test/unit/scripts/corpus-loader.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aster-cloud/aster-lang-ts",
3
- "version": "1.0.30",
3
+ "version": "1.0.32",
4
4
  "description": "Aster CNL (Controlled Natural Language) TypeScript Compiler - Lexer, Parser, AST, Core IR, Type Checker",
5
5
  "type": "module",
6
6
  "main": "./dist/src/index.js",