@aster-cloud/aster-lang-ts 1.0.37 → 1.2.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 (346) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +13 -7
  3. package/dist/scripts/aster.js +10 -5
  4. package/dist/scripts/aster.js.map +1 -1
  5. package/dist/scripts/core-ir-json.js +8 -3
  6. package/dist/scripts/core-ir-json.js.map +1 -1
  7. package/dist/scripts/emit-classfiles.js +3 -2
  8. package/dist/scripts/emit-classfiles.js.map +1 -1
  9. package/dist/scripts/emit-core.js +8 -5
  10. package/dist/scripts/emit-core.js.map +1 -1
  11. package/dist/scripts/generate-casefold.d.ts +2 -0
  12. package/dist/scripts/generate-casefold.d.ts.map +1 -0
  13. package/dist/scripts/generate-casefold.js +34 -0
  14. package/dist/scripts/generate-casefold.js.map +1 -0
  15. package/dist/scripts/generate-diagnostic-overlays.d.ts +29 -0
  16. package/dist/scripts/generate-diagnostic-overlays.d.ts.map +1 -0
  17. package/dist/scripts/generate-diagnostic-overlays.js +90 -0
  18. package/dist/scripts/generate-diagnostic-overlays.js.map +1 -0
  19. package/dist/scripts/golden.js +45 -20
  20. package/dist/scripts/golden.js.map +1 -1
  21. package/dist/scripts/perf-benchmark.js +1 -0
  22. package/dist/scripts/perf-benchmark.js.map +1 -1
  23. package/dist/scripts/profile-medium-project.js +1 -1
  24. package/dist/scripts/profile-medium-project.js.map +1 -1
  25. package/dist/scripts/repl.js +3 -8
  26. package/dist/scripts/repl.js.map +1 -1
  27. package/dist/scripts/typecheck-cli.js +10 -9
  28. package/dist/scripts/typecheck-cli.js.map +1 -1
  29. package/dist/scripts/update-eff-violation-expected.js +6 -6
  30. package/dist/scripts/update-eff-violation-expected.js.map +1 -1
  31. package/dist/scripts/verify-capabilities.js +3 -6
  32. package/dist/scripts/verify-capabilities.js.map +1 -1
  33. package/dist/scripts/verify-lexicon-sync.js +26 -0
  34. package/dist/scripts/verify-lexicon-sync.js.map +1 -1
  35. package/dist/src/ai/validator.d.ts +1 -1
  36. package/dist/src/ai/validator.d.ts.map +1 -1
  37. package/dist/src/ai/validator.js +12 -12
  38. package/dist/src/ai/validator.js.map +1 -1
  39. package/dist/src/ast/ast.d.ts +2 -0
  40. package/dist/src/ast/ast.d.ts.map +1 -1
  41. package/dist/src/ast/ast.js +6 -0
  42. package/dist/src/ast/ast.js.map +1 -1
  43. package/dist/src/ast/type-nodes.d.ts +25 -0
  44. package/dist/src/ast/type-nodes.d.ts.map +1 -0
  45. package/dist/src/ast/type-nodes.js +56 -0
  46. package/dist/src/ast/type-nodes.js.map +1 -0
  47. package/dist/src/browser.d.ts +27 -10
  48. package/dist/src/browser.d.ts.map +1 -1
  49. package/dist/src/browser.js +44 -55
  50. package/dist/src/browser.js.map +1 -1
  51. package/dist/src/cli/policy-converter.js +5 -9
  52. package/dist/src/cli/policy-converter.js.map +1 -1
  53. package/dist/src/cnl-printer.d.ts.map +1 -1
  54. package/dist/src/cnl-printer.js +10 -9
  55. package/dist/src/cnl-printer.js.map +1 -1
  56. package/dist/src/compile-pipeline.d.ts +48 -0
  57. package/dist/src/compile-pipeline.d.ts.map +1 -0
  58. package/dist/src/compile-pipeline.js +89 -0
  59. package/dist/src/compile-pipeline.js.map +1 -0
  60. package/dist/src/config/lexicons/diagnostic-messages.d.ts +7 -5
  61. package/dist/src/config/lexicons/diagnostic-messages.d.ts.map +1 -1
  62. package/dist/src/config/lexicons/diagnostic-messages.js +17 -105
  63. package/dist/src/config/lexicons/diagnostic-messages.js.map +1 -1
  64. package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts +9 -0
  65. package/dist/src/config/lexicons/diagnostic-overlays.generated.d.ts.map +1 -0
  66. package/dist/src/config/lexicons/diagnostic-overlays.generated.js +615 -0
  67. package/dist/src/config/lexicons/diagnostic-overlays.generated.js.map +1 -0
  68. package/dist/src/config/lexicons/identifiers/casefold-table.generated.d.ts +9 -0
  69. package/dist/src/config/lexicons/identifiers/casefold-table.generated.d.ts.map +1 -0
  70. package/dist/src/config/lexicons/identifiers/casefold-table.generated.js +1467 -0
  71. package/dist/src/config/lexicons/identifiers/casefold-table.generated.js.map +1 -0
  72. package/dist/src/config/lexicons/identifiers/casefold.d.ts +7 -0
  73. package/dist/src/config/lexicons/identifiers/casefold.d.ts.map +1 -0
  74. package/dist/src/config/lexicons/identifiers/casefold.js +37 -0
  75. package/dist/src/config/lexicons/identifiers/casefold.js.map +1 -0
  76. package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.d.ts.map +1 -1
  77. package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.js +8 -0
  78. package/dist/src/config/lexicons/identifiers/domains/finance.loan.de-DE.js.map +1 -1
  79. package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.d.ts.map +1 -1
  80. package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.js +8 -0
  81. package/dist/src/config/lexicons/identifiers/domains/finance.loan.en-US.js.map +1 -1
  82. package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.d.ts.map +1 -1
  83. package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.js +8 -0
  84. package/dist/src/config/lexicons/identifiers/domains/finance.loan.zh-CN.js.map +1 -1
  85. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.d.ts.map +1 -1
  86. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.js +6 -0
  87. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.de-DE.js.map +1 -1
  88. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.d.ts.map +1 -1
  89. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.js +6 -0
  90. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.en-US.js.map +1 -1
  91. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.d.ts.map +1 -1
  92. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.js +6 -0
  93. package/dist/src/config/lexicons/identifiers/domains/insurance.auto.zh-CN.js.map +1 -1
  94. package/dist/src/config/lexicons/identifiers/index.d.ts +7 -9
  95. package/dist/src/config/lexicons/identifiers/index.d.ts.map +1 -1
  96. package/dist/src/config/lexicons/identifiers/index.js +8 -9
  97. package/dist/src/config/lexicons/identifiers/index.js.map +1 -1
  98. package/dist/src/config/lexicons/identifiers/registry.d.ts +11 -5
  99. package/dist/src/config/lexicons/identifiers/registry.d.ts.map +1 -1
  100. package/dist/src/config/lexicons/identifiers/registry.js +20 -14
  101. package/dist/src/config/lexicons/identifiers/registry.js.map +1 -1
  102. package/dist/src/config/lexicons/identifiers/scopes.d.ts +52 -0
  103. package/dist/src/config/lexicons/identifiers/scopes.d.ts.map +1 -0
  104. package/dist/src/config/lexicons/identifiers/scopes.js +166 -0
  105. package/dist/src/config/lexicons/identifiers/scopes.js.map +1 -0
  106. package/dist/src/config/lexicons/identifiers/types.d.ts +15 -29
  107. package/dist/src/config/lexicons/identifiers/types.d.ts.map +1 -1
  108. package/dist/src/config/lexicons/identifiers/types.js +91 -101
  109. package/dist/src/config/lexicons/identifiers/types.js.map +1 -1
  110. package/dist/src/config/lexicons/lsp-ui-texts.d.ts +7 -0
  111. package/dist/src/config/lexicons/lsp-ui-texts.d.ts.map +1 -1
  112. package/dist/src/config/lexicons/lsp-ui-texts.js +12 -0
  113. package/dist/src/config/lexicons/lsp-ui-texts.js.map +1 -1
  114. package/dist/src/config/semantic.d.ts +5 -0
  115. package/dist/src/config/semantic.d.ts.map +1 -1
  116. package/dist/src/config/semantic.js +12 -0
  117. package/dist/src/config/semantic.js.map +1 -1
  118. package/dist/src/core/core_ir.d.ts +2 -0
  119. package/dist/src/core/core_ir.d.ts.map +1 -1
  120. package/dist/src/core/core_ir.js +6 -0
  121. package/dist/src/core/core_ir.js.map +1 -1
  122. package/dist/src/core/inferred_fields.d.ts +10 -0
  123. package/dist/src/core/inferred_fields.d.ts.map +1 -1
  124. package/dist/src/core/inferred_fields.js +9 -0
  125. package/dist/src/core/inferred_fields.js.map +1 -1
  126. package/dist/src/core/interpreter.d.ts.map +1 -1
  127. package/dist/src/core/interpreter.js +12 -10
  128. package/dist/src/core/interpreter.js.map +1 -1
  129. package/dist/src/core/resolution-mark.d.ts +28 -0
  130. package/dist/src/core/resolution-mark.d.ts.map +1 -0
  131. package/dist/src/core/resolution-mark.js +19 -0
  132. package/dist/src/core/resolution-mark.js.map +1 -0
  133. package/dist/src/core/resolve-typed-references.d.ts +36 -0
  134. package/dist/src/core/resolve-typed-references.d.ts.map +1 -0
  135. package/dist/src/core/resolve-typed-references.js +703 -0
  136. package/dist/src/core/resolve-typed-references.js.map +1 -0
  137. package/dist/src/diagnostics/error_codes.d.ts +11 -1
  138. package/dist/src/diagnostics/error_codes.d.ts.map +1 -1
  139. package/dist/src/diagnostics/error_codes.js +80 -0
  140. package/dist/src/diagnostics/error_codes.js.map +1 -1
  141. package/dist/src/frontend/canonicalizer.d.ts +8 -13
  142. package/dist/src/frontend/canonicalizer.d.ts.map +1 -1
  143. package/dist/src/frontend/canonicalizer.js +19 -48
  144. package/dist/src/frontend/canonicalizer.js.map +1 -1
  145. package/dist/src/frontend/resolution-choice.d.ts +34 -0
  146. package/dist/src/frontend/resolution-choice.d.ts.map +1 -0
  147. package/dist/src/frontend/resolution-choice.js +69 -0
  148. package/dist/src/frontend/resolution-choice.js.map +1 -0
  149. package/dist/src/frontend/resolution-context.d.ts +28 -0
  150. package/dist/src/frontend/resolution-context.d.ts.map +1 -0
  151. package/dist/src/frontend/resolution-context.js +7 -0
  152. package/dist/src/frontend/resolution-context.js.map +1 -0
  153. package/dist/src/frontend/resolve-declarations.d.ts +13 -0
  154. package/dist/src/frontend/resolve-declarations.d.ts.map +1 -0
  155. package/dist/src/frontend/resolve-declarations.js +595 -0
  156. package/dist/src/frontend/resolve-declarations.js.map +1 -0
  157. package/dist/src/frontend/resolve-policy-types.d.ts +54 -0
  158. package/dist/src/frontend/resolve-policy-types.d.ts.map +1 -0
  159. package/dist/src/frontend/resolve-policy-types.js +71 -0
  160. package/dist/src/frontend/resolve-policy-types.js.map +1 -0
  161. package/dist/src/index.d.ts +14 -7
  162. package/dist/src/index.d.ts.map +1 -1
  163. package/dist/src/index.js +14 -7
  164. package/dist/src/index.js.map +1 -1
  165. package/dist/src/lower_to_core.d.ts +2 -16
  166. package/dist/src/lower_to_core.d.ts.map +1 -1
  167. package/dist/src/lower_to_core.js +105 -44
  168. package/dist/src/lower_to_core.js.map +1 -1
  169. package/dist/src/lsp/canonicalize-options.d.ts +8 -11
  170. package/dist/src/lsp/canonicalize-options.d.ts.map +1 -1
  171. package/dist/src/lsp/canonicalize-options.js +8 -8
  172. package/dist/src/lsp/canonicalize-options.js.map +1 -1
  173. package/dist/src/lsp/completion.d.ts +55 -5
  174. package/dist/src/lsp/completion.d.ts.map +1 -1
  175. package/dist/src/lsp/completion.js +149 -0
  176. package/dist/src/lsp/completion.js.map +1 -1
  177. package/dist/src/lsp/diagnostics.d.ts +2 -0
  178. package/dist/src/lsp/diagnostics.d.ts.map +1 -1
  179. package/dist/src/lsp/diagnostics.js +84 -73
  180. package/dist/src/lsp/diagnostics.js.map +1 -1
  181. package/dist/src/lsp/navigation/definition.d.ts +2 -1
  182. package/dist/src/lsp/navigation/definition.d.ts.map +1 -1
  183. package/dist/src/lsp/navigation/definition.js +35 -1
  184. package/dist/src/lsp/navigation/definition.js.map +1 -1
  185. package/dist/src/lsp/navigation/hover.d.ts +12 -5
  186. package/dist/src/lsp/navigation/hover.d.ts.map +1 -1
  187. package/dist/src/lsp/navigation/hover.js +136 -90
  188. package/dist/src/lsp/navigation/hover.js.map +1 -1
  189. package/dist/src/lsp/parse-document.d.ts +4 -1
  190. package/dist/src/lsp/parse-document.d.ts.map +1 -1
  191. package/dist/src/lsp/parse-document.js +20 -17
  192. package/dist/src/lsp/parse-document.js.map +1 -1
  193. package/dist/src/lsp/resolution.d.ts +40 -0
  194. package/dist/src/lsp/resolution.d.ts.map +1 -0
  195. package/dist/src/lsp/resolution.js +179 -0
  196. package/dist/src/lsp/resolution.js.map +1 -0
  197. package/dist/src/lsp/server.js +3 -1
  198. package/dist/src/lsp/server.js.map +1 -1
  199. package/dist/src/lsp/source-positions.d.ts +2 -8
  200. package/dist/src/lsp/source-positions.d.ts.map +1 -1
  201. package/dist/src/lsp/source-positions.js +4 -16
  202. package/dist/src/lsp/source-positions.js.map +1 -1
  203. package/dist/src/mapping/pipeline.js +3 -2
  204. package/dist/src/mapping/pipeline.js.map +1 -1
  205. package/dist/src/mapping/review-queue.d.ts.map +1 -1
  206. package/dist/src/mapping/review-queue.js +3 -2
  207. package/dist/src/mapping/review-queue.js.map +1 -1
  208. package/dist/src/parser/context.d.ts +3 -1
  209. package/dist/src/parser/context.d.ts.map +1 -1
  210. package/dist/src/parser/context.js +1 -0
  211. package/dist/src/parser/context.js.map +1 -1
  212. package/dist/src/parser/decl-parser.d.ts.map +1 -1
  213. package/dist/src/parser/decl-parser.js +7 -5
  214. package/dist/src/parser/decl-parser.js.map +1 -1
  215. package/dist/src/parser/expr-stmt-parser.d.ts.map +1 -1
  216. package/dist/src/parser/expr-stmt-parser.js +2 -16
  217. package/dist/src/parser/expr-stmt-parser.js.map +1 -1
  218. package/dist/src/parser/type-parser.d.ts.map +1 -1
  219. package/dist/src/parser/type-parser.js +42 -0
  220. package/dist/src/parser/type-parser.js.map +1 -1
  221. package/dist/src/parser.d.ts.map +1 -1
  222. package/dist/src/parser.js +6 -1
  223. package/dist/src/parser.js.map +1 -1
  224. package/dist/src/typecheck/diagnostics.d.ts +10 -0
  225. package/dist/src/typecheck/diagnostics.d.ts.map +1 -1
  226. package/dist/src/typecheck/diagnostics.js +27 -0
  227. package/dist/src/typecheck/diagnostics.js.map +1 -1
  228. package/dist/src/typecheck/expression.d.ts.map +1 -1
  229. package/dist/src/typecheck/expression.js +13 -0
  230. package/dist/src/typecheck/expression.js.map +1 -1
  231. package/dist/src/typecheck/generics.d.ts +5 -0
  232. package/dist/src/typecheck/generics.d.ts.map +1 -1
  233. package/dist/src/typecheck/generics.js +15 -8
  234. package/dist/src/typecheck/generics.js.map +1 -1
  235. package/dist/src/types.d.ts +59 -13
  236. package/dist/src/types.d.ts.map +1 -1
  237. package/dist/src/types.js.map +1 -1
  238. package/dist/src/version.d.ts +18 -0
  239. package/dist/src/version.d.ts.map +1 -0
  240. package/dist/src/version.js +18 -0
  241. package/dist/src/version.js.map +1 -0
  242. package/dist/test/integration/builtin-enum-vocabulary.test.d.ts +2 -0
  243. package/dist/test/integration/builtin-enum-vocabulary.test.d.ts.map +1 -0
  244. package/dist/test/integration/builtin-enum-vocabulary.test.js +51 -0
  245. package/dist/test/integration/builtin-enum-vocabulary.test.js.map +1 -0
  246. package/dist/test/integration/lsp/lsp-rename-safety.test.js +0 -13
  247. package/dist/test/integration/lsp/lsp-rename-safety.test.js.map +1 -1
  248. package/dist/test/integration/name-resolution-entrypoints.test.d.ts +2 -0
  249. package/dist/test/integration/name-resolution-entrypoints.test.d.ts.map +1 -0
  250. package/dist/test/integration/name-resolution-entrypoints.test.js +109 -0
  251. package/dist/test/integration/name-resolution-entrypoints.test.js.map +1 -0
  252. package/dist/test/integration/scripts/typecheck-cli-repl.test.d.ts +2 -0
  253. package/dist/test/integration/scripts/typecheck-cli-repl.test.d.ts.map +1 -0
  254. package/dist/test/integration/scripts/typecheck-cli-repl.test.js +133 -0
  255. package/dist/test/integration/scripts/typecheck-cli-repl.test.js.map +1 -0
  256. package/dist/test/integration/vocabulary-resolution.test.d.ts +2 -0
  257. package/dist/test/integration/vocabulary-resolution.test.d.ts.map +1 -0
  258. package/dist/test/integration/vocabulary-resolution.test.js +291 -0
  259. package/dist/test/integration/vocabulary-resolution.test.js.map +1 -0
  260. package/dist/test/property/property.test.js +2 -1
  261. package/dist/test/property/property.test.js.map +1 -1
  262. package/dist/test/unit/canonicalizer/canonicalizer.test.js +7 -79
  263. package/dist/test/unit/canonicalizer/canonicalizer.test.js.map +1 -1
  264. package/dist/test/unit/config/lexicons/identifiers/identifier-mapping.test.js +134 -31
  265. package/dist/test/unit/config/lexicons/identifiers/identifier-mapping.test.js.map +1 -1
  266. package/dist/test/unit/config/lexicons/identifiers/literal-macro.test.js +16 -18
  267. package/dist/test/unit/config/lexicons/identifiers/literal-macro.test.js.map +1 -1
  268. package/dist/test/unit/core/resolve-typed-references.test.d.ts +2 -0
  269. package/dist/test/unit/core/resolve-typed-references.test.d.ts.map +1 -0
  270. package/dist/test/unit/core/resolve-typed-references.test.js +600 -0
  271. package/dist/test/unit/core/resolve-typed-references.test.js.map +1 -0
  272. package/dist/test/unit/diagnostics/diagnostic-overlays.test.d.ts +2 -0
  273. package/dist/test/unit/diagnostics/diagnostic-overlays.test.d.ts.map +1 -0
  274. package/dist/test/unit/diagnostics/diagnostic-overlays.test.js +156 -0
  275. package/dist/test/unit/diagnostics/diagnostic-overlays.test.js.map +1 -0
  276. package/dist/test/unit/diagnostics/resolution-codes.test.d.ts +6 -0
  277. package/dist/test/unit/diagnostics/resolution-codes.test.d.ts.map +1 -0
  278. package/dist/test/unit/diagnostics/resolution-codes.test.js +96 -0
  279. package/dist/test/unit/diagnostics/resolution-codes.test.js.map +1 -0
  280. package/dist/test/unit/formatter-corpus-roundtrip.test.js +5 -0
  281. package/dist/test/unit/formatter-corpus-roundtrip.test.js.map +1 -1
  282. package/dist/test/unit/formatter-roundtrip.test.js +84 -0
  283. package/dist/test/unit/formatter-roundtrip.test.js.map +1 -1
  284. package/dist/test/unit/frontend/resolve-declarations.test.d.ts +2 -0
  285. package/dist/test/unit/frontend/resolve-declarations.test.d.ts.map +1 -0
  286. package/dist/test/unit/frontend/resolve-declarations.test.js +459 -0
  287. package/dist/test/unit/frontend/resolve-declarations.test.js.map +1 -0
  288. package/dist/test/unit/identifiers/casefold.test.d.ts +2 -0
  289. package/dist/test/unit/identifiers/casefold.test.d.ts.map +1 -0
  290. package/dist/test/unit/identifiers/casefold.test.js +77 -0
  291. package/dist/test/unit/identifiers/casefold.test.js.map +1 -0
  292. package/dist/test/unit/identifiers/scopes.test.d.ts +2 -0
  293. package/dist/test/unit/identifiers/scopes.test.d.ts.map +1 -0
  294. package/dist/test/unit/identifiers/scopes.test.js +109 -0
  295. package/dist/test/unit/identifiers/scopes.test.js.map +1 -0
  296. package/dist/test/unit/lambda-capture-parity.test.js +12 -5
  297. package/dist/test/unit/lambda-capture-parity.test.js.map +1 -1
  298. package/dist/test/unit/lsp/lsp-locale-fixes.test.js +10 -11
  299. package/dist/test/unit/lsp/lsp-locale-fixes.test.js.map +1 -1
  300. package/dist/test/unit/lsp/parse-document.test.js +42 -0
  301. package/dist/test/unit/lsp/parse-document.test.js.map +1 -1
  302. package/dist/test/unit/lsp/resolution-completion.test.d.ts +2 -0
  303. package/dist/test/unit/lsp/resolution-completion.test.d.ts.map +1 -0
  304. package/dist/test/unit/lsp/resolution-completion.test.js +132 -0
  305. package/dist/test/unit/lsp/resolution-completion.test.js.map +1 -0
  306. package/dist/test/unit/lsp/resolution-definition.test.d.ts +2 -0
  307. package/dist/test/unit/lsp/resolution-definition.test.d.ts.map +1 -0
  308. package/dist/test/unit/lsp/resolution-definition.test.js +75 -0
  309. package/dist/test/unit/lsp/resolution-definition.test.js.map +1 -0
  310. package/dist/test/unit/lsp/resolution-diagnostics.test.d.ts +2 -0
  311. package/dist/test/unit/lsp/resolution-diagnostics.test.d.ts.map +1 -0
  312. package/dist/test/unit/lsp/resolution-diagnostics.test.js +88 -0
  313. package/dist/test/unit/lsp/resolution-diagnostics.test.js.map +1 -0
  314. package/dist/test/unit/lsp/resolution-fixture.d.ts +32 -0
  315. package/dist/test/unit/lsp/resolution-fixture.d.ts.map +1 -0
  316. package/dist/test/unit/lsp/resolution-fixture.js +69 -0
  317. package/dist/test/unit/lsp/resolution-fixture.js.map +1 -0
  318. package/dist/test/unit/lsp/resolution-hover.test.d.ts +2 -0
  319. package/dist/test/unit/lsp/resolution-hover.test.d.ts.map +1 -0
  320. package/dist/test/unit/lsp/resolution-hover.test.js +107 -0
  321. package/dist/test/unit/lsp/resolution-hover.test.js.map +1 -0
  322. package/dist/test/unit/lsp/tenant-vocabulary.test.js +21 -47
  323. package/dist/test/unit/lsp/tenant-vocabulary.test.js.map +1 -1
  324. package/dist/test/unit/parser/func-type.test.d.ts +2 -0
  325. package/dist/test/unit/parser/func-type.test.d.ts.map +1 -0
  326. package/dist/test/unit/parser/func-type.test.js +161 -0
  327. package/dist/test/unit/parser/func-type.test.js.map +1 -0
  328. package/dist/test/unit/parser/parser.test.js +33 -0
  329. package/dist/test/unit/parser/parser.test.js.map +1 -1
  330. package/dist/test/unit/public-api-checked-entries.test.d.ts +2 -0
  331. package/dist/test/unit/public-api-checked-entries.test.d.ts.map +1 -0
  332. package/dist/test/unit/public-api-checked-entries.test.js +28 -0
  333. package/dist/test/unit/public-api-checked-entries.test.js.map +1 -0
  334. package/dist/test/unit/typecheck/qualified-enum-member.test.d.ts +2 -0
  335. package/dist/test/unit/typecheck/qualified-enum-member.test.d.ts.map +1 -0
  336. package/dist/test/unit/typecheck/qualified-enum-member.test.js +73 -0
  337. package/dist/test/unit/typecheck/qualified-enum-member.test.js.map +1 -0
  338. package/dist/test/unit/version.test.d.ts +9 -0
  339. package/dist/test/unit/version.test.d.ts.map +1 -0
  340. package/dist/test/unit/version.test.js +34 -0
  341. package/dist/test/unit/version.test.js.map +1 -0
  342. package/package.json +2 -1
  343. package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.d.ts +0 -47
  344. package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.d.ts.map +0 -1
  345. package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.js +0 -142
  346. package/dist/src/config/lexicons/identifiers/examples/canonicalizer-integration.js.map +0 -1
