@rcrsr/rill 0.15.0 → 0.17.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 (316) hide show
  1. package/README.md +37 -21
  2. package/dist/ast-nodes.d.ts +2 -13
  3. package/dist/ast-nodes.js +0 -1
  4. package/dist/ast-unions.d.ts +0 -1
  5. package/dist/ast-unions.js +0 -1
  6. package/dist/constants.d.ts +0 -1
  7. package/dist/constants.js +0 -1
  8. package/dist/error-classes.d.ts +0 -1
  9. package/dist/error-classes.js +0 -1
  10. package/dist/error-formatter.d.ts +0 -1
  11. package/dist/error-formatter.js +0 -1
  12. package/dist/error-registry.d.ts +0 -1
  13. package/dist/error-registry.js +32 -1
  14. package/dist/ext/crypto/index.d.ts +3 -4
  15. package/dist/ext/crypto/index.js +66 -64
  16. package/dist/ext/exec/index.d.ts +3 -4
  17. package/dist/ext/exec/index.js +17 -12
  18. package/dist/ext/exec/runner.d.ts +0 -1
  19. package/dist/ext/exec/runner.js +0 -1
  20. package/dist/ext/fetch/index.d.ts +3 -4
  21. package/dist/ext/fetch/index.js +23 -49
  22. package/dist/ext/fetch/request.d.ts +0 -1
  23. package/dist/ext/fetch/request.js +0 -1
  24. package/dist/ext/fs/index.d.ts +3 -4
  25. package/dist/ext/fs/index.js +268 -266
  26. package/dist/ext/fs/sandbox.d.ts +0 -1
  27. package/dist/ext/fs/sandbox.js +0 -1
  28. package/dist/ext/kv/index.d.ts +3 -4
  29. package/dist/ext/kv/index.js +216 -215
  30. package/dist/ext/kv/store.d.ts +0 -1
  31. package/dist/ext/kv/store.js +2 -2
  32. package/dist/ext-parse-bridge.d.ts +10 -0
  33. package/dist/ext-parse-bridge.js +10 -0
  34. package/dist/generated/introspection-data.d.ts +1 -2
  35. package/dist/generated/introspection-data.js +385 -297
  36. package/dist/generated/version-data.d.ts +1 -2
  37. package/dist/generated/version-data.js +2 -3
  38. package/dist/highlight-map.d.ts +0 -1
  39. package/dist/highlight-map.js +0 -1
  40. package/dist/index.d.ts +15 -5
  41. package/dist/index.js +14 -6
  42. package/dist/lexer/errors.d.ts +0 -1
  43. package/dist/lexer/errors.js +0 -1
  44. package/dist/lexer/helpers.d.ts +0 -1
  45. package/dist/lexer/helpers.js +0 -1
  46. package/dist/lexer/index.d.ts +0 -1
  47. package/dist/lexer/index.js +0 -1
  48. package/dist/lexer/operators.d.ts +0 -1
  49. package/dist/lexer/operators.js +0 -1
  50. package/dist/lexer/readers.d.ts +0 -1
  51. package/dist/lexer/readers.js +0 -1
  52. package/dist/lexer/state.d.ts +0 -1
  53. package/dist/lexer/state.js +0 -1
  54. package/dist/lexer/tokenizer.d.ts +0 -1
  55. package/dist/lexer/tokenizer.js +0 -1
  56. package/dist/parser/helpers.d.ts +0 -1
  57. package/dist/parser/helpers.js +0 -1
  58. package/dist/parser/index.d.ts +0 -1
  59. package/dist/parser/index.js +0 -1
  60. package/dist/parser/parser-collect.d.ts +0 -1
  61. package/dist/parser/parser-collect.js +0 -1
  62. package/dist/parser/parser-control.d.ts +0 -1
  63. package/dist/parser/parser-control.js +0 -1
  64. package/dist/parser/parser-expr.d.ts +0 -1
  65. package/dist/parser/parser-expr.js +0 -1
  66. package/dist/parser/parser-extract.d.ts +0 -1
  67. package/dist/parser/parser-extract.js +0 -1
  68. package/dist/parser/parser-functions.d.ts +0 -1
  69. package/dist/parser/parser-functions.js +0 -1
  70. package/dist/parser/parser-literals.d.ts +0 -1
  71. package/dist/parser/parser-literals.js +4 -2
  72. package/dist/parser/parser-script.d.ts +0 -1
  73. package/dist/parser/parser-script.js +0 -1
  74. package/dist/parser/parser-shape.d.ts +2 -3
  75. package/dist/parser/parser-shape.js +8 -52
  76. package/dist/parser/parser-types.d.ts +28 -2
  77. package/dist/parser/parser-types.js +76 -13
  78. package/dist/parser/parser-use.d.ts +0 -1
  79. package/dist/parser/parser-use.js +7 -2
  80. package/dist/parser/parser-variables.d.ts +0 -1
  81. package/dist/parser/parser-variables.js +0 -1
  82. package/dist/parser/parser.d.ts +0 -1
  83. package/dist/parser/parser.js +0 -1
  84. package/dist/parser/state.d.ts +0 -1
  85. package/dist/parser/state.js +0 -1
  86. package/dist/runtime/core/callable.d.ts +59 -20
  87. package/dist/runtime/core/callable.js +188 -39
  88. package/dist/runtime/core/context.d.ts +0 -12
  89. package/dist/runtime/core/context.js +77 -77
  90. package/dist/runtime/core/equals.d.ts +0 -1
  91. package/dist/runtime/core/equals.js +35 -3
  92. package/dist/runtime/core/eval/base.d.ts +0 -1
  93. package/dist/runtime/core/eval/base.js +0 -1
  94. package/dist/runtime/core/eval/evaluator.d.ts +0 -1
  95. package/dist/runtime/core/eval/evaluator.js +0 -1
  96. package/dist/runtime/core/eval/index.d.ts +2 -3
  97. package/dist/runtime/core/eval/index.js +11 -1
  98. package/dist/runtime/core/eval/mixins/annotations.d.ts +0 -1
  99. package/dist/runtime/core/eval/mixins/annotations.js +0 -1
  100. package/dist/runtime/core/eval/mixins/closures.d.ts +0 -1
  101. package/dist/runtime/core/eval/mixins/closures.js +92 -70
  102. package/dist/runtime/core/eval/mixins/collections.d.ts +0 -1
  103. package/dist/runtime/core/eval/mixins/collections.js +9 -4
  104. package/dist/runtime/core/eval/mixins/control-flow.d.ts +0 -1
  105. package/dist/runtime/core/eval/mixins/control-flow.js +0 -1
  106. package/dist/runtime/core/eval/mixins/conversion.d.ts +0 -1
  107. package/dist/runtime/core/eval/mixins/conversion.js +196 -188
  108. package/dist/runtime/core/eval/mixins/core.d.ts +0 -1
  109. package/dist/runtime/core/eval/mixins/core.js +2 -3
  110. package/dist/runtime/core/eval/mixins/expressions.d.ts +0 -1
  111. package/dist/runtime/core/eval/mixins/expressions.js +35 -28
  112. package/dist/runtime/core/eval/mixins/extraction.d.ts +0 -1
  113. package/dist/runtime/core/eval/mixins/extraction.js +8 -9
  114. package/dist/runtime/core/eval/mixins/list-dispatch.d.ts +0 -1
  115. package/dist/runtime/core/eval/mixins/list-dispatch.js +0 -1
  116. package/dist/runtime/core/eval/mixins/literals.d.ts +0 -1
  117. package/dist/runtime/core/eval/mixins/literals.js +6 -10
  118. package/dist/runtime/core/eval/mixins/types.d.ts +2 -1
  119. package/dist/runtime/core/eval/mixins/types.js +231 -261
  120. package/dist/runtime/core/eval/mixins/use.d.ts +0 -1
  121. package/dist/runtime/core/eval/mixins/use.js +0 -1
  122. package/dist/runtime/core/eval/mixins/variables.d.ts +0 -1
  123. package/dist/runtime/core/eval/mixins/variables.js +16 -15
  124. package/dist/runtime/core/eval/types.d.ts +0 -1
  125. package/dist/runtime/core/eval/types.js +0 -1
  126. package/dist/runtime/core/execute.d.ts +0 -1
  127. package/dist/runtime/core/execute.js +0 -1
  128. package/dist/runtime/core/field-descriptor.d.ts +4 -5
  129. package/dist/runtime/core/field-descriptor.js +2 -2
  130. package/dist/runtime/core/introspection.d.ts +0 -1
  131. package/dist/runtime/core/introspection.js +6 -7
  132. package/dist/runtime/core/markers.d.ts +12 -0
  133. package/dist/runtime/core/markers.js +7 -0
  134. package/dist/runtime/core/resolvers.d.ts +0 -1
  135. package/dist/runtime/core/resolvers.js +0 -1
  136. package/dist/runtime/core/signals.d.ts +0 -1
  137. package/dist/runtime/core/signals.js +0 -1
  138. package/dist/runtime/core/type-registrations.d.ts +136 -0
  139. package/dist/runtime/core/type-registrations.js +749 -0
  140. package/dist/runtime/core/type-structures.d.ts +128 -0
  141. package/dist/runtime/core/type-structures.js +12 -0
  142. package/dist/runtime/core/types.d.ts +15 -4
  143. package/dist/runtime/core/types.js +0 -1
  144. package/dist/runtime/core/values.d.ts +88 -146
  145. package/dist/runtime/core/values.js +466 -470
  146. package/dist/runtime/ext/builtins.d.ts +0 -1
  147. package/dist/runtime/ext/builtins.js +125 -80
  148. package/dist/runtime/ext/extensions.d.ts +30 -125
  149. package/dist/runtime/ext/extensions.js +0 -94
  150. package/dist/runtime/ext/test-context.d.ts +28 -0
  151. package/dist/runtime/ext/test-context.js +154 -0
  152. package/dist/runtime/index.d.ts +22 -9
  153. package/dist/runtime/index.js +18 -5
  154. package/dist/signature-parser.d.ts +2 -3
  155. package/dist/signature-parser.js +19 -17
  156. package/dist/source-location.d.ts +0 -1
  157. package/dist/source-location.js +0 -1
  158. package/dist/token-types.d.ts +0 -1
  159. package/dist/token-types.js +0 -1
  160. package/dist/types.d.ts +0 -1
  161. package/dist/types.js +0 -1
  162. package/dist/value-types.d.ts +15 -12
  163. package/dist/value-types.js +0 -1
  164. package/package.json +2 -1
  165. package/dist/ast-nodes.d.ts.map +0 -1
  166. package/dist/ast-nodes.js.map +0 -1
  167. package/dist/ast-unions.d.ts.map +0 -1
  168. package/dist/ast-unions.js.map +0 -1
  169. package/dist/constants.d.ts.map +0 -1
  170. package/dist/constants.js.map +0 -1
  171. package/dist/error-classes.d.ts.map +0 -1
  172. package/dist/error-classes.js.map +0 -1
  173. package/dist/error-formatter.d.ts.map +0 -1
  174. package/dist/error-formatter.js.map +0 -1
  175. package/dist/error-registry.d.ts.map +0 -1
  176. package/dist/error-registry.js.map +0 -1
  177. package/dist/ext/crypto/index.d.ts.map +0 -1
  178. package/dist/ext/crypto/index.js.map +0 -1
  179. package/dist/ext/exec/index.d.ts.map +0 -1
  180. package/dist/ext/exec/index.js.map +0 -1
  181. package/dist/ext/exec/runner.d.ts.map +0 -1
  182. package/dist/ext/exec/runner.js.map +0 -1
  183. package/dist/ext/fetch/index.d.ts.map +0 -1
  184. package/dist/ext/fetch/index.js.map +0 -1
  185. package/dist/ext/fetch/request.d.ts.map +0 -1
  186. package/dist/ext/fetch/request.js.map +0 -1
  187. package/dist/ext/fs/index.d.ts.map +0 -1
  188. package/dist/ext/fs/index.js.map +0 -1
  189. package/dist/ext/fs/sandbox.d.ts.map +0 -1
  190. package/dist/ext/fs/sandbox.js.map +0 -1
  191. package/dist/ext/kv/index.d.ts.map +0 -1
  192. package/dist/ext/kv/index.js.map +0 -1
  193. package/dist/ext/kv/store.d.ts.map +0 -1
  194. package/dist/ext/kv/store.js.map +0 -1
  195. package/dist/generated/introspection-data.d.ts.map +0 -1
  196. package/dist/generated/introspection-data.js.map +0 -1
  197. package/dist/generated/version-data.d.ts.map +0 -1
  198. package/dist/generated/version-data.js.map +0 -1
  199. package/dist/highlight-map.d.ts.map +0 -1
  200. package/dist/highlight-map.js.map +0 -1
  201. package/dist/index.d.ts.map +0 -1
  202. package/dist/index.js.map +0 -1
  203. package/dist/lexer/errors.d.ts.map +0 -1
  204. package/dist/lexer/errors.js.map +0 -1
  205. package/dist/lexer/helpers.d.ts.map +0 -1
  206. package/dist/lexer/helpers.js.map +0 -1
  207. package/dist/lexer/index.d.ts.map +0 -1
  208. package/dist/lexer/index.js.map +0 -1
  209. package/dist/lexer/operators.d.ts.map +0 -1
  210. package/dist/lexer/operators.js.map +0 -1
  211. package/dist/lexer/readers.d.ts.map +0 -1
  212. package/dist/lexer/readers.js.map +0 -1
  213. package/dist/lexer/state.d.ts.map +0 -1
  214. package/dist/lexer/state.js.map +0 -1
  215. package/dist/lexer/tokenizer.d.ts.map +0 -1
  216. package/dist/lexer/tokenizer.js.map +0 -1
  217. package/dist/parser/helpers.d.ts.map +0 -1
  218. package/dist/parser/helpers.js.map +0 -1
  219. package/dist/parser/index.d.ts.map +0 -1
  220. package/dist/parser/index.js.map +0 -1
  221. package/dist/parser/parser-collect.d.ts.map +0 -1
  222. package/dist/parser/parser-collect.js.map +0 -1
  223. package/dist/parser/parser-control.d.ts.map +0 -1
  224. package/dist/parser/parser-control.js.map +0 -1
  225. package/dist/parser/parser-expr.d.ts.map +0 -1
  226. package/dist/parser/parser-expr.js.map +0 -1
  227. package/dist/parser/parser-extract.d.ts.map +0 -1
  228. package/dist/parser/parser-extract.js.map +0 -1
  229. package/dist/parser/parser-functions.d.ts.map +0 -1
  230. package/dist/parser/parser-functions.js.map +0 -1
  231. package/dist/parser/parser-literals.d.ts.map +0 -1
  232. package/dist/parser/parser-literals.js.map +0 -1
  233. package/dist/parser/parser-script.d.ts.map +0 -1
  234. package/dist/parser/parser-script.js.map +0 -1
  235. package/dist/parser/parser-shape.d.ts.map +0 -1
  236. package/dist/parser/parser-shape.js.map +0 -1
  237. package/dist/parser/parser-types.d.ts.map +0 -1
  238. package/dist/parser/parser-types.js.map +0 -1
  239. package/dist/parser/parser-use.d.ts.map +0 -1
  240. package/dist/parser/parser-use.js.map +0 -1
  241. package/dist/parser/parser-variables.d.ts.map +0 -1
  242. package/dist/parser/parser-variables.js.map +0 -1
  243. package/dist/parser/parser.d.ts.map +0 -1
  244. package/dist/parser/parser.js.map +0 -1
  245. package/dist/parser/state.d.ts.map +0 -1
  246. package/dist/parser/state.js.map +0 -1
  247. package/dist/runtime/core/callable.d.ts.map +0 -1
  248. package/dist/runtime/core/callable.js.map +0 -1
  249. package/dist/runtime/core/context.d.ts.map +0 -1
  250. package/dist/runtime/core/context.js.map +0 -1
  251. package/dist/runtime/core/equals.d.ts.map +0 -1
  252. package/dist/runtime/core/equals.js.map +0 -1
  253. package/dist/runtime/core/eval/base.d.ts.map +0 -1
  254. package/dist/runtime/core/eval/base.js.map +0 -1
  255. package/dist/runtime/core/eval/evaluator.d.ts.map +0 -1
  256. package/dist/runtime/core/eval/evaluator.js.map +0 -1
  257. package/dist/runtime/core/eval/index.d.ts.map +0 -1
  258. package/dist/runtime/core/eval/index.js.map +0 -1
  259. package/dist/runtime/core/eval/mixins/annotations.d.ts.map +0 -1
  260. package/dist/runtime/core/eval/mixins/annotations.js.map +0 -1
  261. package/dist/runtime/core/eval/mixins/closures.d.ts.map +0 -1
  262. package/dist/runtime/core/eval/mixins/closures.js.map +0 -1
  263. package/dist/runtime/core/eval/mixins/collections.d.ts.map +0 -1
  264. package/dist/runtime/core/eval/mixins/collections.js.map +0 -1
  265. package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +0 -1
  266. package/dist/runtime/core/eval/mixins/control-flow.js.map +0 -1
  267. package/dist/runtime/core/eval/mixins/conversion.d.ts.map +0 -1
  268. package/dist/runtime/core/eval/mixins/conversion.js.map +0 -1
  269. package/dist/runtime/core/eval/mixins/core.d.ts.map +0 -1
  270. package/dist/runtime/core/eval/mixins/core.js.map +0 -1
  271. package/dist/runtime/core/eval/mixins/expressions.d.ts.map +0 -1
  272. package/dist/runtime/core/eval/mixins/expressions.js.map +0 -1
  273. package/dist/runtime/core/eval/mixins/extraction.d.ts.map +0 -1
  274. package/dist/runtime/core/eval/mixins/extraction.js.map +0 -1
  275. package/dist/runtime/core/eval/mixins/list-dispatch.d.ts.map +0 -1
  276. package/dist/runtime/core/eval/mixins/list-dispatch.js.map +0 -1
  277. package/dist/runtime/core/eval/mixins/literals.d.ts.map +0 -1
  278. package/dist/runtime/core/eval/mixins/literals.js.map +0 -1
  279. package/dist/runtime/core/eval/mixins/types.d.ts.map +0 -1
  280. package/dist/runtime/core/eval/mixins/types.js.map +0 -1
  281. package/dist/runtime/core/eval/mixins/use.d.ts.map +0 -1
  282. package/dist/runtime/core/eval/mixins/use.js.map +0 -1
  283. package/dist/runtime/core/eval/mixins/variables.d.ts.map +0 -1
  284. package/dist/runtime/core/eval/mixins/variables.js.map +0 -1
  285. package/dist/runtime/core/eval/types.d.ts.map +0 -1
  286. package/dist/runtime/core/eval/types.js.map +0 -1
  287. package/dist/runtime/core/execute.d.ts.map +0 -1
  288. package/dist/runtime/core/execute.js.map +0 -1
  289. package/dist/runtime/core/field-descriptor.d.ts.map +0 -1
  290. package/dist/runtime/core/field-descriptor.js.map +0 -1
  291. package/dist/runtime/core/introspection.d.ts.map +0 -1
  292. package/dist/runtime/core/introspection.js.map +0 -1
  293. package/dist/runtime/core/resolvers.d.ts.map +0 -1
  294. package/dist/runtime/core/resolvers.js.map +0 -1
  295. package/dist/runtime/core/signals.d.ts.map +0 -1
  296. package/dist/runtime/core/signals.js.map +0 -1
  297. package/dist/runtime/core/types.d.ts.map +0 -1
  298. package/dist/runtime/core/types.js.map +0 -1
  299. package/dist/runtime/core/values.d.ts.map +0 -1
  300. package/dist/runtime/core/values.js.map +0 -1
  301. package/dist/runtime/ext/builtins.d.ts.map +0 -1
  302. package/dist/runtime/ext/builtins.js.map +0 -1
  303. package/dist/runtime/ext/extensions.d.ts.map +0 -1
  304. package/dist/runtime/ext/extensions.js.map +0 -1
  305. package/dist/runtime/index.d.ts.map +0 -1
  306. package/dist/runtime/index.js.map +0 -1
  307. package/dist/signature-parser.d.ts.map +0 -1
  308. package/dist/signature-parser.js.map +0 -1
  309. package/dist/source-location.d.ts.map +0 -1
  310. package/dist/source-location.js.map +0 -1
  311. package/dist/token-types.d.ts.map +0 -1
  312. package/dist/token-types.js.map +0 -1
  313. package/dist/types.d.ts.map +0 -1
  314. package/dist/types.js.map +0 -1
  315. package/dist/value-types.d.ts.map +0 -1
  316. package/dist/value-types.js.map +0 -1
