@abaplint/transpiler-cli 2.13.46 → 2.13.48

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 +356 -67
  2. package/package.json +4 -4
package/build/bundle.js CHANGED
@@ -4244,7 +4244,7 @@ class Compare extends combi_1.Expression {
4244
4244
  const inn = (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), "IN", (0, combi_1.altPrio)(_1.Source, list));
4245
4245
  const sopt = (0, combi_1.seq)("IS", (0, combi_1.optPrio)("NOT"), (0, combi_1.altPrio)("SUPPLIED", "BOUND", (0, combi_1.ver)(version_1.Release.v750, (0, combi_1.seq)("INSTANCE OF", _1.ClassName), { also: combi_1.AlsoIn.OpenABAP }), "REQUESTED", "INITIAL"));
4246
4246
  const between = (0, combi_1.seq)((0, combi_1.optPrio)("NOT"), "BETWEEN", _1.Source, "AND", _1.Source);
4247
- // https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abennews-740_sp08-expressions.htm
4247
+ // https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abennews-740_sp08-expressions.html
4248
4248
  // but also seems to work in v740sp05, blah
4249
4249
  const predicate = (0, combi_1.ver)(version_1.Release.v740sp08, _1.MethodCallChain, { also: combi_1.AlsoIn.OpenABAP });
4250
4250
  const rett = (0, combi_1.seq)(_1.Source, (0, combi_1.altPrio)((0, combi_1.seq)(_1.CompareOperator, _1.Source), inn, between, sopt));
@@ -7441,10 +7441,10 @@ exports.PerformTables = PerformTables;
7441
7441
  Object.defineProperty(exports, "__esModule", ({ value: true }));
7442
7442
  exports.PerformUsing = void 0;
7443
7443
  const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
