@abaplint/transpiler-cli 2.12.12 → 2.12.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/abap_transpile CHANGED
@@ -1,2 +1,2 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
2
  require("./build/bundle");
package/build/bundle.js CHANGED
@@ -4934,7 +4934,6 @@ __exportStar(__webpack_require__(/*! ./sql_arithmetic_operator */ "./node_module
4934
4934
  __exportStar(__webpack_require__(/*! ./sql_arithmetics */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_arithmetics.js"), exports);
4935
4935
  __exportStar(__webpack_require__(/*! ./sql_as_name */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_as_name.js"), exports);
4936
4936
  __exportStar(__webpack_require__(/*! ./sql_case */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_case.js"), exports);
4937
- __exportStar(__webpack_require__(/*! ./sql_cast */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cast.js"), exports);
4938
4937
  __exportStar(__webpack_require__(/*! ./sql_cds_parameters */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cds_parameters.js"), exports);
4939
4938
  __exportStar(__webpack_require__(/*! ./sql_client */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_client.js"), exports);
4940
4939
  __exportStar(__webpack_require__(/*! ./sql_compare_operator */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_compare_operator.js"), exports);
@@ -7085,33 +7084,6 @@ exports.SQLCase = SQLCase;
7085
7084
 
7086
7085
  /***/ }),
7087
7086
 
7088
- /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cast.js":
7089
- /*!*****************************************************************************************!*\
7090
- !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cast.js ***!
7091
- \*****************************************************************************************/
7092
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
7093
-
7094
- "use strict";
7095
-
7096
- Object.defineProperty(exports, "__esModule", ({ value: true }));
7097
- exports.SQLCast = void 0;
7098
- const _1 = __webpack_require__(/*! . */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
7099
- const version_1 = __webpack_require__(/*! ../../../version */ "./node_modules/@abaplint/core/build/src/version.js");
7100
- const tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
7101
- const combi_1 = __webpack_require__(/*! ../combi */ "./node_modules/@abaplint/core/build/src/abap/2_statements/combi.js");
7102
- const sql_field_name_1 = __webpack_require__(/*! ./sql_field_name */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_field_name.js");
7103
- class SQLCast extends combi_1.Expression {
7104
- getRunnable() {
7105
- const abap = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), _1.SimpleFieldChain2), version_1.Version.OpenABAP);
7106
- // todo: from version something
7107
- return (0, combi_1.seq)("CAST", "(", (0, combi_1.opt)((0, combi_1.altPrio)(sql_field_name_1.SQLFieldName, abap)), "AS", sql_field_name_1.SQLFieldName, ")");
7108
- }
7109
- }
7110
- exports.SQLCast = SQLCast;
7111
- //# sourceMappingURL=sql_cast.js.map
7112
-
7113
- /***/ }),
7114
-
7115
7087
  /***/ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cds_parameters.js":
7116
7088
  /*!***************************************************************************************************!*\
7117
7089
  !*** ./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_cds_parameters.js ***!
@@ -7267,7 +7239,7 @@ class SQLField extends combi_1.Expression {
7267
7239
  const abap = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WAt), _1.SimpleFieldChain2), version_1.Version.OpenABAP);
7268
7240
  const as = (0, combi_1.seq)("AS", _1.SQLAsName);
7269
7241
  const parenFieldName = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WParenLeftW), _1.SQLFieldName, (0, combi_1.altPrio)((0, combi_1.tok)(tokens_1.WParenRightW), (0, combi_1.tok)(tokens_1.WParenRight)));
7270
- const field = (0, combi_1.altPrio)(_1.SQLAggregation, _1.SQLCase, _1.SQLCast, sql_function_1.SQLFunction, sql_path_1.SQLPath, _1.SQLFieldName, abap, _1.Constant, parenFieldName);
7242
+ const field = (0, combi_1.altPrio)(_1.SQLAggregation, _1.SQLCase, sql_function_1.SQLFunction, sql_path_1.SQLPath, _1.SQLFieldName, abap, _1.Constant, parenFieldName);
7271
7243
  const parenField = (0, combi_1.seq)((0, combi_1.tok)(tokens_1.WParenLeftW), field, (0, combi_1.tok)(tokens_1.WParenRightW));
7272
7244
  const sub = (0, combi_1.plusPrio)((0, combi_1.seq)((0, combi_1.altPrio)("+", "-", "*", "/", "&&"), (0, combi_1.altPrio)(parenField, field)));
7273
7245
  const arith = (0, combi_1.ver)(version_1.Version.v740sp05, sub);
@@ -7533,10 +7505,11 @@ const integer_1 = __webpack_require__(/*! ./integer */ "./node_modules/@abaplint
7533
7505
  const sql_function_input_1 = __webpack_require__(/*! ./sql_function_input */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/sql_function_input.js");
7534
7506
  class SQLFunction extends combi_1.Expression {
7535
7507
  getRunnable() {
7536
- const castTypes = (0, combi_1.altPrio)((0, combi_1.seq)("CHAR", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), (0, combi_1.seq)("DEC", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, ",", integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), (0, combi_1.seq)("NUMC", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), "FLTP", "INT2", "INT4", "INT8");
7508
+ const castTypes = (0, combi_1.altPrio)((0, combi_1.seq)("CHAR", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), (0, combi_1.seq)("DEC", (0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, ",", integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)), (0, combi_1.seq)("NUMC", (0, combi_1.optPrio)((0, combi_1.seq)((0, combi_1.tok)(tokens_1.ParenLeftW), integer_1.Integer, (0, combi_1.tok)(tokens_1.WParenRightW)))), "DATS", "FLTP", "INT2", "INT4", "INT8");
7537
7509
  const commaParam = (0, combi_1.seq)(",", sql_function_input_1.SQLFunctionInput);
7538
7510
  // note: the function names are not keywords, they are usually in lower case
7539
7511
  const abs = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.regex)(/^abs$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, (0, combi_1.tok)(tokens_1.WParenRightW)));
7512
+ // yea, 750 is correct, but it also works technically in version v740sp05
7540
7513
  const cast = (0, combi_1.ver)(version_1.Version.v750, (0, combi_1.seq)((0, combi_1.regex)(/^cast$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, "AS", castTypes, (0, combi_1.tok)(tokens_1.WParenRightW)));
7541
7514
  const ceil = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.regex)(/^ceil$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, (0, combi_1.tok)(tokens_1.WParenRightW)));
7542
7515
  const coalesce = (0, combi_1.ver)(version_1.Version.v740sp05, (0, combi_1.seq)((0, combi_1.regex)(/^coalesce$/i), (0, combi_1.tok)(tokens_1.ParenLeftW), sql_function_input_1.SQLFunctionInput, commaParam, (0, combi_1.optPrio)(commaParam), (0, combi_1.tok)(tokens_1.WParenRightW)));
@@ -19604,33 +19577,21 @@ exports.Identifier = Identifier;
19604
19577
  /*!************************************************************************************************!*\
19605
19578
  !*** ./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information.js ***!
19606
19579
  \************************************************************************************************/
19607
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19580
+ /***/ ((__unused_webpack_module, exports) => {
19608
19581
 
19609
19582
  "use strict";
19610
19583
 
19611
19584
  Object.defineProperty(exports, "__esModule", ({ value: true }));
19612
19585
  exports.ABAPFileInformation = void 0;
19613
- const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
19614
- const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
19615
- const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
19616
- const _abap_file_information_1 = __webpack_require__(/*! ./_abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_abap_file_information.js");
19617
- const _identifier_1 = __webpack_require__(/*! ./_identifier */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js");
19618
- const Tokens = __webpack_require__(/*! ../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
19619
- const visibility_1 = __webpack_require__(/*! ./visibility */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js");
19620
19586
  class ABAPFileInformation {
19621
- constructor(structure, filename) {
19622
- this.forms = [];
19623
- this.implementations = [];
19624
- this.interfaces = [];
19625
- this.classes = [];
19626
- this.filename = filename;
19627
- this.parse(structure);
19587
+ constructor(parsed) {
19588
+ this.parsed = parsed;
19628
19589
  }
19629
19590
  listClassImplementations() {
19630
- return this.implementations;
19591
+ return this.parsed.implementations;
19631
19592
  }
19632
19593
  listInterfaceDefinitions() {
19633
- return this.interfaces;
19594
+ return this.parsed.interfaces;
19634
19595
  }
19635
19596
  getInterfaceDefinitionByName(name) {
19636
19597
  const upper = name.toUpperCase();
@@ -19642,7 +19603,7 @@ class ABAPFileInformation {
19642
19603
  return undefined;
19643
19604
  }
19644
19605
  listClassDefinitions() {
19645
- return this.classes;
19606
+ return this.parsed.classes;
19646
19607
  }
19647
19608
  getClassDefinitionByName(name) {
19648
19609
  const upper = name.toUpperCase();
@@ -19663,16 +19624,54 @@ class ABAPFileInformation {
19663
19624
  return undefined;
19664
19625
  }
19665
19626
  listFormDefinitions() {
19666
- return this.forms;
19627
+ return this.parsed.forms;
19628
+ }
19629
+ }
19630
+ exports.ABAPFileInformation = ABAPFileInformation;
19631
+ //# sourceMappingURL=abap_file_information.js.map
19632
+
19633
+ /***/ }),
19634
+
19635
+ /***/ "./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information_parser.js":
19636
+ /*!*******************************************************************************************************!*\
19637
+ !*** ./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information_parser.js ***!
19638
+ \*******************************************************************************************************/
19639
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
19640
+
19641
+ "use strict";
19642
+
19643
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19644
+ exports.ABAPFileInformationParser = void 0;
19645
+ const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
19646
+ const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
19647
+ const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
19648
+ const _identifier_1 = __webpack_require__(/*! ./_identifier */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js");
19649
+ const Tokens = __webpack_require__(/*! ../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
19650
+ const visibility_1 = __webpack_require__(/*! ./visibility */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js");
19651
+ const _abap_file_information_1 = __webpack_require__(/*! ./_abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_abap_file_information.js");
19652
+ class ABAPFileInformationParser {
19653
+ constructor(filename) {
19654
+ this.filename = filename;
19667
19655
  }
19668
- ///////////////////////
19669
19656
  parse(structure) {
19670
- var _a;
19657
+ const result = {
19658
+ interfaces: [],
19659
+ classes: [],
19660
+ forms: [],
19661
+ implementations: [],
19662
+ };
19671
19663
  if (structure === undefined) {
19672
- return;
19664
+ return result;
19673
19665
  }
19674
- this.parseClasses(structure);
19675
- this.parseInterfaces(structure);
19666
+ result.classes = this.parseClasses(structure);
19667
+ result.interfaces = this.parseInterfaces(structure);
19668
+ result.implementations = this.parseClassImplementations(structure);
19669
+ result.forms = this.parseForms(structure);
19670
+ return result;
19671
+ }
19672
+ parseClassImplementations(structure) {
19673
+ var _a;
19674
+ const implementations = [];
19676
19675
  for (const found of structure.findAllStructures(Structures.ClassImplementation)) {
19677
19676
  const methods = [];
19678
19677
  for (const method of found.findAllStructures(Structures.Method)) {
@@ -19682,24 +19681,30 @@ class ABAPFileInformation {
19682
19681
  }
19683
19682
  }
19684
19683
  const name = found.findFirstStatement(Statements.ClassImplementation).findFirstExpression(Expressions.ClassName).getFirstToken();
19685
- this.implementations.push({
19684
+ implementations.push({
19686
19685
  name: name.getStr(),
19687
19686
  identifier: new _identifier_1.Identifier(name, this.filename),
19688
19687
  methods,
19689
19688
  });
19690
19689
  }
19690
+ return implementations;
19691
+ }
19692
+ parseForms(structure) {
19693
+ const forms = [];
19691
19694
  for (const statement of structure.findAllStructures(Structures.Form)) {
19692
19695
  // FORMs can contain a dash in the name
19693
19696
  const pos = statement.findFirstExpression(Expressions.FormName).getFirstToken().getStart();
19694
19697
  const name = statement.findFirstExpression(Expressions.FormName).concatTokens();
19695
19698
  const nameToken = new Tokens.Identifier(pos, name);
19696
- this.forms.push({
19699
+ forms.push({
19697
19700
  name: nameToken.getStr(),
19698
19701
  identifier: new _identifier_1.Identifier(nameToken, this.filename),
19699
19702
  });
19700
19703
  }
19704
+ return forms;
19701
19705
  }
19702
19706
  parseInterfaces(structure) {
19707
+ const interfaces = [];
19703
19708
  for (const found of structure.findDirectStructures(Structures.Interface)) {
19704
19709
  const i = found.findFirstStatement(Statements.Interface);
19705
19710
  if (i === undefined) {
@@ -19711,7 +19716,7 @@ class ABAPFileInformation {
19711
19716
  const aliases = this.parseAliases(found, visibility_1.Visibility.Public);
19712
19717
  const constants = this.parseConstants(found, visibility_1.Visibility.Public);
19713
19718
  const g = i.findDirectExpression(Expressions.ClassGlobal);
19714
- this.interfaces.push({
19719
+ interfaces.push({
19715
19720
  name: interfaceName.getStr(),
19716
19721
  identifier: new _identifier_1.Identifier(interfaceName, this.filename),
19717
19722
  isLocal: g === undefined,
@@ -19723,9 +19728,11 @@ class ABAPFileInformation {
19723
19728
  attributes,
19724
19729
  });
19725
19730
  }
19731
+ return interfaces;
19726
19732
  }
19727
19733
  parseClasses(structure) {
19728
19734
  var _a;
19735
+ const classes = [];
19729
19736
  for (const found of structure.findAllStructures(Structures.ClassDefinition)) {
19730
19737
  const className = found.findFirstStatement(Statements.ClassDefinition).findFirstExpression(Expressions.ClassName).getFirstToken();
19731
19738
  const methods = this.parseMethodDefinition(found.findFirstStructure(Structures.PublicSection), visibility_1.Visibility.Public);
@@ -19764,7 +19771,7 @@ class ABAPFileInformation {
19764
19771
  else if (concat.includes("DURATION MEDIUM")) {
19765
19772
  duration = _abap_file_information_1.Duration.medium;
19766
19773
  }
19767
- this.classes.push({
19774
+ classes.push({
19768
19775
  name: className.getStr(),
19769
19776
  identifier: new _identifier_1.Identifier(className, this.filename),
19770
19777
  isLocal: containsGlobal === undefined,
@@ -19783,6 +19790,7 @@ class ABAPFileInformation {
19783
19790
  constants,
19784
19791
  });
19785
19792
  }
19793
+ return classes;
19786
19794
  }
19787
19795
  ///////////////////
19788
19796
  getImplementing(input) {
@@ -19981,8 +19989,8 @@ class ABAPFileInformation {
19981
19989
  return ret;
19982
19990
  }
19983
19991
  }
19984
- exports.ABAPFileInformation = ABAPFileInformation;
19985
- //# sourceMappingURL=abap_file_information.js.map
19992
+ exports.ABAPFileInformationParser = ABAPFileInformationParser;
19993
+ //# sourceMappingURL=abap_file_information_parser.js.map
19986
19994
 
19987
19995
  /***/ }),
19988
19996
 
@@ -26953,7 +26961,7 @@ const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modu
26953
26961
  const isSimple = /^\w+$/;
26954
26962
  class Select {
26955
26963
  static runSyntax(node, input, skipImplicitInto = false) {
26956
- var _a, _b;
26964
+ var _a;
26957
26965
  const token = node.getFirstToken();
26958
26966
  let from = node.findDirectExpression(Expressions.SQLFrom);
26959
26967
  if (from === undefined) {
@@ -26974,10 +26982,8 @@ class Select {
26974
26982
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
26975
26983
  return;
26976
26984
  }
26977
- const isSingle = ((_a = node.getChildren()[1]) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase()) === "SINGLE"
26978
- || node.get() instanceof Expressions.SelectLoop;
26979
26985
  this.checkFields(fields, dbSources, input, node);
26980
- this.handleInto(node, input, fields, dbSources, isSingle);
26986
+ const intoExpression = this.handleInto(node, input, fields, dbSources);
26981
26987
  const fae = node.findDirectExpression(Expressions.SQLForAllEntries);
26982
26988
  if (fae) {
26983
26989
  input.scope.push(_scope_type_1.ScopeType.OpenSQL, "SELECT", token.getStart(), input.filename);
@@ -26991,7 +26997,7 @@ class Select {
26991
26997
  && node.findDirectExpression(Expressions.SQLIntoTable) === undefined
26992
26998
  && node.findDirectExpression(Expressions.SQLIntoList) === undefined
26993
26999
  && node.findDirectExpression(Expressions.SQLIntoStructure) === undefined) {
26994
- const fields = (_b = node.findFirstExpression(Expressions.SQLAggregation)) === null || _b === void 0 ? void 0 : _b.concatTokens();
27000
+ const fields = (_a = node.findFirstExpression(Expressions.SQLAggregation)) === null || _a === void 0 ? void 0 : _a.concatTokens();
26995
27001
  const c = new RegExp(/^count\(\s*\*\s*\)$/, "i");
26996
27002
  if (fields === undefined || c.test(fields) === false) {
26997
27003
  const nameToken = from === null || from === void 0 ? void 0 : from.findDirectExpression(Expressions.SQLFromSource);
@@ -27025,8 +27031,18 @@ class Select {
27025
27031
  for (const s of node.findAllExpressions(Expressions.SQLCompare)) {
27026
27032
  sql_compare_1.SQLCompare.runSyntax(s, input, dbSources);
27027
27033
  }
27028
- for (const s of node.findDirectExpressions(Expressions.SQLOrderBy)) {
27029
- sql_order_by_1.SQLOrderBy.runSyntax(s, input);
27034
+ const orderBy = node.findDirectExpression(Expressions.SQLOrderBy);
27035
+ if (orderBy) {
27036
+ sql_order_by_1.SQLOrderBy.runSyntax(orderBy, input);
27037
+ const where = node.findDirectExpression(Expressions.SQLCond);
27038
+ if (intoExpression
27039
+ && where
27040
+ && intoExpression.getFirstToken().getStart().isBefore(orderBy.getFirstToken().getStart())
27041
+ && where.getFirstToken().getStart().isBefore(orderBy.getFirstToken().getStart())
27042
+ && where.getFirstToken().getStart().isBefore(intoExpression.getFirstToken().getStart())) {
27043
+ const message = `ORDER BY must be before INTO, after WHERE`;
27044
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, orderBy.getFirstToken(), message));
27045
+ }
27030
27046
  }
27031
27047
  if (this.isStrictMode(node)) {
27032
27048
  this.strictModeChecks(node, input);
@@ -27077,13 +27093,14 @@ class Select {
27077
27093
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
27078
27094
  }
27079
27095
  }
27080
- static handleInto(node, input, fields, dbSources, _isSingle) {
27096
+ static handleInto(node, input, fields, dbSources) {
27081
27097
  const intoTable = node.findDirectExpression(Expressions.SQLIntoTable);
27082
27098
  if (intoTable) {
27083
27099
  const inline = intoTable.findFirstExpression(Expressions.InlineData);
27084
27100
  if (inline) {
27085
27101
  inline_data_1.InlineData.runSyntax(inline, input, this.buildTableType(fields, dbSources, input.scope));
27086
27102
  }
27103
+ return intoTable;
27087
27104
  }
27088
27105
  const intoStructure = node.findDirectExpression(Expressions.SQLIntoStructure);
27089
27106
  if (intoStructure) {
@@ -27097,6 +27114,7 @@ class Select {
27097
27114
  inline_data_1.InlineData.runSyntax(inline, input, basic_1.VoidType.get("SELECT_todo1"));
27098
27115
  }
27099
27116
  }
27117
+ return intoStructure;
27100
27118
  }
27101
27119
  const intoList = node.findDirectExpression(Expressions.SQLIntoList);
27102
27120
  if (intoList) {
@@ -27136,7 +27154,9 @@ class Select {
27136
27154
  inline_data_1.InlineData.runSyntax(inline, input, type);
27137
27155
  }
27138
27156
  }
27157
+ return intoList;
27139
27158
  }
27159
+ return undefined;
27140
27160
  }
27141
27161
  static checkFields(fields, dbSources, input, node) {
27142
27162
  if (dbSources.length > 1) {
@@ -28029,7 +28049,9 @@ class StringTemplate {
28029
28049
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
28030
28050
  return basic_1.VoidType.get(_syntax_input_1.CheckSyntaxKey);
28031
28051
  }
28032
- else if ((typeUtils.isCharLike(type) === false && typeUtils.isHexLike(type) === false)
28052
+ else if ((typeUtils.isCharLike(type) === false
28053
+ && typeUtils.isHexLike(type) === false
28054
+ && !(type instanceof basic_1.UTCLongType))
28033
28055
  || type instanceof basic_1.StructureType) {
28034
28056
  const message = "String template, not character like, " + type.constructor.name;
28035
28057
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
@@ -29117,9 +29139,10 @@ class Append {
29117
29139
  if (source) {
29118
29140
  if (targetType !== undefined
29119
29141
  && !(targetType instanceof basic_1.TableType)
29142
+ && !(targetType instanceof basic_1.UnknownType)
29120
29143
  && dataTarget !== target
29121
29144
  && !(targetType instanceof basic_1.VoidType)) {
29122
- const message = "Append, target not a table type";
29145
+ const message = `Append, target not a table type (${targetType.constructor.name})`;
29123
29146
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
29124
29147
  return;
29125
29148
  }
@@ -35544,12 +35567,12 @@ class ABAPFile extends _abstract_file_1.AbstractFile {
35544
35567
  getRaw() {
35545
35568
  return this.file.getRaw();
35546
35569
  }
35547
- getInfo() {
35548
- return this.info;
35549
- }
35550
35570
  getRawRows() {
35551
35571
  return this.file.getRawRows();
35552
35572
  }
35573
+ getInfo() {
35574
+ return this.info;
35575
+ }
35553
35576
  getStructure() {
35554
35577
  return this.structure;
35555
35578
  }
@@ -35586,12 +35609,13 @@ exports.ABAPFile = ABAPFile;
35586
35609
 
35587
35610
  Object.defineProperty(exports, "__esModule", ({ value: true }));
35588
35611
  exports.ABAPParser = void 0;
35589
- const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
35612
+ const abap_file_1 = __webpack_require__(/*! ./abap_file */ "./node_modules/@abaplint/core/build/src/abap/abap_file.js");
35613
+ const abap_file_information_1 = __webpack_require__(/*! ./4_file_information/abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information.js");
35614
+ const abap_file_information_parser_1 = __webpack_require__(/*! ./4_file_information/abap_file_information_parser */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information_parser.js");
35590
35615
  const lexer_1 = __webpack_require__(/*! ./1_lexer/lexer */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/lexer.js");
35591
35616
  const statement_parser_1 = __webpack_require__(/*! ./2_statements/statement_parser */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statement_parser.js");
35592
35617
  const structure_parser_1 = __webpack_require__(/*! ./3_structures/structure_parser */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structure_parser.js");
35593
- const abap_file_information_1 = __webpack_require__(/*! ./4_file_information/abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information.js");
35594
- const abap_file_1 = __webpack_require__(/*! ./abap_file */ "./node_modules/@abaplint/core/build/src/abap/abap_file.js");
35618
+ const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
35595
35619
  class ABAPParser {
35596
35620
  constructor(version, globalMacros, reg) {
35597
35621
  this.version = version ? version : version_1.defaultVersion;
@@ -35616,7 +35640,9 @@ class ABAPParser {
35616
35640
  for (const f of statementResult) {
35617
35641
  const result = structure_parser_1.StructureParser.run(f);
35618
35642
  // 4: file information
35619
- const info = new abap_file_information_1.ABAPFileInformation(result.node, f.file.getFilename());
35643
+ const parser = new abap_file_information_parser_1.ABAPFileInformationParser(f.file.getFilename());
35644
+ const parsed = parser.parse(result.node);
35645
+ const info = new abap_file_information_1.ABAPFileInformation(parsed);
35620
35646
  output.push(new abap_file_1.ABAPFile(f.file, f.tokens, f.statements, result.node, info));
35621
35647
  issues.push(...result.issues);
35622
35648
  }
@@ -40084,7 +40110,12 @@ class CDSLexer {
40084
40110
  // string handling
40085
40111
  if (mode === Mode.String) {
40086
40112
  build += next;
40087
- if (next === "'") {
40113
+ if (next === "'" && nextNext === "'") {
40114
+ // escaped single quote, continue string
40115
+ build += stream.takeNext();
40116
+ col++;
40117
+ }
40118
+ else if (next === "'") {
40088
40119
  build = result.add(build, row, col, mode);
40089
40120
  mode = Mode.Default;
40090
40121
  }
@@ -41135,7 +41166,7 @@ class CDSString extends combi_1.Expression {
41135
41166
  getRunnable() {
41136
41167
  const abap = (0, combi_1.seq)("abap", ".", (0, combi_1.regex)(/^char'\w'$/));
41137
41168
  // https://stackoverflow.com/a/57754227
41138
- const reg = (0, combi_1.regex)(/^'[A-Za-zÀ-ž\u0370-\u03FF\u0400-\u04FF:\| -_]*'$/);
41169
+ const reg = (0, combi_1.regex)(/^'([A-Za-zÀ-ž\u0370-\u03FF\u0400-\u04FF:\| -_]|'')*'$/);
41139
41170
  return (0, combi_1.altPrio)(reg, abap);
41140
41171
  }
41141
41172
  }
@@ -45262,6 +45293,7 @@ class ABAPObject extends _abstract_object_1.AbstractObject {
45262
45293
  setDirty() {
45263
45294
  this.syntaxResult = undefined;
45264
45295
  this.texts = undefined;
45296
+ this.parsed = [];
45265
45297
  super.setDirty();
45266
45298
  }
45267
45299
  getABAPFiles() {
@@ -45356,6 +45388,7 @@ class AbstractObject {
45356
45388
  return this.name;
45357
45389
  }
45358
45390
  setDirty() {
45391
+ this.old = [];
45359
45392
  this.dirty = true;
45360
45393
  }
45361
45394
  addFile(file) {
@@ -47803,6 +47836,37 @@ exports.EcattTestScript = EcattTestScript;
47803
47836
 
47804
47837
  /***/ }),
47805
47838
 
47839
+ /***/ "./node_modules/@abaplint/core/build/src/objects/email_template.js":
47840
+ /*!*************************************************************************!*\
47841
+ !*** ./node_modules/@abaplint/core/build/src/objects/email_template.js ***!
47842
+ \*************************************************************************/
47843
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
47844
+
47845
+ "use strict";
47846
+
47847
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
47848
+ exports.EmailTemplate = void 0;
47849
+ const _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ "./node_modules/@abaplint/core/build/src/objects/_abstract_object.js");
47850
+ class EmailTemplate extends _abstract_object_1.AbstractObject {
47851
+ getType() {
47852
+ return "SMTG";
47853
+ }
47854
+ getAllowedNaming() {
47855
+ return {
47856
+ maxLength: 60, // todo
47857
+ allowNamespace: true,
47858
+ };
47859
+ }
47860
+ getDescription() {
47861
+ // todo
47862
+ return undefined;
47863
+ }
47864
+ }
47865
+ exports.EmailTemplate = EmailTemplate;
47866
+ //# sourceMappingURL=email_template.js.map
47867
+
47868
+ /***/ }),
47869
+
47806
47870
  /***/ "./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js":
47807
47871
  /*!*************************************************************************************!*\
47808
47872
  !*** ./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js ***!
@@ -48236,6 +48300,8 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
48236
48300
  super.setDirty();
48237
48301
  this.includes = undefined;
48238
48302
  this.modules = undefined;
48303
+ this.description = undefined;
48304
+ this.dynpros = undefined;
48239
48305
  }
48240
48306
  getAllowedNaming() {
48241
48307
  return {
@@ -49092,7 +49158,6 @@ __exportStar(__webpack_require__(/*! ./behavior_definition */ "./node_modules/@a
49092
49158
  __exportStar(__webpack_require__(/*! ./brf_plus_system_application */ "./node_modules/@abaplint/core/build/src/objects/brf_plus_system_application.js"), exports);
49093
49159
  __exportStar(__webpack_require__(/*! ./bsp_application */ "./node_modules/@abaplint/core/build/src/objects/bsp_application.js"), exports);
49094
49160
  __exportStar(__webpack_require__(/*! ./business_add_in_implementation */ "./node_modules/@abaplint/core/build/src/objects/business_add_in_implementation.js"), exports);
49095
- __exportStar(__webpack_require__(/*! ./cds_entity_buffer */ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js"), exports);
49096
49161
  __exportStar(__webpack_require__(/*! ./business_catalog_app_assignment */ "./node_modules/@abaplint/core/build/src/objects/business_catalog_app_assignment.js"), exports);
49097
49162
  __exportStar(__webpack_require__(/*! ./business_catalog */ "./node_modules/@abaplint/core/build/src/objects/business_catalog.js"), exports);
49098
49163
  __exportStar(__webpack_require__(/*! ./business_configuration_maintenance_object */ "./node_modules/@abaplint/core/build/src/objects/business_configuration_maintenance_object.js"), exports);
@@ -49101,6 +49166,7 @@ __exportStar(__webpack_require__(/*! ./business_function_assignment */ "./node_m
49101
49166
  __exportStar(__webpack_require__(/*! ./business_function_set_assignment */ "./node_modules/@abaplint/core/build/src/objects/business_function_set_assignment.js"), exports);
49102
49167
  __exportStar(__webpack_require__(/*! ./business_object_model */ "./node_modules/@abaplint/core/build/src/objects/business_object_model.js"), exports);
49103
49168
  __exportStar(__webpack_require__(/*! ./business_object_type */ "./node_modules/@abaplint/core/build/src/objects/business_object_type.js"), exports);
49169
+ __exportStar(__webpack_require__(/*! ./cds_entity_buffer */ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js"), exports);
49104
49170
  __exportStar(__webpack_require__(/*! ./cds_metadata_extension */ "./node_modules/@abaplint/core/build/src/objects/cds_metadata_extension.js"), exports);
49105
49171
  __exportStar(__webpack_require__(/*! ./cds_type */ "./node_modules/@abaplint/core/build/src/objects/cds_type.js"), exports);
49106
49172
  __exportStar(__webpack_require__(/*! ./change_document */ "./node_modules/@abaplint/core/build/src/objects/change_document.js"), exports);
@@ -49126,6 +49192,7 @@ __exportStar(__webpack_require__(/*! ./domain */ "./node_modules/@abaplint/core/
49126
49192
  __exportStar(__webpack_require__(/*! ./ecatt_test_configuration */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_configuration.js"), exports);
49127
49193
  __exportStar(__webpack_require__(/*! ./ecatt_test_data_container */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_data_container.js"), exports);
49128
49194
  __exportStar(__webpack_require__(/*! ./ecatt_test_script */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_script.js"), exports);
49195
+ __exportStar(__webpack_require__(/*! ./email_template */ "./node_modules/@abaplint/core/build/src/objects/email_template.js"), exports);
49129
49196
  __exportStar(__webpack_require__(/*! ./enhancement_implementation */ "./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js"), exports);
49130
49197
  __exportStar(__webpack_require__(/*! ./enhancement_spot */ "./node_modules/@abaplint/core/build/src/objects/enhancement_spot.js"), exports);
49131
49198
  __exportStar(__webpack_require__(/*! ./entity_type */ "./node_modules/@abaplint/core/build/src/objects/entity_type.js"), exports);
@@ -49441,6 +49508,7 @@ class LockObject extends _abstract_object_1.AbstractObject {
49441
49508
  getAllowedNaming() {
49442
49509
  return {
49443
49510
  maxLength: 16,
49511
+ customRegex: /^(\/[A-Z_\d]{3,8}\/)?E[A-Z0-9_]+$/i,
49444
49512
  allowNamespace: true,
49445
49513
  };
49446
49514
  }
@@ -52181,6 +52249,13 @@ class Table extends _abstract_object_1.AbstractObject {
52181
52249
  }
52182
52250
  return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.description;
52183
52251
  }
52252
+ getSecondaryIndexes() {
52253
+ var _a;
52254
+ if (this.parsedData === undefined) {
52255
+ this.parseXML();
52256
+ }
52257
+ return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.secondaryIndexes;
52258
+ }
52184
52259
  getAllowedNaming() {
52185
52260
  let length = 30;
52186
52261
  const regex = /^((\/[A-Z_\d]{3,8}\/)|[a-zA-Z0-9]{3}|CI_)\w+$/;
@@ -52408,7 +52483,7 @@ class Table extends _abstract_object_1.AbstractObject {
52408
52483
  }
52409
52484
  ///////////////
52410
52485
  parseXML() {
52411
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
52486
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
52412
52487
  const parsed = super.parseRaw2();
52413
52488
  if (parsed === undefined) {
52414
52489
  return;
@@ -52447,6 +52522,25 @@ class Table extends _abstract_object_1.AbstractObject {
52447
52522
  DDTEXT: field.DDTEXT,
52448
52523
  });
52449
52524
  }
52525
+ // secondary indexes
52526
+ const indexes = (_m = parsed.abapGit["asx:abap"]["asx:values"]) === null || _m === void 0 ? void 0 : _m.DD12V;
52527
+ ;
52528
+ this.parsedData.secondaryIndexes = [];
52529
+ for (const index of (0, xml_utils_1.xmlToArray)(indexes === null || indexes === void 0 ? void 0 : indexes.DD12V)) {
52530
+ const indexName = index.INDEXNAME;
52531
+ const indexFields = [];
52532
+ const indexFieldsXml = (_o = parsed.abapGit["asx:abap"]["asx:values"]) === null || _o === void 0 ? void 0 : _o.DD17V;
52533
+ for (const indexField of (0, xml_utils_1.xmlToArray)(indexFieldsXml === null || indexFieldsXml === void 0 ? void 0 : indexFieldsXml.DD17V)) {
52534
+ if (indexField.INDEXNAME === indexName) {
52535
+ // assumption: fields are listed by POSITION in the xml
52536
+ indexFields.push(indexField.FIELDNAME);
52537
+ }
52538
+ }
52539
+ this.parsedData.secondaryIndexes.push({
52540
+ name: indexName,
52541
+ fields: indexFields,
52542
+ });
52543
+ }
52450
52544
  }
52451
52545
  }
52452
52546
  exports.Table = Table;
@@ -53804,7 +53898,7 @@ class Registry {
53804
53898
  }
53805
53899
  static abaplintVersion() {
53806
53900
  // magic, see build script "version.sh"
53807
- return "2.113.246";
53901
+ return "2.114.5";
53808
53902
  }
53809
53903
  getDDICReferences() {
53810
53904
  return this.ddicReferences;
@@ -55265,14 +55359,14 @@ class AllowedObjectNaming {
55265
55359
  const name = obj.getName();
55266
55360
  let message = "";
55267
55361
  if (name.length > allowed.maxLength) {
55268
- message = "Name exceeds max length";
55362
+ message = "Name exceeds max length, allowed is " + allowed.maxLength;
55269
55363
  }
55270
55364
  else if (allowed.allowNamespace === false && name.indexOf("/") >= 0) {
55271
55365
  message = "Namespace not allowed for object type";
55272
55366
  }
55273
55367
  else if (allowed.customRegex !== undefined) {
55274
55368
  if (name.match(allowed.customRegex) === null) {
55275
- message = "Name not allowed";
55369
+ message = "Name not allowed, expected to match " + allowed.customRegex.toString();
55276
55370
  }
55277
55371
  }
55278
55372
  else if (name.match(NAME_REGEX) === null) {
@@ -55877,7 +55971,7 @@ ENDTRY.`,
55877
55971
  for (const statNode of file.getStatements()) {
55878
55972
  const statement = statNode.get();
55879
55973
  if (statement instanceof Statements.CallTransaction && !statNode.concatTokensWithoutStringsAndComments().toUpperCase().includes("WITH AUTHORITY-CHECK")) {
55880
- issues.push(issue_1.Issue.atStatement(file, statNode, this.getMessage(), this.getMetadata().key));
55974
+ issues.push(issue_1.Issue.atStatement(file, statNode, this.getMessage(), this.getMetadata().key, this.getConfig().severity));
55881
55975
  }
55882
55976
  }
55883
55977
  return issues;
@@ -56058,7 +56152,7 @@ class CDSParserError {
56058
56152
  title: "CDS Parser Error",
56059
56153
  shortDescription: `CDS parsing`,
56060
56154
  extendedInformation: `Parses CDS and issues parser errors`,
56061
- tags: [_irule_1.RuleTag.Syntax],
56155
+ tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.SingleFile],
56062
56156
  };
56063
56157
  }
56064
56158
  getConfig() {
@@ -56717,6 +56811,10 @@ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/c
56717
56811
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
56718
56812
  const severity_1 = __webpack_require__(/*! ../severity */ "./node_modules/@abaplint/core/build/src/severity.js");
56719
56813
  class CheckIncludeConf extends _basic_rule_config_1.BasicRuleConfig {
56814
+ constructor() {
56815
+ super(...arguments);
56816
+ this.allowUnused = false;
56817
+ }
56720
56818
  }
56721
56819
  exports.CheckIncludeConf = CheckIncludeConf;
56722
56820
  class CheckInclude {
@@ -56744,7 +56842,7 @@ class CheckInclude {
56744
56842
  }
56745
56843
  initialize(reg) {
56746
56844
  this.reg = reg;
56747
- this.graph = new include_graph_1.IncludeGraph(this.reg, this.getConfig().severity || severity_1.Severity.Error);
56845
+ this.graph = new include_graph_1.IncludeGraph(this.reg, this.getConfig().severity || severity_1.Severity.Error, this.getConfig().allowUnused || false);
56748
56846
  return this;
56749
56847
  }
56750
56848
  run(obj) {
@@ -64710,8 +64808,7 @@ https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selectio
64710
64808
  tags: [_irule_1.RuleTag.SingleFile],
64711
64809
  badExample: `REPORT zfoo.
64712
64810
  WRITE 'hello'.`,
64713
- goodExample: `
64714
- START-OF-SELECTION.
64811
+ goodExample: `START-OF-SELECTION.
64715
64812
  WRITE 'hello'.`,
64716
64813
  };
64717
64814
  }
@@ -65164,6 +65261,7 @@ __exportStar(__webpack_require__(/*! ./implement_methods */ "./node_modules/@aba
65164
65261
  __exportStar(__webpack_require__(/*! ./implicit_start_of_selection */ "./node_modules/@abaplint/core/build/src/rules/implicit_start_of_selection.js"), exports);
65165
65262
  __exportStar(__webpack_require__(/*! ./in_statement_indentation */ "./node_modules/@abaplint/core/build/src/rules/in_statement_indentation.js"), exports);
65166
65263
  __exportStar(__webpack_require__(/*! ./indentation */ "./node_modules/@abaplint/core/build/src/rules/indentation.js"), exports);
65264
+ __exportStar(__webpack_require__(/*! ./index_completely_contained */ "./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js"), exports);
65167
65265
  __exportStar(__webpack_require__(/*! ./inline_data_old_versions */ "./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js"), exports);
65168
65266
  __exportStar(__webpack_require__(/*! ./intf_referencing_clas */ "./node_modules/@abaplint/core/build/src/rules/intf_referencing_clas.js"), exports);
65169
65267
  __exportStar(__webpack_require__(/*! ./invalid_table_index */ "./node_modules/@abaplint/core/build/src/rules/invalid_table_index.js"), exports);
@@ -65270,6 +65368,83 @@ __exportStar(__webpack_require__(/*! ./xml_consistency */ "./node_modules/@abapl
65270
65368
 
65271
65369
  /***/ }),
65272
65370
 
65371
+ /***/ "./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js":
65372
+ /*!***********************************************************************************!*\
65373
+ !*** ./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js ***!
65374
+ \***********************************************************************************/
65375
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
65376
+
65377
+ "use strict";
65378
+
65379
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
65380
+ exports.IndexCompletelyContained = exports.IndexCompletelyContainedConf = void 0;
65381
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
65382
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
65383
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
65384
+ const position_1 = __webpack_require__(/*! ../position */ "./node_modules/@abaplint/core/build/src/position.js");
65385
+ const Objects = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
65386
+ class IndexCompletelyContainedConf extends _basic_rule_config_1.BasicRuleConfig {
65387
+ }
65388
+ exports.IndexCompletelyContainedConf = IndexCompletelyContainedConf;
65389
+ class IndexCompletelyContained {
65390
+ constructor() {
65391
+ this.conf = new IndexCompletelyContainedConf();
65392
+ }
65393
+ getMetadata() {
65394
+ return {
65395
+ key: "index_completely_contained",
65396
+ title: "Check if database table indexes are completely contained",
65397
+ shortDescription: `If indexes are completely contained in other indexes, they can be removed to improve performance.`,
65398
+ tags: [_irule_1.RuleTag.Performance, _irule_1.RuleTag.SingleFile],
65399
+ };
65400
+ }
65401
+ initialize() {
65402
+ return this;
65403
+ }
65404
+ getConfig() {
65405
+ return this.conf;
65406
+ }
65407
+ setConfig(conf) {
65408
+ this.conf = conf;
65409
+ }
65410
+ run(obj) {
65411
+ if (!(obj instanceof Objects.Table)) {
65412
+ return [];
65413
+ }
65414
+ const indexes = obj.getSecondaryIndexes();
65415
+ if (indexes === undefined || indexes.length === 0) {
65416
+ return [];
65417
+ }
65418
+ const issues = [];
65419
+ for (let i = 0; i < indexes.length; i++) {
65420
+ const indexA = indexes[i];
65421
+ for (let j = 0; j < indexes.length; j++) {
65422
+ if (i === j) {
65423
+ continue;
65424
+ }
65425
+ const indexB = indexes[j];
65426
+ let contained = true;
65427
+ for (const field of indexA.fields) {
65428
+ if (indexB.fields.indexOf(field) === -1) {
65429
+ contained = false;
65430
+ break;
65431
+ }
65432
+ }
65433
+ if (contained) {
65434
+ const position = new position_1.Position(1, 1);
65435
+ const message = `Index "${indexA.name}" is completely contained in index "${indexB.name}"`;
65436
+ issues.push(issue_1.Issue.atPosition(obj.getFiles()[0], position, message, this.getMetadata().key, this.conf.severity));
65437
+ }
65438
+ }
65439
+ }
65440
+ return issues;
65441
+ }
65442
+ }
65443
+ exports.IndexCompletelyContained = IndexCompletelyContained;
65444
+ //# sourceMappingURL=index_completely_contained.js.map
65445
+
65446
+ /***/ }),
65447
+
65273
65448
  /***/ "./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js":
65274
65449
  /*!*********************************************************************************!*\
65275
65450
  !*** ./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js ***!
@@ -77442,11 +77617,12 @@ class Graph {
77442
77617
  }
77443
77618
  }
77444
77619
  class IncludeGraph {
77445
- constructor(reg, severity = severity_1.Severity.Error) {
77620
+ constructor(reg, severity = severity_1.Severity.Error, allowUnused = false) {
77446
77621
  this.reg = reg;
77447
77622
  this.issues = [];
77448
77623
  this.graph = new Graph();
77449
77624
  this.severity = severity;
77625
+ this.allowUnused = allowUnused;
77450
77626
  this.build();
77451
77627
  }
77452
77628
  listMainForInclude(filename) {
@@ -77470,6 +77646,7 @@ class IncludeGraph {
77470
77646
  }
77471
77647
  const v = this.graph.findVertexByFilename(file.getFilename());
77472
77648
  if (v !== undefined
77649
+ && this.allowUnused === false
77473
77650
  && v.include === true
77474
77651
  && this.listMainForInclude(v.filename).length === 0) {
77475
77652
  const f = this.reg.getFileByName(v.filename);
@@ -83053,27 +83230,28 @@ exports.HandleDataElement = HandleDataElement;
83053
83230
  Object.defineProperty(exports, "__esModule", ({ value: true }));
83054
83231
  exports.HandleEnqu = void 0;
83055
83232
  const chunk_1 = __webpack_require__(/*! ../chunk */ "./node_modules/@abaplint/transpiler/build/src/chunk.js");
83056
- // view, much like the tables
83057
83233
  class HandleEnqu {
83058
83234
  runObject(obj, _reg) {
83059
83235
  const filename = obj.getXMLFile()?.getFilename().replace(".xml", ".mjs").toLowerCase();
83060
83236
  if (filename === undefined) {
83061
83237
  return [];
83062
83238
  }
83239
+ const tableName = obj.getPrimaryTable();
83063
83240
  const chunk = new chunk_1.Chunk().appendString(`// enqueue object
83064
83241
  abap.FunctionModules["ENQUEUE_${obj.getName().toUpperCase()}"] = async (INPUT) => {
83065
83242
  const lookup = abap.Classes["KERNEL_LOCK"];
83066
83243
  if (lookup === undefined) {
83067
83244
  throw new Error("Lock, kernel class missing");
83068
83245
  }
83069
- await lookup.enqueue(INPUT);
83246
+ await lookup.enqueue({TABLE_NAME: "${tableName}", ENQUEUE_NAME: "${obj.getName().toUpperCase()}", ...INPUT});
83070
83247
  };
83248
+
83071
83249
  abap.FunctionModules["DEQUEUE_${obj.getName().toUpperCase()}"] = async (INPUT) => {
83072
83250
  const lookup = abap.Classes["KERNEL_LOCK"];
83073
83251
  if (lookup === undefined) {
83074
83252
  throw new Error("Lock, kernel class missing");
83075
83253
  }
83076
- await lookup.dequeue(INPUT);
83254
+ await lookup.dequeue({TABLE_NAME: "${tableName}", ENQUEUE_NAME: "${obj.getName().toUpperCase()}", ...INPUT});
83077
83255
  };`);
83078
83256
  const output = {
83079
83257
  object: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/transpiler-cli",
3
- "version": "2.12.12",
3
+ "version": "2.12.14",
4
4
  "description": "Transpiler - Command Line Interface",
5
5
  "funding": "https://github.com/sponsors/larshp",
6
6
  "bin": {
@@ -27,8 +27,8 @@
27
27
  "author": "abaplint",
28
28
  "license": "MIT",
29
29
  "devDependencies": {
30
- "@abaplint/core": "^2.113.246",
31
- "@abaplint/transpiler": "^2.12.12",
30
+ "@abaplint/core": "^2.114.5",
31
+ "@abaplint/transpiler": "^2.12.14",
32
32
  "@types/glob": "^8.1.0",
33
33
  "@types/node": "^24.10.1",
34
34
  "@types/progress": "^2.0.7",
package/schema.json DELETED
@@ -1,219 +0,0 @@
1
- {
2
- "$ref": "#/definitions/ITranspilerConfig",
3
- "$schema": "http://json-schema.org/draft-07/schema#",
4
- "definitions": {
5
- "ITranspilerConfig": {
6
- "additionalProperties": false,
7
- "properties": {
8
- "exclude_filter": {
9
- "description": "list of regex, case insensitive",
10
- "items": {
11
- "type": "string"
12
- },
13
- "type": "array",
14
- "uniqueItems": true
15
- },
16
- "input_filter": {
17
- "description": "list of regex, case insensitive, empty gives all files, positive list",
18
- "items": {
19
- "type": "string"
20
- },
21
- "type": "array",
22
- "uniqueItems": true
23
- },
24
- "input_folder": {
25
- "anyOf": [
26
- {
27
- "type": "string"
28
- },
29
- {
30
- "items": {
31
- "type": "string"
32
- },
33
- "type": "array"
34
- }
35
- ]
36
- },
37
- "libs": {
38
- "items": {
39
- "additionalProperties": false,
40
- "properties": {
41
- "exclude_filter": {
42
- "description": "list of regex, case insensitive",
43
- "items": {
44
- "type": "string"
45
- },
46
- "type": "array",
47
- "uniqueItems": true
48
- },
49
- "files": {
50
- "anyOf": [
51
- {
52
- "type": "string"
53
- },
54
- {
55
- "items": {
56
- "type": "string"
57
- },
58
- "type": "array"
59
- }
60
- ]
61
- },
62
- "folder": {
63
- "type": "string"
64
- },
65
- "url": {
66
- "type": "string"
67
- }
68
- },
69
- "type": "object"
70
- },
71
- "type": "array"
72
- },
73
- "options": {
74
- "$ref": "#/definitions/ITranspilerOptions"
75
- },
76
- "output_folder": {
77
- "type": "string"
78
- },
79
- "write_source_map": {
80
- "type": "boolean"
81
- },
82
- "write_unit_tests": {
83
- "type": "boolean"
84
- }
85
- },
86
- "required": [
87
- "input_folder",
88
- "output_folder",
89
- "options"
90
- ],
91
- "type": "object"
92
- },
93
- "ITranspilerOptions": {
94
- "additionalProperties": false,
95
- "properties": {
96
- "addCommonJS": {
97
- "description": "adds common js modules",
98
- "type": "boolean"
99
- },
100
- "addFilenames": {
101
- "description": "adds filenames as comments in the output js",
102
- "type": "boolean"
103
- },
104
- "ignoreSourceMap": {
105
- "description": "ignore source map",
106
- "type": "boolean"
107
- },
108
- "ignoreSyntaxCheck": {
109
- "description": "ignore syntax check, used for internal testing",
110
- "type": "boolean"
111
- },
112
- "importProg": {
113
- "description": "import programs",
114
- "type": "boolean"
115
- },
116
- "keywords": {
117
- "description": "list of keywords to rename, if not supplied default will be used",
118
- "items": {
119
- "type": "string"
120
- },
121
- "type": "array"
122
- },
123
- "populateTables": {
124
- "additionalProperties": false,
125
- "description": "populate tables, all tables are populated if undefined and they exist",
126
- "properties": {
127
- "reposrc": {
128
- "description": "insert into REPOSRC, skips if equals false",
129
- "type": "boolean"
130
- },
131
- "seosubco": {
132
- "description": "insert into SEOSUBCO, skips if equals false",
133
- "type": "boolean"
134
- },
135
- "seosubcodf": {
136
- "description": "insert into SEOSUBCODF, skips if equals false",
137
- "type": "boolean"
138
- },
139
- "seosubcotx": {
140
- "description": "insert into SEOSUBCOTX, skips if equals false",
141
- "type": "boolean"
142
- }
143
- },
144
- "type": "object"
145
- },
146
- "setup": {
147
- "additionalProperties": false,
148
- "description": "extra setup script to be executed during initialization",
149
- "properties": {
150
- "filename": {
151
- "type": "string"
152
- },
153
- "postFunction": {
154
- "type": "string"
155
- },
156
- "preFunction": {
157
- "type": "string"
158
- }
159
- },
160
- "required": [
161
- "filename"
162
- ],
163
- "type": "object"
164
- },
165
- "skip": {
166
- "$ref": "#/definitions/TestMethodList",
167
- "description": "list of unit tests to skip"
168
- },
169
- "skipVersionCheck": {
170
- "description": "skips version check, not recommended",
171
- "type": "boolean"
172
- },
173
- "unknownTypes": {
174
- "$ref": "#/definitions/UnknownTypesEnum",
175
- "description": "sets behavior for unknown types, either fail at compile- or run-time"
176
- }
177
- },
178
- "type": "object"
179
- },
180
- "TestMethodList": {
181
- "items": {
182
- "additionalProperties": false,
183
- "properties": {
184
- "class": {
185
- "pattern": "^[a-zA-Z0-9_\\/]+$",
186
- "type": "string"
187
- },
188
- "method": {
189
- "pattern": "^[a-zA-Z0-9_\\/]+$",
190
- "type": "string"
191
- },
192
- "note": {
193
- "type": "string"
194
- },
195
- "object": {
196
- "pattern": "^[a-zA-Z0-9_\\/]+$",
197
- "type": "string"
198
- }
199
- },
200
- "required": [
201
- "object",
202
- "class",
203
- "method"
204
- ],
205
- "type": "object"
206
- },
207
- "type": "array",
208
- "uniqueItems": true
209
- },
210
- "UnknownTypesEnum": {
211
- "enum": [
212
- "compileError",
213
- "runtimeError"
214
- ],
215
- "type": "string"
216
- }
217
- }
218
- }
219
-