@abaplint/core 2.94.10 → 2.94.12

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 (88) hide show
  1. package/README.md +6 -6
  2. package/adhoc/lexer_performance.ts +15 -15
  3. package/adhoc/parser_performance.ts +18 -18
  4. package/build/src/abap/flow/flow_graph.js +7 -7
  5. package/build/src/lsp/help.js +7 -7
  6. package/build/src/registry.js +1 -1
  7. package/build/src/rules/7bit_ascii.js +2 -2
  8. package/build/src/rules/abapdoc.js +3 -3
  9. package/build/src/rules/align_parameters.js +39 -39
  10. package/build/src/rules/ambiguous_statement.js +5 -5
  11. package/build/src/rules/avoid_use.js +8 -8
  12. package/build/src/rules/begin_end_names.js +4 -4
  13. package/build/src/rules/begin_single_include.js +12 -12
  14. package/build/src/rules/call_transaction_authority_check.js +3 -3
  15. package/build/src/rules/cds_comment_style.js +4 -4
  16. package/build/src/rules/cds_legacy_view.js +4 -4
  17. package/build/src/rules/chain_mainly_declarations.js +4 -4
  18. package/build/src/rules/change_if_to_case.js +8 -8
  19. package/build/src/rules/check_abstract.js +2 -2
  20. package/build/src/rules/check_comments.js +4 -4
  21. package/build/src/rules/check_include.js +3 -3
  22. package/build/src/rules/check_subrc.js +8 -8
  23. package/build/src/rules/classic_exceptions_overlap.js +8 -8
  24. package/build/src/rules/commented_code.js +1 -1
  25. package/build/src/rules/constructor_visibility_public.js +4 -4
  26. package/build/src/rules/contains_tab.js +2 -2
  27. package/build/src/rules/cyclic_oo.js +13 -3
  28. package/build/src/rules/dangerous_statement.js +1 -1
  29. package/build/src/rules/definitions_top.js +2 -2
  30. package/build/src/rules/downport.js +83 -83
  31. package/build/src/rules/exit_or_check.js +3 -3
  32. package/build/src/rules/exporting.js +1 -1
  33. package/build/src/rules/forbidden_identifier.js +1 -1
  34. package/build/src/rules/forbidden_void_type.js +2 -2
  35. package/build/src/rules/functional_writing.js +17 -17
  36. package/build/src/rules/global_class.js +8 -8
  37. package/build/src/rules/identical_conditions.js +2 -2
  38. package/build/src/rules/identical_contents.js +14 -14
  39. package/build/src/rules/identical_descriptions.js +6 -6
  40. package/build/src/rules/if_in_if.js +26 -26
  41. package/build/src/rules/implement_methods.js +3 -3
  42. package/build/src/rules/in_statement_indentation.js +11 -11
  43. package/build/src/rules/intf_referencing_clas.js +3 -3
  44. package/build/src/rules/line_break_style.js +2 -2
  45. package/build/src/rules/line_length.js +1 -1
  46. package/build/src/rules/line_only_punc.js +1 -1
  47. package/build/src/rules/local_variable_names.js +2 -2
  48. package/build/src/rules/main_file_contents.js +4 -4
  49. package/build/src/rules/many_parentheses.js +10 -10
  50. package/build/src/rules/max_one_method_parameter_per_line.js +7 -7
  51. package/build/src/rules/max_one_statement.js +5 -5
  52. package/build/src/rules/method_overwrites_builtin.js +2 -2
  53. package/build/src/rules/nesting.js +1 -1
  54. package/build/src/rules/no_chained_assignment.js +1 -1
  55. package/build/src/rules/no_external_form_calls.js +2 -2
  56. package/build/src/rules/no_inline_in_optional_branches.js +11 -11
  57. package/build/src/rules/no_public_attributes.js +1 -1
  58. package/build/src/rules/no_yoda_conditions.js +4 -4
  59. package/build/src/rules/nrob_consistency.js +2 -2
  60. package/build/src/rules/obsolete_statement.js +42 -42
  61. package/build/src/rules/omit_parameter_name.js +3 -3
  62. package/build/src/rules/omit_receiving.js +13 -13
  63. package/build/src/rules/parser_702_chaining.js +2 -2
  64. package/build/src/rules/parser_error.js +2 -2
  65. package/build/src/rules/parser_missing_space.js +1 -1
  66. package/build/src/rules/prefer_inline.js +16 -16
  67. package/build/src/rules/prefer_is_not.js +7 -7
  68. package/build/src/rules/prefer_raise_exception_new.js +3 -3
  69. package/build/src/rules/prefer_returning_to_exporting.js +1 -1
  70. package/build/src/rules/prefer_xsdbool.js +2 -2
  71. package/build/src/rules/remove_descriptions.js +4 -4
  72. package/build/src/rules/rfc_error_handling.js +9 -9
  73. package/build/src/rules/select_add_order_by.js +5 -5
  74. package/build/src/rules/select_performance.js +5 -5
  75. package/build/src/rules/sicf_consistency.js +2 -2
  76. package/build/src/rules/space_before_dot.js +2 -2
  77. package/build/src/rules/start_at_tab.js +1 -1
  78. package/build/src/rules/sy_modification.js +4 -4
  79. package/build/src/rules/tabl_enhancement_category.js +2 -2
  80. package/build/src/rules/unnecessary_pragma.js +22 -22
  81. package/build/src/rules/unnecessary_return.js +5 -5
  82. package/build/src/rules/unused_methods.js +9 -9
  83. package/build/src/rules/unused_variables.js +4 -4
  84. package/build/src/rules/use_bool_expression.js +8 -8
  85. package/build/src/rules/use_line_exists.js +6 -6
  86. package/build/src/rules/use_new.js +4 -4
  87. package/build/src/rules/when_others_last.js +6 -6
  88. package/package.json +67 -67
