@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.
- package/README.md +16 -8
- package/dist/check/config.d.ts +20 -0
- package/dist/check/config.d.ts.map +1 -0
- package/dist/check/config.js +151 -0
- package/dist/check/config.js.map +1 -0
- package/dist/check/fixer.d.ts +39 -0
- package/dist/check/fixer.d.ts.map +1 -0
- package/dist/check/fixer.js +119 -0
- package/dist/check/fixer.js.map +1 -0
- package/dist/check/index.d.ts +10 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +21 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/rules/anti-patterns.d.ts +65 -0
- package/dist/check/rules/anti-patterns.d.ts.map +1 -0
- package/dist/check/rules/anti-patterns.js +427 -0
- package/dist/check/rules/anti-patterns.js.map +1 -0
- package/dist/check/rules/closures.d.ts +66 -0
- package/dist/check/rules/closures.d.ts.map +1 -0
- package/dist/check/rules/closures.js +373 -0
- package/dist/check/rules/closures.js.map +1 -0
- package/dist/check/rules/collections.d.ts +90 -0
- package/dist/check/rules/collections.d.ts.map +1 -0
- package/dist/check/rules/collections.js +373 -0
- package/dist/check/rules/collections.js.map +1 -0
- package/dist/check/rules/conditionals.d.ts +41 -0
- package/dist/check/rules/conditionals.d.ts.map +1 -0
- package/dist/check/rules/conditionals.js +106 -0
- package/dist/check/rules/conditionals.js.map +1 -0
- package/dist/check/rules/flow.d.ts +46 -0
- package/dist/check/rules/flow.d.ts.map +1 -0
- package/dist/check/rules/flow.js +206 -0
- package/dist/check/rules/flow.js.map +1 -0
- package/dist/check/rules/formatting.d.ts +133 -0
- package/dist/check/rules/formatting.d.ts.map +1 -0
- package/dist/check/rules/formatting.js +639 -0
- package/dist/check/rules/formatting.js.map +1 -0
- package/dist/check/rules/helpers.d.ts +26 -0
- package/dist/check/rules/helpers.d.ts.map +1 -0
- package/dist/check/rules/helpers.js +66 -0
- package/dist/check/rules/helpers.js.map +1 -0
- package/dist/check/rules/index.d.ts +21 -0
- package/dist/check/rules/index.d.ts.map +1 -0
- package/dist/check/rules/index.js +78 -0
- package/dist/check/rules/index.js.map +1 -0
- package/dist/check/rules/loops.d.ts +70 -0
- package/dist/check/rules/loops.d.ts.map +1 -0
- package/dist/check/rules/loops.js +227 -0
- package/dist/check/rules/loops.js.map +1 -0
- package/dist/check/rules/naming.d.ts +21 -0
- package/dist/check/rules/naming.d.ts.map +1 -0
- package/dist/check/rules/naming.js +167 -0
- package/dist/check/rules/naming.js.map +1 -0
- package/dist/check/rules/strings.d.ts +28 -0
- package/dist/check/rules/strings.d.ts.map +1 -0
- package/dist/check/rules/strings.js +80 -0
- package/dist/check/rules/strings.js.map +1 -0
- package/dist/check/rules/types.d.ts +41 -0
- package/dist/check/rules/types.d.ts.map +1 -0
- package/dist/check/rules/types.js +162 -0
- package/dist/check/rules/types.js.map +1 -0
- package/dist/check/types.d.ts +106 -0
- package/dist/check/types.d.ts.map +1 -0
- package/dist/check/types.js +6 -0
- package/dist/check/types.js.map +1 -0
- package/dist/check/validator.d.ts +18 -0
- package/dist/check/validator.d.ts.map +1 -0
- package/dist/check/validator.js +88 -0
- package/dist/check/validator.js.map +1 -0
- package/dist/check/visitor.d.ts +33 -0
- package/dist/check/visitor.d.ts.map +1 -0
- package/dist/check/visitor.js +243 -0
- package/dist/check/visitor.js.map +1 -0
- package/dist/cli-check.d.ts +43 -0
- package/dist/cli-check.d.ts.map +1 -0
- package/dist/cli-check.js +356 -0
- package/dist/cli-check.js.map +1 -0
- package/dist/cli-eval.d.ts +15 -0
- package/dist/cli-eval.d.ts.map +1 -0
- package/dist/cli-eval.js +120 -0
- package/dist/cli-eval.js.map +1 -0
- package/dist/cli-exec.d.ts +49 -0
- package/dist/cli-exec.d.ts.map +1 -0
- package/dist/cli-exec.js +191 -0
- package/dist/cli-exec.js.map +1 -0
- package/dist/cli-module-loader.d.ts +19 -0
- package/dist/cli-module-loader.d.ts.map +1 -0
- package/dist/cli-module-loader.js +83 -0
- package/dist/cli-module-loader.js.map +1 -0
- package/dist/cli-shared.d.ts +36 -0
- package/dist/cli-shared.d.ts.map +1 -0
- package/dist/cli-shared.js +101 -0
- package/dist/cli-shared.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -11
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lexer/readers.d.ts +1 -1
- package/dist/lexer/readers.d.ts.map +1 -1
- package/dist/lexer/readers.js +62 -32
- package/dist/lexer/readers.js.map +1 -1
- package/dist/lexer/tokenizer.d.ts.map +1 -1
- package/dist/lexer/tokenizer.js +5 -6
- package/dist/lexer/tokenizer.js.map +1 -1
- package/dist/parser/index.js +1 -1
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/parser-expr.js +23 -5
- package/dist/parser/parser-expr.js.map +1 -1
- package/dist/parser/parser-functions.d.ts +2 -2
- package/dist/parser/parser-functions.d.ts.map +1 -1
- package/dist/parser/parser-functions.js +2 -1
- package/dist/parser/parser-functions.js.map +1 -1
- package/dist/parser/parser-literals.js +2 -2
- package/dist/parser/parser-literals.js.map +1 -1
- package/dist/parser/parser-script.js +9 -7
- package/dist/parser/parser-script.js.map +1 -1
- package/dist/parser/parser-variables.js +4 -3
- package/dist/parser/parser-variables.js.map +1 -1
- package/dist/runtime/core/callable.d.ts +5 -6
- package/dist/runtime/core/callable.d.ts.map +1 -1
- package/dist/runtime/core/callable.js.map +1 -1
- package/dist/runtime/core/context.d.ts.map +1 -1
- package/dist/runtime/core/context.js +19 -32
- package/dist/runtime/core/context.js.map +1 -1
- package/dist/runtime/core/equals.js +1 -1
- package/dist/runtime/core/equals.js.map +1 -1
- package/dist/runtime/core/eval/evaluator.d.ts +78 -0
- package/dist/runtime/core/eval/evaluator.d.ts.map +1 -1
- package/dist/runtime/core/eval/evaluator.js +78 -0
- package/dist/runtime/core/eval/evaluator.js.map +1 -1
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +1 -1
- package/dist/runtime/core/eval/mixins/closures.js +9 -1
- package/dist/runtime/core/eval/mixins/closures.js.map +1 -1
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +1 -1
- package/dist/runtime/core/eval/mixins/variables.js +143 -2
- package/dist/runtime/core/eval/mixins/variables.js.map +1 -1
- package/dist/runtime/core/types.d.ts +15 -2
- package/dist/runtime/core/types.d.ts.map +1 -1
- package/dist/runtime/core/types.js.map +1 -1
- package/dist/runtime/ext/extensions.d.ts +51 -0
- package/dist/runtime/ext/extensions.d.ts.map +1 -0
- package/dist/runtime/ext/extensions.js +67 -0
- package/dist/runtime/ext/extensions.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/index.js.map +1 -1
- package/dist/types.d.ts +8 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +5 -4
- package/dist/types.js.map +1 -1
- package/docs/00_INDEX.md +1 -0
- package/docs/01_guide.md +3 -3
- package/docs/02_types.md +8 -10
- package/docs/03_variables.md +10 -0
- package/docs/04_operators.md +3 -3
- package/docs/05_control-flow.md +21 -0
- package/docs/07_collections.md +2 -0
- package/docs/10_parsing.md +9 -9
- package/docs/11_reference.md +1 -1
- package/docs/12_examples.md +36 -62
- package/docs/14_host-integration.md +116 -111
- package/docs/15_grammar.ebnf +1 -5
- package/docs/16_conventions.md +3 -4
- package/docs/17_cli-tools.md +184 -0
- package/docs/99_llm-reference.txt +46 -5
- package/package.json +13 -4
- package/dist/demo.d.ts +0 -6
- package/dist/demo.d.ts.map +0 -1
- package/dist/demo.js +0 -121
- package/dist/demo.js.map +0 -1
- package/dist/lexer.d.ts +0 -19
- package/dist/lexer.d.ts.map +0 -1
- package/dist/lexer.js +0 -344
- package/dist/lexer.js.map +0 -1
- package/dist/parser/arithmetic.d.ts +0 -16
- package/dist/parser/arithmetic.d.ts.map +0 -1
- package/dist/parser/arithmetic.js +0 -128
- package/dist/parser/arithmetic.js.map +0 -1
- package/dist/parser/boolean.d.ts +0 -15
- package/dist/parser/boolean.d.ts.map +0 -1
- package/dist/parser/boolean.js +0 -20
- package/dist/parser/boolean.js.map +0 -1
- package/dist/parser/control-flow.d.ts +0 -56
- package/dist/parser/control-flow.d.ts.map +0 -1
- package/dist/parser/control-flow.js +0 -167
- package/dist/parser/control-flow.js.map +0 -1
- package/dist/parser/expressions.d.ts +0 -23
- package/dist/parser/expressions.d.ts.map +0 -1
- package/dist/parser/expressions.js +0 -950
- package/dist/parser/expressions.js.map +0 -1
- package/dist/parser/extraction.d.ts +0 -48
- package/dist/parser/extraction.d.ts.map +0 -1
- package/dist/parser/extraction.js +0 -279
- package/dist/parser/extraction.js.map +0 -1
- package/dist/parser/functions.d.ts +0 -20
- package/dist/parser/functions.d.ts.map +0 -1
- package/dist/parser/functions.js +0 -96
- package/dist/parser/functions.js.map +0 -1
- package/dist/parser/literals.d.ts +0 -37
- package/dist/parser/literals.d.ts.map +0 -1
- package/dist/parser/literals.js +0 -373
- package/dist/parser/literals.js.map +0 -1
- package/dist/parser/script.d.ts +0 -14
- package/dist/parser/script.d.ts.map +0 -1
- package/dist/parser/script.js +0 -196
- package/dist/parser/script.js.map +0 -1
- package/dist/parser/variables.d.ts +0 -10
- package/dist/parser/variables.d.ts.map +0 -1
- package/dist/parser/variables.js +0 -215
- package/dist/parser/variables.js.map +0 -1
- package/dist/runtime/ast-equals.d.ts +0 -13
- package/dist/runtime/ast-equals.d.ts.map +0 -1
- package/dist/runtime/ast-equals.js +0 -447
- package/dist/runtime/ast-equals.js.map +0 -1
- package/dist/runtime/builtins.d.ts +0 -13
- package/dist/runtime/builtins.d.ts.map +0 -1
- package/dist/runtime/builtins.js +0 -180
- package/dist/runtime/builtins.js.map +0 -1
- package/dist/runtime/callable.d.ts +0 -88
- package/dist/runtime/callable.d.ts.map +0 -1
- package/dist/runtime/callable.js +0 -98
- package/dist/runtime/callable.js.map +0 -1
- package/dist/runtime/context.d.ts +0 -13
- package/dist/runtime/context.d.ts.map +0 -1
- package/dist/runtime/context.js +0 -73
- package/dist/runtime/context.js.map +0 -1
- package/dist/runtime/core/evaluate.d.ts +0 -42
- package/dist/runtime/core/evaluate.d.ts.map +0 -1
- package/dist/runtime/core/evaluate.debug.js +0 -1251
- package/dist/runtime/core/evaluate.js +0 -1913
- package/dist/runtime/core/evaluate.js.map +0 -1
- package/dist/runtime/evaluate.d.ts +0 -32
- package/dist/runtime/evaluate.d.ts.map +0 -1
- package/dist/runtime/evaluate.js +0 -1111
- package/dist/runtime/evaluate.js.map +0 -1
- package/dist/runtime/execute.d.ts +0 -26
- package/dist/runtime/execute.d.ts.map +0 -1
- package/dist/runtime/execute.js +0 -121
- package/dist/runtime/execute.js.map +0 -1
- package/dist/runtime/signals.d.ts +0 -19
- package/dist/runtime/signals.d.ts.map +0 -1
- package/dist/runtime/signals.js +0 -26
- package/dist/runtime/signals.js.map +0 -1
- package/dist/runtime/types.d.ts +0 -169
- package/dist/runtime/types.d.ts.map +0 -1
- package/dist/runtime/types.js +0 -50
- package/dist/runtime/types.js.map +0 -1
- package/dist/runtime/values.d.ts +0 -50
- package/dist/runtime/values.d.ts.map +0 -1
- package/dist/runtime/values.js +0 -209
- package/dist/runtime/values.js.map +0 -1
- package/dist/runtime.d.ts +0 -254
- package/dist/runtime.d.ts.map +0 -1
- package/dist/runtime.js +0 -2014
- package/dist/runtime.js.map +0 -1
package/dist/parser/variables.js
DELETED
|
@@ -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
|