@cloudpss/expression 0.6.0-alpha.9 → 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/dist/analyze.d.ts +6 -3
- package/dist/analyze.d.ts.map +1 -1
- package/dist/analyze.js +13 -33
- package/dist/analyze.js.map +1 -1
- package/dist/definitions/argument.d.ts +3 -11
- package/dist/definitions/argument.d.ts.map +1 -1
- package/dist/definitions/constraint.d.ts +2 -2
- package/dist/definitions/constraint.d.ts.map +1 -1
- package/dist/definitions/constraint.js +1 -1
- package/dist/definitions/constraint.js.map +1 -1
- package/dist/definitions/parameter-group.js +4 -4
- package/dist/definitions/parameter-group.js.map +1 -1
- package/dist/definitions/parameter.d.ts +22 -14
- package/dist/definitions/parameter.d.ts.map +1 -1
- package/dist/definitions/parameter.js +10 -1
- package/dist/definitions/parameter.js.map +1 -1
- package/dist/definitions/utils.d.ts +28 -0
- package/dist/definitions/utils.d.ts.map +1 -0
- package/dist/definitions/utils.js +272 -0
- package/dist/definitions/utils.js.map +1 -0
- package/dist/definitions/variable.js +1 -1
- package/dist/definitions/variable.js.map +1 -1
- package/dist/definitions.d.ts +1 -2
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +1 -1
- package/dist/definitions.js.map +1 -1
- package/dist/eval.d.ts +3 -5
- package/dist/eval.d.ts.map +1 -1
- package/dist/eval.js +12 -20
- package/dist/eval.js.map +1 -1
- package/dist/expression.d.ts +10 -4
- package/dist/expression.d.ts.map +1 -1
- package/dist/expression.js +6 -6
- package/dist/expression.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interface.d.ts +30 -0
- package/dist/interface.d.ts.map +1 -0
- package/dist/interface.js +6 -0
- package/dist/interface.js.map +1 -0
- package/dist/main.d.ts +41 -28
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +165 -149
- package/dist/main.js.map +1 -1
- package/dist/migrate.d.ts +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +25 -4
- package/dist/migrate.js.map +1 -1
- package/dist/migrator/access.d.ts.map +1 -1
- package/dist/migrator/access.js +64 -29
- package/dist/migrator/access.js.map +1 -1
- package/dist/migrator/call.d.ts.map +1 -1
- package/dist/migrator/call.js +298 -201
- package/dist/migrator/call.js.map +1 -1
- package/dist/migrator/concat.d.ts.map +1 -1
- package/dist/migrator/concat.js +15 -2
- package/dist/migrator/concat.js.map +1 -1
- package/dist/migrator/function.d.ts +6 -0
- package/dist/migrator/function.d.ts.map +1 -0
- package/dist/migrator/function.js +25 -0
- package/dist/migrator/function.js.map +1 -0
- package/dist/migrator/interface.d.ts +3 -1
- package/dist/migrator/interface.d.ts.map +1 -1
- package/dist/migrator/interface.js.map +1 -1
- package/dist/migrator/node.d.ts.map +1 -1
- package/dist/migrator/node.js +55 -7
- package/dist/migrator/node.js.map +1 -1
- package/dist/migrator/operator.d.ts.map +1 -1
- package/dist/migrator/operator.js +107 -60
- package/dist/migrator/operator.js.map +1 -1
- package/dist/migrator/serialize.d.ts +4 -0
- package/dist/migrator/serialize.d.ts.map +1 -0
- package/dist/migrator/serialize.js +21 -0
- package/dist/migrator/serialize.js.map +1 -0
- package/dist/migrator/special.d.ts.map +1 -1
- package/dist/migrator/special.js +31 -0
- package/dist/migrator/special.js.map +1 -1
- package/dist/migrator/state.d.ts +4 -4
- package/dist/migrator/state.d.ts.map +1 -1
- package/dist/migrator/state.js +29 -31
- package/dist/migrator/state.js.map +1 -1
- package/dist/migrator/symbol.d.ts.map +1 -1
- package/dist/migrator/symbol.js +34 -12
- package/dist/migrator/symbol.js.map +1 -1
- package/dist/migrator/to-type.d.ts.map +1 -1
- package/dist/migrator/to-type.js +21 -4
- package/dist/migrator/to-type.js.map +1 -1
- package/dist/migrator/utils.d.ts +6 -0
- package/dist/migrator/utils.d.ts.map +1 -1
- package/dist/migrator/utils.js +48 -1
- package/dist/migrator/utils.js.map +1 -1
- package/dist/parser.d.ts +2 -2
- package/dist/parser.d.ts.map +1 -1
- package/dist/parser.js +27 -8
- package/dist/parser.js.map +1 -1
- package/dist/re-exports.d.ts +4 -0
- package/dist/re-exports.d.ts.map +1 -0
- package/dist/re-exports.js +3 -0
- package/dist/re-exports.js.map +1 -0
- package/dist/scope.d.ts +16 -17
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +127 -66
- package/dist/scope.js.map +1 -1
- package/dist/type.d.ts +22 -10
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +21 -24
- package/dist/type.js.map +1 -1
- package/package.json +8 -5
- package/src/analyze.ts +20 -39
- package/src/definitions/argument.ts +3 -13
- package/src/definitions/constraint.ts +3 -3
- package/src/definitions/parameter-group.ts +4 -4
- package/src/definitions/parameter.ts +47 -24
- package/src/definitions/utils.ts +288 -0
- package/src/definitions/variable.ts +1 -1
- package/src/definitions.ts +1 -28
- package/src/eval.ts +16 -25
- package/src/expression.ts +16 -8
- package/src/index.ts +3 -1
- package/src/interface.ts +35 -0
- package/src/main.ts +232 -200
- package/src/migrate.ts +27 -4
- package/src/migrator/access.ts +67 -37
- package/src/migrator/call.ts +287 -190
- package/src/migrator/concat.ts +15 -2
- package/src/migrator/function.ts +27 -0
- package/src/migrator/interface.ts +3 -1
- package/src/migrator/node.ts +56 -6
- package/src/migrator/operator.ts +110 -64
- package/src/migrator/serialize.ts +21 -0
- package/src/migrator/special.ts +31 -0
- package/src/migrator/state.ts +31 -34
- package/src/migrator/symbol.ts +33 -12
- package/src/migrator/to-type.ts +23 -4
- package/src/migrator/utils.ts +48 -1
- package/src/parser.ts +33 -8
- package/src/re-exports.ts +47 -0
- package/src/scope.ts +146 -77
- package/src/type.ts +40 -25
- package/tests/analyze.ts +45 -6
- package/tests/compile.ts +65 -0
- package/tests/condition.ts +33 -17
- package/tests/definition.ts +237 -18
- package/tests/eval-complex.ts +79 -13
- package/tests/eval.ts +59 -12
- package/tests/import.ts +21 -7
- package/tests/main.ts +58 -0
- package/tests/migrate.ts +317 -0
- package/tests/scope.ts +3 -3
- package/tests/template.ts +36 -0
- package/dist/context.d.ts +0 -41
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -18
- package/dist/context.js.map +0 -1
- package/src/context.ts +0 -54
package/src/migrator/access.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isVmPrimitive, type VmValue } from '@mirascript/mirascript';
|
|
2
|
+
import { operations, serialize, serializeRecordKey } from '@mirascript/mirascript/subtle';
|
|
1
3
|
import {
|
|
2
4
|
type ConstantNode,
|
|
3
5
|
isConstantNode,
|
|
@@ -13,18 +15,17 @@ import {
|
|
|
13
15
|
import type { Result } from './interface.js';
|
|
14
16
|
import { migrateAtomic, migrateExpr } from './node.js';
|
|
15
17
|
import type { State } from './state.js';
|
|
16
|
-
import { unsupportedNode } from './utils.js';
|
|
17
|
-
import { serialize, serializePropName } from '@mirascript/mirascript/subtle';
|
|
18
|
+
import { constantValue, len, unsupportedNode } from './utils.js';
|
|
18
19
|
|
|
19
20
|
/** 常量访问 */
|
|
20
|
-
function constIndexing(node: ConstantNode)
|
|
21
|
+
function constIndexing(node: ConstantNode) {
|
|
21
22
|
const { value } = node as ConstantNode<string | number>;
|
|
22
23
|
if (typeof value == 'string') {
|
|
23
|
-
return { type: 'string', literal: value, code: serialize(value) };
|
|
24
|
+
return { type: 'string', literal: value, code: serialize(value) } satisfies Result;
|
|
24
25
|
} else if (typeof value == 'number' && Number.isInteger(value) && value > 0) {
|
|
25
|
-
return { type: 'number', literal: value - 1, code: serialize(value - 1) };
|
|
26
|
+
return { type: 'number', literal: value - 1, code: serialize(value - 1) } satisfies Result;
|
|
26
27
|
} else {
|
|
27
|
-
return { code: serialize(value) };
|
|
28
|
+
return { code: serialize(value) } satisfies Result;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
|
|
@@ -56,13 +57,36 @@ function accessChain(
|
|
|
56
57
|
const obj = migrateExpr(state, object);
|
|
57
58
|
const chain = index.map((i) => {
|
|
58
59
|
if (typeof i == 'number') return `[${i}]`;
|
|
59
|
-
const s =
|
|
60
|
+
const s = serializeRecordKey(i);
|
|
60
61
|
if (s !== i) return `[${s}]`;
|
|
61
62
|
return `.${s}`;
|
|
62
63
|
});
|
|
64
|
+
let type;
|
|
65
|
+
if (!assignment && obj.global != null) {
|
|
66
|
+
try {
|
|
67
|
+
let v: VmValue = obj.global;
|
|
68
|
+
for (const i of index) {
|
|
69
|
+
if (v == null) break;
|
|
70
|
+
v = operations.$Get(v, i);
|
|
71
|
+
}
|
|
72
|
+
if (v != null && isVmPrimitive(v)) {
|
|
73
|
+
type = operations.$Type(v);
|
|
74
|
+
}
|
|
75
|
+
} catch (ex) {
|
|
76
|
+
type = undefined;
|
|
77
|
+
state.warn(`无法获取变量的类型: ${(ex as Error).message}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
63
80
|
if (!assignment && typeof index.at(-1) == 'number') {
|
|
81
|
+
if (chain.length === 1) {
|
|
82
|
+
return {
|
|
83
|
+
type,
|
|
84
|
+
code: `${stringToArray(state, obj).code}${chain[0]}`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
64
87
|
const prev = chain.slice(0, -1).join('');
|
|
65
88
|
return {
|
|
89
|
+
type,
|
|
66
90
|
code: `${
|
|
67
91
|
stringToArray(state, {
|
|
68
92
|
code: `${obj.code}${prev}`,
|
|
@@ -71,7 +95,8 @@ function accessChain(
|
|
|
71
95
|
};
|
|
72
96
|
}
|
|
73
97
|
return {
|
|
74
|
-
|
|
98
|
+
type,
|
|
99
|
+
code: `${obj.code}${chain.join('')}`,
|
|
75
100
|
};
|
|
76
101
|
}
|
|
77
102
|
|
|
@@ -85,21 +110,45 @@ function access(
|
|
|
85
110
|
return [node, []];
|
|
86
111
|
}
|
|
87
112
|
const { object, index } = node;
|
|
88
|
-
if (!index
|
|
113
|
+
if (!index?.dimensions[0]) {
|
|
89
114
|
return unsupportedNode(state, node);
|
|
90
115
|
}
|
|
116
|
+
if (index.dimensions.length > 1) {
|
|
117
|
+
state.warn('多维索引已拆分为多次单维索引');
|
|
118
|
+
const indices = index.dimensions.map((dim) => {
|
|
119
|
+
if (isConstantNode(dim)) {
|
|
120
|
+
const idx = constIndexing(dim);
|
|
121
|
+
if (idx.type === 'number') {
|
|
122
|
+
return idx;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { code: `${migrateAtomic(state, dim).code} - 1` };
|
|
126
|
+
});
|
|
127
|
+
const obj = migrateExpr(state, object);
|
|
128
|
+
return {
|
|
129
|
+
code: `${obj.code}${indices.map((idx) => `[${idx.code}]`).join('')}`,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
91
132
|
const dim0 = index.dimensions[0];
|
|
92
133
|
|
|
93
134
|
if (isRangeNode(dim0)) {
|
|
94
135
|
const obj = migrateExpr(state, object);
|
|
95
|
-
if (obj.type === 'array' &&
|
|
136
|
+
if (obj.type === 'array' && isConstantNode(dim0.start) && isConstantNode(dim0.end)) {
|
|
96
137
|
const start = constIndexing(dim0.start);
|
|
97
138
|
const end = constIndexing(dim0.end);
|
|
139
|
+
const step = dim0.step == null ? 1 : constantValue(dim0.step);
|
|
98
140
|
if (start.type === 'number' && end.type === 'number') {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
141
|
+
if (step === 1) {
|
|
142
|
+
return {
|
|
143
|
+
type: 'array',
|
|
144
|
+
code: `${obj.code}[${start.code}..${end.code}]`,
|
|
145
|
+
};
|
|
146
|
+
} else if (step === -1) {
|
|
147
|
+
return {
|
|
148
|
+
type: 'array',
|
|
149
|
+
code: `${obj.code}[${end.code}..${start.code}]::reverse()`,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
103
152
|
}
|
|
104
153
|
}
|
|
105
154
|
const d = unsupportedNode(state, dim0);
|
|
@@ -113,22 +162,7 @@ function access(
|
|
|
113
162
|
if (typeof value != 'string') return unsupportedNode(state, node);
|
|
114
163
|
if (!assignment && value === 'length') {
|
|
115
164
|
const obj = migrateExpr(state, object);
|
|
116
|
-
|
|
117
|
-
return {
|
|
118
|
-
type: 'number',
|
|
119
|
-
code: `len(chars(${obj.code}))`,
|
|
120
|
-
};
|
|
121
|
-
if (obj.type === 'array')
|
|
122
|
-
return {
|
|
123
|
-
type: 'number',
|
|
124
|
-
code: `len(${obj.code})`,
|
|
125
|
-
};
|
|
126
|
-
state.helper(
|
|
127
|
-
`fn @@length(x) { if type(x) == 'string' { len(chars(x)) } else if type(x) == 'array' { len(x) } } else { x.length } }`,
|
|
128
|
-
);
|
|
129
|
-
return {
|
|
130
|
-
code: `@@length(${obj.code})`,
|
|
131
|
-
};
|
|
165
|
+
return len(state, obj);
|
|
132
166
|
}
|
|
133
167
|
const obj = access(state, object, assignment);
|
|
134
168
|
if (Array.isArray(obj)) {
|
|
@@ -143,7 +177,7 @@ function access(
|
|
|
143
177
|
if (index.type === 'string') {
|
|
144
178
|
const obj = access(state, object, assignment);
|
|
145
179
|
if (Array.isArray(obj)) {
|
|
146
|
-
return [obj[0], [...obj[1], index.literal
|
|
180
|
+
return [obj[0], [...obj[1], index.literal]];
|
|
147
181
|
}
|
|
148
182
|
return { code: `${obj.code}[${index.code}]` };
|
|
149
183
|
} else if (index.type === 'number') {
|
|
@@ -157,15 +191,11 @@ function access(
|
|
|
157
191
|
object.fn.name === 'size' &&
|
|
158
192
|
object.args.length === 1
|
|
159
193
|
) {
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
type: 'number',
|
|
163
|
-
code: `len(${el.code})`,
|
|
164
|
-
};
|
|
194
|
+
return len(state, migrateAtomic(state, object.args[0]!));
|
|
165
195
|
}
|
|
166
196
|
const obj = access(state, object, assignment);
|
|
167
197
|
if (Array.isArray(obj)) {
|
|
168
|
-
return [obj[0], [...obj[1], index.literal
|
|
198
|
+
return [obj[0], [...obj[1], index.literal]];
|
|
169
199
|
}
|
|
170
200
|
return { code: `${stringToArray(state, obj).code}[${index.code}]` };
|
|
171
201
|
} else {
|