@@ -122,37 +122,37 @@ class Downport {
122
122
  key: "downport",
123
123
  title: "Downport statement",
124
124
  shortDescription: `Experimental downport functionality`,
125
- extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
126
- a higher level language version. If successful, various rules are applied to downport the statement.
127
- Target downport version is always v702, thus rule is only enabled if target version is v702.
128
-
129
- Current rules:
130
- * NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
131
- * DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
132
- * FIELD-SYMBOL() definitions are outlined
133
- * CONV is outlined
134
- * COND is outlined
135
- * REDUCE is outlined
136
- * SWITCH is outlined
137
- * FILTER is outlined
138
- * APPEND expression is outlined
139
- * INSERT expression is outlined
140
- * EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
141
- * CAST changed to ?=
142
- * LOOP AT method_call( ) is outlined
143
- * VALUE # with structure fields
144
- * VALUE # with internal table lines
145
- * Table Expressions are outlined
146
- * SELECT INTO @DATA definitions are outlined
147
- * Some occurrences of string template formatting option ALPHA changed to function module call
148
- * SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
149
- * PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
150
- * RAISE EXCEPTION ... MESSAGE
151
- * Moving with +=, -=, /=, *=, &&= is expanded
152
- * line_exists and line_index is downported to READ TABLE
153
- * ENUMs, but does not nessesarily give the correct type and value
154
- * MESSAGE with non simple source
155
-
125
+ extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
126
+ a higher level language version. If successful, various rules are applied to downport the statement.
127
+ Target downport version is always v702, thus rule is only enabled if target version is v702.
128
+
129
+ Current rules:
130
+ * NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
131
+ * DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
132
+ * FIELD-SYMBOL() definitions are outlined
133
+ * CONV is outlined
134
+ * COND is outlined
135
+ * REDUCE is outlined
136
+ * SWITCH is outlined
137
+ * FILTER is outlined
138
+ * APPEND expression is outlined
139
+ * INSERT expression is outlined
140
+ * EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
141
+ * CAST changed to ?=
142
+ * LOOP AT method_call( ) is outlined
143
+ * VALUE # with structure fields
144
+ * VALUE # with internal table lines
145
+ * Table Expressions are outlined
146
+ * SELECT INTO @DATA definitions are outlined
147
+ * Some occurrences of string template formatting option ALPHA changed to function module call
148
+ * SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
149
+ * PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
150
+ * RAISE EXCEPTION ... MESSAGE
151
+ * Moving with +=, -=, /=, *=, &&= is expanded
152
+ * line_exists and line_index is downported to READ TABLE
153
+ * ENUMs, but does not nessesarily give the correct type and value
154
+ * MESSAGE with non simple source
155
+
156
156
  Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.`,
157
157
  tags: [_irule_1.RuleTag.Experimental, _irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
158
158
  };
@@ -593,10 +593,10 @@ Only one transformation is applied to a statement at a time, so multiple steps m
593
593
  const fieldName = f.concatTokens();
594
594
  fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
595
595
  }
596
- fieldDefinition = `DATA: BEGIN OF ${name},
596
+ fieldDefinition = `DATA: BEGIN OF ${name},
597
597
  ${fieldDefinition}${indentation} END OF ${name}.`;
598
598
  }