@@ -0,0 +1,54 @@
1
+ import type { DomainVocabulary } from '../config/lexicons/identifiers/types.js';
2
+ import type { Diagnostic } from '../diagnostics/diagnostics.js';
3
+ import type { Core, TypecheckDiagnostic } from '../types.js';
4
+ /** 规范类型引用(与 Core IR 的类型节点同形) */
5
+ export type TypeRef = Core.Type;
6
+ export interface PolicyTypes {
7
+ structs: Array<{
8
+ canonical: string;
9
+ written: string;
10
+ fields: Array<{
11
+ canonical: string;
12
+ written: string;
13
+ type: TypeRef;
14
+ }>;
15
+ }>;
16
+ enums: Array<{
17
+ canonical: string;
18
+ written: string;
19
+ members: Array<{
20
+ canonical: string;
21
+ written: string;
22
+ }>;
23
+ }>;
24
+ functions: Array<{
25
+ canonical: string;
26
+ written: string;
27
+ params: Array<{
28
+ name: string;
29
+ type: TypeRef;
30
+ }>;
31
+ returnType?: TypeRef;
32
+ }>;
33
+ }
34
+ /** 解析诊断(语法)与名称解析诊断(E8xx / W8xx) */
35
+ export type PolicyTypesDiagnostic = Diagnostic | TypecheckDiagnostic;
36
+ export interface ResolvePolicyTypesOptions {
37
+ /** 源码的 CNL 语言(lexicon id,如 de-DE) */
38
+ locale: string;
39
+ vocabulary?: DomainVocabulary;
40
+ /** 关键词别名(ADR 0022),按语义 token 种类并入 lexicon,只影响解析 */
41
+ aliasSet?: Record<string, string[]>;
42
+ }
43
+ export type ResolvePolicyTypesResult = {
44
+ ok: true;
45
+ types: PolicyTypes;
46
+ } | {
47
+ ok: false;
48
+ diagnostics: PolicyTypesDiagnostic[];
49
+ };
50
+ /**
51
+ * 解析策略源码中的类型声明。语法错误或任一 E8xx 时返回 ok:false 与诊断;W8xx 不影响结果。
52
+ */
53
+ export declare function resolvePolicyTypes(source: string, opts: ResolvePolicyTypesOptions): ResolvePolicyTypesResult;
54
+ //# sourceMappingURL=resolve-policy-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-policy-types.d.ts","sourceRoot":"","sources":["../../../src/frontend/resolve-policy-types.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAChF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAIhE,OAAO,KAAK,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE7D,gCAAgC;AAChC,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;AAEhC,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;KACtE,CAAC,CAAC;IACH,KAAK,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC;IAC7G,SAAS,EAAE,KAAK,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,OAAO,CAAA;SAAE,CAAC,CAAC;QAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;KACtB,CAAC,CAAC;CACJ;AAED,mCAAmC;AACnC,MAAM,MAAM,qBAAqB,GAAG,UAAU,GAAG,mBAAmB,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACxC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,MAAM,MAAM,wBAAwB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAChC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,WAAW,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAAC;AAyCxD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,wBAAwB,CAa5G"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * @module frontend/resolve-policy-types
3
+ *
4
+ * 为执行输入映射提取策略的已解析类型(ADR 0051 §8):只跑解析 + R1 + lower + R2,不做类型检查。
5
+ * 每个声明同时给出规范名与源码原写法,供调用方把用户按策略写法提交的输入映射到规范 IR。
6
+ */
7
+ import { LexiconRegistry, initializeAllBundledLexicons } from '../config/lexicons/index.js';
8
+ import { buildVocabularyScopes } from '../config/lexicons/identifiers/scopes.js';
9
+ import { DiagnosticError } from '../diagnostics/diagnostics.js';
10
+ import { hasErrors, parseSource, resolveAndLower } from '../compile-pipeline.js';
11
+ function lexiconFor(locale, aliasSet) {
12
+ initializeAllBundledLexicons();
13
+ const base = LexiconRegistry.get(locale);
14
+ if (!base)
15
+ throw new Error(`未注册的 locale:${locale}`);
16
+ if (!aliasSet || Object.keys(aliasSet).length === 0)
17
+ return base;
18
+ return { ...base, aliases: { ...base.aliases, ...aliasSet } };
19
+ }
20
+ /** 类型引用只保留结构,去掉源码位置(origin 中的写法与位置不属于类型身份)。 */
21
+ function typeRef(t) {
22
+ return JSON.parse(JSON.stringify(t, (k, v) => (k === 'origin' ? undefined : v)));
23
+ }
24
+ const writtenOf = (resolved, fallback) => resolved?.written ?? fallback;
25
+ function collect(ast, core) {
26
+ const types = { structs: [], enums: [], functions: [] };
27
+ // lower 与 R2 都逐个映射声明,AST 与 Core 的声明下标一一对应
28
+ core.decls.forEach((d, i) => {
29
+ const src = ast.decls[i];
30
+ if (d.kind === 'Data' && src.kind === 'Data') {
31
+ const fields = d.fields.map((f, j) => ({
32
+ canonical: f.name,
33
+ written: writtenOf(src.fields[j]?.resolved, f.name),
34
+ type: typeRef(f.type),
35
+ }));
36
+ types.structs.push({ canonical: d.name, written: writtenOf(src.resolved, d.name), fields });
37
+ }
38
+ else if (d.kind === 'Enum' && src.kind === 'Enum') {
39
+ const members = d.variants.map((v, j) => ({ canonical: v, written: writtenOf(src.resolvedVariants?.[j], v) }));
40
+ types.enums.push({ canonical: d.name, written: writtenOf(src.resolved, d.name), members });
41
+ }
42
+ else if (d.kind === 'Func' && src.kind === 'Func') {
43
+ const params = d.params.map((p) => ({ name: p.name, type: typeRef(p.type) }));
44
+ const returnType = d.retTypeInferred ? {} : { returnType: typeRef(d.ret) };
45
+ types.functions.push({ canonical: d.name, written: writtenOf(src.resolved, d.name), params, ...returnType });
46
+ }
47
+ });
48
+ return types;
49
+ }
50
+ /**
51
+ * 解析策略源码中的类型声明。语法错误或任一 E8xx 时返回 ok:false 与诊断;W8xx 不影响结果。
52
+ */
53
+ export function resolvePolicyTypes(source, opts) {
54
+ const lexicon = lexiconFor(opts.locale, opts.aliasSet);
55
+ const scopes = opts.vocabulary ? buildVocabularyScopes(opts.vocabulary) : undefined;
56
+ try {
57
+ const parsed = parseSource(source, lexicon, scopes);
58
+ if (hasErrors(parsed.diagnostics))
59
+ return { ok: false, diagnostics: [...parsed.diagnostics] };
60
+ const resolved = resolveAndLower(parsed.ast, scopes);
61
+ if (hasErrors(resolved.diagnostics))
62
+ return { ok: false, diagnostics: [...resolved.diagnostics] };
63
+ return { ok: true, types: collect(resolved.ast, resolved.core) };
64
+ }
65
+ catch (err) {
66
+ if (err instanceof DiagnosticError)
67
+ return { ok: false, diagnostics: [err.diagnostic] };
68
+ throw err;
69
+ }
70
+ }
71
+ //# sourceMappingURL=resolve-policy-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-policy-types.js","sourceRoot":"","sources":["../../../src/frontend/resolve-policy-types.ts"],"names":[],"mappings":"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"}
@@ -8,26 +8,32 @@
8
8
  *
