@abaplint/transpiler-cli 2.14.16 → 2.14.17

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 (2) hide show
  1. package/build/bundle.js +164 -39
  2. package/package.json +2 -2
package/build/bundle.js CHANGED
@@ -118628,6 +118628,118 @@ exports.FilterBodyTranspiler = FilterBodyTranspiler;
118628
118628
 
118629
118629
  /***/ },
118630
118630
 
118631
+ /***/ "./node_modules/@abaplint/transpiler/build/src/expressions/for_groups.js"
118632
+ /*!*******************************************************************************!*\
118633
+ !*** ./node_modules/@abaplint/transpiler/build/src/expressions/for_groups.js ***!
118634
+ \*******************************************************************************/
118635
+ (__unused_webpack_module, exports, __webpack_require__) {
118636
+
118637
+ "use strict";
118638
+
118639
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
118640
+ exports.ForGroupsTranspiler = void 0;
118641
+ const core_1 = __webpack_require__(/*! @abaplint/core */ "./node_modules/@abaplint/core/build/src/index.js");
118642
+ const statements_1 = __webpack_require__(/*! ../statements */ "./node_modules/@abaplint/transpiler/build/src/statements/index.js");
118643
+ const source_field_symbol_1 = __webpack_require__(/*! ./source_field_symbol */ "./node_modules/@abaplint/transpiler/build/src/expressions/source_field_symbol.js");
118644
+ const unique_identifier_1 = __webpack_require__(/*! ../unique_identifier */ "./node_modules/@abaplint/transpiler/build/src/unique_identifier.js");
118645
+ /** FOR GROUPS group OF member IN itab GROUP BY key [ASCENDING|DESCENDING] [WITHOUT MEMBERS] */
118646
+ class ForGroupsTranspiler {
118647
+ transpile(forExpression, traversal) {
118648
+ const targets = forExpression.getChildren().filter(c => c instanceof core_1.Nodes.ExpressionNode
118649
+ && (c.get() instanceof core_1.Expressions.TargetField || c.get() instanceof core_1.Expressions.TargetFieldSymbol));
118650
+ const source = forExpression.findDirectExpression(core_1.Expressions.Source);
118651
+ if (targets.length !== 2 || source === undefined) {
118652
+ throw new Error("FOR GROUPS, unexpected structure, " + forExpression.concatTokens());
118653
+ }
118654
+ if (forExpression.findDirectExpression(core_1.Expressions.LoopGroupByComponent)) {
118655
+ throw new Error("FOR GROUPS, GROUP BY with components, todo, " + forExpression.concatTokens());
118656
+ }
118657
+ const groupBy = forExpression.findDirectExpression(core_1.Expressions.FieldChain);
118658
+ if (groupBy === undefined) {
118659
+ throw new Error("FOR GROUPS, GROUP BY expected, " + forExpression.concatTokens());
118660
+ }
118661
+ if (forExpression.findDirectTokenByText("TEXT")) {
118662
+ throw new Error("FOR GROUPS, AS TEXT, todo, " + forExpression.concatTokens());
118663
+ }
118664
+ const declarations = [];
118665
+ const [groupNode, memberNode] = targets;
118666
+ const row = unique_identifier_1.UniqueIdentifier.get();
118667
+ const loopEntry = unique_identifier_1.UniqueIdentifier.get();
118668
+ let memberInGenerator;
118669
+ let memberInBody;
118670
+ if (memberNode.get() instanceof core_1.Expressions.TargetFieldSymbol) {
118671
+ declarations.push(this.declareFieldSymbol(memberNode, traversal));
118672
+ const name = new source_field_symbol_1.SourceFieldSymbolTranspiler().transpile(memberNode, traversal).getCode();
118673
+ memberInGenerator = `${name}.assign(${row});`;
118674
+ memberInBody = `${name}.assign(${loopEntry}.members[0]);`;
118675
+ }
118676
+ else {
118677
+ const name = traversal.traverse(memberNode).getCode();
118678
+ memberInGenerator = `const ${name} = ${row}.clone();`;
118679
+ memberInBody = `const ${name} = ${loopEntry}.members[0].clone();`;
118680
+ }
118681
+ let groupInBody;
118682
+ if (groupNode.get() instanceof core_1.Expressions.TargetFieldSymbol) {
118683
+ declarations.push(this.declareFieldSymbol(groupNode, traversal));
118684
+ const name = new source_field_symbol_1.SourceFieldSymbolTranspiler().transpile(groupNode, traversal).getCode();
118685
+ groupInBody = `${name}.assign(${loopEntry}.key);`;
118686
+ }
118687
+ else {
118688
+ groupInBody = `const ${traversal.traverse(groupNode).getCode()} = ${loopEntry}.key.clone();`;
118689
+ }
118690
+ const groups = unique_identifier_1.UniqueIdentifier.get();
118691
+ const key = unique_identifier_1.UniqueIdentifier.get();
118692
+ const rawKey = unique_identifier_1.UniqueIdentifier.get();
118693
+ const entry = unique_identifier_1.UniqueIdentifier.get();
118694
+ let ordered = `${groups}.values()`;
118695
+ if (forExpression.findDirectTokenByText("ASCENDING")) {
118696
+ ordered = `[...${groups}.values()].sort((a, b) => abap.compare.lt(a.key, b.key) ? -1 : abap.compare.gt(a.key, b.key) ? 1 : 0)`;
118697
+ }
118698
+ else if (forExpression.findDirectTokenByText("DESCENDING")) {
118699
+ ordered = `[...${groups}.values()].sort((a, b) => abap.compare.gt(a.key, b.key) ? -1 : abap.compare.lt(a.key, b.key) ? 1 : 0)`;
118700
+ }
118701
+ // groups are kept in order of first occurrence
118702
+ const generator = `(async function*() {\n`
118703
+ + `const ${groups} = new Map();\n`
118704
+ + `for await (const ${row} of abap.statements.loop(${traversal.traverse(source).getCode()})) {\n`
118705
+ + `${memberInGenerator}\n`
118706
+ + `const ${key} = ${traversal.traverse(groupBy).getCode()};\n`
118707
+ + `const ${rawKey} = ${key}.get();\n`
118708
+ + `let ${entry} = ${groups}.get(${rawKey});\n`
118709
+ + `if (${entry} === undefined) {\n`
118710
+ + `${entry} = {key: ${key}.clone(), members: []};\n`
118711
+ + `${groups}.set(${rawKey}, ${entry});\n`
118712
+ + `}\n`
118713
+ + `${entry}.members.push(${row});\n`
118714
+ + `}\n`
118715
+ + `for (const value of ${ordered}) {\n`
118716
+ + `yield value;\n`
118717
+ + `}\n`
118718
+ + `})()`;
118719
+ return {
118720
+ declarations,
118721
+ open: `for await (const ${loopEntry} of ${generator}) {`,
118722
+ preBody: [groupInBody, memberInBody],
118723
+ close: "}",
118724
+ };
118725
+ }
118726
+ /** abaplint does not always add the FOR GROUPS targets to the scope, or types them void,
118727
+ * then the field symbol is declared untyped, it is only ever assigned to rows of the source */
118728
+ declareFieldSymbol(node, traversal) {
118729
+ const token = node.getFirstToken();
118730
+ const found = traversal.findCurrentScopeByToken(token)?.findVariable(token.getStr());
118731
+ if (found !== undefined && !(found.getType() instanceof core_1.BasicTypes.VoidType)) {
118732
+ return new statements_1.FieldSymbolTranspiler().transpile(node, traversal).getCode();
118733
+ }
118734
+ const name = new source_field_symbol_1.SourceFieldSymbolTranspiler().transpile(node, traversal).getCode();
118735
+ return `let ${name} = new abap.types.FieldSymbol();`;
118736
+ }
118737
+ }
118738
+ exports.ForGroupsTranspiler = ForGroupsTranspiler;
118739
+ //# sourceMappingURL=for_groups.js.map
118740
+
118741
+ /***/ },
118742
+
118631
118743
  /***/ "./node_modules/@abaplint/transpiler/build/src/expressions/function_exporting.js"
