@abaplint/core 2.94.7 → 2.94.8
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/README.md +6 -6
- package/adhoc/lexer_performance.ts +16 -16
- package/build/abaplint.d.ts +1 -1
- package/build/src/abap/flow/flow_graph.js +7 -7
- package/build/src/index.js +3 -1
- package/build/src/lsp/help.js +7 -7
- package/build/src/registry.js +1 -1
- package/build/src/rules/7bit_ascii.js +2 -2
- package/build/src/rules/abapdoc.js +3 -3
- package/build/src/rules/align_parameters.js +39 -39
- package/build/src/rules/ambiguous_statement.js +5 -5
- package/build/src/rules/avoid_use.js +8 -8
- package/build/src/rules/begin_end_names.js +4 -4
- package/build/src/rules/begin_single_include.js +12 -12
- package/build/src/rules/call_transaction_authority_check.js +3 -3
- package/build/src/rules/cds_comment_style.js +4 -4
- package/build/src/rules/cds_legacy_view.js +4 -4
- package/build/src/rules/chain_mainly_declarations.js +4 -4
- package/build/src/rules/change_if_to_case.js +8 -8
- package/build/src/rules/check_abstract.js +2 -2
- package/build/src/rules/check_comments.js +4 -4
- package/build/src/rules/check_include.js +3 -3
- package/build/src/rules/check_subrc.js +8 -8
- package/build/src/rules/classic_exceptions_overlap.js +8 -8
- package/build/src/rules/commented_code.js +1 -1
- package/build/src/rules/constructor_visibility_public.js +4 -4
- package/build/src/rules/contains_tab.js +2 -2
- package/build/src/rules/cyclic_oo.js +2 -2
- package/build/src/rules/dangerous_statement.js +1 -1
- package/build/src/rules/definitions_top.js +2 -2
- package/build/src/rules/downport.js +83 -83
- package/build/src/rules/exit_or_check.js +3 -3
- package/build/src/rules/exporting.js +1 -1
- package/build/src/rules/forbidden_identifier.js +1 -1
- package/build/src/rules/forbidden_void_type.js +2 -2
- package/build/src/rules/functional_writing.js +17 -17
- package/build/src/rules/global_class.js +8 -8
- package/build/src/rules/identical_conditions.js +2 -2
- package/build/src/rules/identical_contents.js +14 -14
- package/build/src/rules/identical_descriptions.js +6 -6
- package/build/src/rules/if_in_if.js +26 -26
- package/build/src/rules/implement_methods.js +3 -3
- package/build/src/rules/in_statement_indentation.js +11 -11
- package/build/src/rules/intf_referencing_clas.js +3 -3
- package/build/src/rules/line_break_style.js +2 -2
- package/build/src/rules/line_length.js +1 -1
- package/build/src/rules/line_only_punc.js +1 -1
- package/build/src/rules/local_variable_names.js +2 -2
- package/build/src/rules/main_file_contents.js +4 -4
- package/build/src/rules/many_parentheses.js +10 -10
- package/build/src/rules/max_one_method_parameter_per_line.js +7 -7
- package/build/src/rules/max_one_statement.js +5 -5
- package/build/src/rules/method_overwrites_builtin.js +2 -2
- package/build/src/rules/nesting.js +1 -1
- package/build/src/rules/no_chained_assignment.js +1 -1
- package/build/src/rules/no_external_form_calls.js +2 -2
- package/build/src/rules/no_inline_in_optional_branches.js +11 -11
- package/build/src/rules/no_public_attributes.js +1 -1
- package/build/src/rules/no_yoda_conditions.js +4 -4
- package/build/src/rules/nrob_consistency.js +2 -2
- package/build/src/rules/obsolete_statement.js +42 -42
- package/build/src/rules/omit_parameter_name.js +3 -3
- package/build/src/rules/omit_receiving.js +13 -13
- package/build/src/rules/parser_702_chaining.js +2 -2
- package/build/src/rules/parser_error.js +2 -2
- package/build/src/rules/parser_missing_space.js +1 -1
- package/build/src/rules/prefer_inline.js +16 -16
- package/build/src/rules/prefer_is_not.js +7 -7
- package/build/src/rules/prefer_raise_exception_new.js +3 -3
- package/build/src/rules/prefer_returning_to_exporting.js +1 -1
- package/build/src/rules/prefer_xsdbool.js +2 -2
- package/build/src/rules/remove_descriptions.js +4 -4
- package/build/src/rules/rfc_error_handling.js +9 -9
- package/build/src/rules/select_add_order_by.js +5 -5
- package/build/src/rules/select_performance.js +5 -5
- package/build/src/rules/sicf_consistency.js +2 -2
- package/build/src/rules/space_before_dot.js +2 -2
- package/build/src/rules/start_at_tab.js +1 -1
- package/build/src/rules/sy_modification.js +4 -4
- package/build/src/rules/tabl_enhancement_category.js +2 -2
- package/build/src/rules/unnecessary_pragma.js +22 -22
- package/build/src/rules/unnecessary_return.js +5 -5
- package/build/src/rules/unused_methods.js +9 -9
- package/build/src/rules/unused_variables.js +4 -4
- package/build/src/rules/use_bool_expression.js +8 -8
- package/build/src/rules/use_line_exists.js +6 -6
- package/build/src/rules/use_new.js +4 -4
- package/build/src/rules/when_others_last.js +6 -6
- package/package.json +66 -66
|
@@ -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
|
};
|