9
9
  * **编译管道**:
10
10
  * ```
11
- * CNL 源代码 → canonicalize → lex → parse → AST → lowerModule → Core IR → typecheck → JVM
11
+ * CNL 源代码 → canonicalize → lex → parse → AST → R1 名称解析 → lowerModule → R2 名称解析 → Core IR → typecheck → JVM
12
12
  * ```
13
13
  *
14
14
  * @example 基础用法
15
15
  * ```typescript
16
- * import { canonicalize, lex, parse, lowerModule } from '@aster-cloud/aster-lang-ts';
16
+ * import { parseSource, resolveAndLowerChecked } from '@aster-cloud/aster-lang-ts';
17
17
  *
18
18
  * const src = `Module app. Rule id, produce Int: Return 1.`;
19
- * const canonical = canonicalize(src); // 规范化源代码
20
- * const tokens = lex(canonical); // 词法分析
21
- * const ast = parse(tokens); // 语法分析
22
- * const core = lowerModule(ast); // 降级到 Core IR
19
+ * const { ast } = parseSource(src); // 规范化 + 词法 + 语法分析
20
+ * const { core } = resolveAndLowerChecked(ast); // R1 → lower → R2;任一 E8xx 抛出 NameResolutionError
23
21
  * console.log(core);
24
22
  * ```