7444
- const source_1 = __webpack_require__(/*! ./source */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/source.js");
7444
+ const simple_source3_1 = __webpack_require__(/*! ./simple_source3 */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/simple_source3.js");
7445
7445
  class PerformUsing extends combi_1.Expression {
7446
7446
  getRunnable() {
7447
- const using = (0, combi_1.seq)("USING", (0, combi_1.plus)(source_1.Source));
7447
+ const using = (0, combi_1.seq)("USING", (0, combi_1.plus)(simple_source3_1.SimpleSource3));
7448
7448
  return using;
7449
7449
  }
7450
7450
  }
@@ -10770,7 +10770,7 @@ const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@a
10770
10770
  const dynamic_1 = __webpack_require__(/*! ./dynamic */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/dynamic.js");
10771
10771
  class StringTemplateFormatting extends combi_1.Expression {
10772
10772
  getRunnable() {
10773
- // https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapcompute_string_format_options.htm
10773
+ // https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapcompute_string_format_options.html
10774
10774
  const alphaOptions = (0, combi_1.altPrio)("OUT", "RAW", "IN", _1.Source);
10775
10775
  const alignOptions = (0, combi_1.altPrio)("LEFT", "RIGHT", "CENTER", _1.Source, dynamic_1.Dynamic);
10776
10776
  const dateTimeOptions = (0, combi_1.altPrio)("RAW", "ISO", "USER", "ENVIRONMENT", _1.Source, dynamic_1.Dynamic);
@@ -18179,7 +18179,8 @@ class ReadEntities {
18179
18179
  const result = (0, combi_1.seq)("RESULT", expressions_1.Target);
18180
18180
  const failed = (0, combi_1.seq)("FAILED", expressions_1.Target);
18181
18181
  const reported = (0, combi_1.seq)("REPORTED", expressions_1.Target);
18182
- const foo = (0, combi_1.seq)((0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.EMLEntityPath)), (0, combi_1.alt)(fields, from, all), (0, combi_1.optPrio)(result));
18182
+ const execute = (0, combi_1.seq)("EXECUTE", expressions_1.SimpleName, from);
18183
+ const foo = (0, combi_1.seq)((0, combi_1.opt)((0, combi_1.seq)("BY", expressions_1.EMLEntityPath)), (0, combi_1.alt)(fields, from, all, execute), (0, combi_1.optPrio)(result));
18183
18184
  const entity = (0, combi_1.seq)("ENTITY", expressions_1.NamespaceSimpleName, (0, combi_1.plus)(foo));
18184
18185
  const s = (0, combi_1.seq)("ENTITIES OF", expressions_1.NamespaceSimpleName, (0, combi_1.opt)("IN LOCAL MODE"), (0, combi_1.plus)(entity), (0, combi_1.optPrio)((0, combi_1.seq)("LINK", expressions_1.Target)), (0, combi_1.optPrio)((0, combi_1.per)(failed, reported)));
18185
18186
  const byall = (0, combi_1.seq)("BY", expressions_1.EMLEntityPath, all);
@@ -25523,7 +25524,7 @@ class BuiltIn {
25523
25524
  const sy = new _typed_identifier_1.TypedIdentifier(id1, BuiltIn.filename, type, ["read_only" /* IdentifierMeta.ReadOnly */, "built-in" /* IdentifierMeta.BuiltIn */]);
25524
25525
  const id2 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), "syst");
25525
25526
  const syst = new _typed_identifier_1.TypedIdentifier(id2, BuiltIn.filename, type, ["read_only" /* IdentifierMeta.ReadOnly */, "built-in" /* IdentifierMeta.BuiltIn */]);
25526
- // https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abennews-610-system.htm
25527
+ // https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abennews-610-system.html
25527
25528
  const id3 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), "sy-repid");
25528
25529
  const syrepid = new _typed_identifier_1.TypedIdentifier(id3, BuiltIn.filename, new basic_1.CharacterType(40, { qualifiedName: "sy-repid" }), ["read_only" /* IdentifierMeta.ReadOnly */, "built-in" /* IdentifierMeta.BuiltIn */]);
25529
25530
  const id4 = new tokens_1.Identifier(new position_1.Position(this.row++, 1), "syst-repid");
@@ -28134,7 +28135,7 @@ class TypeUtils {
28134
28135
  }
28135
28136
  }
28136
28137
  else if (source instanceof basic_1.IntegerType) {
28137
- if (target instanceof basic_1.StringType) {
28138
+ if (target instanceof basic_1.StringType || target instanceof basic_1.DateType) {
28138
28139
  return false;
28139
28140
  }
28140
28141
  else if (target instanceof basic_1.Integer8Type || target instanceof basic_1.PackedType) {
@@ -31845,6 +31846,10 @@ class InlineData {
31845
31846
  static runSyntax(node, input, type) {
31846
31847
  var _a;
31847
31848
  const token = (_a = node.findFirstExpression(Expressions.TargetField)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
31849
+ if (token && token.getStr().length > 30) {
31850
+ const message = "DATA name too long, " + token.getStr();
31851
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, token, message));
31852
+ }
31848
31853
  if (token && type) {
31849
31854
  if (type instanceof basic_1.CSequenceType || type instanceof basic_1.CLikeType) {
31850
31855
  type = basic_1.StringType.get();
@@ -32016,10 +32021,16 @@ const Expressions = __importStar(__webpack_require__(/*! ../../2_statements/expr
32016
32021
  const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
32017
32022
  const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
32018
32023
  const _reference_1 = __webpack_require__(/*! ../_reference */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js");
32024
+ const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
32019
32025
  class InlineFS {
32020
32026
  static runSyntax(node, input, type) {
32021
32027
  var _a;
32022
32028
  const token = (_a = node.findFirstExpression(Expressions.TargetFieldSymbol)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
32029
+ const fs = node.findFirstExpression(Expressions.FieldSymbol);
32030
+ if (fs && fs.concatTokens().length > 30) {
32031
+ const message = "FIELD-SYMBOLS name too long, " + fs.concatTokens();
32032
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, fs.getFirstToken(), message));
32033
+ }
32023
32034
  if (token && type) {
32024
32035
  const identifier = new _typed_identifier_1.TypedIdentifier(token, input.filename, type, ["inline" /* IdentifierMeta.InlineDefinition */]);
32025
32036
  input.scope.addIdentifier(identifier);
@@ -37154,6 +37165,75 @@ exports.Assign = Assign;
37154
37165
 
37155
37166
  /***/ },
37156
37167
 
37168
+ /***/ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/at_selection_screen.js"
37169
+ /*!***********************************************************************************************!*\
37170
+ !*** ./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/at_selection_screen.js ***!
37171
+ \***********************************************************************************************/
37172
+ (__unused_webpack_module, exports, __webpack_require__) {
37173
+
37174
+ "use strict";
37175
+
37176
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
37177
+ if (k2 === undefined) k2 = k;
37178
+ var desc = Object.getOwnPropertyDescriptor(m, k);
37179
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
37180
+ desc = { enumerable: true, get: function() { return m[k]; } };
37181
+ }
37182
+ Object.defineProperty(o, k2, desc);
37183
+ }) : (function(o, m, k, k2) {
37184
+ if (k2 === undefined) k2 = k;
37185
+ o[k2] = m[k];
37186
+ }));
37187
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
37188
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
37189
+ }) : function(o, v) {
37190
+ o["default"] = v;
37191
+ });
37192
+ var __importStar = (this && this.__importStar) || (function () {
37193
+ var ownKeys = function(o) {
37194
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37195
+ var ar = [];
37196
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
37197
+ return ar;
37198
+ };
37199
+ return ownKeys(o);
37200
+ };
37201
+ return function (mod) {
37202
+ if (mod && mod.__esModule) return mod;
37203
+ var result = {};
37204
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37205
+ __setModuleDefault(result, mod);
37206
+ return result;
37207
+ };
37208
+ })();
37209
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
37210
+ exports.AtSelectionScreen = void 0;
37211
+ const Expressions = __importStar(__webpack_require__(/*! ../../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js"));
37212
+ const _reference_1 = __webpack_require__(/*! ../_reference */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_reference.js");
37213
+ const source_field_1 = __webpack_require__(/*! ../expressions/source_field */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/source_field.js");
37214
+ class AtSelectionScreen {
37215
+ runSyntax(node, input) {
37216
+ // "AT SELECTION-SCREEN ON <field>", "ON VALUE-REQUEST FOR <field>",
37217
+ // "ON HELP-REQUEST FOR <field>" and "ON END OF <field>" all reference
37218
+ // a parameter or select-option, register these as read references so
37219
+ // they are not reported as unused.
37220
+ const fields = [
37221
+ ...node.findDirectExpressions(Expressions.FieldSub),
37222
+ ...node.findDirectExpressions(Expressions.Field),
37223
+ ];
37224
+ for (const field of fields) {
37225
+ const token = field.getFirstToken();
37226
+ if (input.scope.findVariable(token.getStr()) !== undefined) {
37227
+ source_field_1.SourceField.runSyntax(field, input, _reference_1.ReferenceType.DataReadReference, false);
37228
+ }
37229
+ }
37230
+ }
37231
+ }
37232
+ exports.AtSelectionScreen = AtSelectionScreen;
37233
+ //# sourceMappingURL=at_selection_screen.js.map
37234
+
37235
+ /***/ },
37236
+
37157
37237
  /***/ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/authority_check.js"
37158
37238
  /*!*******************************************************************************************!*\
37159
37239
  !*** ./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/authority_check.js ***!
@@ -40341,14 +40421,19 @@ const Expressions = __importStar(__webpack_require__(/*! ../../2_statements/expr
40341
40421
  const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
40342
40422
  const basic_types_1 = __webpack_require__(/*! ../basic_types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js");
40343
40423
  const unknown_type_1 = __webpack_require__(/*! ../../types/basic/unknown_type */ "./node_modules/@abaplint/core/build/src/abap/types/basic/unknown_type.js");
40424
+ const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
40344
40425
  const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
40345
40426
  class FieldSymbol {
40346
40427
  runSyntax(node, input) {
40347
- var _a;
40348
- const fsname = (_a = node.findFirstExpression(Expressions.FieldSymbol)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
40349
- if (fsname === undefined) {
40428
+ const fs = node.findFirstExpression(Expressions.FieldSymbol);
40429
+ const fsname = fs === null || fs === void 0 ? void 0 : fs.getFirstToken();
40430
+ if (fs === undefined || fsname === undefined) {
40350
40431
  return;
40351
40432
  }
40433
+ if (fs.concatTokens().length > 30) {
40434
+ const message = "FIELD-SYMBOLS name too long, " + fs.concatTokens();
40435
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, fsname, message));
40436
+ }
40352
40437
  if (node.getChildren().length === 5) {
40353
40438
  // no type specified
40354
40439
  input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(fsname, input.filename, basic_1.VoidType.get("FS-SIMPLE")));
@@ -43476,7 +43561,7 @@ class Perform {
43476
43561
  }
43477
43562
  }
43478
43563
  for (const u of node.findDirectExpressions(Expressions.PerformUsing)) {
43479
- for (const s of u.findDirectExpressions(Expressions.Source)) {
43564
+ for (const s of u.findDirectExpressions(Expressions.SimpleSource3)) {
43480
43565
  source_1.Source.runSyntax(s, input);
43481
43566
  }
43482
43567
  }
@@ -43761,10 +43846,15 @@ const Expressions = __importStar(__webpack_require__(/*! ../../2_statements/expr
43761
43846
  const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
43762
43847
  const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
43763
43848
  const basic_types_1 = __webpack_require__(/*! ../basic_types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js");
43849
+ const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
43764
43850
  const assert_error_1 = __webpack_require__(/*! ../assert_error */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/assert_error.js");
43765
43851
  class Ranges {
43766
43852
  runSyntax(node, input) {
43767
43853
  var _a;
43854
+ if (input.scope.isAnyOO()) {
43855
+ const message = "RANGES is not allowed within classes";
43856
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
43857
+ }
43768
43858
  const nameToken = (_a = node.findFirstExpression(Expressions.DefinitionName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
43769
43859
  const typeExpression = node.findFirstExpression(Expressions.SimpleFieldChain2);
43770
43860
  if (typeExpression === undefined) {
@@ -47546,6 +47636,117 @@ exports.TypeEnum = TypeEnum;
47546
47636
 
47547
47637
  /***/ },
47548
47638
 
47639
+ /***/ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_mesh.js"
47640
+ /*!*************************************************************************************!*\
47641
+ !*** ./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_mesh.js ***!
47642
+ \*************************************************************************************/
47643
+ (__unused_webpack_module, exports, __webpack_require__) {
47644
+
47645
+ "use strict";
47646
+
47647
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
47648
+ if (k2 === undefined) k2 = k;
47649
+ var desc = Object.getOwnPropertyDescriptor(m, k);
47650
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
47651
+ desc = { enumerable: true, get: function() { return m[k]; } };
47652
+ }
47653
+ Object.defineProperty(o, k2, desc);
47654
+ }) : (function(o, m, k, k2) {
47655
+ if (k2 === undefined) k2 = k;
47656
+ o[k2] = m[k];
47657
+ }));
47658
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
47659
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
47660
+ }) : function(o, v) {
47661
+ o["default"] = v;
47662
+ });
47663
+ var __importStar = (this && this.__importStar) || (function () {
47664
+ var ownKeys = function(o) {
47665
+ ownKeys = Object.getOwnPropertyNames || function (o) {
47666
+ var ar = [];
47667
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
47668
+ return ar;
47669
+ };
47670
+ return ownKeys(o);
47671
+ };
47672
+ return function (mod) {
47673
+ if (mod && mod.__esModule) return mod;
47674
+ var result = {};
47675
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47676
+ __setModuleDefault(result, mod);
47677
+ return result;
47678
+ };
47679
+ })();
47680
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
47681
+ exports.TypeMesh = void 0;
47682
+ const Expressions = __importStar(__webpack_require__(/*! ../../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js"));
47683
+ const Statements = __importStar(__webpack_require__(/*! ../../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js"));
47684
+ const nodes_1 = __webpack_require__(/*! ../../nodes */ "./node_modules/@abaplint/core/build/src/abap/nodes/index.js");
47685
+ const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
47686
+ const Basic = __importStar(__webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js"));
47687
+ const basic_types_1 = __webpack_require__(/*! ../basic_types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js");
47688
+ const type_1 = __webpack_require__(/*! ../statements/type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/type.js");
47689
+ const _scope_type_1 = __webpack_require__(/*! ../_scope_type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js");
47690
+ class TypeMesh {
47691
+ runSyntax(node, input) {
47692
+ var _a;
47693
+ const begin = node.findDirectStatement(Statements.TypeMeshBegin);
47694
+ if (begin === undefined) {
47695
+ return undefined;
47696
+ }
47697
+ const name = (_a = begin.findFirstExpression(Expressions.NamespaceSimpleName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
47698
+ if (name === undefined) {
47699
+ return undefined;
47700
+ }
47701
+ const components = [];
47702
+ for (const c of node.getChildren()) {
47703
+ if (!(c instanceof nodes_1.StatementNode)) {
47704
+ continue;
47705
+ }
47706
+ const ctyp = c.get();
47707
+ if (ctyp instanceof Statements.Type) {
47708
+ const found = new type_1.Type().runSyntax(c, input, name.getStr() + "-");
47709
+ if (found) {
47710
+ components.push({ name: found.getName(), type: found.getType() });
47711
+ }
47712
+ }
47713
+ else if (ctyp instanceof Statements.TypeMesh) {
47714
+ const found = this.runMeshNode(c, input);
47715
+ if (found) {
47716
+ components.push({ name: found.getName(), type: found.getType() });
47717
+ }
47718
+ }
47719
+ }
47720
+ let qualifiedName = name.getStr();
47721
+ if (input.scope.getType() === _scope_type_1.ScopeType.ClassDefinition
47722
+ || input.scope.getType() === _scope_type_1.ScopeType.Interface) {
47723
+ qualifiedName = input.scope.getName() + "=>" + qualifiedName;
47724
+ }
47725
+ return new _typed_identifier_1.TypedIdentifier(name, input.filename, new Basic.StructureType(components, qualifiedName));
47726
+ }
47727
+ ////////////////////
47728
+ runMeshNode(node, input) {
47729
+ var _a;
47730
+ const nameToken = (_a = node.findFirstExpression(Expressions.NamespaceSimpleName)) === null || _a === void 0 ? void 0 : _a.getFirstToken();
47731
+ if (nameToken === undefined) {
47732
+ return undefined;
47733
+ }
47734
+ const typeName = node.findFirstExpression(Expressions.TypeName);
47735
+ let type = new basic_types_1.BasicTypes(input).resolveTypeName(typeName);
47736
+ if (type === undefined) {
47737
+ type = new Basic.UnknownType("Mesh node, unknown type " + (typeName === null || typeName === void 0 ? void 0 : typeName.concatTokens()));
47738
+ }
47739
+ else if (node.concatTokens().toUpperCase().includes(" TYPE REF TO ")) {
47740
+ type = new Basic.DataReference(type);
47741
+ }
47742
+ return new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, type);
47743
+ }
47744
+ }
47745
+ exports.TypeMesh = TypeMesh;
47746
+ //# sourceMappingURL=type_mesh.js.map
47747
+
47748
+ /***/ },
47749
+
47549
47750
  /***/ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/types.js"
47550
47751
  /*!*********************************************************************************!*\
47551
47752
  !*** ./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/types.js ***!
@@ -47707,6 +47908,7 @@ const objects_1 = __webpack_require__(/*! ../../objects */ "./node_modules/@abap
47707
47908
  const position_1 = __webpack_require__(/*! ../../position */ "./node_modules/@abaplint/core/build/src/position.js");
47708
47909
  const data_1 = __webpack_require__(/*! ./structures/data */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/data.js");
47709
47910
  const type_enum_1 = __webpack_require__(/*! ./structures/type_enum */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_enum.js");
47911
+ const type_mesh_1 = __webpack_require__(/*! ./structures/type_mesh */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_mesh.js");
47710
47912
  const types_1 = __webpack_require__(/*! ./structures/types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/types.js");
47711
47913
  const statics_1 = __webpack_require__(/*! ./structures/statics */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/statics.js");
47712
47914
  const constants_1 = __webpack_require__(/*! ./structures/constants */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/constants.js");
@@ -47751,6 +47953,7 @@ const if_1 = __webpack_require__(/*! ./statements/if */ "./node_modules/@abaplin
47751
47953
  const else_if_1 = __webpack_require__(/*! ./statements/else_if */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/else_if.js");
47752
47954
  const append_1 = __webpack_require__(/*! ./statements/append */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/append.js");
47753
47955
  const selection_screen_1 = __webpack_require__(/*! ./statements/selection_screen */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/selection_screen.js");
47956
+ const at_selection_screen_1 = __webpack_require__(/*! ./statements/at_selection_screen */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/at_selection_screen.js");
47754
47957
  const ranges_1 = __webpack_require__(/*! ./statements/ranges */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/ranges.js");
47755
47958
  const write_1 = __webpack_require__(/*! ./statements/write */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/write.js");
47756
47959
  const case_1 = __webpack_require__(/*! ./statements/case */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/case.js");
@@ -47958,6 +48161,7 @@ if (Object.keys(map).length === 0) {
47958
48161
  addToMap(new authority_check_1.AuthorityCheck());
47959
48162
  addToMap(new insert_report_1.InsertReport());
47960
48163
  addToMap(new selection_screen_1.SelectionScreen());
48164
+ addToMap(new at_selection_screen_1.AtSelectionScreen());
47961
48165
  addToMap(new ranges_1.Ranges());
47962
48166
  addToMap(new add_1.Add());
47963
48167
  addToMap(new raise_event_1.RaiseEvent());
@@ -48139,6 +48343,13 @@ class SyntaxLogic {
48139
48343
  this.scope.addIdentifier(new statics_1.Statics().runSyntax(node, input));
48140
48344
  return true;
48141
48345
  }
48346
+ else if (stru instanceof Structures.TypeMesh) {
48347
+ const found = new type_mesh_1.TypeMesh().runSyntax(node, input);
48348
+ if (found) {
48349
+ this.scope.addType(found);
48350
+ }
48351
+ return true;
48352
+ }
48142
48353
  else if (stru instanceof Structures.TypeEnum) {
48143
48354
  const values = new type_enum_1.TypeEnum().runSyntax(node, input).values;
48144
48355
  this.scope.addList(values);
@@ -51277,6 +51488,7 @@ const data_1 = __webpack_require__(/*! ../5_syntax/statements/data */ "./node_mo
51277
51488
  const constant_1 = __webpack_require__(/*! ../5_syntax/statements/constant */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/statements/constant.js");
51278
51489
  const data_2 = __webpack_require__(/*! ../5_syntax/structures/data */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/data.js");
51279
51490
  const type_enum_1 = __webpack_require__(/*! ../5_syntax/structures/type_enum */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_enum.js");
51491
+ const type_mesh_1 = __webpack_require__(/*! ../5_syntax/structures/type_mesh */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/type_mesh.js");
51280
51492
  const constants_1 = __webpack_require__(/*! ../5_syntax/structures/constants */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/constants.js");
51281
51493
  const type_definitions_1 = __webpack_require__(/*! ./type_definitions */ "./node_modules/@abaplint/core/build/src/abap/types/type_definitions.js");
51282
51494
  const types_1 = __webpack_require__(/*! ../5_syntax/structures/types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/structures/types.js");
@@ -51437,6 +51649,13 @@ class Attributes {
51437
51649
  // scope.addIdentifier(attr);
51438
51650
  }
51439
51651
  }
51652
+ else if (ctyp instanceof Structures.TypeMesh) {
51653
+ const res = new type_mesh_1.TypeMesh().runSyntax(c, input);
51654
+ if (res) {
51655
+ input.scope.addType(res);
51656
+ this.tlist.push({ type: res, visibility });
51657
+ }
51658
+ }
51440
51659
  else if (ctyp instanceof Structures.Types) {
51441
51660
  const res = new types_1.Types().runSyntax(c, input);
51442
51661
  if (res) {
@@ -51657,6 +51876,7 @@ class ClassDefinition extends _identifier_1.Identifier {
51657
51876
  this.createVisibilityValue = visibility_1.Visibility.Public;
51658
51877
  }
51659
51878
  // perform checks after everything has been initialized
51879
+ this.checkInterfaceVisibility(input, node);
51660
51880
  this.checkMethodsFromSuperClasses(input);
51661
51881
  this.checkMethodNameLength(input);
51662
51882
  this.checkClassConstructorStatic(input);
@@ -51730,6 +51950,17 @@ class ClassDefinition extends _identifier_1.Identifier {
51730
51950
  }
51731
51951
  }
51732
51952
  }
51953
+ checkInterfaceVisibility(input, node) {
51954
+ const sections = [
51955
+ node.findDirectStructure(Structures.ProtectedSection),
51956
+ node.findDirectStructure(Structures.PrivateSection),
51957
+ ];
51958
+ for (const section of sections) {
51959
+ for (const statement of (section === null || section === void 0 ? void 0 : section.findAllStatements(Statements.InterfaceDef)) || []) {
51960
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, statement.getFirstToken(), "INTERFACES can only be declared in public sections"));
51961
+ }
51962
+ }
51963
+ }
51733
51964
  checkMethodsFromSuperClasses(input) {
51734
51965
  var _a;
51735
51966
  const scope = input.scope;
@@ -69492,7 +69723,7 @@ class Registry {
69492
69723
  }
69493
69724
  static abaplintVersion() {
69494
69725
  // magic, see build script "version.js"
69495
- return "2.120.5";
69726
+ return "2.120.9";
69496
69727
  }
69497
69728
  getDDICReferences() {
69498
69729
  return this.ddicReferences;
@@ -69836,7 +70067,7 @@ class SevenBitAscii {
69836
70067
  shortDescription: `Only allow characters from the 7bit ASCII set.`,
69837
70068
  extendedInformation: `https://docs.abapopenchecks.org/checks/05/
69838
70069
 
69839
- https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
70070
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abencharacter_set_guidl.html
69840
70071
 
69841
70072
  Checkes files with extensions ".abap" and ".asddls"`,
69842
70073
  tags: [_irule_1.RuleTag.SingleFile],
@@ -71454,7 +71685,7 @@ class AvoidUse extends _abap_rule_1.ABAPRule {
71454
71685
  shortDescription: `Detects usage of certain statements.`,
71455
71686
  extendedInformation: `DEFAULT KEY: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key
71456
71687
 
71457
- Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
71688
+ Macros: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenmacros_guidl.html
71458
71689
 
71459
71690
  STATICS: use CLASS-DATA instead
71460
71691
 
@@ -72188,7 +72419,7 @@ class CDSCommentStyle {
72188
72419
 
72189
72420
  Comments starting with "--" are considered obsolete
72190
72421
 
72191
- https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abencds_general_syntax_rules.htm`,
72422
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abencds_general_syntax_rules.html`,
72192
72423
  tags: [_irule_1.RuleTag.SingleFile],
72193
72424
  badExample: "-- this is a comment",
72194
72425
  goodExample: "// this is a comment",
@@ -72717,7 +72948,7 @@ class ChainMainlyDeclarations extends _abap_rule_1.ABAPRule {
72717
72948
  extendedInformation: `
72718
72949
  https://docs.abapopenchecks.org/checks/23/
72719
72950
 
72720
- https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenchained_statements_guidl.htm
72951
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenchained_statements_guidl.html
72721
72952
  `,
72722
72953
  tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
72723
72954
  badExample: `CALL METHOD: bar.`,
@@ -74241,7 +74472,7 @@ before reading it, so a leftover value is not accidentally used.
74241
74472
 
74242
74473
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#clear-or-overwrite-exporting-reference-parameters
74243
74474
 
74244
- https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenref_transf_output_param_guidl.htm
74475
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenref_transf_output_param_guidl.html
74245
74476
 
74246
74477
  Note: EXPORTING parameters passed by VALUE are always initialized and are therefore not reported.
74247
74478
  Reading and writing the parameter in the same statement (e.g. "ev_result = ev_result + 1") is reported,
@@ -74940,7 +75171,7 @@ class ConstructorVisibilityPublic {
74940
75171
  This only applies to global classes.
74941
75172
 
74942
75173
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
74943
- https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abeninstance_constructor_guidl.htm`,
75174
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abeninstance_constructor_guidl.html`,
74944
75175
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
74945
75176
  badExample: `CLASS zcl_foo DEFINITION PUBLIC CREATE PRIVATE.
74946
75177
  PRIVATE SECTION.
@@ -79975,8 +80206,8 @@ class ExitOrCheck extends _abap_rule_1.ABAPRule {
79975
80206
  title: "Find EXIT or CHECK outside loops",
79976
80207
  shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
79977
80208
  Use RETURN to leave procesing blocks instead.`,
79978
- extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
79979
- https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
80209
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenleave_processing_blocks.html
80210
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapcheck_processing_blocks.html
79980
80211
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return`,
79981
80212
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
79982
80213
  badExample: `CHECK is_valid = abap_true.
@@ -80066,7 +80297,7 @@ class ExpandMacros extends _abap_rule_1.ABAPRule {
80066
80297
  key: "expand_macros",
80067
80298
  title: "Expand Macros",
80068
80299
  shortDescription: `Allows expanding macro calls with quick fixes`,
80069
- extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
80300
+ extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenmacros_guidl.html
80070
80301
 
80071
80302
  Note that macros/DEFINE cannot be used in the ABAP Cloud programming model`,
80072
80303
  badExample: `DEFINE _hello.
@@ -80280,7 +80511,7 @@ class FMGlobalParametersObsolete {
80280
80511
  key: "fm_global_parameters_obsolete",
80281
80512
  title: "FM Global Parameters Obsolete",
80282
80513
  shortDescription: `Check for function modules with global parameters`,
80283
- extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenglobal_parameters_obsolete.htm`,
80514
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenglobal_parameters_obsolete.html`,
80284
80515
  tags: [],
80285
80516
  };
80286
80517
  }
@@ -80765,7 +80996,7 @@ class FormTablesObsolete extends _abap_rule_1.ABAPRule {
80765
80996
  key: "form_tables_obsolete",
80766
80997
  title: "TABLES parameters are obsolete",
80767
80998
  shortDescription: `Checks for TABLES parameters in forms.`,
80768
- extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapform_tables.htm`,
80999
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapform_tables.html`,
80769
81000
  tags: [_irule_1.RuleTag.SingleFile],
80770
81001
  badExample: `FORM update_items TABLES items.
80771
81002
  ENDFORM.`,
@@ -82726,7 +82957,7 @@ class ImplicitStartOfSelection extends _abap_rule_1.ABAPRule {
82726
82957
  shortDescription: `Add explicit selection screen event handling`,
82727
82958
  extendedInformation: `Only runs for executable programs
82728
82959
 
82729
- https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selection.htm`,
82960
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapstart-of-selection.html`,
82730
82961
  tags: [_irule_1.RuleTag.SingleFile],
82731
82962
  badExample: `REPORT zfoo.
82732
82963
  WRITE 'hello'.`,
@@ -86167,7 +86398,7 @@ class MethodOverwritesBuiltIn extends _abap_rule_1.ABAPRule {
86167
86398
  key: "method_overwrites_builtin",
86168
86399
  title: "Method name overwrites builtin function",
86169
86400
  shortDescription: `Checks Method names that overwrite builtin SAP functions`,
86170
- extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
86401
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abenbuilt_in_functions_overview.html
86171
86402
 
86172
86403
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
86173
86404
 
@@ -86409,7 +86640,7 @@ class MixReturning extends _abap_rule_1.ABAPRule {
86409
86640
  shortDescription: `Checks that methods don't have a mixture of returning and exporting/changing parameters`,
86410
86641
  extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-either-returning-or-exporting-or-changing-but-not-a-combination
86411
86642
 
86412
- This syntax is not allowed on versions earlier than 740sp02, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abennews-740-abap_objects.htm#!ABAP_MODIFICATION_1@1@`,
86643
+ This syntax is not allowed on versions earlier than 740sp02, https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abennews-740-abap_objects.html#!ABAP_MODIFICATION_1@1@`,
86413
86644
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Syntax],
86414
86645
  badExample: `CLASS lcl DEFINITION.
86415
86646
  PUBLIC SECTION.
@@ -87740,7 +87971,7 @@ class NoMacros extends _abap_rule_1.ABAPRule {
87740
87971
  shortDescription: `Checks that macros are not used`,
87741
87972
  extendedInformation: `Macros reduce readability and are difficult to debug, use methods or form routines instead.
87742
87973
 
87743
- https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenmacros_guidl.htm`,
87974
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenmacros_guidl.html`,
87744
87975
  tags: [_irule_1.RuleTag.SingleFile],
87745
87976
  badExample: `DEFINE _macro.
87746
87977
  WRITE 'hello'.
@@ -87998,13 +88229,13 @@ https://github.com/SAP/styleguides/blob/main/clean-abap/sub-sections/AvoidEncodi
87998
88229
  return ret;
87999
88230
  }
88000
88231
  checkMethodParameters(topNode, regex, file) {
88001
- var _a, _b;
88232
+ var _a, _b, _c;
88002
88233
  const ret = [];
88003
88234
  for (const method of topNode.findAllStatements(Statements.MethodDef)) {
88004
88235
  for (const param of method.findAllExpressionsMulti([Expressions.MethodDefReturning, Expressions.MethodParam])) {
88005
88236
  const nameToken = param === null || param === void 0 ? void 0 : param.findFirstExpression(Expressions.MethodParamName);
88006
- const type = (_b = (_a = param === null || param === void 0 ? void 0 : param.findFirstExpression(Expressions.TypeParam)) === null || _a === void 0 ? void 0 : _a.concatTokens()) === null || _b === void 0 ? void 0 : _b.toUpperCase();
88007
- if (this.getConfig().allowIsPrefixBoolean === true && (type === null || type === void 0 ? void 0 : type.endsWith("TYPE ABAP_BOOL"))) {
88237
+ const typeName = (_c = (_b = (_a = param === null || param === void 0 ? void 0 : param.findFirstExpression(Expressions.TypeParam)) === null || _a === void 0 ? void 0 : _a.findFirstExpression(Expressions.TypeNameOrInfer)) === null || _b === void 0 ? void 0 : _b.concatTokens()) === null || _c === void 0 ? void 0 : _c.toUpperCase();
88238
+ if (this.getConfig().allowIsPrefixBoolean === true && typeName === "ABAP_BOOL") {
88008
88239
  continue;
88009
88240
  }
88010
88241
  const name = nameToken === null || nameToken === void 0 ? void 0 : nameToken.concatTokens();
@@ -88664,44 +88895,44 @@ https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-func
88664
88895
 
88665
88896
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements
88666
88897
 
88667
- SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapset_extended_check.htm
88898
+ SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapset_extended_check.html
88668
88899
 
88669
- IS REQUESTED: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenlogexp_requested.htm
88900
+ IS REQUESTED: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenlogexp_requested.html
88670
88901
 
88671
- WITH HEADER LINE: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapdata_header_line.htm
88902
+ WITH HEADER LINE: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapdata_header_line.html
88672
88903
 
88673
- FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapfield-symbols_obsolete_typing.htm
88904
+ FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapfield-symbols_obsolete_typing.html
88674
88905
 
88675
- TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
88906
+ TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abennews-71-program_load.html
88676
88907
 
88677
- LOAD addition: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
88908
+ LOAD addition: from 702, https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abennews-71-program_load.html
88678
88909
 
88679
- COMMUICATION: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapcommunication.htm
88910
+ COMMUICATION: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapcommunication.html
88680
88911
 
88681
- OCCURS: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapdata_occurs.htm
88912
+ OCCURS: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapdata_occurs.html
88682
88913
 
88683
- PARAMETER: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapparameter.htm
88914
+ PARAMETER: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapparameter.html
88684
88915
 
88685
- RANGES: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapranges.htm
88916
+ RANGES: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapranges.html
88686
88917
 
88687
- PACK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abappack.htm
88918
+ PACK: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abappack.html
88688
88919
 
88689
- MOVE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapmove_obs.htm
88920
+ MOVE: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapmove_obs.html
88690
88921
 
88691
- SELECT without INTO: https://help.sap.com/doc/abapdocu_731_index_htm/7.31/en-US/abapselect_obsolete.htm
88922
+ SELECT without INTO: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapselect_obsolete.html
88692
88923
  SELECT COUNT(*) is considered okay
88693
88924
 
88694
- FREE MEMORY: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapfree_mem_id_obsolete.htm
88925
+ FREE MEMORY: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abapfree_mem_id_obsolete.html
88695
88926
 
88696
- SORT BY FS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapsort_itab_obsolete.htm
88927
+ SORT BY FS: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapsort_itab_obsolete.html
88697
88928
 
88698
- CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapcall_transformation_objects.htm
88929
+ CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapcall_transformation_objects.html
88699
88930
 
88700
- POSIX REGEX: https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/index.htm
88931
+ POSIX REGEX: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/ABENREGEX_MIGRATING_POSIX.html
88701
88932
 
88702
88933
  OCCURENCES: check for OCCURENCES vs OCCURRENCES
88703
88934
 
88704
- CLIENT SPECIFIED, from 754: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapselect_client_obsolete.htm`,
88935
+ CLIENT SPECIFIED, from 754: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapselect_client_obsolete.html`,
88705
88936
  badExample: `REFRESH itab.
88706
88937
 
88707
88938
  COMPUTE foo = 2 + 2.
@@ -90150,7 +90381,7 @@ class PragmaStyle extends _abap_rule_1.ABAPRule {
90150
90381
  title: "Pragma Style",
90151
90382
  shortDescription: `Check pragmas placement and case`,
90152
90383
  tags: [_irule_1.RuleTag.SingleFile],
90153
- extendedInformation: `https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abenpragma.htm`,
90384
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/ABENPRAGMA.html`,
90154
90385
  badExample: `DATA field ##NO_TEXT TYPE i.`,
90155
90386
  goodExample: `DATA field TYPE i ##NO_TEXT.`,
90156
90387
  };
@@ -92388,7 +92619,7 @@ class RFCErrorHandling extends _abap_rule_1.ABAPRule {
92388
92619
  title: "RFC error handling",
92389
92620
  tags: [_irule_1.RuleTag.SingleFile],
92390
92621
  shortDescription: `Checks that exceptions 'system_failure' and 'communication_failure' are handled in RFC calls`,
92391
- extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenrfc_exception.htm`,
92622
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abenrfc_exception.html`,
92392
92623
  badExample: `CALL FUNCTION 'ZRFC'
92393
92624
  DESTINATION lv_rfc.`,
92394
92625
  goodExample: `CALL FUNCTION 'ZRFC'
@@ -94382,9 +94613,9 @@ class StrictSQL extends _abap_rule_1.ABAPRule {
94382
94613
  key: "strict_sql",
94383
94614
  title: "Strict SQL",
94384
94615
  shortDescription: `Strict SQL`,
94385
- extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm
94616
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abapinto_clause.html
94386
94617
 
94387
- https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm
94618
+ https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/ABENABAP_SQL_STRICT_MODES.html
94388
94619
 
94389
94620
  Also see separate rule sql_escape_host_variables
94390
94621
 
@@ -94772,7 +95003,7 @@ class SyModification extends _abap_rule_1.ABAPRule {
94772
95003
  key: "sy_modification",
94773
95004
  title: "Modification of SY fields",
94774
95005
  shortDescription: `Finds modification of sy fields`,
94775
- extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abensystem_fields.htm
95006
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/abensystem_fields.html
94776
95007
 
94777
95008
  Changes to SY-TVAR* fields are not reported
94778
95009
 
@@ -95100,7 +95331,7 @@ class TablesDeclaredLocally extends _abap_rule_1.ABAPRule {
95100
95331
  key: "tables_declared_locally",
95101
95332
  title: "Check for locally declared TABLES",
95102
95333
  shortDescription: `TABLES are always global, so declare them globally`,
95103
- extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abaptables.htm`,
95334
+ extendedInformation: `https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-us/abaptables.html`,
95104
95335
  tags: [_irule_1.RuleTag.SingleFile],
95105
95336
  badExample: `FORM foo.
95106
95337
  TABLES t100.
@@ -102092,7 +102323,7 @@ class ConstantTranspiler {
102092
102323
  str = node.findDirectExpression(core_1.Expressions.TextElementString);
102093
102324
  }
102094
102325
  if (str) {
102095
- let res = str.getFirstToken().getStr();
102326
+ const res = str.getFirstToken().getStr();
102096
102327
  if (res.startsWith("'") && this.addGet === false) {
102097
102328
  const code = this.handleCharacter(res);
102098
102329
  return new chunk_1.Chunk().append(code, node, traversal);
@@ -102102,10 +102333,7 @@ class ConstantTranspiler {
102102
102333
  return new chunk_1.Chunk().append(code, node, traversal);
102103
102334
  }
102104
102335
  else {
102105
- if (res.startsWith("'")) {
102106
- res = "'" + res.substring(1, res.length - 1).trimEnd() + "'";
102107
- }
102108
- const code = ConstantTranspiler.escape(res);
102336
+ const code = ConstantTranspiler.escape(ConstantTranspiler.trimTextFieldLiteral(res));
102109
102337
  return new chunk_1.Chunk().append(code, node, traversal);
102110
102338
  }
102111
102339
  }
@@ -102146,6 +102374,13 @@ class ConstantTranspiler {
102146
102374
  // const code = "new abap.types.Character(" + length + ").set(" + ConstantTranspiler.escape(res) + ")";
102147
102375
  return code;
102148
102376
  }
102377
+ // text field literals are of type c, trailing blanks are not part of the value
102378
+ static trimTextFieldLiteral(str) {
102379
+ if (str.startsWith("'") && str.endsWith("'") && str.length >= 2) {
102380
+ return "'" + str.substring(1, str.length - 1).trimEnd() + "'";
102381
+ }
102382
+ return str;
102383
+ }
102149
102384
  static escape(str) {
102150
102385
  str = str.replace(/\\/g, "\\\\");
102151
102386
  if (str.startsWith("'")) {
@@ -104577,14 +104812,34 @@ class SQLCondTranspiler {
104577
104812
  return sourceWithComponents;
104578
104813
  }
104579
104814
  let ret = "";
104815
+ let hostExpression = false;
104580
104816
  for (const child of node.getChildren()) {
104817
+ if (!(child instanceof abaplint.Nodes.ExpressionNode) && child.getFirstToken().getStr() === "@") {
104818
+ hostExpression = true;
104819
+ continue;
104820
+ }
104581
104821
  if (ret !== "") {
104582
104822
  ret += " ";
104583
104823
  }
104584
- if ((child.get() instanceof abaplint.Expressions.SQLFieldName
104824
+ if (hostExpression
104825
+ && child instanceof abaplint.Nodes.ExpressionNode
104826
+ && child.get() instanceof abaplint.Expressions.SimpleSource3) {
104827
+ const code = new simple_source3_1.SimpleSource3Transpiler(true).transpile(child, traversal).getCode();
104828
+ ret += `'" + ${code} + "'`;
104829
+ hostExpression = false;
104830
+ }
104831
+ else if ((child.get() instanceof abaplint.Expressions.SQLFieldName
104585
104832
  || child.get() instanceof abaplint.Expressions.SQLAliasField)
104586
104833
  && child instanceof abaplint.Nodes.ExpressionNode) {
104587
- ret += new sql_field_name_1.SQLFieldNameTranspiler().transpile(child, traversal).getCode();
104834
+ if (hostExpression) {
104835
+ let name = traversal.prefixAndName(child.getFirstToken(), filename).replace("~", "$");
104836
+ name = traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(name));
104837
+ ret += `'" + ${name}.get() + "'`;
104838
+ hostExpression = false;
104839
+ }
104840
+ else {
104841
+ ret += new sql_field_name_1.SQLFieldNameTranspiler().transpile(child, traversal).getCode();
104842
+ }
104588
104843
  }
104589
104844
  else if (child.get() instanceof abaplint.Expressions.SQLSource
104590
104845
  && child instanceof abaplint.Nodes.ExpressionNode) {
@@ -110297,6 +110552,30 @@ const constant_1 = __webpack_require__(/*! ../expressions/constant */ "./node_mo
110297
110552
  const expressions_1 = __webpack_require__(/*! ../expressions */ "./node_modules/@abaplint/transpiler/build/src/expressions/index.js");
110298
110553
  const chunk_1 = __webpack_require__(/*! ../chunk */ "./node_modules/@abaplint/transpiler/build/src/chunk.js");
110299
110554
  class DataTranspiler {
110555
+ skipLoopScoping;
110556
+ variableName = "";
110557
+ loopScoped = false;
110558
+ constructor(options) {
110559
+ this.skipLoopScoping = options?.skipLoopScoping === true;
110560
+ }
110561
+ /** name of the declared javascript variable, set by transpile() */
110562
+ getVariableName() {
110563
+ return this.variableName;
110564
+ }
110565
+ /** set by transpile(), true if the declaration is inside a loop */
110566
+ isLoopScoped() {
110567
+ return this.loopScoped;
110568
+ }
110569
+ /** DATA is scoped to the enclosing method/form/program, but when the statement is inside a
110570
+ * loop the generated declaration ends up inside the javascript block of the loop. Declaring
110571
+ * with "var" hoists it out of the block, and the guard makes sure its constructed only on the
110572
+ * first pass, ie. contents are kept across iterations, matching ABAP */
110573
+ static wrapLoopScoped(name, chunk) {
110574
+ return new chunk_1.Chunk()
110575
+ .appendString(`if (${name} === undefined) {\n`)
110576
+ .appendChunk(chunk)
110577
+ .appendString("\n}");
110578
+ }
110300
110579
  transpile(node, traversal) {
110301
110580
  const token = node.findFirstExpression(abaplint.Expressions.DefinitionName)?.getFirstToken();
110302
110581
  if (token === undefined) {
@@ -110324,12 +110603,17 @@ class DataTranspiler {
110324
110603
  value = "\n" + traversal_1.Traversal.prefixVariable(found.getName().toLowerCase()) + ".set(\"" + enumDefault + "\");";
110325
110604
  }
110326
110605
  }
110606
+ this.variableName = traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(found.getName().toLowerCase()));
110607
+ this.loopScoped = traversal.isInsideLoop(node);
110327
110608
  const ret = new chunk_1.Chunk()
110328
- .appendString("let ")
110329
- .appendString(traversal_1.Traversal.prefixVariable(traversal_1.Traversal.escapeNamespace(found.getName().toLowerCase())))
110609
+ .appendString(this.loopScoped === true ? "var " : "let ")
110610
+ .appendString(this.variableName)
110330
110611
  .appendString(" = " + transpile_types_1.TranspileTypes.toType(found.getType()))
110331
110612
  .appendString(";")
110332
110613
  .appendString(value);
110614
+ if (this.loopScoped === true && this.skipLoopScoping === false) {
110615
+ return DataTranspiler.wrapLoopScoped(this.variableName, ret);
110616
+ }
110333
110617
  return ret;
110334
110618
  }
110335
110619
  static findEnumDefault(scope, _enumType) {
@@ -110361,7 +110645,7 @@ class DataTranspiler {
110361
110645
  int = val.findFirstExpression(abaplint.Expressions.ConstantString);
110362
110646
  }
110363
110647
  if (int) {
110364
- const escaped = constant_1.ConstantTranspiler.escape(int.concatTokens());
110648
+ const escaped = constant_1.ConstantTranspiler.escape(constant_1.ConstantTranspiler.trimTextFieldLiteral(int.concatTokens()));
110365
110649
  value = "\n" + name + ".set(" + escaped + ");";
110366
110650
  }
110367
110651
  else if (val.getChildren()[1].get() instanceof abaplint.Expressions.SimpleFieldChain) {
@@ -114129,7 +114413,7 @@ class PerformTranspiler {
114129
114413
  index++;
114130
114414
  }
114131
114415
  index = 0;
114132
- for (const u of node.findDirectExpression(abaplint.Expressions.PerformUsing)?.findDirectExpressions(abaplint.Expressions.Source) || []) {
114416
+ for (const u of node.findDirectExpression(abaplint.Expressions.PerformUsing)?.findDirectExpressions(abaplint.Expressions.SimpleSource3) || []) {
114133
114417
  const name = def?.getUsingParameters()[index].getName().toLowerCase();
114134
114418
  if (name === undefined) {
114135
114419
  continue;
@@ -117919,13 +118203,18 @@ class DataTranspiler {
117919
118203
  return new chunk_1.Chunk("");
117920
118204
  }
117921
118205
  const topName = begin.findDirectExpression(abaplint.Expressions.DefinitionName)?.concatTokens().toLowerCase();
117922
- const chunk = new statements_1.DataTranspiler().transpile(begin, traversal).ensureStartMapping(begin, traversal);
118206
+ // the component values are part of the declaration, so they must stay inside the loop guard
118207
+ const statement = new statements_1.DataTranspiler({ skipLoopScoping: true });
118208
+ let chunk = statement.transpile(begin, traversal).ensureStartMapping(begin, traversal);
117923
118209
  for (const d of node.findDirectStatements(abaplint.Statements.Data)) {
117924
118210
  const subName = d.findFirstExpression(abaplint.Expressions.DefinitionName)?.concatTokens().toLowerCase();
117925
118211
  if (subName && topName) {
117926
118212
  chunk.appendString(statements_1.DataTranspiler.buildValue(d, topName + ".get()." + subName, traversal));
117927
118213
  }
117928
118214
  }
118215
+ if (statement.isLoopScoped() === true) {
118216
+ chunk = statements_1.DataTranspiler.wrapLoopScoped(statement.getVariableName(), chunk);
118217
+ }
117929
118218
  chunk.appendString("\n");
117930
118219
  return chunk;
117931
118220
  }
@@ -120149,7 +120438,7 @@ this.INTERNAL_ID = abap.internalIdCounter++;\n`;
120149
120438
  }
120150
120439
  const handle = (val, name) => {
120151
120440
  if (typeof val === "string") {
120152
- const e = expressions_1.ConstantTranspiler.escape(val);
120441
+ const e = expressions_1.ConstantTranspiler.escape(expressions_1.ConstantTranspiler.trimTextFieldLiteral(val));
120153
120442
  ret += name + ".set(" + e + ");\n";
120154
120443
  }
120155
120444
  else if (typeof val === "object") {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "2.13.46",
3
+ "version": "2.13.48",
4
4
  "description": "Transpiler - Command Line Interface",
5
5
  "funding": "https://github.com/sponsors/larshp",
6
6
  "bin": {
@@ -27,10 +27,10 @@
27
27
  "author": "abaplint",
28
28
  "license": "MIT",
29
29
  "devDependencies": {
30
- "@abaplint/core": "^2.120.5",
31
- "@abaplint/transpiler": "^2.13.46",
30
+ "@abaplint/core": "^2.120.9",
31
+ "@abaplint/transpiler": "^2.13.48",
32
32
  "@types/glob": "^8.1.0",
33
- "@types/node": "^24.12.2",
33
+ "@types/node": "^24.13.3",
34
34
  "@types/progress": "^2.0.7",
35
35
  "glob": "=7.2.0",
36
36
  "p-limit": "^3.1.0",