@@ -12,6 +12,8 @@
12
12
  * - evaluateTypeCheckPrimary(node) -> Promise<boolean>
13
13
  * - evaluateTypeConstructor(node) -> Promise<RillTypeValue> [IR-7]
14
14
  * - evaluateClosureSigLiteral(node) -> Promise<RillTypeValue> [IR-8]
15
+ * - resolveTypeRef(typeRef, getVariable) -> Promise<RillTypeValue> [IR-2]
16
+ * - buildCollectionType(name, args, resolveArg, evaluateDefault, location?) -> Promise<RillTypeValue> [IR-4]
15
17
  *
16
18
  * Error Handling:
17
19
  * - Type assertion failures throw RuntimeError(RUNTIME_TYPE_ERROR) [EC-24]
@@ -21,7 +23,7 @@
21
23
  * @internal
22
24
  */
23
25
  import { RuntimeError } from '../../../../types.js';
24
- import { inferType, checkType, isTypeValue, structuralTypeMatches, inferStructuralType, formatStructuralType, } from '../../values.js';
26
+ import { inferType, checkType, isTypeValue, structureMatches, inferStructure, formatStructure, } from '../../values.js';
25
27
  import { getVariable } from '../../context.js';
26
28
  /**
27
29
  * TypesMixin implementation.
@@ -34,6 +36,7 @@ import { getVariable } from '../../context.js';
34
36
  * - EvaluatorBase: ctx, checkAborted(), getNodeLocation()
35
37
  * - evaluatePostfixExpr() (from future CoreMixin composition)
36
38
  * - evaluateExpression() (from CoreMixin, for type constructor arg evaluation)
39
+ * - evaluatePrimary() (from CoreMixin, for default value evaluation)
37
40
  *
38
41
  * Methods added:
39
42
  * - assertType(value, expected, location?) -> RillValue
@@ -43,133 +46,233 @@ import { getVariable } from '../../context.js';
43
46
  * - evaluateTypeCheckPrimary(node) -> Promise<boolean>
44
47
  * - evaluateTypeConstructor(node) -> Promise<RillTypeValue>
45
48
  * - evaluateClosureSigLiteral(node) -> Promise<RillTypeValue>
49
+ * - resolveTypeRef(typeRef, getVariable) -> Promise<RillTypeValue>
50
+ * - buildCollectionType(name, args, resolveArg, evaluateDefault, location?) -> Promise<RillTypeValue>
46
51
  */