23
+ *
24
+ * 公开 API 只提供带名称解析检查的出口(resolveAndLowerChecked / compile / resolvePolicyTypes):
25
+ * 未经 R1/R2 的原始 lower 与不抛错的 resolveAndLower 是内部实现,可能产出含本地化名的 Core。
25
26
  */
26
27
  export { canonicalize } from './frontend/canonicalizer.js';
27
28
  export { lex } from './frontend/lexer.js';
28
29
  export { parse, parseWithLexicon } from './parser.js';
29
30
  export type { ParseResult } from './parser.js';
30
- export { lowerModule } from './lower_to_core.js';
31
+ export { parseSource, resolveAndLowerChecked, NameResolutionError } from './compile-pipeline.js';
32
+ export type { ParsedSource, ResolvedCore } from './compile-pipeline.js';
33
+ export { buildVocabularyScopes, canonicalScopesJson, foldKey, VocabularyScopeError, } from './config/lexicons/identifiers/index.js';
34
+ export type { Candidate, DomainVocabulary, IdentifierMapping, VocabularyScopes, VocabularyScopeErrorCode, } from './config/lexicons/identifiers/index.js';
35
+ export { resolvePolicyTypes } from './frontend/resolve-policy-types.js';
36
+ export type { PolicyTypes, PolicyTypesDiagnostic, ResolvePolicyTypesOptions, ResolvePolicyTypesResult, TypeRef, } from './frontend/resolve-policy-types.js';
31
37
  export { createKeywordTranslator, buildKeywordTranslationIndex, buildFullTranslationIndex, translateTokens, translateTokensWithMarkers, translateToken, needsKeywordTranslation, } from './frontend/keyword-translator.js';
