@abaplint/cli 2.113.247 → 2.114.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/cli.js +245 -52
  2. package/package.json +2 -2
package/build/cli.js CHANGED
@@ -20677,33 +20677,21 @@ exports.Identifier = Identifier;
20677
20677
  /*!************************************************************************************************!*\
20678
20678
  !*** ./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information.js ***!
20679
20679
  \************************************************************************************************/
20680
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20680
+ /***/ ((__unused_webpack_module, exports) => {
20681
20681
 
20682
20682
  "use strict";
20683
20683
 
20684
20684
  Object.defineProperty(exports, "__esModule", ({ value: true }));
20685
20685
  exports.ABAPFileInformation = void 0;
20686
- const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
20687
- const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
20688
- const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
20689
- const _abap_file_information_1 = __webpack_require__(/*! ./_abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_abap_file_information.js");
20690
- const _identifier_1 = __webpack_require__(/*! ./_identifier */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js");
20691
- const Tokens = __webpack_require__(/*! ../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
20692
- const visibility_1 = __webpack_require__(/*! ./visibility */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js");
20693
20686
  class ABAPFileInformation {
20694
- constructor(structure, filename) {
20695
- this.forms = [];
20696
- this.implementations = [];
20697
- this.interfaces = [];
20698
- this.classes = [];
20699
- this.filename = filename;
20700
- this.parse(structure);
20687
+ constructor(parsed) {
20688
+ this.parsed = parsed;
20701
20689
  }
20702
20690
  listClassImplementations() {
20703
- return this.implementations;
20691
+ return this.parsed.implementations;
20704
20692
  }
20705
20693
  listInterfaceDefinitions() {
20706
- return this.interfaces;
20694
+ return this.parsed.interfaces;
20707
20695
  }
20708
20696
  getInterfaceDefinitionByName(name) {
20709
20697
  const upper = name.toUpperCase();
@@ -20715,7 +20703,7 @@ class ABAPFileInformation {
20715
20703
  return undefined;
20716
20704
  }
20717
20705
  listClassDefinitions() {
20718
- return this.classes;
20706
+ return this.parsed.classes;
20719
20707
  }
20720
20708
  getClassDefinitionByName(name) {
20721
20709
  const upper = name.toUpperCase();
@@ -20736,16 +20724,54 @@ class ABAPFileInformation {
20736
20724
  return undefined;
20737
20725
  }
20738
20726
  listFormDefinitions() {
20739
- return this.forms;
20727
+ return this.parsed.forms;
20728
+ }
20729
+ }
20730
+ exports.ABAPFileInformation = ABAPFileInformation;
20731
+ //# sourceMappingURL=abap_file_information.js.map
20732
+
20733
+ /***/ }),
20734
+
20735
+ /***/ "./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information_parser.js":
20736
+ /*!*******************************************************************************************************!*\
20737
+ !*** ./node_modules/@abaplint/core/build/src/abap/4_file_information/abap_file_information_parser.js ***!
20738
+ \*******************************************************************************************************/
20739
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
20740
+
20741
+ "use strict";
20742
+
20743
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
20744
+ exports.ABAPFileInformationParser = void 0;
20745
+ const Structures = __webpack_require__(/*! ../3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
20746
+ const Expressions = __webpack_require__(/*! ../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
20747
+ const Statements = __webpack_require__(/*! ../2_statements/statements */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/index.js");
20748
+ const _identifier_1 = __webpack_require__(/*! ./_identifier */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_identifier.js");
20749
+ const Tokens = __webpack_require__(/*! ../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
20750
+ const visibility_1 = __webpack_require__(/*! ./visibility */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js");
20751
+ const _abap_file_information_1 = __webpack_require__(/*! ./_abap_file_information */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/_abap_file_information.js");
20752
+ class ABAPFileInformationParser {
20753
+ constructor(filename) {
20754
+ this.filename = filename;
20740
20755
  }
20741
- ///////////////////////
20742
20756
  parse(structure) {
20743
- var _a;
20757
+ const result = {
20758
+ interfaces: [],
20759
+ classes: [],
20760
+ forms: [],
20761
+ implementations: [],
20762
+ };
20744
20763
  if (structure === undefined) {
20745
- return;
20764
+ return result;
20746
20765
  }
20747
- this.parseClasses(structure);
20748
- this.parseInterfaces(structure);
20766
+ result.classes = this.parseClasses(structure);
20767
+ result.interfaces = this.parseInterfaces(structure);
20768
+ result.implementations = this.parseClassImplementations(structure);
20769
+ result.forms = this.parseForms(structure);
20770
+ return result;
20771
+ }
20772
+ parseClassImplementations(structure) {
20773
+ var _a;
20774
+ const implementations = [];
20749
20775
  for (const found of structure.findAllStructures(Structures.ClassImplementation)) {
20750
20776
  const methods = [];
20751
20777
  for (const method of found.findAllStructures(Structures.Method)) {
@@ -20755,24 +20781,30 @@ class ABAPFileInformation {
20755
20781
  }
20756
20782
  }
20757
20783
  const name = found.findFirstStatement(Statements.ClassImplementation).findFirstExpression(Expressions.ClassName).getFirstToken();
20758
- this.implementations.push({
20784
+ implementations.push({
20759
20785
  name: name.getStr(),
20760
20786
  identifier: new _identifier_1.Identifier(name, this.filename),
20761
20787
  methods,
20762
20788
  });
20763
20789
  }
20790
+ return implementations;
20791
+ }
20792
+ parseForms(structure) {
20793
+ const forms = [];
20764
20794
  for (const statement of structure.findAllStructures(Structures.Form)) {
20765
20795
  // FORMs can contain a dash in the name
20766
20796
  const pos = statement.findFirstExpression(Expressions.FormName).getFirstToken().getStart();
20767
20797
  const name = statement.findFirstExpression(Expressions.FormName).concatTokens();
20768
20798
  const nameToken = new Tokens.Identifier(pos, name);
20769
- this.forms.push({
20799
+ forms.push({
20770
20800
  name: nameToken.getStr(),
20771
20801
  identifier: new _identifier_1.Identifier(nameToken, this.filename),
20772
20802
  });
20773
20803
  }
20804
+ return forms;
20774
20805
  }
20775
20806
  parseInterfaces(structure) {
20807
+ const interfaces = [];
20776
20808
  for (const found of structure.findDirectStructures(Structures.Interface)) {
20777
20809
  const i = found.findFirstStatement(Statements.Interface);
20778
20810
  if (i === undefined) {
@@ -20784,7 +20816,7 @@ class ABAPFileInformation {
20784
20816
  const aliases = this.parseAliases(found, visibility_1.Visibility.Public);
20785
20817
  const constants = this.parseConstants(found, visibility_1.Visibility.Public);
20786
20818
  const g = i.findDirectExpression(Expressions.ClassGlobal);
20787
- this.interfaces.push({
20819
+ interfaces.push({
20788
20820
  name: interfaceName.getStr(),
20789
20821
  identifier: new _identifier_1.Identifier(interfaceName, this.filename),
20790
20822
  isLocal: g === undefined,
@@ -20796,9 +20828,11 @@ class ABAPFileInformation {
20796
20828
  attributes,
20797
20829
  });
20798
20830
  }
20831
+ return interfaces;
20799
20832
  }
20800
20833
  parseClasses(structure) {
20801
20834
  var _a;
20835
+ const classes = [];
20802
20836
  for (const found of structure.findAllStructures(Structures.ClassDefinition)) {
20803
20837
  const className = found.findFirstStatement(Statements.ClassDefinition).findFirstExpression(Expressions.ClassName).getFirstToken();
20804
20838
  const methods = this.parseMethodDefinition(found.findFirstStructure(Structures.PublicSection), visibility_1.Visibility.Public);
@@ -20837,7 +20871,7 @@ class ABAPFileInformation {
20837
20871
  else if (concat.includes("DURATION MEDIUM")) {
20838
20872
  duration = _abap_file_information_1.Duration.medium;
20839
20873
  }
20840
- this.classes.push({
20874
+ classes.push({
20841
20875
  name: className.getStr(),
20842
20876
  identifier: new _identifier_1.Identifier(className, this.filename),
20843
20877
  isLocal: containsGlobal === undefined,
@@ -20856,6 +20890,7 @@ class ABAPFileInformation {
20856
20890
  constants,
20857
20891
  });
20858
20892
  }
20893
+ return classes;
20859
20894
  }
20860
20895
  ///////////////////
20861
20896
  getImplementing(input) {
@@ -21054,8 +21089,8 @@ class ABAPFileInformation {
21054
21089
  return ret;
21055
21090
  }
21056
21091
  }
21057
- exports.ABAPFileInformation = ABAPFileInformation;
21058
- //# sourceMappingURL=abap_file_information.js.map
21092
+ exports.ABAPFileInformationParser = ABAPFileInformationParser;
21093
+ //# sourceMappingURL=abap_file_information_parser.js.map
21059
21094
 
21060
21095
  /***/ }),
21061
21096
 
@@ -28026,7 +28061,7 @@ const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modu
28026
28061
  const isSimple = /^\w+$/;
28027
28062
  class Select {
28028
28063
  static runSyntax(node, input, skipImplicitInto = false) {
28029
- var _a, _b;
28064
+ var _a;
28030
28065
  const token = node.getFirstToken();
28031
28066
  let from = node.findDirectExpression(Expressions.SQLFrom);
28032
28067
  if (from === undefined) {
@@ -28047,10 +28082,8 @@ class Select {
28047
28082
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
28048
28083
  return;
28049
28084
  }
28050
- const isSingle = ((_a = node.getChildren()[1]) === null || _a === void 0 ? void 0 : _a.concatTokens().toUpperCase()) === "SINGLE"
28051
- || node.get() instanceof Expressions.SelectLoop;
28052
28085
  this.checkFields(fields, dbSources, input, node);
28053
- this.handleInto(node, input, fields, dbSources, isSingle);
28086
+ const intoExpression = this.handleInto(node, input, fields, dbSources);
28054
28087
  const fae = node.findDirectExpression(Expressions.SQLForAllEntries);
28055
28088
  if (fae) {
28056
28089
  input.scope.push(_scope_type_1.ScopeType.OpenSQL, "SELECT", token.getStart(), input.filename);
@@ -28064,7 +28097,7 @@ class Select {
28064
28097
  && node.findDirectExpression(Expressions.SQLIntoTable) === undefined
28065
28098
  && node.findDirectExpression(Expressions.SQLIntoList) === undefined
28066
28099
  && node.findDirectExpression(Expressions.SQLIntoStructure) === undefined) {
28067
- const fields = (_b = node.findFirstExpression(Expressions.SQLAggregation)) === null || _b === void 0 ? void 0 : _b.concatTokens();
28100
+ const fields = (_a = node.findFirstExpression(Expressions.SQLAggregation)) === null || _a === void 0 ? void 0 : _a.concatTokens();
28068
28101
  const c = new RegExp(/^count\(\s*\*\s*\)$/, "i");
28069
28102
  if (fields === undefined || c.test(fields) === false) {
28070
28103
  const nameToken = from === null || from === void 0 ? void 0 : from.findDirectExpression(Expressions.SQLFromSource);
@@ -28098,8 +28131,18 @@ class Select {
28098
28131
  for (const s of node.findAllExpressions(Expressions.SQLCompare)) {
28099
28132
  sql_compare_1.SQLCompare.runSyntax(s, input, dbSources);
28100
28133
  }
28101
- for (const s of node.findDirectExpressions(Expressions.SQLOrderBy)) {
28102
- sql_order_by_1.SQLOrderBy.runSyntax(s, input);
28134
+ const orderBy = node.findDirectExpression(Expressions.SQLOrderBy);
28135
+ if (orderBy) {
28136
+ sql_order_by_1.SQLOrderBy.runSyntax(orderBy, input);
28137
+ const where = node.findDirectExpression(Expressions.SQLCond);
28138
+ if (intoExpression
28139
+ && where
28140
+ && intoExpression.getFirstToken().getStart().isBefore(orderBy.getFirstToken().getStart())
28141
+ && where.getFirstToken().getStart().isBefore(orderBy.getFirstToken().getStart())
28142
+ && where.getFirstToken().getStart().isBefore(intoExpression.getFirstToken().getStart())) {
28143
+ const message = `ORDER BY must be before INTO, after WHERE`;
28144
+ input.issues.push((0, _syntax_input_1.syntaxIssue)(input, orderBy.getFirstToken(), message));
28145
+ }
28103
28146
  }
28104
28147
  if (this.isStrictMode(node)) {
28105
28148
  this.strictModeChecks(node, input);
@@ -28150,13 +28193,14 @@ class Select {
28150
28193
  input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
28151
28194
  }
28152
28195
  }
28153
- static handleInto(node, input, fields, dbSources, _isSingle) {
28196
+ static handleInto(node, input, fields, dbSources) {
28154
28197
  const intoTable = node.findDirectExpression(Expressions.SQLIntoTable);
28155
28198
  if (intoTable) {
28156
28199
  const inline = intoTable.findFirstExpression(Expressions.InlineData);
28157
28200
  if (inline) {
28158
28201
  inline_data_1.InlineData.runSyntax(inline, input, this.buildTableType(fields, dbSources, input.scope));
28159
28202
  }
28203
+ return intoTable;
28160
28204
  }
28161
28205
  const intoStructure = node.findDirectExpression(Expressions.SQLIntoStructure);
28162
28206
  if (intoStructure) {
@@ -28170,6 +28214,7 @@ class Select {
28170
28214
  inline_data_1.InlineData.runSyntax(inline, input, basic_1.VoidType.get("SELECT_todo1"));
28171
28215
  }
28172
28216
  }
28217
+ return intoStructure;
28173
28218
  }
28174
28219
  const intoList = node.findDirectExpression(Expressions.SQLIntoList);
28175
28220
  if (intoList) {
@@ -28209,7 +28254,9 @@ class Select {
28209
28254
  inline_data_1.InlineData.runSyntax(inline, input, type);
28210
28255
  }
28211
28256
  }
28257
+ return intoList;
28212
28258
  }
28259
+ return undefined;
28213
28260
  }
28214
28261
  static checkFields(fields, dbSources, input, node) {
28215
28262
  if (dbSources.length > 1) {
@@ -36617,12 +36664,12 @@ class ABAPFile extends _abstract_file_1.AbstractFile {
36617
36664
  getRaw() {
36618
36665
  return this.file.getRaw();
36619
36666
  }
36620
- getInfo() {
36621
- return this.info;
36622
- }
36623
36667
  getRawRows() {
36624
36668
  return this.file.getRawRows();
36625
36669
  }
36670
+ getInfo() {
36671
+ return this.info;
36672
+ }
36626
36673
  getStructure() {
36627
36674
  return this.structure;
36628
36675
  }
@@ -36659,12 +36706,13 @@ exports.ABAPFile = ABAPFile;
36659
36706
 
36660
36707
  Object.defineProperty(exports, "__esModule", ({ value: true }));
36661
36708
  exports.ABAPParser = void 0;
36662
- const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
36709
+ const abap_file_1 = __webpack_require__(/*! ./abap_file */ "./node_modules/@abaplint/core/build/src/abap/abap_file.js");
36710
+ 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");
36711
+ 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");
36663
36712
  const lexer_1 = __webpack_require__(/*! ./1_lexer/lexer */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/lexer.js");
36664
36713
  const statement_parser_1 = __webpack_require__(/*! ./2_statements/statement_parser */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statement_parser.js");
36665
36714
  const structure_parser_1 = __webpack_require__(/*! ./3_structures/structure_parser */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structure_parser.js");
36666
- 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");
36667
- const abap_file_1 = __webpack_require__(/*! ./abap_file */ "./node_modules/@abaplint/core/build/src/abap/abap_file.js");
36715
+ const version_1 = __webpack_require__(/*! ../version */ "./node_modules/@abaplint/core/build/src/version.js");
36668
36716
  class ABAPParser {
36669
36717
  constructor(version, globalMacros, reg) {
36670
36718
  this.version = version ? version : version_1.defaultVersion;
@@ -36689,7 +36737,9 @@ class ABAPParser {
36689
36737
  for (const f of statementResult) {
36690
36738
  const result = structure_parser_1.StructureParser.run(f);
36691
36739
  // 4: file information
36692
- const info = new abap_file_information_1.ABAPFileInformation(result.node, f.file.getFilename());
36740
+ const parser = new abap_file_information_parser_1.ABAPFileInformationParser(f.file.getFilename());
36741
+ const parsed = parser.parse(result.node);
36742
+ const info = new abap_file_information_1.ABAPFileInformation(parsed);
36693
36743
  output.push(new abap_file_1.ABAPFile(f.file, f.tokens, f.statements, result.node, info));
36694
36744
  issues.push(...result.issues);
36695
36745
  }
@@ -48878,6 +48928,37 @@ exports.EcattTestScript = EcattTestScript;
48878
48928
 
48879
48929
  /***/ }),
48880
48930
 
48931
+ /***/ "./node_modules/@abaplint/core/build/src/objects/email_template.js":
48932
+ /*!*************************************************************************!*\
48933
+ !*** ./node_modules/@abaplint/core/build/src/objects/email_template.js ***!
48934
+ \*************************************************************************/
48935
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
48936
+
48937
+ "use strict";
48938
+
48939
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
48940
+ exports.EmailTemplate = void 0;
48941
+ const _abstract_object_1 = __webpack_require__(/*! ./_abstract_object */ "./node_modules/@abaplint/core/build/src/objects/_abstract_object.js");
48942
+ class EmailTemplate extends _abstract_object_1.AbstractObject {
48943
+ getType() {
48944
+ return "SMTG";
48945
+ }
48946
+ getAllowedNaming() {
48947
+ return {
48948
+ maxLength: 60, // todo
48949
+ allowNamespace: true,
48950
+ };
48951
+ }
48952
+ getDescription() {
48953
+ // todo
48954
+ return undefined;
48955
+ }
48956
+ }
48957
+ exports.EmailTemplate = EmailTemplate;
48958
+ //# sourceMappingURL=email_template.js.map
48959
+
48960
+ /***/ }),
48961
+
48881
48962
  /***/ "./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js":
48882
48963
  /*!*************************************************************************************!*\
48883
48964
  !*** ./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js ***!
@@ -49311,6 +49392,8 @@ class FunctionGroup extends _abap_object_1.ABAPObject {
49311
49392
  super.setDirty();
49312
49393
  this.includes = undefined;
49313
49394
  this.modules = undefined;
49395
+ this.description = undefined;
49396
+ this.dynpros = undefined;
49314
49397
  }
49315
49398
  getAllowedNaming() {
49316
49399
  return {
@@ -50167,7 +50250,6 @@ __exportStar(__webpack_require__(/*! ./behavior_definition */ "./node_modules/@a
50167
50250
  __exportStar(__webpack_require__(/*! ./brf_plus_system_application */ "./node_modules/@abaplint/core/build/src/objects/brf_plus_system_application.js"), exports);
50168
50251
  __exportStar(__webpack_require__(/*! ./bsp_application */ "./node_modules/@abaplint/core/build/src/objects/bsp_application.js"), exports);
50169
50252
  __exportStar(__webpack_require__(/*! ./business_add_in_implementation */ "./node_modules/@abaplint/core/build/src/objects/business_add_in_implementation.js"), exports);
50170
- __exportStar(__webpack_require__(/*! ./cds_entity_buffer */ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js"), exports);
50171
50253
  __exportStar(__webpack_require__(/*! ./business_catalog_app_assignment */ "./node_modules/@abaplint/core/build/src/objects/business_catalog_app_assignment.js"), exports);
50172
50254
  __exportStar(__webpack_require__(/*! ./business_catalog */ "./node_modules/@abaplint/core/build/src/objects/business_catalog.js"), exports);
50173
50255
  __exportStar(__webpack_require__(/*! ./business_configuration_maintenance_object */ "./node_modules/@abaplint/core/build/src/objects/business_configuration_maintenance_object.js"), exports);
@@ -50176,6 +50258,7 @@ __exportStar(__webpack_require__(/*! ./business_function_assignment */ "./node_m
50176
50258
  __exportStar(__webpack_require__(/*! ./business_function_set_assignment */ "./node_modules/@abaplint/core/build/src/objects/business_function_set_assignment.js"), exports);
50177
50259
  __exportStar(__webpack_require__(/*! ./business_object_model */ "./node_modules/@abaplint/core/build/src/objects/business_object_model.js"), exports);
50178
50260
  __exportStar(__webpack_require__(/*! ./business_object_type */ "./node_modules/@abaplint/core/build/src/objects/business_object_type.js"), exports);
50261
+ __exportStar(__webpack_require__(/*! ./cds_entity_buffer */ "./node_modules/@abaplint/core/build/src/objects/cds_entity_buffer.js"), exports);
50179
50262
  __exportStar(__webpack_require__(/*! ./cds_metadata_extension */ "./node_modules/@abaplint/core/build/src/objects/cds_metadata_extension.js"), exports);
50180
50263
  __exportStar(__webpack_require__(/*! ./cds_type */ "./node_modules/@abaplint/core/build/src/objects/cds_type.js"), exports);
50181
50264
  __exportStar(__webpack_require__(/*! ./change_document */ "./node_modules/@abaplint/core/build/src/objects/change_document.js"), exports);
@@ -50201,6 +50284,7 @@ __exportStar(__webpack_require__(/*! ./domain */ "./node_modules/@abaplint/core/
50201
50284
  __exportStar(__webpack_require__(/*! ./ecatt_test_configuration */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_configuration.js"), exports);
50202
50285
  __exportStar(__webpack_require__(/*! ./ecatt_test_data_container */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_data_container.js"), exports);
50203
50286
  __exportStar(__webpack_require__(/*! ./ecatt_test_script */ "./node_modules/@abaplint/core/build/src/objects/ecatt_test_script.js"), exports);
50287
+ __exportStar(__webpack_require__(/*! ./email_template */ "./node_modules/@abaplint/core/build/src/objects/email_template.js"), exports);
50204
50288
  __exportStar(__webpack_require__(/*! ./enhancement_implementation */ "./node_modules/@abaplint/core/build/src/objects/enhancement_implementation.js"), exports);
50205
50289
  __exportStar(__webpack_require__(/*! ./enhancement_spot */ "./node_modules/@abaplint/core/build/src/objects/enhancement_spot.js"), exports);
50206
50290
  __exportStar(__webpack_require__(/*! ./entity_type */ "./node_modules/@abaplint/core/build/src/objects/entity_type.js"), exports);
@@ -53256,6 +53340,13 @@ class Table extends _abstract_object_1.AbstractObject {
53256
53340
  }
53257
53341
  return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.description;
53258
53342
  }
53343
+ getSecondaryIndexes() {
53344
+ var _a;
53345
+ if (this.parsedData === undefined) {
53346
+ this.parseXML();
53347
+ }
53348
+ return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.secondaryIndexes;
53349
+ }
53259
53350
  getAllowedNaming() {
53260
53351
  let length = 30;
53261
53352
  const regex = /^((\/[A-Z_\d]{3,8}\/)|[a-zA-Z0-9]{3}|CI_)\w+$/;
@@ -53483,7 +53574,7 @@ class Table extends _abstract_object_1.AbstractObject {
53483
53574
  }
53484
53575
  ///////////////
53485
53576
  parseXML() {
53486
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
53577
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
53487
53578
  const parsed = super.parseRaw2();
53488
53579
  if (parsed === undefined) {
53489
53580
  return;
@@ -53522,6 +53613,25 @@ class Table extends _abstract_object_1.AbstractObject {
53522
53613
  DDTEXT: field.DDTEXT,
53523
53614
  });
53524
53615
  }
53616
+ // secondary indexes
53617
+ const indexes = (_m = parsed.abapGit["asx:abap"]["asx:values"]) === null || _m === void 0 ? void 0 : _m.DD12V;
53618
+ ;
53619
+ this.parsedData.secondaryIndexes = [];
53620
+ for (const index of (0, xml_utils_1.xmlToArray)(indexes === null || indexes === void 0 ? void 0 : indexes.DD12V)) {
53621
+ const indexName = index.INDEXNAME;
53622
+ const indexFields = [];
53623
+ const indexFieldsXml = (_o = parsed.abapGit["asx:abap"]["asx:values"]) === null || _o === void 0 ? void 0 : _o.DD17V;
53624
+ for (const indexField of (0, xml_utils_1.xmlToArray)(indexFieldsXml === null || indexFieldsXml === void 0 ? void 0 : indexFieldsXml.DD17V)) {
53625
+ if (indexField.INDEXNAME === indexName) {
53626
+ // assumption: fields are listed by POSITION in the xml
53627
+ indexFields.push(indexField.FIELDNAME);
53628
+ }
53629
+ }
53630
+ this.parsedData.secondaryIndexes.push({
53631
+ name: indexName,
53632
+ fields: indexFields,
53633
+ });
53634
+ }
53525
53635
  }
53526
53636
  }
53527
53637
  exports.Table = Table;
@@ -54879,7 +54989,7 @@ class Registry {
54879
54989
  }
54880
54990
  static abaplintVersion() {
54881
54991
  // magic, see build script "version.sh"
54882
- return "2.113.247";
54992
+ return "2.114.1";
54883
54993
  }
54884
54994
  getDDICReferences() {
54885
54995
  return this.ddicReferences;
@@ -57792,6 +57902,10 @@ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/c
57792
57902
  const objects_1 = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
57793
57903
  const severity_1 = __webpack_require__(/*! ../severity */ "./node_modules/@abaplint/core/build/src/severity.js");
57794
57904
  class CheckIncludeConf extends _basic_rule_config_1.BasicRuleConfig {
57905
+ constructor() {
57906
+ super(...arguments);
57907
+ this.allowUnused = false;
57908
+ }
57795
57909
  }
57796
57910
  exports.CheckIncludeConf = CheckIncludeConf;
57797
57911
  class CheckInclude {
@@ -57819,7 +57933,7 @@ class CheckInclude {
57819
57933
  }
57820
57934
  initialize(reg) {
57821
57935
  this.reg = reg;
57822
- this.graph = new include_graph_1.IncludeGraph(this.reg, this.getConfig().severity || severity_1.Severity.Error);
57936
+ this.graph = new include_graph_1.IncludeGraph(this.reg, this.getConfig().severity || severity_1.Severity.Error, this.getConfig().allowUnused || false);
57823
57937
  return this;
57824
57938
  }
57825
57939
  run(obj) {
@@ -65785,8 +65899,7 @@ https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selectio
65785
65899
  tags: [_irule_1.RuleTag.SingleFile],
65786
65900
  badExample: `REPORT zfoo.
65787
65901
  WRITE 'hello'.`,
65788
- goodExample: `
65789
- START-OF-SELECTION.
65902
+ goodExample: `START-OF-SELECTION.
65790
65903
  WRITE 'hello'.`,
65791
65904
  };
65792
65905
  }
@@ -66239,6 +66352,7 @@ __exportStar(__webpack_require__(/*! ./implement_methods */ "./node_modules/@aba
66239
66352
  __exportStar(__webpack_require__(/*! ./implicit_start_of_selection */ "./node_modules/@abaplint/core/build/src/rules/implicit_start_of_selection.js"), exports);
66240
66353
  __exportStar(__webpack_require__(/*! ./in_statement_indentation */ "./node_modules/@abaplint/core/build/src/rules/in_statement_indentation.js"), exports);
66241
66354
  __exportStar(__webpack_require__(/*! ./indentation */ "./node_modules/@abaplint/core/build/src/rules/indentation.js"), exports);
66355
+ __exportStar(__webpack_require__(/*! ./index_completely_contained */ "./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js"), exports);
66242
66356
  __exportStar(__webpack_require__(/*! ./inline_data_old_versions */ "./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js"), exports);
66243
66357
  __exportStar(__webpack_require__(/*! ./intf_referencing_clas */ "./node_modules/@abaplint/core/build/src/rules/intf_referencing_clas.js"), exports);
66244
66358
  __exportStar(__webpack_require__(/*! ./invalid_table_index */ "./node_modules/@abaplint/core/build/src/rules/invalid_table_index.js"), exports);
@@ -66345,6 +66459,83 @@ __exportStar(__webpack_require__(/*! ./xml_consistency */ "./node_modules/@abapl
66345
66459
 
66346
66460
  /***/ }),
66347
66461
 
66462
+ /***/ "./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js":
66463
+ /*!***********************************************************************************!*\
66464
+ !*** ./node_modules/@abaplint/core/build/src/rules/index_completely_contained.js ***!
66465
+ \***********************************************************************************/
66466
+ /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
66467
+
66468
+ "use strict";
66469
+
66470
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
66471
+ exports.IndexCompletelyContained = exports.IndexCompletelyContainedConf = void 0;
66472
+ const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
66473
+ const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
66474
+ const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
66475
+ const position_1 = __webpack_require__(/*! ../position */ "./node_modules/@abaplint/core/build/src/position.js");
66476
+ const Objects = __webpack_require__(/*! ../objects */ "./node_modules/@abaplint/core/build/src/objects/index.js");
66477
+ class IndexCompletelyContainedConf extends _basic_rule_config_1.BasicRuleConfig {
66478
+ }
66479
+ exports.IndexCompletelyContainedConf = IndexCompletelyContainedConf;
66480
+ class IndexCompletelyContained {
66481
+ constructor() {
66482
+ this.conf = new IndexCompletelyContainedConf();
66483
+ }
66484
+ getMetadata() {
66485
+ return {
66486
+ key: "index_completely_contained",
66487
+ title: "Check if database table indexes are completely contained",
66488
+ shortDescription: `If indexes are completely contained in other indexes, they can be removed to improve performance.`,
66489
+ tags: [_irule_1.RuleTag.Performance, _irule_1.RuleTag.SingleFile],
66490
+ };
66491
+ }
66492
+ initialize() {
66493
+ return this;
66494
+ }
66495
+ getConfig() {
66496
+ return this.conf;
66497
+ }
66498
+ setConfig(conf) {
66499
+ this.conf = conf;
66500
+ }
66501
+ run(obj) {
66502
+ if (!(obj instanceof Objects.Table)) {
66503
+ return [];
66504
+ }
66505
+ const indexes = obj.getSecondaryIndexes();
66506
+ if (indexes === undefined || indexes.length === 0) {
66507
+ return [];
66508
+ }
66509
+ const issues = [];
66510
+ for (let i = 0; i < indexes.length; i++) {
66511
+ const indexA = indexes[i];
66512
+ for (let j = 0; j < indexes.length; j++) {
66513
+ if (i === j) {
66514
+ continue;
66515
+ }
66516
+ const indexB = indexes[j];
66517
+ let contained = true;
66518
+ for (const field of indexA.fields) {
66519
+ if (indexB.fields.indexOf(field) === -1) {
66520
+ contained = false;
66521
+ break;
66522
+ }
66523
+ }
66524
+ if (contained) {
66525
+ const position = new position_1.Position(1, 1);
66526
+ const message = `Index "${indexA.name}" is completely contained in index "${indexB.name}"`;
66527
+ issues.push(issue_1.Issue.atPosition(obj.getFiles()[0], position, message, this.getMetadata().key, this.conf.severity));
66528
+ }
66529
+ }
66530
+ }
66531
+ return issues;
66532
+ }
66533
+ }
66534
+ exports.IndexCompletelyContained = IndexCompletelyContained;
66535
+ //# sourceMappingURL=index_completely_contained.js.map
66536
+
66537
+ /***/ }),
66538
+
66348
66539
  /***/ "./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js":
66349
66540
  /*!*********************************************************************************!*\
66350
66541
  !*** ./node_modules/@abaplint/core/build/src/rules/inline_data_old_versions.js ***!
@@ -78517,11 +78708,12 @@ class Graph {
78517
78708
  }
78518
78709
  }
78519
78710
  class IncludeGraph {
78520
- constructor(reg, severity = severity_1.Severity.Error) {
78711
+ constructor(reg, severity = severity_1.Severity.Error, allowUnused = false) {
78521
78712
  this.reg = reg;
78522
78713
  this.issues = [];
78523
78714
  this.graph = new Graph();
78524
78715
  this.severity = severity;
78716
+ this.allowUnused = allowUnused;
78525
78717
  this.build();
78526
78718
  }
78527
78719
  listMainForInclude(filename) {
@@ -78545,6 +78737,7 @@ class IncludeGraph {
78545
78737
  }
78546
78738
  const v = this.graph.findVertexByFilename(file.getFilename());
78547
78739
  if (v !== undefined
78740
+ && this.allowUnused === false
78548
78741
  && v.include === true
78549
78742
  && this.listMainForInclude(v.filename).length === 0) {
78550
78743
  const f = this.reg.getFileByName(v.filename);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abaplint/cli",
3
- "version": "2.113.247",
3
+ "version": "2.114.1",
4
4
  "description": "abaplint - Command Line Interface",
5
5
  "funding": "https://github.com/sponsors/larshp",
6
6
  "bin": {
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "homepage": "https://abaplint.org",
40
40
  "devDependencies": {
41
- "@abaplint/core": "^2.113.247",
41
+ "@abaplint/core": "^2.114.1",
42
42
  "@types/chai": "^4.3.20",
43
43
  "@types/minimist": "^1.2.5",
44
44
  "@types/mocha": "^10.0.10",