@abaplint/core 2.91.9 → 2.91.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/build/src/abap/2_statements/expressions/type_table.js +3 -1
- package/build/src/abap/2_statements/statement_parser.js +2 -1
- package/build/src/abap/2_statements/statements/method_def.js +4 -3
- package/build/src/abap/5_syntax/expressions/value_body.js +4 -3
- package/build/src/abap/flow/flow_graph.js +7 -7
- 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 +1 -1
- package/build/src/rules/align_parameters.js +33 -33
- 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_legacy_view.js +4 -2
- package/build/src/rules/chain_mainly_declarations.js +4 -4
- 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/dangerous_statement.js +1 -1
- package/build/src/rules/downport.js +146 -70
- 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 +4 -4
- package/build/src/rules/if_in_if.js +7 -7
- 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/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 +2 -2
- package/build/src/rules/tabl_enhancement_category.js +2 -2
- package/build/src/rules/unknown_types.js +11 -3
- package/build/src/rules/unnecessary_pragma.js +22 -22
- package/build/src/rules/unused_methods.js +9 -9
- package/build/src/rules/unused_variables.js +6 -6
- 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/build/src/rules/xml_consistency.js +1 -2
- package/package.json +65 -65
|
@@ -37,36 +37,36 @@ class Downport {
|
|
|
37
37
|
key: "downport",
|
|
38
38
|
title: "Downport statement",
|
|
39
39
|
shortDescription: `Experimental downport functionality`,
|
|
40
|
-
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
41
|
-
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
42
|
-
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
43
|
-
|
|
44
|
-
Current rules:
|
|
45
|
-
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
46
|
-
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
47
|
-
* FIELD-SYMBOL() definitions are outlined
|
|
48
|
-
* CONV is outlined
|
|
49
|
-
* COND is outlined
|
|
50
|
-
* REDUCE is outlined
|
|
51
|
-
* SWITCH is outlined
|
|
52
|
-
* APPEND expression is outlined
|
|
53
|
-
* INSERT expression is outlined
|
|
54
|
-
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
55
|
-
* CAST changed to ?=
|
|
56
|
-
* LOOP AT method_call( ) is outlined
|
|
57
|
-
* VALUE # with structure fields
|
|
58
|
-
* VALUE # with internal table lines
|
|
59
|
-
* Table Expressions are outlined
|
|
60
|
-
* SELECT INTO @DATA definitions are outlined
|
|
61
|
-
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
62
|
-
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
63
|
-
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
64
|
-
* RAISE EXCEPTION ... MESSAGE
|
|
65
|
-
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
66
|
-
* line_exists and line_index is downported to READ TABLE
|
|
67
|
-
* ENUMs, but does not nessesarily give the correct type and value
|
|
68
|
-
* MESSAGE with non simple source
|
|
69
|
-
|
|
40
|
+
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
41
|
+
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
42
|
+
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
43
|
+
|
|
44
|
+
Current rules:
|
|
45
|
+
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
46
|
+
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
47
|
+
* FIELD-SYMBOL() definitions are outlined
|
|
48
|
+
* CONV is outlined
|
|
49
|
+
* COND is outlined
|
|
50
|
+
* REDUCE is outlined
|
|
51
|
+
* SWITCH is outlined
|
|
52
|
+
* APPEND expression is outlined
|
|
53
|
+
* INSERT expression is outlined
|
|
54
|
+
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
55
|
+
* CAST changed to ?=
|
|
56
|
+
* LOOP AT method_call( ) is outlined
|
|
57
|
+
* VALUE # with structure fields
|
|
58
|
+
* VALUE # with internal table lines
|
|
59
|
+
* Table Expressions are outlined
|
|
60
|
+
* SELECT INTO @DATA definitions are outlined
|
|
61
|
+
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
62
|
+
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
63
|
+
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
64
|
+
* RAISE EXCEPTION ... MESSAGE
|
|
65
|
+
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
66
|
+
* line_exists and line_index is downported to READ TABLE
|
|
67
|
+
* ENUMs, but does not nessesarily give the correct type and value
|
|
68
|
+
* MESSAGE with non simple source
|
|
69
|
+
|
|
70
70
|
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.`,
|
|
71
71
|
tags: [_irule_1.RuleTag.Experimental, _irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
|
|
72
72
|
};
|
|
@@ -188,7 +188,7 @@ Only one transformation is applied to a statement at a time, so multiple steps m
|
|
|
188
188
|
if (found) {
|
|
189
189
|
return found;
|
|
190
190
|
}
|
|
191
|
-
found = this.stringTemplateAlpha(high, lowFile);
|
|
191
|
+
found = this.stringTemplateAlpha(high, lowFile, highSyntax);
|
|
192
192
|
if (found) {
|
|
193
193
|
return found;
|
|
194
194
|
}
|
|
@@ -200,6 +200,14 @@ Only one transformation is applied to a statement at a time, so multiple steps m
|
|
|
200
200
|
if (found) {
|
|
201
201
|
return found;
|
|
202
202
|
}
|
|
203
|
+
found = this.moveWithSimpleRef(high, lowFile);
|
|
204
|
+
if (found) {
|
|
205
|
+
return found;
|
|
206
|
+
}
|
|
207
|
+
found = this.callFunctionParameterSimple(high, lowFile, highSyntax);
|
|
208
|
+
if (found) {
|
|
209
|
+
return found;
|
|
210
|
+
}
|
|
203
211
|
found = this.moveWithTableTarget(low, high, lowFile, highSyntax);
|
|
204
212
|
if (found) {
|
|
205
213
|
return found;
|
|
@@ -411,10 +419,10 @@ Only one transformation is applied to a statement at a time, so multiple steps m
|
|
|
411
419
|
const fieldName = f.concatTokens();
|
|
412
420
|
fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
|
|
413
421
|
}
|
|
414
|
-
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
422
|
+
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
415
423
|
${fieldDefinition}${indentation} END OF ${name}.`;
|
|
416
424
|
}
|
|
417
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
425
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
418
426
|
${indentation}`);
|
|
419
427
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
420
428
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -455,12 +463,12 @@ ${indentation}`);
|
|
|
455
463
|
}
|
|
456
464
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
457
465
|
const name = ((_c = inlineData.findFirstExpression(Expressions.TargetField)) === null || _c === void 0 ? void 0 : _c.concatTokens()) || "error";
|
|
458
|
-
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
459
|
-
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
460
|
-
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
466
|
+
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
467
|
+
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
468
|
+
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
461
469
|
${indentation}`);
|
|
462
470
|
if (fieldDefinitions === "") {
|
|
463
|
-
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
471
|
+
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
464
472
|
${indentation}`);
|
|
465
473
|
}
|
|
466
474
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
@@ -505,7 +513,7 @@ ${indentation}`);
|
|
|
505
513
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
506
514
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
507
515
|
const firstToken = high.getFirstToken();
|
|
508
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
516
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
509
517
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
510
518
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
511
519
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -527,7 +535,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
527
535
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
528
536
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
529
537
|
const firstToken = high.getFirstToken();
|
|
530
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
538
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
531
539
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
532
540
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
533
541
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -566,14 +574,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
566
574
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
567
575
|
const firstToken = node.getFirstToken();
|
|
568
576
|
// note that the tabix restore should be done before throwing the exception
|
|
569
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
570
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
571
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
572
|
-
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
573
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
574
|
-
${indentation}IF sy-subrc <> 0.
|
|
575
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
576
|
-
${indentation}ENDIF.
|
|
577
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
578
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
579
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
580
|
+
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
581
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
582
|
+
${indentation}IF sy-subrc <> 0.
|
|
583
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
584
|
+
${indentation}ENDIF.
|
|
577
585
|
${indentation}`);
|
|
578
586
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
|
|
579
587
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -627,7 +635,7 @@ ${indentation}`);
|
|
|
627
635
|
const className = classNames[0].concatTokens();
|
|
628
636
|
const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
629
637
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
630
|
-
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
638
|
+
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
631
639
|
${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
632
640
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
|
|
633
641
|
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -750,11 +758,11 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
750
758
|
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
751
759
|
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
752
760
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
753
|
-
const abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
754
|
-
${indentation}${uniqueName1}-msgid = ${id === null || id === void 0 ? void 0 : id.toUpperCase()}.
|
|
755
|
-
${indentation}${uniqueName1}-msgno = ${number}.
|
|
756
|
-
${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
757
|
-
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.
|
|
761
|
+
const abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
762
|
+
${indentation}${uniqueName1}-msgid = ${id === null || id === void 0 ? void 0 : id.toUpperCase()}.
|
|
763
|
+
${indentation}${uniqueName1}-msgno = ${number}.
|
|
764
|
+
${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
765
|
+
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.
|
|
758
766
|
${indentation}RAISE EXCEPTION ${uniqueName2}.`;
|
|
759
767
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), abap);
|
|
760
768
|
return issue_1.Issue.atToken(lowFile, startToken, "Downport RAISE MESSAGE", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -779,6 +787,54 @@ ${indentation}RAISE EXCEPTION ${uniqueName2}.`;
|
|
|
779
787
|
}
|
|
780
788
|
return undefined;
|
|
781
789
|
}
|
|
790
|
+
callFunctionParameterSimple(high, lowFile, highSyntax) {
|
|
791
|
+
if (!(high.get() instanceof Statements.CallFunction)) {
|
|
792
|
+
return undefined;
|
|
793
|
+
}
|
|
794
|
+
let found = undefined;
|
|
795
|
+
for (const p of high.findAllExpressions(Expressions.FunctionExportingParameter)) {
|
|
796
|
+
found = p.findDirectExpression(Expressions.Source);
|
|
797
|
+
if (found && (found.findDirectExpression(Expressions.FieldChain)
|
|
798
|
+
|| found.findDirectExpression(Expressions.Constant)
|
|
799
|
+
|| found.findDirectExpression(Expressions.TextElement))) {
|
|
800
|
+
// its actually simple, ok
|
|
801
|
+
found = undefined;
|
|
802
|
+
}
|
|
803
|
+
else if (found !== undefined) {
|
|
804
|
+
break;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
if (found === undefined) {
|
|
808
|
+
return undefined;
|
|
809
|
+
}
|
|
810
|
+
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
811
|
+
const code = `DATA(${uniqueName}) = ${found.concatTokens()}.\n`;
|
|
812
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
|
|
813
|
+
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, found.getFirstToken().getStart(), found.getLastToken().getEnd(), uniqueName);
|
|
814
|
+
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
815
|
+
return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Downport, call function parameter", this.getMetadata().key, this.conf.severity, fix);
|
|
816
|
+
}
|
|
817
|
+
moveWithSimpleRef(high, lowFile) {
|
|
818
|
+
var _a;
|
|
819
|
+
if (!(high.get() instanceof Statements.Move)
|
|
820
|
+
|| high.getChildren().length !== 4
|
|
821
|
+
|| high.getChildren()[2].getFirstToken().getStr().toUpperCase() !== "REF") {
|
|
822
|
+
return undefined;
|
|
823
|
+
}
|
|
824
|
+
const target = high.findDirectExpression(Expressions.Target);
|
|
825
|
+
if (target === undefined) {
|
|
826
|
+
return undefined;
|
|
827
|
+
}
|
|
828
|
+
const sourceRef = (_a = high.findFirstExpression(Expressions.Source)) === null || _a === void 0 ? void 0 : _a.findDirectExpression(Expressions.Source);
|
|
829
|
+
if (sourceRef === undefined || sourceRef.getChildren().length !== 1) {
|
|
830
|
+
return;
|
|
831
|
+
}
|
|
832
|
+
const code = `GET REFERENCE OF ${sourceRef.concatTokens()} INTO ${target.concatTokens()}`;
|
|
833
|
+
const start = high.getFirstToken().getStart();
|
|
834
|
+
const end = high.getLastToken().getStart();
|
|
835
|
+
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, start, end, code);
|
|
836
|
+
return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Downport, simple REF move", this.getMetadata().key, this.conf.severity, fix);
|
|
837
|
+
}
|
|
782
838
|
moveWithSimpleValue(high, lowFile) {
|
|
783
839
|
if (!(high.get() instanceof Statements.Move)
|
|
784
840
|
|| high.getChildren().length !== 4) {
|
|
@@ -826,7 +882,7 @@ ${indentation}RAISE EXCEPTION ${uniqueName2}.`;
|
|
|
826
882
|
}
|
|
827
883
|
const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
828
884
|
const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
829
|
-
let code = `TYPES ${enumName} TYPE i.
|
|
885
|
+
let code = `TYPES ${enumName} TYPE i.
|
|
830
886
|
CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
831
887
|
let count = 1;
|
|
832
888
|
for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
|
|
@@ -867,14 +923,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
|
867
923
|
const tabixBackup = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
868
924
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
869
925
|
// restore tabix before exeption
|
|
870
|
-
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
871
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
872
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
873
|
-
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
874
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
875
|
-
${indentation}IF sy-subrc <> 0.
|
|
876
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
877
|
-
${indentation}ENDIF.
|
|
926
|
+
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
927
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
928
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
929
|
+
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
930
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
931
|
+
${indentation}IF sy-subrc <> 0.
|
|
932
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
933
|
+
${indentation}ENDIF.
|
|
878
934
|
${indentation}${uniqueName}`;
|
|
879
935
|
const start = target.getFirstToken().getStart();
|
|
880
936
|
const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
|
|
@@ -927,7 +983,7 @@ ${indentation}${uniqueName}`;
|
|
|
927
983
|
return issue_1.Issue.atToken(lowFile, high.getFirstToken(), "Expand operator", this.getMetadata().key, this.conf.severity, fix);
|
|
928
984
|
}
|
|
929
985
|
// must be very simple string templates, like "|{ ls_line-no ALPHA = IN }|"
|
|
930
|
-
stringTemplateAlpha(node, lowFile) {
|
|
986
|
+
stringTemplateAlpha(node, lowFile, highSyntax) {
|
|
931
987
|
var _a, _b, _c;
|
|
932
988
|
if (!(node.get() instanceof Statements.Move)) {
|
|
933
989
|
return undefined;
|
|
@@ -936,8 +992,13 @@ ${indentation}${uniqueName}`;
|
|
|
936
992
|
if (topSource === undefined || topSource.getChildren().length !== 1) {
|
|
937
993
|
return undefined;
|
|
938
994
|
}
|
|
939
|
-
|
|
995
|
+
let top = true;
|
|
996
|
+
let child = topSource.getFirstChild();
|
|
940
997
|
if (!(child.get() instanceof Expressions.StringTemplate)) {
|
|
998
|
+
child = child.findFirstExpression(Expressions.StringTemplate);
|
|
999
|
+
top = false;
|
|
1000
|
+
}
|
|
1001
|
+
if (child === undefined || !(child.get() instanceof Expressions.StringTemplate)) {
|
|
941
1002
|
return undefined;
|
|
942
1003
|
}
|
|
943
1004
|
const templateTokens = child.getChildren();
|
|
@@ -962,13 +1023,28 @@ ${indentation}${uniqueName}`;
|
|
|
962
1023
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
963
1024
|
const source = (_b = templateSource === null || templateSource === void 0 ? void 0 : templateSource.findDirectExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
964
1025
|
const topTarget = (_c = node.findDirectExpression(Expressions.Target)) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
965
|
-
const
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
${indentation}
|
|
1026
|
+
const uniqueName = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
1027
|
+
if (top === false) {
|
|
1028
|
+
const code = `DATA ${uniqueName} TYPE string.
|
|
1029
|
+
${indentation}CALL FUNCTION '${functionName}'
|
|
1030
|
+
${indentation} EXPORTING
|
|
1031
|
+
${indentation} input = ${source}
|
|
1032
|
+
${indentation} IMPORTING
|
|
1033
|
+
${indentation} output = ${uniqueName}.\n`;
|
|
1034
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, node.getFirstToken().getStart(), code);
|
|
1035
|
+
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, child.getFirstToken().getStart(), child.getLastToken().getEnd(), uniqueName);
|
|
1036
|
+
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
1037
|
+
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Downport ALPHA", this.getMetadata().key, this.conf.severity, fix);
|
|
1038
|
+
}
|
|
1039
|
+
else {
|
|
1040
|
+
const code = `CALL FUNCTION '${functionName}'
|
|
1041
|
+
${indentation} EXPORTING
|
|
1042
|
+
${indentation} input = ${source}
|
|
1043
|
+
${indentation} IMPORTING
|
|
969
1044
|
${indentation} output = ${topTarget}.`;
|
|
970
|
-
|
|
971
|
-
|
|
1045
|
+
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getFirstToken().getStart(), node.getLastToken().getEnd(), code);
|
|
1046
|
+
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Downport ALPHA", this.getMetadata().key, this.conf.severity, fix);
|
|
1047
|
+
}
|
|
972
1048
|
}
|
|
973
1049
|
outlineLoopInput(node, lowFile, highSyntax) {
|
|
974
1050
|
if (!(node.get() instanceof Statements.Loop)) {
|
|
@@ -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,10 +16,10 @@ 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
|
-
|
|
19
|
+
extendedInformation: `Case insensitive
|
|
20
|
+
|
|
21
|
+
Only checks the master language descriptions
|
|
22
|
+
|
|
23
23
|
Works for: INTF, CLAS, DOMA, DTEL, FUNC in same FUGR`,
|
|
24
24
|
tags: [],
|
|
25
25
|
};
|
|
@@ -19,15 +19,15 @@ class IfInIf extends _abap_rule_1.ABAPRule {
|
|
|
19
19
|
key: "if_in_if",
|
|
20
20
|
title: "IF in IF",
|
|
21
21
|
shortDescription: `Detects nested ifs which can be refactored to a single condition using AND.`,
|
|
22
|
-
extendedInformation: `https://docs.abapopenchecks.org/checks/01/
|
|
22
|
+
extendedInformation: `https://docs.abapopenchecks.org/checks/01/
|
|
23
23
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low`,
|
|
24
|
-
badExample: `IF condition1.
|
|
25
|
-
IF condition2.
|
|
26
|
-
...
|
|
27
|
-
ENDIF.
|
|
24
|
+
badExample: `IF condition1.
|
|
25
|
+
IF condition2.
|
|
26
|
+
...
|
|
27
|
+
ENDIF.
|
|
28
28
|
ENDIF.`,
|
|
29
|
-
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
30
|
-
...
|
|
29
|
+
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
30
|
+
...
|
|
31
31
|
ENDIF.`,
|
|
32
32
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
33
33
|
};
|
|
@@ -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
|
};
|