32
38
  export type { KeywordTranslationIndex, MarkerKeywordIndex, TranslationIndexResult, } from './frontend/keyword-translator.js';
33
39
  export { Core, Effect } from './core/core_ir.js';
@@ -41,6 +47,7 @@ export { CONTROLS_REGISTRY } from './governance/controls-registry.data.js';
41
47
  export type { ControlsRegistryData, LocalizedTitle } from './governance/controls-registry.data.js';
42
48
  export { generateFieldValue, generateInputValues, getFieldValueHint, } from './parser/input-generator.js';
43
49
  export type { TypeKind, FieldInfo, ParameterInfo, } from './parser/input-generator.js';
50
+ export { RESOLVER_VERSION, CASEFOLD_VERSION, CORE_IR_ABI } from './version.js';
44
51
  export type * from './types.js';
45
52
  export { runSemanticBridge } from './mapping/pipeline.js';
46
53
  export type { BridgeResult, VerifiedCandidate } from './mapping/pipeline.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,eAAe,EACf,0BAA0B,EAC1B,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EACV,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,kCAAkC,CAAC;AAG1C,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGpC,OAAO,EACL,eAAe,EACf,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC5E,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AACvF,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAGnG,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,QAAQ,EACR,SAAS,EACT,aAAa,GACd,MAAM,6BAA6B,CAAC;AAGrC,mBAAmB,YAAY,CAAC;AAMhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACrF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,mBAAmB,EACrE,cAAc,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACtG,YAAY,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -8,26 +8,31 @@
8
8
  *
9
9
  * **编译管道**:
10
10
  * ```
11
- * CNL 源代码 → canonicalize → lex → parse → AST → lowerModule → Core IR → typecheck → JVM
11
+ * CNL 源代码 → canonicalize → lex → parse → AST → R1 名称解析 → lowerModule → R2 名称解析 → Core IR → typecheck → JVM
12
12
  * ```
13
13
  *
14
14
  * @example 基础用法
