@bilig/formula 0.1.83 → 0.1.84
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/dist/addressing.d.ts +6 -6
- package/dist/addressing.js +16 -16
- package/dist/addressing.js.map +1 -1
- package/dist/ast.d.ts +18 -18
- package/dist/binder-wasm-rules.d.ts +2 -2
- package/dist/binder-wasm-rules.js +677 -724
- package/dist/binder-wasm-rules.js.map +1 -1
- package/dist/binder.d.ts +2 -2
- package/dist/binder.js +133 -137
- package/dist/binder.js.map +1 -1
- package/dist/builtin-capabilities.d.ts +4 -4
- package/dist/builtin-capabilities.js +777 -816
- package/dist/builtin-capabilities.js.map +1 -1
- package/dist/builtins/complex.d.ts +3 -3
- package/dist/builtins/complex.js +20 -48
- package/dist/builtins/complex.js.map +1 -1
- package/dist/builtins/convert.d.ts +1 -1
- package/dist/builtins/convert.js +180 -181
- package/dist/builtins/convert.js.map +1 -1
- package/dist/builtins/datetime.d.ts +1 -1
- package/dist/builtins/datetime.js +60 -72
- package/dist/builtins/datetime.js.map +1 -1
- package/dist/builtins/distribution-builtins.d.ts +2 -2
- package/dist/builtins/distribution-builtins.js +62 -112
- package/dist/builtins/distribution-builtins.js.map +1 -1
- package/dist/builtins/distributions.js +17 -54
- package/dist/builtins/distributions.js.map +1 -1
- package/dist/builtins/financial-builtins.d.ts +2 -2
- package/dist/builtins/financial-builtins.js +9 -42
- package/dist/builtins/financial-builtins.js.map +1 -1
- package/dist/builtins/financial.js +4 -18
- package/dist/builtins/financial.js.map +1 -1
- package/dist/builtins/fixed-income-builtins.d.ts +2 -2
- package/dist/builtins/fixed-income-builtins.js +18 -60
- package/dist/builtins/fixed-income-builtins.js.map +1 -1
- package/dist/builtins/fixed-income.js +25 -96
- package/dist/builtins/fixed-income.js.map +1 -1
- package/dist/builtins/formatting.js +9 -9
- package/dist/builtins/formatting.js.map +1 -1
- package/dist/builtins/logical.d.ts +1 -1
- package/dist/builtins/logical.js +5 -5
- package/dist/builtins/logical.js.map +1 -1
- package/dist/builtins/lookup-array-shape-builtins.d.ts +3 -3
- package/dist/builtins/lookup-array-shape-builtins.js +8 -15
- package/dist/builtins/lookup-array-shape-builtins.js.map +1 -1
- package/dist/builtins/lookup-criteria-builtins.d.ts +2 -2
- package/dist/builtins/lookup-criteria-builtins.js +1 -1
- package/dist/builtins/lookup-criteria-builtins.js.map +1 -1
- package/dist/builtins/lookup-database-builtins.d.ts +2 -2
- package/dist/builtins/lookup-database-builtins.js +20 -24
- package/dist/builtins/lookup-database-builtins.js.map +1 -1
- package/dist/builtins/lookup-financial-builtins.d.ts +3 -3
- package/dist/builtins/lookup-financial-builtins.js +14 -30
- package/dist/builtins/lookup-financial-builtins.js.map +1 -1
- package/dist/builtins/lookup-hypothesis-builtins.d.ts +2 -2
- package/dist/builtins/lookup-hypothesis-builtins.js +23 -58
- package/dist/builtins/lookup-hypothesis-builtins.js.map +1 -1
- package/dist/builtins/lookup-matrix-builtins.d.ts +3 -3
- package/dist/builtins/lookup-matrix-builtins.js +5 -3
- package/dist/builtins/lookup-matrix-builtins.js.map +1 -1
- package/dist/builtins/lookup-order-statistics-builtins.d.ts +3 -3
- package/dist/builtins/lookup-order-statistics-builtins.js +18 -30
- package/dist/builtins/lookup-order-statistics-builtins.js.map +1 -1
- package/dist/builtins/lookup-reference-builtins.d.ts +2 -2
- package/dist/builtins/lookup-reference-builtins.js +10 -26
- package/dist/builtins/lookup-reference-builtins.js.map +1 -1
- package/dist/builtins/lookup-regression-builtins.d.ts +2 -2
- package/dist/builtins/lookup-regression-builtins.js +52 -69
- package/dist/builtins/lookup-regression-builtins.js.map +1 -1
- package/dist/builtins/lookup-sort-filter-builtins.d.ts +3 -3
- package/dist/builtins/lookup-sort-filter-builtins.js +5 -13
- package/dist/builtins/lookup-sort-filter-builtins.js.map +1 -1
- package/dist/builtins/lookup.d.ts +5 -5
- package/dist/builtins/lookup.js +61 -73
- package/dist/builtins/lookup.js.map +1 -1
- package/dist/builtins/math-builtins.d.ts +2 -2
- package/dist/builtins/math-builtins.js +11 -17
- package/dist/builtins/math-builtins.js.map +1 -1
- package/dist/builtins/numeric.d.ts +2 -2
- package/dist/builtins/numeric.js +2 -2
- package/dist/builtins/numeric.js.map +1 -1
- package/dist/builtins/placeholder.d.ts +1 -1
- package/dist/builtins/placeholder.js +505 -505
- package/dist/builtins/placeholder.js.map +1 -1
- package/dist/builtins/radix.d.ts +2 -2
- package/dist/builtins/radix.js +33 -39
- package/dist/builtins/radix.js.map +1 -1
- package/dist/builtins/statistical-builtins.d.ts +2 -2
- package/dist/builtins/statistical-builtins.js +29 -56
- package/dist/builtins/statistical-builtins.js.map +1 -1
- package/dist/builtins/statistics.d.ts +1 -1
- package/dist/builtins/statistics.js +3 -7
- package/dist/builtins/statistics.js.map +1 -1
- package/dist/builtins/text-core-builtins.d.ts +2 -2
- package/dist/builtins/text-core-builtins.js +110 -110
- package/dist/builtins/text-core-builtins.js.map +1 -1
- package/dist/builtins/text-format-builtins.d.ts +2 -2
- package/dist/builtins/text-format-builtins.js +109 -141
- package/dist/builtins/text-format-builtins.js.map +1 -1
- package/dist/builtins/text-search-builtins.d.ts +2 -2
- package/dist/builtins/text-search-builtins.js +37 -44
- package/dist/builtins/text-search-builtins.js.map +1 -1
- package/dist/builtins/text.d.ts +2 -2
- package/dist/builtins/text.js +19 -29
- package/dist/builtins/text.js.map +1 -1
- package/dist/builtins.d.ts +3 -3
- package/dist/builtins.js +55 -75
- package/dist/builtins.js.map +1 -1
- package/dist/compatibility.js +425 -430
- package/dist/compatibility.js.map +1 -1
- package/dist/compiler.d.ts +7 -7
- package/dist/compiler.js +212 -228
- package/dist/compiler.js.map +1 -1
- package/dist/external-function-adapter.d.ts +6 -6
- package/dist/external-function-adapter.js +3 -3
- package/dist/external-function-adapter.js.map +1 -1
- package/dist/formula-template-key.js +25 -26
- package/dist/formula-template-key.js.map +1 -1
- package/dist/generated/formula-inventory.js +3567 -3567
- package/dist/generated/formula-inventory.js.map +1 -1
- package/dist/group-pivot-evaluator.d.ts +2 -2
- package/dist/group-pivot-evaluator.js +27 -32
- package/dist/group-pivot-evaluator.js.map +1 -1
- package/dist/index.d.ts +20 -20
- package/dist/index.js +20 -20
- package/dist/index.js.map +1 -1
- package/dist/js-evaluator-array-special-calls.d.ts +3 -3
- package/dist/js-evaluator-array-special-calls.js +25 -34
- package/dist/js-evaluator-array-special-calls.js.map +1 -1
- package/dist/js-evaluator-context-special-calls.d.ts +2 -2
- package/dist/js-evaluator-context-special-calls.js +23 -27
- package/dist/js-evaluator-context-special-calls.js.map +1 -1
- package/dist/js-evaluator-reference-context.d.ts +2 -2
- package/dist/js-evaluator-reference-context.js +22 -24
- package/dist/js-evaluator-reference-context.js.map +1 -1
- package/dist/js-evaluator-workbook-special-calls.d.ts +2 -2
- package/dist/js-evaluator-workbook-special-calls.js +18 -24
- package/dist/js-evaluator-workbook-special-calls.js.map +1 -1
- package/dist/js-evaluator.d.ts +40 -40
- package/dist/js-evaluator.js +135 -147
- package/dist/js-evaluator.js.map +1 -1
- package/dist/js-plan-lowering.d.ts +2 -2
- package/dist/js-plan-lowering.js +103 -108
- package/dist/js-plan-lowering.js.map +1 -1
- package/dist/lexer.d.ts +1 -1
- package/dist/lexer.js +34 -43
- package/dist/lexer.js.map +1 -1
- package/dist/optimizer.d.ts +1 -1
- package/dist/optimizer.js +99 -108
- package/dist/optimizer.js.map +1 -1
- package/dist/parser.d.ts +1 -1
- package/dist/parser.js +129 -136
- package/dist/parser.js.map +1 -1
- package/dist/program-arena.js.map +1 -1
- package/dist/runtime-inventory.d.ts +2 -2
- package/dist/runtime-inventory.js +14 -20
- package/dist/runtime-inventory.js.map +1 -1
- package/dist/runtime-values.d.ts +4 -4
- package/dist/runtime-values.js +2 -2
- package/dist/runtime-values.js.map +1 -1
- package/dist/special-call-rewrites.d.ts +1 -1
- package/dist/special-call-rewrites.js +14 -18
- package/dist/special-call-rewrites.js.map +1 -1
- package/dist/translation.d.ts +7 -7
- package/dist/translation.js +323 -366
- package/dist/translation.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,89 +1,84 @@
|
|
|
1
|
-
import { MAX_WASM_RANGE_CELLS } from
|
|
2
|
-
import { parseRangeAddress } from
|
|
1
|
+
import { MAX_WASM_RANGE_CELLS } from '@bilig/protocol';
|
|
2
|
+
import { parseRangeAddress } from './addressing.js';
|
|
3
3
|
const RANGE_SAFE_BUILTINS = new Set([
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
4
|
+
'SUM',
|
|
5
|
+
'AVG',
|
|
6
|
+
'AVERAGE',
|
|
7
|
+
'MIN',
|
|
8
|
+
'MAX',
|
|
9
|
+
'COUNT',
|
|
10
|
+
'COUNTA',
|
|
11
|
+
'COUNTBLANK',
|
|
12
|
+
'PRODUCT',
|
|
13
|
+
'GEOMEAN',
|
|
14
|
+
'HARMEAN',
|
|
15
|
+
'SUMSQ',
|
|
16
|
+
'GCD',
|
|
17
|
+
'LCM',
|
|
18
|
+
'MODE',
|
|
19
|
+
'MODE.SNGL',
|
|
20
|
+
'STDEV',
|
|
21
|
+
'STDEV.P',
|
|
22
|
+
'STDEV.S',
|
|
23
|
+
'STDEVA',
|
|
24
|
+
'STDEVP',
|
|
25
|
+
'STDEVPA',
|
|
26
|
+
'VAR',
|
|
27
|
+
'VAR.P',
|
|
28
|
+
'VAR.S',
|
|
29
|
+
'VARA',
|
|
30
|
+
'VARP',
|
|
31
|
+
'VARPA',
|
|
32
|
+
'SKEW',
|
|
33
|
+
'SKEW.P',
|
|
34
|
+
'KURT',
|
|
35
35
|
]);
|
|
36
36
|
const AXIS_AGGREGATE_CODES = new Map([
|
|
37
|
-
[
|
|
38
|
-
[
|
|
39
|
-
[
|
|
40
|
-
[
|
|
41
|
-
[
|
|
42
|
-
[
|
|
43
|
-
[
|
|
37
|
+
['SUM', 1],
|
|
38
|
+
['AVERAGE', 2],
|
|
39
|
+
['AVG', 2],
|
|
40
|
+
['MIN', 3],
|
|
41
|
+
['MAX', 4],
|
|
42
|
+
['COUNT', 5],
|
|
43
|
+
['COUNTA', 6],
|
|
44
44
|
]);
|
|
45
45
|
export function isCellRangeNode(node) {
|
|
46
|
-
if (node.kind !==
|
|
46
|
+
if (node.kind !== 'RangeRef') {
|
|
47
47
|
return false;
|
|
48
48
|
}
|
|
49
49
|
try {
|
|
50
|
-
const sheetPrefix = node.sheetName ? `${node.sheetName}!` :
|
|
51
|
-
return parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`).kind ===
|
|
50
|
+
const sheetPrefix = node.sheetName ? `${node.sheetName}!` : '';
|
|
51
|
+
return parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`).kind === 'cells';
|
|
52
52
|
}
|
|
53
53
|
catch {
|
|
54
54
|
return false;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
57
|
export function getNativeAxisAggregateCode(node) {
|
|
58
|
-
if (node.kind !==
|
|
59
|
-
node.callee.toUpperCase() !== "LAMBDA" ||
|
|
60
|
-
node.args.length !== 2) {
|
|
58
|
+
if (node.kind !== 'CallExpr' || node.callee.toUpperCase() !== 'LAMBDA' || node.args.length !== 2) {
|
|
61
59
|
return null;
|
|
62
60
|
}
|
|
63
61
|
const [param, body] = node.args;
|
|
64
|
-
if (param?.kind !==
|
|
62
|
+
if (param?.kind !== 'NameRef' || body?.kind !== 'CallExpr' || body.args.length !== 1) {
|
|
65
63
|
return null;
|
|
66
64
|
}
|
|
67
65
|
const aggregateCode = AXIS_AGGREGATE_CODES.get(body.callee.toUpperCase());
|
|
68
66
|
if (aggregateCode === undefined) {
|
|
69
67
|
return null;
|
|
70
68
|
}
|
|
71
|
-
return body.args[0]?.kind ===
|
|
72
|
-
body.args[0].name.trim().toUpperCase() === param.name.trim().toUpperCase()
|
|
69
|
+
return body.args[0]?.kind === 'NameRef' && body.args[0].name.trim().toUpperCase() === param.name.trim().toUpperCase()
|
|
73
70
|
? aggregateCode
|
|
74
71
|
: null;
|
|
75
72
|
}
|
|
76
73
|
export function getNativeRunningFoldCode(node) {
|
|
77
|
-
if (node.kind !==
|
|
78
|
-
node.callee.toUpperCase() !== "LAMBDA" ||
|
|
79
|
-
node.args.length !== 3) {
|
|
74
|
+
if (node.kind !== 'CallExpr' || node.callee.toUpperCase() !== 'LAMBDA' || node.args.length !== 3) {
|
|
80
75
|
return null;
|
|
81
76
|
}
|
|
82
77
|
const [acc, value, body] = node.args;
|
|
83
|
-
if (acc?.kind !==
|
|
78
|
+
if (acc?.kind !== 'NameRef' || value?.kind !== 'NameRef' || body?.kind !== 'BinaryExpr') {
|
|
84
79
|
return null;
|
|
85
80
|
}
|
|
86
|
-
const foldCode = body.operator ===
|
|
81
|
+
const foldCode = body.operator === '+' ? 1 : body.operator === '*' ? 2 : null;
|
|
87
82
|
if (foldCode === null) {
|
|
88
83
|
return null;
|
|
89
84
|
}
|
|
@@ -91,58 +86,54 @@ export function getNativeRunningFoldCode(node) {
|
|
|
91
86
|
const right = body.right;
|
|
92
87
|
const accName = acc.name.trim().toUpperCase();
|
|
93
88
|
const valueName = value.name.trim().toUpperCase();
|
|
94
|
-
return left.kind ===
|
|
95
|
-
right.kind ===
|
|
96
|
-
((left.name.trim().toUpperCase() === accName &&
|
|
97
|
-
right.name.trim().toUpperCase() === valueName) ||
|
|
89
|
+
return left.kind === 'NameRef' &&
|
|
90
|
+
right.kind === 'NameRef' &&
|
|
91
|
+
((left.name.trim().toUpperCase() === accName && right.name.trim().toUpperCase() === valueName) ||
|
|
98
92
|
(left.name.trim().toUpperCase() === valueName && right.name.trim().toUpperCase() === accName))
|
|
99
93
|
? foldCode
|
|
100
94
|
: null;
|
|
101
95
|
}
|
|
102
96
|
export function isNativeMakearraySumLambda(node) {
|
|
103
|
-
if (node.kind !==
|
|
104
|
-
node.callee.toUpperCase() !== "LAMBDA" ||
|
|
105
|
-
node.args.length !== 3) {
|
|
97
|
+
if (node.kind !== 'CallExpr' || node.callee.toUpperCase() !== 'LAMBDA' || node.args.length !== 3) {
|
|
106
98
|
return false;
|
|
107
99
|
}
|
|
108
100
|
const [rowParam, colParam, body] = node.args;
|
|
109
|
-
if (rowParam?.kind !==
|
|
101
|
+
if (rowParam?.kind !== 'NameRef' || colParam?.kind !== 'NameRef' || body?.kind !== 'BinaryExpr') {
|
|
110
102
|
return false;
|
|
111
103
|
}
|
|
112
|
-
if (body.operator !==
|
|
104
|
+
if (body.operator !== '+') {
|
|
113
105
|
return false;
|
|
114
106
|
}
|
|
115
107
|
const left = body.left;
|
|
116
108
|
const right = body.right;
|
|
117
109
|
const rowName = rowParam.name.trim().toUpperCase();
|
|
118
110
|
const colName = colParam.name.trim().toUpperCase();
|
|
119
|
-
return (left.kind ===
|
|
120
|
-
right.kind ===
|
|
111
|
+
return (left.kind === 'NameRef' &&
|
|
112
|
+
right.kind === 'NameRef' &&
|
|
121
113
|
((left.name.trim().toUpperCase() === rowName && right.name.trim().toUpperCase() === colName) ||
|
|
122
114
|
(left.name.trim().toUpperCase() === colName && right.name.trim().toUpperCase() === rowName)));
|
|
123
115
|
}
|
|
124
116
|
export function isCellVectorNode(node) {
|
|
125
|
-
if (node.kind !==
|
|
117
|
+
if (node.kind !== 'RangeRef') {
|
|
126
118
|
return false;
|
|
127
119
|
}
|
|
128
120
|
try {
|
|
129
|
-
const sheetPrefix = node.sheetName ? `${node.sheetName}!` :
|
|
121
|
+
const sheetPrefix = node.sheetName ? `${node.sheetName}!` : '';
|
|
130
122
|
const range = parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`);
|
|
131
|
-
return
|
|
132
|
-
(range.start.row === range.end.row || range.start.col === range.end.col));
|
|
123
|
+
return range.kind === 'cells' && (range.start.row === range.end.row || range.start.col === range.end.col);
|
|
133
124
|
}
|
|
134
125
|
catch {
|
|
135
126
|
return false;
|
|
136
127
|
}
|
|
137
128
|
}
|
|
138
129
|
function isWasmSafeCellVectorNode(node) {
|
|
139
|
-
if (node.kind !==
|
|
130
|
+
if (node.kind !== 'RangeRef') {
|
|
140
131
|
return false;
|
|
141
132
|
}
|
|
142
133
|
try {
|
|
143
|
-
const sheetPrefix = node.sheetName ? `${node.sheetName}!` :
|
|
134
|
+
const sheetPrefix = node.sheetName ? `${node.sheetName}!` : '';
|
|
144
135
|
const range = parseRangeAddress(`${sheetPrefix}${node.start}:${node.end}`);
|
|
145
|
-
if (range.kind !==
|
|
136
|
+
if (range.kind !== 'cells') {
|
|
146
137
|
return false;
|
|
147
138
|
}
|
|
148
139
|
const rows = range.end.row - range.start.row + 1;
|
|
@@ -154,574 +145,574 @@ function isWasmSafeCellVectorNode(node) {
|
|
|
154
145
|
}
|
|
155
146
|
}
|
|
156
147
|
function isCanonicalAggregateName(node, expected) {
|
|
157
|
-
return
|
|
148
|
+
return node?.kind === 'NameRef' && node.name.trim().toUpperCase() === expected.trim().toUpperCase();
|
|
158
149
|
}
|
|
159
150
|
function isIntegerLiteral(node, expected) {
|
|
160
|
-
return
|
|
151
|
+
return node?.kind === 'NumberLiteral' && Math.trunc(node.value) === expected && node.value === expected;
|
|
161
152
|
}
|
|
162
153
|
export function getNativeGroupedArrayKind(node) {
|
|
163
|
-
if (node.kind !==
|
|
154
|
+
if (node.kind !== 'CallExpr') {
|
|
164
155
|
return null;
|
|
165
156
|
}
|
|
166
157
|
const callee = node.callee.toUpperCase();
|
|
167
|
-
if (callee ===
|
|
158
|
+
if (callee === 'GROUPBY' &&
|
|
168
159
|
node.args.length === 5 &&
|
|
169
160
|
isWasmSafeCellVectorNode(node.args[0]) &&
|
|
170
161
|
isWasmSafeCellVectorNode(node.args[1]) &&
|
|
171
|
-
isCanonicalAggregateName(node.args[2],
|
|
162
|
+
isCanonicalAggregateName(node.args[2], 'SUM') &&
|
|
172
163
|
isIntegerLiteral(node.args[3], 3) &&
|
|
173
164
|
isIntegerLiteral(node.args[4], 1)) {
|
|
174
|
-
return
|
|
165
|
+
return 'groupby-sum-canonical';
|
|
175
166
|
}
|
|
176
|
-
if (callee ===
|
|
167
|
+
if (callee === 'PIVOTBY' &&
|
|
177
168
|
node.args.length === 8 &&
|
|
178
169
|
isWasmSafeCellVectorNode(node.args[0]) &&
|
|
179
170
|
isWasmSafeCellVectorNode(node.args[1]) &&
|
|
180
171
|
isWasmSafeCellVectorNode(node.args[2]) &&
|
|
181
|
-
isCanonicalAggregateName(node.args[3],
|
|
172
|
+
isCanonicalAggregateName(node.args[3], 'SUM') &&
|
|
182
173
|
isIntegerLiteral(node.args[4], 3) &&
|
|
183
174
|
isIntegerLiteral(node.args[5], 1) &&
|
|
184
175
|
isIntegerLiteral(node.args[6], 0) &&
|
|
185
176
|
isIntegerLiteral(node.args[7], 1)) {
|
|
186
|
-
return
|
|
177
|
+
return 'pivotby-sum-canonical';
|
|
187
178
|
}
|
|
188
179
|
return null;
|
|
189
180
|
}
|
|
190
181
|
export function isWasmSafeBuiltinArity(callee, argc) {
|
|
191
182
|
switch (callee) {
|
|
192
|
-
case
|
|
193
|
-
case
|
|
194
|
-
case
|
|
195
|
-
case
|
|
196
|
-
case
|
|
197
|
-
case
|
|
198
|
-
case
|
|
199
|
-
case
|
|
200
|
-
case
|
|
201
|
-
case
|
|
202
|
-
case
|
|
203
|
-
case
|
|
204
|
-
case
|
|
205
|
-
case
|
|
206
|
-
case
|
|
207
|
-
case
|
|
208
|
-
case
|
|
209
|
-
case
|
|
210
|
-
case
|
|
211
|
-
case
|
|
212
|
-
case
|
|
183
|
+
case 'NOT':
|
|
184
|
+
case 'LEN':
|
|
185
|
+
case 'YEAR':
|
|
186
|
+
case 'MONTH':
|
|
187
|
+
case 'DAY':
|
|
188
|
+
case 'HOUR':
|
|
189
|
+
case 'MINUTE':
|
|
190
|
+
case 'SECOND':
|
|
191
|
+
case 'INT':
|
|
192
|
+
case 'SIN':
|
|
193
|
+
case 'COS':
|
|
194
|
+
case 'TAN':
|
|
195
|
+
case 'ASIN':
|
|
196
|
+
case 'ACOS':
|
|
197
|
+
case 'ATAN':
|
|
198
|
+
case 'DEGREES':
|
|
199
|
+
case 'RADIANS':
|
|
200
|
+
case 'EXP':
|
|
201
|
+
case 'LN':
|
|
202
|
+
case 'LOG10':
|
|
203
|
+
case 'SQRT':
|
|
213
204
|
return argc === 1;
|
|
214
|
-
case
|
|
215
|
-
case
|
|
216
|
-
case
|
|
205
|
+
case 'TODAY':
|
|
206
|
+
case 'NOW':
|
|
207
|
+
case 'RAND':
|
|
217
208
|
return argc === 0;
|
|
218
|
-
case
|
|
209
|
+
case 'NA':
|
|
219
210
|
return argc === 0;
|
|
220
|
-
case
|
|
211
|
+
case 'IF':
|
|
221
212
|
return argc === 3;
|
|
222
|
-
case
|
|
213
|
+
case 'IFS':
|
|
223
214
|
return argc >= 2 && argc % 2 === 0;
|
|
224
|
-
case
|
|
225
|
-
case
|
|
215
|
+
case 'IFERROR':
|
|
216
|
+
case 'IFNA':
|
|
226
217
|
return argc === 2;
|
|
227
|
-
case
|
|
218
|
+
case 'WEEKDAY':
|
|
228
219
|
return argc === 1 || argc === 2;
|
|
229
|
-
case
|
|
220
|
+
case 'DAYS':
|
|
230
221
|
return argc === 2;
|
|
231
|
-
case
|
|
222
|
+
case 'COUNTBLANK':
|
|
232
223
|
return argc >= 1;
|
|
233
|
-
case
|
|
224
|
+
case 'CHOOSE':
|
|
234
225
|
return argc >= 2;
|
|
235
|
-
case
|
|
236
|
-
case
|
|
226
|
+
case 'DAYS360':
|
|
227
|
+
case 'YEARFRAC':
|
|
237
228
|
return argc === 2 || argc === 3;
|
|
238
|
-
case
|
|
239
|
-
case
|
|
240
|
-
case
|
|
241
|
-
case
|
|
242
|
-
case
|
|
229
|
+
case 'DISC':
|
|
230
|
+
case 'INTRATE':
|
|
231
|
+
case 'RECEIVED':
|
|
232
|
+
case 'PRICEDISC':
|
|
233
|
+
case 'YIELDDISC':
|
|
243
234
|
return argc === 4 || argc === 5;
|
|
244
|
-
case
|
|
245
|
-
case
|
|
246
|
-
case
|
|
247
|
-
case
|
|
248
|
-
case
|
|
249
|
-
case
|
|
235
|
+
case 'COUPDAYBS':
|
|
236
|
+
case 'COUPDAYS':
|
|
237
|
+
case 'COUPDAYSNC':
|
|
238
|
+
case 'COUPNCD':
|
|
239
|
+
case 'COUPNUM':
|
|
240
|
+
case 'COUPPCD':
|
|
250
241
|
return argc === 3 || argc === 4;
|
|
251
|
-
case
|
|
252
|
-
case
|
|
253
|
-
case
|
|
254
|
-
case
|
|
242
|
+
case 'PRICEMAT':
|
|
243
|
+
case 'YIELDMAT':
|
|
244
|
+
case 'DURATION':
|
|
245
|
+
case 'MDURATION':
|
|
255
246
|
return argc === 5 || argc === 6;
|
|
256
|
-
case
|
|
257
|
-
case
|
|
258
|
-
case
|
|
259
|
-
case
|
|
247
|
+
case 'ODDFPRICE':
|
|
248
|
+
case 'ODDFYIELD':
|
|
249
|
+
case 'ODDLPRICE':
|
|
250
|
+
case 'ODDLYIELD':
|
|
260
251
|
return argc === 7 || argc === 8;
|
|
261
|
-
case
|
|
262
|
-
case
|
|
263
|
-
case
|
|
252
|
+
case 'TBILLPRICE':
|
|
253
|
+
case 'TBILLYIELD':
|
|
254
|
+
case 'TBILLEQ':
|
|
264
255
|
return argc === 3;
|
|
265
|
-
case
|
|
256
|
+
case 'IRR':
|
|
266
257
|
return argc === 1 || argc === 2;
|
|
267
|
-
case
|
|
258
|
+
case 'MIRR':
|
|
268
259
|
return argc === 3;
|
|
269
|
-
case
|
|
260
|
+
case 'XNPV':
|
|
270
261
|
return argc === 3;
|
|
271
|
-
case
|
|
262
|
+
case 'XIRR':
|
|
272
263
|
return argc === 2 || argc === 3;
|
|
273
|
-
case
|
|
274
|
-
case
|
|
264
|
+
case 'PRICE':
|
|
265
|
+
case 'YIELD':
|
|
275
266
|
return argc === 6 || argc === 7;
|
|
276
|
-
case
|
|
277
|
-
case
|
|
267
|
+
case 'ISOWEEKNUM':
|
|
268
|
+
case 'TIMEVALUE':
|
|
278
269
|
return argc === 1;
|
|
279
|
-
case
|
|
270
|
+
case 'WEEKNUM':
|
|
280
271
|
return argc === 1 || argc === 2;
|
|
281
|
-
case
|
|
282
|
-
case
|
|
272
|
+
case 'WORKDAY':
|
|
273
|
+
case 'NETWORKDAYS':
|
|
283
274
|
return argc === 2 || argc === 3;
|
|
284
|
-
case
|
|
285
|
-
case
|
|
275
|
+
case 'WORKDAY.INTL':
|
|
276
|
+
case 'NETWORKDAYS.INTL':
|
|
286
277
|
return argc >= 2 && argc <= 4;
|
|
287
|
-
case
|
|
288
|
-
case
|
|
278
|
+
case 'COUNTIF':
|
|
279
|
+
case 'USE.THE.COUNTIF':
|
|
289
280
|
return argc === 2;
|
|
290
|
-
case
|
|
281
|
+
case 'COUNTIFS':
|
|
291
282
|
return argc >= 2 && argc % 2 === 0;
|
|
292
|
-
case
|
|
293
|
-
case
|
|
294
|
-
case
|
|
295
|
-
case
|
|
296
|
-
case
|
|
297
|
-
case
|
|
298
|
-
case
|
|
299
|
-
case
|
|
300
|
-
case
|
|
301
|
-
case
|
|
302
|
-
case
|
|
303
|
-
case
|
|
283
|
+
case 'DAVERAGE':
|
|
284
|
+
case 'DCOUNT':
|
|
285
|
+
case 'DCOUNTA':
|
|
286
|
+
case 'DGET':
|
|
287
|
+
case 'DMAX':
|
|
288
|
+
case 'DMIN':
|
|
289
|
+
case 'DPRODUCT':
|
|
290
|
+
case 'DSTDEV':
|
|
291
|
+
case 'DSTDEVP':
|
|
292
|
+
case 'DSUM':
|
|
293
|
+
case 'DVAR':
|
|
294
|
+
case 'DVARP':
|
|
304
295
|
return argc === 3;
|
|
305
|
-
case
|
|
296
|
+
case 'ADDRESS':
|
|
306
297
|
return argc >= 2 && argc <= 5;
|
|
307
|
-
case
|
|
308
|
-
case
|
|
298
|
+
case 'SUMIF':
|
|
299
|
+
case 'AVERAGEIF':
|
|
309
300
|
return argc === 2 || argc === 3;
|
|
310
|
-
case
|
|
311
|
-
case
|
|
301
|
+
case 'SUMIFS':
|
|
302
|
+
case 'AVERAGEIFS':
|
|
312
303
|
return argc >= 3 && argc % 2 === 1;
|
|
313
|
-
case
|
|
304
|
+
case 'REPLACE':
|
|
314
305
|
return argc === 4;
|
|
315
|
-
case
|
|
306
|
+
case 'SUBSTITUTE':
|
|
316
307
|
return argc === 3 || argc === 4;
|
|
317
|
-
case
|
|
308
|
+
case 'REPT':
|
|
318
309
|
return argc === 2;
|
|
319
|
-
case
|
|
310
|
+
case 'TEXT':
|
|
320
311
|
return argc === 2;
|
|
321
|
-
case
|
|
312
|
+
case 'PHONETIC':
|
|
322
313
|
return argc === 1;
|
|
323
|
-
case
|
|
324
|
-
case
|
|
314
|
+
case 'TEXTBEFORE':
|
|
315
|
+
case 'TEXTAFTER':
|
|
325
316
|
return argc >= 2 && argc <= 6;
|
|
326
|
-
case
|
|
317
|
+
case 'TEXTSPLIT':
|
|
327
318
|
return argc >= 2 && argc <= 6;
|
|
328
|
-
case
|
|
319
|
+
case 'TEXTJOIN':
|
|
329
320
|
return argc >= 3;
|
|
330
|
-
case
|
|
331
|
-
case
|
|
321
|
+
case 'POWER':
|
|
322
|
+
case 'CONVERT':
|
|
332
323
|
return argc === 3;
|
|
333
|
-
case
|
|
334
|
-
case
|
|
324
|
+
case 'EXACT':
|
|
325
|
+
case 'ATAN2':
|
|
335
326
|
return argc === 2;
|
|
336
|
-
case
|
|
337
|
-
case
|
|
338
|
-
case
|
|
339
|
-
case
|
|
327
|
+
case 'BESSELI':
|
|
328
|
+
case 'BESSELJ':
|
|
329
|
+
case 'BESSELK':
|
|
330
|
+
case 'BESSELY':
|
|
340
331
|
return argc === 2;
|
|
341
|
-
case
|
|
332
|
+
case 'EUROCONVERT':
|
|
342
333
|
return argc >= 3 && argc <= 5;
|
|
343
|
-
case
|
|
344
|
-
case
|
|
345
|
-
case
|
|
346
|
-
case
|
|
347
|
-
case
|
|
348
|
-
case
|
|
349
|
-
case
|
|
350
|
-
case
|
|
351
|
-
case
|
|
352
|
-
case
|
|
353
|
-
case
|
|
354
|
-
case
|
|
355
|
-
case
|
|
356
|
-
case
|
|
357
|
-
case
|
|
358
|
-
case
|
|
359
|
-
case
|
|
360
|
-
case
|
|
361
|
-
case
|
|
362
|
-
case
|
|
363
|
-
case
|
|
364
|
-
case
|
|
365
|
-
case
|
|
366
|
-
case
|
|
367
|
-
case
|
|
368
|
-
case
|
|
369
|
-
case
|
|
370
|
-
case
|
|
371
|
-
case
|
|
372
|
-
case
|
|
373
|
-
case
|
|
374
|
-
case
|
|
375
|
-
case
|
|
334
|
+
case 'UPPER':
|
|
335
|
+
case 'LOWER':
|
|
336
|
+
case 'TRIM':
|
|
337
|
+
case 'VALUE':
|
|
338
|
+
case 'CHAR':
|
|
339
|
+
case 'CODE':
|
|
340
|
+
case 'UNICODE':
|
|
341
|
+
case 'UNICHAR':
|
|
342
|
+
case 'CLEAN':
|
|
343
|
+
case 'ASC':
|
|
344
|
+
case 'JIS':
|
|
345
|
+
case 'DBCS':
|
|
346
|
+
case 'BAHTTEXT':
|
|
347
|
+
case 'LENB':
|
|
348
|
+
case 'SINH':
|
|
349
|
+
case 'COSH':
|
|
350
|
+
case 'TANH':
|
|
351
|
+
case 'ASINH':
|
|
352
|
+
case 'ACOSH':
|
|
353
|
+
case 'ATANH':
|
|
354
|
+
case 'ACOT':
|
|
355
|
+
case 'ACOTH':
|
|
356
|
+
case 'COT':
|
|
357
|
+
case 'COTH':
|
|
358
|
+
case 'CSC':
|
|
359
|
+
case 'CSCH':
|
|
360
|
+
case 'SEC':
|
|
361
|
+
case 'SECH':
|
|
362
|
+
case 'SIGN':
|
|
363
|
+
case 'EVEN':
|
|
364
|
+
case 'ODD':
|
|
365
|
+
case 'FACT':
|
|
366
|
+
case 'FACTDOUBLE':
|
|
376
367
|
return argc === 1;
|
|
377
|
-
case
|
|
368
|
+
case 'NUMBERVALUE':
|
|
378
369
|
return argc >= 1 && argc <= 3;
|
|
379
|
-
case
|
|
370
|
+
case 'VALUETOTEXT':
|
|
380
371
|
return argc === 1 || argc === 2;
|
|
381
|
-
case
|
|
372
|
+
case 'DOLLAR':
|
|
382
373
|
return argc >= 1 && argc <= 3;
|
|
383
|
-
case
|
|
384
|
-
case
|
|
385
|
-
case
|
|
386
|
-
case
|
|
387
|
-
case
|
|
374
|
+
case 'DOLLARDE':
|
|
375
|
+
case 'DOLLARFR':
|
|
376
|
+
case 'COMBIN':
|
|
377
|
+
case 'COMBINA':
|
|
378
|
+
case 'QUOTIENT':
|
|
388
379
|
return argc === 2;
|
|
389
|
-
case
|
|
380
|
+
case 'BASE':
|
|
390
381
|
return argc === 2 || argc === 3;
|
|
391
|
-
case
|
|
382
|
+
case 'DECIMAL':
|
|
392
383
|
return argc === 2;
|
|
393
|
-
case
|
|
394
|
-
case
|
|
395
|
-
case
|
|
384
|
+
case 'BIN2DEC':
|
|
385
|
+
case 'HEX2DEC':
|
|
386
|
+
case 'OCT2DEC':
|
|
396
387
|
return argc === 1;
|
|
397
|
-
case
|
|
398
|
-
case
|
|
399
|
-
case
|
|
400
|
-
case
|
|
401
|
-
case
|
|
402
|
-
case
|
|
403
|
-
case
|
|
404
|
-
case
|
|
405
|
-
case
|
|
388
|
+
case 'BIN2HEX':
|
|
389
|
+
case 'BIN2OCT':
|
|
390
|
+
case 'DEC2BIN':
|
|
391
|
+
case 'DEC2HEX':
|
|
392
|
+
case 'DEC2OCT':
|
|
393
|
+
case 'HEX2BIN':
|
|
394
|
+
case 'HEX2OCT':
|
|
395
|
+
case 'OCT2BIN':
|
|
396
|
+
case 'OCT2HEX':
|
|
406
397
|
return argc === 1 || argc === 2;
|
|
407
|
-
case
|
|
408
|
-
case
|
|
409
|
-
case
|
|
398
|
+
case 'BITAND':
|
|
399
|
+
case 'BITOR':
|
|
400
|
+
case 'BITXOR':
|
|
410
401
|
return argc >= 2;
|
|
411
|
-
case
|
|
412
|
-
case
|
|
402
|
+
case 'BITLSHIFT':
|
|
403
|
+
case 'BITRSHIFT':
|
|
413
404
|
return argc === 2;
|
|
414
|
-
case
|
|
405
|
+
case 'MATCH':
|
|
415
406
|
return argc === 2 || argc === 3;
|
|
416
|
-
case
|
|
417
|
-
case
|
|
418
|
-
case
|
|
419
|
-
case
|
|
420
|
-
case
|
|
421
|
-
case
|
|
422
|
-
case
|
|
423
|
-
case
|
|
424
|
-
case
|
|
425
|
-
case
|
|
426
|
-
case
|
|
427
|
-
case
|
|
428
|
-
case
|
|
429
|
-
case
|
|
430
|
-
case
|
|
431
|
-
case
|
|
432
|
-
case
|
|
433
|
-
case
|
|
434
|
-
case
|
|
435
|
-
case
|
|
436
|
-
case
|
|
437
|
-
case
|
|
438
|
-
case
|
|
407
|
+
case 'CORREL':
|
|
408
|
+
case 'COVAR':
|
|
409
|
+
case 'PEARSON':
|
|
410
|
+
case 'COVARIANCE.P':
|
|
411
|
+
case 'COVARIANCE.S':
|
|
412
|
+
case 'PERCENTRANK':
|
|
413
|
+
case 'PERCENTRANK.INC':
|
|
414
|
+
case 'PERCENTRANK.EXC':
|
|
415
|
+
case 'SMALL':
|
|
416
|
+
case 'LARGE':
|
|
417
|
+
case 'PERCENTILE':
|
|
418
|
+
case 'PERCENTILE.INC':
|
|
419
|
+
case 'PERCENTILE.EXC':
|
|
420
|
+
case 'QUARTILE':
|
|
421
|
+
case 'QUARTILE.INC':
|
|
422
|
+
case 'QUARTILE.EXC':
|
|
423
|
+
case 'RANK':
|
|
424
|
+
case 'RANK.EQ':
|
|
425
|
+
case 'RANK.AVG':
|
|
426
|
+
case 'INTERCEPT':
|
|
427
|
+
case 'RSQ':
|
|
428
|
+
case 'SLOPE':
|
|
429
|
+
case 'STEYX':
|
|
439
430
|
return argc === 2 || argc === 3;
|
|
440
|
-
case
|
|
441
|
-
case
|
|
442
|
-
case
|
|
443
|
-
case
|
|
444
|
-
case
|
|
445
|
-
case
|
|
446
|
-
case
|
|
447
|
-
case
|
|
431
|
+
case 'MEDIAN':
|
|
432
|
+
case 'MODE.MULT':
|
|
433
|
+
case 'GCD':
|
|
434
|
+
case 'LCM':
|
|
435
|
+
case 'PRODUCT':
|
|
436
|
+
case 'GEOMEAN':
|
|
437
|
+
case 'HARMEAN':
|
|
438
|
+
case 'SUMSQ':
|
|
448
439
|
return argc >= 1;
|
|
449
|
-
case
|
|
440
|
+
case 'FREQUENCY':
|
|
450
441
|
return argc === 2;
|
|
451
|
-
case
|
|
442
|
+
case 'PROB':
|
|
452
443
|
return argc === 3 || argc === 4;
|
|
453
|
-
case
|
|
444
|
+
case 'TRIMMEAN':
|
|
454
445
|
return argc === 2;
|
|
455
|
-
case
|
|
456
|
-
case
|
|
446
|
+
case 'FORECAST':
|
|
447
|
+
case 'FORECAST.LINEAR':
|
|
457
448
|
return argc === 3;
|
|
458
|
-
case
|
|
459
|
-
case
|
|
460
|
-
case
|
|
461
|
-
case
|
|
449
|
+
case 'TREND':
|
|
450
|
+
case 'GROWTH':
|
|
451
|
+
case 'LINEST':
|
|
452
|
+
case 'LOGEST':
|
|
462
453
|
return argc >= 1 && argc <= 4;
|
|
463
|
-
case
|
|
454
|
+
case 'XMATCH':
|
|
464
455
|
return argc >= 2 && argc <= 4;
|
|
465
|
-
case
|
|
456
|
+
case 'XLOOKUP':
|
|
466
457
|
return argc >= 3 && argc <= 6;
|
|
467
|
-
case
|
|
458
|
+
case 'INDEX':
|
|
468
459
|
return argc === 2 || argc === 3;
|
|
469
|
-
case
|
|
470
|
-
case
|
|
460
|
+
case 'VLOOKUP':
|
|
461
|
+
case 'HLOOKUP':
|
|
471
462
|
return argc === 3 || argc === 4;
|
|
472
|
-
case
|
|
473
|
-
case
|
|
474
|
-
case
|
|
475
|
-
case
|
|
463
|
+
case 'LEFT':
|
|
464
|
+
case 'RIGHT':
|
|
465
|
+
case 'LEFTB':
|
|
466
|
+
case 'RIGHTB':
|
|
476
467
|
return argc === 1 || argc === 2;
|
|
477
|
-
case
|
|
478
|
-
case
|
|
468
|
+
case 'MID':
|
|
469
|
+
case 'MIDB':
|
|
479
470
|
return argc === 3;
|
|
480
|
-
case
|
|
481
|
-
case
|
|
482
|
-
case
|
|
483
|
-
case
|
|
471
|
+
case 'FIND':
|
|
472
|
+
case 'SEARCH':
|
|
473
|
+
case 'FINDB':
|
|
474
|
+
case 'SEARCHB':
|
|
484
475
|
return argc === 2 || argc === 3;
|
|
485
|
-
case
|
|
476
|
+
case 'REPLACEB':
|
|
486
477
|
return argc === 4;
|
|
487
|
-
case
|
|
488
|
-
case
|
|
489
|
-
case
|
|
478
|
+
case 'ISBLANK':
|
|
479
|
+
case 'ISNUMBER':
|
|
480
|
+
case 'ISTEXT':
|
|
490
481
|
return argc === 0 || argc === 1;
|
|
491
|
-
case
|
|
492
|
-
case
|
|
493
|
-
case
|
|
494
|
-
case
|
|
495
|
-
case
|
|
496
|
-
case
|
|
482
|
+
case 'ROUND':
|
|
483
|
+
case 'ROUNDUP':
|
|
484
|
+
case 'ROUNDDOWN':
|
|
485
|
+
case 'FLOOR':
|
|
486
|
+
case 'CEILING':
|
|
487
|
+
case 'LOG':
|
|
497
488
|
return argc === 1 || argc === 2;
|
|
498
|
-
case
|
|
499
|
-
case
|
|
500
|
-
case
|
|
501
|
-
case
|
|
502
|
-
case
|
|
503
|
-
case
|
|
504
|
-
case
|
|
505
|
-
return argc === 1 || (argc === 0 && (callee ===
|
|
506
|
-
case
|
|
507
|
-
case
|
|
508
|
-
case
|
|
509
|
-
case
|
|
510
|
-
case
|
|
511
|
-
case
|
|
512
|
-
case
|
|
513
|
-
case
|
|
489
|
+
case 'T':
|
|
490
|
+
case 'N':
|
|
491
|
+
case 'TYPE':
|
|
492
|
+
case 'GAUSS':
|
|
493
|
+
case 'PHI':
|
|
494
|
+
case 'NORMSDIST':
|
|
495
|
+
case 'NORMSINV':
|
|
496
|
+
return argc === 1 || (argc === 0 && (callee === 'T' || callee === 'N' || callee === 'TYPE'));
|
|
497
|
+
case 'DELTA':
|
|
498
|
+
case 'GESTEP':
|
|
499
|
+
case 'LOGNORMDIST':
|
|
500
|
+
case 'EFFECT':
|
|
501
|
+
case 'NOMINAL':
|
|
502
|
+
case 'RRI':
|
|
503
|
+
case 'PERMUT':
|
|
504
|
+
case 'PERMUTATIONA':
|
|
514
505
|
return argc === 2;
|
|
515
|
-
case
|
|
516
|
-
case
|
|
517
|
-
case
|
|
518
|
-
case
|
|
519
|
-
case
|
|
520
|
-
case
|
|
521
|
-
case
|
|
522
|
-
case
|
|
523
|
-
case
|
|
506
|
+
case 'STANDARDIZE':
|
|
507
|
+
case 'NORMINV':
|
|
508
|
+
case 'LOGINV':
|
|
509
|
+
case 'PDURATION':
|
|
510
|
+
case 'CONFIDENCE.NORM':
|
|
511
|
+
case 'CONFIDENCE':
|
|
512
|
+
case 'CONFIDENCE.T':
|
|
513
|
+
case 'CRITBINOM':
|
|
514
|
+
case 'BINOM.INV':
|
|
524
515
|
return argc === 3;
|
|
525
|
-
case
|
|
516
|
+
case 'ERF':
|
|
526
517
|
return argc === 1 || argc === 2;
|
|
527
|
-
case
|
|
528
|
-
case
|
|
529
|
-
case
|
|
530
|
-
case
|
|
531
|
-
case
|
|
532
|
-
case
|
|
533
|
-
case
|
|
534
|
-
case
|
|
518
|
+
case 'ERF.PRECISE':
|
|
519
|
+
case 'ERFC':
|
|
520
|
+
case 'ERFC.PRECISE':
|
|
521
|
+
case 'FISHER':
|
|
522
|
+
case 'FISHERINV':
|
|
523
|
+
case 'GAMMALN':
|
|
524
|
+
case 'GAMMALN.PRECISE':
|
|
525
|
+
case 'GAMMA':
|
|
535
526
|
return argc === 1;
|
|
536
|
-
case
|
|
537
|
-
case
|
|
527
|
+
case 'GAMMA.INV':
|
|
528
|
+
case 'GAMMAINV':
|
|
538
529
|
return argc === 3;
|
|
539
|
-
case
|
|
540
|
-
case
|
|
541
|
-
case
|
|
542
|
-
case
|
|
543
|
-
case
|
|
544
|
-
case
|
|
545
|
-
case
|
|
546
|
-
case
|
|
547
|
-
case
|
|
548
|
-
case
|
|
549
|
-
case
|
|
550
|
-
case
|
|
551
|
-
case
|
|
530
|
+
case 'CHIDIST':
|
|
531
|
+
case 'LEGACY.CHIDIST':
|
|
532
|
+
case 'CHIINV':
|
|
533
|
+
case 'CHISQ.DIST.RT':
|
|
534
|
+
case 'CHISQ.INV.RT':
|
|
535
|
+
case 'CHISQDIST':
|
|
536
|
+
case 'CHISQINV':
|
|
537
|
+
case 'LEGACY.CHIINV':
|
|
538
|
+
case 'CHISQ.TEST':
|
|
539
|
+
case 'CHITEST':
|
|
540
|
+
case 'LEGACY.CHITEST':
|
|
541
|
+
case 'F.TEST':
|
|
542
|
+
case 'FTEST':
|
|
552
543
|
return argc === 2;
|
|
553
|
-
case
|
|
554
|
-
case
|
|
544
|
+
case 'Z.TEST':
|
|
545
|
+
case 'ZTEST':
|
|
555
546
|
return argc === 2 || argc === 3;
|
|
556
|
-
case
|
|
557
|
-
case
|
|
558
|
-
case
|
|
547
|
+
case 'F.DIST.RT':
|
|
548
|
+
case 'FDIST':
|
|
549
|
+
case 'LEGACY.FDIST':
|
|
559
550
|
return argc === 3;
|
|
560
|
-
case
|
|
551
|
+
case 'CHISQ.INV':
|
|
561
552
|
return argc === 2;
|
|
562
|
-
case
|
|
553
|
+
case 'CHISQ.DIST':
|
|
563
554
|
return argc === 3;
|
|
564
|
-
case
|
|
565
|
-
case
|
|
555
|
+
case 'BETA.INV':
|
|
556
|
+
case 'BETAINV':
|
|
566
557
|
return argc >= 3 && argc <= 5;
|
|
567
|
-
case
|
|
558
|
+
case 'BETA.DIST':
|
|
568
559
|
return argc >= 4 && argc <= 6;
|
|
569
|
-
case
|
|
560
|
+
case 'BETADIST':
|
|
570
561
|
return argc >= 3 && argc <= 5;
|
|
571
|
-
case
|
|
562
|
+
case 'F.DIST':
|
|
572
563
|
return argc === 4;
|
|
573
|
-
case
|
|
564
|
+
case 'T.DIST':
|
|
574
565
|
return argc === 3;
|
|
575
|
-
case
|
|
576
|
-
case
|
|
577
|
-
case
|
|
578
|
-
case
|
|
579
|
-
case
|
|
566
|
+
case 'T.DIST.RT':
|
|
567
|
+
case 'T.DIST.2T':
|
|
568
|
+
case 'T.INV':
|
|
569
|
+
case 'T.INV.2T':
|
|
570
|
+
case 'TINV':
|
|
580
571
|
return argc === 2;
|
|
581
|
-
case
|
|
572
|
+
case 'TDIST':
|
|
582
573
|
return argc === 3;
|
|
583
|
-
case
|
|
584
|
-
case
|
|
574
|
+
case 'T.TEST':
|
|
575
|
+
case 'TTEST':
|
|
585
576
|
return argc === 4;
|
|
586
|
-
case
|
|
587
|
-
case
|
|
588
|
-
case
|
|
589
|
-
case
|
|
577
|
+
case 'F.INV':
|
|
578
|
+
case 'F.INV.RT':
|
|
579
|
+
case 'FINV':
|
|
580
|
+
case 'LEGACY.FINV':
|
|
590
581
|
return argc === 3;
|
|
591
|
-
case
|
|
592
|
-
case
|
|
593
|
-
case
|
|
594
|
-
case
|
|
595
|
-
case
|
|
596
|
-
case
|
|
597
|
-
case
|
|
582
|
+
case 'WEIBULL':
|
|
583
|
+
case 'WEIBULL.DIST':
|
|
584
|
+
case 'GAMMADIST':
|
|
585
|
+
case 'GAMMA.DIST':
|
|
586
|
+
case 'BINOMDIST':
|
|
587
|
+
case 'BINOM.DIST':
|
|
588
|
+
case 'NEGBINOM.DIST':
|
|
598
589
|
return argc === 4;
|
|
599
|
-
case
|
|
600
|
-
case
|
|
601
|
-
case
|
|
602
|
-
case
|
|
603
|
-
case
|
|
590
|
+
case 'EXPONDIST':
|
|
591
|
+
case 'EXPON.DIST':
|
|
592
|
+
case 'POISSON':
|
|
593
|
+
case 'POISSON.DIST':
|
|
594
|
+
case 'NEGBINOMDIST':
|
|
604
595
|
return argc === 3;
|
|
605
|
-
case
|
|
596
|
+
case 'BINOM.DIST.RANGE':
|
|
606
597
|
return argc === 3 || argc === 4;
|
|
607
|
-
case
|
|
598
|
+
case 'HYPGEOMDIST':
|
|
608
599
|
return argc === 4;
|
|
609
|
-
case
|
|
600
|
+
case 'HYPGEOM.DIST':
|
|
610
601
|
return argc === 5;
|
|
611
|
-
case
|
|
602
|
+
case 'NORMDIST':
|
|
612
603
|
return argc === 4;
|
|
613
|
-
case
|
|
604
|
+
case 'NORM.DIST':
|
|
614
605
|
return argc === 4;
|
|
615
|
-
case
|
|
606
|
+
case 'NORM.INV':
|
|
616
607
|
return argc === 3;
|
|
617
|
-
case
|
|
608
|
+
case 'NORM.S.DIST':
|
|
618
609
|
return argc === 1 || argc === 2;
|
|
619
|
-
case
|
|
610
|
+
case 'NORM.S.INV':
|
|
620
611
|
return argc === 1;
|
|
621
|
-
case
|
|
612
|
+
case 'LOGNORM.DIST':
|
|
622
613
|
return argc === 3 || argc === 4;
|
|
623
|
-
case
|
|
614
|
+
case 'LOGNORM.INV':
|
|
624
615
|
return argc === 3;
|
|
625
|
-
case
|
|
626
|
-
case
|
|
627
|
-
case
|
|
628
|
-
case
|
|
629
|
-
case
|
|
630
|
-
case
|
|
631
|
-
case
|
|
632
|
-
case
|
|
633
|
-
case
|
|
634
|
-
case
|
|
635
|
-
case
|
|
636
|
-
case
|
|
637
|
-
case
|
|
638
|
-
case
|
|
639
|
-
case
|
|
640
|
-
case
|
|
641
|
-
case
|
|
642
|
-
case
|
|
616
|
+
case 'MODE':
|
|
617
|
+
case 'MODE.SNGL':
|
|
618
|
+
case 'STDEV':
|
|
619
|
+
case 'STDEV.P':
|
|
620
|
+
case 'STDEV.S':
|
|
621
|
+
case 'STDEVA':
|
|
622
|
+
case 'STDEVP':
|
|
623
|
+
case 'STDEVPA':
|
|
624
|
+
case 'VAR':
|
|
625
|
+
case 'VAR.P':
|
|
626
|
+
case 'VAR.S':
|
|
627
|
+
case 'VARA':
|
|
628
|
+
case 'VARP':
|
|
629
|
+
case 'VARPA':
|
|
630
|
+
case 'SKEW':
|
|
631
|
+
case 'SKEW.P':
|
|
632
|
+
case 'KURT':
|
|
633
|
+
case 'NPV':
|
|
643
634
|
return argc >= 1;
|
|
644
|
-
case
|
|
645
|
-
case
|
|
646
|
-
case
|
|
647
|
-
case
|
|
635
|
+
case 'FV':
|
|
636
|
+
case 'PV':
|
|
637
|
+
case 'PMT':
|
|
638
|
+
case 'NPER':
|
|
648
639
|
return argc >= 3 && argc <= 5;
|
|
649
|
-
case
|
|
640
|
+
case 'RATE':
|
|
650
641
|
return argc >= 3 && argc <= 6;
|
|
651
|
-
case
|
|
652
|
-
case
|
|
642
|
+
case 'IPMT':
|
|
643
|
+
case 'PPMT':
|
|
653
644
|
return argc >= 4 && argc <= 6;
|
|
654
|
-
case
|
|
645
|
+
case 'ISPMT':
|
|
655
646
|
return argc === 4;
|
|
656
|
-
case
|
|
657
|
-
case
|
|
647
|
+
case 'CUMIPMT':
|
|
648
|
+
case 'CUMPRINC':
|
|
658
649
|
return argc === 6;
|
|
659
|
-
case
|
|
660
|
-
case
|
|
661
|
-
case
|
|
650
|
+
case 'DATE':
|
|
651
|
+
case 'TIME':
|
|
652
|
+
case 'DATEDIF':
|
|
662
653
|
return argc === 3;
|
|
663
|
-
case
|
|
654
|
+
case 'FVSCHEDULE':
|
|
664
655
|
return argc >= 2;
|
|
665
|
-
case
|
|
656
|
+
case 'SLN':
|
|
666
657
|
return argc === 3;
|
|
667
|
-
case
|
|
668
|
-
case
|
|
658
|
+
case 'DB':
|
|
659
|
+
case 'DDB':
|
|
669
660
|
return argc === 4 || argc === 5;
|
|
670
|
-
case
|
|
661
|
+
case 'SYD':
|
|
671
662
|
return argc === 4;
|
|
672
|
-
case
|
|
663
|
+
case 'VDB':
|
|
673
664
|
return argc >= 5 && argc <= 7;
|
|
674
|
-
case
|
|
675
|
-
case
|
|
665
|
+
case 'EDATE':
|
|
666
|
+
case 'EOMONTH':
|
|
676
667
|
return argc === 2;
|
|
677
|
-
case
|
|
678
|
-
case
|
|
679
|
-
case
|
|
668
|
+
case 'AND':
|
|
669
|
+
case 'OR':
|
|
670
|
+
case 'XOR':
|
|
680
671
|
return argc >= 1;
|
|
681
|
-
case
|
|
672
|
+
case 'SWITCH':
|
|
682
673
|
return argc >= 3;
|
|
683
|
-
case
|
|
674
|
+
case 'SEQUENCE':
|
|
684
675
|
return argc >= 1 && argc <= 4;
|
|
685
|
-
case
|
|
676
|
+
case 'EXPAND':
|
|
686
677
|
return argc >= 2 && argc <= 4;
|
|
687
|
-
case
|
|
678
|
+
case 'FILTER':
|
|
688
679
|
return argc === 2 || argc === 3;
|
|
689
|
-
case
|
|
680
|
+
case 'UNIQUE':
|
|
690
681
|
return argc >= 1 && argc <= 3;
|
|
691
|
-
case
|
|
682
|
+
case 'TRIMRANGE':
|
|
692
683
|
return argc >= 1 && argc <= 3;
|
|
693
|
-
case
|
|
684
|
+
case 'OFFSET':
|
|
694
685
|
return argc >= 3 && argc <= 5;
|
|
695
|
-
case
|
|
696
|
-
case
|
|
686
|
+
case 'TAKE':
|
|
687
|
+
case 'DROP':
|
|
697
688
|
return argc >= 1 && argc <= 3;
|
|
698
|
-
case
|
|
699
|
-
case
|
|
689
|
+
case 'CHOOSECOLS':
|
|
690
|
+
case 'CHOOSEROWS':
|
|
700
691
|
return argc >= 2;
|
|
701
|
-
case
|
|
692
|
+
case 'SORT':
|
|
702
693
|
return argc >= 1 && argc <= 4;
|
|
703
|
-
case
|
|
694
|
+
case 'SORTBY':
|
|
704
695
|
return argc >= 2;
|
|
705
|
-
case
|
|
706
|
-
case
|
|
696
|
+
case 'TOCOL':
|
|
697
|
+
case 'TOROW':
|
|
707
698
|
return argc >= 1 && argc <= 3;
|
|
708
|
-
case
|
|
709
|
-
case
|
|
699
|
+
case 'WRAPROWS':
|
|
700
|
+
case 'WRAPCOLS':
|
|
710
701
|
return argc >= 2 && argc <= 4;
|
|
711
|
-
case
|
|
702
|
+
case 'LOOKUP':
|
|
712
703
|
return argc === 2 || argc === 3;
|
|
713
|
-
case
|
|
714
|
-
case
|
|
715
|
-
case
|
|
716
|
-
case
|
|
704
|
+
case 'AREAS':
|
|
705
|
+
case 'COLUMNS':
|
|
706
|
+
case 'ROWS':
|
|
707
|
+
case 'TRANSPOSE':
|
|
717
708
|
return argc === 1;
|
|
718
|
-
case
|
|
719
|
-
case
|
|
709
|
+
case 'HSTACK':
|
|
710
|
+
case 'VSTACK':
|
|
720
711
|
return argc >= 1;
|
|
721
|
-
case
|
|
712
|
+
case 'ARRAYTOTEXT':
|
|
722
713
|
return argc === 1 || argc === 2;
|
|
723
|
-
case
|
|
724
|
-
case
|
|
714
|
+
case 'MINIFS':
|
|
715
|
+
case 'MAXIFS':
|
|
725
716
|
return argc >= 3 && argc % 2 === 1;
|
|
726
717
|
default:
|
|
727
718
|
return true;
|
|
@@ -733,350 +724,312 @@ export function isWasmSafeBuiltinArgs(callee, args, deps) {
|
|
|
733
724
|
const isCellRangeArg = (arg) => deps.isWasmSafe(arg, true) && isCellRangeNode(arg);
|
|
734
725
|
const isCellVectorArg = (arg) => deps.isWasmSafe(arg, true) && isCellVectorNode(arg);
|
|
735
726
|
const isCellOrScalarArg = (arg) => isCellVectorArg(arg) || isScalarArg(arg);
|
|
736
|
-
const isNativeSequenceArg = (arg) => arg.kind ===
|
|
737
|
-
arg.callee.toUpperCase() ===
|
|
738
|
-
isWasmSafeBuiltinArity(
|
|
727
|
+
const isNativeSequenceArg = (arg) => arg.kind === 'CallExpr' &&
|
|
728
|
+
arg.callee.toUpperCase() === 'SEQUENCE' &&
|
|
729
|
+
isWasmSafeBuiltinArity('SEQUENCE', arg.args.length) &&
|
|
739
730
|
arg.args.every((child) => deps.isWasmSafe(child));
|
|
740
731
|
switch (callee) {
|
|
741
|
-
case
|
|
742
|
-
case
|
|
743
|
-
case
|
|
744
|
-
case
|
|
745
|
-
case
|
|
746
|
-
case
|
|
747
|
-
case
|
|
732
|
+
case 'SUM':
|
|
733
|
+
case 'AVG':
|
|
734
|
+
case 'MIN':
|
|
735
|
+
case 'MAX':
|
|
736
|
+
case 'COUNT':
|
|
737
|
+
case 'COUNTA':
|
|
738
|
+
case 'COUNTBLANK':
|
|
748
739
|
return args.every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg));
|
|
749
|
-
case
|
|
750
|
-
return
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
case "COUNTIF":
|
|
754
|
-
case "USE.THE.COUNTIF":
|
|
740
|
+
case 'CHOOSE':
|
|
741
|
+
return argc >= 2 && isScalarArg(args[0]) && args.slice(1).every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg));
|
|
742
|
+
case 'COUNTIF':
|
|
743
|
+
case 'USE.THE.COUNTIF':
|
|
755
744
|
return args.length === 2 && isCellRangeArg(args[0]) && isScalarArg(args[1]);
|
|
756
|
-
case
|
|
745
|
+
case 'COUNTIFS':
|
|
757
746
|
if (args.length === 0 || args.length % 2 !== 0) {
|
|
758
747
|
return false;
|
|
759
748
|
}
|
|
760
749
|
return args.every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
|
|
761
|
-
case
|
|
762
|
-
case
|
|
763
|
-
case
|
|
764
|
-
case
|
|
765
|
-
case
|
|
766
|
-
case
|
|
767
|
-
case
|
|
768
|
-
case
|
|
769
|
-
case
|
|
770
|
-
case
|
|
771
|
-
case
|
|
772
|
-
case
|
|
773
|
-
return
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
case
|
|
778
|
-
case
|
|
779
|
-
case "LEGACY.CHITEST":
|
|
780
|
-
case "F.TEST":
|
|
781
|
-
case "FTEST":
|
|
750
|
+
case 'DAVERAGE':
|
|
751
|
+
case 'DCOUNT':
|
|
752
|
+
case 'DCOUNTA':
|
|
753
|
+
case 'DGET':
|
|
754
|
+
case 'DMAX':
|
|
755
|
+
case 'DMIN':
|
|
756
|
+
case 'DPRODUCT':
|
|
757
|
+
case 'DSTDEV':
|
|
758
|
+
case 'DSTDEVP':
|
|
759
|
+
case 'DSUM':
|
|
760
|
+
case 'DVAR':
|
|
761
|
+
case 'DVARP':
|
|
762
|
+
return argc === 3 && isCellRangeArg(args[0]) && deps.isWasmSafe(args[1], true) && isCellRangeArg(args[2]);
|
|
763
|
+
case 'CHISQ.TEST':
|
|
764
|
+
case 'CHITEST':
|
|
765
|
+
case 'LEGACY.CHITEST':
|
|
766
|
+
case 'F.TEST':
|
|
767
|
+
case 'FTEST':
|
|
782
768
|
return argc === 2 && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
783
|
-
case
|
|
784
|
-
case
|
|
785
|
-
return
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
isScalarArg(args[2]) &&
|
|
789
|
-
isScalarArg(args[3]));
|
|
790
|
-
case "Z.TEST":
|
|
791
|
-
case "ZTEST":
|
|
769
|
+
case 'T.TEST':
|
|
770
|
+
case 'TTEST':
|
|
771
|
+
return argc === 4 && isCellRangeArg(args[0]) && isCellRangeArg(args[1]) && isScalarArg(args[2]) && isScalarArg(args[3]);
|
|
772
|
+
case 'Z.TEST':
|
|
773
|
+
case 'ZTEST':
|
|
792
774
|
return (argc === 2 || argc === 3) && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
793
|
-
case
|
|
794
|
-
case
|
|
775
|
+
case 'SUMIF':
|
|
776
|
+
case 'AVERAGEIF':
|
|
795
777
|
if (args.length !== 2 && args.length !== 3) {
|
|
796
778
|
return false;
|
|
797
779
|
}
|
|
798
|
-
return
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
case "SUMIFS":
|
|
802
|
-
case "AVERAGEIFS":
|
|
780
|
+
return isCellRangeArg(args[0]) && isScalarArg(args[1]) && (args.length === 2 || isCellRangeArg(args[2]));
|
|
781
|
+
case 'SUMIFS':
|
|
782
|
+
case 'AVERAGEIFS':
|
|
803
783
|
if (args.length < 3 || args.length % 2 === 0) {
|
|
804
784
|
return false;
|
|
805
785
|
}
|
|
806
786
|
if (!isCellRangeArg(args[0])) {
|
|
807
787
|
return false;
|
|
808
788
|
}
|
|
809
|
-
return args
|
|
810
|
-
|
|
811
|
-
.every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
|
|
812
|
-
case "SUMPRODUCT":
|
|
789
|
+
return args.slice(1).every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
|
|
790
|
+
case 'SUMPRODUCT':
|
|
813
791
|
return args.length >= 1 && args.every((arg) => isCellRangeArg(arg));
|
|
814
|
-
case
|
|
792
|
+
case 'MATCH':
|
|
815
793
|
return ((args.length === 2 || args.length === 3) &&
|
|
816
794
|
isScalarArg(args[0]) &&
|
|
817
795
|
isCellVectorArg(args[1]) &&
|
|
818
796
|
(args.length === 2 || isScalarArg(args[2])));
|
|
819
|
-
case
|
|
820
|
-
case
|
|
821
|
-
case
|
|
822
|
-
case
|
|
823
|
-
case
|
|
824
|
-
case
|
|
825
|
-
case
|
|
826
|
-
case
|
|
827
|
-
case
|
|
797
|
+
case 'CORREL':
|
|
798
|
+
case 'COVAR':
|
|
799
|
+
case 'PEARSON':
|
|
800
|
+
case 'COVARIANCE.P':
|
|
801
|
+
case 'COVARIANCE.S':
|
|
802
|
+
case 'INTERCEPT':
|
|
803
|
+
case 'RSQ':
|
|
804
|
+
case 'SLOPE':
|
|
805
|
+
case 'STEYX':
|
|
828
806
|
return args.length === 2 && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
829
|
-
case
|
|
807
|
+
case 'MEDIAN':
|
|
830
808
|
return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
831
|
-
case
|
|
809
|
+
case 'MODE.MULT':
|
|
832
810
|
return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
833
|
-
case
|
|
834
|
-
return
|
|
835
|
-
case
|
|
836
|
-
case
|
|
837
|
-
case
|
|
838
|
-
case
|
|
811
|
+
case 'FREQUENCY':
|
|
812
|
+
return args.length === 2 && deps.isWasmSafe(args[0], true) && deps.isWasmSafe(args[1], true);
|
|
813
|
+
case 'BESSELI':
|
|
814
|
+
case 'BESSELJ':
|
|
815
|
+
case 'BESSELK':
|
|
816
|
+
case 'BESSELY':
|
|
839
817
|
return args.length === 2 && isScalarArg(args[0]) && isScalarArg(args[1]);
|
|
840
|
-
case
|
|
841
|
-
case
|
|
842
|
-
case
|
|
843
|
-
case
|
|
844
|
-
case
|
|
845
|
-
case
|
|
846
|
-
case
|
|
847
|
-
case
|
|
818
|
+
case 'SMALL':
|
|
819
|
+
case 'LARGE':
|
|
820
|
+
case 'PERCENTILE':
|
|
821
|
+
case 'PERCENTILE.INC':
|
|
822
|
+
case 'PERCENTILE.EXC':
|
|
823
|
+
case 'QUARTILE':
|
|
824
|
+
case 'QUARTILE.INC':
|
|
825
|
+
case 'QUARTILE.EXC':
|
|
848
826
|
return args.length === 2 && deps.isWasmSafe(args[0], true) && isScalarArg(args[1]);
|
|
849
|
-
case
|
|
850
|
-
case
|
|
851
|
-
case
|
|
827
|
+
case 'PERCENTRANK':
|
|
828
|
+
case 'PERCENTRANK.INC':
|
|
829
|
+
case 'PERCENTRANK.EXC':
|
|
852
830
|
return ((args.length === 2 || args.length === 3) &&
|
|
853
831
|
deps.isWasmSafe(args[0], true) &&
|
|
854
832
|
isScalarArg(args[1]) &&
|
|
855
833
|
(args.length === 2 || isScalarArg(args[2])));
|
|
856
|
-
case
|
|
857
|
-
case
|
|
858
|
-
case
|
|
834
|
+
case 'RANK':
|
|
835
|
+
case 'RANK.EQ':
|
|
836
|
+
case 'RANK.AVG':
|
|
859
837
|
return ((args.length === 2 || args.length === 3) &&
|
|
860
838
|
isScalarArg(args[0]) &&
|
|
861
839
|
deps.isWasmSafe(args[1], true) &&
|
|
862
840
|
(args.length === 2 || isScalarArg(args[2])));
|
|
863
|
-
case
|
|
864
|
-
case
|
|
865
|
-
return
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
case
|
|
870
|
-
case "GROWTH":
|
|
871
|
-
case "LINEST":
|
|
872
|
-
case "LOGEST":
|
|
841
|
+
case 'FORECAST':
|
|
842
|
+
case 'FORECAST.LINEAR':
|
|
843
|
+
return args.length === 3 && isScalarArg(args[0]) && deps.isWasmSafe(args[1], true) && deps.isWasmSafe(args[2], true);
|
|
844
|
+
case 'TREND':
|
|
845
|
+
case 'GROWTH':
|
|
846
|
+
case 'LINEST':
|
|
847
|
+
case 'LOGEST':
|
|
873
848
|
return (args.length >= 1 &&
|
|
874
849
|
args.length <= 4 &&
|
|
875
850
|
deps.isWasmSafe(args[0], true) &&
|
|
876
851
|
(args.length < 2 || deps.isWasmSafe(args[1], true)) &&
|
|
877
852
|
(args.length < 3 || deps.isWasmSafe(args[2], true)) &&
|
|
878
853
|
(args.length < 4 || isScalarArg(args[3])));
|
|
879
|
-
case
|
|
854
|
+
case 'XMATCH':
|
|
880
855
|
return (args.length >= 2 &&
|
|
881
856
|
args.length <= 4 &&
|
|
882
857
|
isScalarArg(args[0]) &&
|
|
883
858
|
isCellVectorArg(args[1]) &&
|
|
884
859
|
args.slice(2).every((arg) => isScalarArg(arg)));
|
|
885
|
-
case
|
|
860
|
+
case 'XLOOKUP':
|
|
886
861
|
return (args.length >= 3 &&
|
|
887
862
|
args.length <= 6 &&
|
|
888
863
|
isScalarArg(args[0]) &&
|
|
889
864
|
isCellVectorArg(args[1]) &&
|
|
890
865
|
isCellVectorArg(args[2]) &&
|
|
891
866
|
args.slice(3).every((arg) => isScalarArg(arg)));
|
|
892
|
-
case
|
|
867
|
+
case 'INDEX':
|
|
893
868
|
return ((args.length === 2 || args.length === 3) &&
|
|
894
869
|
isCellRangeArg(args[0]) &&
|
|
895
870
|
isScalarArg(args[1]) &&
|
|
896
871
|
(args.length === 2 || isScalarArg(args[2])));
|
|
897
|
-
case
|
|
898
|
-
case
|
|
872
|
+
case 'VLOOKUP':
|
|
873
|
+
case 'HLOOKUP':
|
|
899
874
|
return ((args.length === 3 || args.length === 4) &&
|
|
900
875
|
isScalarArg(args[0]) &&
|
|
901
876
|
isCellRangeArg(args[1]) &&
|
|
902
877
|
isScalarArg(args[2]) &&
|
|
903
878
|
(args.length === 3 || isScalarArg(args[3])));
|
|
904
|
-
case
|
|
905
|
-
case
|
|
906
|
-
case
|
|
907
|
-
case
|
|
908
|
-
case
|
|
909
|
-
case
|
|
910
|
-
case
|
|
911
|
-
case
|
|
912
|
-
case
|
|
913
|
-
case
|
|
914
|
-
case
|
|
915
|
-
case
|
|
916
|
-
case
|
|
917
|
-
case
|
|
918
|
-
case
|
|
919
|
-
case
|
|
920
|
-
case
|
|
921
|
-
case
|
|
922
|
-
case
|
|
923
|
-
case
|
|
924
|
-
case
|
|
925
|
-
case
|
|
926
|
-
case
|
|
927
|
-
case
|
|
928
|
-
case
|
|
929
|
-
case
|
|
930
|
-
case
|
|
931
|
-
case
|
|
932
|
-
case
|
|
933
|
-
case
|
|
879
|
+
case 'DAYS':
|
|
880
|
+
case 'DAYS360':
|
|
881
|
+
case 'YEARFRAC':
|
|
882
|
+
case 'DISC':
|
|
883
|
+
case 'INTRATE':
|
|
884
|
+
case 'RECEIVED':
|
|
885
|
+
case 'PRICEDISC':
|
|
886
|
+
case 'YIELDDISC':
|
|
887
|
+
case 'COUPDAYBS':
|
|
888
|
+
case 'COUPDAYS':
|
|
889
|
+
case 'COUPDAYSNC':
|
|
890
|
+
case 'COUPNCD':
|
|
891
|
+
case 'COUPNUM':
|
|
892
|
+
case 'COUPPCD':
|
|
893
|
+
case 'PRICEMAT':
|
|
894
|
+
case 'YIELDMAT':
|
|
895
|
+
case 'ODDFPRICE':
|
|
896
|
+
case 'ODDFYIELD':
|
|
897
|
+
case 'ODDLPRICE':
|
|
898
|
+
case 'ODDLYIELD':
|
|
899
|
+
case 'PRICE':
|
|
900
|
+
case 'YIELD':
|
|
901
|
+
case 'DURATION':
|
|
902
|
+
case 'MDURATION':
|
|
903
|
+
case 'TBILLPRICE':
|
|
904
|
+
case 'TBILLYIELD':
|
|
905
|
+
case 'TBILLEQ':
|
|
906
|
+
case 'ISOWEEKNUM':
|
|
907
|
+
case 'TIMEVALUE':
|
|
908
|
+
case 'WEEKNUM':
|
|
934
909
|
return args.every((arg) => isScalarArg(arg));
|
|
935
|
-
case
|
|
910
|
+
case 'EXPAND':
|
|
936
911
|
return (argc >= 2 &&
|
|
937
912
|
argc <= 4 &&
|
|
938
913
|
deps.isWasmSafe(args[0], true) &&
|
|
939
914
|
isScalarArg(args[1]) &&
|
|
940
915
|
(argc < 3 || isScalarArg(args[2])) &&
|
|
941
916
|
(argc < 4 || isScalarArg(args[3])));
|
|
942
|
-
case
|
|
943
|
-
case
|
|
944
|
-
case
|
|
945
|
-
case
|
|
946
|
-
case
|
|
947
|
-
case
|
|
948
|
-
case
|
|
949
|
-
case
|
|
950
|
-
case
|
|
951
|
-
case
|
|
952
|
-
case
|
|
953
|
-
case
|
|
954
|
-
case
|
|
955
|
-
case
|
|
956
|
-
case
|
|
957
|
-
case
|
|
958
|
-
case
|
|
959
|
-
case
|
|
960
|
-
case
|
|
961
|
-
case
|
|
962
|
-
case
|
|
963
|
-
case
|
|
964
|
-
case
|
|
965
|
-
case
|
|
966
|
-
case
|
|
967
|
-
case
|
|
968
|
-
case
|
|
969
|
-
case
|
|
970
|
-
case
|
|
971
|
-
case
|
|
972
|
-
case
|
|
973
|
-
case
|
|
974
|
-
case
|
|
975
|
-
case
|
|
976
|
-
case
|
|
977
|
-
case
|
|
978
|
-
case
|
|
979
|
-
case
|
|
980
|
-
case
|
|
981
|
-
case
|
|
917
|
+
case 'WORKDAY':
|
|
918
|
+
case 'NETWORKDAYS':
|
|
919
|
+
case 'WORKDAY.INTL':
|
|
920
|
+
case 'NETWORKDAYS.INTL':
|
|
921
|
+
case 'NUMBERVALUE':
|
|
922
|
+
case 'TEXT':
|
|
923
|
+
case 'VALUETOTEXT':
|
|
924
|
+
case 'TEXTBEFORE':
|
|
925
|
+
case 'TEXTAFTER':
|
|
926
|
+
case 'CHAR':
|
|
927
|
+
case 'CODE':
|
|
928
|
+
case 'UNICODE':
|
|
929
|
+
case 'UNICHAR':
|
|
930
|
+
case 'CLEAN':
|
|
931
|
+
case 'ASC':
|
|
932
|
+
case 'JIS':
|
|
933
|
+
case 'DBCS':
|
|
934
|
+
case 'BAHTTEXT':
|
|
935
|
+
case 'TEXTSPLIT':
|
|
936
|
+
case 'CONVERT':
|
|
937
|
+
case 'EUROCONVERT':
|
|
938
|
+
case 'BASE':
|
|
939
|
+
case 'DECIMAL':
|
|
940
|
+
case 'BIN2DEC':
|
|
941
|
+
case 'BIN2HEX':
|
|
942
|
+
case 'BIN2OCT':
|
|
943
|
+
case 'DEC2BIN':
|
|
944
|
+
case 'DEC2HEX':
|
|
945
|
+
case 'DEC2OCT':
|
|
946
|
+
case 'HEX2BIN':
|
|
947
|
+
case 'HEX2DEC':
|
|
948
|
+
case 'HEX2OCT':
|
|
949
|
+
case 'OCT2BIN':
|
|
950
|
+
case 'OCT2DEC':
|
|
951
|
+
case 'OCT2HEX':
|
|
952
|
+
case 'BITAND':
|
|
953
|
+
case 'BITOR':
|
|
954
|
+
case 'BITXOR':
|
|
955
|
+
case 'BITLSHIFT':
|
|
956
|
+
case 'BITRSHIFT':
|
|
982
957
|
return args.every((arg) => isScalarArg(arg));
|
|
983
|
-
case
|
|
958
|
+
case 'PHONETIC':
|
|
984
959
|
return argc === 1 && (isScalarArg(args[0]) || isCellRangeNode(args[0]));
|
|
985
|
-
case
|
|
960
|
+
case 'TEXTJOIN':
|
|
986
961
|
return (argc >= 3 &&
|
|
987
962
|
isScalarArg(args[0]) &&
|
|
988
963
|
isScalarArg(args[1]) &&
|
|
989
964
|
args.slice(2).every((arg) => deps.isWasmSafe(arg, true) || isNativeSequenceArg(arg)));
|
|
990
|
-
case
|
|
991
|
-
case
|
|
992
|
-
case
|
|
965
|
+
case 'REPLACE':
|
|
966
|
+
case 'SUBSTITUTE':
|
|
967
|
+
case 'REPT':
|
|
993
968
|
return args.every((arg) => isScalarArg(arg));
|
|
994
|
-
case
|
|
995
|
-
case
|
|
996
|
-
case
|
|
997
|
-
case
|
|
998
|
-
case
|
|
999
|
-
case
|
|
1000
|
-
case
|
|
1001
|
-
case
|
|
1002
|
-
case
|
|
1003
|
-
case
|
|
969
|
+
case 'OFFSET':
|
|
970
|
+
case 'TAKE':
|
|
971
|
+
case 'DROP':
|
|
972
|
+
case 'CHOOSECOLS':
|
|
973
|
+
case 'CHOOSEROWS':
|
|
974
|
+
case 'SORT':
|
|
975
|
+
case 'TOCOL':
|
|
976
|
+
case 'TOROW':
|
|
977
|
+
case 'WRAPROWS':
|
|
978
|
+
case 'WRAPCOLS':
|
|
1004
979
|
if (args.length === 0) {
|
|
1005
980
|
return false;
|
|
1006
981
|
}
|
|
1007
982
|
return isCellRangeArg(args[0]) && args.slice(1).every((arg) => isScalarArg(arg));
|
|
1008
|
-
case
|
|
1009
|
-
return ((argc === 2 || argc === 3) &&
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
argc <= 3 &&
|
|
1016
|
-
isCellRangeArg(args[0]) &&
|
|
1017
|
-
args.slice(1).every((arg) => isScalarArg(arg)));
|
|
1018
|
-
case "TRIMRANGE":
|
|
1019
|
-
return (argc >= 1 &&
|
|
1020
|
-
argc <= 3 &&
|
|
1021
|
-
deps.isWasmSafe(args[0], true) &&
|
|
1022
|
-
args.slice(1).every((arg) => isScalarArg(arg)));
|
|
1023
|
-
case "PROB":
|
|
983
|
+
case 'FILTER':
|
|
984
|
+
return ((argc === 2 || argc === 3) && isCellRangeArg(args[0]) && deps.isWasmSafe(args[1], true) && (argc === 2 || isScalarArg(args[2])));
|
|
985
|
+
case 'UNIQUE':
|
|
986
|
+
return argc >= 1 && argc <= 3 && isCellRangeArg(args[0]) && args.slice(1).every((arg) => isScalarArg(arg));
|
|
987
|
+
case 'TRIMRANGE':
|
|
988
|
+
return argc >= 1 && argc <= 3 && deps.isWasmSafe(args[0], true) && args.slice(1).every((arg) => isScalarArg(arg));
|
|
989
|
+
case 'PROB':
|
|
1024
990
|
return ((argc === 3 || argc === 4) &&
|
|
1025
991
|
deps.isWasmSafe(args[0], true) &&
|
|
1026
992
|
deps.isWasmSafe(args[1], true) &&
|
|
1027
993
|
isScalarArg(args[2]) &&
|
|
1028
994
|
(argc === 3 || isScalarArg(args[3])));
|
|
1029
|
-
case
|
|
995
|
+
case 'TRIMMEAN':
|
|
1030
996
|
return argc === 2 && deps.isWasmSafe(args[0], true) && isScalarArg(args[1]);
|
|
1031
|
-
case
|
|
997
|
+
case 'LOOKUP':
|
|
1032
998
|
if (argc < 2 || argc > 3) {
|
|
1033
999
|
return false;
|
|
1034
1000
|
}
|
|
1035
|
-
return
|
|
1036
|
-
|
|
1037
|
-
(argc === 2 || isCellVectorArg(args[2]) || isScalarArg(args[2])));
|
|
1038
|
-
case "TRANSPOSE":
|
|
1001
|
+
return isScalarArg(args[0]) && isCellOrScalarArg(args[1]) && (argc === 2 || isCellVectorArg(args[2]) || isScalarArg(args[2]));
|
|
1002
|
+
case 'TRANSPOSE':
|
|
1039
1003
|
return args.length === 1 && deps.isWasmSafe(args[0], true);
|
|
1040
|
-
case
|
|
1041
|
-
case
|
|
1004
|
+
case 'HSTACK':
|
|
1005
|
+
case 'VSTACK':
|
|
1042
1006
|
return args.length >= 1 && args.every((arg) => deps.isWasmSafe(arg, true));
|
|
1043
|
-
case
|
|
1044
|
-
case
|
|
1045
|
-
case
|
|
1007
|
+
case 'AREAS':
|
|
1008
|
+
case 'COLUMNS':
|
|
1009
|
+
case 'ROWS':
|
|
1046
1010
|
return args.length === 1 && isCellRangeArg(args[0]);
|
|
1047
|
-
case
|
|
1048
|
-
return (
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
case "MINIFS":
|
|
1052
|
-
case "MAXIFS":
|
|
1011
|
+
case 'ARRAYTOTEXT':
|
|
1012
|
+
return (argc === 1 || argc === 2) && (isCellRangeArg(args[0]) || isScalarArg(args[0])) && (argc === 1 || isScalarArg(args[1]));
|
|
1013
|
+
case 'MINIFS':
|
|
1014
|
+
case 'MAXIFS':
|
|
1053
1015
|
if (args.length < 3 || args.length % 2 === 0 || !isCellRangeArg(args[0])) {
|
|
1054
1016
|
return false;
|
|
1055
1017
|
}
|
|
1056
|
-
return args
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
case
|
|
1060
|
-
return
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
case
|
|
1064
|
-
return (argc === 3 && isCellRangeArg(args[0]) &&
|
|
1065
|
-
case
|
|
1066
|
-
return (argc === 3 && isScalarArg(args[0]) && isCellRangeArg(args[1]) && isCellRangeArg(args[2]));
|
|
1067
|
-
case "XIRR":
|
|
1068
|
-
return ((argc === 2 || argc === 3) &&
|
|
1069
|
-
isCellRangeArg(args[0]) &&
|
|
1070
|
-
isCellRangeArg(args[1]) &&
|
|
1071
|
-
(argc === 2 || isScalarArg(args[2])));
|
|
1072
|
-
case "SORTBY":
|
|
1018
|
+
return args.slice(1).every((arg, index) => (index % 2 === 0 ? isCellRangeArg(arg) : isScalarArg(arg)));
|
|
1019
|
+
case 'IRR':
|
|
1020
|
+
return (argc === 1 || argc === 2) && isCellRangeArg(args[0]) && (argc === 1 || isScalarArg(args[1]));
|
|
1021
|
+
case 'MIRR':
|
|
1022
|
+
return argc === 3 && isCellRangeArg(args[0]) && isScalarArg(args[1]) && isScalarArg(args[2]);
|
|
1023
|
+
case 'XNPV':
|
|
1024
|
+
return argc === 3 && isScalarArg(args[0]) && isCellRangeArg(args[1]) && isCellRangeArg(args[2]);
|
|
1025
|
+
case 'XIRR':
|
|
1026
|
+
return (argc === 2 || argc === 3) && isCellRangeArg(args[0]) && isCellRangeArg(args[1]) && (argc === 2 || isScalarArg(args[2]));
|
|
1027
|
+
case 'SORTBY':
|
|
1073
1028
|
if (args.length < 2) {
|
|
1074
1029
|
return false;
|
|
1075
1030
|
}
|
|
1076
1031
|
return (isCellRangeArg(args[0]) &&
|
|
1077
|
-
args
|
|
1078
|
-
.slice(1)
|
|
1079
|
-
.every((arg, index) => index % 2 === 0 ? isScalarArg(arg) || deps.isWasmSafe(arg, true) : isScalarArg(arg)));
|
|
1032
|
+
args.slice(1).every((arg, index) => (index % 2 === 0 ? isScalarArg(arg) || deps.isWasmSafe(arg, true) : isScalarArg(arg))));
|
|
1080
1033
|
default:
|
|
1081
1034
|
return args.every((arg) => deps.isWasmSafe(arg, RANGE_SAFE_BUILTINS.has(callee)));
|
|
1082
1035
|
}
|