@rcrsr/rill 0.1.0 → 0.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 (260) hide show
  1. package/README.md +16 -8
  2. package/dist/check/config.d.ts +20 -0
  3. package/dist/check/config.d.ts.map +1 -0
  4. package/dist/check/config.js +151 -0
  5. package/dist/check/config.js.map +1 -0
  6. package/dist/check/fixer.d.ts +39 -0
  7. package/dist/check/fixer.d.ts.map +1 -0
  8. package/dist/check/fixer.js +119 -0
  9. package/dist/check/fixer.js.map +1 -0
  10. package/dist/check/index.d.ts +10 -0
  11. package/dist/check/index.d.ts.map +1 -0
  12. package/dist/check/index.js +21 -0
  13. package/dist/check/index.js.map +1 -0
  14. package/dist/check/rules/anti-patterns.d.ts +65 -0
  15. package/dist/check/rules/anti-patterns.d.ts.map +1 -0
  16. package/dist/check/rules/anti-patterns.js +427 -0
  17. package/dist/check/rules/anti-patterns.js.map +1 -0
  18. package/dist/check/rules/closures.d.ts +66 -0
  19. package/dist/check/rules/closures.d.ts.map +1 -0
  20. package/dist/check/rules/closures.js +373 -0
  21. package/dist/check/rules/closures.js.map +1 -0
  22. package/dist/check/rules/collections.d.ts +90 -0
  23. package/dist/check/rules/collections.d.ts.map +1 -0
  24. package/dist/check/rules/collections.js +373 -0
  25. package/dist/check/rules/collections.js.map +1 -0
  26. package/dist/check/rules/conditionals.d.ts +41 -0
  27. package/dist/check/rules/conditionals.d.ts.map +1 -0
  28. package/dist/check/rules/conditionals.js +106 -0
  29. package/dist/check/rules/conditionals.js.map +1 -0
  30. package/dist/check/rules/flow.d.ts +46 -0
  31. package/dist/check/rules/flow.d.ts.map +1 -0
  32. package/dist/check/rules/flow.js +206 -0
  33. package/dist/check/rules/flow.js.map +1 -0
  34. package/dist/check/rules/formatting.d.ts +133 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +639 -0
  37. package/dist/check/rules/formatting.js.map +1 -0
  38. package/dist/check/rules/helpers.d.ts +26 -0
  39. package/dist/check/rules/helpers.d.ts.map +1 -0
  40. package/dist/check/rules/helpers.js +66 -0
  41. package/dist/check/rules/helpers.js.map +1 -0
  42. package/dist/check/rules/index.d.ts +21 -0
  43. package/dist/check/rules/index.d.ts.map +1 -0
  44. package/dist/check/rules/index.js +78 -0
  45. package/dist/check/rules/index.js.map +1 -0
  46. package/dist/check/rules/loops.d.ts +70 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +227 -0
  49. package/dist/check/rules/loops.js.map +1 -0
  50. package/dist/check/rules/naming.d.ts +21 -0
  51. package/dist/check/rules/naming.d.ts.map +1 -0
  52. package/dist/check/rules/naming.js +167 -0
  53. package/dist/check/rules/naming.js.map +1 -0
  54. package/dist/check/rules/strings.d.ts +28 -0
  55. package/dist/check/rules/strings.d.ts.map +1 -0
  56. package/dist/check/rules/strings.js +80 -0
  57. package/dist/check/rules/strings.js.map +1 -0
  58. package/dist/check/rules/types.d.ts +41 -0
  59. package/dist/check/rules/types.d.ts.map +1 -0
  60. package/dist/check/rules/types.js +162 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +106 -0
  63. package/dist/check/types.d.ts.map +1 -0
  64. package/dist/check/types.js +6 -0
  65. package/dist/check/types.js.map +1 -0
  66. package/dist/check/validator.d.ts +18 -0
  67. package/dist/check/validator.d.ts.map +1 -0
  68. package/dist/check/validator.js +88 -0
  69. package/dist/check/validator.js.map +1 -0
  70. package/dist/check/visitor.d.ts +33 -0
  71. package/dist/check/visitor.d.ts.map +1 -0
  72. package/dist/check/visitor.js +243 -0
  73. package/dist/check/visitor.js.map +1 -0
  74. package/dist/cli-check.d.ts +43 -0
  75. package/dist/cli-check.d.ts.map +1 -0
  76. package/dist/cli-check.js +356 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-eval.d.ts +15 -0
  79. package/dist/cli-eval.d.ts.map +1 -0
  80. package/dist/cli-eval.js +120 -0
  81. package/dist/cli-eval.js.map +1 -0
  82. package/dist/cli-exec.d.ts +49 -0
  83. package/dist/cli-exec.d.ts.map +1 -0
  84. package/dist/cli-exec.js +191 -0
  85. package/dist/cli-exec.js.map +1 -0
  86. package/dist/cli-module-loader.d.ts +19 -0
  87. package/dist/cli-module-loader.d.ts.map +1 -0
  88. package/dist/cli-module-loader.js +83 -0
  89. package/dist/cli-module-loader.js.map +1 -0
  90. package/dist/cli-shared.d.ts +36 -0
  91. package/dist/cli-shared.d.ts.map +1 -0
  92. package/dist/cli-shared.js +101 -0
  93. package/dist/cli-shared.js.map +1 -0
  94. package/dist/cli.d.ts +2 -0
  95. package/dist/cli.d.ts.map +1 -1
  96. package/dist/cli.js +4 -11
  97. package/dist/cli.js.map +1 -1
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.d.ts.map +1 -1
  100. package/dist/index.js +1 -1
  101. package/dist/index.js.map +1 -1
  102. package/dist/lexer/readers.d.ts +1 -1
  103. package/dist/lexer/readers.d.ts.map +1 -1
  104. package/dist/lexer/readers.js +62 -32
  105. package/dist/lexer/readers.js.map +1 -1
  106. package/dist/lexer/tokenizer.d.ts.map +1 -1
  107. package/dist/lexer/tokenizer.js +5 -6
  108. package/dist/lexer/tokenizer.js.map +1 -1
  109. package/dist/parser/index.js +1 -1
  110. package/dist/parser/index.js.map +1 -1
  111. package/dist/parser/parser-expr.js +23 -5
  112. package/dist/parser/parser-expr.js.map +1 -1
  113. package/dist/parser/parser-functions.d.ts +2 -2
  114. package/dist/parser/parser-functions.d.ts.map +1 -1
  115. package/dist/parser/parser-functions.js +2 -1
  116. package/dist/parser/parser-functions.js.map +1 -1
  117. package/dist/parser/parser-literals.js +2 -2
  118. package/dist/parser/parser-literals.js.map +1 -1
  119. package/dist/parser/parser-script.js +9 -7
  120. package/dist/parser/parser-script.js.map +1 -1
  121. package/dist/parser/parser-variables.js +4 -3
  122. package/dist/parser/parser-variables.js.map +1 -1
  123. package/dist/runtime/core/callable.d.ts +5 -6
  124. package/dist/runtime/core/callable.d.ts.map +1 -1
  125. package/dist/runtime/core/callable.js.map +1 -1
  126. package/dist/runtime/core/context.d.ts.map +1 -1
  127. package/dist/runtime/core/context.js +19 -32
  128. package/dist/runtime/core/context.js.map +1 -1
  129. package/dist/runtime/core/equals.js +1 -1
  130. package/dist/runtime/core/equals.js.map +1 -1
  131. package/dist/runtime/core/eval/evaluator.d.ts +78 -0
  132. package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
  133. package/dist/runtime/core/eval/evaluator.js +78 -0
  134. package/dist/runtime/core/eval/evaluator.js.map +1 -1
  135. package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
  136. package/dist/runtime/core/eval/mixins/closures.js +9 -1
  137. package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
  138. package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
  139. package/dist/runtime/core/eval/mixins/variables.js +143 -2
  140. package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
  141. package/dist/runtime/core/types.d.ts +15 -2
  142. package/dist/runtime/core/types.d.ts.map +1 -1
  143. package/dist/runtime/core/types.js.map +1 -1
  144. package/dist/runtime/ext/extensions.d.ts +51 -0
  145. package/dist/runtime/ext/extensions.d.ts.map +1 -0
  146. package/dist/runtime/ext/extensions.js +67 -0
  147. package/dist/runtime/ext/extensions.js.map +1 -0
  148. package/dist/runtime/index.d.ts +3 -0
  149. package/dist/runtime/index.d.ts.map +1 -1
  150. package/dist/runtime/index.js +1 -0
  151. package/dist/runtime/index.js.map +1 -1
  152. package/dist/types.d.ts +8 -4
  153. package/dist/types.d.ts.map +1 -1
  154. package/dist/types.js +5 -4
  155. package/dist/types.js.map +1 -1
  156. package/docs/00_INDEX.md +1 -0
  157. package/docs/01_guide.md +3 -3
  158. package/docs/02_types.md +8 -10
  159. package/docs/03_variables.md +10 -0
  160. package/docs/04_operators.md +3 -3
  161. package/docs/05_control-flow.md +21 -0
  162. package/docs/07_collections.md +2 -0
  163. package/docs/10_parsing.md +9 -9
  164. package/docs/11_reference.md +1 -1
  165. package/docs/12_examples.md +36 -62
  166. package/docs/14_host-integration.md +116 -111
  167. package/docs/15_grammar.ebnf +1 -5
  168. package/docs/16_conventions.md +3 -4
  169. package/docs/17_cli-tools.md +184 -0
  170. package/docs/99_llm-reference.txt +46 -5
  171. package/package.json +13 -4
  172. package/dist/demo.d.ts +0 -6
  173. package/dist/demo.d.ts.map +0 -1
  174. package/dist/demo.js +0 -121
  175. package/dist/demo.js.map +0 -1
  176. package/dist/lexer.d.ts +0 -19
  177. package/dist/lexer.d.ts.map +0 -1
  178. package/dist/lexer.js +0 -344
  179. package/dist/lexer.js.map +0 -1
  180. package/dist/parser/arithmetic.d.ts +0 -16
  181. package/dist/parser/arithmetic.d.ts.map +0 -1
  182. package/dist/parser/arithmetic.js +0 -128
  183. package/dist/parser/arithmetic.js.map +0 -1
  184. package/dist/parser/boolean.d.ts +0 -15
  185. package/dist/parser/boolean.d.ts.map +0 -1
  186. package/dist/parser/boolean.js +0 -20
  187. package/dist/parser/boolean.js.map +0 -1
  188. package/dist/parser/control-flow.d.ts +0 -56
  189. package/dist/parser/control-flow.d.ts.map +0 -1
  190. package/dist/parser/control-flow.js +0 -167
  191. package/dist/parser/control-flow.js.map +0 -1
  192. package/dist/parser/expressions.d.ts +0 -23
  193. package/dist/parser/expressions.d.ts.map +0 -1
  194. package/dist/parser/expressions.js +0 -950
  195. package/dist/parser/expressions.js.map +0 -1
  196. package/dist/parser/extraction.d.ts +0 -48
  197. package/dist/parser/extraction.d.ts.map +0 -1
  198. package/dist/parser/extraction.js +0 -279
  199. package/dist/parser/extraction.js.map +0 -1
  200. package/dist/parser/functions.d.ts +0 -20
  201. package/dist/parser/functions.d.ts.map +0 -1
  202. package/dist/parser/functions.js +0 -96
  203. package/dist/parser/functions.js.map +0 -1
  204. package/dist/parser/literals.d.ts +0 -37
  205. package/dist/parser/literals.d.ts.map +0 -1
  206. package/dist/parser/literals.js +0 -373
  207. package/dist/parser/literals.js.map +0 -1
  208. package/dist/parser/script.d.ts +0 -14
  209. package/dist/parser/script.d.ts.map +0 -1
  210. package/dist/parser/script.js +0 -196
  211. package/dist/parser/script.js.map +0 -1
  212. package/dist/parser/variables.d.ts +0 -10
  213. package/dist/parser/variables.d.ts.map +0 -1
  214. package/dist/parser/variables.js +0 -215
  215. package/dist/parser/variables.js.map +0 -1
  216. package/dist/runtime/ast-equals.d.ts +0 -13
  217. package/dist/runtime/ast-equals.d.ts.map +0 -1
  218. package/dist/runtime/ast-equals.js +0 -447
  219. package/dist/runtime/ast-equals.js.map +0 -1
  220. package/dist/runtime/builtins.d.ts +0 -13
  221. package/dist/runtime/builtins.d.ts.map +0 -1
  222. package/dist/runtime/builtins.js +0 -180
  223. package/dist/runtime/builtins.js.map +0 -1
  224. package/dist/runtime/callable.d.ts +0 -88
  225. package/dist/runtime/callable.d.ts.map +0 -1
  226. package/dist/runtime/callable.js +0 -98
  227. package/dist/runtime/callable.js.map +0 -1
  228. package/dist/runtime/context.d.ts +0 -13
  229. package/dist/runtime/context.d.ts.map +0 -1
  230. package/dist/runtime/context.js +0 -73
  231. package/dist/runtime/context.js.map +0 -1
  232. package/dist/runtime/core/evaluate.d.ts +0 -42
  233. package/dist/runtime/core/evaluate.d.ts.map +0 -1
  234. package/dist/runtime/core/evaluate.debug.js +0 -1251
  235. package/dist/runtime/core/evaluate.js +0 -1913
  236. package/dist/runtime/core/evaluate.js.map +0 -1
  237. package/dist/runtime/evaluate.d.ts +0 -32
  238. package/dist/runtime/evaluate.d.ts.map +0 -1
  239. package/dist/runtime/evaluate.js +0 -1111
  240. package/dist/runtime/evaluate.js.map +0 -1
  241. package/dist/runtime/execute.d.ts +0 -26
  242. package/dist/runtime/execute.d.ts.map +0 -1
  243. package/dist/runtime/execute.js +0 -121
  244. package/dist/runtime/execute.js.map +0 -1
  245. package/dist/runtime/signals.d.ts +0 -19
  246. package/dist/runtime/signals.d.ts.map +0 -1
  247. package/dist/runtime/signals.js +0 -26
  248. package/dist/runtime/signals.js.map +0 -1
  249. package/dist/runtime/types.d.ts +0 -169
  250. package/dist/runtime/types.d.ts.map +0 -1
  251. package/dist/runtime/types.js +0 -50
  252. package/dist/runtime/types.js.map +0 -1
  253. package/dist/runtime/values.d.ts +0 -50
  254. package/dist/runtime/values.d.ts.map +0 -1
  255. package/dist/runtime/values.js +0 -209
  256. package/dist/runtime/values.js.map +0 -1
  257. package/dist/runtime.d.ts +0 -254
  258. package/dist/runtime.d.ts.map +0 -1
  259. package/dist/runtime.js +0 -2014
  260. package/dist/runtime.js.map +0 -1