15
15
  * ```typescript
16
- * import { canonicalize, lex, parse, lowerModule } from '@aster-cloud/aster-lang-ts';
16
+ * import { parseSource, resolveAndLowerChecked } from '@aster-cloud/aster-lang-ts';
17
17
  *
18
18
  * const src = `Module app. Rule id, produce Int: Return 1.`;
19
- * const canonical = canonicalize(src); // 规范化源代码
20
- * const tokens = lex(canonical); // 词法分析
21
- * const ast = parse(tokens); // 语法分析
22
- * const core = lowerModule(ast); // 降级到 Core IR
19
+ * const { ast } = parseSource(src); // 规范化 + 词法 + 语法分析
20
+ * const { core } = resolveAndLowerChecked(ast); // R1 → lower → R2;任一 E8xx 抛出 NameResolutionError
23
21
  * console.log(core);
24
22
  * ```
23
+ *
24
+ * 公开 API 只提供带名称解析检查的出口(resolveAndLowerChecked / compile / resolvePolicyTypes):
25
+ * 未经 R1/R2 的原始 lower 与不抛错的 resolveAndLower 是内部实现,可能产出含本地化名的 Core。
25
26
  */
26
27
  // 编译器管道函数
27
28
  export { canonicalize } from './frontend/canonicalizer.js';
28
29
  export { lex } from './frontend/lexer.js';
29
30
  export { parse, parseWithLexicon } from './parser.js';
30
- export { lowerModule } from './lower_to_core.js';
31
+ // 名称解析接入后的前端(ADR 0051):parse → R1 → lower → R2;只导出带检查的出口
32
+ export { parseSource, resolveAndLowerChecked, NameResolutionError } from './compile-pipeline.js';
33
+ // 领域词汇按位置解析(ADR 0051)
34
+ export { buildVocabularyScopes, canonicalScopesJson, foldKey, VocabularyScopeError, } from './config/lexicons/identifiers/index.js';
35
+ export { resolvePolicyTypes } from './frontend/resolve-policy-types.js';
31
36
  // 关键词翻译(多语言 CNL 支持)
32
37
  export { createKeywordTranslator, buildKeywordTranslationIndex, buildFullTranslationIndex, translateTokens, translateTokensWithMarkers, translateToken, needsKeywordTranslation, } from './frontend/keyword-translator.js';
33
38
  // 核心类型和枚举
@@ -40,6 +45,8 @@ export { controlRegistryFrom, defaultControlRegistry } from './governance/contro
40
45
  export { CONTROLS_REGISTRY } from './governance/controls-registry.data.js';
41
46
  // 输入值生成器(用于策略执行时自动生成示例输入)
42
47
  export { generateFieldValue, generateInputValues, getFieldValueHint, } from './parser/input-generator.js';
48
+ // 工具链分量版本常量(ADR 0051 §7)
49
+ export { RESOLVER_VERSION, CASEFOLD_VERSION, CORE_IR_ABI } from './version.js';
43
50
  // ── ADR 0037 可验证语义桥 ────────────────────────────────────────────
44
51
  // ★接线后才导出:此前六个模块全是死代码(生产调用数 0、不在导出面内)。
45
52
  // `runSemanticBridge` 是唯一入口,内部串起
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,oBAAoB;AACpB,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,eAAe,EACf,0BAA0B,EAC1B,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAO1C,UAAU;AACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO;AACP,OAAO,EACL,eAAe,EACf,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAG3E,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAUrC,kEAAkE;AAClE,uCAAuC;AACvC,mCAAmC;AACnC,4DAA4D;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,UAAU;AACV,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGtD,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAGjG,sBAAsB;AACtB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,OAAO,EACP,oBAAoB,GACrB,MAAM,wCAAwC,CAAC;AAQhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AASxE,oBAAoB;AACpB,OAAO,EACL,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,eAAe,EACf,0BAA0B,EAC1B,cAAc,EACd,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAO1C,UAAU;AACV,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEpC,OAAO;AACP,OAAO,EACL,eAAe,EACf,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAEvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAG3E,0BAA0B;AAC1B,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAOrC,yBAAyB;AACzB,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAK/E,kEAAkE;AAClE,uCAAuC;AACvC,mCAAmC;AACnC,4DAA4D;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC"}
@@ -32,22 +32,8 @@ import type { Module } from './types.js';
32
32
  * @param ast - AST Module 节点(通过 parser.parse 生成)
33
33
  * @returns Core IR Module 节点,包含所有声明的规范化表示
34
34
  *
35
- * @example
36
- * ```typescript
37
- * import { canonicalize, lex, parse, lowerModule } from '@aster-cloud/aster-lang-ts';
38
- *
39
- * const src = `Module app.
40
- * Rule greet, produce Text:
41
- * Return "Hello".
42
- * `;
43
- *
44
- * const ast = parse(lex(canonicalize(src)));
45
- * const core = lowerModule(ast);
46
- *
47
- * console.log(core.kind); // "Module"
48
- * console.log(core.name); // "app"
49
- * // Core IR 是更简洁的表示,适合类型检查和代码生成
50
- * ```
35
+ * @internal 不从包入口导出:未经 R1 的 AST 降级后名字保持原写法(可能是本地化名)。
36
+ * 外部调用方使用 resolveAndLowerChecked(compile-pipeline)或 browser `compile`。
51
37
  */
52
38
  export declare function lowerModule(ast: Module): import('./types.js').Core.Module;
53
39
  //# sourceMappingURL=lower_to_core.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lower_to_core.d.ts","sourceRoot":"","sources":["../../src/lower_to_core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAQH,OAAO,KAAK,EACV,MAAM,EAUP,MAAM,YAAY,CAAC;AAkMpB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,IAAI,CAAC,MAAM,CAIzE"}
1
+ {"version":3,"file":"lower_to_core.d.ts","sourceRoot":"","sources":["../../src/lower_to_core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAUH,OAAO,KAAK,EACV,MAAM,EAYP,MAAM,YAAY,CAAC;AAsNpB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,YAAY,EAAE,IAAI,CAAC,MAAM,CAIzE"}
@@ -17,7 +17,9 @@
17
17
  * - 简化的效果标注
18
18
  */
19
19
  import { Core } from './core/core_ir.js';
20
- import { markFieldTypeInferred } from './core/inferred_fields.js';
20
+ import { markFieldTypeInferred, markLambdaParamTypeInferred } from './core/inferred_fields.js';
21
+ import { markForResolution, withResolvedOrigin } from './core/resolution-mark.js';
22
+ import { KEYWORD_CTORS } from './frontend/resolution-choice.js';
21
23
  import { parseEffect, getAllEffects, inferCapabilityFromName } from './config/semantic.js';
22
24
  import { Diagnostics } from './diagnostics/diagnostics.js';
23
25
  import { DefaultAstVisitor } from './ast/ast_visitor.js';
@@ -49,6 +51,25 @@ function withOrigin(coreNode, astNode) {
49
51
  }
50
52
  return coreNode;
51
53
  }