118632
118744
  /*!***************************************************************************************!*\
118633
118745
  !*** ./node_modules/@abaplint/transpiler/build/src/expressions/function_exporting.js ***!
@@ -119835,6 +119947,7 @@ const let_1 = __webpack_require__(/*! ./let */ "./node_modules/@abaplint/transpi
119835
119947
  const statements_1 = __webpack_require__(/*! ../statements */ "./node_modules/@abaplint/transpiler/build/src/statements/index.js");
119836
119948
  const source_field_symbol_1 = __webpack_require__(/*! ./source_field_symbol */ "./node_modules/@abaplint/transpiler/build/src/expressions/source_field_symbol.js");
119837
119949
  const unique_identifier_1 = __webpack_require__(/*! ../unique_identifier */ "./node_modules/@abaplint/transpiler/build/src/unique_identifier.js");
119950
+ const for_groups_1 = __webpack_require__(/*! ./for_groups */ "./node_modules/@abaplint/transpiler/build/src/expressions/for_groups.js");
119838
119951
  class ReduceBodyTranspiler {
119839
119952
  transpile(typ, body, traversal) {
119840
119953
  if (!(typ.get() instanceof core_1.Expressions.TypeNameOrInfer)) {
@@ -119875,7 +119988,7 @@ class ReduceBodyTranspiler {
119875
119988
  }
119876
119989
  describeFor(forExpression, body, traversal, declarations) {
119877
119990
  if (forExpression.findDirectTokenByText("GROUPS")) {
119878
- return this.describeGroupsFor(forExpression, body, traversal);
119991
+ return this.describeGroupsFor(forExpression, traversal, declarations);
119879
119992
  }
119880
119993
  const loopExpression = forExpression.findDirectExpression(core_1.Expressions.InlineLoopDefinition);
119881
119994
  if (loopExpression === undefined) {
@@ -119942,47 +120055,20 @@ class ReduceBodyTranspiler {
119942
120055
  close: "}",
119943
120056
  };
119944
120057
  }
119945
- describeGroupsFor(forExpression, body, traversal) {
119946
- const targets = forExpression.findDirectExpressions(core_1.Expressions.TargetField);
119947
- const source = forExpression.findDirectExpression(core_1.Expressions.Source);
119948
- const groupBy = forExpression.findDirectExpression(core_1.Expressions.FieldChain);
119949
- if (targets.length !== 2 || source === undefined || groupBy === undefined) {
119950
- throw new Error("ReduceBodyTranspiler invalid GROUPS FOR, " + body.concatTokens());
120058
+ describeGroupsFor(forExpression, traversal, declarations) {
120059
+ const groups = new for_groups_1.ForGroupsTranspiler().transpile(forExpression, traversal);
120060
+ declarations.push(...groups.declarations);
120061
+ const preBody = [...groups.preBody];
120062
+ const letNode = forExpression.findDirectExpression(core_1.Expressions.Let);
120063
+ if (letNode) {
120064
+ preBody.push(new let_1.LetTranspiler().transpile(letNode, traversal).getCode());
119951
120065
  }
119952
- const groupTarget = traversal.traverse(targets[0]).getCode();
119953
- const memberTarget = traversal.traverse(targets[1]).getCode();
119954
- const sourceCode = traversal.traverse(source).getCode();
119955
- const groupByCode = traversal.traverse(groupBy).getCode();
119956
- const groups = unique_identifier_1.UniqueIdentifier.get();
119957
- const row = unique_identifier_1.UniqueIdentifier.get();
119958
- const key = unique_identifier_1.UniqueIdentifier.get();
119959
- const rawKey = unique_identifier_1.UniqueIdentifier.get();
119960
- const entry = unique_identifier_1.UniqueIdentifier.get();
119961
- const generator = `(async function*() {\n`
119962
- + `const ${groups} = new Map();\n`
119963
- + `for await (const ${row} of abap.statements.loop(${sourceCode})) {\n`
119964
- + `const ${memberTarget} = ${row}.clone();\n`
119965
- + `const ${key} = ${groupByCode};\n`
119966
- + `const ${rawKey} = ${key}.get();\n`
119967
- + `let ${entry} = ${groups}.get(${rawKey});\n`
119968
- + `if (${entry} === undefined) {\n`
119969
- + `${entry} = {key: ${key}.clone(), members: []};\n`
119970
- + `${groups}.set(${rawKey}, ${entry});\n`
119971
- + `}\n`
119972
- + `${entry}.members.push(${row});\n`
119973
- + `}\n`
119974
- + `for (const value of ${groups}.values()) { yield value; }\n`
119975
- + `})()`;
119976
- const loopEntry = unique_identifier_1.UniqueIdentifier.get();
119977
120066
  return {
119978
120067
  beforeLoop: [],
119979
- open: `for await (const ${loopEntry} of ${generator}) {`,
119980
- preBody: [
119981
- `const ${groupTarget} = ${loopEntry}.key.clone();`,
119982
- `const ${memberTarget} = ${loopEntry}.members[0].clone();`,
119983
- ],
120068
+ open: groups.open,
120069
+ preBody,
119984
120070
  postBody: [],
119985
- close: "}",
120071
+ close: groups.close,
119986
120072
  };
119987
120073
  }
119988
120074
  describeIndexFor(forExpression, body, traversal) {
@@ -122485,6 +122571,7 @@ const field_assignment_1 = __webpack_require__(/*! ./field_assignment */ "./node
122485
122571
  const statements_1 = __webpack_require__(/*! ../statements */ "./node_modules/@abaplint/transpiler/build/src/statements/index.js");
122486
122572
  const source_field_symbol_1 = __webpack_require__(/*! ./source_field_symbol */ "./node_modules/@abaplint/transpiler/build/src/expressions/source_field_symbol.js");
122487
122573
  const let_1 = __webpack_require__(/*! ./let */ "./node_modules/@abaplint/transpiler/build/src/expressions/let.js");
122574
+ const for_groups_1 = __webpack_require__(/*! ./for_groups */ "./node_modules/@abaplint/transpiler/build/src/expressions/for_groups.js");
122488
122575
  class ValueBodyTranspiler {
122489
122576
  transpile(typ, body, traversal) {
122490
122577
  if (!(typ.get() instanceof core_1.Expressions.TypeNameOrInfer)) {
@@ -122590,7 +122677,23 @@ class ValueBodyTranspiler {
122590
122677
  let uniqueCounter = 1;
122591
122678
  for (const child of forNodes) {
122592
122679
  const loop = child.findDirectExpression(core_1.Expressions.InlineLoopDefinition);
122593
- if (loop) {
122680
+ if (child.findDirectTokenByText("GROUPS")) {
122681
+ const groups = new for_groups_1.ForGroupsTranspiler().transpile(child, traversal);
122682
+ preLoopDecls.push(...groups.declarations);
122683
+ const preBody = [...groups.preBody];
122684
+ const llet = child.findDirectExpression(core_1.Expressions.Let);
122685
+ if (llet) {
122686
+ preBody.push(new let_1.LetTranspiler().transpile(llet, traversal).getCode());
122687
+ }
122688
+ descriptors.push({
122689
+ beforeLoop: [],
122690
+ open: groups.open,
122691
+ preBody,
122692
+ postBody: [],
122693
+ close: groups.close,
122694
+ });
122695
+ }
122696
+ else if (loop) {
122594
122697
  if (["THEN", "UNTIL", "WHILE", "FROM", "TO", "GROUPS"].some(token => child.findDirectTokenByText(token))) {
122595
122698
  throw new Error("ValueBody FOR todo, " + body.concatTokens());
122596
122699
  }
@@ -127446,6 +127549,27 @@ exports.DataTranspiler = DataTranspiler;
127446
127549
 
127447
127550
  /***/ },
127448
127551
 
127552
+ /***/ "./node_modules/@abaplint/transpiler/build/src/statements/delete_cluster.js"
127553
+ /*!**********************************************************************************!*\
127554
+ !*** ./node_modules/@abaplint/transpiler/build/src/statements/delete_cluster.js ***!
127555
+ \**********************************************************************************/
127556
+ (__unused_webpack_module, exports, __webpack_require__) {
127557
+
127558
+ "use strict";
127559
+
127560
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
127561
+ exports.DeleteClusterTranspiler = void 0;
127562
+ const chunk_1 = __webpack_require__(/*! ../chunk */ "./node_modules/@abaplint/transpiler/build/src/chunk.js");
127563
+ class DeleteClusterTranspiler {
127564
+ transpile(_node, _traversal) {
127565
+ return new chunk_1.Chunk(`throw new Error("DELETE CLUSTER, not supported, transpiler");`);
127566
+ }
127567
+ }
127568
+ exports.DeleteClusterTranspiler = DeleteClusterTranspiler;
127569
+ //# sourceMappingURL=delete_cluster.js.map
127570
+
127571
+ /***/ },
127572
+
127449
127573
  /***/ "./node_modules/@abaplint/transpiler/build/src/statements/delete_database.js"
127450
127574
  /*!***********************************************************************************!*\
127451
127575
  !*** ./node_modules/@abaplint/transpiler/build/src/statements/delete_database.js ***!
@@ -129730,6 +129854,7 @@ __exportStar(__webpack_require__(/*! ./convert */ "./node_modules/@abaplint/tran
129730
129854
  __exportStar(__webpack_require__(/*! ./create_data */ "./node_modules/@abaplint/transpiler/build/src/statements/create_data.js"), exports);
129731
129855
  __exportStar(__webpack_require__(/*! ./create_object */ "./node_modules/@abaplint/transpiler/build/src/statements/create_object.js"), exports);
129732
129856
  __exportStar(__webpack_require__(/*! ./data */ "./node_modules/@abaplint/transpiler/build/src/statements/data.js"), exports);
129857
+ __exportStar(__webpack_require__(/*! ./delete_cluster */ "./node_modules/@abaplint/transpiler/build/src/statements/delete_cluster.js"), exports);
129733
129858
  __exportStar(__webpack_require__(/*! ./delete_database */ "./node_modules/@abaplint/transpiler/build/src/statements/delete_database.js"), exports);
129734
129859
  __exportStar(__webpack_require__(/*! ./delete_dataset */ "./node_modules/@abaplint/transpiler/build/src/statements/delete_dataset.js"), exports);
129735
129860
  __exportStar(__webpack_require__(/*! ./delete_internal */ "./node_modules/@abaplint/transpiler/build/src/statements/delete_internal.js"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "2.14.16",
3
+ "version": "2.14.17",
4
4
  "description": "Transpiler - Command Line Interface",
5
5
  "funding": "https://github.com/sponsors/larshp",
6
6
  "bin": {
@@ -28,7 +28,7 @@
28
28
  "license": "MIT",
29
29
  "devDependencies": {
30
30
  "@abaplint/core": "^2.120.92",
31
- "@abaplint/transpiler": "^2.14.16",
31
+ "@abaplint/transpiler": "^2.14.17",
32
32
  "@types/glob": "^9.0.0",
33
33
  "@types/node": "^26.6.6",
34
34
  "@types/progress": "^2.0.7",