@@ -1,215 +0,0 @@
1
- /**
2
- * Variable Parsing
3
- * Variables and field access
4
- */
5
- import { TOKEN_TYPES } from '../types.js';
6
- import { check, advance, expect, makeSpan } from './state.js';
7
- import { isMethodCallWithArgs, VALID_TYPE_NAMES, parseTypeName, } from './helpers.js';
8
- // Circular dependency: these will be injected by expressions.ts
9
- let parseBlockFn = null;
10
- let parsePipeChainFn = null;
11
- export function setParseBlock(fn) {
12
- parseBlockFn = fn;
13
- }
14
- export function setParsePipeChain(fn) {
15
- parsePipeChainFn = fn;
16
- }
17
- // ============================================================
18
- // VARIABLE PARSING
19
- // ============================================================
20
- export function parseVariable(state) {
21
- const start = state.tokens[state.pos].span.start;
22
- if (check(state, TOKEN_TYPES.PIPE_VAR)) {
23
- advance(state);
24
- return makeVariableWithAccess(null, true, start, state);
25
- }
26
- const dollarToken = expect(state, TOKEN_TYPES.DOLLAR, 'Expected $');
27
- // Special case: $@ is the accumulator variable (used in each/fold with block form)
28
- if (dollarToken.value === '$@') {
29
- return makeVariableWithAccess('@', false, start, state);
30
- }
31
- const nameToken = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected variable name');
32
- return makeVariableWithAccess(nameToken.value, false, start, state);
33
- }
34
- /**
35
- * Parse variable with field access, bracket access, existence checks, and defaults.
36
- */
37
- function makeVariableWithAccess(name, isPipeVar, start, state) {
38
- // Parse mixed dot and bracket access chain (unified, ordered)
39
- const { accessChain, existenceCheck } = parseAccessChain(state);
40
- // Parse optional default value: ?? default
41
- let defaultValue = null;
42
- if (check(state, TOKEN_TYPES.NULLISH_COALESCE) && !existenceCheck) {
43
- advance(state); // consume ??
44
- defaultValue = parseDefaultValue(state);
45
- }
46
- // Separate for backward compatibility (deprecated)
47
- const fields = accessChain.filter((a) => !('accessKind' in a));
48
- const brackets = accessChain.filter((a) => 'accessKind' in a && a.accessKind === 'bracket');
49
- return {
50
- type: 'Variable',
51
- name,
52
- isPipeVar,
53
- accessChain,
54
- fieldAccess: fields,
55
- bracketAccess: brackets,
56
- defaultValue,
57
- existenceCheck,
58
- span: makeSpan(start, start), // Updated later
59
- };
60
- }
61
- /**
62
- * Parse mixed access chain: dot-based field access and bracket-based index access.
63
- * Returns unified accessChain maintaining the order of accesses.
64
- * Also detects existence checks (.?).
65
- */
66
- function parseAccessChain(state) {
67
- const accessChain = [];
68
- let existenceCheck = null;
69
- while (check(state, TOKEN_TYPES.DOT, TOKEN_TYPES.DOT_QUESTION, TOKEN_TYPES.LBRACKET)) {
70
- // Check if this is a method call (has parens after identifier)
71
- if (check(state, TOKEN_TYPES.DOT) && isMethodCallWithArgs(state)) {
72
- break;
73
- }
74
- // Bracket access: [expr]
75
- if (check(state, TOKEN_TYPES.LBRACKET)) {
76
- advance(state); // consume [
77
- if (!parsePipeChainFn) {
78
- throw new Error('parsePipeChain not injected');
79
- }
80
- const expression = parsePipeChainFn(state);
81
- expect(state, TOKEN_TYPES.RBRACKET, 'Expected ] after index expression');
82
- accessChain.push({ accessKind: 'bracket', expression });
83
- continue;
84
- }
85
- // Check for existence check: .?
86
- if (check(state, TOKEN_TYPES.DOT_QUESTION)) {
87
- advance(state); // consume .?
88
- const finalAccess = parseFieldAccessElement(state);
89
- if (!finalAccess) {
90
- break; // Invalid, stop parsing
91
- }
92
- // Check for type constraint: &type
93
- let typeName = null;
94
- if (check(state, TOKEN_TYPES.AMPERSAND)) {
95
- advance(state); // consume &
96
- typeName = parseTypeName(state, VALID_TYPE_NAMES);
97
- }
98
- existenceCheck = { finalAccess, typeName };
99
- break; // Existence check must be at end
100
- }
101
- // Dot access: .field
102
- advance(state); // consume .
103
- const access = parseFieldAccessElement(state);
104
- if (!access) {
105
- break;
106
- }
107
- accessChain.push(access);
108
- }
109
- return { accessChain, existenceCheck };
110
- }
111
- /**
112
- * Parse a single field access element (dot-based, no numeric indices).
113
- * Returns null if no valid element found.
114
- * Note: Numeric indices use bracket syntax [0], [-1] instead of dot.
115
- */
116
- function parseFieldAccessElement(state) {
117
- // Variable as key: $identifier
118
- if (check(state, TOKEN_TYPES.DOLLAR)) {
119
- advance(state); // consume $
120
- const nameToken = expect(state, TOKEN_TYPES.IDENTIFIER, 'Expected variable name after .$');
121
- return { kind: 'variable', variableName: nameToken.value };
122
- }
123
- // Computed expression or alternatives: (expr) or (a || b)
124
- if (check(state, TOKEN_TYPES.LPAREN)) {
125
- return parseComputedOrAlternatives(state);
126
- }
127
- // Block returning key: {block}
128
- if (check(state, TOKEN_TYPES.LBRACE)) {
129
- if (!parseBlockFn) {
130
- throw new Error('parseBlock not injected');
131
- }
132
- const block = parseBlockFn(state);
133
- return { kind: 'block', block };
134
- }
135
- // Identifier (literal field)
136
- if (check(state, TOKEN_TYPES.IDENTIFIER)) {
137
- return { kind: 'literal', field: advance(state).value };
138
- }
139
- return null;
140
- }
141
- /**
142
- * Parse computed expression .(expr) or alternatives .(a || b).
143
- */
144
- function parseComputedOrAlternatives(state) {
145
- advance(state); // consume (
146
- // Look ahead to detect alternatives pattern: identifier || identifier
147
- // Alternatives are a sequence of identifiers separated by ||
148
- const alternatives = tryParseAlternatives(state);
149
- if (alternatives) {
150
- expect(state, TOKEN_TYPES.RPAREN, 'Expected ) after alternatives');
151
- return { kind: 'alternatives', alternatives };
152
- }
153
- // Otherwise, parse as computed expression
154
- if (!parsePipeChainFn) {
155
- throw new Error('parsePipeChain not injected');
156
- }
157
- const expression = parsePipeChainFn(state);
158
- expect(state, TOKEN_TYPES.RPAREN, 'Expected ) after expression');
159
- return { kind: 'computed', expression };
160
- }
161
- /**
162
- * Try to parse alternatives: a || b || c
163
- * Returns array of identifiers if successful, null otherwise.
164
- */
165
- function tryParseAlternatives(state) {
166
- // Save position for backtracking
167
- const savedPos = state.pos;
168
- const alternatives = [];
169
- // First identifier
170
- if (!check(state, TOKEN_TYPES.IDENTIFIER)) {
171
- return null;
172
- }
173
- alternatives.push(advance(state).value);
174
- // Must have at least one ||
175
- if (!check(state, TOKEN_TYPES.OR)) {
176
- // Not alternatives pattern, backtrack
177
- state.pos = savedPos;
178
- return null;
179
- }
180
- // Parse remaining: || identifier
181
- while (check(state, TOKEN_TYPES.OR)) {
182
- advance(state); // consume ||
183
- if (!check(state, TOKEN_TYPES.IDENTIFIER)) {
184
- // Invalid alternatives pattern, backtrack
185
- state.pos = savedPos;
186
- return null;
187
- }
188
- alternatives.push(advance(state).value);
189
- }
190
- // Must end with )
191
- if (!check(state, TOKEN_TYPES.RPAREN)) {
192
- // Not a valid alternatives pattern, backtrack
193
- state.pos = savedPos;
194
- return null;
195
- }
196
- return alternatives;
197
- }
198
- /**
199
- * Parse default value after ??.
200
- * Can be: block, grouped expression, or simple expression.
201
- */
202
- function parseDefaultValue(state) {
203
- if (check(state, TOKEN_TYPES.LBRACE)) {
204
- if (!parseBlockFn) {
205
- throw new Error('parseBlock not injected');
206
- }
207
- return parseBlockFn(state);
208
- }
209
- if (!parsePipeChainFn) {
210
- throw new Error('parsePipeChain not injected');
211
- }
212
- // Parse a simple expression (not a full pipe chain to avoid ambiguity)
213
- return parsePipeChainFn(state);
214
- }
215
- //# sourceMappingURL=variables.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"variables.js","sourceRoot":"","sources":["../../src/parser/variables.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * AST Structural Equality
3
- *
4
- * Compares AST nodes for structural equality, ignoring source locations.
5
- * Used for closure equality: two closures with identical structure are equal.
6
- */
7
- import type { ASTNode } from '../types.js';
8
- /**
9
- * Compare two AST nodes for structural equality.
10
- * Ignores source locations (span) - only compares structure and values.
11
- */
12
- export declare function astEquals(a: ASTNode, b: ASTNode): boolean;
13
- //# sourceMappingURL=ast-equals.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-equals.d.ts","sourceRoot":"","sources":["../../src/runtime/ast-equals.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,OAAO,EAgCR,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAsHzD"}
@@ -1,447 +0,0 @@
1
- /**
2
- * AST Structural Equality
3
- *
4
- * Compares AST nodes for structural equality, ignoring source locations.
5
- * Used for closure equality: two closures with identical structure are equal.
6
- */
7
- /**
8
- * Compare two AST nodes for structural equality.
9
- * Ignores source locations (span) - only compares structure and values.
10
- */
11
- export function astEquals(a, b) {
12
- // Different node types are never equal
13
- if (a.type !== b.type)
14
- return false;
15
- switch (a.type) {
16
- case 'Block':
17
- return blockEquals(a, b);
18
- case 'Statement':
19
- return statementEquals(a, b);
20
- case 'PipeChain':
21
- return pipeChainEquals(a, b);
22
- case 'PostfixExpr':
23
- return postfixExprEquals(a, b);
24
- case 'StringLiteral':
25
- return stringLiteralEquals(a, b);
26
- case 'NumberLiteral':
27
- return a.value === b.value;
28
- case 'BoolLiteral':
29
- return a.value === b.value;
30
- case 'Variable':
31
- return variableEquals(a, b);
32
- case 'FunctionCall':
33
- return functionCallEquals(a, b);
34
- case 'VariableCall':
35
- return variableCallEquals(a, b);
36
- case 'MethodCall':
37
- return methodCallEquals(a, b);
38
- case 'Invoke':
39
- return invokeEquals(a, b);
40
- case 'Conditional':
41
- return conditionalEquals(a, b);
42
- case 'WhileLoop':
43
- return whileLoopEquals(a, b);
44
- case 'ForLoop':
45
- return forLoopEquals(a, b);
46
- case 'Tuple':
47
- return tupleEquals(a, b);
48
- case 'Dict':
49
- return dictEquals(a, b);
50
- case 'DictEntry':
51
- return dictEntryEquals(a, b);
52
- case 'FunctionLiteral':
53
- return functionLiteralEquals(a, b);
54
- case 'FuncParam':
55
- return funcParamEquals(a, b);
56
- case 'Arithmetic':
57
- return arithmeticEquals(a, b);
58
- case 'BoolExpr':
59
- return boolExprEquals(a, b);
60
- case 'Comparison':
61
- return comparisonEquals(a, b);
62
- case 'ParallelSpread':
63
- return parallelSpreadEquals(a, b);
64
- case 'ParallelFilter':
65
- return parallelFilterEquals(a, b);
66
- case 'SequentialSpread':
67
- return sequentialSpreadEquals(a, b);
68
- case 'Destructure':
69
- return destructureEquals(a, b);
70
- case 'DestructElem':
71
- return destructElemEquals(a, b);
72
- case 'Slice':
73
- return sliceEquals(a, b);
74
- case 'Enumerate':
75
- return true; // EnumerateNode has no fields besides type and span
76
- case 'Spread':
77
- return spreadEquals(a, b);
78
- case 'Capture':
79
- return a.name === b.name && a.typeName === b.typeName;
80
- case 'Break':
81
- case 'Return':
82
- return a.value === null
83
- ? b.value === null
84
- : b.value !== null &&
85
- astEquals(a.value, b.value);
86
- case 'Interpolation':
87
- return expressionEquals(a.expression, b.expression);
88
- default:
89
- // For any unhandled node types, fall back to false
90
- return false;
91
- }
92
- }
93
- function blockEquals(a, b) {
94
- if (a.statements.length !== b.statements.length)
95
- return false;
96
- for (let i = 0; i < a.statements.length; i++) {
97
- if (!statementEquals(a.statements[i], b.statements[i]))
98
- return false;
99
- }
100
- return true;
101
- }
102
- function statementEquals(a, b) {
103
- if (a.terminator !== b.terminator)
104
- return false;
105
- // Compare captures
106
- if (a.capture === null && b.capture !== null)
107
- return false;
108
- if (a.capture !== null && b.capture === null)
109
- return false;
110
- if (a.capture !== null && b.capture !== null) {
111
- if (a.capture.name !== b.capture.name)
112
- return false;
113
- if (a.capture.typeName !== b.capture.typeName)
114
- return false;
115
- }
116
- return expressionEquals(a.expression, b.expression);
117
- }
118
- function expressionEquals(a, b) {
119
- return pipeChainEquals(a, b);
120
- }
121
- function pipeChainEquals(a, b) {
122
- if (!postfixExprEquals(a.head, b.head))
123
- return false;
124
- if (a.pipes.length !== b.pipes.length)
125
- return false;
126
- for (let i = 0; i < a.pipes.length; i++) {
127
- if (!astEquals(a.pipes[i], b.pipes[i]))
128
- return false;
129
- }
130
- return true;
131
- }
132
- function postfixExprEquals(a, b) {
133
- if (!astEquals(a.primary, b.primary))
134
- return false;
135
- if (a.methods.length !== b.methods.length)
136
- return false;
137
- for (let i = 0; i < a.methods.length; i++) {
138
- if (!methodCallEquals(a.methods[i], b.methods[i]))
139
- return false;
140
- }
141
- return true;
142
- }
143
- function stringLiteralEquals(a, b) {
144
- if (a.isHeredoc !== b.isHeredoc)
145
- return false;
146
- if (a.parts.length !== b.parts.length)
147
- return false;
148
- for (let i = 0; i < a.parts.length; i++) {
149
- const aPart = a.parts[i];
150
- const bPart = b.parts[i];
151
- if (typeof aPart === 'string') {
152
- if (typeof bPart !== 'string' || aPart !== bPart)
153
- return false;
154
- }
155
- else {
156
- if (typeof bPart === 'string')
157
- return false;
158
- if (!expressionEquals(aPart.expression, bPart.expression))
159
- return false;
160
- }
161
- }
162
- return true;
163
- }
164
- function variableEquals(a, b) {
165
- if (a.name !== b.name)
166
- return false;
167
- if (a.isPipeVar !== b.isPipeVar)
168
- return false;
169
- if (a.fieldAccess.length !== b.fieldAccess.length)
170
- return false;
171
- for (let i = 0; i < a.fieldAccess.length; i++) {
172
- if (a.fieldAccess[i].field !== b.fieldAccess[i].field)
173
- return false;
174
- }
175
- return true;
176
- }
177
- function functionCallEquals(a, b) {
178
- if (a.name !== b.name)
179
- return false;
180
- return argsListEquals(a.args, b.args);
181
- }
182
- function variableCallEquals(a, b) {
183
- if (a.name !== b.name)
184
- return false;
185
- return argsListEquals(a.args, b.args);
186
- }
187
- function methodCallEquals(a, b) {
188
- if (a.name !== b.name)
189
- return false;
190
- return argsListEquals(a.args, b.args);
191
- }
192
- function invokeEquals(a, b) {
193
- return argsListEquals(a.args, b.args);
194
- }
195
- function argsListEquals(a, b) {
196
- if (a.length !== b.length)
197
- return false;
198
- for (let i = 0; i < a.length; i++) {
199
- if (!expressionEquals(a[i], b[i]))
200
- return false;
201
- }
202
- return true;
203
- }
204
- function conditionalEquals(a, b) {
205
- // Compare input
206
- if (a.input === null && b.input !== null)
207
- return false;
208
- if (a.input !== null && b.input === null)
209
- return false;
210
- if (a.input !== null && b.input !== null) {
211
- if (!expressionEquals(a.input, b.input))
212
- return false;
213
- }
214
- // Compare condition
215
- if (a.condition === null && b.condition !== null)
216
- return false;
217
- if (a.condition !== null && b.condition === null)
218
- return false;
219
- if (a.condition !== null && b.condition !== null) {
220
- if (!boolExprEquals(a.condition, b.condition))
221
- return false;
222
- }
223
- // Compare then block
224
- if (!blockEquals(a.thenBlock, b.thenBlock))
225
- return false;
226
- // Compare else clause
227
- if (a.elseClause === null && b.elseClause !== null)
228
- return false;
229
- if (a.elseClause !== null && b.elseClause === null)
230
- return false;
231
- if (a.elseClause !== null && b.elseClause !== null) {
232
- if (!astEquals(a.elseClause, b.elseClause))
233
- return false;
234
- }
235
- return true;
236
- }
237
- function whileLoopEquals(a, b) {
238
- // Compare input
239
- if (a.input === null && b.input !== null)
240
- return false;
241
- if (a.input !== null && b.input === null)
242
- return false;
243
- if (a.input !== null && b.input !== null) {
244
- if (!expressionEquals(a.input, b.input))
245
- return false;
246
- }
247
- // Compare condition
248
- if (!boolExprEquals(a.condition, b.condition))
249
- return false;
250
- // Compare max iterations
251
- if (a.maxIterations === null && b.maxIterations !== null)
252
- return false;
253
- if (a.maxIterations !== null && b.maxIterations === null)
254
- return false;
255
- if (a.maxIterations !== null && b.maxIterations !== null) {
256
- if (!expressionEquals(a.maxIterations, b.maxIterations))
257
- return false;
258
- }
259
- return blockEquals(a.body, b.body);
260
- }
261
- function forLoopEquals(a, b) {
262
- // Compare input
263
- if (a.input === null && b.input !== null)
264
- return false;
265
- if (a.input !== null && b.input === null)
266
- return false;
267
- if (a.input !== null && b.input !== null) {
268
- if (!expressionEquals(a.input, b.input))
269
- return false;
270
- }
271
- return blockEquals(a.body, b.body);
272
- }
273
- function tupleEquals(a, b) {
274
- return argsListEquals(a.elements, b.elements);
275
- }
276
- function dictEquals(a, b) {
277
- if (a.entries.length !== b.entries.length)
278
- return false;
279
- for (let i = 0; i < a.entries.length; i++) {
280
- if (!dictEntryEquals(a.entries[i], b.entries[i]))
281
- return false;
282
- }
283
- return true;
284
- }
285
- function dictEntryEquals(a, b) {
286
- if (a.key !== b.key)
287
- return false;
288
- return expressionEquals(a.value, b.value);
289
- }
290
- function functionLiteralEquals(a, b) {
291
- if (a.params.length !== b.params.length)
292
- return false;
293
- for (let i = 0; i < a.params.length; i++) {
294
- if (!funcParamEquals(a.params[i], b.params[i]))
295
- return false;
296
- }
297
- return blockEquals(a.body, b.body);
298
- }
299
- function funcParamEquals(a, b) {
300
- if (a.name !== b.name)
301
- return false;
302
- if (a.typeName !== b.typeName)
303
- return false;
304
- if (a.defaultValue === null && b.defaultValue !== null)
305
- return false;
306
- if (a.defaultValue !== null && b.defaultValue === null)
307
- return false;
308
- if (a.defaultValue !== null && b.defaultValue !== null) {
309
- if (!astEquals(a.defaultValue, b.defaultValue))
310
- return false;
311
- }
312
- return true;
313
- }
314
- function arithmeticEquals(a, b) {
315
- if (a.op !== b.op)
316
- return false;
317
- if (!astEquals(a.left, b.left))
318
- return false;
319
- if (a.right === null && b.right !== null)
320
- return false;
321
- if (a.right !== null && b.right === null)
322
- return false;
323
- if (a.right !== null && b.right !== null) {
324
- if (!astEquals(a.right, b.right))
325
- return false;
326
- }
327
- return true;
328
- }
329
- function boolExprEquals(a, b) {
330
- if (a.type !== b.type)
331
- return false;
332
- if (a.type === 'Comparison') {
333
- return comparisonEquals(a, b);
334
- }
335
- // BoolExpr nodes
336
- if (a.op !== b.op)
337
- return false;
338
- if (a.op === 'not') {
339
- return boolExprEquals(a.operand, b.operand);
340
- }
341
- // 'and' or 'or'
342
- const aOperands = a.operands;
343
- const bOperands = b.operands;
344
- if (aOperands.length !== bOperands.length)
345
- return false;
346
- for (let i = 0; i < aOperands.length; i++) {
347
- if (!boolExprEquals(aOperands[i], bOperands[i]))
348
- return false;
349
- }
350
- return true;
351
- }
352
- function comparisonEquals(a, b) {
353
- if (a.op !== b.op)
354
- return false;
355
- if (!astEquals(a.left, b.left))
356
- return false;
357
- if (a.right === null && b.right !== null)
358
- return false;
359
- if (a.right !== null && b.right === null)
360
- return false;
361
- if (a.right !== null && b.right !== null) {
362
- if (!astEquals(a.right, b.right))
363
- return false;
364
- }
365
- return true;
366
- }
367
- function parallelSpreadEquals(a, b) {
368
- return expressionEquals(a.target, b.target);
369
- }
370
- function parallelFilterEquals(a, b) {
371
- if (a.predicate.type !== b.predicate.type)
372
- return false;
373
- return astEquals(a.predicate, b.predicate);
374
- }
375
- function sequentialSpreadEquals(a, b) {
376
- return expressionEquals(a.target, b.target);
377
- }
378
- function destructureEquals(a, b) {
379
- if (a.elements.length !== b.elements.length)
380
- return false;
381
- for (let i = 0; i < a.elements.length; i++) {
382
- if (!destructElemEquals(a.elements[i], b.elements[i]))
383
- return false;
384
- }
385
- return true;
386
- }
387
- function destructElemEquals(a, b) {
388
- if (a.kind !== b.kind)
389
- return false;
390
- if (a.name !== b.name)
391
- return false;
392
- if (a.key !== b.key)
393
- return false;
394
- if (a.typeName !== b.typeName)
395
- return false;
396
- if (a.nested === null && b.nested !== null)
397
- return false;
398
- if (a.nested !== null && b.nested === null)
399
- return false;
400
- if (a.nested !== null && b.nested !== null) {
401
- if (!destructureEquals(a.nested, b.nested))
402
- return false;
403
- }
404
- return true;
405
- }
406
- function sliceEquals(a, b) {
407
- // Compare start
408
- if (a.start === null && b.start !== null)
409
- return false;
410
- if (a.start !== null && b.start === null)
411
- return false;
412
- if (a.start !== null && b.start !== null) {
413
- if (!astEquals(a.start, b.start))
414
- return false;
415
- }
416
- // Compare stop
417
- if (a.stop === null && b.stop !== null)
418
- return false;
419
- if (a.stop !== null && b.stop === null)
420
- return false;
421
- if (a.stop !== null && b.stop !== null) {
422
- if (!astEquals(a.stop, b.stop))
423
- return false;
424
- }
425
- // Compare step
426
- if (a.step === null && b.step !== null)
427
- return false;
428
- if (a.step !== null && b.step === null)
429
- return false;
430
- if (a.step !== null && b.step !== null) {
431
- if (!astEquals(a.step, b.step))
432
- return false;
433
- }
434
- return true;
435
- }
436
- function spreadEquals(a, b) {
437
- if (a.operand === null && b.operand !== null)
438
- return false;
439
- if (a.operand !== null && b.operand === null)
440
- return false;
441
- if (a.operand !== null && b.operand !== null) {
442
- if (!expressionEquals(a.operand, b.operand))
443
- return false;
444
- }
445
- return true;
446
- }
447
- //# sourceMappingURL=ast-equals.js.map