54
+ /**
55
+ * 名称解析(ADR 0051):有 R1 结果时取规范名,否则保留原写法。
56
+ */
57
+ function canonicalOf(name, resolved) {
58
+ return resolved?.canonical ?? name;
59
+ }
60
+ /**
61
+ * 在已附加的 origin 上记录 R1 的原写法与角色(仅 written !== canonical 时)。
62
+ * 无 R1 结果或节点无 origin 时原样返回,保证未解析的 AST 降级结果不变。
63
+ */
64
+ function withResolution(coreNode, resolved) {
65
+ if (!resolved)
66
+ return coreNode;
67
+ const origin = withResolvedOrigin(coreNode.origin, resolved.written, resolved.canonical, resolved.role);
68
+ if (origin && origin !== coreNode.origin) {
69
+ coreNode.origin = origin;
70
+ }
71
+ return coreNode;
72
+ }
52
73
  /**
53
74
  * 将效果能力(effectCaps)从 AST Func 节点传递到 Core IR Func 节点。
54
75
  *
@@ -181,22 +202,8 @@ function lowerConstraints(constraints) {
181
202
  * @param ast - AST Module 节点(通过 parser.parse 生成)
182
203
  * @returns Core IR Module 节点,包含所有声明的规范化表示
183
204
  *
184
- * @example
185
- * ```typescript
186
- * import { canonicalize, lex, parse, lowerModule } from '@aster-cloud/aster-lang-ts';
187
- *
188
- * const src = `Module app.
189
- * Rule greet, produce Text:
190
- * Return "Hello".
191
- * `;
192
- *
193
- * const ast = parse(lex(canonicalize(src)));
194
- * const core = lowerModule(ast);
195
- *
196
- * console.log(core.kind); // "Module"
197
- * console.log(core.name); // "app"
198
- * // Core IR 是更简洁的表示,适合类型检查和代码生成
199
- * ```
205
+ * @internal 不从包入口导出:未经 R1 的 AST 降级后名字保持原写法(可能是本地化名)。
206
+ * 外部调用方使用 resolveAndLowerChecked(compile-pipeline)或 browser `compile`。
200
207
  */
