openalgo-script 0.5.0 → 0.6.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/CHANGELOG.md +121 -0
- package/README.md +53 -22
- package/dist/adapters/charts/run.d.ts.map +1 -1
- package/dist/adapters/charts/run.js +6 -0
- package/dist/adapters/charts/run.js.map +1 -1
- package/dist/adapters/charts/tables.d.ts +6 -19
- package/dist/adapters/charts/tables.d.ts.map +1 -1
- package/dist/adapters/charts/tables.js.map +1 -1
- package/dist/adapters/charts/undrawable.d.ts +4 -0
- package/dist/adapters/charts/undrawable.d.ts.map +1 -0
- package/dist/adapters/charts/undrawable.js +47 -0
- package/dist/adapters/charts/undrawable.js.map +1 -0
- package/dist/core/backtest/drive.d.ts +36 -1
- package/dist/core/backtest/drive.d.ts.map +1 -1
- package/dist/core/backtest/drive.js +13 -107
- package/dist/core/backtest/drive.js.map +1 -1
- package/dist/core/backtest/index.d.ts +2 -0
- package/dist/core/backtest/index.d.ts.map +1 -1
- package/dist/core/backtest/index.js.map +1 -1
- package/dist/core/backtest/walk.d.ts +39 -0
- package/dist/core/backtest/walk.d.ts.map +1 -0
- package/dist/core/backtest/walk.js +125 -0
- package/dist/core/backtest/walk.js.map +1 -0
- package/dist/core/catalogue/catalogue.generated.d.ts +178 -1
- package/dist/core/catalogue/catalogue.generated.d.ts.map +1 -1
- package/dist/core/catalogue/catalogue.generated.js +18 -1
- package/dist/core/catalogue/catalogue.generated.js.map +1 -1
- package/dist/core/catalogue/types.d.ts +8 -2
- package/dist/core/catalogue/types.d.ts.map +1 -1
- package/dist/core/catalogue/values.generated.d.ts +51 -0
- package/dist/core/catalogue/values.generated.d.ts.map +1 -1
- package/dist/core/check/assigned.d.ts +19 -0
- package/dist/core/check/assigned.d.ts.map +1 -0
- package/dist/core/check/assigned.js +14 -0
- package/dist/core/check/assigned.js.map +1 -0
- package/dist/core/check/call-sites.d.ts.map +1 -1
- package/dist/core/check/call-sites.js +9 -4
- package/dist/core/check/call-sites.js.map +1 -1
- package/dist/core/check/calls.d.ts.map +1 -1
- package/dist/core/check/calls.js +12 -4
- package/dist/core/check/calls.js.map +1 -1
- package/dist/core/check/check.d.ts.map +1 -1
- package/dist/core/check/check.js +15 -2
- package/dist/core/check/check.js.map +1 -1
- package/dist/core/check/checker.d.ts +26 -0
- package/dist/core/check/checker.d.ts.map +1 -1
- package/dist/core/check/checker.js +38 -2
- package/dist/core/check/checker.js.map +1 -1
- package/dist/core/check/constant.d.ts +16 -0
- package/dist/core/check/constant.d.ts.map +1 -1
- package/dist/core/check/constant.js +52 -0
- package/dist/core/check/constant.js.map +1 -1
- package/dist/core/check/deleted.d.ts +3 -0
- package/dist/core/check/deleted.d.ts.map +1 -0
- package/dist/core/check/deleted.js +109 -0
- package/dist/core/check/deleted.js.map +1 -0
- package/dist/core/check/expressions.js +1 -1
- package/dist/core/check/expressions.js.map +1 -1
- package/dist/core/check/library-output.d.ts.map +1 -1
- package/dist/core/check/library-output.js +1 -0
- package/dist/core/check/library-output.js.map +1 -1
- package/dist/core/check/library-prose.generated.js +10 -10
- package/dist/core/check/library-prose.generated.js.map +1 -1
- package/dist/core/check/library.d.ts +7 -0
- package/dist/core/check/library.d.ts.map +1 -1
- package/dist/core/check/library.js +1 -0
- package/dist/core/check/library.js.map +1 -1
- package/dist/core/check/surface.d.ts +9 -0
- package/dist/core/check/surface.d.ts.map +1 -1
- package/dist/core/check/surface.js +13 -0
- package/dist/core/check/surface.js.map +1 -1
- package/dist/core/engine/bar-source.d.ts +65 -0
- package/dist/core/engine/bar-source.d.ts.map +1 -0
- package/dist/core/engine/bar-source.js +58 -0
- package/dist/core/engine/bar-source.js.map +1 -0
- package/dist/core/engine/engine.d.ts +9 -11
- package/dist/core/engine/engine.d.ts.map +1 -1
- package/dist/core/engine/engine.js +24 -24
- package/dist/core/engine/engine.js.map +1 -1
- package/dist/core/engine/guard.d.ts.map +1 -1
- package/dist/core/engine/guard.js +10 -0
- package/dist/core/engine/guard.js.map +1 -1
- package/dist/core/engine/host.d.ts +4 -2
- package/dist/core/engine/host.d.ts.map +1 -1
- package/dist/core/engine/host.js.map +1 -1
- package/dist/core/engine/index.d.ts +1 -0
- package/dist/core/engine/index.d.ts.map +1 -1
- package/dist/core/engine/index.js.map +1 -1
- package/dist/core/engine/library/binding.d.ts +2 -0
- package/dist/core/engine/library/binding.d.ts.map +1 -1
- package/dist/core/engine/library/binding.js.map +1 -1
- package/dist/core/engine/library/index.d.ts +8 -0
- package/dist/core/engine/library/index.d.ts.map +1 -1
- package/dist/core/engine/library/index.js +10 -0
- package/dist/core/engine/library/index.js.map +1 -1
- package/dist/core/engine/library/objects.d.ts.map +1 -1
- package/dist/core/engine/library/objects.js +1 -1
- package/dist/core/engine/library/objects.js.map +1 -1
- package/dist/core/engine/request-body.d.ts +3 -1
- package/dist/core/engine/request-body.d.ts.map +1 -1
- package/dist/core/engine/request-body.js +3 -1
- package/dist/core/engine/request-body.js.map +1 -1
- package/dist/core/engine/request-plan.d.ts +3 -3
- package/dist/core/engine/request-plan.js +3 -3
- package/dist/core/engine/requests.d.ts +2 -2
- package/dist/core/engine/requests.d.ts.map +1 -1
- package/dist/core/engine/requests.js +5 -4
- package/dist/core/engine/requests.js.map +1 -1
- package/dist/core/engine/series.d.ts +18 -6
- package/dist/core/engine/series.d.ts.map +1 -1
- package/dist/core/engine/series.js +24 -5
- package/dist/core/engine/series.js.map +1 -1
- package/dist/core/engine/session/record.d.ts +4 -4
- package/dist/core/engine/session/record.js +4 -4
- package/dist/core/importer/calls.d.ts +29 -0
- package/dist/core/importer/calls.d.ts.map +1 -0
- package/dist/core/importer/calls.js +267 -0
- package/dist/core/importer/calls.js.map +1 -0
- package/dist/core/importer/context.d.ts +118 -0
- package/dist/core/importer/context.d.ts.map +1 -0
- package/dist/core/importer/context.js +120 -0
- package/dist/core/importer/context.js.map +1 -0
- package/dist/core/importer/expressions.d.ts +44 -0
- package/dist/core/importer/expressions.d.ts.map +1 -0
- package/dist/core/importer/expressions.js +223 -0
- package/dist/core/importer/expressions.js.map +1 -0
- package/dist/core/importer/importer.d.ts +13 -0
- package/dist/core/importer/importer.d.ts.map +1 -0
- package/dist/core/importer/importer.js +220 -0
- package/dist/core/importer/importer.js.map +1 -0
- package/dist/core/importer/index.d.ts +20 -0
- package/dist/core/importer/index.d.ts.map +1 -0
- package/dist/core/importer/index.js +18 -0
- package/dist/core/importer/index.js.map +1 -0
- package/dist/core/importer/lexer.d.ts +68 -0
- package/dist/core/importer/lexer.d.ts.map +1 -0
- package/dist/core/importer/lexer.js +207 -0
- package/dist/core/importer/lexer.js.map +1 -0
- package/dist/core/importer/names.d.ts +41 -0
- package/dist/core/importer/names.d.ts.map +1 -0
- package/dist/core/importer/names.js +78 -0
- package/dist/core/importer/names.js.map +1 -0
- package/dist/core/importer/orders.d.ts +8 -0
- package/dist/core/importer/orders.d.ts.map +1 -0
- package/dist/core/importer/orders.js +332 -0
- package/dist/core/importer/orders.js.map +1 -0
- package/dist/core/importer/outputs.d.ts +19 -0
- package/dist/core/importer/outputs.d.ts.map +1 -0
- package/dist/core/importer/outputs.js +266 -0
- package/dist/core/importer/outputs.js.map +1 -0
- package/dist/core/importer/parser.d.ts +5 -0
- package/dist/core/importer/parser.d.ts.map +1 -0
- package/dist/core/importer/parser.js +439 -0
- package/dist/core/importer/parser.js.map +1 -0
- package/dist/core/importer/presence.d.ts +32 -0
- package/dist/core/importer/presence.d.ts.map +1 -0
- package/dist/core/importer/presence.js +146 -0
- package/dist/core/importer/presence.js.map +1 -0
- package/dist/core/importer/settle.d.ts +23 -0
- package/dist/core/importer/settle.d.ts.map +1 -0
- package/dist/core/importer/settle.js +135 -0
- package/dist/core/importer/settle.js.map +1 -0
- package/dist/core/importer/statements.d.ts +4 -0
- package/dist/core/importer/statements.d.ts.map +1 -0
- package/dist/core/importer/statements.js +339 -0
- package/dist/core/importer/statements.js.map +1 -0
- package/dist/core/importer/syntax.d.ts +182 -0
- package/dist/core/importer/syntax.d.ts.map +1 -0
- package/dist/core/importer/syntax.js +14 -0
- package/dist/core/importer/syntax.js.map +1 -0
- package/dist/core/importer/table.d.ts +52 -0
- package/dist/core/importer/table.d.ts.map +1 -0
- package/dist/core/importer/table.js +156 -0
- package/dist/core/importer/table.js.map +1 -0
- package/dist/core/importer/values.d.ts +27 -0
- package/dist/core/importer/values.d.ts.map +1 -0
- package/dist/core/importer/values.js +236 -0
- package/dist/core/importer/values.js.map +1 -0
- package/dist/core/index.d.ts +12 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +11 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/stdlib/calendar/civil.d.ts.map +1 -1
- package/dist/core/stdlib/calendar/civil.js +5 -2
- package/dist/core/stdlib/calendar/civil.js.map +1 -1
- package/dist/core/version/version.generated.d.ts +1 -1
- package/dist/core/version/version.generated.js +1 -1
- package/package.json +5 -2
- package/spec/errors.json +380 -20
- package/src/adapters/charts/run.ts +6 -0
- package/src/adapters/charts/tables.ts +6 -19
- package/src/adapters/charts/undrawable.ts +51 -0
- package/src/core/backtest/drive.ts +66 -154
- package/src/core/backtest/index.ts +2 -0
- package/src/core/backtest/walk.ts +182 -0
- package/src/core/catalogue/catalogue.generated.ts +18 -1
- package/src/core/catalogue/types.ts +8 -2
- package/src/core/catalogue/values.generated.ts +16 -0
- package/src/core/check/assigned.ts +31 -0
- package/src/core/check/call-sites.ts +11 -4
- package/src/core/check/calls.ts +13 -4
- package/src/core/check/check.ts +14 -2
- package/src/core/check/checker.ts +39 -2
- package/src/core/check/constant.ts +57 -0
- package/src/core/check/deleted.ts +135 -0
- package/src/core/check/expressions.ts +1 -1
- package/src/core/check/library-output.ts +1 -0
- package/src/core/check/library-prose.generated.ts +10 -10
- package/src/core/check/library.ts +8 -0
- package/src/core/check/surface.ts +16 -0
- package/src/core/engine/bar-source.ts +113 -0
- package/src/core/engine/engine.ts +26 -25
- package/src/core/engine/guard.ts +12 -1
- package/src/core/engine/host.ts +4 -2
- package/src/core/engine/index.ts +1 -0
- package/src/core/engine/library/binding.ts +2 -0
- package/src/core/engine/library/index.ts +11 -0
- package/src/core/engine/library/objects.ts +1 -6
- package/src/core/engine/request-body.ts +5 -7
- package/src/core/engine/request-plan.ts +3 -3
- package/src/core/engine/requests.ts +11 -8
- package/src/core/engine/series.ts +30 -6
- package/src/core/engine/session/record.ts +4 -4
- package/src/core/importer/calls.ts +274 -0
- package/src/core/importer/context.ts +197 -0
- package/src/core/importer/expressions.ts +247 -0
- package/src/core/importer/importer.ts +226 -0
- package/src/core/importer/index.ts +19 -0
- package/src/core/importer/lexer.ts +285 -0
- package/src/core/importer/names.ts +104 -0
- package/src/core/importer/orders.ts +307 -0
- package/src/core/importer/outputs.ts +245 -0
- package/src/core/importer/parser.ts +436 -0
- package/src/core/importer/presence.ts +164 -0
- package/src/core/importer/settle.ts +141 -0
- package/src/core/importer/statements.ts +331 -0
- package/src/core/importer/syntax.ts +144 -0
- package/src/core/importer/table.ts +191 -0
- package/src/core/importer/values.ts +241 -0
- package/src/core/index.ts +13 -0
- package/src/core/stdlib/calendar/civil.ts +5 -2
- package/src/core/version/version.generated.ts +1 -1
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statements and blocks in the source dialect.
|
|
3
|
+
*
|
|
4
|
+
* A block is the run of lines indented past its header, as in OpenScript. A
|
|
5
|
+
* statement the reader cannot take apart is not a parse error that stops the
|
|
6
|
+
* file: it becomes one `refused` statement covering its own lines and its
|
|
7
|
+
* block, so the translator can keep it as a comment and go on to the next.
|
|
8
|
+
*/
|
|
9
|
+
import { Cursor, Unreadable, UNREAD, badConstruct, expression, placeOf } from './expressions.js';
|
|
10
|
+
import { joined } from './syntax.js';
|
|
11
|
+
const KEYWORD_FORMS = {
|
|
12
|
+
import: 'an import',
|
|
13
|
+
export: 'an export',
|
|
14
|
+
method: 'a method declaration',
|
|
15
|
+
type: 'a type declaration',
|
|
16
|
+
enum: 'an enum declaration',
|
|
17
|
+
else: 'an else with no if before it',
|
|
18
|
+
};
|
|
19
|
+
const QUALIFIERS = new Set(['const', 'simple', 'series']);
|
|
20
|
+
const TYPES = new Set([
|
|
21
|
+
'int', 'float', 'bool', 'color', 'string', 'line', 'label', 'box', 'table', 'linefill',
|
|
22
|
+
'polyline', 'array', 'matrix', 'map',
|
|
23
|
+
]);
|
|
24
|
+
const ASSIGNMENTS = new Set([':=', '+=', '-=', '*=', '/=', '%=']);
|
|
25
|
+
function placeOfLogical(logical) {
|
|
26
|
+
const first = logical.tokens[0];
|
|
27
|
+
const last = logical.tokens[logical.tokens.length - 1];
|
|
28
|
+
if (first === undefined || last === undefined)
|
|
29
|
+
return { offset: 0, length: 0 };
|
|
30
|
+
return joined(placeOf(first), placeOf(last));
|
|
31
|
+
}
|
|
32
|
+
/** The last input line a body reaches, or the fallback when it holds no code. */
|
|
33
|
+
function lastLineOf(body, fallback) {
|
|
34
|
+
let last = fallback;
|
|
35
|
+
for (const entry of body) {
|
|
36
|
+
if (entry.kind === 'stmt')
|
|
37
|
+
last = Math.max(last, entry.stmt.lines.last);
|
|
38
|
+
}
|
|
39
|
+
return last;
|
|
40
|
+
}
|
|
41
|
+
function nextCode(items, from) {
|
|
42
|
+
for (let i = from; i < items.length; i += 1) {
|
|
43
|
+
const item = items[i];
|
|
44
|
+
if (item !== undefined && item.kind === 'code')
|
|
45
|
+
return item.logical;
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function entryOf(item) {
|
|
50
|
+
if (item.kind === 'remark')
|
|
51
|
+
return { kind: 'remark', remark: item.remark };
|
|
52
|
+
if (item.kind === 'blank')
|
|
53
|
+
return { kind: 'blank', line: item.line };
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
/** The statements indented past a header at `headerIndent`, starting at item `from`. */
|
|
57
|
+
function blockAfter(items, from, headerIndent) {
|
|
58
|
+
const body = [];
|
|
59
|
+
let i = from;
|
|
60
|
+
while (i < items.length) {
|
|
61
|
+
const item = items[i];
|
|
62
|
+
if (item === undefined)
|
|
63
|
+
break;
|
|
64
|
+
if (item.kind !== 'code') {
|
|
65
|
+
const code = nextCode(items, i);
|
|
66
|
+
if (code === undefined || code.indent <= headerIndent)
|
|
67
|
+
break;
|
|
68
|
+
const entry = entryOf(item);
|
|
69
|
+
if (entry !== undefined)
|
|
70
|
+
body.push(entry);
|
|
71
|
+
i += 1;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
if (item.logical.indent <= headerIndent)
|
|
75
|
+
break;
|
|
76
|
+
const parsed = statementAt(items, i, item.logical);
|
|
77
|
+
body.push({ kind: 'stmt', stmt: parsed.stmt });
|
|
78
|
+
i = parsed.next;
|
|
79
|
+
}
|
|
80
|
+
return { body, next: i };
|
|
81
|
+
}
|
|
82
|
+
/** The whole file as one top level body. */
|
|
83
|
+
export function readScript(items) {
|
|
84
|
+
return blockAfter(items, 0, -1).body;
|
|
85
|
+
}
|
|
86
|
+
/** Names a statement the reader refused would have declared, read off its first tokens. */
|
|
87
|
+
function declaredBy(tokens) {
|
|
88
|
+
let i = 0;
|
|
89
|
+
const at = (k) => tokens[k];
|
|
90
|
+
if (at(i)?.text === 'var' || at(i)?.text === 'varip')
|
|
91
|
+
i += 1;
|
|
92
|
+
while (at(i) !== undefined && (QUALIFIERS.has(at(i)?.text ?? '') || TYPES.has(at(i)?.text ?? '')))
|
|
93
|
+
i += 1;
|
|
94
|
+
const head = at(i);
|
|
95
|
+
if (head === undefined)
|
|
96
|
+
return [];
|
|
97
|
+
if (head.kind === 'name' && at(i + 1)?.text === '=')
|
|
98
|
+
return [{ name: head.text, at: placeOf(head) }];
|
|
99
|
+
if (head.text === '[') {
|
|
100
|
+
const names = [];
|
|
101
|
+
for (let k = i + 1; k < tokens.length; k += 1) {
|
|
102
|
+
const token = tokens[k];
|
|
103
|
+
if (token === undefined || token.text === ']')
|
|
104
|
+
break;
|
|
105
|
+
if (token.kind === 'name')
|
|
106
|
+
names.push({ name: token.text, at: placeOf(token) });
|
|
107
|
+
}
|
|
108
|
+
return names;
|
|
109
|
+
}
|
|
110
|
+
if (head.kind === 'name' && at(i + 1)?.text === '(') {
|
|
111
|
+
if (tokens.some((token) => token.text === '=>'))
|
|
112
|
+
return [{ name: head.text, at: placeOf(head) }];
|
|
113
|
+
}
|
|
114
|
+
return [];
|
|
115
|
+
}
|
|
116
|
+
/** A statement kept whole, with the block below it swallowed so its lines stay together. */
|
|
117
|
+
function refusedAt(items, index, logical, at, construct) {
|
|
118
|
+
const { body, next } = blockAfter(items, index + 1, logical.indent);
|
|
119
|
+
const lines = { first: logical.firstLine, last: lastLineOf(body, logical.lastLine) };
|
|
120
|
+
const stmt = { kind: 'refused', construct, declares: declaredBy(logical.tokens), at, lines, remarks: logical.remarks };
|
|
121
|
+
return { stmt, next };
|
|
122
|
+
}
|
|
123
|
+
/** The statement starting at item `index`, whose logical line is `logical`. */
|
|
124
|
+
function statementAt(items, index, logical) {
|
|
125
|
+
try {
|
|
126
|
+
return statementOf(items, index, logical);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
if (!(error instanceof Unreadable))
|
|
130
|
+
throw error;
|
|
131
|
+
return refusedAt(items, index, logical, error.at, error.construct);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function common(logical, last = logical.lastLine) {
|
|
135
|
+
return { at: placeOfLogical(logical), lines: { first: logical.firstLine, last }, remarks: logical.remarks };
|
|
136
|
+
}
|
|
137
|
+
function wholeLine(c) {
|
|
138
|
+
if (!c.done())
|
|
139
|
+
c.fail();
|
|
140
|
+
}
|
|
141
|
+
function statementOf(items, index, logical) {
|
|
142
|
+
const c = new Cursor(logical.tokens);
|
|
143
|
+
const first = c.peek();
|
|
144
|
+
if (first === undefined)
|
|
145
|
+
throw new Unreadable(placeOfLogical(logical), UNREAD);
|
|
146
|
+
if (first.kind === 'bad')
|
|
147
|
+
throw new Unreadable(placeOf(first), badConstruct(first));
|
|
148
|
+
const word = first.kind === 'name' ? first.text : '';
|
|
149
|
+
const keyword = KEYWORD_FORMS[word];
|
|
150
|
+
if (keyword !== undefined)
|
|
151
|
+
throw new Unreadable(placeOf(first), keyword);
|
|
152
|
+
switch (word) {
|
|
153
|
+
case 'if':
|
|
154
|
+
return ifAt(items, index, logical, c);
|
|
155
|
+
case 'for':
|
|
156
|
+
return forAt(items, index, logical, c);
|
|
157
|
+
case 'while': {
|
|
158
|
+
c.take();
|
|
159
|
+
const condition = expression(c);
|
|
160
|
+
wholeLine(c);
|
|
161
|
+
const { body, next } = blockAfter(items, index + 1, logical.indent);
|
|
162
|
+
return { stmt: { kind: 'while', condition, body, ...common(logical, lastLineOf(body, logical.lastLine)) }, next };
|
|
163
|
+
}
|
|
164
|
+
case 'switch':
|
|
165
|
+
return switchAt(items, index, logical, c);
|
|
166
|
+
case 'break':
|
|
167
|
+
case 'continue':
|
|
168
|
+
c.take();
|
|
169
|
+
wholeLine(c);
|
|
170
|
+
return { stmt: { kind: word, ...common(logical) }, next: index + 1 };
|
|
171
|
+
}
|
|
172
|
+
return simpleAt(items, index, logical, c);
|
|
173
|
+
}
|
|
174
|
+
function ifAt(items, index, logical, c) {
|
|
175
|
+
c.take();
|
|
176
|
+
const branches = [];
|
|
177
|
+
let condition = expression(c);
|
|
178
|
+
wholeLine(c);
|
|
179
|
+
let { body, next } = blockAfter(items, index + 1, logical.indent);
|
|
180
|
+
let otherwise;
|
|
181
|
+
let last = lastLineOf(body, logical.lastLine);
|
|
182
|
+
for (;;) {
|
|
183
|
+
branches.push({ condition, body });
|
|
184
|
+
// Comment and blank lines before an else belong to the branch they follow.
|
|
185
|
+
let ahead = next;
|
|
186
|
+
const between = [];
|
|
187
|
+
for (let item = items[ahead]; item !== undefined && item.kind !== 'code'; item = items[++ahead]) {
|
|
188
|
+
const entry = entryOf(item);
|
|
189
|
+
if (entry !== undefined)
|
|
190
|
+
between.push(entry);
|
|
191
|
+
}
|
|
192
|
+
const following = items[ahead];
|
|
193
|
+
if (following === undefined || following.kind !== 'code')
|
|
194
|
+
break;
|
|
195
|
+
const line = following.logical;
|
|
196
|
+
if (line.indent !== logical.indent || line.tokens[0]?.text !== 'else')
|
|
197
|
+
break;
|
|
198
|
+
body.push(...between);
|
|
199
|
+
next = ahead;
|
|
200
|
+
const tail = new Cursor(line.tokens);
|
|
201
|
+
tail.take();
|
|
202
|
+
if (tail.done()) {
|
|
203
|
+
const block = blockAfter(items, next + 1, logical.indent);
|
|
204
|
+
otherwise = block.body;
|
|
205
|
+
last = lastLineOf(block.body, line.lastLine);
|
|
206
|
+
next = block.next;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
tail.expect('if');
|
|
210
|
+
condition = expression(tail);
|
|
211
|
+
wholeLine(tail);
|
|
212
|
+
const block = blockAfter(items, next + 1, logical.indent);
|
|
213
|
+
body = block.body;
|
|
214
|
+
last = lastLineOf(block.body, line.lastLine);
|
|
215
|
+
next = block.next;
|
|
216
|
+
}
|
|
217
|
+
return { stmt: { kind: 'if', branches, otherwise, ...common(logical, last) }, next };
|
|
218
|
+
}
|
|
219
|
+
function forAt(items, index, logical, c) {
|
|
220
|
+
const head = c.take();
|
|
221
|
+
const variable = c.take();
|
|
222
|
+
if (variable.kind !== 'name' || c.sees('in')) {
|
|
223
|
+
throw new Unreadable(joined(placeOf(head), placeOf(variable)), 'a for loop over a collection');
|
|
224
|
+
}
|
|
225
|
+
c.expect('=');
|
|
226
|
+
const from = expression(c);
|
|
227
|
+
c.expect('to');
|
|
228
|
+
const to = expression(c);
|
|
229
|
+
let by;
|
|
230
|
+
if (c.sees('by')) {
|
|
231
|
+
c.take();
|
|
232
|
+
by = expression(c);
|
|
233
|
+
}
|
|
234
|
+
wholeLine(c);
|
|
235
|
+
const { body, next } = blockAfter(items, index + 1, logical.indent);
|
|
236
|
+
const named = { name: variable.text, at: placeOf(variable) };
|
|
237
|
+
const stmt = { kind: 'for', variable: named, from, to, by, body, ...common(logical, lastLineOf(body, logical.lastLine)) };
|
|
238
|
+
return { stmt, next };
|
|
239
|
+
}
|
|
240
|
+
function switchAt(items, index, logical, c) {
|
|
241
|
+
c.take();
|
|
242
|
+
const subject = c.done() ? undefined : expression(c);
|
|
243
|
+
wholeLine(c);
|
|
244
|
+
const arms = [];
|
|
245
|
+
// Comment and blank lines between arms stay with the arm before them, and
|
|
246
|
+
// any before the first arm go at the start of its body.
|
|
247
|
+
const pending = [];
|
|
248
|
+
let i = index + 1;
|
|
249
|
+
let last = logical.lastLine;
|
|
250
|
+
while (i < items.length) {
|
|
251
|
+
const item = items[i];
|
|
252
|
+
if (item === undefined)
|
|
253
|
+
break;
|
|
254
|
+
if (item.kind !== 'code') {
|
|
255
|
+
const code = nextCode(items, i);
|
|
256
|
+
if (code === undefined || code.indent <= logical.indent)
|
|
257
|
+
break;
|
|
258
|
+
const entry = entryOf(item);
|
|
259
|
+
if (entry !== undefined)
|
|
260
|
+
(arms[arms.length - 1]?.body ?? pending).push(entry);
|
|
261
|
+
i += 1;
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const line = item.logical;
|
|
265
|
+
if (line.indent <= logical.indent)
|
|
266
|
+
break;
|
|
267
|
+
const arm = new Cursor(line.tokens);
|
|
268
|
+
const match = arm.sees('=>') ? undefined : expression(arm);
|
|
269
|
+
arm.expect('=>');
|
|
270
|
+
if (arm.done()) {
|
|
271
|
+
const block = blockAfter(items, i + 1, line.indent);
|
|
272
|
+
arms.push({ match, body: [...pending.splice(0), ...block.body] });
|
|
273
|
+
last = lastLineOf(block.body, line.lastLine);
|
|
274
|
+
i = block.next;
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
const rest = { ...line, tokens: line.tokens.slice(arm.index) };
|
|
278
|
+
const inner = simpleAt(items, i, rest, new Cursor(rest.tokens));
|
|
279
|
+
arms.push({ match, body: [...pending.splice(0), { kind: 'stmt', stmt: inner.stmt }] });
|
|
280
|
+
last = line.lastLine;
|
|
281
|
+
i += 1;
|
|
282
|
+
}
|
|
283
|
+
const read = arms;
|
|
284
|
+
return { stmt: { kind: 'switch', subject, arms: read, ...common(logical, last) }, next: i };
|
|
285
|
+
}
|
|
286
|
+
/** Skips `var`, qualifiers and a type; returns the mode and whether a type was written. */
|
|
287
|
+
function declarationHead(c) {
|
|
288
|
+
let mode = 'plain';
|
|
289
|
+
if (c.sees('var') || c.sees('varip'))
|
|
290
|
+
mode = c.take().text === 'var' ? 'var' : 'varip';
|
|
291
|
+
let typed = false;
|
|
292
|
+
while (c.peek()?.kind === 'name' && QUALIFIERS.has(c.peek()?.text ?? ''))
|
|
293
|
+
c.take();
|
|
294
|
+
const type = c.peek();
|
|
295
|
+
if (type !== undefined && type.kind === 'name' && TYPES.has(type.text)) {
|
|
296
|
+
const after = c.peek(1);
|
|
297
|
+
const generic = after?.text === '<';
|
|
298
|
+
if (generic || (after?.kind === 'name' && after.text !== 'and' && after.text !== 'or')) {
|
|
299
|
+
c.take();
|
|
300
|
+
typed = true;
|
|
301
|
+
if (generic) {
|
|
302
|
+
while (!c.done() && !c.sees('>'))
|
|
303
|
+
c.take();
|
|
304
|
+
c.expect('>');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return { mode, typed };
|
|
309
|
+
}
|
|
310
|
+
function simpleAt(items, index, logical, c) {
|
|
311
|
+
const next = index + 1;
|
|
312
|
+
const { mode, typed } = declarationHead(c);
|
|
313
|
+
const head = c.peek();
|
|
314
|
+
if (head === undefined)
|
|
315
|
+
c.fail();
|
|
316
|
+
if (head.text === '[' && mode === 'plain' && !typed)
|
|
317
|
+
return tupleAt(index, logical, c);
|
|
318
|
+
if (head.kind === 'name' && c.sees('(', 1) && mode === 'plain' && !typed) {
|
|
319
|
+
const fn = functionAt(items, index, logical, c);
|
|
320
|
+
if (fn !== undefined)
|
|
321
|
+
return fn;
|
|
322
|
+
}
|
|
323
|
+
if (head.kind === 'name' && c.sees('=', 1)) {
|
|
324
|
+
c.take();
|
|
325
|
+
c.take();
|
|
326
|
+
const valueStart = c.peek();
|
|
327
|
+
if (valueStart !== undefined && (valueStart.text === 'if' || valueStart.text === 'switch')) {
|
|
328
|
+
return valueFormAt(items, index, logical, valueStart);
|
|
329
|
+
}
|
|
330
|
+
const value = expression(c);
|
|
331
|
+
wholeLine(c);
|
|
332
|
+
const name = { name: head.text, at: placeOf(head) };
|
|
333
|
+
return { stmt: { kind: 'declare', mode, name, value, ...common(logical) }, next };
|
|
334
|
+
}
|
|
335
|
+
if (mode !== 'plain' || typed)
|
|
336
|
+
c.fail();
|
|
337
|
+
if (head.kind === 'name' && c.peek(1)?.kind === 'op' && ASSIGNMENTS.has(c.peek(1)?.text ?? '')) {
|
|
338
|
+
c.take();
|
|
339
|
+
const op = c.take().text;
|
|
340
|
+
const value = expression(c);
|
|
341
|
+
wholeLine(c);
|
|
342
|
+
const name = { name: head.text, at: placeOf(head) };
|
|
343
|
+
return { stmt: { kind: 'assign', op, name, value, ...common(logical) }, next };
|
|
344
|
+
}
|
|
345
|
+
const expr = expression(c);
|
|
346
|
+
wholeLine(c);
|
|
347
|
+
return { stmt: { kind: 'evaluate', expr, ...common(logical) }, next };
|
|
348
|
+
}
|
|
349
|
+
/** `x = if ...` and `x = switch ...`, kept whole with every branch they own. */
|
|
350
|
+
function valueFormAt(items, index, logical, word) {
|
|
351
|
+
const rest = { ...logical, tokens: logical.tokens.slice(logical.tokens.indexOf(word)) };
|
|
352
|
+
const inner = word.text === 'if' ? ifAt(items, index, rest, new Cursor(rest.tokens)) : switchAt(items, index, rest, new Cursor(rest.tokens));
|
|
353
|
+
const construct = word.text === 'if' ? 'an if used as a value' : 'a switch used as a value';
|
|
354
|
+
const stmt = {
|
|
355
|
+
kind: 'refused',
|
|
356
|
+
construct,
|
|
357
|
+
declares: declaredBy(logical.tokens),
|
|
358
|
+
at: placeOf(word),
|
|
359
|
+
lines: { first: logical.firstLine, last: inner.stmt.lines.last },
|
|
360
|
+
remarks: logical.remarks,
|
|
361
|
+
};
|
|
362
|
+
return { stmt, next: inner.next };
|
|
363
|
+
}
|
|
364
|
+
function tupleAt(index, logical, c) {
|
|
365
|
+
const open = c.take();
|
|
366
|
+
const names = [];
|
|
367
|
+
while (!c.sees(']')) {
|
|
368
|
+
const token = c.take();
|
|
369
|
+
if (token.kind !== 'name')
|
|
370
|
+
throw new Unreadable(placeOf(token), UNREAD);
|
|
371
|
+
names.push({ name: token.text, at: placeOf(token) });
|
|
372
|
+
if (!c.sees(','))
|
|
373
|
+
break;
|
|
374
|
+
c.take();
|
|
375
|
+
}
|
|
376
|
+
const close = c.expect(']');
|
|
377
|
+
if (!c.sees('='))
|
|
378
|
+
throw new Unreadable(joined(placeOf(open), placeOf(close)), 'a tuple reassignment');
|
|
379
|
+
c.take();
|
|
380
|
+
const value = expression(c);
|
|
381
|
+
wholeLine(c);
|
|
382
|
+
return { stmt: { kind: 'tuple', names, value, ...common(logical) }, next: index + 1 };
|
|
383
|
+
}
|
|
384
|
+
/** A function declaration, or undefined when the line is a call rather than one. */
|
|
385
|
+
function functionAt(items, index, logical, c) {
|
|
386
|
+
const tokens = logical.tokens;
|
|
387
|
+
let depth = 0;
|
|
388
|
+
let close = -1;
|
|
389
|
+
for (let k = c.index + 1; k < tokens.length; k += 1) {
|
|
390
|
+
const text = tokens[k]?.text;
|
|
391
|
+
if (text === '(')
|
|
392
|
+
depth += 1;
|
|
393
|
+
else if (text === ')') {
|
|
394
|
+
depth -= 1;
|
|
395
|
+
if (depth === 0) {
|
|
396
|
+
close = k;
|
|
397
|
+
break;
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
if (close < 0 || tokens[close + 1]?.text !== '=>')
|
|
402
|
+
return undefined;
|
|
403
|
+
const nameToken = c.take();
|
|
404
|
+
c.expect('(');
|
|
405
|
+
const params = [];
|
|
406
|
+
while (!c.sees(')')) {
|
|
407
|
+
declarationHead(c);
|
|
408
|
+
const token = c.take();
|
|
409
|
+
if (token.kind !== 'name')
|
|
410
|
+
throw new Unreadable(placeOf(token), UNREAD);
|
|
411
|
+
let fallback;
|
|
412
|
+
if (c.sees('=')) {
|
|
413
|
+
c.take();
|
|
414
|
+
fallback = expression(c);
|
|
415
|
+
}
|
|
416
|
+
params.push({ name: token.text, at: placeOf(token), fallback });
|
|
417
|
+
if (!c.sees(','))
|
|
418
|
+
break;
|
|
419
|
+
c.take();
|
|
420
|
+
}
|
|
421
|
+
c.expect(')');
|
|
422
|
+
c.expect('=>');
|
|
423
|
+
const name = { name: nameToken.text, at: placeOf(nameToken) };
|
|
424
|
+
if (!c.done()) {
|
|
425
|
+
const body = expression(c);
|
|
426
|
+
wholeLine(c);
|
|
427
|
+
return { stmt: { kind: 'function', name, params, body, ...common(logical) }, next: index + 1 };
|
|
428
|
+
}
|
|
429
|
+
const block = blockAfter(items, index + 1, logical.indent);
|
|
430
|
+
const stmt = {
|
|
431
|
+
kind: 'function',
|
|
432
|
+
name,
|
|
433
|
+
params,
|
|
434
|
+
body: block.body,
|
|
435
|
+
...common(logical, lastLineOf(block.body, logical.lastLine)),
|
|
436
|
+
};
|
|
437
|
+
return { stmt, next: block.next };
|
|
438
|
+
}
|
|
439
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/importer/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Three questions about a source expression that decide where the two
|
|
3
|
+
* languages part, answered from the source tree before anything is written.
|
|
4
|
+
*
|
|
5
|
+
* **Can it be absent?** The source dialect answers a comparison with an absent
|
|
6
|
+
* side `false`, where OpenScript answers `none` (`language.md` 6.4). Most
|
|
7
|
+
* places treat the two alike, because a condition that is absent takes the
|
|
8
|
+
* false branch; the places that do not are `not`, an equality with a boolean
|
|
9
|
+
* literal and a condition handed to a counting built-in, and there the
|
|
10
|
+
* translation writes `orElse(x, false)`, which is the source dialect's answer
|
|
11
|
+
* exactly. The analysis is conservative: anything it cannot show is present is
|
|
12
|
+
* treated as possibly absent, which costs an `orElse` that changes nothing.
|
|
13
|
+
*
|
|
14
|
+
* **Does it hold state?** A call that keeps state at its call site, or a user
|
|
15
|
+
* function that may, is one whose value depends on which bars it ran on
|
|
16
|
+
* (`language.md` 11.4). That is where the order and laziness of evaluation
|
|
17
|
+
* stop being invisible.
|
|
18
|
+
*
|
|
19
|
+
* **Is it a whole-number constant?** Version 5 of the source dialect divides
|
|
20
|
+
* two of those without a fraction.
|
|
21
|
+
*/
|
|
22
|
+
import type { Context } from './context.js';
|
|
23
|
+
import type { Expr } from './syntax.js';
|
|
24
|
+
/** Whether an expression holds a value on every bar, as far as the tree can show. */
|
|
25
|
+
export declare function neverAbsent(ctx: Context, expr: Expr | undefined): boolean;
|
|
26
|
+
/** Whether evaluating an expression runs a call that keeps state at its call site. */
|
|
27
|
+
export declare function holdsState(ctx: Context, expr: Expr): boolean;
|
|
28
|
+
/** Whether an expression is a whole-number constant in version 5's sense. */
|
|
29
|
+
export declare function wholeConstant(ctx: Context, expr: Expr): boolean;
|
|
30
|
+
/** Whether a name is read anywhere inside an expression. */
|
|
31
|
+
export declare function mentions(expr: Expr, name: string): boolean;
|
|
32
|
+
//# sourceMappingURL=presence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presence.d.ts","sourceRoot":"","sources":["../../../src/core/importer/presence.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AA4BxC,qFAAqF;AACrF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CA+BzE;AAED,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CA4B5D;AAOD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAe/D;AAED,4DAA4D;AAC5D,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAuB1D"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { pathOf } from './syntax.js';
|
|
2
|
+
import { CALLS, COLOURS } from './table.js';
|
|
3
|
+
/** Built-in series that hold a value on every bar, from bar 0. Volume can be absent. */
|
|
4
|
+
const PRESENT_SERIES = new Set(['open', 'high', 'low', 'close', 'hl2', 'hlc3', 'ohlc4', 'hlcc4', 'time', 'bar_index']);
|
|
5
|
+
/** Calls that return a present value whenever their arguments are present. */
|
|
6
|
+
const PRESENT_WHEN_ARGUMENTS_ARE = new Set([
|
|
7
|
+
'math.abs', 'math.max', 'math.min', 'math.floor', 'math.ceil', 'math.sign', 'int', 'float',
|
|
8
|
+
]);
|
|
9
|
+
function namePresent(ctx, name) {
|
|
10
|
+
const binding = ctx.scope.find(name);
|
|
11
|
+
if (binding !== undefined)
|
|
12
|
+
return binding.present;
|
|
13
|
+
return PRESENT_SERIES.has(name);
|
|
14
|
+
}
|
|
15
|
+
function callPresent(ctx, expr) {
|
|
16
|
+
const path = pathOf(expr.callee);
|
|
17
|
+
if (path === undefined || ctx.scope.find(path.split('.')[0] ?? '') !== undefined)
|
|
18
|
+
return false;
|
|
19
|
+
if (path === 'na')
|
|
20
|
+
return true;
|
|
21
|
+
if (path === 'nz')
|
|
22
|
+
return expr.args.length < 2 || neverAbsent(ctx, expr.args[1]?.value);
|
|
23
|
+
if (path.startsWith('input'))
|
|
24
|
+
return true;
|
|
25
|
+
if (path === 'color.new' || path === 'color.rgb')
|
|
26
|
+
return true;
|
|
27
|
+
if (PRESENT_WHEN_ARGUMENTS_ARE.has(path))
|
|
28
|
+
return expr.args.every((arg) => neverAbsent(ctx, arg.value));
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
/** Whether an expression holds a value on every bar, as far as the tree can show. */
|
|
32
|
+
export function neverAbsent(ctx, expr) {
|
|
33
|
+
if (expr === undefined)
|
|
34
|
+
return false;
|
|
35
|
+
switch (expr.kind) {
|
|
36
|
+
case 'number':
|
|
37
|
+
case 'string':
|
|
38
|
+
case 'bool':
|
|
39
|
+
case 'color':
|
|
40
|
+
return true;
|
|
41
|
+
case 'name':
|
|
42
|
+
return namePresent(ctx, expr.name);
|
|
43
|
+
case 'member': {
|
|
44
|
+
const path = pathOf(expr) ?? '';
|
|
45
|
+
if (path.startsWith('barstate.') || path === 'math.pi' || path === 'math.e')
|
|
46
|
+
return true;
|
|
47
|
+
if (path === 'strategy.position_size')
|
|
48
|
+
return true;
|
|
49
|
+
return path.startsWith('color.') && COLOURS.has(expr.property);
|
|
50
|
+
}
|
|
51
|
+
case 'unary':
|
|
52
|
+
return neverAbsent(ctx, expr.operand);
|
|
53
|
+
case 'binary':
|
|
54
|
+
if (expr.op === '/' || expr.op === '%')
|
|
55
|
+
return false;
|
|
56
|
+
return neverAbsent(ctx, expr.left) && neverAbsent(ctx, expr.right);
|
|
57
|
+
case 'ternary':
|
|
58
|
+
return neverAbsent(ctx, expr.then) && neverAbsent(ctx, expr.otherwise);
|
|
59
|
+
case 'group':
|
|
60
|
+
return neverAbsent(ctx, expr.inner);
|
|
61
|
+
case 'call':
|
|
62
|
+
return callPresent(ctx, expr);
|
|
63
|
+
case 'index':
|
|
64
|
+
case 'list':
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Whether evaluating an expression runs a call that keeps state at its call site. */
|
|
69
|
+
export function holdsState(ctx, expr) {
|
|
70
|
+
switch (expr.kind) {
|
|
71
|
+
case 'call': {
|
|
72
|
+
const path = pathOf(expr.callee);
|
|
73
|
+
if (path !== undefined) {
|
|
74
|
+
const binding = ctx.scope.find(path);
|
|
75
|
+
if (binding !== undefined && binding.kind === 'function')
|
|
76
|
+
return true;
|
|
77
|
+
if (CALLS.get(path)?.stateful === true)
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
return holdsState(ctx, expr.callee) || expr.args.some((arg) => holdsState(ctx, arg.value));
|
|
81
|
+
}
|
|
82
|
+
case 'member':
|
|
83
|
+
return holdsState(ctx, expr.object);
|
|
84
|
+
case 'index':
|
|
85
|
+
return holdsState(ctx, expr.target) || holdsState(ctx, expr.index);
|
|
86
|
+
case 'unary':
|
|
87
|
+
return holdsState(ctx, expr.operand);
|
|
88
|
+
case 'binary':
|
|
89
|
+
return holdsState(ctx, expr.left) || holdsState(ctx, expr.right);
|
|
90
|
+
case 'ternary':
|
|
91
|
+
return holdsState(ctx, expr.condition) || holdsState(ctx, expr.then) || holdsState(ctx, expr.otherwise);
|
|
92
|
+
case 'group':
|
|
93
|
+
return holdsState(ctx, expr.inner);
|
|
94
|
+
case 'list':
|
|
95
|
+
return expr.items.some((item) => holdsState(ctx, item));
|
|
96
|
+
default:
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** A whole-number literal, as the source writes one: no point and no exponent. */
|
|
101
|
+
function wholeLiteral(text) {
|
|
102
|
+
return /^[0-9]+$/.test(text);
|
|
103
|
+
}
|
|
104
|
+
/** Whether an expression is a whole-number constant in version 5's sense. */
|
|
105
|
+
export function wholeConstant(ctx, expr) {
|
|
106
|
+
switch (expr.kind) {
|
|
107
|
+
case 'number':
|
|
108
|
+
return wholeLiteral(expr.text);
|
|
109
|
+
case 'name':
|
|
110
|
+
return ctx.scope.find(expr.name)?.whole === true;
|
|
111
|
+
case 'unary':
|
|
112
|
+
return expr.op !== 'not' && wholeConstant(ctx, expr.operand);
|
|
113
|
+
case 'group':
|
|
114
|
+
return wholeConstant(ctx, expr.inner);
|
|
115
|
+
case 'binary':
|
|
116
|
+
return ['+', '-', '*', '/', '%'].includes(expr.op) && wholeConstant(ctx, expr.left) && wholeConstant(ctx, expr.right);
|
|
117
|
+
default:
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Whether a name is read anywhere inside an expression. */
|
|
122
|
+
export function mentions(expr, name) {
|
|
123
|
+
switch (expr.kind) {
|
|
124
|
+
case 'name':
|
|
125
|
+
return expr.name === name;
|
|
126
|
+
case 'member':
|
|
127
|
+
return mentions(expr.object, name);
|
|
128
|
+
case 'call':
|
|
129
|
+
return mentions(expr.callee, name) || expr.args.some((arg) => mentions(arg.value, name));
|
|
130
|
+
case 'index':
|
|
131
|
+
return mentions(expr.target, name) || mentions(expr.index, name);
|
|
132
|
+
case 'unary':
|
|
133
|
+
return mentions(expr.operand, name);
|
|
134
|
+
case 'binary':
|
|
135
|
+
return mentions(expr.left, name) || mentions(expr.right, name);
|
|
136
|
+
case 'ternary':
|
|
137
|
+
return mentions(expr.condition, name) || mentions(expr.then, name) || mentions(expr.otherwise, name);
|
|
138
|
+
case 'group':
|
|
139
|
+
return mentions(expr.inner, name);
|
|
140
|
+
case 'list':
|
|
141
|
+
return expr.items.some((item) => mentions(item, name));
|
|
142
|
+
default:
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=presence.js.map
|