@abaplint/core 2.113.85 → 2.113.86
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/src/abap/2_statements/statements/assign.js +1 -1
- package/build/src/abap/2_statements/statements/call_ole.js +1 -1
- package/build/src/abap/2_statements/statements/get_property.js +1 -1
- package/build/src/abap/2_statements/statements/modify_line.js +1 -1
- package/build/src/abap/2_statements/statements/scroll_list.js +2 -1
- package/build/src/abap/5_syntax/statements/loop.js +1 -5
- package/build/src/abap/flow/flow_graph.js +7 -7
- package/build/src/lsp/help.js +10 -10
- package/build/src/objects/_abap_object.js +4 -1
- 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/add_test_attributes.js +20 -20
- 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 +7 -7
- 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 +82 -82
- package/build/src/rules/easy_to_find_messages.js +6 -6
- package/build/src/rules/empty_event.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 +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 +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/implicit_start_of_selection.js +5 -5
- 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/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/macro_naming.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_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 +7 -7
- 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/tables_declared_locally.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_macros.js +6 -6
- package/build/src/rules/unused_methods.js +12 -12
- 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
|
@@ -27,11 +27,11 @@ class CheckComments extends _abap_rule_1.ABAPRule {
|
|
|
27
27
|
return {
|
|
28
28
|
key: "check_comments",
|
|
29
29
|
title: "Check Comments",
|
|
30
|
-
shortDescription: `
|
|
30
|
+
shortDescription: `
|
|
31
31
|
Various checks for comment usage.`,
|
|
32
|
-
extendedInformation: `
|
|
33
|
-
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
34
|
-
|
|
32
|
+
extendedInformation: `
|
|
33
|
+
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
34
|
+
|
|
35
35
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comments-before-the-statement-they-relate-to`,
|
|
36
36
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
37
37
|
badExample: `WRITE 2. " descriptive comment`,
|
|
@@ -17,9 +17,9 @@ class CheckInclude {
|
|
|
17
17
|
key: "check_include",
|
|
18
18
|
title: "Check INCLUDEs",
|
|
19
19
|
shortDescription: `Checks INCLUDE statements`,
|
|
20
|
-
extendedInformation: `
|
|
21
|
-
* Reports unused includes
|
|
22
|
-
* Errors if the includes are not found
|
|
20
|
+
extendedInformation: `
|
|
21
|
+
* Reports unused includes
|
|
22
|
+
* Errors if the includes are not found
|
|
23
23
|
* Error if including a main program`,
|
|
24
24
|
tags: [_irule_1.RuleTag.Syntax],
|
|
25
25
|
};
|
|
@@ -35,14 +35,14 @@ class CheckSubrc extends _abap_rule_1.ABAPRule {
|
|
|
35
35
|
key: "check_subrc",
|
|
36
36
|
title: "Check sy-subrc",
|
|
37
37
|
shortDescription: `Check sy-subrc`,
|
|
38
|
-
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
39
|
-
|
|
40
|
-
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
41
|
-
|
|
42
|
-
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
43
|
-
|
|
44
|
-
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
45
|
-
|
|
38
|
+
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
39
|
+
|
|
40
|
+
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
41
|
+
|
|
42
|
+
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
43
|
+
|
|
44
|
+
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
45
|
+
|
|
46
46
|
FIND statement with MATCH COUNT is considered okay if subrc is not checked`,
|
|
47
47
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
48
48
|
pseudoComment: "EC CI_SUBRC",
|
|
@@ -21,17 +21,17 @@ class ClassicExceptionsOverlap extends _abap_rule_1.ABAPRule {
|
|
|
21
21
|
shortDescription: `Find overlapping classic exceptions`,
|
|
22
22
|
extendedInformation: `When debugging its typically good to know exactly which exception is caught`,
|
|
23
23
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
24
|
-
badExample: `CALL FUNCTION 'SOMETHING'
|
|
25
|
-
EXCEPTIONS
|
|
26
|
-
system_failure = 1 MESSAGE lv_message
|
|
27
|
-
communication_failure = 1 MESSAGE lv_message
|
|
28
|
-
resource_failure = 1
|
|
24
|
+
badExample: `CALL FUNCTION 'SOMETHING'
|
|
25
|
+
EXCEPTIONS
|
|
26
|
+
system_failure = 1 MESSAGE lv_message
|
|
27
|
+
communication_failure = 1 MESSAGE lv_message
|
|
28
|
+
resource_failure = 1
|
|
29
29
|
OTHERS = 1.`,
|
|
30
|
-
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
31
|
-
EXCEPTIONS
|
|
32
|
-
system_failure = 1 MESSAGE lv_message
|
|
33
|
-
communication_failure = 2 MESSAGE lv_message
|
|
34
|
-
resource_failure = 3
|
|
30
|
+
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
31
|
+
EXCEPTIONS
|
|
32
|
+
system_failure = 1 MESSAGE lv_message
|
|
33
|
+
communication_failure = 2 MESSAGE lv_message
|
|
34
|
+
resource_failure = 3
|
|
35
35
|
OTHERS = 4.`,
|
|
36
36
|
};
|
|
37
37
|
}
|
|
@@ -30,7 +30,7 @@ class CommentedCode extends _abap_rule_1.ABAPRule {
|
|
|
30
30
|
key: "commented_code",
|
|
31
31
|
title: "Find commented code",
|
|
32
32
|
shortDescription: `Detects usage of commented out code.`,
|
|
33
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
33
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
34
34
|
https://docs.abapopenchecks.org/checks/14/`,
|
|
35
35
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
36
36
|
badExample: `* WRITE 'hello world'.`,
|
|
@@ -18,10 +18,10 @@ class ConstructorVisibilityPublic {
|
|
|
18
18
|
key: "constructor_visibility_public",
|
|
19
19
|
title: "Check constructor visibility is public",
|
|
20
20
|
shortDescription: `Constructor must be placed in the public section, even if the class is not CREATE PUBLIC.`,
|
|
21
|
-
extendedInformation: `
|
|
22
|
-
This only applies to global classes.
|
|
23
|
-
|
|
24
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
21
|
+
extendedInformation: `
|
|
22
|
+
This only applies to global classes.
|
|
23
|
+
|
|
24
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
25
25
|
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abeninstance_constructor_guidl.htm`,
|
|
26
26
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
27
27
|
};
|
|
@@ -25,8 +25,8 @@ class ContainsTab extends _abap_rule_1.ABAPRule {
|
|
|
25
25
|
key: "contains_tab",
|
|
26
26
|
title: "Code contains tab",
|
|
27
27
|
shortDescription: `Checks for usage of tabs (enable to enforce spaces)`,
|
|
28
|
-
extendedInformation: `
|
|
29
|
-
https://docs.abapopenchecks.org/checks/09/
|
|
28
|
+
extendedInformation: `
|
|
29
|
+
https://docs.abapopenchecks.org/checks/09/
|
|
30
30
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#indent-and-snap-to-tab`,
|
|
31
31
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
32
32
|
badExample: `\tWRITE 'hello world'.`,
|
|
@@ -32,10 +32,10 @@ class CyclicOO {
|
|
|
32
32
|
key: "cyclic_oo",
|
|
33
33
|
title: "Cyclic OO",
|
|
34
34
|
shortDescription: `Finds cyclic/circular OO references`,
|
|
35
|
-
extendedInformation: `Runs for global INTF + CLAS objects
|
|
36
|
-
|
|
37
|
-
Objects must be without syntax errors for this rule to take effect
|
|
38
|
-
|
|
35
|
+
extendedInformation: `Runs for global INTF + CLAS objects
|
|
36
|
+
|
|
37
|
+
Objects must be without syntax errors for this rule to take effect
|
|
38
|
+
|
|
39
39
|
References in testclass includes are ignored`,
|
|
40
40
|
};
|
|
41
41
|
}
|
|
@@ -41,7 +41,7 @@ class DangerousStatement extends _abap_rule_1.ABAPRule {
|
|
|
41
41
|
key: "dangerous_statement",
|
|
42
42
|
title: "Dangerous statement",
|
|
43
43
|
shortDescription: `Detects potentially dangerous statements`,
|
|
44
|
-
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
44
|
+
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
45
45
|
dynamic SQL can potentially create SQL injection problems`,
|
|
46
46
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Security],
|
|
47
47
|
};
|
|
@@ -30,13 +30,13 @@ class DefinitionsTop extends _abap_rule_1.ABAPRule {
|
|
|
30
30
|
shortDescription: `Checks that definitions are placed at the beginning of METHODs, FORMs and FUNCTIONs.`,
|
|
31
31
|
extendedInformation: `https://docs.abapopenchecks.org/checks/17/`,
|
|
32
32
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
33
|
-
badExample: `FROM foo.
|
|
34
|
-
WRITE 'hello'.
|
|
35
|
-
DATA int TYPE i.
|
|
33
|
+
badExample: `FROM foo.
|
|
34
|
+
WRITE 'hello'.
|
|
35
|
+
DATA int TYPE i.
|
|
36
36
|
ENDFORM.`,
|
|
37
|
-
goodExample: `FROM foo.
|
|
38
|
-
DATA int TYPE i.
|
|
39
|
-
WRITE 'hello'.
|
|
37
|
+
goodExample: `FROM foo.
|
|
38
|
+
DATA int TYPE i.
|
|
39
|
+
WRITE 'hello'.
|
|
40
40
|
ENDFORM.`,
|
|
41
41
|
};
|
|
42
42
|
}
|
|
@@ -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
|
};
|
|
@@ -772,10 +772,10 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
772
772
|
const fieldName = f.concatTokens();
|
|
773
773
|
fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
|
|
774
774
|
}
|
|
775
|
-
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
775
|
+
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
776
776
|
${fieldDefinition}${indentation} END OF ${name}.`;
|
|
777
777
|
}
|
|
778
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
778
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
779
779
|
${indentation}`);
|
|
780
780
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
781
781
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -834,12 +834,12 @@ ${indentation}`);
|
|
|
834
834
|
}
|
|
835
835
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
836
836
|
const name = ((_g = inlineData.findFirstExpression(Expressions.TargetField)) === null || _g === void 0 ? void 0 : _g.concatTokens()) || "error";
|
|
837
|
-
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
838
|
-
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
839
|
-
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
837
|
+
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
838
|
+
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
839
|
+
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
840
840
|
${indentation}`);
|
|
841
841
|
if (fieldDefinitions === "") {
|
|
842
|
-
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
842
|
+
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
843
843
|
${indentation}`);
|
|
844
844
|
}
|
|
845
845
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
@@ -907,7 +907,7 @@ ${indentation}`);
|
|
|
907
907
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
908
908
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
909
909
|
const firstToken = high.getFirstToken();
|
|
910
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
910
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
911
911
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
912
912
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
913
913
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -961,7 +961,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
961
961
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
962
962
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
963
963
|
const firstToken = high.getFirstToken();
|
|
964
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
964
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
965
965
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
966
966
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
967
967
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -1003,14 +1003,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
1003
1003
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
1004
1004
|
const firstToken = high.getFirstToken();
|
|
1005
1005
|
// note that the tabix restore should be done before throwing the exception
|
|
1006
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
1007
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1008
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
1009
|
-
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
1010
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
1011
|
-
${indentation}IF sy-subrc <> 0.
|
|
1012
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1013
|
-
${indentation}ENDIF.
|
|
1006
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
1007
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1008
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
1009
|
+
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
1010
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
1011
|
+
${indentation}IF sy-subrc <> 0.
|
|
1012
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1013
|
+
${indentation}ENDIF.
|
|
1014
1014
|
${indentation}`);
|
|
1015
1015
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
|
|
1016
1016
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -1067,7 +1067,7 @@ ${indentation}`);
|
|
|
1067
1067
|
const className = classNames[0].concatTokens();
|
|
1068
1068
|
const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
1069
1069
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
1070
|
-
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
1070
|
+
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
1071
1071
|
${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
1072
1072
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
|
|
1073
1073
|
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -1229,16 +1229,16 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
1229
1229
|
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1230
1230
|
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1231
1231
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
1232
|
-
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
1233
|
-
${indentation}${uniqueName1}-msgid = ${id}.
|
|
1232
|
+
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
1233
|
+
${indentation}${uniqueName1}-msgid = ${id}.
|
|
1234
1234
|
${indentation}${uniqueName1}-msgno = ${number}.\n`;
|
|
1235
1235
|
if (withs.length > 0) {
|
|
1236
|
-
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
1237
|
-
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
1238
|
-
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
1236
|
+
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
1237
|
+
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
1238
|
+
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
1239
1239
|
${indentation}${uniqueName1}-attr4 = 'IF_T100_DYN_MSG~MSGV4'.\n`;
|
|
1240
1240
|
}
|
|
1241
|
-
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
1241
|
+
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
1242
1242
|
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`;
|
|
1243
1243
|
if (withs.length > 0) {
|
|
1244
1244
|
abap += `${indentation}${uniqueName2}->if_t100_dyn_msg~msgty = 'E'.\n`;
|
|
@@ -1350,10 +1350,10 @@ ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`
|
|
|
1350
1350
|
let code = "";
|
|
1351
1351
|
if (sourceRef.findFirstExpression(Expressions.TableExpression)) {
|
|
1352
1352
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1353
|
-
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
1354
|
-
IF sy-subrc <> 0.
|
|
1355
|
-
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1356
|
-
ENDIF.
|
|
1353
|
+
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
1354
|
+
IF sy-subrc <> 0.
|
|
1355
|
+
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1356
|
+
ENDIF.
|
|
1357
1357
|
GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
1358
1358
|
}
|
|
1359
1359
|
else {
|
|
@@ -1442,20 +1442,20 @@ GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
|
1442
1442
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1443
1443
|
const uniqueFS = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1444
1444
|
const uniqueNameIndex = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1445
|
-
code += ` items LIKE ${loopSourceName},
|
|
1446
|
-
END OF ${groupTargetName}type.
|
|
1447
|
-
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
1448
|
-
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
1445
|
+
code += ` items LIKE ${loopSourceName},
|
|
1446
|
+
END OF ${groupTargetName}type.
|
|
1447
|
+
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
1448
|
+
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
1449
1449
|
LOOP AT ${loopSourceName} ${(_l = high.findFirstExpression(Expressions.LoopTarget)) === null || _l === void 0 ? void 0 : _l.concatTokens()}.\n`;
|
|
1450
1450
|
if (groupIndexName !== undefined) {
|
|
1451
1451
|
code += `DATA(${uniqueNameIndex}) = sy-tabix.\n`;
|
|
1452
1452
|
}
|
|
1453
|
-
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
1453
|
+
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
1454
1454
|
IF sy-subrc = 0.\n`;
|
|
1455
1455
|
if (groupCountName !== undefined) {
|
|
1456
1456
|
code += ` <${uniqueFS}>-${groupCountName} = <${uniqueFS}>-${groupCountName} + 1.\n`;
|
|
1457
1457
|
}
|
|
1458
|
-
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
1458
|
+
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
1459
1459
|
ELSE.\n`;
|
|
1460
1460
|
code += ` CLEAR ${uniqueName}.\n`;
|
|
1461
1461
|
for (const c of group.findAllExpressions(Expressions.LoopGroupByComponent)) {
|
|
@@ -1476,8 +1476,8 @@ ELSE.\n`;
|
|
|
1476
1476
|
}
|
|
1477
1477
|
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE ${uniqueName}-items.\n`;
|
|
1478
1478
|
code += ` INSERT ${uniqueName} INTO TABLE ${groupTargetName}tab.\n`;
|
|
1479
|
-
code += `ENDIF.
|
|
1480
|
-
ENDLOOP.
|
|
1479
|
+
code += `ENDIF.
|
|
1480
|
+
ENDLOOP.
|
|
1481
1481
|
LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
1482
1482
|
let fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
|
|
1483
1483
|
for (const l of ((_m = highFile.getStructure()) === null || _m === void 0 ? void 0 : _m.findAllStructures(Structures.Loop)) || []) {
|
|
@@ -1649,7 +1649,7 @@ LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
|
1649
1649
|
const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
1650
1650
|
const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
1651
1651
|
// all ENUMS are char like?
|
|
1652
|
-
let code = `TYPES ${enumName} TYPE string.
|
|
1652
|
+
let code = `TYPES ${enumName} TYPE string.
|
|
1653
1653
|
CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
1654
1654
|
let count = 1;
|
|
1655
1655
|
for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
|
|
@@ -1693,14 +1693,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
|
1693
1693
|
const tabixBackup = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1694
1694
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
1695
1695
|
// restore tabix before exeption
|
|
1696
|
-
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
1697
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1698
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
1699
|
-
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
1700
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
1701
|
-
${indentation}IF sy-subrc <> 0.
|
|
1702
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1703
|
-
${indentation}ENDIF.
|
|
1696
|
+
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
1697
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
1698
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
1699
|
+
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
1700
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
1701
|
+
${indentation}IF sy-subrc <> 0.
|
|
1702
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
1703
|
+
${indentation}ENDIF.
|
|
1704
1704
|
${indentation}${uniqueName}`;
|
|
1705
1705
|
const start = target.getFirstToken().getStart();
|
|
1706
1706
|
const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
|
|
@@ -1780,11 +1780,11 @@ ${indentation}${uniqueName}`;
|
|
|
1780
1780
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
1781
1781
|
const source = (_b = child.findDirectExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
1782
1782
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1783
|
-
const code = `DATA ${uniqueName} TYPE string.
|
|
1784
|
-
${indentation}CALL FUNCTION '${functionName}'
|
|
1785
|
-
${indentation} EXPORTING
|
|
1786
|
-
${indentation} input = ${source}
|
|
1787
|
-
${indentation} IMPORTING
|
|
1783
|
+
const code = `DATA ${uniqueName} TYPE string.
|
|
1784
|
+
${indentation}CALL FUNCTION '${functionName}'
|
|
1785
|
+
${indentation} EXPORTING
|
|
1786
|
+
${indentation} input = ${source}
|
|
1787
|
+
${indentation} IMPORTING
|
|
1788
1788
|
${indentation} output = ${uniqueName}.\n`;
|
|
1789
1789
|
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
|
|
1790
1790
|
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
|
};
|
|
@@ -23,13 +23,13 @@ class EmptyEvent extends _abap_rule_1.ABAPRule {
|
|
|
23
23
|
shortDescription: `Empty selection screen or list processing event block`,
|
|
24
24
|
extendedInformation: ``,
|
|
25
25
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
26
|
-
badExample: `
|
|
27
|
-
INITIALIZATION.
|
|
28
|
-
WRITE 'hello'.
|
|
26
|
+
badExample: `
|
|
27
|
+
INITIALIZATION.
|
|
28
|
+
WRITE 'hello'.
|
|
29
29
|
END-OF-SELECTION.`,
|
|
30
|
-
goodExample: `
|
|
31
|
-
START-OF-SELECTION.
|
|
32
|
-
PERFORM sdf.
|
|
30
|
+
goodExample: `
|
|
31
|
+
START-OF-SELECTION.
|
|
32
|
+
PERFORM sdf.
|
|
33
33
|
COMMIT WORK.`,
|
|
34
34
|
};
|
|
35
35
|
}
|
|
@@ -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,9 +20,9 @@ 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
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-the-right-table-type
|
|
23
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-the-right-table-type
|
|
24
24
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key`,
|
|
25
|
-
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
25
|
+
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
26
26
|
DATA lt_bar TYPE STANDARD TABLE OF ty.`,
|
|
27
27
|
goodExample: `DATA lt_foo TYPE STANDARD TABLE OF ty WITH EMPTY KEY.`,
|
|
28
28
|
tags: [_irule_1.RuleTag.SingleFile],
|