201
208
  export function lowerModule(ast) {
202
209
  const decls = ast.decls.map(lowerDecl);
@@ -208,9 +215,9 @@ function lowerDecl(d) {
208
215
  case 'Import':
209
216
  return withOrigin(Core.Import(d.name, d.asName || null, d.version), d);
210
217
  case 'Data':
211
- return withOrigin(Core.Data(d.name, d.fields.map(f => {
218
+ return withResolution(withOrigin(Core.Data(canonicalOf(d.name, d.resolved), d.fields.map(f => {
212
219
  const field = {
213
- name: f.name,
220
+ name: canonicalOf(f.name, f.resolved),
214
221
  type: lowerType(f.type),
215
222
  constraints: lowerConstraints(f.constraints),
216
223
  };
@@ -218,9 +225,9 @@ function lowerDecl(d) {
218
225
  if (f.typeInferred)
219
226
  markFieldTypeInferred(field);
220
227
  return field;
221
- })), d);
228
+ })), d), d.resolved);
222
229
  case 'Enum':
223
- return withOrigin(Core.Enum(d.name, [...d.variants]), d);
230
+ return withResolution(withOrigin(Core.Enum(canonicalOf(d.name, d.resolved), d.variants.map((v, i) => canonicalOf(v, d.resolvedVariants?.[i]))), d), d.resolved);
224
231
  case 'Func':
225
232
  return lowerFunc(d);
226
233
  default: {
@@ -261,13 +268,13 @@ function lowerFunc(f) {
261
268
  throw new Error('unreachable'); // For TypeScript's control flow analysis
262
269
  }
263
270
  const body = f.body ? lowerBlock(f.body) : Core.Block([]);
264
- const out = Core.Func(f.name, f.typeParams ?? [], params, ret, effects, body, f.effectCaps, f.effectCapsExplicit, f.effectParams, declaredEffects, f.annotations ?? []);
271
+ const out = Core.Func(canonicalOf(f.name, f.resolved), f.typeParams ?? [], params, ret, effects, body, f.effectCaps, f.effectCapsExplicit, f.effectParams, declaredEffects, f.annotations ?? []);
265
272
  if (f.retTypeInferred) {
266
273
  out.retTypeInferred = true;
267
274
  }
268
275
  // 传递能力与 PII 元数据,并附带源位置信息
269
276
  const enriched = withFuncPiiMetadata(withEffectCaps(out, f));
270
- return withOrigin(enriched, f);
277
+ return withResolution(withOrigin(enriched, f), f.resolved);
271
278
  }
272
279
  function lowerBlock(b) {
273
280
  return withOrigin(Core.Block(b.statements.map(lowerStmt)), b);
@@ -276,8 +283,12 @@ function lowerStmt(s) {
276
283
  switch (s.kind) {
277
284
  case 'Let':
278
285
  return withOrigin(Core.Let(s.name, lowerExpr(s.expr)), s);
279
- case 'Set':
280
- return withOrigin(Core.Set(s.name, lowerExpr(s.expr)), s);
286
+ case 'Set': {
287
+ // Set 目标属于 FIELD_REF,R1 不解析:保留原写法交给 R2
288
+ const set = withOrigin(Core.Set(s.name, lowerExpr(s.expr)), s);
289
+ markForResolution(set, { written: s.name });
290
+ return set;
291
+ }
281
292
  case 'Return':
282
293
  return withOrigin(Core.Return(lowerExpr(s.expr)), s);
283
294
  case 'If':
@@ -441,7 +452,7 @@ function patternBindings(p) {
441
452
  * (`AstBuilderTest.testMethodCallTransformsReceiver`);此处职责是对齐,
442
453
  * 不是重新设计。若要改语义,应走 ADR。
443
454
  */
444
- function splitUfcsReceiver(target) {
455
+ function splitUfcsReceiver(target, unresolvedTarget) {
445
456
  if (!target || target.kind !== 'Name')
446
457
  return null;
447
458
  const full = target.name;
@@ -473,12 +484,17 @@ function splitUfcsReceiver(target) {
473
484
  receiver.origin = span;
474
485
  method.origin = span;
475
486
  }
487
+ // 拆分前的点分名由 R1 留给 R2 时,拆出的接收者与方法名同样交给 R2(均为裸名)
488
+ if (unresolvedTarget) {
489
+ markForResolution(receiver, { written: head, ufcs: true });
490
+ markForResolution(method, { written: full.slice(dot + 1), ufcs: true });
491
+ }
476
492
  return { receiver, method };
477
493
  }
478
494
  function lowerExpr(e) {
479
495
  switch (e.kind) {
480
496
  case 'Name':
481
- return withOrigin(Core.Name(e.name), e);
497
+ return lowerName(e);
482
498
  case 'Bool':
483
499
  return withOrigin(Core.Bool(e.value), e);
484
500
  case 'Int':
@@ -541,14 +557,14 @@ function lowerExpr(e) {
541
557
  // 而不是单方面改变语义。若要重新设计,应走 ADR。
542
558
  const target = lowerExpr(e.target);
543
559
  const loweredArgs = e.args.map(lowerExpr);
544
- const ufcs = splitUfcsReceiver(target);
560
+ const ufcs = splitUfcsReceiver(target, e.target.kind === 'Name' && !e.target.resolved);
545
561
  if (ufcs) {
546
562
  return withOrigin(Core.Call(ufcs.method, [ufcs.receiver, ...loweredArgs]), e);
547
563
  }
548
564
  return withOrigin(Core.Call(target, loweredArgs), e);
549
565
  }
550
566
  case 'Construct':
551
- return withOrigin(Core.Construct(e.typeName, e.fields.map(f => ({ name: f.name, expr: lowerExpr(f.expr) }))), e);
567
+ return withResolution(withOrigin(Core.Construct(canonicalOf(e.typeName, e.resolved), e.fields.map(f => ({ name: canonicalOf(f.name, f.resolved), expr: lowerExpr(f.expr) }))), e), e.resolved);
552
568
  case 'Ok':
553
569
  return withOrigin(Core.Ok(lowerExpr(e.expr)), e);
554
570
  case 'Err':
@@ -638,15 +654,23 @@ function lowerExpr(e) {
638
654
  }
639
655
  return;
640
656
  }
641
- if (ex.kind === 'Name' && !isBound(ex.name) && !ex.name.includes('.')) {
642
- names.add(ex.name);
657
+ // 以 R1 规范名记录捕获(未解析时即原写法;R2 再按其解析结果改写)
658
+ const captured = ex.kind === 'Name' ? canonicalOf(ex.name, ex.resolved) : '';
659
+ if (ex.kind === 'Name' && !isBound(captured) && !captured.includes('.')) {
660
+ names.add(captured);
643
661
  }
644
662
  super.visitExpression(ex, ctx);
645
663
  }
646
664
  }
647
665
  new CaptureVisitor().visitBlock(e.body, undefined);
648
666
  const captures = Array.from(names);
649
- const coreParams = e.params.map(p => ({ name: p.name, type: lowerType(p.type) }));
667
+ const coreParams = e.params.map(p => {
668
+ const param = { name: p.name, type: lowerType(p.type) };
669
+ // 解析器对未标注类型的 lambda 参数同样写入 typeInferred(Parameter),BaseParameter 未声明该字段
670
+ if (p.typeInferred)
671
+ markLambdaParamTypeInferred(param);
672
+ return param;
673
+ });
650
674
  const ret = lowerType(e.retType);
651
675
  const lambda = {
652
676
  kind: 'Lambda',
@@ -672,13 +696,14 @@ function lowerPattern(p) {
672
696
  return withOrigin(Core.PatNull(), p);
673
697
  case 'PatternInt':
674
698
  return withOrigin(Core.PatInt(p.value), p);
675
- case 'PatternCtor': {
676
- const ctor = p;
677
- const args = ctor.args ? ctor.args.map(pp => lowerPattern(pp)) : undefined;
678
- return withOrigin(Core.PatCtor(p.typeName, [...(p.names ?? [])], args), p);
699
+ case 'PatternCtor':
700
+ return lowerPatternCtor(p);
701
+ case 'PatternName': {
702
+ // 模式名可能是期望枚举下的成员(ADR 0051 裁决 R12),由 R2 判定
703
+ const pat = withOrigin(Core.PatName(p.name), p);
704
+ markForResolution(pat, { written: p.name });
705
+ return pat;
679
706
  }
680
- case 'PatternName':
681
- return withOrigin(Core.PatName(p.name), p);
682
707
  default: {
683
708
  const { span } = extractMetadata(p);
684
709
  const kind = p.kind;
@@ -687,6 +712,28 @@ function lowerPattern(p) {
687
712
  }
688
713
  }
689
714
  }
715
+ function lowerPatternCtor(p) {
716
+ const args = p.args ? p.args.map(pp => lowerPattern(pp)) : undefined;
717
+ const pat = withResolution(withOrigin(Core.PatCtor(canonicalOf(p.typeName, p.resolved), [...(p.names ?? [])], args), p), p.resolved);
718
+ // 主语类型在 R1 未知的用户构造器留给 R2;关键词构造器不查词汇
719
+ if (!p.resolved && !KEYWORD_CTORS.has(p.typeName))
720
+ markForResolution(pat, { written: p.typeName });
721
+ return pat;
722
+ }
723
+ /**
724
+ * 值位置名字:R1 已解析的取规范名。裸单段名一律交给 R2(期望类型为枚举时结果可能改变),
725
+ * 并记下 R1 的角色;R1 未决定的点分名(字段路径、限定调用)同样交给 R2。
726
+ */
727
+ function lowerName(e) {
728
+ const node = withResolution(withOrigin(Core.Name(canonicalOf(e.name, e.resolved)), e), e.resolved);
729
+ if (!e.name.includes('.')) {
730
+ markForResolution(node, e.resolved ? { written: e.name, r1Role: e.resolved.role } : { written: e.name });
731
+ }
732
+ else if (!e.resolved) {
733
+ markForResolution(node, { written: e.name });
734
+ }
735
+ return node;
736
+ }
690
737
  function spanToOrigin(span, file) {
691
738
  if (!span)
692
739
  return null;
@@ -702,11 +749,11 @@ function spanToOrigin(span, file) {
702
749
  function lowerType(t) {
703
750
  switch (t.kind) {
704
751
  case 'TypeName':
705
- return withOrigin(Core.TypeName(t.name), t);
752
+ return withResolution(withOrigin(Core.TypeName(canonicalOf(t.name, t.resolved)), t), t.resolved);
706
753
  case 'TypeVar':
707
754
  return withOrigin(Core.TypeVar(t.name), t);
708
755
  case 'TypeApp':
709
- return withOrigin(Core.TypeApp(t.base, t.args.map(lowerType)), t);
756
+ return withResolution(withOrigin(Core.TypeApp(canonicalOf(t.base, t.resolved), t.args.map(lowerType)), t), t.resolved);
710
757
  case 'Maybe':
711
758
  return withOrigin(Core.Maybe(lowerType(t.type)), t);
712
759
  case 'Option':
@@ -719,6 +766,8 @@ function lowerType(t) {
719
766
  return withOrigin(Core.Map(lowerType(t.key), lowerType(t.val)), t);
720
767
  case 'TypePii':
721
768
  return withOrigin(Core.Pii(lowerType(t.baseType), t.sensitivity, t.category), t);
769
+ case 'FuncType':
770
+ return withOrigin(Core.FuncType(t.params.map(lowerType), lowerType(t.ret)), t);
722
771
  default: {
723
772
  const { span } = extractMetadata(t);
724
773
  const kind = t.kind;
@@ -727,12 +776,22 @@ function lowerType(t) {
727
776
  }
728
777
  }
729
778
  }
779
+ /**
780
+ * 函数签名类型名的解析记录(ADR 0051 §4,与 Java 对齐):签名类型平时不带 origin,
781
+ * 仅当写法被改写(written !== canonical)时才附加带 written/role 的 origin,
782
+ * 因此无词汇或规范名直写的签名 IR 保持逐字节不变。
783
+ */
784
+ function withSignatureResolution(coreNode, astNode, resolved) {
785
+ if (!resolved || resolved.written === resolved.canonical)
786
+ return coreNode;
787
+ return withResolution(withOrigin(coreNode, astNode), resolved);
788
+ }
730
789
  function lowerTypeWithVars(t, vars) {
731
790
  switch (t.kind) {
732
791
  case 'TypeName':
733
792
  return vars.has(t.name)
734
793
  ? { kind: 'TypeVar', name: t.name }
735
- : Core.TypeName(t.name);
794
+ : withSignatureResolution(Core.TypeName(canonicalOf(t.name, t.resolved)), t, t.resolved);
736
795
  case 'EffectVar':
737
796
  return { kind: 'EffectVar', name: t.name };
738
797
  case 'Maybe':
@@ -746,15 +805,17 @@ function lowerTypeWithVars(t, vars) {
746
805
  case 'Map':
747
806
  return Core.Map(lowerTypeWithVars(t.key, vars), lowerTypeWithVars(t.val, vars));
748
807
  case 'TypeApp':
749
- return {
808
+ return withSignatureResolution({
750
809
  kind: 'TypeApp',
751
- base: t.base,
810
+ base: canonicalOf(t.base, t.resolved),
752
811
  args: t.args.map(tt => lowerTypeWithVars(tt, vars)),
753
- };
812
+ }, t, t.resolved);
754
813
  case 'TypeVar':
755
814
  return { kind: 'TypeVar', name: t.name };
756
815
  case 'TypePii':
757
816
  return Core.Pii(lowerTypeWithVars(t.baseType, vars), t.sensitivity, t.category);
817
+ case 'FuncType':
818
+ return Core.FuncType(t.params.map(p => lowerTypeWithVars(p, vars)), lowerTypeWithVars(t.ret, vars));
758
819
  default:
759
820
  return lowerType(t);
760
821
  }