@cloudpss/expression 0.6.0-alpha.1 → 0.6.0-alpha.11

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 (154) hide show
  1. package/dist/analyze.d.ts +6 -3
  2. package/dist/analyze.d.ts.map +1 -1
  3. package/dist/analyze.js +67 -33
  4. package/dist/analyze.js.map +1 -1
  5. package/dist/definitions/argument.d.ts +2 -10
  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-decoration.d.ts +3 -3
  12. package/dist/definitions/parameter-decoration.d.ts.map +1 -1
  13. package/dist/definitions/parameter-decoration.js +0 -7
  14. package/dist/definitions/parameter-decoration.js.map +1 -1
  15. package/dist/definitions/parameter-group.d.ts +0 -4
  16. package/dist/definitions/parameter-group.d.ts.map +1 -1
  17. package/dist/definitions/parameter-group.js +5 -17
  18. package/dist/definitions/parameter-group.js.map +1 -1
  19. package/dist/definitions/parameter.d.ts +47 -40
  20. package/dist/definitions/parameter.d.ts.map +1 -1
  21. package/dist/definitions/parameter.js +9 -21
  22. package/dist/definitions/parameter.js.map +1 -1
  23. package/dist/definitions/utils.d.ts +19 -0
  24. package/dist/definitions/utils.d.ts.map +1 -0
  25. package/dist/definitions/utils.js +177 -0
  26. package/dist/definitions/utils.js.map +1 -0
  27. package/dist/definitions/variable.d.ts +0 -2
  28. package/dist/definitions/variable.d.ts.map +1 -1
  29. package/dist/definitions/variable.js +1 -5
  30. package/dist/definitions/variable.js.map +1 -1
  31. package/dist/definitions.d.ts +1 -0
  32. package/dist/definitions.d.ts.map +1 -1
  33. package/dist/definitions.js +1 -0
  34. package/dist/definitions.js.map +1 -1
  35. package/dist/eval.d.ts +3 -5
  36. package/dist/eval.d.ts.map +1 -1
  37. package/dist/eval.js +12 -20
  38. package/dist/eval.js.map +1 -1
  39. package/dist/expression.d.ts +10 -4
  40. package/dist/expression.d.ts.map +1 -1
  41. package/dist/expression.js +4 -4
  42. package/dist/expression.js.map +1 -1
  43. package/dist/index.d.ts +3 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +1 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/interface.d.ts +30 -0
  48. package/dist/interface.d.ts.map +1 -0
  49. package/dist/interface.js +6 -0
  50. package/dist/interface.js.map +1 -0
  51. package/dist/main.d.ts +41 -28
  52. package/dist/main.d.ts.map +1 -1
  53. package/dist/main.js +145 -141
  54. package/dist/main.js.map +1 -1
  55. package/dist/migrate.d.ts +3 -2
  56. package/dist/migrate.d.ts.map +1 -1
  57. package/dist/migrate.js +25 -3
  58. package/dist/migrate.js.map +1 -1
  59. package/dist/migrator/access.d.ts.map +1 -1
  60. package/dist/migrator/access.js +44 -24
  61. package/dist/migrator/access.js.map +1 -1
  62. package/dist/migrator/call.d.ts.map +1 -1
  63. package/dist/migrator/call.js +254 -217
  64. package/dist/migrator/call.js.map +1 -1
  65. package/dist/migrator/concat.d.ts.map +1 -1
  66. package/dist/migrator/concat.js +15 -2
  67. package/dist/migrator/concat.js.map +1 -1
  68. package/dist/migrator/interface.d.ts +3 -1
  69. package/dist/migrator/interface.d.ts.map +1 -1
  70. package/dist/migrator/interface.js.map +1 -1
  71. package/dist/migrator/node.js +1 -1
  72. package/dist/migrator/node.js.map +1 -1
  73. package/dist/migrator/operator.d.ts.map +1 -1
  74. package/dist/migrator/operator.js +43 -29
  75. package/dist/migrator/operator.js.map +1 -1
  76. package/dist/migrator/state.d.ts +2 -2
  77. package/dist/migrator/state.d.ts.map +1 -1
  78. package/dist/migrator/state.js +1 -2
  79. package/dist/migrator/state.js.map +1 -1
  80. package/dist/migrator/symbol.d.ts.map +1 -1
  81. package/dist/migrator/symbol.js +13 -0
  82. package/dist/migrator/symbol.js.map +1 -1
  83. package/dist/migrator/to-type.d.ts.map +1 -1
  84. package/dist/migrator/to-type.js +20 -3
  85. package/dist/migrator/to-type.js.map +1 -1
  86. package/dist/migrator/utils.d.ts +4 -0
  87. package/dist/migrator/utils.d.ts.map +1 -1
  88. package/dist/migrator/utils.js +25 -0
  89. package/dist/migrator/utils.js.map +1 -1
  90. package/dist/parser.d.ts +2 -2
  91. package/dist/parser.d.ts.map +1 -1
  92. package/dist/parser.js +25 -8
  93. package/dist/parser.js.map +1 -1
  94. package/dist/re-exports.d.ts +4 -0
  95. package/dist/re-exports.d.ts.map +1 -0
  96. package/dist/re-exports.js +3 -0
  97. package/dist/re-exports.js.map +1 -0
  98. package/dist/scope.d.ts +13 -16
  99. package/dist/scope.d.ts.map +1 -1
  100. package/dist/scope.js +56 -49
  101. package/dist/scope.js.map +1 -1
  102. package/dist/type.d.ts +14 -5
  103. package/dist/type.d.ts.map +1 -1
  104. package/dist/type.js +35 -11
  105. package/dist/type.js.map +1 -1
  106. package/package.json +7 -4
  107. package/src/analyze.ts +77 -37
  108. package/src/definitions/argument.ts +2 -12
  109. package/src/definitions/constraint.ts +3 -3
  110. package/src/definitions/parameter-decoration.ts +3 -9
  111. package/src/definitions/parameter-group.ts +4 -19
  112. package/src/definitions/parameter.ts +62 -61
  113. package/src/definitions/utils.ts +175 -0
  114. package/src/definitions/variable.ts +1 -6
  115. package/src/definitions.ts +1 -0
  116. package/src/eval.ts +13 -26
  117. package/src/expression.ts +14 -6
  118. package/src/index.ts +3 -1
  119. package/src/interface.ts +35 -0
  120. package/src/main.ts +213 -194
  121. package/src/migrate.ts +30 -6
  122. package/src/migrator/access.ts +49 -32
  123. package/src/migrator/call.ts +246 -203
  124. package/src/migrator/concat.ts +15 -2
  125. package/src/migrator/interface.ts +3 -1
  126. package/src/migrator/node.ts +1 -1
  127. package/src/migrator/operator.ts +47 -33
  128. package/src/migrator/state.ts +2 -2
  129. package/src/migrator/symbol.ts +13 -0
  130. package/src/migrator/to-type.ts +22 -3
  131. package/src/migrator/utils.ts +29 -0
  132. package/src/parser.ts +27 -8
  133. package/src/re-exports.ts +28 -0
  134. package/src/scope.ts +75 -61
  135. package/src/type.ts +32 -11
  136. package/tests/analyze.ts +40 -6
  137. package/tests/compile.ts +65 -0
  138. package/tests/condition.ts +13 -5
  139. package/tests/definition.ts +205 -18
  140. package/tests/eval-complex.ts +7 -10
  141. package/tests/eval.ts +59 -12
  142. package/tests/import.ts +18 -4
  143. package/tests/main.ts +9 -0
  144. package/tests/migrate.ts +202 -0
  145. package/tests/scope.ts +3 -3
  146. package/tests/template.ts +36 -0
  147. package/dist/context.d.ts +0 -41
  148. package/dist/context.d.ts.map +0 -1
  149. package/dist/context.js +0 -18
  150. package/dist/context.js.map +0 -1
  151. package/jest.config.js +0 -3
  152. package/src/context.ts +0 -54
  153. package/tests/tsconfig.json +0 -3
  154. package/tsconfig.json +0 -3
