@cloudpss/expression 0.6.0-alpha.9 → 0.6.0-beta.1

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.
Files changed (157) hide show
  1. package/dist/analyze.d.ts +6 -3
  2. package/dist/analyze.d.ts.map +1 -1
  3. package/dist/analyze.js +13 -33
  4. package/dist/analyze.js.map +1 -1
  5. package/dist/definitions/argument.d.ts +3 -11
  6. package/dist/definitions/argument.d.ts.map +1 -1
  7. package/dist/definitions/constraint.d.ts +2 -2
  8. package/dist/definitions/constraint.d.ts.map +1 -1
  9. package/dist/definitions/constraint.js +1 -1
  10. package/dist/definitions/constraint.js.map +1 -1
  11. package/dist/definitions/parameter-group.js +4 -4
  12. package/dist/definitions/parameter-group.js.map +1 -1
  13. package/dist/definitions/parameter.d.ts +22 -14
  14. package/dist/definitions/parameter.d.ts.map +1 -1
  15. package/dist/definitions/parameter.js +10 -1
  16. package/dist/definitions/parameter.js.map +1 -1
  17. package/dist/definitions/utils.d.ts +28 -0
  18. package/dist/definitions/utils.d.ts.map +1 -0
  19. package/dist/definitions/utils.js +272 -0
  20. package/dist/definitions/utils.js.map +1 -0
  21. package/dist/definitions/variable.js +1 -1
  22. package/dist/definitions/variable.js.map +1 -1
  23. package/dist/definitions.d.ts +1 -2
  24. package/dist/definitions.d.ts.map +1 -1
  25. package/dist/definitions.js +1 -1
  26. package/dist/definitions.js.map +1 -1
  27. package/dist/eval.d.ts +3 -5
  28. package/dist/eval.d.ts.map +1 -1
  29. package/dist/eval.js +12 -20
  30. package/dist/eval.js.map +1 -1
  31. package/dist/expression.d.ts +10 -4
  32. package/dist/expression.d.ts.map +1 -1
  33. package/dist/expression.js +6 -6
  34. package/dist/expression.js.map +1 -1
  35. package/dist/index.d.ts +3 -1
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/interface.d.ts +30 -0
  40. package/dist/interface.d.ts.map +1 -0
  41. package/dist/interface.js +6 -0
  42. package/dist/interface.js.map +1 -0
  43. package/dist/main.d.ts +41 -28
  44. package/dist/main.d.ts.map +1 -1
  45. package/dist/main.js +165 -149
  46. package/dist/main.js.map +1 -1
  47. package/dist/migrate.d.ts +1 -1
  48. package/dist/migrate.d.ts.map +1 -1
  49. package/dist/migrate.js +25 -4
  50. package/dist/migrate.js.map +1 -1
  51. package/dist/migrator/access.d.ts.map +1 -1
  52. package/dist/migrator/access.js +64 -29
  53. package/dist/migrator/access.js.map +1 -1
  54. package/dist/migrator/call.d.ts.map +1 -1
  55. package/dist/migrator/call.js +298 -201
  56. package/dist/migrator/call.js.map +1 -1
  57. package/dist/migrator/concat.d.ts.map +1 -1
  58. package/dist/migrator/concat.js +15 -2
  59. package/dist/migrator/concat.js.map +1 -1
  60. package/dist/migrator/function.d.ts +6 -0
  61. package/dist/migrator/function.d.ts.map +1 -0
  62. package/dist/migrator/function.js +25 -0
  63. package/dist/migrator/function.js.map +1 -0
  64. package/dist/migrator/interface.d.ts +3 -1
  65. package/dist/migrator/interface.d.ts.map +1 -1
  66. package/dist/migrator/interface.js.map +1 -1
  67. package/dist/migrator/node.d.ts.map +1 -1
  68. package/dist/migrator/node.js +55 -7
  69. package/dist/migrator/node.js.map +1 -1
  70. package/dist/migrator/operator.d.ts.map +1 -1
  71. package/dist/migrator/operator.js +107 -60
  72. package/dist/migrator/operator.js.map +1 -1
  73. package/dist/migrator/serialize.d.ts +4 -0
  74. package/dist/migrator/serialize.d.ts.map +1 -0
  75. package/dist/migrator/serialize.js +21 -0
  76. package/dist/migrator/serialize.js.map +1 -0
  77. package/dist/migrator/special.d.ts.map +1 -1
  78. package/dist/migrator/special.js +31 -0
  79. package/dist/migrator/special.js.map +1 -1
  80. package/dist/migrator/state.d.ts +4 -4
  81. package/dist/migrator/state.d.ts.map +1 -1
  82. package/dist/migrator/state.js +29 -31
  83. package/dist/migrator/state.js.map +1 -1
  84. package/dist/migrator/symbol.d.ts.map +1 -1
  85. package/dist/migrator/symbol.js +34 -12
  86. package/dist/migrator/symbol.js.map +1 -1
  87. package/dist/migrator/to-type.d.ts.map +1 -1
  88. package/dist/migrator/to-type.js +21 -4
  89. package/dist/migrator/to-type.js.map +1 -1
  90. package/dist/migrator/utils.d.ts +6 -0
  91. package/dist/migrator/utils.d.ts.map +1 -1
  92. package/dist/migrator/utils.js +49 -1
  93. package/dist/migrator/utils.js.map +1 -1
  94. package/dist/parser.d.ts +2 -2
  95. package/dist/parser.d.ts.map +1 -1
  96. package/dist/parser.js +27 -8
  97. package/dist/parser.js.map +1 -1
  98. package/dist/re-exports.d.ts +4 -0
  99. package/dist/re-exports.d.ts.map +1 -0
  100. package/dist/re-exports.js +3 -0
  101. package/dist/re-exports.js.map +1 -0
  102. package/dist/scope.d.ts +16 -17
  103. package/dist/scope.d.ts.map +1 -1
  104. package/dist/scope.js +84 -53
  105. package/dist/scope.js.map +1 -1
  106. package/dist/type.d.ts +22 -10
  107. package/dist/type.d.ts.map +1 -1
  108. package/dist/type.js +21 -24
  109. package/dist/type.js.map +1 -1
  110. package/package.json +8 -5
  111. package/src/analyze.ts +20 -39
  112. package/src/definitions/argument.ts +3 -13
  113. package/src/definitions/constraint.ts +3 -3
  114. package/src/definitions/parameter-group.ts +4 -4
  115. package/src/definitions/parameter.ts +47 -24
  116. package/src/definitions/utils.ts +288 -0
  117. package/src/definitions/variable.ts +1 -1
  118. package/src/definitions.ts +1 -28
  119. package/src/eval.ts +16 -25
  120. package/src/expression.ts +16 -8
  121. package/src/index.ts +3 -1
  122. package/src/interface.ts +35 -0
  123. package/src/main.ts +232 -200
  124. package/src/migrate.ts +27 -4
  125. package/src/migrator/access.ts +67 -37
  126. package/src/migrator/call.ts +287 -190
  127. package/src/migrator/concat.ts +15 -2
  128. package/src/migrator/function.ts +27 -0
  129. package/src/migrator/interface.ts +3 -1
  130. package/src/migrator/node.ts +56 -6
  131. package/src/migrator/operator.ts +110 -64
  132. package/src/migrator/serialize.ts +21 -0
  133. package/src/migrator/special.ts +31 -0
  134. package/src/migrator/state.ts +31 -34
  135. package/src/migrator/symbol.ts +33 -12
  136. package/src/migrator/to-type.ts +23 -4
  137. package/src/migrator/utils.ts +49 -1
  138. package/src/parser.ts +33 -8
  139. package/src/re-exports.ts +47 -0
  140. package/src/scope.ts +98 -62
  141. package/src/type.ts +40 -25
  142. package/tests/analyze.ts +45 -6
  143. package/tests/compile.ts +65 -0
  144. package/tests/condition.ts +33 -17
  145. package/tests/definition.ts +237 -18
  146. package/tests/eval-complex.ts +19 -11
  147. package/tests/eval.ts +59 -12
  148. package/tests/import.ts +21 -7
  149. package/tests/main.ts +58 -0
  150. package/tests/migrate.ts +317 -0
  151. package/tests/scope.ts +3 -3
  152. package/tests/template.ts +36 -0
  153. package/dist/context.d.ts +0 -41
  154. package/dist/context.d.ts.map +0 -1
  155. package/dist/context.js +0 -18
  156. package/dist/context.js.map +0 -1
  157. package/src/context.ts +0 -54
@@ -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): Result {
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 = serializePropName(i);
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
- code: `${migrateExpr(state, object).code}${chain.join('')}`,
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 || index.dimensions.length !== 1 || !index.dimensions[0]) {
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' && !dim0.step && isConstantNode(dim0.start) && isConstantNode(dim0.end)) {
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
- return {
100
- type: 'array',
101
- code: `${obj.code}[${start.code}..${end.code}]`,
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
- if (obj.type === 'string')
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 as string]];
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
- const el = stringToArray(state, migrateAtomic(state, object.args[0]!));
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 as number]];
198
+ return [obj[0], [...obj[1], index.literal]];
169
199
  }
170
200
  return { code: `${stringToArray(state, obj).code}[${index.code}]` };
171
201
  } else {