599
- const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
599
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
600
600
  ${indentation}`);
601
601
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
602
602
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
@@ -640,12 +640,12 @@ ${indentation}`);
640
640
  }
641
641
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
642
642
  const name = ((_c = inlineData.findFirstExpression(Expressions.TargetField)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "error";
643
- let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
644
- ${fieldDefinitions}${indentation} END OF ${uniqueName}.
645
- ${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
643
+ let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
644
+ ${fieldDefinitions}${indentation} END OF ${uniqueName}.
645
+ ${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
646
646
  ${indentation}`);
647
647
  if (fieldDefinitions === "") {
648
- fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
648
+ fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
649
649
  ${indentation}`);
650
650
  }
651
651
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
@@ -697,7 +697,7 @@ ${indentation}`);
697
697
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
698
698
  const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
699
699
  const firstToken = high.getFirstToken();
700
- const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
700
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
701
701
  ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
702
702
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
703
703
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
@@ -719,7 +719,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
719
719
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
720
720
  const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
721
721
  const firstToken = high.getFirstToken();
722
- const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
722
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
723
723
  ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
724
724
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
725
725
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
@@ -761,14 +761,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
761
761
  const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
762
762
  const firstToken = high.getFirstToken();
763
763
  // note that the tabix restore should be done before throwing the exception
764
- const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
765
- ${indentation}DATA ${tabixBackup} LIKE sy-tabix.
766
- ${indentation}${tabixBackup} = sy-tabix.
767
- ${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
768
- ${indentation}sy-tabix = ${tabixBackup}.
769
- ${indentation}IF sy-subrc <> 0.
770
- ${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
771
- ${indentation}ENDIF.
764
+ const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
765
+ ${indentation}DATA ${tabixBackup} LIKE sy-tabix.
766
+ ${indentation}${tabixBackup} = sy-tabix.
767
+ ${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
768
+ ${indentation}sy-tabix = ${tabixBackup}.
769
+ ${indentation}IF sy-subrc <> 0.
770
+ ${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
771
+ ${indentation}ENDIF.
772
772
  ${indentation}`);
773
773
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
774
774
  const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
@@ -822,7 +822,7 @@ ${indentation}`);
822
822
  const className = classNames[0].concatTokens();
823
823
  const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
824
824
  const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
825
- const code = ` DATA ${targetName} TYPE REF TO ${className}.
825
+ const code = ` DATA ${targetName} TYPE REF TO ${className}.
826
826
  ${indentation}CATCH ${className} INTO ${targetName}.`;
827
827
  const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
828
828
  return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
@@ -945,11 +945,11 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
945
945
  const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
946
946
  const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
947
947
  const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
948
- const abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
949
- ${indentation}${uniqueName1}-msgid = ${id === null || id === void 0 ? void 0 : id.toUpperCase()}.
950
- ${indentation}${uniqueName1}-msgno = ${number}.
951
- ${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
952
- ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.
948
+ const abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
949
+ ${indentation}${uniqueName1}-msgid = ${id === null || id === void 0 ? void 0 : id.toUpperCase()}.
950
+ ${indentation}${uniqueName1}-msgno = ${number}.
951
+ ${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
952
+ ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.
953
953
  ${indentation}RAISE EXCEPTION ${uniqueName2}.`;
954
954
  const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), abap);
955
955
  return issue_1.Issue.atToken(lowFile, startToken, "Downport RAISE MESSAGE", this.getMetadata().key, this.conf.severity, fix);
@@ -1044,10 +1044,10 @@ ${indentation}RAISE EXCEPTION ${uniqueName2}.`;
1044
1044
  let code = "";
1045
1045
  if (sourceRef.findFirstExpression(Expressions.TableExpression)) {
1046
1046
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1047
- code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
1048
- IF sy-subrc <> 0.
1049
- RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
1050
- ENDIF.
1047
+ code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
1048
+ IF sy-subrc <> 0.
1049
+ RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
1050
+ ENDIF.
1051
1051
  GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
1052
1052
  }
1053
1053
  else {
@@ -1123,20 +1123,20 @@ GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
1123
1123
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1124
1124
  const uniqueFS = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1125
1125
  const uniqueNameIndex = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1126
- code += ` items LIKE ${loopSourceName},
1127
- END OF ${groupTargetName}type.
1128
- DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
1129
- DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
1126
+ code += ` items LIKE ${loopSourceName},
1127
+ END OF ${groupTargetName}type.
1128
+ DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
1129
+ DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
1130
1130
  LOOP AT ${loopSourceName} ${(_l = high.findFirstExpression(Expressions.LoopTarget)) === null || _l === void 0 ? void 0 : _l.concatTokens()}.\n`;
1131
1131
  if (groupIndexName !== undefined) {
1132
1132
  code += `DATA(${uniqueNameIndex}) = sy-tabix.\n`;
1133
1133
  }
1134
- code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
1134
+ code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
1135
1135
  IF sy-subrc = 0.\n`;
1136
1136
  if (groupCountName !== undefined) {
1137
1137
  code += ` <${uniqueFS}>-${groupCountName} = <${uniqueFS}>-${groupCountName} + 1.\n`;
1138
1138
  }
1139
- code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
1139
+ code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
1140
1140
  ELSE.\n`;
1141
1141
  code += ` CLEAR ${uniqueName}.\n`;
1142
1142
  for (const c of group.findAllExpressions(Expressions.LoopGroupByComponent)) {
@@ -1157,8 +1157,8 @@ ELSE.\n`;
1157
1157
  }
1158
1158
  code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE ${uniqueName}-items.\n`;
1159
1159
  code += ` INSERT ${uniqueName} INTO TABLE ${groupTargetName}tab.\n`;
1160
- code += `ENDIF.
1161
- ENDLOOP.
1160
+ code += `ENDIF.
1161
+ ENDLOOP.
1162
1162
  LOOP AT ${groupTargetName}tab ${groupTarget}.`;
1163
1163
  let fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
1164
1164
  for (const l of ((_m = highFile.getStructure()) === null || _m === void 0 ? void 0 : _m.findAllStructures(Structures.Loop)) || []) {
@@ -1304,7 +1304,7 @@ LOOP AT ${groupTargetName}tab ${groupTarget}.`;
1304
1304
  const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
1305
1305
  const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
1306
1306
  // all ENUMS are char like?
1307
- let code = `TYPES ${enumName} TYPE string.
1307
+ let code = `TYPES ${enumName} TYPE string.
1308
1308
  CONSTANTS: BEGIN OF ${structureName},\n`;
1309
1309
  let count = 1;
1310
1310
  for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
@@ -1348,14 +1348,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
1348
1348
  const tabixBackup = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1349
1349
  const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
1350
1350
  // restore tabix before exeption
1351
- const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
1352
- ${indentation}DATA ${tabixBackup} LIKE sy-tabix.
1353
- ${indentation}${tabixBackup} = sy-tabix.
1354
- ${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
1355
- ${indentation}sy-tabix = ${tabixBackup}.
1356
- ${indentation}IF sy-subrc <> 0.
1357
- ${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
1358
- ${indentation}ENDIF.
1351
+ const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
1352
+ ${indentation}DATA ${tabixBackup} LIKE sy-tabix.
1353
+ ${indentation}${tabixBackup} = sy-tabix.
1354
+ ${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
1355
+ ${indentation}sy-tabix = ${tabixBackup}.
1356
+ ${indentation}IF sy-subrc <> 0.
1357
+ ${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
1358
+ ${indentation}ENDIF.
1359
1359
  ${indentation}${uniqueName}`;
1360
1360
  const start = target.getFirstToken().getStart();
1361
1361
  const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
@@ -1456,11 +1456,11 @@ ${indentation}${uniqueName}`;
1456
1456
  const topTarget = (_c = high.findDirectExpression(Expressions.Target)) === null || _c === void 0 ? void 0 : _c.concatTokens();
1457
1457
  const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
1458
1458
  if (top === false) {
1459
- const code = `DATA ${uniqueName} TYPE string.
1460
- ${indentation}CALL FUNCTION '${functionName}'
1461
- ${indentation} EXPORTING
1462
- ${indentation} input = ${source}
1463
- ${indentation} IMPORTING
1459
+ const code = `DATA ${uniqueName} TYPE string.
1460
+ ${indentation}CALL FUNCTION '${functionName}'
1461
+ ${indentation} EXPORTING
1462
+ ${indentation} input = ${source}
1463
+ ${indentation} IMPORTING
1464
1464
  ${indentation} output = ${uniqueName}.\n`;
1465
1465
  const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
1466
1466
  const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, child.getFirstToken().getStart(), child.getLastToken().getEnd(), uniqueName);
@@ -1468,10 +1468,10 @@ ${indentation} output = ${uniqueName}.\n`;
1468
1468
  return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Downport ALPHA", this.getMetadata().key, this.conf.severity, fix);
1469
1469
  }
1470
1470
  else {
1471
- const code = `CALL FUNCTION '${functionName}'
1472
- ${indentation} EXPORTING
1473
- ${indentation} input = ${source}
1474
- ${indentation} IMPORTING
1471
+ const code = `CALL FUNCTION '${functionName}'
1472
+ ${indentation} EXPORTING
1473
+ ${indentation} input = ${source}
1474
+ ${indentation} IMPORTING
1475
1475
  ${indentation} output = ${topTarget}.`;
1476
1476
  const fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
1477
1477
  return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Downport ALPHA", this.getMetadata().key, this.conf.severity, fix);
@@ -24,10 +24,10 @@ class ExitOrCheck extends _abap_rule_1.ABAPRule {
24
24
  return {
25
25
  key: "exit_or_check",
26
26
  title: "Find EXIT or CHECK outside loops",
27
- shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
27
+ shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
28
28
  Use RETURN to leave procesing blocks instead.`,
29
- extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
30
- https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
29
+ extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
30
+ https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
31
31
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return`,
32
32
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
33
33
  };
@@ -22,7 +22,7 @@ class Exporting extends _abap_rule_1.ABAPRule {
22
22
  shortDescription: `Detects EXPORTING statements which can be omitted.`,
23
23
  badExample: `call_method( EXPORTING foo = bar ).`,
24
24
  goodExample: `call_method( foo = bar ).`,
25
- extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
25
+ extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
26
26
  https://docs.abapopenchecks.org/checks/30/`,
27
27
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
28
28
  };
@@ -26,7 +26,7 @@ class ForbiddenIdentifier extends _abap_rule_1.ABAPRule {
26
26
  key: "forbidden_identifier",
27
27
  title: "Forbidden Identifier",
28
28
  shortDescription: `Forbid use of specified identifiers, list of regex.`,
29
- extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
29
+ extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
30
30
  https://github.com/abaplint/transpiler/blob/bda94b8b56e2b7f2f87be2168f12361aa530220e/packages/transpiler/src/validation.ts#L44`,
31
31
  tags: [_irule_1.RuleTag.SingleFile],
32
32
  };
@@ -28,8 +28,8 @@ class ForbiddenVoidType {
28
28
  key: "forbidden_void_type",
29
29
  title: "Forbidden Void Types",
30
30
  shortDescription: `Avoid usage of specified void types.`,
31
- extendedInformation: `Inspiration:
32
- BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
31
+ extendedInformation: `Inspiration:
32
+ BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
33
33
  DATS, TIMS, DATUM, FLAG, INT4, NUMC3, NUMC4, SAP_BOOL, TEXT25, TEXT80, X255, XFELD`,
34
34
  };
35
35
  }
@@ -28,26 +28,26 @@ class FunctionalWriting extends _abap_rule_1.ABAPRule {
28
28
  key: "functional_writing",
29
29
  title: "Use functional writing",
30
30
  shortDescription: `Detects usage of call method when functional style calls can be used.`,
31
- extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
31
+ extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
32
32
  https://docs.abapopenchecks.org/checks/07/`,
33
33
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
34
- badExample: `CALL METHOD zcl_class=>method( ).
35
- CALL METHOD cl_abap_typedescr=>describe_by_name
36
- EXPORTING
37
- p_name = 'NAME'
38
- RECEIVING
39
- p_descr_ref = lr_typedescr
40
- EXCEPTIONS
41
- type_not_found = 1
34
+ badExample: `CALL METHOD zcl_class=>method( ).
35
+ CALL METHOD cl_abap_typedescr=>describe_by_name
36
+ EXPORTING
37
+ p_name = 'NAME'
38
+ RECEIVING
39
+ p_descr_ref = lr_typedescr
40
+ EXCEPTIONS
41
+ type_not_found = 1
42
42
  OTHERS = 2.`,
43
- goodExample: `zcl_class=>method( ).
44
- cl_abap_typedescr=>describe_by_name(
45
- EXPORTING
46
- p_name = 'NAME'
47
- RECEIVING
48
- p_descr_ref = lr_typedescr
49
- EXCEPTIONS
50
- type_not_found = 1
43
+ goodExample: `zcl_class=>method( ).
44
+ cl_abap_typedescr=>describe_by_name(
45
+ EXPORTING
46
+ p_name = 'NAME'
47
+ RECEIVING
48
+ p_descr_ref = lr_typedescr
49
+ EXCEPTIONS
50
+ type_not_found = 1
51
51
  OTHERS = 2 ).`,
52
52
  };
53
53
  }
@@ -19,14 +19,14 @@ class GlobalClass extends _abap_rule_1.ABAPRule {
19
19
  key: "global_class",
20
20
  title: "Global class checks",
21
21
  shortDescription: `Checks related to global classes`,
22
- extendedInformation: `* global classes must be in own files
23
-
24
- * file names must match class name
25
-
26
- * file names must match interface name
27
-
28
- * global classes must be global definitions
29
-
22
+ extendedInformation: `* global classes must be in own files
23
+
24
+ * file names must match class name
25
+
26
+ * file names must match interface name
27
+
28
+ * global classes must be global definitions
29
+
30
30
  * global interfaces must be global definitions`,
31
31
  tags: [_irule_1.RuleTag.Syntax],
32
32
  };
@@ -33,8 +33,8 @@ class IdenticalConditions extends _abap_rule_1.ABAPRule {
33
33
  return {
34
34
  key: "identical_conditions",
35
35
  title: "Identical conditions",
36
- shortDescription: `Find identical conditions in IF + CASE + WHILE etc
37
-
36
+ shortDescription: `Find identical conditions in IF + CASE + WHILE etc
37
+
38
38
  Prerequsites: code is pretty printed with identical cAsE`,
39
39
  tags: [_irule_1.RuleTag.SingleFile],
40
40
  };
@@ -20,23 +20,23 @@ class IdenticalContents extends _abap_rule_1.ABAPRule {
20
20
  key: "identical_contents",
21
21
  title: "Identical contents",
22
22
  shortDescription: `Find identical contents in blocks inside IFs, both in the beginning and in the end.`,
23
- extendedInformation: `
24
- Prerequsites: code is pretty printed with identical cAsE
25
-
23
+ extendedInformation: `
24
+ Prerequsites: code is pretty printed with identical cAsE
25
+
26
26
  Chained statments are ignored`,
27
27
  tags: [_irule_1.RuleTag.SingleFile],
28
- badExample: `IF foo = bar.
29
- WRITE 'bar'.
30
- WRITE 'world'.
31
- ELSE.
32
- WRITE 'foo'.
33
- WRITE 'world'.
28
+ badExample: `IF foo = bar.
29
+ WRITE 'bar'.
30
+ WRITE 'world'.
31
+ ELSE.
32
+ WRITE 'foo'.
33
+ WRITE 'world'.
34
34
  ENDIF.`,
35
- goodExample: `IF foo = bar.
36
- WRITE 'bar'.
37
- ELSE.
38
- WRITE 'foo'.
39
- ENDIF.
35
+ goodExample: `IF foo = bar.
36
+ WRITE 'bar'.
37
+ ELSE.
38
+ WRITE 'foo'.
39
+ ENDIF.
40
40
  WRITE 'world'.`,
41
41
  };
42
42
  }
@@ -16,12 +16,12 @@ class IdenticalDescriptions {
16
16
  key: "identical_descriptions",
17
17
  title: "Identical descriptions",
18
18
  shortDescription: `Searches for objects with the same type and same description`,
19
- extendedInformation: `Case insensitive
20
-
21
- Only checks the master language descriptions
22
-
23
- Dependencies are skipped
24
-
19
+ extendedInformation: `Case insensitive
20
+
21
+ Only checks the master language descriptions
22
+
23
+ Dependencies are skipped
24
+
25
25
  Works for: INTF, CLAS, DOMA, DTEL, FUNC in same FUGR`,
26
26
  tags: [],
27
27
  };
@@ -21,34 +21,34 @@ class IfInIf extends _abap_rule_1.ABAPRule {
21
21
  key: "if_in_if",
22
22
  title: "IF in IF",
23
23
  shortDescription: `Detects nested ifs which can be refactored.`,
24
- extendedInformation: `
25
- Directly nested IFs without ELSE can be refactored to a single condition using AND.
26
-
27
- ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
28
-
29
- https://docs.abapopenchecks.org/checks/01/
24
+ extendedInformation: `
25
+ Directly nested IFs without ELSE can be refactored to a single condition using AND.
26
+
27
+ ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
28
+
29
+ https://docs.abapopenchecks.org/checks/01/
30
30
  https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low`,
31
- badExample: `IF condition1.
32
- IF condition2.
33
- ...
34
- ENDIF.
35
- ENDIF.
36
-
37
- IF condition1.
38
- ...
39
- ELSE.
40
- IF condition2.
41
- ...
42
- ENDIF.
31
+ badExample: `IF condition1.
32
+ IF condition2.
33
+ ...
34
+ ENDIF.
35
+ ENDIF.
36
+
37
+ IF condition1.
38
+ ...
39
+ ELSE.
40
+ IF condition2.
41
+ ...
42
+ ENDIF.
43
43
  ENDIF.`,
44
- goodExample: `IF ( condition1 ) AND ( condition2 ).
45
- ...
46
- ENDIF.
47
-
48
- IF condition1.
49
- ...
50
- ELSEIF condition2.
51
- ...
44
+ goodExample: `IF ( condition1 ) AND ( condition2 ).
45
+ ...
46
+ ENDIF.
47
+
48
+ IF condition1.
49
+ ...
50
+ ELSEIF condition2.
51
+ ...
52
52
  ENDIF.`,
53
53
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
54
54
  };
@@ -102,9 +102,9 @@ class ImplementMethods extends _abap_rule_1.ABAPRule {
102
102
  for (const i of ((_a = file.getStructure()) === null || _a === void 0 ? void 0 : _a.findAllStatements(Statements.ClassImplementation)) || []) {
103
103
  const name = (_b = i.findFirstExpression(Expressions.ClassName)) === null || _b === void 0 ? void 0 : _b.getFirstToken().getStr().toUpperCase();
104
104
  if (name === impl.identifier.getName().toUpperCase()) {
105
- return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
106
- METHOD ${methodName.toLowerCase()}.
107
- RETURN. " todo, implement method
105
+ return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
106
+ METHOD ${methodName.toLowerCase()}.
107
+ RETURN. " todo, implement method
108
108
  ENDMETHOD.`);
109
109
  }
110
110
  }
@@ -31,19 +31,19 @@ class InStatementIndentation extends _abap_rule_1.ABAPRule {
31
31
  key: "in_statement_indentation",
32
32
  title: "In-statement indentation",
33
33
  shortDescription: "Checks alignment within statements which span multiple lines.",
34
- extendedInformation: `Lines following the first line should be indented once (2 spaces).
35
-
36
- For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
34
+ extendedInformation: `Lines following the first line should be indented once (2 spaces).
35
+
36
+ For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
37
37
  to distinguish them better from code within the block.`,
38
- badExample: `IF 1 = 1
39
- AND 2 = 2.
40
- WRITE 'hello' &&
41
- 'world'.
38
+ badExample: `IF 1 = 1
39
+ AND 2 = 2.
40
+ WRITE 'hello' &&
41
+ 'world'.
42
42
  ENDIF.`,
43
- goodExample: `IF 1 = 1
44
- AND 2 = 2.
45
- WRITE 'hello' &&
46
- 'world'.
43
+ goodExample: `IF 1 = 1
44
+ AND 2 = 2.
45
+ WRITE 'hello' &&
46
+ 'world'.
47
47
  ENDIF.`,
48
48
  tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
49
49
  };
@@ -26,9 +26,9 @@ class IntfReferencingClas {
26
26
  key: "intf_referencing_clas",
27
27
  title: "INTF referencing CLAS",
28
28
  shortDescription: `Interface contains references to class`,
29
- extendedInformation: `Only global interfaces are checked.
30
- Only first level references are checked.
31
- Exception class references are ignored.
29
+ extendedInformation: `Only global interfaces are checked.
30
+ Only first level references are checked.
31
+ Exception class references are ignored.
32
32
  Void references are ignored.`,
33
33
  };
34
34
  }
@@ -15,8 +15,8 @@ class LineBreakStyle {
15
15
  return {
16
16
  key: "line_break_style",
17
17
  title: "Makes sure line breaks are consistent in the ABAP code",
18
- shortDescription: `Enforces LF as newlines in ABAP files
19
-
18
+ shortDescription: `Enforces LF as newlines in ABAP files
19
+
20
20
  abapGit does not work with CRLF`,
21
21
  tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile],
22
22
  };
@@ -23,7 +23,7 @@ class LineLength extends _abap_rule_1.ABAPRule {
23
23
  key: "line_length",
24
24
  title: "Line length",
25
25
  shortDescription: `Detects lines exceeding the provided maximum length.`,
26
- extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
26
+ extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
27
27
  https://docs.abapopenchecks.org/checks/04/`,
28
28
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
29
29
  };
@@ -27,7 +27,7 @@ class LineOnlyPunc extends _abap_rule_1.ABAPRule {
27
27
  key: "line_only_punc",
28
28
  title: "Line containing only punctuation",
29
29
  shortDescription: `Detects lines containing only punctuation.`,
30
- extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
30
+ extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
31
31
  https://docs.abapopenchecks.org/checks/16/`,
32
32
  tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
33
33
  badExample: "zcl_class=>method(\n).",
@@ -30,8 +30,8 @@ class LocalVariableNames extends _abap_rule_1.ABAPRule {
30
30
  return {
31
31
  key: "local_variable_names",
32
32
  title: "Local variable naming conventions",
33
- shortDescription: `
34
- Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
33
+ shortDescription: `
34
+ Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
35
35
  Regexes are case-insensitive.`,
36
36
  tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile],
37
37
  };