@cloudpss/expression 0.6.0-alpha.2 → 0.6.0-alpha.20
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 +67 -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-decoration.d.ts +3 -3
- package/dist/definitions/parameter-decoration.d.ts.map +1 -1
- package/dist/definitions/parameter-decoration.js +0 -7
- package/dist/definitions/parameter-decoration.js.map +1 -1
- package/dist/definitions/parameter-group.d.ts +0 -4
- package/dist/definitions/parameter-group.d.ts.map +1 -1
- package/dist/definitions/parameter-group.js +5 -17
- package/dist/definitions/parameter-group.js.map +1 -1
- package/dist/definitions/parameter.d.ts +47 -40
- package/dist/definitions/parameter.d.ts.map +1 -1
- package/dist/definitions/parameter.js +9 -21
- 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 +209 -0
- package/dist/definitions/utils.js.map +1 -0
- package/dist/definitions/variable.d.ts +0 -2
- package/dist/definitions/variable.d.ts.map +1 -1
- package/dist/definitions/variable.js +1 -5
- package/dist/definitions/variable.js.map +1 -1
- package/dist/definitions.d.ts +1 -0
- package/dist/definitions.d.ts.map +1 -1
- package/dist/definitions.js +1 -0
- 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 +149 -147
- package/dist/main.js.map +1 -1
- package/dist/migrate.d.ts +3 -2
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +25 -3
- package/dist/migrate.js.map +1 -1
- package/dist/migrator/access.d.ts.map +1 -1
- package/dist/migrator/access.js +45 -25
- 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 +35 -6
- 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 +2 -2
- package/dist/migrator/state.d.ts.map +1 -1
- package/dist/migrator/state.js +30 -33
- package/dist/migrator/state.js.map +1 -1
- package/dist/migrator/symbol.d.ts.map +1 -1
- package/dist/migrator/symbol.js +23 -9
- 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 +35 -0
- 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 +17 -18
- package/dist/scope.d.ts.map +1 -1
- package/dist/scope.js +84 -53
- package/dist/scope.js.map +1 -1
- package/dist/type.d.ts +27 -6
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js +34 -15
- package/dist/type.js.map +1 -1
- package/package.json +8 -5
- package/src/analyze.ts +77 -37
- package/src/definitions/argument.ts +3 -13
- package/src/definitions/constraint.ts +3 -3
- package/src/definitions/parameter-decoration.ts +3 -9
- package/src/definitions/parameter-group.ts +4 -19
- package/src/definitions/parameter.ts +70 -62
- package/src/definitions/utils.ts +224 -0
- package/src/definitions/variable.ts +1 -6
- package/src/definitions.ts +1 -0
- 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 +217 -199
- package/src/migrate.ts +30 -6
- package/src/migrator/access.ts +50 -33
- 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 +36 -5
- 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 +30 -33
- package/src/migrator/symbol.ts +23 -9
- package/src/migrator/to-type.ts +23 -4
- package/src/migrator/utils.ts +38 -0
- package/src/parser.ts +33 -8
- package/src/re-exports.ts +47 -0
- package/src/scope.ts +101 -65
- package/src/type.ts +52 -18
- package/tests/analyze.ts +40 -6
- package/tests/compile.ts +65 -0
- package/tests/condition.ts +33 -17
- package/tests/definition.ts +237 -18
- package/tests/eval-complex.ts +19 -11
- package/tests/eval.ts +59 -12
- package/tests/import.ts +21 -7
- package/tests/main.ts +58 -0
- package/tests/migrate.ts +308 -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/jest.config.js +0 -3
- package/src/context.ts +0 -54
- package/tests/tsconfig.json +0 -3
- package/tsconfig.json +0 -3
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 { 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,31 @@ 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
|
+
let v: VmValue = obj.global;
|
|
67
|
+
for (const i of index) {
|
|
68
|
+
if (v == null) break;
|
|
69
|
+
v = operations.$Get(v, i);
|
|
70
|
+
}
|
|
71
|
+
if (v != null && isVmPrimitive(v)) {
|
|
72
|
+
type = operations.$Type(v);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
63
75
|
if (!assignment && typeof index.at(-1) == 'number') {
|
|
76
|
+
if (chain.length === 1) {
|
|
77
|
+
return {
|
|
78
|
+
type,
|
|
79
|
+
code: `${stringToArray(state, obj).code}${chain[0]}`,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
64
82
|
const prev = chain.slice(0, -1).join('');
|
|
65
83
|
return {
|
|
84
|
+
type,
|
|
66
85
|
code: `${
|
|
67
86
|
stringToArray(state, {
|
|
68
87
|
code: `${obj.code}${prev}`,
|
|
@@ -71,7 +90,8 @@ function accessChain(
|
|
|
71
90
|
};
|
|
72
91
|
}
|
|
73
92
|
return {
|
|
74
|
-
|
|
93
|
+
type,
|
|
94
|
+
code: `${obj.code}${chain.join('')}`,
|
|
75
95
|
};
|
|
76
96
|
}
|
|
77
97
|
|
|
@@ -85,9 +105,25 @@ function access(
|
|
|
85
105
|
return [node, []];
|
|
86
106
|
}
|
|
87
107
|
const { object, index } = node;
|
|
88
|
-
if (!index
|
|
108
|
+
if (!index?.dimensions[0]) {
|
|
89
109
|
return unsupportedNode(state, node);
|
|
90
110
|
}
|
|
111
|
+
if (index.dimensions.length > 1) {
|
|
112
|
+
state.warn('多维索引已拆分为多次单维索引');
|
|
113
|
+
const indices = index.dimensions.map((dim) => {
|
|
114
|
+
if (isConstantNode(dim)) {
|
|
115
|
+
const idx = constIndexing(dim);
|
|
116
|
+
if (idx.type === 'number') {
|
|
117
|
+
return idx;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return { code: `${migrateAtomic(state, dim).code} - 1` };
|
|
121
|
+
});
|
|
122
|
+
const obj = migrateExpr(state, object);
|
|
123
|
+
return {
|
|
124
|
+
code: `${obj.code}${indices.map((idx) => `[${idx.code}]`).join('')}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
91
127
|
const dim0 = index.dimensions[0];
|
|
92
128
|
|
|
93
129
|
if (isRangeNode(dim0)) {
|
|
@@ -113,22 +149,7 @@ function access(
|
|
|
113
149
|
if (typeof value != 'string') return unsupportedNode(state, node);
|
|
114
150
|
if (!assignment && value === 'length') {
|
|
115
151
|
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
|
-
};
|
|
152
|
+
return len(state, obj);
|
|
132
153
|
}
|
|
133
154
|
const obj = access(state, object, assignment);
|
|
134
155
|
if (Array.isArray(obj)) {
|
|
@@ -143,7 +164,7 @@ function access(
|
|
|
143
164
|
if (index.type === 'string') {
|
|
144
165
|
const obj = access(state, object, assignment);
|
|
145
166
|
if (Array.isArray(obj)) {
|
|
146
|
-
return [obj[0], [...obj[1], index.literal
|
|
167
|
+
return [obj[0], [...obj[1], index.literal]];
|
|
147
168
|
}
|
|
148
169
|
return { code: `${obj.code}[${index.code}]` };
|
|
149
170
|
} else if (index.type === 'number') {
|
|
@@ -153,19 +174,15 @@ function access(
|
|
|
153
174
|
isFunctionNode(object) &&
|
|
154
175
|
isSymbolNode(object.fn) &&
|
|
155
176
|
!state.locals.has('size') &&
|
|
156
|
-
!('size'
|
|
177
|
+
!state.globals.has('size') &&
|
|
157
178
|
object.fn.name === 'size' &&
|
|
158
179
|
object.args.length === 1
|
|
159
180
|
) {
|
|
160
|
-
|
|
161
|
-
return {
|
|
162
|
-
type: 'number',
|
|
163
|
-
code: `len(${el.code})`,
|
|
164
|
-
};
|
|
181
|
+
return len(state, migrateAtomic(state, object.args[0]!));
|
|
165
182
|
}
|
|
166
183
|
const obj = access(state, object, assignment);
|
|
167
184
|
if (Array.isArray(obj)) {
|
|
168
|
-
return [obj[0], [...obj[1], index.literal
|
|
185
|
+
return [obj[0], [...obj[1], index.literal]];
|
|
169
186
|
}
|
|
170
187
|
return { code: `${stringToArray(state, obj).code}[${index.code}]` };
|
|
171
188
|
} else {
|