47
52
  function createTypesMixin(Base) {
48
53
  return class TypesEvaluator extends Base {
49
54
  /**
50
- * Resolve a TypeRef to a RillTypeValue [IR-2].
55
+ * Shared helper that partitions args, enforces validation, evaluates
56
+ * defaults, and constructs a RillTypeValue [IR-4].
51
57
  *
52
- * Static refs with no args return a frozen RillTypeValue directly.
53
- * Static refs with args build a parameterized RillType.
54
- * Dynamic refs call getVariable, then dispatch on the result:
55
- * - RillTypeValue → return as-is
56
- * - Otherwise → throw RILL-R004
58
+ * Called by both resolveTypeRef and evaluateTypeConstructor with
59
+ * different resolution/evaluation strategies via callbacks.
57
60
  *
58
- * EC-1: Variable not found → undefined from getVariable → RILL-R005.
59
- * EC-2: Non-type variable value RILL-R004.
60
- * EC-3: Leaf type with args RILL-R004.
61
- * EC-4: list with != 1 positional arg → RILL-R004.
62
- * EC-5: dict/ordered with positional arg RILL-R004.
63
- * EC-6: tuple with named arg RILL-R004.
64
- * EC-7: arg value is not a type value RILL-R004.
61
+ * Error contracts:
62
+ * - EC-B1: Leaf type with args -> RILL-R004
63
+ * - EC-B2: list != 1 arg -> RILL-R004
64
+ * - EC-B3: Positional+named mix -> RILL-R004
65
+ * - EC-B4: tuple with named arg -> RILL-R004
66
+ * - EC-B5: Non-type arg value (delegated to resolveArg callback)
67
+ * - EC-B6: Default type mismatch -> RILL-R004
68
+ * - EC-B7: Tuple non-trailing default -> RILL-R004
65
69
  */
66
- resolveTypeRef(typeRef, getVariable) {
67
- if (typeRef.kind === 'static') {
68
- const { typeName, args } = typeRef;
69
- // No args: existing bare-type behavior
70
- if (!args || args.length === 0) {
71
- return Object.freeze({
72
- __rill_type: true,
73
- typeName,
74
- structure: { type: typeName },
75
- });
76
- }
77
- // EC-3: Leaf types reject all type arguments
78
- const LEAF_TYPES = new Set([
79
- 'string',
80
- 'number',
81
- 'bool',
82
- 'vector',
83
- 'type',
84
- 'any',
85
- 'closure',
86
- ]);
87
- if (LEAF_TYPES.has(typeName)) {
88
- throw new RuntimeError('RILL-R004', `${typeName} does not accept type arguments`);
70
+ async buildCollectionType(name, args, resolveArg, evaluateDefault, location) {
71
+ if (name === 'list') {
72
+ // EC-B2: list requires exactly 1 positional arg
73
+ if (args.length !== 1 || args[0].name !== undefined) {
74
+ throw new RuntimeError('RILL-R004', 'list() requires exactly 1 type argument', location);
89
75
  }
90
- // Helper: recursively resolve one TypeRefArg to RillType
91
- const resolveArg = (arg) => {
92
- const resolved = this.resolveTypeRef(arg.ref, getVariable);
93
- return resolved.structure;
94
- };
95
- if (typeName === 'list') {
96
- // EC-4: list requires exactly 1 positional arg
97
- if (args.length !== 1 || args[0].name !== undefined) {
98
- throw new RuntimeError('RILL-R004', 'list() requires exactly 1 type argument');
99
- }
100
- const structure = {
101
- type: 'list',
102
- element: resolveArg(args[0]),
103
- };
104
- return Object.freeze({
105
- __rill_type: true,
106
- typeName,
107
- structure,
108
- });
76
+ const element = await resolveArg(args[0]);
77
+ const structure = { kind: 'list', element };
78
+ return Object.freeze({
79
+ __rill_type: true,
80
+ typeName: name,
81
+ structure,
82
+ });
83
+ }
84
+ if (name === 'dict' || name === 'ordered') {
85
+ const positional = args.filter((a) => a.name === undefined);
86
+ const named = args.filter((a) => a.name !== undefined);
87
+ // EC-B3: Cannot mix positional and named arguments
88
+ if (positional.length > 0 && named.length > 0) {
89
+ throw new RuntimeError('RILL-R004', `${name}() cannot mix positional and named arguments`, location);
109
90
  }
110
- if (typeName === 'dict') {
111
- // EC-5: dict requires named args only
112
- for (const arg of args) {
113
- if (arg.name === undefined) {
114
- throw new RuntimeError('RILL-R004', 'dict() requires named arguments (field: type)');
91
+ // Uniform path: exactly 1 positional, 0 named -> valueType
92
+ if (positional.length === 1 && named.length === 0) {
93
+ const valueType = await resolveArg(positional[0]);
94
+ // EC-B6: Default type mismatch on uniform single-arg path
95
+ if (positional[0].defaultValue !== undefined) {
96
+ const defaultVal = await evaluateDefault(positional[0].defaultValue);
97
+ if (!structureMatches(defaultVal, valueType)) {
98
+ throw new RuntimeError('RILL-R004', `Default value for ${name} element must be ${formatStructure(valueType)}, got ${inferType(defaultVal)}`, location);
115
99
  }
116
100
  }
117
- const fields = {};
118
- for (const arg of args) {
119
- fields[arg.name] = resolveArg(arg);
120
- }
121
- const structure = { type: 'dict', fields };
101
+ const structure = { kind: name, valueType };
122
102
  return Object.freeze({
123
103
  __rill_type: true,
124
- typeName,
104
+ typeName: name,
125
105
  structure,
126
106
  });
127
107
  }
128
- if (typeName === 'tuple') {
129
- // EC-6: tuple requires positional args only
108
+ // EC: dict/ordered with 2+ positional args
109
+ if (positional.length >= 2) {
110
+ throw new RuntimeError('RILL-R004', `${name}() requires exactly 1 positional type argument`, location);
111
+ }
112
+ // Structural path: named args only -> fields
113
+ if (name === 'dict') {
114
+ const fields = {};
130
115
  for (const arg of args) {
131
- if (arg.name !== undefined) {
132
- throw new RuntimeError('RILL-R004', 'tuple() requires positional arguments');
116
+ const resolvedType = await resolveArg(arg);
117
+ const fieldDef = { type: resolvedType };
118
+ if (arg.defaultValue !== undefined) {
119
+ const defaultVal = await evaluateDefault(arg.defaultValue);
120
+ // EC-B6: Default type mismatch
121
+ if (!structureMatches(defaultVal, resolvedType)) {
122
+ throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructure(resolvedType)}, got ${inferType(defaultVal)}`, location);
123
+ }
124
+ fieldDef.defaultValue = defaultVal;
133
125
  }
126
+ fields[arg.name] = fieldDef;
134
127
  }
135
- const elements = args.map((arg) => [resolveArg(arg)]);
136
- const structure = { type: 'tuple', elements };
128
+ const structure = { kind: 'dict', fields };
137
129
  return Object.freeze({
138
130
  __rill_type: true,
139
- typeName,
131
+ typeName: name,
140
132
  structure,
141
133
  });
142
134
  }
143
- // typeName === 'ordered'
144
- // EC-5: ordered requires named args only
135
+ // name === 'ordered': structural path -> fields array with name
136
+ const orderedFields = [];
145
137
  for (const arg of args) {
146
- if (arg.name === undefined) {
147
- throw new RuntimeError('RILL-R004', 'dict() requires named arguments (field: type)');
138
+ const resolvedType = await resolveArg(arg);
139
+ const fieldDef = {
140
+ name: arg.name,
141
+ type: resolvedType,
142
+ };
143
+ if (arg.defaultValue !== undefined) {
144
+ const defaultVal = await evaluateDefault(arg.defaultValue);
145
+ // EC-B6: Default type mismatch
146
+ if (!structureMatches(defaultVal, resolvedType)) {
147
+ throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructure(resolvedType)}, got ${inferType(defaultVal)}`, location);
148
+ }
149
+ fieldDef.defaultValue = defaultVal;
148
150
  }
151
+ orderedFields.push(fieldDef);
149
152
  }
150
- const orderedFields = args.map((arg) => [arg.name, resolveArg(arg)]);
151
153
  const structure = {
152
- type: 'ordered',
154
+ kind: 'ordered',
153
155
  fields: orderedFields,
154
156
  };
155
157
  return Object.freeze({
156
158
  __rill_type: true,
157
- typeName,
159
+ typeName: name,
160
+ structure,
161
+ });
162
+ }
163
+ // name === 'tuple'
164
+ // EC-B4: tuple requires positional args only
165
+ for (const arg of args) {
166
+ if (arg.name !== undefined) {
167
+ throw new RuntimeError('RILL-R004', 'tuple() requires positional arguments', location);
168
+ }
169
+ }
170
+ // Uniform path: exactly 1 positional -> valueType
171
+ if (args.length === 1 && args[0].name === undefined) {
172
+ const valueType = await resolveArg(args[0]);
173
+ // EC-B6: Default type mismatch on uniform single-arg path
174
+ if (args[0].defaultValue !== undefined) {
175
+ const defaultVal = await evaluateDefault(args[0].defaultValue);
176
+ if (!structureMatches(defaultVal, valueType)) {
177
+ throw new RuntimeError('RILL-R004', `Default value for tuple element must be ${formatStructure(valueType)}, got ${inferType(defaultVal)}`, location);
178
+ }
179
+ }
180
+ const structure = { kind: 'tuple', valueType };
181
+ return Object.freeze({
182
+ __rill_type: true,
183
+ typeName: 'tuple',
158
184
  structure,
159
185
  });
160
186
  }
161
- // Union type ref: (A | B) — resolve each member recursively and
162
- // return a RillTypeValue with structure: { type: 'union', members: [...] }.
187
+ // Structural path: 2+ positional -> elements
188
+ const elements = [];
189
+ for (const arg of args) {
190
+ const resolvedType = await resolveArg(arg);
191
+ const fieldDef = { type: resolvedType };
192
+ if (arg.defaultValue !== undefined) {
193
+ const defaultVal = await evaluateDefault(arg.defaultValue);
194
+ // EC-B6: Default type mismatch
195
+ if (!structureMatches(defaultVal, resolvedType)) {
196
+ throw new RuntimeError('RILL-R004', `Default value for tuple element must be ${formatStructure(resolvedType)}, got ${inferType(defaultVal)}`, location);
197
+ }
198
+ fieldDef.defaultValue = defaultVal;
199
+ }
200
+ elements.push(fieldDef);
201
+ }
202
+ // EC-B7: Tuple non-trailing default — no element without a default
203
+ // may follow an element that has one.
204
+ let sawDefault = false;
205
+ for (let i = 0; i < elements.length; i++) {
206
+ const hasDefault = elements[i].defaultValue !== undefined;
207
+ if (hasDefault) {
208
+ sawDefault = true;
209
+ }
210
+ else if (sawDefault) {
211
+ throw new RuntimeError('RILL-R004', `tuple() default values must be trailing: element at position ${i} has no default but a preceding element does`, location);
212
+ }
213
+ }
214
+ const structure = { kind: 'tuple', elements };
215
+ return Object.freeze({
216
+ __rill_type: true,
217
+ typeName: 'tuple',
218
+ structure,
219
+ });
220
+ }
221
+ /**
222
+ * Resolve a TypeRef to a RillTypeValue [IR-2].
223
+ *
224
+ * Static refs with no args return a frozen RillTypeValue directly.
225
+ * Static refs with args delegate to buildCollectionType.
226
+ * Dynamic refs call getVariable, then dispatch on the result:
227
+ * - RillTypeValue -> return as-is
228
+ * - Otherwise -> throw RILL-R004
229
+ *
230
+ * EC-3: Variable not found -> RILL-R005.
231
+ * EC-4: Non-type variable value -> RILL-R004.
232
+ * EC-5: list with != 1 positional arg -> RILL-R004.
233
+ * EC-6: dict/ordered positional+named mix -> RILL-R004.
234
+ * EC-7: tuple with named arg -> RILL-R004.
235
+ * EC-8: Default type mismatch -> RILL-R004.
236
+ * EC-9: Default evaluation failure -> propagated.
237
+ * EC-10: Tuple non-trailing default -> RILL-R004.
238
+ */
239
+ async resolveTypeRef(typeRef, getVariableFn) {
240
+ if (typeRef.kind === 'static') {
241
+ const { typeName, args } = typeRef;
242
+ // No args: existing bare-type behavior
243
+ if (!args || args.length === 0) {
244
+ return Object.freeze({
245
+ __rill_type: true,
246
+ typeName,
247
+ structure: { kind: typeName },
248
+ });
249
+ }
250
+ // EC-B1: Leaf types reject all type arguments (AC-4: derived from registrations)
251
+ if (this.ctx.leafTypes.has(typeName)) {
252
+ throw new RuntimeError('RILL-R004', `${typeName} does not accept type arguments`);
253
+ }
254
+ // Delegate to buildCollectionType with recursive resolveTypeRef
255
+ return this.buildCollectionType(typeName, args, async (arg) => {
256
+ const resolved = await this.resolveTypeRef(arg.value, getVariableFn);
257
+ return resolved.structure;
258
+ }, async (node) => {
259
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
260
+ return this.evaluatePrimary(node);
261
+ });
262
+ }
263
+ // Union type ref: (A | B) -- resolve each member recursively and
264
+ // return a RillTypeValue with structure: { kind: 'union', members: [...] }.
163
265
  // typeName is set to a display string for error messages; the structure
164
266
  // field carries the authoritative type shape for validation (DR-1).
165
267
  if (typeRef.kind === 'union') {
166
- const members = typeRef.members.map((member) => {
167
- const resolved = this.resolveTypeRef(member, getVariable);
168
- return resolved.structure;
169
- });
170
- const structure = { type: 'union', members };
268
+ const members = [];
269
+ for (const member of typeRef.members) {
270
+ const resolved = await this.resolveTypeRef(member, getVariableFn);
271
+ members.push(resolved.structure);
272
+ }
273
+ const structure = { kind: 'union', members };
171
274
  const displayName = members
172
- .map(formatStructuralType)
275
+ .map(formatStructure)
173
276
  .join('|');
174
277
  return Object.freeze({
175
278
  __rill_type: true,
@@ -177,7 +280,7 @@ function createTypesMixin(Base) {
177
280
  structure,
178
281
  });
179
282
  }
180
- const result = getVariable(typeRef.varName);
283
+ const result = getVariableFn(typeRef.varName);
181
284
  if (result === undefined) {
182
285
  throw new RuntimeError('RILL-R005', `Variable $${typeRef.varName} is not defined`);
183
286
  }
@@ -188,28 +291,29 @@ function createTypesMixin(Base) {
188
291
  /**
189
292
  * Assert that a value is of the expected type.
190
293
  * Returns the value unchanged if assertion passes, throws on mismatch.
191
- * Accepts a bare RillTypeName or a full RillType.
192
- * When expected is a RillType with sub-fields (element, fields, elements),
193
- * dispatches to structuralTypeMatches for deep validation.
294
+ * Accepts a bare RillTypeName or a full TypeStructure.
295
+ * When expected is a TypeStructure with sub-fields (element, fields, elements),
296
+ * dispatches to structureMatches for deep validation.
194
297
  * Exported for use by type assertion evaluation.
195
298
  */
196
299
  assertType(value, expected, location) {
197
- // Structural path: expected is a RillType object
300
+ // Structural path: expected is a TypeStructure object
198
301
  if (typeof expected !== 'string') {
199
302
  const hasSubFields = 'element' in expected ||
200
303
  'fields' in expected ||
201
304
  'elements' in expected ||
202
- 'members' in expected;
305
+ 'members' in expected ||
306
+ 'valueType' in expected;
203
307
  if (hasSubFields) {
204
- if (!structuralTypeMatches(value, expected)) {
205
- const expectedStr = formatStructuralType(expected);
206
- const actualStr = formatStructuralType(inferStructuralType(value));
308
+ if (!structureMatches(value, expected)) {
309
+ const expectedStr = formatStructure(expected);
310
+ const actualStr = formatStructure(inferStructure(value));
207
311
  throw new RuntimeError('RILL-R004', `Type assertion failed: expected ${expectedStr}, got ${actualStr}`, location, { expectedType: expectedStr, actualType: actualStr });
208
312
  }
209
313
  return value;
210
314
  }
211
315
  // Bare structural type (no sub-fields): fall through using type name
212
- expected = expected.type;
316
+ expected = expected.kind;
213
317
  }
214
318
  // Bare type name path
215
319
  if (expected === 'any')
@@ -231,7 +335,7 @@ function createTypesMixin(Base) {
231
335
  ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
232
336
  await this.evaluatePostfixExpr(node.operand)
233
337
  : input;
234
- const resolved = this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
338
+ const resolved = await this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
235
339
  return this.assertType(value, resolved.structure, node.span.start);
236
340
  }
237
341
  /**
@@ -245,13 +349,14 @@ function createTypesMixin(Base) {
245
349
  ? // eslint-disable-next-line @typescript-eslint/no-explicit-any
246
350
  await this.evaluatePostfixExpr(node.operand)
247
351
  : input;
248
- const resolved = this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
352
+ const resolved = await this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
249
353
  const hasSubFields = 'element' in resolved.structure ||
250
354
  'fields' in resolved.structure ||
251
355
  'elements' in resolved.structure ||
252
- 'members' in resolved.structure;
356
+ 'members' in resolved.structure ||
357
+ 'valueType' in resolved.structure;
253
358
  if (hasSubFields) {
254
- return structuralTypeMatches(value, resolved.structure);
359
+ return structureMatches(value, resolved.structure);
255
360
  }
256
361
  return checkType(value, resolved.typeName);
257
362
  }
@@ -282,166 +387,32 @@ function createTypesMixin(Base) {
282
387
  /**
283
388
  * Evaluate a type constructor node into a RillTypeValue [IR-7].
284
389
  *
285
- * Handles list(T), dict(k: T, ...), tuple(T1, T2, ...), ordered(k: T, ...).
286
- * All arguments must evaluate to RillTypeValue.
390
+ * Handles list(T), dict(...), tuple(...), ordered(...).
391
+ * Delegates to buildCollectionType with evaluateTypeConstructor-specific
392
+ * resolution strategy (resolves TypeRef via resolveTypeRef, evaluates
393
+ * defaults via evaluatePrimary).
287
394
  *
288
- * Error contracts:
289
- * - EC-4: list() with != 1 arg -> RILL-R004
290
- * - EC-5: non-type argument -> RILL-R004
291
- * - EC-6: positional arg in dict/ordered -> RILL-R004
292
- * - EC-7: named arg in tuple -> RILL-R004
395
+ * Error contracts delegated to buildCollectionType.
293
396
  */
294
397
  async evaluateTypeConstructor(node) {
295
398
  const name = node.constructorName;
296
399
  const location = node.span.start;
297
- // Helper: evaluate one arg expression and assert it is a RillTypeValue
298
- const resolveArgAsType = async (argValue) => {
299
- if (!isTypeValue(argValue)) {
300
- throw new RuntimeError('RILL-R004', `Type constructor argument must be a type value, got ${inferType(argValue)}`, location);
301
- }
302
- return argValue.structure.type === 'any' &&
303
- argValue.typeName !== 'any'
304
- ? { type: argValue.typeName }
305
- : argValue.structure;
306
- };
307
- if (name === 'list') {
308
- // EC-4: list() requires exactly 1 argument
309
- if (node.args.length !== 1) {
310
- throw new RuntimeError('RILL-R004', 'list() requires exactly 1 type argument', location);
311
- }
312
- const arg = node.args[0];
400
+ return this.buildCollectionType(name, node.args, async (arg) => {
401
+ const resolved = await this.resolveTypeRef(arg.value, (varName) => getVariable(this.ctx, varName));
402
+ return resolved.structure.kind === 'any' &&
403
+ resolved.typeName !== 'any'
404
+ ? { kind: resolved.typeName }
405
+ : resolved.structure;
406
+ }, async (node) => {
313
407
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
314
- const argVal = await this.evaluateExpression(arg.value);
315
- const elementType = await resolveArgAsType(argVal);
316
- const structure = {
317
- type: 'list',
318
- element: elementType,
319
- };
320
- return Object.freeze({
321
- __rill_type: true,
322
- typeName: 'list',
323
- structure,
324
- });
325
- }
326
- if (name === 'dict') {
327
- // EC-6: dict() requires named arguments
328
- for (const arg of node.args) {
329
- if (arg.kind === 'positional') {
330
- throw new RuntimeError('RILL-R004', 'dict() requires named arguments (field: type)', location);
331
- }
332
- }
333
- const fields = {};
334
- for (const arg of node.args) {
335
- if (arg.kind === 'named') {
336
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
337
- const argVal = await this.evaluateExpression(arg.value);
338
- const resolvedType = await resolveArgAsType(argVal);
339
- if (arg.defaultValue !== undefined) {
340
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
341
- const defaultVal = await this.evaluatePrimary(arg.defaultValue);
342
- if (!structuralTypeMatches(defaultVal, resolvedType)) {
343
- throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructuralType(resolvedType)}, got ${inferType(defaultVal)}`, location);
344
- }
345
- fields[arg.name] = {
346
- type: resolvedType,
347
- defaultValue: defaultVal,
348
- };
349
- }
350
- else {
351
- fields[arg.name] = resolvedType;
352
- }
353
- }
354
- }
355
- const structure = { type: 'dict', fields };
356
- return Object.freeze({
357
- __rill_type: true,
358
- typeName: 'dict',
359
- structure,
360
- });
361
- }
362
- if (name === 'tuple') {
363
- // EC-7: tuple() requires positional arguments
364
- for (const arg of node.args) {
365
- if (arg.kind === 'named') {
366
- throw new RuntimeError('RILL-R004', 'tuple() requires positional arguments', location);
367
- }
368
- }
369
- const elements = [];
370
- for (const arg of node.args) {
371
- if (arg.kind === 'positional') {
372
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
373
- const argVal = await this.evaluateExpression(arg.value);
374
- const resolvedType = await resolveArgAsType(argVal);
375
- if (arg.defaultValue !== undefined) {
376
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
377
- const defaultVal = await this.evaluatePrimary(arg.defaultValue);
378
- elements.push([resolvedType, defaultVal]);
379
- }
380
- else {
381
- elements.push([resolvedType]);
382
- }
383
- }
384
- }
385
- // EC-3: defaults must be trailing-only — no element without a default
386
- // may follow an element that has one.
387
- let sawDefault = false;
388
- for (let i = 0; i < elements.length; i++) {
389
- const hasDefault = elements[i].length === 2;
390
- if (hasDefault) {
391
- sawDefault = true;
392
- }
393
- else if (sawDefault) {
394
- throw new RuntimeError('RILL-P003', `tuple() default values must be trailing: element at position ${i} has no default but a preceding element does`, location);
395
- }
396
- }
397
- const structure = { type: 'tuple', elements };
398
- return Object.freeze({
399
- __rill_type: true,
400
- typeName: 'tuple',
401
- structure,
402
- });
403
- }
404
- // name === 'ordered'
405
- // EC-6: ordered() requires named arguments
406
- for (const arg of node.args) {
407
- if (arg.kind === 'positional') {
408
- throw new RuntimeError('RILL-R004', 'ordered() requires named arguments (field: type)', location);
409
- }
410
- }
411
- const orderedFields = [];
412
- for (const arg of node.args) {
413
- if (arg.kind === 'named') {
414
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
415
- const argVal = await this.evaluateExpression(arg.value);
416
- const resolvedType = await resolveArgAsType(argVal);
417
- if (arg.defaultValue !== undefined) {
418
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
419
- const defaultVal = await this.evaluatePrimary(arg.defaultValue);
420
- if (!structuralTypeMatches(defaultVal, resolvedType)) {
421
- throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructuralType(resolvedType)}, got ${inferType(defaultVal)}`, location);
422
- }
423
- orderedFields.push([arg.name, resolvedType, defaultVal]);
424
- }
425
- else {
426
- orderedFields.push([arg.name, resolvedType]);
427
- }
428
- }
429
- }
430
- const structure = {
431
- type: 'ordered',
432
- fields: orderedFields,
433
- };
434
- return Object.freeze({
435
- __rill_type: true,
436
- typeName: 'ordered',
437
- structure,
438
- });
408
+ return this.evaluatePrimary(node);
409
+ }, location);
439
410
  }
440
411
  /**
441
412
  * Evaluate a closure signature literal into a RillTypeValue [IR-8].
442
413
  *
443
414
  * Creates a closure type value from |param: T, ...|: R syntax.
444
- * Each parameter produces a [name, RillType] entry.
415
+ * Each parameter produces a [name, TypeStructure] entry.
445
416
  *
446
417
  * Error contracts:
447
418
  * - EC-8: missing return type -> RILL-R004 (enforced at parse time; node always has returnType)
@@ -449,14 +420,14 @@ function createTypesMixin(Base) {
449
420
  */
450
421
  async evaluateClosureSigLiteral(node) {
451
422
  const location = node.span.start;
452
- // Helper: evaluate a type expression and extract RillType
423
+ // Helper: evaluate a type expression and extract TypeStructure
453
424
  const resolveTypeExpr = async (argVal) => {
454
425
  if (!isTypeValue(argVal)) {
455
426
  throw new RuntimeError('RILL-R004', `Parameter type must be a type value, got ${inferType(argVal)}`, location);
456
427
  }
457
- return argVal.structure.type === 'any' &&
428
+ return argVal.structure.kind === 'any' &&
458
429
  argVal.typeName !== 'any'
459
- ? { type: argVal.typeName }
430
+ ? { kind: argVal.typeName }
460
431
  : argVal.structure;
461
432
  };
462
433
  // Evaluate parameter types
@@ -465,9 +436,9 @@ function createTypesMixin(Base) {
465
436
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
466
437
  const paramVal = await this.evaluateExpression(param.typeExpr);
467
438
  const paramType = await resolveTypeExpr(paramVal);
468
- params.push([param.name, paramType]);
439
+ params.push({ name: param.name, type: paramType });
469
440
  }
470
- // Evaluate return type (EC-8: required parser enforces this at parse time)
441
+ // Evaluate return type (EC-8: required -- parser enforces this at parse time)
471
442
  // returnType is PostfixExprNode (stops before pipe operators) so the
472
443
  // return type annotation cannot accidentally consume a trailing pipe chain.
473
444
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -475,11 +446,11 @@ function createTypesMixin(Base) {
475
446
  if (!isTypeValue(retVal)) {
476
447
  throw new RuntimeError('RILL-R004', `Closure type literal requires return type after |, got ${inferType(retVal)}`, location);
477
448
  }
478
- const ret = retVal.structure.type === 'any' &&
449
+ const ret = retVal.structure.kind === 'any' &&
479
450
  retVal.typeName !== 'any'
480
- ? { type: retVal.typeName }
451
+ ? { kind: retVal.typeName }
481
452
  : retVal.structure;
482
- const structure = { type: 'closure', params, ret };
453
+ const structure = { kind: 'closure', params, ret };
483
454
  return Object.freeze({
484
455
  __rill_type: true,
485
456
  typeName: 'closure',
@@ -492,4 +463,3 @@ function createTypesMixin(Base) {
492
463
  // TypeScript can't generate declarations for functions returning classes with protected members
493
464
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
494
465
  export const TypesMixin = createTypesMixin;
495
- //# sourceMappingURL=types.js.map