@@ -13,18 +13,19 @@ import {
13
13
  import type { Result } from './interface.js';
14
14
  import { migrateAtomic, migrateExpr } from './node.js';
15
15
  import type { State } from './state.js';
16
- import { unsupportedNode } from './utils.js';
17
- import { serialize, serializePropName } from '@mirascript/mirascript/subtle';
16
+ import { len, unsupportedNode } from './utils.js';
17
+ import { isVmPrimitive, type VmValue } from '@mirascript/mirascript';
18
+ import { operations, serialize, serializePropName } from '@mirascript/mirascript/subtle';
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
 
@@ -60,9 +61,27 @@ function accessChain(
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
- code: `${migrateExpr(state, object).code}${chain.join('')}`,
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 || index.dimensions.length !== 1 || !index.dimensions[0]) {
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
- 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
- };
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 as string]];
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' in state.globals) &&
177
+ !state.globals.has('size') &&
157
178
  object.fn.name === 'size' &&
158
179
  object.args.length === 1
159
180
  ) {
160
- const el = stringToArray(state, migrateAtomic(state, object.args[0]!));
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 as number]];
185
+ return [obj[0], [...obj[1], index.literal]];
169
186
  }
170
187
  return { code: `${stringToArray(state, obj).code}[${index.code}]` };
171
188
  } else {