@abaplint/core 2.108.4 → 2.108.6
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/build/abaplint.d.ts +7 -0
- package/build/adhoc/syntax_performance.js +165 -165
- package/build/src/abap/flow/flow_graph.js +7 -7
- package/build/src/lsp/help.js +7 -7
- package/build/src/objects/transaction.js +30 -2
- package/build/src/registry.js +1 -1
- package/build/src/rules/7bit_ascii.js +4 -4
- package/build/src/rules/abapdoc.js +4 -4
- package/build/src/rules/align_parameters.js +40 -40
- package/build/src/rules/align_type_expressions.js +28 -28
- package/build/src/rules/ambiguous_statement.js +6 -6
- package/build/src/rules/avoid_use.js +10 -10
- package/build/src/rules/begin_end_names.js +4 -4
- package/build/src/rules/begin_single_include.js +13 -13
- 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 +10 -10
- 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 +4 -4
- package/build/src/rules/dangerous_statement.js +1 -1
- package/build/src/rules/definitions_top.js +6 -6
- package/build/src/rules/downport.js +102 -82
- package/build/src/rules/easy_to_find_messages.js +6 -6
- package/build/src/rules/empty_line_in_statement.js +2 -2
- package/build/src/rules/empty_structure.js +6 -6
- package/build/src/rules/exit_or_check.js +3 -3
- package/build/src/rules/expand_macros.js +5 -5
- 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/fully_type_itabs.js +1 -1
- 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 +12 -12
- 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 +35 -35
- package/build/src/rules/implement_methods.js +3 -3
- package/build/src/rules/in_statement_indentation.js +11 -11
- package/build/src/rules/indentation.js +16 -16
- package/build/src/rules/intf_referencing_clas.js +3 -3
- package/build/src/rules/invalid_table_index.js +2 -2
- package/build/src/rules/keyword_case.js +5 -2
- 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 +6 -6
- 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_length.js +2 -2
- package/build/src/rules/method_overwrites_builtin.js +12 -12
- package/build/src/rules/mix_returning.js +6 -6
- 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_prefixes.js +6 -6
- 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 +51 -51
- 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 +9 -9
- package/build/src/rules/prefer_raise_exception_new.js +5 -5
- package/build/src/rules/prefer_returning_to_exporting.js +4 -4
- package/build/src/rules/prefer_xsdbool.js +2 -2
- package/build/src/rules/preferred_compare_operator.js +2 -2
- package/build/src/rules/reduce_procedural_code.js +17 -17
- 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/select_single_full_key.js +2 -2
- package/build/src/rules/sicf_consistency.js +2 -2
- package/build/src/rules/slow_parameter_passing.js +16 -16
- package/build/src/rules/space_before_dot.js +2 -2
- package/build/src/rules/sql_value_conversion.js +6 -6
- package/build/src/rules/start_at_tab.js +1 -1
- package/build/src/rules/strict_sql.js +6 -6
- package/build/src/rules/sy_modification.js +3 -3
- package/build/src/rules/tabl_enhancement_category.js +2 -2
- package/build/src/rules/type_form_parameters.js +2 -2
- package/build/src/rules/unnecessary_pragma.js +29 -29
- package/build/src/rules/unnecessary_return.js +11 -11
- package/build/src/rules/unused_methods.js +11 -11
- package/build/src/rules/unused_variables.js +12 -12
- package/build/src/rules/use_bool_expression.js +8 -8
- package/build/src/rules/use_class_based_exceptions.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 +70 -70
|
@@ -125,39 +125,39 @@ class Downport {
|
|
|
125
125
|
key: "downport",
|
|
126
126
|
title: "Downport statement",
|
|
127
127
|
shortDescription: `Downport functionality`,
|
|
128
|
-
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
129
|
-
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
130
|
-
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
131
|
-
|
|
132
|
-
Current rules:
|
|
133
|
-
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
134
|
-
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
135
|
-
* FIELD-SYMBOL() definitions are outlined
|
|
136
|
-
* CONV is outlined
|
|
137
|
-
* COND is outlined
|
|
138
|
-
* REDUCE is outlined
|
|
139
|
-
* SWITCH is outlined
|
|
140
|
-
* FILTER is outlined
|
|
141
|
-
* APPEND expression is outlined
|
|
142
|
-
* INSERT expression is outlined
|
|
143
|
-
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
144
|
-
* CAST changed to ?=
|
|
145
|
-
* LOOP AT method_call( ) is outlined
|
|
146
|
-
* VALUE # with structure fields
|
|
147
|
-
* VALUE # with internal table lines
|
|
148
|
-
* Table Expressions are outlined
|
|
149
|
-
* SELECT INTO @DATA definitions are outlined
|
|
150
|
-
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
151
|
-
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
152
|
-
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
153
|
-
* RAISE EXCEPTION ... MESSAGE
|
|
154
|
-
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
155
|
-
* line_exists and line_index is downported to READ TABLE
|
|
156
|
-
* ENUMs, but does not nessesarily give the correct type and value
|
|
157
|
-
* MESSAGE with non simple source
|
|
158
|
-
|
|
159
|
-
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
160
|
-
|
|
128
|
+
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
129
|
+
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
130
|
+
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
131
|
+
|
|
132
|
+
Current rules:
|
|
133
|
+
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
134
|
+
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
135
|
+
* FIELD-SYMBOL() definitions are outlined
|
|
136
|
+
* CONV is outlined
|
|
137
|
+
* COND is outlined
|
|
138
|
+
* REDUCE is outlined
|
|
139
|
+
* SWITCH is outlined
|
|
140
|
+
* FILTER is outlined
|
|
141
|
+
* APPEND expression is outlined
|
|
142
|
+
* INSERT expression is outlined
|
|
143
|
+
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
144
|
+
* CAST changed to ?=
|
|
145
|
+
* LOOP AT method_call( ) is outlined
|
|
146
|
+
* VALUE # with structure fields
|
|
147
|
+
* VALUE # with internal table lines
|
|
148
|
+
* Table Expressions are outlined
|
|
149
|
+
* SELECT INTO @DATA definitions are outlined
|
|
150
|
+
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
151
|
+
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
152
|
+
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
153
|
+
* RAISE EXCEPTION ... MESSAGE
|
|
154
|
+
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
155
|
+
* line_exists and line_index is downported to READ TABLE
|
|
156
|
+
* ENUMs, but does not nessesarily give the correct type and value
|
|
157
|
+
* MESSAGE with non simple source
|
|
158
|
+
|
|
159
|
+
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
160
|
+
|
|
161
161
|
Make sure to test the downported code, it might not always be completely correct.`,
|
|
162
162
|
tags: [_irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
|
|
163
163
|
};
|
|
@@ -521,6 +521,10 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
521
521
|
if (found) {
|
|
522
522
|
return found;
|
|
523
523
|
}
|
|
524
|
+
found = this.downportMessageSource(high, lowFile, highSyntax);
|
|
525
|
+
if (found) {
|
|
526
|
+
return found;
|
|
527
|
+
}
|
|
524
528
|
found = this.downportMessage(high, lowFile, highSyntax);
|
|
525
529
|
if (found) {
|
|
526
530
|
return found;
|
|
@@ -731,10 +735,10 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
731
735
|
const fieldName = f.concatTokens();
|
|
732
736
|
fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
|
|
733
737
|
}
|
|
734
|
-
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
738
|
+
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
735
739
|
${fieldDefinition}${indentation} END OF ${name}.`;
|
|
736
740
|
}
|
|
737
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
741
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
738
742
|
${indentation}`);
|
|
739
743
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
740
744
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -778,12 +782,12 @@ ${indentation}`);
|
|
|
778
782
|
}
|
|
779
783
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
780
784
|
const name = ((_c = inlineData.findFirstExpression(Expressions.TargetField)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "error";
|
|
781
|
-
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
782
|
-
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
783
|
-
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
785
|
+
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
786
|
+
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
787
|
+
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
784
788
|
${indentation}`);
|
|
785
789
|
if (fieldDefinitions === "") {
|
|
786
|
-
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
790
|
+
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
787
791
|
${indentation}`);
|
|
788
792
|
}
|
|
789
793
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
@@ -851,7 +855,7 @@ ${indentation}`);
|
|
|
851
855
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
852
856
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
853
857
|
const firstToken = high.getFirstToken();
|
|
854
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
858
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
855
859
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
856
860
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
857
861
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -875,6 +879,22 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
875
879
|
}
|
|
876
880
|
return undefined;
|
|
877
881
|
}
|
|
882
|
+
downportMessageSource(high, lowFile, highSyntax) {
|
|
883
|
+
if (!(high.get() instanceof Statements.Message)) {
|
|
884
|
+
return undefined;
|
|
885
|
+
}
|
|
886
|
+
const source = high.findExpressionAfterToken("MESSAGE");
|
|
887
|
+
if ((source === null || source === void 0 ? void 0 : source.get()) instanceof Expressions.Source) {
|
|
888
|
+
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
889
|
+
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
890
|
+
const firstToken = high.getFirstToken();
|
|
891
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA(${uniqueName}) = ${source.concatTokens()}.\n` + indentation);
|
|
892
|
+
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
893
|
+
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
894
|
+
return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Outline message source", this.getMetadata().key, this.conf.severity, fix);
|
|
895
|
+
}
|
|
896
|
+
return undefined;
|
|
897
|
+
}
|
|
878
898
|
replaceInsertExpression(high, lowFile, highSyntax) {
|
|
879
899
|
if (!(high.get() instanceof Statements.InsertInternal)) {
|
|
880
900
|
return undefined;
|
|
@@ -889,7 +909,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
889
909
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
890
910
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
891
911
|
const firstToken = high.getFirstToken();
|
|
892
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
912
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
893
913
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
894
914
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
895
915
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -931,14 +951,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
931
951
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
932
952
|
const firstToken = high.getFirstToken();
|
|
933
953
|
// note that the tabix restore should be done before throwing the exception
|
|
934
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
935
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
936
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
937
|
-
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
938
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
939
|
-
${indentation}IF sy-subrc <> 0.
|
|
940
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
941
|
-
${indentation}ENDIF.
|
|
954
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
955
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
956
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
957
|
+
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
958
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
959
|
+
${indentation}IF sy-subrc <> 0.
|
|
960
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
961
|
+
${indentation}ENDIF.
|
|
942
962
|
${indentation}`);
|
|
943
963
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
|
|
944
964
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -995,7 +1015,7 @@ ${indentation}`);
|
|
|
995
1015
|
const className = classNames[0].concatTokens();
|
|
996
1016
|
const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
997
1017
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
998
|
-
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
1018
|
+
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
999
1019
|
${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
1000
1020
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
|
|
1001
1021
|
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -1157,16 +1177,16 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
1157
1177
|
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1158
1178
|
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1159
1179
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
1160
|
-
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
1161
|
-
${indentation}${uniqueName1}-msgid = ${id}.
|
|
1180
|
+
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
1181
|
+
${indentation}${uniqueName1}-msgid = ${id}.
|
|
1162
1182
|
${indentation}${uniqueName1}-msgno = ${number}.\n`;
|
|
1163
1183
|
if (withs.length > 0) {
|
|
1164
|
-
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
1165
|
-
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
1166
|
-
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
1184
|
+
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
1185
|
+
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
1186
|
+
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
1167
1187
|
${indentation}${uniqueName1}-attr4 = 'IF_T100_DYN_MSG~MSGV4'.\n`;
|
|
1168
1188
|
}
|
|
1169
|
-
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
1189
|
+
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
1170
1190
|
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`;
|
|
1171
1191
|
if (withs.length > 0) {
|
|
1172
1192
|
abap += `${indentation}${uniqueName2}->if_t100_dyn_msg~msgty = 'E'.\n`;
|
|
@@ -1278,10 +1298,10 @@ ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`
|
|
|
1278
1298
|
let code = "";
|
|
1279
1299
|
if (sourceRef.findFirstExpression(Expressions.TableExpression)) {
|
|
1280
1300
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1281
|
-
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
1282
|
-
IF sy-subrc <> 0.
|
|
1283
|
-
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1284
|
-
ENDIF.
|
|
1301
|
+
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
1302
|
+
IF sy-subrc <> 0.
|
|
1303
|
+
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1304
|
+
ENDIF.
|
|
1285
1305
|
GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
1286
1306
|
}
|
|
1287
1307
|
else {
|
|
@@ -1370,20 +1390,20 @@ GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
|
1370
1390
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1371
1391
|
const uniqueFS = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1372
1392
|
const uniqueNameIndex = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1373
|
-
code += ` items LIKE ${loopSourceName},
|
|
1374
|
-
END OF ${groupTargetName}type.
|
|
1375
|
-
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
1376
|
-
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
1393
|
+
code += ` items LIKE ${loopSourceName},
|
|
1394
|
+
END OF ${groupTargetName}type.
|
|
1395
|
+
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
1396
|
+
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
1377
1397
|
LOOP AT ${loopSourceName} ${(_l = high.findFirstExpression(Expressions.LoopTarget)) === null || _l === void 0 ? void 0 : _l.concatTokens()}.\n`;
|
|
1378
1398
|
if (groupIndexName !== undefined) {
|
|
1379
1399
|
code += `DATA(${uniqueNameIndex}) = sy-tabix.\n`;
|
|
1380
1400
|
}
|
|
1381
|
-
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
1401
|
+
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
1382
1402
|
IF sy-subrc = 0.\n`;
|
|
1383
1403
|
if (groupCountName !== undefined) {
|
|
1384
1404
|
code += ` <${uniqueFS}>-${groupCountName} = <${uniqueFS}>-${groupCountName} + 1.\n`;
|
|
1385
1405
|
}
|
|
1386
|
-
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
1406
|
+
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
1387
1407
|
ELSE.\n`;
|
|
1388
1408
|
code += ` CLEAR ${uniqueName}.\n`;
|
|
1389
1409
|
for (const c of group.findAllExpressions(Expressions.LoopGroupByComponent)) {
|
|
@@ -1404,8 +1424,8 @@ ELSE.\n`;
|
|
|
1404
1424
|
}
|
|
1405
1425
|
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE ${uniqueName}-items.\n`;
|
|
1406
1426
|
code += ` INSERT ${uniqueName} INTO TABLE ${groupTargetName}tab.\n`;
|
|
1407
|
-
code += `ENDIF.
|
|
1408
|
-
ENDLOOP.
|
|
1427
|
+
code += `ENDIF.
|
|
1428
|
+
ENDLOOP.
|
|
1409
1429
|
LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
1410
1430
|
let fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
|
|
1411
1431
|
for (const l of ((_m = highFile.getStructure()) === null || _m === void 0 ? void 0 : _m.findAllStructures(Structures.Loop)) || []) {
|
|
@@ -1577,7 +1597,7 @@ LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
|
1577
1597
|
const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
1578
1598
|
const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
1579
1599
|
// all ENUMS are char like?
|
|
1580
|
-
let code = `TYPES ${enumName} TYPE string.
|
|
1600
|
+
let code = `TYPES ${enumName} TYPE string.
|
|
1581
1601
|
CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
1582
1602
|
let count = 1;
|
|
1583
1603
|
for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
|
|
@@ -1621,14 +1641,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
|
1621
1641
|
const tabixBackup = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1622
1642
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
1623
1643
|
// restore tabix before exeption
|
|
1624
|
-
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
1625
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1626
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
1627
|
-
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
1628
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
1629
|
-
${indentation}IF sy-subrc <> 0.
|
|
1630
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1631
|
-
${indentation}ENDIF.
|
|
1644
|
+
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
1645
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1646
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
1647
|
+
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
1648
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
1649
|
+
${indentation}IF sy-subrc <> 0.
|
|
1650
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1651
|
+
${indentation}ENDIF.
|
|
1632
1652
|
${indentation}${uniqueName}`;
|
|
1633
1653
|
const start = target.getFirstToken().getStart();
|
|
1634
1654
|
const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
|
|
@@ -1712,11 +1732,11 @@ ${indentation}${uniqueName}`;
|
|
|
1712
1732
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
1713
1733
|
const source = (_b = templateSource === null || templateSource === void 0 ? void 0 : templateSource.findDirectExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
1714
1734
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1715
|
-
const code = `DATA ${uniqueName} TYPE string.
|
|
1716
|
-
${indentation}CALL FUNCTION '${functionName}'
|
|
1717
|
-
${indentation} EXPORTING
|
|
1718
|
-
${indentation} input = ${source}
|
|
1719
|
-
${indentation} IMPORTING
|
|
1735
|
+
const code = `DATA ${uniqueName} TYPE string.
|
|
1736
|
+
${indentation}CALL FUNCTION '${functionName}'
|
|
1737
|
+
${indentation} EXPORTING
|
|
1738
|
+
${indentation} input = ${source}
|
|
1739
|
+
${indentation} IMPORTING
|
|
1720
1740
|
${indentation} output = ${uniqueName}.\n`;
|
|
1721
1741
|
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
|
|
1722
1742
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, child.getFirstToken().getStart(), child.getLastToken().getEnd(), uniqueName);
|
|
@@ -19,12 +19,12 @@ class EasyToFindMessages {
|
|
|
19
19
|
key: "easy_to_find_messages",
|
|
20
20
|
title: "Easy to find messages",
|
|
21
21
|
shortDescription: `Make messages easy to find`,
|
|
22
|
-
extendedInformation: `All messages must be statically referenced exactly once
|
|
23
|
-
|
|
24
|
-
Only MESSAGE and RAISE statments are counted as static references
|
|
25
|
-
|
|
26
|
-
Also see rule "message_exists"
|
|
27
|
-
|
|
22
|
+
extendedInformation: `All messages must be statically referenced exactly once
|
|
23
|
+
|
|
24
|
+
Only MESSAGE and RAISE statments are counted as static references
|
|
25
|
+
|
|
26
|
+
Also see rule "message_exists"
|
|
27
|
+
|
|
28
28
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#make-messages-easy-to-find`,
|
|
29
29
|
tags: [_irule_1.RuleTag.Styleguide],
|
|
30
30
|
};
|
|
@@ -27,8 +27,8 @@ class EmptyLineinStatement extends _abap_rule_1.ABAPRule {
|
|
|
27
27
|
key: "empty_line_in_statement",
|
|
28
28
|
title: "Find empty lines in statements",
|
|
29
29
|
shortDescription: `Checks that statements do not contain empty lines.`,
|
|
30
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
31
|
-
|
|
30
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
31
|
+
|
|
32
32
|
https://docs.abapopenchecks.org/checks/41/`,
|
|
33
33
|
tags: [_irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
34
34
|
badExample: `WRITE\n\nhello.`,
|
|
@@ -46,13 +46,13 @@ class EmptyStructure extends _abap_rule_1.ABAPRule {
|
|
|
46
46
|
shortDescription: `Checks that the code does not contain empty blocks.`,
|
|
47
47
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-empty-if-branches`,
|
|
48
48
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
49
|
-
badExample: `IF foo = bar.
|
|
50
|
-
ENDIF.
|
|
51
|
-
|
|
52
|
-
DO 2 TIMES.
|
|
49
|
+
badExample: `IF foo = bar.
|
|
50
|
+
ENDIF.
|
|
51
|
+
|
|
52
|
+
DO 2 TIMES.
|
|
53
53
|
ENDDO.`,
|
|
54
|
-
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
55
|
-
ENDLOOP.
|
|
54
|
+
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
55
|
+
ENDLOOP.
|
|
56
56
|
result = xsdbool( sy-subrc = 0 ).`,
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -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
|
};
|
|
@@ -21,12 +21,12 @@ class ExpandMacros extends _abap_rule_1.ABAPRule {
|
|
|
21
21
|
key: "expand_macros",
|
|
22
22
|
title: "Expand Macros",
|
|
23
23
|
shortDescription: `Allows expanding macro calls with quick fixes`,
|
|
24
|
-
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
25
|
-
|
|
24
|
+
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
25
|
+
|
|
26
26
|
Note that macros/DEFINE cannot be used in the ABAP Cloud programming model`,
|
|
27
|
-
badExample: `DEFINE _hello.
|
|
28
|
-
WRITE 'hello'.
|
|
29
|
-
END-OF-DEFINITION.
|
|
27
|
+
badExample: `DEFINE _hello.
|
|
28
|
+
WRITE 'hello'.
|
|
29
|
+
END-OF-DEFINITION.
|
|
30
30
|
_hello.`,
|
|
31
31
|
goodExample: `WRITE 'hello'.`,
|
|
32
32
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Upport],
|
|
@@ -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
|
}
|
|
@@ -20,7 +20,7 @@ class FullyTypeITabs extends _abap_rule_1.ABAPRule {
|
|
|
20
20
|
key: "fully_type_itabs",
|
|
21
21
|
title: "Fully type internal tables",
|
|
22
22
|
shortDescription: `No implict table types or table keys`,
|
|
23
|
-
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
23
|
+
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
24
24
|
DATA lt_bar TYPE STANDARD TABLE OF ty.`,
|
|
25
25
|
goodExample: `DATA lt_foo TYPE STANDARD TABLE OF ty WITH EMPTY KEY.`,
|
|
26
26
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
@@ -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,21 +33,21 @@ 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
|
-
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
41
|
-
ENDIF.
|
|
42
|
-
CASE bar.
|
|
43
|
-
WHEN '1'.
|
|
44
|
-
WHEN 'A' OR '1'.
|
|
40
|
+
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
41
|
+
ENDIF.
|
|
42
|
+
CASE bar.
|
|
43
|
+
WHEN '1'.
|
|
44
|
+
WHEN 'A' OR '1'.
|
|
45
45
|
ENDCASE.`,
|
|
46
|
-
goodExample: `IF foo = bar OR 1 = a.
|
|
47
|
-
ENDIF.
|
|
48
|
-
CASE bar.
|
|
49
|
-
WHEN '1'.
|
|
50
|
-
WHEN 'A'.
|
|
46
|
+
goodExample: `IF foo = bar OR 1 = a.
|
|
47
|
+
ENDIF.
|
|
48
|
+
CASE bar.
|
|
49
|
+
WHEN '1'.
|
|
50
|
+
WHEN 'A'.
|
|
51
51
|
ENDCASE.`,
|
|
52
52
|
};
|
|
53
53
|
}
|
|
@@ -21,23 +21,23 @@ class IdenticalContents extends _abap_rule_1.ABAPRule {
|
|
|
21
21
|
key: "identical_contents",
|
|
22
22
|
title: "Identical contents",
|
|
23
23
|
shortDescription: `Find identical contents in blocks inside IFs, both in the beginning and in the end.`,
|
|
24
|
-
extendedInformation: `
|
|
25
|
-
Prerequsites: code is pretty printed with identical cAsE
|
|
26
|
-
|
|
24
|
+
extendedInformation: `
|
|
25
|
+
Prerequsites: code is pretty printed with identical cAsE
|
|
26
|
+
|
|
27
27
|
Chained statments are ignored`,
|
|
28
28
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
29
|
-
badExample: `IF foo = bar.
|
|
30
|
-
WRITE 'bar'.
|
|
31
|
-
WRITE 'world'.
|
|
32
|
-
ELSE.
|
|
33
|
-
WRITE 'foo'.
|
|
34
|
-
WRITE 'world'.
|
|
29
|
+
badExample: `IF foo = bar.
|
|
30
|
+
WRITE 'bar'.
|
|
31
|
+
WRITE 'world'.
|
|
32
|
+
ELSE.
|
|
33
|
+
WRITE 'foo'.
|
|
34
|
+
WRITE 'world'.
|
|
35
35
|
ENDIF.`,
|
|
36
|
-
goodExample: `IF foo = bar.
|
|
37
|
-
WRITE 'bar'.
|
|
38
|
-
ELSE.
|
|
39
|
-
WRITE 'foo'.
|
|
40
|
-
ENDIF.
|
|
36
|
+
goodExample: `IF foo = bar.
|
|
37
|
+
WRITE 'bar'.
|
|
38
|
+
ELSE.
|
|
39
|
+
WRITE 'foo'.
|
|
40
|
+
ENDIF.
|
|
41
41
|
WRITE 'world'.`,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
@@ -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
|
};
|