@abaplint/cli 2.113.21 → 2.113.22
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 +4 -4
- package/abaplint +2 -2
- package/build/cli.js +864 -842
- package/package.json +63 -63
package/build/cli.js
CHANGED
|
@@ -35173,13 +35173,13 @@ class FlowGraph {
|
|
|
35173
35173
|
this.label = label;
|
|
35174
35174
|
}
|
|
35175
35175
|
toDigraph() {
|
|
35176
|
-
return `digraph G {
|
|
35177
|
-
labelloc="t";
|
|
35178
|
-
label="${this.label}";
|
|
35179
|
-
graph [fontname = "helvetica"];
|
|
35180
|
-
node [fontname = "helvetica", shape="box"];
|
|
35181
|
-
edge [fontname = "helvetica"];
|
|
35182
|
-
${this.toTextEdges()}
|
|
35176
|
+
return `digraph G {
|
|
35177
|
+
labelloc="t";
|
|
35178
|
+
label="${this.label}";
|
|
35179
|
+
graph [fontname = "helvetica"];
|
|
35180
|
+
node [fontname = "helvetica", shape="box"];
|
|
35181
|
+
edge [fontname = "helvetica"];
|
|
35182
|
+
${this.toTextEdges()}
|
|
35183
35183
|
}`;
|
|
35184
35184
|
}
|
|
35185
35185
|
listSources(node) {
|
|
@@ -35549,6 +35549,14 @@ class StatementFlow {
|
|
|
35549
35549
|
}
|
|
35550
35550
|
// TODO, handle CLEANUP
|
|
35551
35551
|
}
|
|
35552
|
+
else if (type instanceof Structures.CatchSystemExceptions) {
|
|
35553
|
+
// TODO: this is not completely correct
|
|
35554
|
+
const catchName = this.buildName(n.getFirstStatement());
|
|
35555
|
+
const body = this.traverseBody(this.findBody(n), context);
|
|
35556
|
+
graph.addEdge(current, catchName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
|
|
35557
|
+
graph.addGraph(catchName, body, flow_graph_1.FLOW_EDGE_TYPE.undefined);
|
|
35558
|
+
graph.addEdge(body.getEnd(), graph.getEnd(), flow_graph_1.FLOW_EDGE_TYPE.undefined);
|
|
35559
|
+
}
|
|
35552
35560
|
else if (type instanceof Structures.Case) {
|
|
35553
35561
|
const caseName = this.buildName(n.getFirstStatement());
|
|
35554
35562
|
graph.addEdge(current, caseName, flow_graph_1.FLOW_EDGE_TYPE.undefined);
|
|
@@ -43430,13 +43438,13 @@ class Help {
|
|
|
43430
43438
|
/////////////////////////////////////////////////
|
|
43431
43439
|
static dumpABAP(file, reg, textDocument, position) {
|
|
43432
43440
|
let content = "";
|
|
43433
|
-
content = `
|
|
43434
|
-
<a href="#_tokens" rel="no-refresh">Tokens</a> |
|
|
43435
|
-
<a href="#_statements" rel="no-refresh">Statements</a> |
|
|
43436
|
-
<a href="#_structure" rel="no-refresh">Structure</a> |
|
|
43437
|
-
<a href="#_files" rel="no-refresh">Files</a> |
|
|
43438
|
-
<a href="#_info" rel="no-refresh">Info Dump</a>
|
|
43439
|
-
<hr>
|
|
43441
|
+
content = `
|
|
43442
|
+
<a href="#_tokens" rel="no-refresh">Tokens</a> |
|
|
43443
|
+
<a href="#_statements" rel="no-refresh">Statements</a> |
|
|
43444
|
+
<a href="#_structure" rel="no-refresh">Structure</a> |
|
|
43445
|
+
<a href="#_files" rel="no-refresh">Files</a> |
|
|
43446
|
+
<a href="#_info" rel="no-refresh">Info Dump</a>
|
|
43447
|
+
<hr>
|
|
43440
43448
|
` +
|
|
43441
43449
|
"<tt>" + textDocument.uri + " (" +
|
|
43442
43450
|
(position.line + 1) + ", " +
|
|
@@ -46525,8 +46533,9 @@ class DataDefinition extends _abstract_object_1.AbstractObject {
|
|
|
46525
46533
|
return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.definitionName;
|
|
46526
46534
|
}
|
|
46527
46535
|
getDescription() {
|
|
46528
|
-
|
|
46529
|
-
|
|
46536
|
+
var _a;
|
|
46537
|
+
this.parse();
|
|
46538
|
+
return (_a = this.parsedData) === null || _a === void 0 ? void 0 : _a.description;
|
|
46530
46539
|
}
|
|
46531
46540
|
parseType(reg) {
|
|
46532
46541
|
this.parse();
|
|
@@ -46560,6 +46569,7 @@ class DataDefinition extends _abstract_object_1.AbstractObject {
|
|
|
46560
46569
|
this.parsedData = {
|
|
46561
46570
|
sqlViewName: undefined,
|
|
46562
46571
|
definitionName: undefined,
|
|
46572
|
+
description: this.findDescription(),
|
|
46563
46573
|
fields: [],
|
|
46564
46574
|
sources: [],
|
|
46565
46575
|
relations: [],
|
|
@@ -46599,6 +46609,14 @@ class DataDefinition extends _abstract_object_1.AbstractObject {
|
|
|
46599
46609
|
this.parsedData.sqlViewName = match[1].toUpperCase();
|
|
46600
46610
|
}
|
|
46601
46611
|
}
|
|
46612
|
+
findDescription() {
|
|
46613
|
+
var _a;
|
|
46614
|
+
const match = (_a = this.findSourceFile()) === null || _a === void 0 ? void 0 : _a.getRaw().match(/@EndUserText\.label: '([\w ]+)'/);
|
|
46615
|
+
if (match) {
|
|
46616
|
+
return match[1];
|
|
46617
|
+
}
|
|
46618
|
+
return undefined;
|
|
46619
|
+
}
|
|
46602
46620
|
findFieldNames(tree) {
|
|
46603
46621
|
var _a, _b;
|
|
46604
46622
|
let expr = tree.findFirstExpression(expressions_1.CDSSelect);
|
|
@@ -52001,6 +52019,7 @@ class View extends _abstract_object_1.AbstractObject {
|
|
|
52001
52019
|
this.parsedData = {
|
|
52002
52020
|
header: {
|
|
52003
52021
|
VIEWCLASS: "",
|
|
52022
|
+
DDTEXT: "",
|
|
52004
52023
|
},
|
|
52005
52024
|
fields: [],
|
|
52006
52025
|
join: [],
|
|
@@ -52012,6 +52031,7 @@ class View extends _abstract_object_1.AbstractObject {
|
|
|
52012
52031
|
const header = (_a = parsed.abapGit["asx:abap"]["asx:values"]) === null || _a === void 0 ? void 0 : _a.DD25V;
|
|
52013
52032
|
this.parsedData.header = {
|
|
52014
52033
|
VIEWCLASS: (header === null || header === void 0 ? void 0 : header.VIEWCLASS) || "",
|
|
52034
|
+
DDTEXT: (header === null || header === void 0 ? void 0 : header.DDTEXT) || "",
|
|
52015
52035
|
};
|
|
52016
52036
|
const fields = (_b = parsed.abapGit["asx:abap"]["asx:values"]) === null || _b === void 0 ? void 0 : _b.DD27P_TABLE;
|
|
52017
52037
|
for (const field of (0, xml_utils_1.xmlToArray)(fields === null || fields === void 0 ? void 0 : fields.DD27P)) {
|
|
@@ -52757,7 +52777,7 @@ class Registry {
|
|
|
52757
52777
|
}
|
|
52758
52778
|
static abaplintVersion() {
|
|
52759
52779
|
// magic, see build script "version.sh"
|
|
52760
|
-
return "2.113.
|
|
52780
|
+
return "2.113.22";
|
|
52761
52781
|
}
|
|
52762
52782
|
getDDICReferences() {
|
|
52763
52783
|
return this.ddicReferences;
|
|
@@ -53076,10 +53096,10 @@ class SevenBitAscii {
|
|
|
53076
53096
|
key: "7bit_ascii",
|
|
53077
53097
|
title: "Check for 7bit ascii",
|
|
53078
53098
|
shortDescription: `Only allow characters from the 7bit ASCII set.`,
|
|
53079
|
-
extendedInformation: `https://docs.abapopenchecks.org/checks/05/
|
|
53080
|
-
|
|
53081
|
-
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
|
|
53082
|
-
|
|
53099
|
+
extendedInformation: `https://docs.abapopenchecks.org/checks/05/
|
|
53100
|
+
|
|
53101
|
+
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
|
|
53102
|
+
|
|
53083
53103
|
Checkes files with extensions ".abap" and ".asddls"`,
|
|
53084
53104
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
53085
53105
|
badExample: `WRITE '뽑'.`,
|
|
@@ -53285,10 +53305,10 @@ class Abapdoc extends _abap_rule_1.ABAPRule {
|
|
|
53285
53305
|
key: "abapdoc",
|
|
53286
53306
|
title: "Check abapdoc",
|
|
53287
53307
|
shortDescription: `Various checks regarding abapdoc.`,
|
|
53288
|
-
extendedInformation: `Base rule checks for existence of abapdoc for public class methods and all interface methods.
|
|
53289
|
-
|
|
53290
|
-
Plus class and interface definitions.
|
|
53291
|
-
|
|
53308
|
+
extendedInformation: `Base rule checks for existence of abapdoc for public class methods and all interface methods.
|
|
53309
|
+
|
|
53310
|
+
Plus class and interface definitions.
|
|
53311
|
+
|
|
53292
53312
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#abap-doc-only-for-public-apis`,
|
|
53293
53313
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
53294
53314
|
};
|
|
@@ -53425,27 +53445,27 @@ class AddTestAttributes extends _abap_rule_1.ABAPRule {
|
|
|
53425
53445
|
title: "Add test attributes for tests classes with test methods",
|
|
53426
53446
|
shortDescription: `Add test attributes DURATION and RISK LEVEL for tests classes with test methods`,
|
|
53427
53447
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
53428
|
-
badExample: `CLASS ltcl_test1 DEFINITION FINAL FOR TESTING.
|
|
53429
|
-
PUBLIC SECTION.
|
|
53430
|
-
PROTECTED SECTION.
|
|
53431
|
-
PRIVATE SECTION.
|
|
53432
|
-
METHODS test FOR TESTING RAISING cx_static_check.
|
|
53433
|
-
ENDCLASS.
|
|
53434
|
-
|
|
53435
|
-
CLASS ltcl_test1 IMPLEMENTATION.
|
|
53436
|
-
METHOD test.
|
|
53437
|
-
ENDMETHOD.
|
|
53448
|
+
badExample: `CLASS ltcl_test1 DEFINITION FINAL FOR TESTING.
|
|
53449
|
+
PUBLIC SECTION.
|
|
53450
|
+
PROTECTED SECTION.
|
|
53451
|
+
PRIVATE SECTION.
|
|
53452
|
+
METHODS test FOR TESTING RAISING cx_static_check.
|
|
53453
|
+
ENDCLASS.
|
|
53454
|
+
|
|
53455
|
+
CLASS ltcl_test1 IMPLEMENTATION.
|
|
53456
|
+
METHOD test.
|
|
53457
|
+
ENDMETHOD.
|
|
53438
53458
|
ENDCLASS.`,
|
|
53439
|
-
goodExample: `CLASS ltcl_test2 DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
53440
|
-
PUBLIC SECTION.
|
|
53441
|
-
PROTECTED SECTION.
|
|
53442
|
-
PRIVATE SECTION.
|
|
53443
|
-
METHODS test FOR TESTING RAISING cx_static_check.
|
|
53444
|
-
ENDCLASS.
|
|
53445
|
-
|
|
53446
|
-
CLASS ltcl_test2 IMPLEMENTATION.
|
|
53447
|
-
METHOD test.
|
|
53448
|
-
ENDMETHOD.
|
|
53459
|
+
goodExample: `CLASS ltcl_test2 DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
53460
|
+
PUBLIC SECTION.
|
|
53461
|
+
PROTECTED SECTION.
|
|
53462
|
+
PRIVATE SECTION.
|
|
53463
|
+
METHODS test FOR TESTING RAISING cx_static_check.
|
|
53464
|
+
ENDCLASS.
|
|
53465
|
+
|
|
53466
|
+
CLASS ltcl_test2 IMPLEMENTATION.
|
|
53467
|
+
METHOD test.
|
|
53468
|
+
ENDMETHOD.
|
|
53449
53469
|
ENDCLASS.`,
|
|
53450
53470
|
};
|
|
53451
53471
|
}
|
|
@@ -53531,49 +53551,49 @@ class AlignParameters extends _abap_rule_1.ABAPRule {
|
|
|
53531
53551
|
key: "align_parameters",
|
|
53532
53552
|
title: "Align Parameters",
|
|
53533
53553
|
shortDescription: `Checks for vertially aligned parameters`,
|
|
53534
|
-
extendedInformation: `Checks:
|
|
53535
|
-
* function module calls
|
|
53536
|
-
* method calls
|
|
53537
|
-
* VALUE constructors
|
|
53538
|
-
* NEW constructors
|
|
53539
|
-
* RAISE EXCEPTION statements
|
|
53540
|
-
* CREATE OBJECT statements
|
|
53541
|
-
* RAISE EVENT statements
|
|
53542
|
-
|
|
53543
|
-
https://github.com/SAP/styleguides/blob/master/clean-abap/CleanABAP.md#align-parameters
|
|
53544
|
-
|
|
53545
|
-
Does not take effect on non functional method calls, use https://rules.abaplint.org/functional_writing/
|
|
53546
|
-
|
|
53547
|
-
If parameters are on the same row, no issues are reported, see
|
|
53554
|
+
extendedInformation: `Checks:
|
|
53555
|
+
* function module calls
|
|
53556
|
+
* method calls
|
|
53557
|
+
* VALUE constructors
|
|
53558
|
+
* NEW constructors
|
|
53559
|
+
* RAISE EXCEPTION statements
|
|
53560
|
+
* CREATE OBJECT statements
|
|
53561
|
+
* RAISE EVENT statements
|
|
53562
|
+
|
|
53563
|
+
https://github.com/SAP/styleguides/blob/master/clean-abap/CleanABAP.md#align-parameters
|
|
53564
|
+
|
|
53565
|
+
Does not take effect on non functional method calls, use https://rules.abaplint.org/functional_writing/
|
|
53566
|
+
|
|
53567
|
+
If parameters are on the same row, no issues are reported, see
|
|
53548
53568
|
https://rules.abaplint.org/max_one_method_parameter_per_line/ for splitting parameters to lines`,
|
|
53549
53569
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
53550
|
-
badExample: `CALL FUNCTION 'FOOBAR'
|
|
53551
|
-
EXPORTING
|
|
53552
|
-
foo = 2
|
|
53553
|
-
parameter = 3.
|
|
53554
|
-
|
|
53555
|
-
foobar( moo = 1
|
|
53556
|
-
param = 1 ).
|
|
53557
|
-
|
|
53558
|
-
foo = VALUE #(
|
|
53559
|
-
foo = bar
|
|
53570
|
+
badExample: `CALL FUNCTION 'FOOBAR'
|
|
53571
|
+
EXPORTING
|
|
53572
|
+
foo = 2
|
|
53573
|
+
parameter = 3.
|
|
53574
|
+
|
|
53575
|
+
foobar( moo = 1
|
|
53576
|
+
param = 1 ).
|
|
53577
|
+
|
|
53578
|
+
foo = VALUE #(
|
|
53579
|
+
foo = bar
|
|
53560
53580
|
moo = 2 ).`,
|
|
53561
|
-
goodExample: `CALL FUNCTION 'FOOBAR'
|
|
53562
|
-
EXPORTING
|
|
53563
|
-
foo = 2
|
|
53564
|
-
parameter = 3.
|
|
53565
|
-
|
|
53566
|
-
foobar( moo = 1
|
|
53567
|
-
param = 1 ).
|
|
53568
|
-
|
|
53569
|
-
foo = VALUE #(
|
|
53570
|
-
foo = bar
|
|
53571
|
-
moo = 2 ).
|
|
53572
|
-
|
|
53573
|
-
DATA(sdf) = VALUE type(
|
|
53574
|
-
common_val = 2
|
|
53575
|
-
another_common = 5
|
|
53576
|
-
( row_value = 4
|
|
53581
|
+
goodExample: `CALL FUNCTION 'FOOBAR'
|
|
53582
|
+
EXPORTING
|
|
53583
|
+
foo = 2
|
|
53584
|
+
parameter = 3.
|
|
53585
|
+
|
|
53586
|
+
foobar( moo = 1
|
|
53587
|
+
param = 1 ).
|
|
53588
|
+
|
|
53589
|
+
foo = VALUE #(
|
|
53590
|
+
foo = bar
|
|
53591
|
+
moo = 2 ).
|
|
53592
|
+
|
|
53593
|
+
DATA(sdf) = VALUE type(
|
|
53594
|
+
common_val = 2
|
|
53595
|
+
another_common = 5
|
|
53596
|
+
( row_value = 4
|
|
53577
53597
|
value_foo = 5 ) ).`,
|
|
53578
53598
|
};
|
|
53579
53599
|
}
|
|
@@ -54007,37 +54027,37 @@ class AlignTypeExpressions extends _abap_rule_1.ABAPRule {
|
|
|
54007
54027
|
key: "align_type_expressions",
|
|
54008
54028
|
title: "Align TYPE expressions",
|
|
54009
54029
|
shortDescription: `Align TYPE expressions in statements`,
|
|
54010
|
-
extendedInformation: `
|
|
54011
|
-
Currently works for METHODS + BEGIN OF
|
|
54012
|
-
|
|
54013
|
-
If BEGIN OF has an INCLUDE TYPE its ignored
|
|
54014
|
-
|
|
54015
|
-
Also note that clean ABAP does not recommend aligning TYPE clauses:
|
|
54030
|
+
extendedInformation: `
|
|
54031
|
+
Currently works for METHODS + BEGIN OF
|
|
54032
|
+
|
|
54033
|
+
If BEGIN OF has an INCLUDE TYPE its ignored
|
|
54034
|
+
|
|
54035
|
+
Also note that clean ABAP does not recommend aligning TYPE clauses:
|
|
54016
54036
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-align-type-clauses`,
|
|
54017
54037
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix],
|
|
54018
|
-
badExample: `
|
|
54019
|
-
TYPES: BEGIN OF foo,
|
|
54020
|
-
bar TYPE i,
|
|
54021
|
-
foobar TYPE i,
|
|
54022
|
-
END OF foo.
|
|
54023
|
-
|
|
54024
|
-
INTERFACE lif.
|
|
54025
|
-
METHODS bar
|
|
54026
|
-
IMPORTING
|
|
54027
|
-
foo TYPE i
|
|
54028
|
-
foobar TYPE i.
|
|
54038
|
+
badExample: `
|
|
54039
|
+
TYPES: BEGIN OF foo,
|
|
54040
|
+
bar TYPE i,
|
|
54041
|
+
foobar TYPE i,
|
|
54042
|
+
END OF foo.
|
|
54043
|
+
|
|
54044
|
+
INTERFACE lif.
|
|
54045
|
+
METHODS bar
|
|
54046
|
+
IMPORTING
|
|
54047
|
+
foo TYPE i
|
|
54048
|
+
foobar TYPE i.
|
|
54029
54049
|
ENDINTERFACE.`,
|
|
54030
|
-
goodExample: `
|
|
54031
|
-
TYPES: BEGIN OF foo,
|
|
54032
|
-
bar TYPE i,
|
|
54033
|
-
foobar TYPE i,
|
|
54034
|
-
END OF foo.
|
|
54035
|
-
|
|
54036
|
-
INTERFACE lif.
|
|
54037
|
-
METHODS bar
|
|
54038
|
-
IMPORTING
|
|
54039
|
-
foo TYPE i
|
|
54040
|
-
foobar TYPE i.
|
|
54050
|
+
goodExample: `
|
|
54051
|
+
TYPES: BEGIN OF foo,
|
|
54052
|
+
bar TYPE i,
|
|
54053
|
+
foobar TYPE i,
|
|
54054
|
+
END OF foo.
|
|
54055
|
+
|
|
54056
|
+
INTERFACE lif.
|
|
54057
|
+
METHODS bar
|
|
54058
|
+
IMPORTING
|
|
54059
|
+
foo TYPE i
|
|
54060
|
+
foobar TYPE i.
|
|
54041
54061
|
ENDINTERFACE.`,
|
|
54042
54062
|
};
|
|
54043
54063
|
}
|
|
@@ -54316,16 +54336,16 @@ class AmbiguousStatement extends _abap_rule_1.ABAPRule {
|
|
|
54316
54336
|
return {
|
|
54317
54337
|
key: "ambiguous_statement",
|
|
54318
54338
|
title: "Check for ambigious statements",
|
|
54319
|
-
shortDescription: `Checks for ambiguity between deleting or modifying from internal and database table
|
|
54320
|
-
Add "TABLE" keyword or "@" for escaping SQL variables
|
|
54321
|
-
|
|
54339
|
+
shortDescription: `Checks for ambiguity between deleting or modifying from internal and database table
|
|
54340
|
+
Add "TABLE" keyword or "@" for escaping SQL variables
|
|
54341
|
+
|
|
54322
54342
|
Only works if the target version is 740sp05 or above`,
|
|
54323
54343
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
54324
|
-
badExample: `DELETE foo FROM bar.
|
|
54344
|
+
badExample: `DELETE foo FROM bar.
|
|
54325
54345
|
MODIFY foo FROM bar.`,
|
|
54326
|
-
goodExample: `DELETE foo FROM @bar.
|
|
54327
|
-
DELETE TABLE itab FROM 2.
|
|
54328
|
-
MODIFY zfoo FROM @wa.
|
|
54346
|
+
goodExample: `DELETE foo FROM @bar.
|
|
54347
|
+
DELETE TABLE itab FROM 2.
|
|
54348
|
+
MODIFY zfoo FROM @wa.
|
|
54329
54349
|
MODIFY TABLE foo FROM bar.`,
|
|
54330
54350
|
};
|
|
54331
54351
|
}
|
|
@@ -54430,16 +54450,16 @@ class AvoidUse extends _abap_rule_1.ABAPRule {
|
|
|
54430
54450
|
key: "avoid_use",
|
|
54431
54451
|
title: "Avoid use of certain statements",
|
|
54432
54452
|
shortDescription: `Detects usage of certain statements.`,
|
|
54433
|
-
extendedInformation: `DEFAULT KEY: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key
|
|
54434
|
-
|
|
54435
|
-
Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
54436
|
-
|
|
54437
|
-
STATICS: use CLASS-DATA instead
|
|
54438
|
-
|
|
54439
|
-
DESCRIBE TABLE LINES: use lines() instead (quickfix exists)
|
|
54440
|
-
|
|
54441
|
-
TEST-SEAMS: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-test-seams-as-temporary-workaround
|
|
54442
|
-
|
|
54453
|
+
extendedInformation: `DEFAULT KEY: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key
|
|
54454
|
+
|
|
54455
|
+
Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
54456
|
+
|
|
54457
|
+
STATICS: use CLASS-DATA instead
|
|
54458
|
+
|
|
54459
|
+
DESCRIBE TABLE LINES: use lines() instead (quickfix exists)
|
|
54460
|
+
|
|
54461
|
+
TEST-SEAMS: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-test-seams-as-temporary-workaround
|
|
54462
|
+
|
|
54443
54463
|
BREAK points`,
|
|
54444
54464
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
54445
54465
|
};
|
|
@@ -54571,11 +54591,11 @@ class BeginEndNames extends _abap_rule_1.ABAPRule {
|
|
|
54571
54591
|
title: "Check BEGIN END names",
|
|
54572
54592
|
shortDescription: `Check BEGIN OF and END OF names match, plus there must be statements between BEGIN and END`,
|
|
54573
54593
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
54574
|
-
badExample: `DATA: BEGIN OF stru,
|
|
54575
|
-
field TYPE i,
|
|
54594
|
+
badExample: `DATA: BEGIN OF stru,
|
|
54595
|
+
field TYPE i,
|
|
54576
54596
|
END OF structure_not_the_same.`,
|
|
54577
|
-
goodExample: `DATA: BEGIN OF stru,
|
|
54578
|
-
field TYPE i,
|
|
54597
|
+
goodExample: `DATA: BEGIN OF stru,
|
|
54598
|
+
field TYPE i,
|
|
54579
54599
|
END OF stru.`,
|
|
54580
54600
|
};
|
|
54581
54601
|
}
|
|
@@ -54672,20 +54692,20 @@ class BeginSingleInclude extends _abap_rule_1.ABAPRule {
|
|
|
54672
54692
|
title: "BEGIN contains single INCLUDE",
|
|
54673
54693
|
shortDescription: `Finds TYPE BEGIN with just one INCLUDE TYPE, and DATA with single INCLUDE STRUCTURE`,
|
|
54674
54694
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
54675
|
-
badExample: `TYPES: BEGIN OF dummy1.
|
|
54676
|
-
INCLUDE TYPE dselc.
|
|
54677
|
-
TYPES: END OF dummy1.
|
|
54678
|
-
|
|
54679
|
-
DATA BEGIN OF foo.
|
|
54680
|
-
INCLUDE STRUCTURE syst.
|
|
54681
|
-
DATA END OF foo.
|
|
54682
|
-
|
|
54683
|
-
STATICS BEGIN OF bar.
|
|
54684
|
-
INCLUDE STRUCTURE syst.
|
|
54695
|
+
badExample: `TYPES: BEGIN OF dummy1.
|
|
54696
|
+
INCLUDE TYPE dselc.
|
|
54697
|
+
TYPES: END OF dummy1.
|
|
54698
|
+
|
|
54699
|
+
DATA BEGIN OF foo.
|
|
54700
|
+
INCLUDE STRUCTURE syst.
|
|
54701
|
+
DATA END OF foo.
|
|
54702
|
+
|
|
54703
|
+
STATICS BEGIN OF bar.
|
|
54704
|
+
INCLUDE STRUCTURE syst.
|
|
54685
54705
|
STATICS END OF bar.`,
|
|
54686
|
-
goodExample: `DATA BEGIN OF foo.
|
|
54687
|
-
DATA field TYPE i.
|
|
54688
|
-
INCLUDE STRUCTURE dselc.
|
|
54706
|
+
goodExample: `DATA BEGIN OF foo.
|
|
54707
|
+
DATA field TYPE i.
|
|
54708
|
+
INCLUDE STRUCTURE dselc.
|
|
54689
54709
|
DATA END OF foo.`,
|
|
54690
54710
|
};
|
|
54691
54711
|
}
|
|
@@ -54775,9 +54795,9 @@ class CallTransactionAuthorityCheck extends _abap_rule_1.ABAPRule {
|
|
|
54775
54795
|
extendedInformation: `https://docs.abapopenchecks.org/checks/54/`,
|
|
54776
54796
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Security],
|
|
54777
54797
|
badExample: `CALL TRANSACTION 'FOO'.`,
|
|
54778
|
-
goodExample: `TRY.
|
|
54779
|
-
CALL TRANSACTION 'FOO' WITH AUTHORITY-CHECK.
|
|
54780
|
-
CATCH cx_sy_authorization_error.
|
|
54798
|
+
goodExample: `TRY.
|
|
54799
|
+
CALL TRANSACTION 'FOO' WITH AUTHORITY-CHECK.
|
|
54800
|
+
CATCH cx_sy_authorization_error.
|
|
54781
54801
|
ENDTRY.`,
|
|
54782
54802
|
};
|
|
54783
54803
|
}
|
|
@@ -54842,10 +54862,10 @@ class CDSCommentStyle {
|
|
|
54842
54862
|
key: "cds_comment_style",
|
|
54843
54863
|
title: "CDS Comment Style",
|
|
54844
54864
|
shortDescription: `Check for obsolete comment style`,
|
|
54845
|
-
extendedInformation: `Check for obsolete comment style
|
|
54846
|
-
|
|
54847
|
-
Comments starting with "--" are considered obsolete
|
|
54848
|
-
|
|
54865
|
+
extendedInformation: `Check for obsolete comment style
|
|
54866
|
+
|
|
54867
|
+
Comments starting with "--" are considered obsolete
|
|
54868
|
+
|
|
54849
54869
|
https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abencds_general_syntax_rules.htm`,
|
|
54850
54870
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
54851
54871
|
badExample: "-- this is a comment",
|
|
@@ -54911,10 +54931,10 @@ class CDSLegacyView {
|
|
|
54911
54931
|
key: "cds_legacy_view",
|
|
54912
54932
|
title: "CDS Legacy View",
|
|
54913
54933
|
shortDescription: `Identify CDS Legacy Views`,
|
|
54914
|
-
extendedInformation: `Use DEFINE VIEW ENTITY instead of DEFINE VIEW
|
|
54915
|
-
|
|
54916
|
-
https://blogs.sap.com/2021/10/16/a-new-generation-of-cds-views-how-to-migrate-your-cds-views-to-cds-view-entities/
|
|
54917
|
-
|
|
54934
|
+
extendedInformation: `Use DEFINE VIEW ENTITY instead of DEFINE VIEW
|
|
54935
|
+
|
|
54936
|
+
https://blogs.sap.com/2021/10/16/a-new-generation-of-cds-views-how-to-migrate-your-cds-views-to-cds-view-entities/
|
|
54937
|
+
|
|
54918
54938
|
v755 and up`,
|
|
54919
54939
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Upport],
|
|
54920
54940
|
};
|
|
@@ -55069,10 +55089,10 @@ class ChainMainlyDeclarations extends _abap_rule_1.ABAPRule {
|
|
|
55069
55089
|
key: "chain_mainly_declarations",
|
|
55070
55090
|
title: "Chain mainly declarations",
|
|
55071
55091
|
shortDescription: `Chain mainly declarations, allows chaining for the configured statements, reports errors for other statements.`,
|
|
55072
|
-
extendedInformation: `
|
|
55073
|
-
https://docs.abapopenchecks.org/checks/23/
|
|
55074
|
-
|
|
55075
|
-
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenchained_statements_guidl.htm
|
|
55092
|
+
extendedInformation: `
|
|
55093
|
+
https://docs.abapopenchecks.org/checks/23/
|
|
55094
|
+
|
|
55095
|
+
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenchained_statements_guidl.htm
|
|
55076
55096
|
`,
|
|
55077
55097
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
55078
55098
|
badExample: `CALL METHOD: bar.`,
|
|
@@ -55248,17 +55268,17 @@ class ChangeIfToCase extends _abap_rule_1.ABAPRule {
|
|
|
55248
55268
|
title: "Change IF to CASE",
|
|
55249
55269
|
shortDescription: `Finds IF constructs that can be changed to CASE`,
|
|
55250
55270
|
// eslint-disable-next-line max-len
|
|
55251
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-case-to-else-if-for-multiple-alternative-conditions
|
|
55252
|
-
|
|
55271
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-case-to-else-if-for-multiple-alternative-conditions
|
|
55272
|
+
|
|
55253
55273
|
If the first comparison is a boolean compare, no issue is reported.`,
|
|
55254
55274
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
55255
|
-
badExample: `IF l_fcat-fieldname EQ 'FOO'.
|
|
55256
|
-
ELSEIF l_fcat-fieldname = 'BAR'
|
|
55257
|
-
OR l_fcat-fieldname = 'MOO'.
|
|
55275
|
+
badExample: `IF l_fcat-fieldname EQ 'FOO'.
|
|
55276
|
+
ELSEIF l_fcat-fieldname = 'BAR'
|
|
55277
|
+
OR l_fcat-fieldname = 'MOO'.
|
|
55258
55278
|
ENDIF.`,
|
|
55259
|
-
goodExample: `CASE l_fcat-fieldname.
|
|
55260
|
-
WHEN 'FOO'.
|
|
55261
|
-
WHEN 'BAR' OR 'MOO'.
|
|
55279
|
+
goodExample: `CASE l_fcat-fieldname.
|
|
55280
|
+
WHEN 'FOO'.
|
|
55281
|
+
WHEN 'BAR' OR 'MOO'.
|
|
55262
55282
|
ENDCASE.`,
|
|
55263
55283
|
};
|
|
55264
55284
|
}
|
|
@@ -55395,8 +55415,8 @@ class CheckAbstract extends _abap_rule_1.ABAPRule {
|
|
|
55395
55415
|
return {
|
|
55396
55416
|
key: "check_abstract",
|
|
55397
55417
|
title: "Check abstract methods and classes",
|
|
55398
|
-
shortDescription: `Checks abstract methods and classes:
|
|
55399
|
-
- class defined as abstract and final,
|
|
55418
|
+
shortDescription: `Checks abstract methods and classes:
|
|
55419
|
+
- class defined as abstract and final,
|
|
55400
55420
|
- non-abstract class contains abstract methods`,
|
|
55401
55421
|
extendedInformation: `If a class defines only constants, use an interface instead`,
|
|
55402
55422
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
@@ -55477,11 +55497,11 @@ class CheckComments extends _abap_rule_1.ABAPRule {
|
|
|
55477
55497
|
return {
|
|
55478
55498
|
key: "check_comments",
|
|
55479
55499
|
title: "Check Comments",
|
|
55480
|
-
shortDescription: `
|
|
55500
|
+
shortDescription: `
|
|
55481
55501
|
Various checks for comment usage.`,
|
|
55482
|
-
extendedInformation: `
|
|
55483
|
-
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
55484
|
-
|
|
55502
|
+
extendedInformation: `
|
|
55503
|
+
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
55504
|
+
|
|
55485
55505
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comments-before-the-statement-they-relate-to`,
|
|
55486
55506
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
55487
55507
|
badExample: `WRITE 2. " descriptive comment`,
|
|
@@ -55643,9 +55663,9 @@ class CheckInclude {
|
|
|
55643
55663
|
key: "check_include",
|
|
55644
55664
|
title: "Check INCLUDEs",
|
|
55645
55665
|
shortDescription: `Checks INCLUDE statements`,
|
|
55646
|
-
extendedInformation: `
|
|
55647
|
-
* Reports unused includes
|
|
55648
|
-
* Errors if the includes are not found
|
|
55666
|
+
extendedInformation: `
|
|
55667
|
+
* Reports unused includes
|
|
55668
|
+
* Errors if the includes are not found
|
|
55649
55669
|
* Error if including a main program`,
|
|
55650
55670
|
tags: [_irule_1.RuleTag.Syntax],
|
|
55651
55671
|
};
|
|
@@ -55721,14 +55741,14 @@ class CheckSubrc extends _abap_rule_1.ABAPRule {
|
|
|
55721
55741
|
key: "check_subrc",
|
|
55722
55742
|
title: "Check sy-subrc",
|
|
55723
55743
|
shortDescription: `Check sy-subrc`,
|
|
55724
|
-
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
55725
|
-
|
|
55726
|
-
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
55727
|
-
|
|
55728
|
-
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
55729
|
-
|
|
55730
|
-
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
55731
|
-
|
|
55744
|
+
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
55745
|
+
|
|
55746
|
+
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
55747
|
+
|
|
55748
|
+
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
55749
|
+
|
|
55750
|
+
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
55751
|
+
|
|
55732
55752
|
FIND statement with MATCH COUNT is considered okay if subrc is not checked`,
|
|
55733
55753
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
55734
55754
|
pseudoComment: "EC CI_SUBRC",
|
|
@@ -56298,17 +56318,17 @@ class ClassicExceptionsOverlap extends _abap_rule_1.ABAPRule {
|
|
|
56298
56318
|
shortDescription: `Find overlapping classic exceptions`,
|
|
56299
56319
|
extendedInformation: `When debugging its typically good to know exactly which exception is caught`,
|
|
56300
56320
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
56301
|
-
badExample: `CALL FUNCTION 'SOMETHING'
|
|
56302
|
-
EXCEPTIONS
|
|
56303
|
-
system_failure = 1 MESSAGE lv_message
|
|
56304
|
-
communication_failure = 1 MESSAGE lv_message
|
|
56305
|
-
resource_failure = 1
|
|
56321
|
+
badExample: `CALL FUNCTION 'SOMETHING'
|
|
56322
|
+
EXCEPTIONS
|
|
56323
|
+
system_failure = 1 MESSAGE lv_message
|
|
56324
|
+
communication_failure = 1 MESSAGE lv_message
|
|
56325
|
+
resource_failure = 1
|
|
56306
56326
|
OTHERS = 1.`,
|
|
56307
|
-
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
56308
|
-
EXCEPTIONS
|
|
56309
|
-
system_failure = 1 MESSAGE lv_message
|
|
56310
|
-
communication_failure = 2 MESSAGE lv_message
|
|
56311
|
-
resource_failure = 3
|
|
56327
|
+
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
56328
|
+
EXCEPTIONS
|
|
56329
|
+
system_failure = 1 MESSAGE lv_message
|
|
56330
|
+
communication_failure = 2 MESSAGE lv_message
|
|
56331
|
+
resource_failure = 3
|
|
56312
56332
|
OTHERS = 4.`,
|
|
56313
56333
|
};
|
|
56314
56334
|
}
|
|
@@ -56554,7 +56574,7 @@ class CommentedCode extends _abap_rule_1.ABAPRule {
|
|
|
56554
56574
|
key: "commented_code",
|
|
56555
56575
|
title: "Find commented code",
|
|
56556
56576
|
shortDescription: `Detects usage of commented out code.`,
|
|
56557
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
56577
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
56558
56578
|
https://docs.abapopenchecks.org/checks/14/`,
|
|
56559
56579
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
56560
56580
|
badExample: `* WRITE 'hello world'.`,
|
|
@@ -56787,10 +56807,10 @@ class ConstructorVisibilityPublic {
|
|
|
56787
56807
|
key: "constructor_visibility_public",
|
|
56788
56808
|
title: "Check constructor visibility is public",
|
|
56789
56809
|
shortDescription: `Constructor must be placed in the public section, even if the class is not CREATE PUBLIC.`,
|
|
56790
|
-
extendedInformation: `
|
|
56791
|
-
This only applies to global classes.
|
|
56792
|
-
|
|
56793
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
56810
|
+
extendedInformation: `
|
|
56811
|
+
This only applies to global classes.
|
|
56812
|
+
|
|
56813
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
56794
56814
|
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abeninstance_constructor_guidl.htm`,
|
|
56795
56815
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
56796
56816
|
};
|
|
@@ -56865,8 +56885,8 @@ class ContainsTab extends _abap_rule_1.ABAPRule {
|
|
|
56865
56885
|
key: "contains_tab",
|
|
56866
56886
|
title: "Code contains tab",
|
|
56867
56887
|
shortDescription: `Checks for usage of tabs (enable to enforce spaces)`,
|
|
56868
|
-
extendedInformation: `
|
|
56869
|
-
https://docs.abapopenchecks.org/checks/09/
|
|
56888
|
+
extendedInformation: `
|
|
56889
|
+
https://docs.abapopenchecks.org/checks/09/
|
|
56870
56890
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#indent-and-snap-to-tab`,
|
|
56871
56891
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
56872
56892
|
badExample: `\tWRITE 'hello world'.`,
|
|
@@ -56953,10 +56973,10 @@ class CyclicOO {
|
|
|
56953
56973
|
key: "cyclic_oo",
|
|
56954
56974
|
title: "Cyclic OO",
|
|
56955
56975
|
shortDescription: `Finds cyclic/circular OO references`,
|
|
56956
|
-
extendedInformation: `Runs for global INTF + CLAS objects
|
|
56957
|
-
|
|
56958
|
-
Objects must be without syntax errors for this rule to take effect
|
|
56959
|
-
|
|
56976
|
+
extendedInformation: `Runs for global INTF + CLAS objects
|
|
56977
|
+
|
|
56978
|
+
Objects must be without syntax errors for this rule to take effect
|
|
56979
|
+
|
|
56960
56980
|
References in testclass includes are ignored`,
|
|
56961
56981
|
};
|
|
56962
56982
|
}
|
|
@@ -57199,7 +57219,7 @@ class DangerousStatement extends _abap_rule_1.ABAPRule {
|
|
|
57199
57219
|
key: "dangerous_statement",
|
|
57200
57220
|
title: "Dangerous statement",
|
|
57201
57221
|
shortDescription: `Detects potentially dangerous statements`,
|
|
57202
|
-
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
57222
|
+
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
57203
57223
|
dynamic SQL can potentially create SQL injection problems`,
|
|
57204
57224
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Security],
|
|
57205
57225
|
};
|
|
@@ -57406,13 +57426,13 @@ class DefinitionsTop extends _abap_rule_1.ABAPRule {
|
|
|
57406
57426
|
shortDescription: `Checks that definitions are placed at the beginning of METHODs, FORMs and FUNCTIONs.`,
|
|
57407
57427
|
extendedInformation: `https://docs.abapopenchecks.org/checks/17/`,
|
|
57408
57428
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
57409
|
-
badExample: `FROM foo.
|
|
57410
|
-
WRITE 'hello'.
|
|
57411
|
-
DATA int TYPE i.
|
|
57429
|
+
badExample: `FROM foo.
|
|
57430
|
+
WRITE 'hello'.
|
|
57431
|
+
DATA int TYPE i.
|
|
57412
57432
|
ENDFORM.`,
|
|
57413
|
-
goodExample: `FROM foo.
|
|
57414
|
-
DATA int TYPE i.
|
|
57415
|
-
WRITE 'hello'.
|
|
57433
|
+
goodExample: `FROM foo.
|
|
57434
|
+
DATA int TYPE i.
|
|
57435
|
+
WRITE 'hello'.
|
|
57416
57436
|
ENDFORM.`,
|
|
57417
57437
|
};
|
|
57418
57438
|
}
|
|
@@ -57951,39 +57971,39 @@ class Downport {
|
|
|
57951
57971
|
key: "downport",
|
|
57952
57972
|
title: "Downport statement",
|
|
57953
57973
|
shortDescription: `Downport functionality`,
|
|
57954
|
-
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
57955
|
-
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
57956
|
-
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
57957
|
-
|
|
57958
|
-
Current rules:
|
|
57959
|
-
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
57960
|
-
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
57961
|
-
* FIELD-SYMBOL() definitions are outlined
|
|
57962
|
-
* CONV is outlined
|
|
57963
|
-
* COND is outlined
|
|
57964
|
-
* REDUCE is outlined
|
|
57965
|
-
* SWITCH is outlined
|
|
57966
|
-
* FILTER is outlined
|
|
57967
|
-
* APPEND expression is outlined
|
|
57968
|
-
* INSERT expression is outlined
|
|
57969
|
-
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
57970
|
-
* CAST changed to ?=
|
|
57971
|
-
* LOOP AT method_call( ) is outlined
|
|
57972
|
-
* VALUE # with structure fields
|
|
57973
|
-
* VALUE # with internal table lines
|
|
57974
|
-
* Table Expressions are outlined
|
|
57975
|
-
* SELECT INTO @DATA definitions are outlined
|
|
57976
|
-
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
57977
|
-
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
57978
|
-
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
57979
|
-
* RAISE EXCEPTION ... MESSAGE
|
|
57980
|
-
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
57981
|
-
* line_exists and line_index is downported to READ TABLE
|
|
57982
|
-
* ENUMs, but does not nessesarily give the correct type and value
|
|
57983
|
-
* MESSAGE with non simple source
|
|
57984
|
-
|
|
57985
|
-
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
57986
|
-
|
|
57974
|
+
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
57975
|
+
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
57976
|
+
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
57977
|
+
|
|
57978
|
+
Current rules:
|
|
57979
|
+
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
57980
|
+
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
57981
|
+
* FIELD-SYMBOL() definitions are outlined
|
|
57982
|
+
* CONV is outlined
|
|
57983
|
+
* COND is outlined
|
|
57984
|
+
* REDUCE is outlined
|
|
57985
|
+
* SWITCH is outlined
|
|
57986
|
+
* FILTER is outlined
|
|
57987
|
+
* APPEND expression is outlined
|
|
57988
|
+
* INSERT expression is outlined
|
|
57989
|
+
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
57990
|
+
* CAST changed to ?=
|
|
57991
|
+
* LOOP AT method_call( ) is outlined
|
|
57992
|
+
* VALUE # with structure fields
|
|
57993
|
+
* VALUE # with internal table lines
|
|
57994
|
+
* Table Expressions are outlined
|
|
57995
|
+
* SELECT INTO @DATA definitions are outlined
|
|
57996
|
+
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
57997
|
+
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
57998
|
+
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
57999
|
+
* RAISE EXCEPTION ... MESSAGE
|
|
58000
|
+
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
58001
|
+
* line_exists and line_index is downported to READ TABLE
|
|
58002
|
+
* ENUMs, but does not nessesarily give the correct type and value
|
|
58003
|
+
* MESSAGE with non simple source
|
|
58004
|
+
|
|
58005
|
+
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
58006
|
+
|
|
57987
58007
|
Make sure to test the downported code, it might not always be completely correct.`,
|
|
57988
58008
|
tags: [_irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
|
|
57989
58009
|
};
|
|
@@ -58561,10 +58581,10 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
58561
58581
|
const fieldName = f.concatTokens();
|
|
58562
58582
|
fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
|
|
58563
58583
|
}
|
|
58564
|
-
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
58584
|
+
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
58565
58585
|
${fieldDefinition}${indentation} END OF ${name}.`;
|
|
58566
58586
|
}
|
|
58567
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
58587
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
58568
58588
|
${indentation}`);
|
|
58569
58589
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
58570
58590
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -58623,12 +58643,12 @@ ${indentation}`);
|
|
|
58623
58643
|
}
|
|
58624
58644
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58625
58645
|
const name = ((_g = inlineData.findFirstExpression(Expressions.TargetField)) === null || _g === void 0 ? void 0 : _g.concatTokens()) || "error";
|
|
58626
|
-
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
58627
|
-
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
58628
|
-
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
58646
|
+
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
58647
|
+
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
58648
|
+
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
58629
58649
|
${indentation}`);
|
|
58630
58650
|
if (fieldDefinitions === "") {
|
|
58631
|
-
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
58651
|
+
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
58632
58652
|
${indentation}`);
|
|
58633
58653
|
}
|
|
58634
58654
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
@@ -58696,7 +58716,7 @@ ${indentation}`);
|
|
|
58696
58716
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58697
58717
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
58698
58718
|
const firstToken = high.getFirstToken();
|
|
58699
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
58719
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
58700
58720
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
58701
58721
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
58702
58722
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -58750,7 +58770,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
58750
58770
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58751
58771
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
58752
58772
|
const firstToken = high.getFirstToken();
|
|
58753
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
58773
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
58754
58774
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
58755
58775
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
58756
58776
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -58792,14 +58812,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
58792
58812
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
58793
58813
|
const firstToken = high.getFirstToken();
|
|
58794
58814
|
// note that the tabix restore should be done before throwing the exception
|
|
58795
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
58796
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
58797
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
58798
|
-
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
58799
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
58800
|
-
${indentation}IF sy-subrc <> 0.
|
|
58801
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58802
|
-
${indentation}ENDIF.
|
|
58815
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
58816
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
58817
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
58818
|
+
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
58819
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
58820
|
+
${indentation}IF sy-subrc <> 0.
|
|
58821
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58822
|
+
${indentation}ENDIF.
|
|
58803
58823
|
${indentation}`);
|
|
58804
58824
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
|
|
58805
58825
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -58856,7 +58876,7 @@ ${indentation}`);
|
|
|
58856
58876
|
const className = classNames[0].concatTokens();
|
|
58857
58877
|
const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
58858
58878
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
58859
|
-
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
58879
|
+
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
58860
58880
|
${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
58861
58881
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
|
|
58862
58882
|
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -59018,16 +59038,16 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
59018
59038
|
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59019
59039
|
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59020
59040
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
59021
|
-
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
59022
|
-
${indentation}${uniqueName1}-msgid = ${id}.
|
|
59041
|
+
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
59042
|
+
${indentation}${uniqueName1}-msgid = ${id}.
|
|
59023
59043
|
${indentation}${uniqueName1}-msgno = ${number}.\n`;
|
|
59024
59044
|
if (withs.length > 0) {
|
|
59025
|
-
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
59026
|
-
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
59027
|
-
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
59045
|
+
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
59046
|
+
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
59047
|
+
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
59028
59048
|
${indentation}${uniqueName1}-attr4 = 'IF_T100_DYN_MSG~MSGV4'.\n`;
|
|
59029
59049
|
}
|
|
59030
|
-
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
59050
|
+
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
59031
59051
|
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`;
|
|
59032
59052
|
if (withs.length > 0) {
|
|
59033
59053
|
abap += `${indentation}${uniqueName2}->if_t100_dyn_msg~msgty = 'E'.\n`;
|
|
@@ -59139,10 +59159,10 @@ ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`
|
|
|
59139
59159
|
let code = "";
|
|
59140
59160
|
if (sourceRef.findFirstExpression(Expressions.TableExpression)) {
|
|
59141
59161
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59142
|
-
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
59143
|
-
IF sy-subrc <> 0.
|
|
59144
|
-
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
59145
|
-
ENDIF.
|
|
59162
|
+
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
59163
|
+
IF sy-subrc <> 0.
|
|
59164
|
+
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
59165
|
+
ENDIF.
|
|
59146
59166
|
GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
59147
59167
|
}
|
|
59148
59168
|
else {
|
|
@@ -59231,20 +59251,20 @@ GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
|
59231
59251
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59232
59252
|
const uniqueFS = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59233
59253
|
const uniqueNameIndex = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59234
|
-
code += ` items LIKE ${loopSourceName},
|
|
59235
|
-
END OF ${groupTargetName}type.
|
|
59236
|
-
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
59237
|
-
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
59254
|
+
code += ` items LIKE ${loopSourceName},
|
|
59255
|
+
END OF ${groupTargetName}type.
|
|
59256
|
+
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
59257
|
+
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
59238
59258
|
LOOP AT ${loopSourceName} ${(_l = high.findFirstExpression(Expressions.LoopTarget)) === null || _l === void 0 ? void 0 : _l.concatTokens()}.\n`;
|
|
59239
59259
|
if (groupIndexName !== undefined) {
|
|
59240
59260
|
code += `DATA(${uniqueNameIndex}) = sy-tabix.\n`;
|
|
59241
59261
|
}
|
|
59242
|
-
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
59262
|
+
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
59243
59263
|
IF sy-subrc = 0.\n`;
|
|
59244
59264
|
if (groupCountName !== undefined) {
|
|
59245
59265
|
code += ` <${uniqueFS}>-${groupCountName} = <${uniqueFS}>-${groupCountName} + 1.\n`;
|
|
59246
59266
|
}
|
|
59247
|
-
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
59267
|
+
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
59248
59268
|
ELSE.\n`;
|
|
59249
59269
|
code += ` CLEAR ${uniqueName}.\n`;
|
|
59250
59270
|
for (const c of group.findAllExpressions(Expressions.LoopGroupByComponent)) {
|
|
@@ -59265,8 +59285,8 @@ ELSE.\n`;
|
|
|
59265
59285
|
}
|
|
59266
59286
|
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE ${uniqueName}-items.\n`;
|
|
59267
59287
|
code += ` INSERT ${uniqueName} INTO TABLE ${groupTargetName}tab.\n`;
|
|
59268
|
-
code += `ENDIF.
|
|
59269
|
-
ENDLOOP.
|
|
59288
|
+
code += `ENDIF.
|
|
59289
|
+
ENDLOOP.
|
|
59270
59290
|
LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
59271
59291
|
let fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
|
|
59272
59292
|
for (const l of ((_m = highFile.getStructure()) === null || _m === void 0 ? void 0 : _m.findAllStructures(Structures.Loop)) || []) {
|
|
@@ -59438,7 +59458,7 @@ LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
|
59438
59458
|
const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
59439
59459
|
const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
59440
59460
|
// all ENUMS are char like?
|
|
59441
|
-
let code = `TYPES ${enumName} TYPE string.
|
|
59461
|
+
let code = `TYPES ${enumName} TYPE string.
|
|
59442
59462
|
CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
59443
59463
|
let count = 1;
|
|
59444
59464
|
for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
|
|
@@ -59482,14 +59502,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
|
59482
59502
|
const tabixBackup = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59483
59503
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
59484
59504
|
// restore tabix before exeption
|
|
59485
|
-
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
59486
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
59487
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
59488
|
-
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
59489
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
59490
|
-
${indentation}IF sy-subrc <> 0.
|
|
59491
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
59492
|
-
${indentation}ENDIF.
|
|
59505
|
+
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
59506
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
59507
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
59508
|
+
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
59509
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
59510
|
+
${indentation}IF sy-subrc <> 0.
|
|
59511
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
59512
|
+
${indentation}ENDIF.
|
|
59493
59513
|
${indentation}${uniqueName}`;
|
|
59494
59514
|
const start = target.getFirstToken().getStart();
|
|
59495
59515
|
const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
|
|
@@ -59573,11 +59593,11 @@ ${indentation}${uniqueName}`;
|
|
|
59573
59593
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
59574
59594
|
const source = (_b = templateSource === null || templateSource === void 0 ? void 0 : templateSource.findDirectExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
59575
59595
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
59576
|
-
const code = `DATA ${uniqueName} TYPE string.
|
|
59577
|
-
${indentation}CALL FUNCTION '${functionName}'
|
|
59578
|
-
${indentation} EXPORTING
|
|
59579
|
-
${indentation} input = ${source}
|
|
59580
|
-
${indentation} IMPORTING
|
|
59596
|
+
const code = `DATA ${uniqueName} TYPE string.
|
|
59597
|
+
${indentation}CALL FUNCTION '${functionName}'
|
|
59598
|
+
${indentation} EXPORTING
|
|
59599
|
+
${indentation} input = ${source}
|
|
59600
|
+
${indentation} IMPORTING
|
|
59581
59601
|
${indentation} output = ${uniqueName}.\n`;
|
|
59582
59602
|
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
|
|
59583
59603
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, child.getFirstToken().getStart(), child.getLastToken().getEnd(), uniqueName);
|
|
@@ -60889,12 +60909,12 @@ class EasyToFindMessages {
|
|
|
60889
60909
|
key: "easy_to_find_messages",
|
|
60890
60910
|
title: "Easy to find messages",
|
|
60891
60911
|
shortDescription: `Make messages easy to find`,
|
|
60892
|
-
extendedInformation: `All messages must be statically referenced exactly once
|
|
60893
|
-
|
|
60894
|
-
Only MESSAGE and RAISE statments are counted as static references
|
|
60895
|
-
|
|
60896
|
-
Also see rule "message_exists"
|
|
60897
|
-
|
|
60912
|
+
extendedInformation: `All messages must be statically referenced exactly once
|
|
60913
|
+
|
|
60914
|
+
Only MESSAGE and RAISE statments are counted as static references
|
|
60915
|
+
|
|
60916
|
+
Also see rule "message_exists"
|
|
60917
|
+
|
|
60898
60918
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#make-messages-easy-to-find`,
|
|
60899
60919
|
tags: [_irule_1.RuleTag.Styleguide],
|
|
60900
60920
|
};
|
|
@@ -60975,13 +60995,13 @@ class EmptyEvent extends _abap_rule_1.ABAPRule {
|
|
|
60975
60995
|
shortDescription: `Empty selection screen or list processing event block`,
|
|
60976
60996
|
extendedInformation: ``,
|
|
60977
60997
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
60978
|
-
badExample: `
|
|
60979
|
-
INITIALIZATION.
|
|
60980
|
-
WRITE 'hello'.
|
|
60998
|
+
badExample: `
|
|
60999
|
+
INITIALIZATION.
|
|
61000
|
+
WRITE 'hello'.
|
|
60981
61001
|
END-OF-SELECTION.`,
|
|
60982
|
-
goodExample: `
|
|
60983
|
-
START-OF-SELECTION.
|
|
60984
|
-
PERFORM sdf.
|
|
61002
|
+
goodExample: `
|
|
61003
|
+
START-OF-SELECTION.
|
|
61004
|
+
PERFORM sdf.
|
|
60985
61005
|
COMMIT WORK.`,
|
|
60986
61006
|
};
|
|
60987
61007
|
}
|
|
@@ -61073,8 +61093,8 @@ class EmptyLineinStatement extends _abap_rule_1.ABAPRule {
|
|
|
61073
61093
|
key: "empty_line_in_statement",
|
|
61074
61094
|
title: "Find empty lines in statements",
|
|
61075
61095
|
shortDescription: `Checks that statements do not contain empty lines.`,
|
|
61076
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
61077
|
-
|
|
61096
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
61097
|
+
|
|
61078
61098
|
https://docs.abapopenchecks.org/checks/41/`,
|
|
61079
61099
|
tags: [_irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
61080
61100
|
badExample: `WRITE\n\nhello.`,
|
|
@@ -61250,13 +61270,13 @@ class EmptyStructure extends _abap_rule_1.ABAPRule {
|
|
|
61250
61270
|
shortDescription: `Checks that the code does not contain empty blocks.`,
|
|
61251
61271
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-empty-if-branches`,
|
|
61252
61272
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
61253
|
-
badExample: `IF foo = bar.
|
|
61254
|
-
ENDIF.
|
|
61255
|
-
|
|
61256
|
-
DO 2 TIMES.
|
|
61273
|
+
badExample: `IF foo = bar.
|
|
61274
|
+
ENDIF.
|
|
61275
|
+
|
|
61276
|
+
DO 2 TIMES.
|
|
61257
61277
|
ENDDO.`,
|
|
61258
|
-
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
61259
|
-
ENDLOOP.
|
|
61278
|
+
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
61279
|
+
ENDLOOP.
|
|
61260
61280
|
result = xsdbool( sy-subrc = 0 ).`,
|
|
61261
61281
|
};
|
|
61262
61282
|
}
|
|
@@ -61398,10 +61418,10 @@ class ExitOrCheck extends _abap_rule_1.ABAPRule {
|
|
|
61398
61418
|
return {
|
|
61399
61419
|
key: "exit_or_check",
|
|
61400
61420
|
title: "Find EXIT or CHECK outside loops",
|
|
61401
|
-
shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
|
|
61421
|
+
shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
|
|
61402
61422
|
Use RETURN to leave procesing blocks instead.`,
|
|
61403
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
|
|
61404
|
-
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
|
|
61423
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
|
|
61424
|
+
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
|
|
61405
61425
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return`,
|
|
61406
61426
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
61407
61427
|
};
|
|
@@ -61484,12 +61504,12 @@ class ExpandMacros extends _abap_rule_1.ABAPRule {
|
|
|
61484
61504
|
key: "expand_macros",
|
|
61485
61505
|
title: "Expand Macros",
|
|
61486
61506
|
shortDescription: `Allows expanding macro calls with quick fixes`,
|
|
61487
|
-
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
61488
|
-
|
|
61507
|
+
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
61508
|
+
|
|
61489
61509
|
Note that macros/DEFINE cannot be used in the ABAP Cloud programming model`,
|
|
61490
|
-
badExample: `DEFINE _hello.
|
|
61491
|
-
WRITE 'hello'.
|
|
61492
|
-
END-OF-DEFINITION.
|
|
61510
|
+
badExample: `DEFINE _hello.
|
|
61511
|
+
WRITE 'hello'.
|
|
61512
|
+
END-OF-DEFINITION.
|
|
61493
61513
|
_hello.`,
|
|
61494
61514
|
goodExample: `WRITE 'hello'.`,
|
|
61495
61515
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Upport],
|
|
@@ -61576,7 +61596,7 @@ class Exporting extends _abap_rule_1.ABAPRule {
|
|
|
61576
61596
|
shortDescription: `Detects EXPORTING statements which can be omitted.`,
|
|
61577
61597
|
badExample: `call_method( EXPORTING foo = bar ).`,
|
|
61578
61598
|
goodExample: `call_method( foo = bar ).`,
|
|
61579
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
|
|
61599
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
|
|
61580
61600
|
https://docs.abapopenchecks.org/checks/30/`,
|
|
61581
61601
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
61582
61602
|
};
|
|
@@ -61674,7 +61694,7 @@ class ForbiddenIdentifier extends _abap_rule_1.ABAPRule {
|
|
|
61674
61694
|
key: "forbidden_identifier",
|
|
61675
61695
|
title: "Forbidden Identifier",
|
|
61676
61696
|
shortDescription: `Forbid use of specified identifiers, list of regex.`,
|
|
61677
|
-
extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
|
|
61697
|
+
extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
|
|
61678
61698
|
https://github.com/abaplint/transpiler/blob/bda94b8b56e2b7f2f87be2168f12361aa530220e/packages/transpiler/src/validation.ts#L44`,
|
|
61679
61699
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
61680
61700
|
};
|
|
@@ -61916,8 +61936,8 @@ class ForbiddenVoidType {
|
|
|
61916
61936
|
key: "forbidden_void_type",
|
|
61917
61937
|
title: "Forbidden Void Types",
|
|
61918
61938
|
shortDescription: `Avoid usage of specified void types.`,
|
|
61919
|
-
extendedInformation: `Inspiration:
|
|
61920
|
-
BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
|
|
61939
|
+
extendedInformation: `Inspiration:
|
|
61940
|
+
BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
|
|
61921
61941
|
DATS, TIMS, DATUM, FLAG, INT4, NUMC3, NUMC4, SAP_BOOL, TEXT25, TEXT80, X255, XFELD`,
|
|
61922
61942
|
};
|
|
61923
61943
|
}
|
|
@@ -62160,7 +62180,9 @@ class FullyTypeITabs extends _abap_rule_1.ABAPRule {
|
|
|
62160
62180
|
key: "fully_type_itabs",
|
|
62161
62181
|
title: "Fully type internal tables",
|
|
62162
62182
|
shortDescription: `No implict table types or table keys`,
|
|
62163
|
-
|
|
62183
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-the-right-table-type
|
|
62184
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key`,
|
|
62185
|
+
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
62164
62186
|
DATA lt_bar TYPE STANDARD TABLE OF ty.`,
|
|
62165
62187
|
goodExample: `DATA lt_foo TYPE STANDARD TABLE OF ty WITH EMPTY KEY.`,
|
|
62166
62188
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
@@ -62345,26 +62367,26 @@ class FunctionalWriting extends _abap_rule_1.ABAPRule {
|
|
|
62345
62367
|
key: "functional_writing",
|
|
62346
62368
|
title: "Use functional writing",
|
|
62347
62369
|
shortDescription: `Detects usage of call method when functional style calls can be used.`,
|
|
62348
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
|
|
62370
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
|
|
62349
62371
|
https://docs.abapopenchecks.org/checks/07/`,
|
|
62350
62372
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
62351
|
-
badExample: `CALL METHOD zcl_class=>method( ).
|
|
62352
|
-
CALL METHOD cl_abap_typedescr=>describe_by_name
|
|
62353
|
-
EXPORTING
|
|
62354
|
-
p_name = 'NAME'
|
|
62355
|
-
RECEIVING
|
|
62356
|
-
p_descr_ref = lr_typedescr
|
|
62357
|
-
EXCEPTIONS
|
|
62358
|
-
type_not_found = 1
|
|
62373
|
+
badExample: `CALL METHOD zcl_class=>method( ).
|
|
62374
|
+
CALL METHOD cl_abap_typedescr=>describe_by_name
|
|
62375
|
+
EXPORTING
|
|
62376
|
+
p_name = 'NAME'
|
|
62377
|
+
RECEIVING
|
|
62378
|
+
p_descr_ref = lr_typedescr
|
|
62379
|
+
EXCEPTIONS
|
|
62380
|
+
type_not_found = 1
|
|
62359
62381
|
OTHERS = 2.`,
|
|
62360
|
-
goodExample: `zcl_class=>method( ).
|
|
62361
|
-
cl_abap_typedescr=>describe_by_name(
|
|
62362
|
-
EXPORTING
|
|
62363
|
-
p_name = 'NAME'
|
|
62364
|
-
RECEIVING
|
|
62365
|
-
p_descr_ref = lr_typedescr
|
|
62366
|
-
EXCEPTIONS
|
|
62367
|
-
type_not_found = 1
|
|
62382
|
+
goodExample: `zcl_class=>method( ).
|
|
62383
|
+
cl_abap_typedescr=>describe_by_name(
|
|
62384
|
+
EXPORTING
|
|
62385
|
+
p_name = 'NAME'
|
|
62386
|
+
RECEIVING
|
|
62387
|
+
p_descr_ref = lr_typedescr
|
|
62388
|
+
EXCEPTIONS
|
|
62389
|
+
type_not_found = 1
|
|
62368
62390
|
OTHERS = 2 ).`,
|
|
62369
62391
|
};
|
|
62370
62392
|
}
|
|
@@ -62475,14 +62497,14 @@ class GlobalClass extends _abap_rule_1.ABAPRule {
|
|
|
62475
62497
|
key: "global_class",
|
|
62476
62498
|
title: "Global class checks",
|
|
62477
62499
|
shortDescription: `Checks related to global classes`,
|
|
62478
|
-
extendedInformation: `* global classes must be in own files
|
|
62479
|
-
|
|
62480
|
-
* file names must match class name
|
|
62481
|
-
|
|
62482
|
-
* file names must match interface name
|
|
62483
|
-
|
|
62484
|
-
* global classes must be global definitions
|
|
62485
|
-
|
|
62500
|
+
extendedInformation: `* global classes must be in own files
|
|
62501
|
+
|
|
62502
|
+
* file names must match class name
|
|
62503
|
+
|
|
62504
|
+
* file names must match interface name
|
|
62505
|
+
|
|
62506
|
+
* global classes must be global definitions
|
|
62507
|
+
|
|
62486
62508
|
* global interfaces must be global definitions`,
|
|
62487
62509
|
tags: [_irule_1.RuleTag.Syntax],
|
|
62488
62510
|
};
|
|
@@ -62581,21 +62603,21 @@ class IdenticalConditions extends _abap_rule_1.ABAPRule {
|
|
|
62581
62603
|
return {
|
|
62582
62604
|
key: "identical_conditions",
|
|
62583
62605
|
title: "Identical conditions",
|
|
62584
|
-
shortDescription: `Find identical conditions in IF + CASE + WHILE etc
|
|
62585
|
-
|
|
62606
|
+
shortDescription: `Find identical conditions in IF + CASE + WHILE etc
|
|
62607
|
+
|
|
62586
62608
|
Prerequsites: code is pretty printed with identical cAsE`,
|
|
62587
62609
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
62588
|
-
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
62589
|
-
ENDIF.
|
|
62590
|
-
CASE bar.
|
|
62591
|
-
WHEN '1'.
|
|
62592
|
-
WHEN 'A' OR '1'.
|
|
62610
|
+
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
62611
|
+
ENDIF.
|
|
62612
|
+
CASE bar.
|
|
62613
|
+
WHEN '1'.
|
|
62614
|
+
WHEN 'A' OR '1'.
|
|
62593
62615
|
ENDCASE.`,
|
|
62594
|
-
goodExample: `IF foo = bar OR 1 = a.
|
|
62595
|
-
ENDIF.
|
|
62596
|
-
CASE bar.
|
|
62597
|
-
WHEN '1'.
|
|
62598
|
-
WHEN 'A'.
|
|
62616
|
+
goodExample: `IF foo = bar OR 1 = a.
|
|
62617
|
+
ENDIF.
|
|
62618
|
+
CASE bar.
|
|
62619
|
+
WHEN '1'.
|
|
62620
|
+
WHEN 'A'.
|
|
62599
62621
|
ENDCASE.`,
|
|
62600
62622
|
};
|
|
62601
62623
|
}
|
|
@@ -62729,23 +62751,23 @@ class IdenticalContents extends _abap_rule_1.ABAPRule {
|
|
|
62729
62751
|
key: "identical_contents",
|
|
62730
62752
|
title: "Identical contents",
|
|
62731
62753
|
shortDescription: `Find identical contents in blocks inside IFs, both in the beginning and in the end.`,
|
|
62732
|
-
extendedInformation: `
|
|
62733
|
-
Prerequsites: code is pretty printed with identical cAsE
|
|
62734
|
-
|
|
62754
|
+
extendedInformation: `
|
|
62755
|
+
Prerequsites: code is pretty printed with identical cAsE
|
|
62756
|
+
|
|
62735
62757
|
Chained statments are ignored`,
|
|
62736
62758
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
62737
|
-
badExample: `IF foo = bar.
|
|
62738
|
-
WRITE 'bar'.
|
|
62739
|
-
WRITE 'world'.
|
|
62740
|
-
ELSE.
|
|
62741
|
-
WRITE 'foo'.
|
|
62742
|
-
WRITE 'world'.
|
|
62759
|
+
badExample: `IF foo = bar.
|
|
62760
|
+
WRITE 'bar'.
|
|
62761
|
+
WRITE 'world'.
|
|
62762
|
+
ELSE.
|
|
62763
|
+
WRITE 'foo'.
|
|
62764
|
+
WRITE 'world'.
|
|
62743
62765
|
ENDIF.`,
|
|
62744
|
-
goodExample: `IF foo = bar.
|
|
62745
|
-
WRITE 'bar'.
|
|
62746
|
-
ELSE.
|
|
62747
|
-
WRITE 'foo'.
|
|
62748
|
-
ENDIF.
|
|
62766
|
+
goodExample: `IF foo = bar.
|
|
62767
|
+
WRITE 'bar'.
|
|
62768
|
+
ELSE.
|
|
62769
|
+
WRITE 'foo'.
|
|
62770
|
+
ENDIF.
|
|
62749
62771
|
WRITE 'world'.`,
|
|
62750
62772
|
};
|
|
62751
62773
|
}
|
|
@@ -62853,12 +62875,12 @@ class IdenticalDescriptions {
|
|
|
62853
62875
|
key: "identical_descriptions",
|
|
62854
62876
|
title: "Identical descriptions",
|
|
62855
62877
|
shortDescription: `Searches for objects with the same type and same description`,
|
|
62856
|
-
extendedInformation: `Case insensitive
|
|
62857
|
-
|
|
62858
|
-
Only checks the master language descriptions
|
|
62859
|
-
|
|
62860
|
-
Dependencies are skipped
|
|
62861
|
-
|
|
62878
|
+
extendedInformation: `Case insensitive
|
|
62879
|
+
|
|
62880
|
+
Only checks the master language descriptions
|
|
62881
|
+
|
|
62882
|
+
Dependencies are skipped
|
|
62883
|
+
|
|
62862
62884
|
Works for: INTF, CLAS, DOMA, DTEL, FUNC in same FUGR`,
|
|
62863
62885
|
tags: [],
|
|
62864
62886
|
};
|
|
@@ -63032,43 +63054,43 @@ class IfInIf extends _abap_rule_1.ABAPRule {
|
|
|
63032
63054
|
key: "if_in_if",
|
|
63033
63055
|
title: "IF in IF",
|
|
63034
63056
|
shortDescription: `Detects nested ifs which can be refactored.`,
|
|
63035
|
-
extendedInformation: `
|
|
63036
|
-
Directly nested IFs without ELSE can be refactored to a single condition using AND.
|
|
63037
|
-
|
|
63038
|
-
ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
|
|
63039
|
-
|
|
63040
|
-
https://docs.abapopenchecks.org/checks/01/
|
|
63057
|
+
extendedInformation: `
|
|
63058
|
+
Directly nested IFs without ELSE can be refactored to a single condition using AND.
|
|
63059
|
+
|
|
63060
|
+
ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
|
|
63061
|
+
|
|
63062
|
+
https://docs.abapopenchecks.org/checks/01/
|
|
63041
63063
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low`,
|
|
63042
|
-
badExample: `IF condition1.
|
|
63043
|
-
IF condition2.
|
|
63044
|
-
...
|
|
63045
|
-
ENDIF.
|
|
63046
|
-
ENDIF.
|
|
63047
|
-
|
|
63048
|
-
IF condition1.
|
|
63049
|
-
...
|
|
63050
|
-
ELSE.
|
|
63051
|
-
IF condition2.
|
|
63052
|
-
...
|
|
63053
|
-
ENDIF.
|
|
63064
|
+
badExample: `IF condition1.
|
|
63065
|
+
IF condition2.
|
|
63066
|
+
...
|
|
63067
|
+
ENDIF.
|
|
63068
|
+
ENDIF.
|
|
63069
|
+
|
|
63070
|
+
IF condition1.
|
|
63071
|
+
...
|
|
63072
|
+
ELSE.
|
|
63073
|
+
IF condition2.
|
|
63074
|
+
...
|
|
63075
|
+
ENDIF.
|
|
63054
63076
|
ENDIF.`,
|
|
63055
|
-
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
63056
|
-
...
|
|
63057
|
-
ENDIF.
|
|
63058
|
-
|
|
63059
|
-
IF condition1.
|
|
63060
|
-
...
|
|
63061
|
-
ELSEIF condition2.
|
|
63062
|
-
...
|
|
63063
|
-
ENDIF.
|
|
63064
|
-
|
|
63065
|
-
CASE variable.
|
|
63066
|
-
WHEN value1.
|
|
63067
|
-
...
|
|
63068
|
-
WHEN value2.
|
|
63069
|
-
IF condition2.
|
|
63070
|
-
...
|
|
63071
|
-
ENDIF.
|
|
63077
|
+
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
63078
|
+
...
|
|
63079
|
+
ENDIF.
|
|
63080
|
+
|
|
63081
|
+
IF condition1.
|
|
63082
|
+
...
|
|
63083
|
+
ELSEIF condition2.
|
|
63084
|
+
...
|
|
63085
|
+
ENDIF.
|
|
63086
|
+
|
|
63087
|
+
CASE variable.
|
|
63088
|
+
WHEN value1.
|
|
63089
|
+
...
|
|
63090
|
+
WHEN value2.
|
|
63091
|
+
IF condition2.
|
|
63092
|
+
...
|
|
63093
|
+
ENDIF.
|
|
63072
63094
|
ENDCASE.`,
|
|
63073
63095
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
63074
63096
|
};
|
|
@@ -63253,9 +63275,9 @@ class ImplementMethods extends _abap_rule_1.ABAPRule {
|
|
|
63253
63275
|
for (const i of ((_a = file.getStructure()) === null || _a === void 0 ? void 0 : _a.findAllStatements(Statements.ClassImplementation)) || []) {
|
|
63254
63276
|
const name = (_b = i.findFirstExpression(Expressions.ClassName)) === null || _b === void 0 ? void 0 : _b.getFirstToken().getStr().toUpperCase();
|
|
63255
63277
|
if (name === impl.identifier.getName().toUpperCase()) {
|
|
63256
|
-
return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
|
|
63257
|
-
METHOD ${methodName.toLowerCase()}.
|
|
63258
|
-
RETURN. " todo, implement method
|
|
63278
|
+
return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
|
|
63279
|
+
METHOD ${methodName.toLowerCase()}.
|
|
63280
|
+
RETURN. " todo, implement method
|
|
63259
63281
|
ENDMETHOD.`);
|
|
63260
63282
|
}
|
|
63261
63283
|
}
|
|
@@ -63434,14 +63456,14 @@ class ImplicitStartOfSelection extends _abap_rule_1.ABAPRule {
|
|
|
63434
63456
|
key: "implicit_start_of_selection",
|
|
63435
63457
|
title: "Implicit START-OF-SELECTION",
|
|
63436
63458
|
shortDescription: `Add explicit selection screen event handling`,
|
|
63437
|
-
extendedInformation: `Only runs for executable programs
|
|
63438
|
-
|
|
63459
|
+
extendedInformation: `Only runs for executable programs
|
|
63460
|
+
|
|
63439
63461
|
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selection.htm`,
|
|
63440
63462
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
63441
|
-
badExample: `REPORT zfoo.
|
|
63463
|
+
badExample: `REPORT zfoo.
|
|
63442
63464
|
WRITE 'hello'.`,
|
|
63443
|
-
goodExample: `
|
|
63444
|
-
START-OF-SELECTION.
|
|
63465
|
+
goodExample: `
|
|
63466
|
+
START-OF-SELECTION.
|
|
63445
63467
|
WRITE 'hello'.`,
|
|
63446
63468
|
};
|
|
63447
63469
|
}
|
|
@@ -63546,19 +63568,19 @@ class InStatementIndentation extends _abap_rule_1.ABAPRule {
|
|
|
63546
63568
|
key: "in_statement_indentation",
|
|
63547
63569
|
title: "In-statement indentation",
|
|
63548
63570
|
shortDescription: "Checks alignment within statements which span multiple lines.",
|
|
63549
|
-
extendedInformation: `Lines following the first line should be indented once (2 spaces).
|
|
63550
|
-
|
|
63551
|
-
For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
|
|
63571
|
+
extendedInformation: `Lines following the first line should be indented once (2 spaces).
|
|
63572
|
+
|
|
63573
|
+
For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
|
|
63552
63574
|
to distinguish them better from code within the block.`,
|
|
63553
|
-
badExample: `IF 1 = 1
|
|
63554
|
-
AND 2 = 2.
|
|
63555
|
-
WRITE 'hello' &&
|
|
63556
|
-
'world'.
|
|
63575
|
+
badExample: `IF 1 = 1
|
|
63576
|
+
AND 2 = 2.
|
|
63577
|
+
WRITE 'hello' &&
|
|
63578
|
+
'world'.
|
|
63557
63579
|
ENDIF.`,
|
|
63558
|
-
goodExample: `IF 1 = 1
|
|
63559
|
-
AND 2 = 2.
|
|
63560
|
-
WRITE 'hello' &&
|
|
63561
|
-
'world'.
|
|
63580
|
+
goodExample: `IF 1 = 1
|
|
63581
|
+
AND 2 = 2.
|
|
63582
|
+
WRITE 'hello' &&
|
|
63583
|
+
'world'.
|
|
63562
63584
|
ENDIF.`,
|
|
63563
63585
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
63564
63586
|
};
|
|
@@ -63681,23 +63703,23 @@ class Indentation extends _abap_rule_1.ABAPRule {
|
|
|
63681
63703
|
title: "Indentation",
|
|
63682
63704
|
shortDescription: `Checks indentation`,
|
|
63683
63705
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
63684
|
-
badExample: `CLASS lcl DEFINITION.
|
|
63685
|
-
PRIVATE SECTION.
|
|
63686
|
-
METHODS constructor.
|
|
63687
|
-
ENDCLASS.
|
|
63688
|
-
|
|
63689
|
-
CLASS lcl IMPLEMENTATION.
|
|
63690
|
-
METHOD constructor.
|
|
63691
|
-
ENDMETHOD.
|
|
63706
|
+
badExample: `CLASS lcl DEFINITION.
|
|
63707
|
+
PRIVATE SECTION.
|
|
63708
|
+
METHODS constructor.
|
|
63709
|
+
ENDCLASS.
|
|
63710
|
+
|
|
63711
|
+
CLASS lcl IMPLEMENTATION.
|
|
63712
|
+
METHOD constructor.
|
|
63713
|
+
ENDMETHOD.
|
|
63692
63714
|
ENDCLASS.`,
|
|
63693
|
-
goodExample: `CLASS lcl DEFINITION.
|
|
63694
|
-
PRIVATE SECTION.
|
|
63695
|
-
METHODS constructor.
|
|
63696
|
-
ENDCLASS.
|
|
63697
|
-
|
|
63698
|
-
CLASS lcl IMPLEMENTATION.
|
|
63699
|
-
METHOD constructor.
|
|
63700
|
-
ENDMETHOD.
|
|
63715
|
+
goodExample: `CLASS lcl DEFINITION.
|
|
63716
|
+
PRIVATE SECTION.
|
|
63717
|
+
METHODS constructor.
|
|
63718
|
+
ENDCLASS.
|
|
63719
|
+
|
|
63720
|
+
CLASS lcl IMPLEMENTATION.
|
|
63721
|
+
METHOD constructor.
|
|
63722
|
+
ENDMETHOD.
|
|
63701
63723
|
ENDCLASS.`,
|
|
63702
63724
|
};
|
|
63703
63725
|
}
|
|
@@ -64098,9 +64120,9 @@ class IntfReferencingClas {
|
|
|
64098
64120
|
key: "intf_referencing_clas",
|
|
64099
64121
|
title: "INTF referencing CLAS",
|
|
64100
64122
|
shortDescription: `Interface contains references to class`,
|
|
64101
|
-
extendedInformation: `Only global interfaces are checked.
|
|
64102
|
-
Only first level references are checked.
|
|
64103
|
-
Exception class references are ignored.
|
|
64123
|
+
extendedInformation: `Only global interfaces are checked.
|
|
64124
|
+
Only first level references are checked.
|
|
64125
|
+
Exception class references are ignored.
|
|
64104
64126
|
Void references are ignored.`,
|
|
64105
64127
|
};
|
|
64106
64128
|
}
|
|
@@ -64185,9 +64207,9 @@ class InvalidTableIndex extends _abap_rule_1.ABAPRule {
|
|
|
64185
64207
|
title: "Invalid Table Index",
|
|
64186
64208
|
shortDescription: `Issues error for constant table index zero, as ABAP starts from 1`,
|
|
64187
64209
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
64188
|
-
badExample: `DATA(first) = table[ 0 ].
|
|
64210
|
+
badExample: `DATA(first) = table[ 0 ].
|
|
64189
64211
|
READ TABLE gt_stack ASSIGNING <ls_stack> INDEX 0.`,
|
|
64190
|
-
goodExample: `DATA(first) = table[ 1 ].
|
|
64212
|
+
goodExample: `DATA(first) = table[ 1 ].
|
|
64191
64213
|
READ TABLE gt_stack ASSIGNING <ls_stack> INDEX 1.`,
|
|
64192
64214
|
};
|
|
64193
64215
|
}
|
|
@@ -64788,8 +64810,8 @@ class LineBreakStyle {
|
|
|
64788
64810
|
return {
|
|
64789
64811
|
key: "line_break_style",
|
|
64790
64812
|
title: "Makes sure line breaks are consistent in the ABAP code",
|
|
64791
|
-
shortDescription: `Enforces LF as newlines in ABAP files
|
|
64792
|
-
|
|
64813
|
+
shortDescription: `Enforces LF as newlines in ABAP files
|
|
64814
|
+
|
|
64793
64815
|
abapGit does not work with CRLF`,
|
|
64794
64816
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile],
|
|
64795
64817
|
};
|
|
@@ -64858,7 +64880,7 @@ class LineLength extends _abap_rule_1.ABAPRule {
|
|
|
64858
64880
|
key: "line_length",
|
|
64859
64881
|
title: "Line length",
|
|
64860
64882
|
shortDescription: `Detects lines exceeding the provided maximum length.`,
|
|
64861
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
|
|
64883
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
|
|
64862
64884
|
https://docs.abapopenchecks.org/checks/04/`,
|
|
64863
64885
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
64864
64886
|
};
|
|
@@ -64929,7 +64951,7 @@ class LineOnlyPunc extends _abap_rule_1.ABAPRule {
|
|
|
64929
64951
|
key: "line_only_punc",
|
|
64930
64952
|
title: "Line containing only punctuation",
|
|
64931
64953
|
shortDescription: `Detects lines containing only punctuation.`,
|
|
64932
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
|
|
64954
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
|
|
64933
64955
|
https://docs.abapopenchecks.org/checks/16/`,
|
|
64934
64956
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
64935
64957
|
badExample: "zcl_class=>method(\n).",
|
|
@@ -65192,15 +65214,15 @@ class LocalVariableNames extends _abap_rule_1.ABAPRule {
|
|
|
65192
65214
|
return {
|
|
65193
65215
|
key: "local_variable_names",
|
|
65194
65216
|
title: "Local variable naming conventions",
|
|
65195
|
-
shortDescription: `
|
|
65196
|
-
Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
|
|
65217
|
+
shortDescription: `
|
|
65218
|
+
Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
|
|
65197
65219
|
Regexes are case-insensitive.`,
|
|
65198
65220
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile],
|
|
65199
|
-
badExample: `FORM bar.
|
|
65200
|
-
DATA foo.
|
|
65221
|
+
badExample: `FORM bar.
|
|
65222
|
+
DATA foo.
|
|
65201
65223
|
ENDFORM.`,
|
|
65202
|
-
goodExample: `FORM bar.
|
|
65203
|
-
DATA lv_foo.
|
|
65224
|
+
goodExample: `FORM bar.
|
|
65225
|
+
DATA lv_foo.
|
|
65204
65226
|
ENDFORM.`,
|
|
65205
65227
|
};
|
|
65206
65228
|
}
|
|
@@ -65352,9 +65374,9 @@ class MacroNaming extends _abap_rule_1.ABAPRule {
|
|
|
65352
65374
|
shortDescription: `Allows you to enforce a pattern for macro definitions`,
|
|
65353
65375
|
extendedInformation: `Use rule "avoid_use" to avoid macros altogether.`,
|
|
65354
65376
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile],
|
|
65355
|
-
badExample: `DEFINE something.
|
|
65377
|
+
badExample: `DEFINE something.
|
|
65356
65378
|
END-OF-DEFINITION.`,
|
|
65357
|
-
goodExample: `DEFINE _something.
|
|
65379
|
+
goodExample: `DEFINE _something.
|
|
65358
65380
|
END-OF-DEFINITION.`,
|
|
65359
65381
|
};
|
|
65360
65382
|
}
|
|
@@ -65427,10 +65449,10 @@ class MainFileContents {
|
|
|
65427
65449
|
key: "main_file_contents",
|
|
65428
65450
|
title: "Main file contents",
|
|
65429
65451
|
shortDescription: `Checks related to report declarations.`,
|
|
65430
|
-
extendedInformation: `Does not run if the target version is Cloud
|
|
65431
|
-
|
|
65432
|
-
* PROGs must begin with "REPORT <name>." or "PROGRAM <name>.
|
|
65433
|
-
* TYPEs must begin with "TYPE-POOL <name>."
|
|
65452
|
+
extendedInformation: `Does not run if the target version is Cloud
|
|
65453
|
+
|
|
65454
|
+
* PROGs must begin with "REPORT <name>." or "PROGRAM <name>.
|
|
65455
|
+
* TYPEs must begin with "TYPE-POOL <name>."
|
|
65434
65456
|
`,
|
|
65435
65457
|
};
|
|
65436
65458
|
}
|
|
@@ -65546,17 +65568,17 @@ class ManyParentheses extends _abap_rule_1.ABAPRule {
|
|
|
65546
65568
|
title: "Too many parentheses",
|
|
65547
65569
|
shortDescription: `Searches for expressions where extra parentheses can safely be removed`,
|
|
65548
65570
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
65549
|
-
badExample: `
|
|
65550
|
-
IF ( destination IS INITIAL ).
|
|
65551
|
-
ENDIF.
|
|
65552
|
-
IF foo = boo AND ( bar = lar AND moo = loo ).
|
|
65553
|
-
ENDIF.
|
|
65571
|
+
badExample: `
|
|
65572
|
+
IF ( destination IS INITIAL ).
|
|
65573
|
+
ENDIF.
|
|
65574
|
+
IF foo = boo AND ( bar = lar AND moo = loo ).
|
|
65575
|
+
ENDIF.
|
|
65554
65576
|
`,
|
|
65555
|
-
goodExample: `
|
|
65556
|
-
IF destination IS INITIAL.
|
|
65557
|
-
ENDIF.
|
|
65558
|
-
IF foo = boo AND bar = lar AND moo = loo.
|
|
65559
|
-
ENDIF.
|
|
65577
|
+
goodExample: `
|
|
65578
|
+
IF destination IS INITIAL.
|
|
65579
|
+
ENDIF.
|
|
65580
|
+
IF foo = boo AND bar = lar AND moo = loo.
|
|
65581
|
+
ENDIF.
|
|
65560
65582
|
`,
|
|
65561
65583
|
};
|
|
65562
65584
|
}
|
|
@@ -65730,14 +65752,14 @@ class MaxOneMethodParameterPerLine extends _abap_rule_1.ABAPRule {
|
|
|
65730
65752
|
title: "Max one method parameter definition per line",
|
|
65731
65753
|
shortDescription: `Keep max one method parameter description per line`,
|
|
65732
65754
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace],
|
|
65733
|
-
badExample: `
|
|
65734
|
-
METHODS apps_scope_token
|
|
65735
|
-
IMPORTING
|
|
65755
|
+
badExample: `
|
|
65756
|
+
METHODS apps_scope_token
|
|
65757
|
+
IMPORTING
|
|
65736
65758
|
body TYPE bodyapps_scope_token client_id TYPE str.`,
|
|
65737
|
-
goodExample: `
|
|
65738
|
-
METHODS apps_scope_token
|
|
65739
|
-
IMPORTING
|
|
65740
|
-
body TYPE bodyapps_scope_token
|
|
65759
|
+
goodExample: `
|
|
65760
|
+
METHODS apps_scope_token
|
|
65761
|
+
IMPORTING
|
|
65762
|
+
body TYPE bodyapps_scope_token
|
|
65741
65763
|
client_id TYPE str.`,
|
|
65742
65764
|
};
|
|
65743
65765
|
}
|
|
@@ -65802,11 +65824,11 @@ class MaxOneStatement extends _abap_rule_1.ABAPRule {
|
|
|
65802
65824
|
key: "max_one_statement",
|
|
65803
65825
|
title: "Max one statement per line",
|
|
65804
65826
|
shortDescription: `Checks that each line contains only a single statement.`,
|
|
65805
|
-
extendedInformation: `Does not report empty statements, use rule empty_statement for detecting empty statements.
|
|
65806
|
-
|
|
65807
|
-
Does not report anything for chained statements.
|
|
65808
|
-
|
|
65809
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-more-than-one-statement-per-line
|
|
65827
|
+
extendedInformation: `Does not report empty statements, use rule empty_statement for detecting empty statements.
|
|
65828
|
+
|
|
65829
|
+
Does not report anything for chained statements.
|
|
65830
|
+
|
|
65831
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-more-than-one-statement-per-line
|
|
65810
65832
|
https://docs.abapopenchecks.org/checks/11/`,
|
|
65811
65833
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
65812
65834
|
badExample: `WRITE foo. WRITE bar.`,
|
|
@@ -66144,8 +66166,8 @@ class MethodLength {
|
|
|
66144
66166
|
key: "method_length",
|
|
66145
66167
|
title: "Method/Form Length",
|
|
66146
66168
|
shortDescription: `Checks relating to method/form length.`,
|
|
66147
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-methods-small
|
|
66148
|
-
|
|
66169
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-methods-small
|
|
66170
|
+
|
|
66149
66171
|
Abstract methods without statements are considered okay.`,
|
|
66150
66172
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
66151
66173
|
};
|
|
@@ -66250,20 +66272,20 @@ class MethodOverwritesBuiltIn extends _abap_rule_1.ABAPRule {
|
|
|
66250
66272
|
key: "method_overwrites_builtin",
|
|
66251
66273
|
title: "Method name overwrites builtin function",
|
|
66252
66274
|
shortDescription: `Checks Method names that overwrite builtin SAP functions`,
|
|
66253
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
|
|
66254
|
-
|
|
66255
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
|
|
66256
|
-
|
|
66275
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
|
|
66276
|
+
|
|
66277
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
|
|
66278
|
+
|
|
66257
66279
|
Interface method names are ignored`,
|
|
66258
66280
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
66259
|
-
badExample: `CLASS lcl DEFINITION.
|
|
66260
|
-
PUBLIC SECTION.
|
|
66261
|
-
METHODS matches.
|
|
66262
|
-
ENDCLASS.
|
|
66263
|
-
|
|
66264
|
-
CLASS lcl IMPLEMENTATION.
|
|
66265
|
-
METHOD matches.
|
|
66266
|
-
ENDMETHOD.
|
|
66281
|
+
badExample: `CLASS lcl DEFINITION.
|
|
66282
|
+
PUBLIC SECTION.
|
|
66283
|
+
METHODS matches.
|
|
66284
|
+
ENDCLASS.
|
|
66285
|
+
|
|
66286
|
+
CLASS lcl IMPLEMENTATION.
|
|
66287
|
+
METHOD matches.
|
|
66288
|
+
ENDMETHOD.
|
|
66267
66289
|
ENDCLASS.`,
|
|
66268
66290
|
};
|
|
66269
66291
|
}
|
|
@@ -66454,12 +66476,12 @@ class MixReturning extends _abap_rule_1.ABAPRule {
|
|
|
66454
66476
|
// eslint-disable-next-line max-len
|
|
66455
66477
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-either-returning-or-exporting-or-changing-but-not-a-combination`,
|
|
66456
66478
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
66457
|
-
badExample: `CLASS lcl DEFINITION.
|
|
66458
|
-
PUBLIC SECTION.
|
|
66459
|
-
METHODS
|
|
66460
|
-
foobar
|
|
66461
|
-
EXPORTING foo TYPE i
|
|
66462
|
-
RETURNING VALUE(rv_string) TYPE string.
|
|
66479
|
+
badExample: `CLASS lcl DEFINITION.
|
|
66480
|
+
PUBLIC SECTION.
|
|
66481
|
+
METHODS
|
|
66482
|
+
foobar
|
|
66483
|
+
EXPORTING foo TYPE i
|
|
66484
|
+
RETURNING VALUE(rv_string) TYPE string.
|
|
66463
66485
|
ENDCLASS.`,
|
|
66464
66486
|
};
|
|
66465
66487
|
}
|
|
@@ -66839,7 +66861,7 @@ class Nesting extends _abap_rule_1.ABAPRule {
|
|
|
66839
66861
|
key: "nesting",
|
|
66840
66862
|
title: "Check nesting depth",
|
|
66841
66863
|
shortDescription: `Checks for methods exceeding a maximum nesting depth`,
|
|
66842
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low
|
|
66864
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low
|
|
66843
66865
|
https://docs.abapopenchecks.org/checks/74/`,
|
|
66844
66866
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
66845
66867
|
};
|
|
@@ -67082,7 +67104,7 @@ class NoChainedAssignment extends _abap_rule_1.ABAPRule {
|
|
|
67082
67104
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-chain-assignments`,
|
|
67083
67105
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
67084
67106
|
badExample: `var1 = var2 = var3.`,
|
|
67085
|
-
goodExample: `var2 = var3.
|
|
67107
|
+
goodExample: `var2 = var3.
|
|
67086
67108
|
var1 = var2.`,
|
|
67087
67109
|
};
|
|
67088
67110
|
}
|
|
@@ -67141,8 +67163,8 @@ class NoExternalFormCalls extends _abap_rule_1.ABAPRule {
|
|
|
67141
67163
|
key: "no_external_form_calls",
|
|
67142
67164
|
title: "No external FORM calls",
|
|
67143
67165
|
shortDescription: `Detect external form calls`,
|
|
67144
|
-
badExample: `PERFORM foo IN PROGRAM bar.
|
|
67145
|
-
|
|
67166
|
+
badExample: `PERFORM foo IN PROGRAM bar.
|
|
67167
|
+
|
|
67146
67168
|
PERFORM foo(bar).`,
|
|
67147
67169
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
67148
67170
|
};
|
|
@@ -67203,17 +67225,17 @@ class NoInlineInOptionalBranches extends _abap_rule_1.ABAPRule {
|
|
|
67203
67225
|
key: "no_inline_in_optional_branches",
|
|
67204
67226
|
title: "Don't declare inline in optional branches",
|
|
67205
67227
|
shortDescription: `Don't declare inline in optional branches`,
|
|
67206
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-declare-inline-in-optional-branches
|
|
67207
|
-
|
|
67208
|
-
Considered optional branches:
|
|
67209
|
-
* inside IF/ELSEIF/ELSE
|
|
67210
|
-
* inside LOOP
|
|
67211
|
-
* inside WHILE
|
|
67212
|
-
* inside CASE/WHEN, CASE TYPE OF
|
|
67213
|
-
* inside DO
|
|
67214
|
-
* inside SELECT loops
|
|
67215
|
-
|
|
67216
|
-
Not considered optional branches:
|
|
67228
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-declare-inline-in-optional-branches
|
|
67229
|
+
|
|
67230
|
+
Considered optional branches:
|
|
67231
|
+
* inside IF/ELSEIF/ELSE
|
|
67232
|
+
* inside LOOP
|
|
67233
|
+
* inside WHILE
|
|
67234
|
+
* inside CASE/WHEN, CASE TYPE OF
|
|
67235
|
+
* inside DO
|
|
67236
|
+
* inside SELECT loops
|
|
67237
|
+
|
|
67238
|
+
Not considered optional branches:
|
|
67217
67239
|
* TRY/CATCH/CLEANUP`,
|
|
67218
67240
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
67219
67241
|
};
|
|
@@ -67313,12 +67335,12 @@ class NoPrefixes extends _abap_rule_1.ABAPRule {
|
|
|
67313
67335
|
key: "no_prefixes",
|
|
67314
67336
|
title: "No Prefixes",
|
|
67315
67337
|
shortDescription: `Dont use hungarian notation`,
|
|
67316
|
-
extendedInformation: `
|
|
67317
|
-
Note: not prefixing TYPES will require changing the errorNamespace in the abaplint configuration,
|
|
67318
|
-
allowing all types to become voided, abaplint will then provide less precise syntax errors.
|
|
67319
|
-
|
|
67320
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-encodings-esp-hungarian-notation-and-prefixes
|
|
67321
|
-
|
|
67338
|
+
extendedInformation: `
|
|
67339
|
+
Note: not prefixing TYPES will require changing the errorNamespace in the abaplint configuration,
|
|
67340
|
+
allowing all types to become voided, abaplint will then provide less precise syntax errors.
|
|
67341
|
+
|
|
67342
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-encodings-esp-hungarian-notation-and-prefixes
|
|
67343
|
+
|
|
67322
67344
|
https://github.com/SAP/styleguides/blob/main/clean-abap/sub-sections/AvoidEncodings.md`,
|
|
67323
67345
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
67324
67346
|
badExample: `DATA lv_foo TYPE i.`,
|
|
@@ -67497,7 +67519,7 @@ class NoPublicAttributes extends _abap_rule_1.ABAPRule {
|
|
|
67497
67519
|
return {
|
|
67498
67520
|
key: "no_public_attributes",
|
|
67499
67521
|
title: "No public attributes",
|
|
67500
|
-
shortDescription: `Checks that classes and interfaces don't contain any public attributes.
|
|
67522
|
+
shortDescription: `Checks that classes and interfaces don't contain any public attributes.
|
|
67501
67523
|
Exceptions are excluded from this rule.`,
|
|
67502
67524
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#members-private-by-default-protected-only-if-needed`,
|
|
67503
67525
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
@@ -67598,13 +67620,13 @@ class NoYodaConditions extends _abap_rule_1.ABAPRule {
|
|
|
67598
67620
|
key: "no_yoda_conditions",
|
|
67599
67621
|
title: "No Yoda conditions",
|
|
67600
67622
|
shortDescription: `Finds Yoda conditions and reports issues`,
|
|
67601
|
-
extendedInformation: `https://en.wikipedia.org/wiki/Yoda_conditions
|
|
67602
|
-
|
|
67623
|
+
extendedInformation: `https://en.wikipedia.org/wiki/Yoda_conditions
|
|
67624
|
+
|
|
67603
67625
|
Conditions with operators CP, NP, CS, NS, CA, NA, CO, CN are ignored`,
|
|
67604
67626
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
67605
|
-
badExample: `IF 0 <> sy-subrc.
|
|
67627
|
+
badExample: `IF 0 <> sy-subrc.
|
|
67606
67628
|
ENDIF.`,
|
|
67607
|
-
goodExample: `IF sy-subrc <> 0.
|
|
67629
|
+
goodExample: `IF sy-subrc <> 0.
|
|
67608
67630
|
ENDIF.`,
|
|
67609
67631
|
};
|
|
67610
67632
|
}
|
|
@@ -67705,8 +67727,8 @@ class NROBConsistency {
|
|
|
67705
67727
|
key: "nrob_consistency",
|
|
67706
67728
|
title: "Number range consistency",
|
|
67707
67729
|
shortDescription: `Consistency checks for number ranges`,
|
|
67708
|
-
extendedInformation: `Issue reported if percentage warning is over 50%
|
|
67709
|
-
|
|
67730
|
+
extendedInformation: `Issue reported if percentage warning is over 50%
|
|
67731
|
+
|
|
67710
67732
|
Issue reported if the referenced domain is not found(taking error namespace into account)`,
|
|
67711
67733
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
67712
67734
|
};
|
|
@@ -67983,58 +68005,58 @@ class ObsoleteStatement extends _abap_rule_1.ABAPRule {
|
|
|
67983
68005
|
title: "Obsolete statements",
|
|
67984
68006
|
shortDescription: `Checks for usages of certain obsolete statements`,
|
|
67985
68007
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
67986
|
-
extendedInformation: `
|
|
67987
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-language-constructs
|
|
67988
|
-
|
|
67989
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements
|
|
67990
|
-
|
|
67991
|
-
SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapset_extended_check.htm
|
|
67992
|
-
|
|
67993
|
-
IS REQUESTED: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenlogexp_requested.htm
|
|
67994
|
-
|
|
67995
|
-
WITH HEADER LINE: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapdata_header_line.htm
|
|
67996
|
-
|
|
67997
|
-
FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapfield-symbols_obsolete_typing.htm
|
|
67998
|
-
|
|
67999
|
-
TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
68000
|
-
|
|
68001
|
-
LOAD addition: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
68002
|
-
|
|
68003
|
-
COMMUICATION: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapcommunication.htm
|
|
68004
|
-
|
|
68005
|
-
OCCURS: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapdata_occurs.htm
|
|
68006
|
-
|
|
68007
|
-
PARAMETER: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapparameter.htm
|
|
68008
|
-
|
|
68009
|
-
RANGES: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapranges.htm
|
|
68010
|
-
|
|
68011
|
-
PACK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abappack.htm
|
|
68012
|
-
|
|
68013
|
-
MOVE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapmove_obs.htm
|
|
68014
|
-
|
|
68015
|
-
SELECT without INTO: https://help.sap.com/doc/abapdocu_731_index_htm/7.31/en-US/abapselect_obsolete.htm
|
|
68016
|
-
SELECT COUNT(*) is considered okay
|
|
68017
|
-
|
|
68018
|
-
FREE MEMORY: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapfree_mem_id_obsolete.htm
|
|
68019
|
-
|
|
68020
|
-
SORT BY FS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapsort_itab_obsolete.htm
|
|
68021
|
-
|
|
68022
|
-
CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapcall_transformation_objects.htm
|
|
68023
|
-
|
|
68024
|
-
POSIX REGEX: https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/index.htm
|
|
68025
|
-
|
|
68026
|
-
OCCURENCES: check for OCCURENCES vs OCCURRENCES
|
|
68027
|
-
|
|
68008
|
+
extendedInformation: `
|
|
68009
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-language-constructs
|
|
68010
|
+
|
|
68011
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements
|
|
68012
|
+
|
|
68013
|
+
SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapset_extended_check.htm
|
|
68014
|
+
|
|
68015
|
+
IS REQUESTED: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenlogexp_requested.htm
|
|
68016
|
+
|
|
68017
|
+
WITH HEADER LINE: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapdata_header_line.htm
|
|
68018
|
+
|
|
68019
|
+
FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapfield-symbols_obsolete_typing.htm
|
|
68020
|
+
|
|
68021
|
+
TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
68022
|
+
|
|
68023
|
+
LOAD addition: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
68024
|
+
|
|
68025
|
+
COMMUICATION: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapcommunication.htm
|
|
68026
|
+
|
|
68027
|
+
OCCURS: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapdata_occurs.htm
|
|
68028
|
+
|
|
68029
|
+
PARAMETER: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapparameter.htm
|
|
68030
|
+
|
|
68031
|
+
RANGES: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapranges.htm
|
|
68032
|
+
|
|
68033
|
+
PACK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abappack.htm
|
|
68034
|
+
|
|
68035
|
+
MOVE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapmove_obs.htm
|
|
68036
|
+
|
|
68037
|
+
SELECT without INTO: https://help.sap.com/doc/abapdocu_731_index_htm/7.31/en-US/abapselect_obsolete.htm
|
|
68038
|
+
SELECT COUNT(*) is considered okay
|
|
68039
|
+
|
|
68040
|
+
FREE MEMORY: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapfree_mem_id_obsolete.htm
|
|
68041
|
+
|
|
68042
|
+
SORT BY FS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapsort_itab_obsolete.htm
|
|
68043
|
+
|
|
68044
|
+
CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapcall_transformation_objects.htm
|
|
68045
|
+
|
|
68046
|
+
POSIX REGEX: https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/index.htm
|
|
68047
|
+
|
|
68048
|
+
OCCURENCES: check for OCCURENCES vs OCCURRENCES
|
|
68049
|
+
|
|
68028
68050
|
CLIENT SPECIFIED, from 754: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapselect_client_obsolete.htm`,
|
|
68029
|
-
badExample: `REFRESH itab.
|
|
68030
|
-
|
|
68031
|
-
COMPUTE foo = 2 + 2.
|
|
68032
|
-
|
|
68033
|
-
MULTIPLY lv_foo BY 2.
|
|
68034
|
-
|
|
68035
|
-
INTERFACE intf LOAD.
|
|
68036
|
-
|
|
68037
|
-
IF foo IS SUPPLIED.
|
|
68051
|
+
badExample: `REFRESH itab.
|
|
68052
|
+
|
|
68053
|
+
COMPUTE foo = 2 + 2.
|
|
68054
|
+
|
|
68055
|
+
MULTIPLY lv_foo BY 2.
|
|
68056
|
+
|
|
68057
|
+
INTERFACE intf LOAD.
|
|
68058
|
+
|
|
68059
|
+
IF foo IS SUPPLIED.
|
|
68038
68060
|
ENDIF.`,
|
|
68039
68061
|
};
|
|
68040
68062
|
}
|
|
@@ -68374,9 +68396,9 @@ class OmitParameterName {
|
|
|
68374
68396
|
key: "omit_parameter_name",
|
|
68375
68397
|
title: "Omit parameter name",
|
|
68376
68398
|
shortDescription: `Omit the parameter name in single parameter calls`,
|
|
68377
|
-
extendedInformation: `
|
|
68378
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-parameter-name-in-single-parameter-calls
|
|
68379
|
-
|
|
68399
|
+
extendedInformation: `
|
|
68400
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-parameter-name-in-single-parameter-calls
|
|
68401
|
+
|
|
68380
68402
|
EXPORTING must already be omitted for this rule to take effect, https://rules.abaplint.org/exporting/`,
|
|
68381
68403
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
68382
68404
|
badExample: `method( param = 2 ).`,
|
|
@@ -68582,20 +68604,20 @@ class OmitReceiving extends _abap_rule_1.ABAPRule {
|
|
|
68582
68604
|
shortDescription: `Omit RECEIVING`,
|
|
68583
68605
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-receiving`,
|
|
68584
68606
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
68585
|
-
badExample: `
|
|
68586
|
-
upload_pack(
|
|
68587
|
-
EXPORTING
|
|
68588
|
-
io_client = lo_client
|
|
68589
|
-
iv_url = iv_url
|
|
68590
|
-
iv_deepen_level = iv_deepen_level
|
|
68591
|
-
it_hashes = lt_hashes
|
|
68592
|
-
RECEIVING
|
|
68607
|
+
badExample: `
|
|
68608
|
+
upload_pack(
|
|
68609
|
+
EXPORTING
|
|
68610
|
+
io_client = lo_client
|
|
68611
|
+
iv_url = iv_url
|
|
68612
|
+
iv_deepen_level = iv_deepen_level
|
|
68613
|
+
it_hashes = lt_hashes
|
|
68614
|
+
RECEIVING
|
|
68593
68615
|
rt_objects = et_objects ).`,
|
|
68594
|
-
goodExample: `
|
|
68595
|
-
et_objects = upload_pack(
|
|
68596
|
-
io_client = lo_client
|
|
68597
|
-
iv_url = iv_url
|
|
68598
|
-
iv_deepen_level = iv_deepen_level
|
|
68616
|
+
goodExample: `
|
|
68617
|
+
et_objects = upload_pack(
|
|
68618
|
+
io_client = lo_client
|
|
68619
|
+
iv_url = iv_url
|
|
68620
|
+
iv_deepen_level = iv_deepen_level
|
|
68599
68621
|
it_hashes = lt_hashes ).`,
|
|
68600
68622
|
};
|
|
68601
68623
|
}
|
|
@@ -68659,8 +68681,8 @@ class Parser702Chaining extends _abap_rule_1.ABAPRule {
|
|
|
68659
68681
|
return {
|
|
68660
68682
|
key: "parser_702_chaining",
|
|
68661
68683
|
title: "Parser Error, bad chanining on 702",
|
|
68662
|
-
shortDescription: `ABAP on 702 does not allow for method chaining with IMPORTING/EXPORTING/CHANGING keywords,
|
|
68663
|
-
this rule finds these and reports errors.
|
|
68684
|
+
shortDescription: `ABAP on 702 does not allow for method chaining with IMPORTING/EXPORTING/CHANGING keywords,
|
|
68685
|
+
this rule finds these and reports errors.
|
|
68664
68686
|
Only active on target version 702 and below.`,
|
|
68665
68687
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.SingleFile],
|
|
68666
68688
|
};
|
|
@@ -68740,8 +68762,8 @@ class ParserError {
|
|
|
68740
68762
|
return {
|
|
68741
68763
|
key: "parser_error",
|
|
68742
68764
|
title: "Parser error",
|
|
68743
|
-
shortDescription: `Checks for syntax not recognized by abaplint.
|
|
68744
|
-
|
|
68765
|
+
shortDescription: `Checks for syntax not recognized by abaplint.
|
|
68766
|
+
|
|
68745
68767
|
See recognized syntax at https://syntax.abaplint.org`,
|
|
68746
68768
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.SingleFile],
|
|
68747
68769
|
};
|
|
@@ -68826,7 +68848,7 @@ class ParserMissingSpace extends _abap_rule_1.ABAPRule {
|
|
|
68826
68848
|
return {
|
|
68827
68849
|
key: "parser_missing_space",
|
|
68828
68850
|
title: "Parser Error, missing space",
|
|
68829
|
-
shortDescription: `In special cases the ABAP language allows for not having spaces before or after string literals.
|
|
68851
|
+
shortDescription: `In special cases the ABAP language allows for not having spaces before or after string literals.
|
|
68830
68852
|
This rule makes sure the spaces are consistently required across the language.`,
|
|
68831
68853
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile],
|
|
68832
68854
|
badExample: `IF ( foo = 'bar').`,
|
|
@@ -69238,25 +69260,25 @@ class PreferInline {
|
|
|
69238
69260
|
key: "prefer_inline",
|
|
69239
69261
|
title: "Prefer Inline Declarations",
|
|
69240
69262
|
shortDescription: `Prefer inline to up-front declarations.`,
|
|
69241
|
-
extendedInformation: `EXPERIMENTAL
|
|
69242
|
-
|
|
69243
|
-
Activates if language version is v740sp02 or above.
|
|
69244
|
-
|
|
69245
|
-
Variables must be local(METHOD or FORM).
|
|
69246
|
-
|
|
69247
|
-
No generic or void typed variables. No syntax errors.
|
|
69248
|
-
|
|
69249
|
-
First position used must be a full/pure write.
|
|
69250
|
-
|
|
69251
|
-
Move statment is not a cast(?=)
|
|
69252
|
-
|
|
69263
|
+
extendedInformation: `EXPERIMENTAL
|
|
69264
|
+
|
|
69265
|
+
Activates if language version is v740sp02 or above.
|
|
69266
|
+
|
|
69267
|
+
Variables must be local(METHOD or FORM).
|
|
69268
|
+
|
|
69269
|
+
No generic or void typed variables. No syntax errors.
|
|
69270
|
+
|
|
69271
|
+
First position used must be a full/pure write.
|
|
69272
|
+
|
|
69273
|
+
Move statment is not a cast(?=)
|
|
69274
|
+
|
|
69253
69275
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-inline-to-up-front-declarations`,
|
|
69254
69276
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Upport, _irule_1.RuleTag.Experimental, _irule_1.RuleTag.Quickfix],
|
|
69255
|
-
badExample: `DATA foo TYPE i.
|
|
69256
|
-
foo = 2.
|
|
69257
|
-
DATA percentage TYPE decfloat34.
|
|
69277
|
+
badExample: `DATA foo TYPE i.
|
|
69278
|
+
foo = 2.
|
|
69279
|
+
DATA percentage TYPE decfloat34.
|
|
69258
69280
|
percentage = ( comment_number / abs_statement_number ) * 100.`,
|
|
69259
|
-
goodExample: `DATA(foo) = 2.
|
|
69281
|
+
goodExample: `DATA(foo) = 2.
|
|
69260
69282
|
DATA(percentage) = CONV decfloat34( comment_number / abs_statement_number ) * 100.`,
|
|
69261
69283
|
};
|
|
69262
69284
|
}
|
|
@@ -69470,18 +69492,18 @@ class PreferIsNot extends _abap_rule_1.ABAPRule {
|
|
|
69470
69492
|
key: "prefer_is_not",
|
|
69471
69493
|
title: "Prefer IS NOT to NOT IS",
|
|
69472
69494
|
shortDescription: `Prefer IS NOT to NOT IS`,
|
|
69473
|
-
extendedInformation: `
|
|
69474
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-is-not-to-not-is
|
|
69475
|
-
|
|
69495
|
+
extendedInformation: `
|
|
69496
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-is-not-to-not-is
|
|
69497
|
+
|
|
69476
69498
|
"if not is_valid( )." examples are skipped`,
|
|
69477
69499
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
69478
|
-
goodExample: `IF variable IS NOT INITIAL.
|
|
69479
|
-
IF variable NP 'TODO*'.
|
|
69480
|
-
IF variable <> 42.
|
|
69500
|
+
goodExample: `IF variable IS NOT INITIAL.
|
|
69501
|
+
IF variable NP 'TODO*'.
|
|
69502
|
+
IF variable <> 42.
|
|
69481
69503
|
IF variable CO 'hello'.`,
|
|
69482
|
-
badExample: `IF NOT variable IS INITIAL.
|
|
69483
|
-
IF NOT variable CP 'TODO*'.
|
|
69484
|
-
IF NOT variable = 42.
|
|
69504
|
+
badExample: `IF NOT variable IS INITIAL.
|
|
69505
|
+
IF NOT variable CP 'TODO*'.
|
|
69506
|
+
IF NOT variable = 42.
|
|
69485
69507
|
IF NOT variable CA 'hello'.`,
|
|
69486
69508
|
};
|
|
69487
69509
|
}
|
|
@@ -69669,14 +69691,14 @@ class PreferRaiseExceptionNew extends _abap_rule_1.ABAPRule {
|
|
|
69669
69691
|
key: "prefer_raise_exception_new",
|
|
69670
69692
|
title: "Prefer RAISE EXCEPTION NEW to RAISE EXCEPTION TYPE",
|
|
69671
69693
|
shortDescription: `Prefer RAISE EXCEPTION NEW to RAISE EXCEPTION TYPE`,
|
|
69672
|
-
extendedInformation: `
|
|
69673
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-raise-exception-new-to-raise-exception-type
|
|
69674
|
-
|
|
69694
|
+
extendedInformation: `
|
|
69695
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-raise-exception-new-to-raise-exception-type
|
|
69696
|
+
|
|
69675
69697
|
From 752 and up`,
|
|
69676
69698
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Upport],
|
|
69677
69699
|
goodExample: `RAISE EXCEPTION NEW cx_generation_error( previous = exception ).`,
|
|
69678
|
-
badExample: `RAISE EXCEPTION TYPE cx_generation_error
|
|
69679
|
-
EXPORTING
|
|
69700
|
+
badExample: `RAISE EXCEPTION TYPE cx_generation_error
|
|
69701
|
+
EXPORTING
|
|
69680
69702
|
previous = exception.`,
|
|
69681
69703
|
};
|
|
69682
69704
|
}
|
|
@@ -69754,12 +69776,12 @@ class PreferReturningToExporting extends _abap_rule_1.ABAPRule {
|
|
|
69754
69776
|
key: "prefer_returning_to_exporting",
|
|
69755
69777
|
title: "Prefer RETURNING to EXPORTING",
|
|
69756
69778
|
shortDescription: `Prefer RETURNING to EXPORTING. Generic types cannot be RETURNING.`,
|
|
69757
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-returning-to-exporting
|
|
69779
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-returning-to-exporting
|
|
69758
69780
|
https://docs.abapopenchecks.org/checks/44/`,
|
|
69759
69781
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
69760
|
-
badExample: `CLASS lcl DEFINITION.
|
|
69761
|
-
PUBLIC SECTION.
|
|
69762
|
-
METHODS test EXPORTING ev_foo TYPE i.
|
|
69782
|
+
badExample: `CLASS lcl DEFINITION.
|
|
69783
|
+
PUBLIC SECTION.
|
|
69784
|
+
METHODS test EXPORTING ev_foo TYPE i.
|
|
69763
69785
|
ENDCLASS.`,
|
|
69764
69786
|
};
|
|
69765
69787
|
}
|
|
@@ -69855,8 +69877,8 @@ class PreferXsdbool extends _abap_rule_1.ABAPRule {
|
|
|
69855
69877
|
key: "prefer_xsdbool",
|
|
69856
69878
|
title: "Prefer xsdbool over boolc",
|
|
69857
69879
|
shortDescription: `Prefer xsdbool over boolc`,
|
|
69858
|
-
extendedInformation: `Activates if language version is v740sp08 or above.
|
|
69859
|
-
|
|
69880
|
+
extendedInformation: `Activates if language version is v740sp08 or above.
|
|
69881
|
+
|
|
69860
69882
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-xsdbool-to-set-boolean-variables`,
|
|
69861
69883
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Upport, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
69862
69884
|
badExample: `DATA(sdf) = boolc( 1 = 2 ).`,
|
|
@@ -69928,9 +69950,9 @@ class PreferredCompareOperator extends _abap_rule_1.ABAPRule {
|
|
|
69928
69950
|
title: "Preferred compare operator",
|
|
69929
69951
|
shortDescription: `Configure undesired operator variants`,
|
|
69930
69952
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
69931
|
-
badExample: `IF foo EQ bar.
|
|
69953
|
+
badExample: `IF foo EQ bar.
|
|
69932
69954
|
ENDIF.`,
|
|
69933
|
-
goodExample: `IF foo = bar.
|
|
69955
|
+
goodExample: `IF foo = bar.
|
|
69934
69956
|
ENDIF.`,
|
|
69935
69957
|
};
|
|
69936
69958
|
}
|
|
@@ -70154,26 +70176,26 @@ class ReduceProceduralCode extends _abap_rule_1.ABAPRule {
|
|
|
70154
70176
|
key: "reduce_procedural_code",
|
|
70155
70177
|
title: "Reduce procedural code",
|
|
70156
70178
|
shortDescription: `Checks FORM and FUNCTION-MODULE have few statements`,
|
|
70157
|
-
extendedInformation: `Delegate logic to a class method instead of using FORM or FUNCTION-MODULE.
|
|
70158
|
-
|
|
70159
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-object-orientation-to-procedural-programming
|
|
70160
|
-
|
|
70179
|
+
extendedInformation: `Delegate logic to a class method instead of using FORM or FUNCTION-MODULE.
|
|
70180
|
+
|
|
70181
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-object-orientation-to-procedural-programming
|
|
70182
|
+
|
|
70161
70183
|
Comments are not counted as statements.`,
|
|
70162
70184
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
70163
|
-
badExample: `FORM foo.
|
|
70164
|
-
DATA lv_bar TYPE i.
|
|
70165
|
-
lv_bar = 2 + 2.
|
|
70166
|
-
IF lv_bar = 4.
|
|
70167
|
-
WRITE 'hello world'.
|
|
70168
|
-
ENDIF.
|
|
70169
|
-
DATA lv_bar TYPE i.
|
|
70170
|
-
lv_bar = 2 + 2.
|
|
70171
|
-
IF lv_bar = 4.
|
|
70172
|
-
WRITE 'hello world'.
|
|
70173
|
-
ENDIF.
|
|
70185
|
+
badExample: `FORM foo.
|
|
70186
|
+
DATA lv_bar TYPE i.
|
|
70187
|
+
lv_bar = 2 + 2.
|
|
70188
|
+
IF lv_bar = 4.
|
|
70189
|
+
WRITE 'hello world'.
|
|
70190
|
+
ENDIF.
|
|
70191
|
+
DATA lv_bar TYPE i.
|
|
70192
|
+
lv_bar = 2 + 2.
|
|
70193
|
+
IF lv_bar = 4.
|
|
70194
|
+
WRITE 'hello world'.
|
|
70195
|
+
ENDIF.
|
|
70174
70196
|
ENDFORM.`,
|
|
70175
|
-
goodExample: `FORM foo.
|
|
70176
|
-
NEW zcl_global_class( )->run_logic( ).
|
|
70197
|
+
goodExample: `FORM foo.
|
|
70198
|
+
NEW zcl_global_class( )->run_logic( ).
|
|
70177
70199
|
ENDFORM.`,
|
|
70178
70200
|
};
|
|
70179
70201
|
}
|
|
@@ -70417,10 +70439,10 @@ class RemoveDescriptions {
|
|
|
70417
70439
|
return {
|
|
70418
70440
|
key: "remove_descriptions",
|
|
70419
70441
|
title: "Remove descriptions",
|
|
70420
|
-
shortDescription: `Ensures you have no descriptions in metadata of methods, parameters, etc.
|
|
70421
|
-
|
|
70422
|
-
Class descriptions are required, see rule description_empty.
|
|
70423
|
-
|
|
70442
|
+
shortDescription: `Ensures you have no descriptions in metadata of methods, parameters, etc.
|
|
70443
|
+
|
|
70444
|
+
Class descriptions are required, see rule description_empty.
|
|
70445
|
+
|
|
70424
70446
|
Consider using ABAP Doc for documentation.`,
|
|
70425
70447
|
tags: [],
|
|
70426
70448
|
};
|
|
@@ -70545,14 +70567,14 @@ class RFCErrorHandling extends _abap_rule_1.ABAPRule {
|
|
|
70545
70567
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
70546
70568
|
shortDescription: `Checks that exceptions 'system_failure' and 'communication_failure' are handled in RFC calls`,
|
|
70547
70569
|
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenrfc_exception.htm`,
|
|
70548
|
-
badExample: `CALL FUNCTION 'ZRFC'
|
|
70570
|
+
badExample: `CALL FUNCTION 'ZRFC'
|
|
70549
70571
|
DESTINATION lv_rfc.`,
|
|
70550
|
-
goodExample: `CALL FUNCTION 'ZRFC'
|
|
70551
|
-
DESTINATION lv_rfc
|
|
70552
|
-
EXCEPTIONS
|
|
70553
|
-
system_failure = 1 MESSAGE msg
|
|
70554
|
-
communication_failure = 2 MESSAGE msg
|
|
70555
|
-
resource_failure = 3
|
|
70572
|
+
goodExample: `CALL FUNCTION 'ZRFC'
|
|
70573
|
+
DESTINATION lv_rfc
|
|
70574
|
+
EXCEPTIONS
|
|
70575
|
+
system_failure = 1 MESSAGE msg
|
|
70576
|
+
communication_failure = 2 MESSAGE msg
|
|
70577
|
+
resource_failure = 3
|
|
70556
70578
|
OTHERS = 4.`,
|
|
70557
70579
|
};
|
|
70558
70580
|
}
|
|
@@ -70636,11 +70658,11 @@ class SelectAddOrderBy {
|
|
|
70636
70658
|
key: "select_add_order_by",
|
|
70637
70659
|
title: "SELECT add ORDER BY",
|
|
70638
70660
|
shortDescription: `SELECTs add ORDER BY clause`,
|
|
70639
|
-
extendedInformation: `
|
|
70640
|
-
This will make sure that the SELECT statement returns results in the same sequence on different databases
|
|
70641
|
-
|
|
70642
|
-
add ORDER BY PRIMARY KEY if in doubt
|
|
70643
|
-
|
|
70661
|
+
extendedInformation: `
|
|
70662
|
+
This will make sure that the SELECT statement returns results in the same sequence on different databases
|
|
70663
|
+
|
|
70664
|
+
add ORDER BY PRIMARY KEY if in doubt
|
|
70665
|
+
|
|
70644
70666
|
If the target is a sorted/hashed table, no issue is reported`,
|
|
70645
70667
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
70646
70668
|
badExample: `SELECT * FROM db INTO TABLE @DATA(tab).`,
|
|
@@ -70771,14 +70793,14 @@ class SelectPerformance {
|
|
|
70771
70793
|
key: "select_performance",
|
|
70772
70794
|
title: "SELECT performance",
|
|
70773
70795
|
shortDescription: `Various checks regarding SELECT performance.`,
|
|
70774
|
-
extendedInformation: `ENDSELECT: not reported when the corresponding SELECT has PACKAGE SIZE
|
|
70775
|
-
|
|
70796
|
+
extendedInformation: `ENDSELECT: not reported when the corresponding SELECT has PACKAGE SIZE
|
|
70797
|
+
|
|
70776
70798
|
SELECT *: not reported if using INTO/APPENDING CORRESPONDING FIELDS OF`,
|
|
70777
70799
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Performance],
|
|
70778
|
-
badExample: `SELECT field1, field2 FROM table
|
|
70779
|
-
INTO @DATA(structure) UP TO 1 ROWS ORDER BY field3 DESCENDING.
|
|
70800
|
+
badExample: `SELECT field1, field2 FROM table
|
|
70801
|
+
INTO @DATA(structure) UP TO 1 ROWS ORDER BY field3 DESCENDING.
|
|
70780
70802
|
ENDSELECT.`,
|
|
70781
|
-
goodExample: `SELECT field1, field2 FROM table UP TO 1 ROWS
|
|
70803
|
+
goodExample: `SELECT field1, field2 FROM table UP TO 1 ROWS
|
|
70782
70804
|
INTO TABLE @DATA(table) ORDER BY field3 DESCENDING`,
|
|
70783
70805
|
};
|
|
70784
70806
|
}
|
|
@@ -70892,8 +70914,8 @@ class SelectSingleFullKey {
|
|
|
70892
70914
|
key: "select_single_full_key",
|
|
70893
70915
|
title: "Detect SELECT SINGLE which are possibily not unique",
|
|
70894
70916
|
shortDescription: `Detect SELECT SINGLE which are possibily not unique`,
|
|
70895
|
-
extendedInformation: `Table definitions must be known, ie. inside the errorNamespace
|
|
70896
|
-
|
|
70917
|
+
extendedInformation: `Table definitions must be known, ie. inside the errorNamespace
|
|
70918
|
+
|
|
70897
70919
|
If the statement contains a JOIN it is not checked`,
|
|
70898
70920
|
pseudoComment: "EC CI_NOORDER",
|
|
70899
70921
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
@@ -71317,8 +71339,8 @@ class SICFConsistency {
|
|
|
71317
71339
|
key: "sicf_consistency",
|
|
71318
71340
|
title: "SICF consistency",
|
|
71319
71341
|
shortDescription: `Checks the validity of ICF services`,
|
|
71320
|
-
extendedInformation: `* Class defined in handler must exist
|
|
71321
|
-
* Class must not have any syntax errors
|
|
71342
|
+
extendedInformation: `* Class defined in handler must exist
|
|
71343
|
+
* Class must not have any syntax errors
|
|
71322
71344
|
* Class must implement interface IF_HTTP_EXTENSION`,
|
|
71323
71345
|
};
|
|
71324
71346
|
}
|
|
@@ -71430,23 +71452,23 @@ class SlowParameterPassing {
|
|
|
71430
71452
|
shortDescription: `Detects slow pass by value passing for methods where parameter is not changed`,
|
|
71431
71453
|
extendedInformation: `Method parameters defined in interfaces is not checked`,
|
|
71432
71454
|
tags: [_irule_1.RuleTag.Performance],
|
|
71433
|
-
badExample: `CLASS lcl DEFINITION.
|
|
71434
|
-
PUBLIC SECTION.
|
|
71435
|
-
METHODS bar IMPORTING VALUE(sdf) TYPE string.
|
|
71436
|
-
ENDCLASS.
|
|
71437
|
-
CLASS lcl IMPLEMENTATION.
|
|
71438
|
-
METHOD bar.
|
|
71439
|
-
WRITE sdf.
|
|
71440
|
-
ENDMETHOD.
|
|
71455
|
+
badExample: `CLASS lcl DEFINITION.
|
|
71456
|
+
PUBLIC SECTION.
|
|
71457
|
+
METHODS bar IMPORTING VALUE(sdf) TYPE string.
|
|
71458
|
+
ENDCLASS.
|
|
71459
|
+
CLASS lcl IMPLEMENTATION.
|
|
71460
|
+
METHOD bar.
|
|
71461
|
+
WRITE sdf.
|
|
71462
|
+
ENDMETHOD.
|
|
71441
71463
|
ENDCLASS.`,
|
|
71442
|
-
goodExample: `CLASS lcl DEFINITION.
|
|
71443
|
-
PUBLIC SECTION.
|
|
71444
|
-
METHODS bar IMPORTING sdf TYPE string.
|
|
71445
|
-
ENDCLASS.
|
|
71446
|
-
CLASS lcl IMPLEMENTATION.
|
|
71447
|
-
METHOD bar.
|
|
71448
|
-
WRITE sdf.
|
|
71449
|
-
ENDMETHOD.
|
|
71464
|
+
goodExample: `CLASS lcl DEFINITION.
|
|
71465
|
+
PUBLIC SECTION.
|
|
71466
|
+
METHODS bar IMPORTING sdf TYPE string.
|
|
71467
|
+
ENDCLASS.
|
|
71468
|
+
CLASS lcl IMPLEMENTATION.
|
|
71469
|
+
METHOD bar.
|
|
71470
|
+
WRITE sdf.
|
|
71471
|
+
ENDMETHOD.
|
|
71450
71472
|
ENDCLASS.`,
|
|
71451
71473
|
};
|
|
71452
71474
|
}
|
|
@@ -71703,8 +71725,8 @@ class SpaceBeforeDot extends _abap_rule_1.ABAPRule {
|
|
|
71703
71725
|
key: "space_before_dot",
|
|
71704
71726
|
title: "Space before dot",
|
|
71705
71727
|
shortDescription: `Checks for extra spaces before dots at the ends of statements`,
|
|
71706
|
-
extendedInformation: `
|
|
71707
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#be-consistent
|
|
71728
|
+
extendedInformation: `
|
|
71729
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#be-consistent
|
|
71708
71730
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#condense-your-code`,
|
|
71709
71731
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
71710
71732
|
badExample: `WRITE bar .`,
|
|
@@ -71890,12 +71912,12 @@ class SQLValueConversion {
|
|
|
71890
71912
|
key: "sql_value_conversion",
|
|
71891
71913
|
title: "Implicit SQL Value Conversion",
|
|
71892
71914
|
shortDescription: `Ensure types match when selecting from database`,
|
|
71893
|
-
extendedInformation: `
|
|
71894
|
-
* Integer to CHAR conversion
|
|
71895
|
-
* Integer to NUMC conversion
|
|
71896
|
-
* NUMC to Integer conversion
|
|
71897
|
-
* CHAR to Integer conversion
|
|
71898
|
-
* Source field longer than database field, CHAR -> CHAR
|
|
71915
|
+
extendedInformation: `
|
|
71916
|
+
* Integer to CHAR conversion
|
|
71917
|
+
* Integer to NUMC conversion
|
|
71918
|
+
* NUMC to Integer conversion
|
|
71919
|
+
* CHAR to Integer conversion
|
|
71920
|
+
* Source field longer than database field, CHAR -> CHAR
|
|
71899
71921
|
* Source field longer than database field, NUMC -> NUMC`,
|
|
71900
71922
|
tags: [],
|
|
71901
71923
|
};
|
|
@@ -71967,7 +71989,7 @@ class StartAtTab extends _abap_rule_1.ABAPRule {
|
|
|
71967
71989
|
key: "start_at_tab",
|
|
71968
71990
|
title: "Start at tab",
|
|
71969
71991
|
shortDescription: `Checks that statements start at tabstops.`,
|
|
71970
|
-
extendedInformation: `Reports max 100 issues per file
|
|
71992
|
+
extendedInformation: `Reports max 100 issues per file
|
|
71971
71993
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#indent-and-snap-to-tab`,
|
|
71972
71994
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
71973
71995
|
badExample: ` WRITE a.`,
|
|
@@ -72144,12 +72166,12 @@ class StrictSQL extends _abap_rule_1.ABAPRule {
|
|
|
72144
72166
|
key: "strict_sql",
|
|
72145
72167
|
title: "Strict SQL",
|
|
72146
72168
|
shortDescription: `Strict SQL`,
|
|
72147
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm
|
|
72148
|
-
|
|
72149
|
-
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm
|
|
72150
|
-
|
|
72151
|
-
Also see separate rule sql_escape_host_variables
|
|
72152
|
-
|
|
72169
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm
|
|
72170
|
+
|
|
72171
|
+
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm
|
|
72172
|
+
|
|
72173
|
+
Also see separate rule sql_escape_host_variables
|
|
72174
|
+
|
|
72153
72175
|
Activates from v750 and up`,
|
|
72154
72176
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Quickfix],
|
|
72155
72177
|
badExample: `SELECT * FROM ztabl INTO TABLE @rt_content WHERE type = @iv_type ORDER BY PRIMARY KEY.`,
|
|
@@ -72403,11 +72425,11 @@ class SyModification extends _abap_rule_1.ABAPRule {
|
|
|
72403
72425
|
key: "sy_modification",
|
|
72404
72426
|
title: "Modification of SY fields",
|
|
72405
72427
|
shortDescription: `Finds modification of sy fields`,
|
|
72406
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abensystem_fields.htm
|
|
72407
|
-
|
|
72428
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abensystem_fields.htm
|
|
72429
|
+
|
|
72408
72430
|
Changes to SY-TVAR* fields are not reported`,
|
|
72409
72431
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
72410
|
-
badExample: `sy-uname = 2.
|
|
72432
|
+
badExample: `sy-uname = 2.
|
|
72411
72433
|
sy = sy.`,
|
|
72412
72434
|
};
|
|
72413
72435
|
}
|
|
@@ -72469,8 +72491,8 @@ class TABLEnhancementCategory {
|
|
|
72469
72491
|
key: "tabl_enhancement_category",
|
|
72470
72492
|
title: "TABL enhancement category must be set",
|
|
72471
72493
|
shortDescription: `Checks that tables do not have the enhancement category 'not classified'.`,
|
|
72472
|
-
extendedInformation: `SAP note 3063227 changes the default to 'Cannot be enhanced'.
|
|
72473
|
-
|
|
72494
|
+
extendedInformation: `SAP note 3063227 changes the default to 'Cannot be enhanced'.
|
|
72495
|
+
|
|
72474
72496
|
You may use standard report RS_DDIC_CLASSIFICATION_FINAL for adjustment.`,
|
|
72475
72497
|
tags: [],
|
|
72476
72498
|
};
|
|
@@ -72535,8 +72557,8 @@ class TablesDeclaredLocally extends _abap_rule_1.ABAPRule {
|
|
|
72535
72557
|
shortDescription: `TABLES are always global, so declare them globally`,
|
|
72536
72558
|
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abaptables.htm`,
|
|
72537
72559
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
72538
|
-
badExample: `FORM foo.
|
|
72539
|
-
TABLES t100.
|
|
72560
|
+
badExample: `FORM foo.
|
|
72561
|
+
TABLES t100.
|
|
72540
72562
|
ENDFORM.`,
|
|
72541
72563
|
goodExample: `TABLES t000.`,
|
|
72542
72564
|
};
|
|
@@ -72664,9 +72686,9 @@ class TypeFormParameters extends _abap_rule_1.ABAPRule {
|
|
|
72664
72686
|
title: "Type FORM parameters",
|
|
72665
72687
|
shortDescription: `Checks for untyped FORM parameters`,
|
|
72666
72688
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
72667
|
-
badExample: `FORM foo USING bar.
|
|
72689
|
+
badExample: `FORM foo USING bar.
|
|
72668
72690
|
ENDFORM.`,
|
|
72669
|
-
goodExample: `FORM foo USING bar TYPE string.
|
|
72691
|
+
goodExample: `FORM foo USING bar TYPE string.
|
|
72670
72692
|
ENDFORM.`,
|
|
72671
72693
|
};
|
|
72672
72694
|
}
|
|
@@ -73339,38 +73361,38 @@ class UnnecessaryPragma extends _abap_rule_1.ABAPRule {
|
|
|
73339
73361
|
key: "unnecessary_pragma",
|
|
73340
73362
|
title: "Unnecessary Pragma",
|
|
73341
73363
|
shortDescription: `Finds pragmas which can be removed`,
|
|
73342
|
-
extendedInformation: `* NO_HANDLER with handler
|
|
73343
|
-
|
|
73344
|
-
* NEEDED without definition
|
|
73345
|
-
|
|
73346
|
-
* NO_TEXT without texts
|
|
73347
|
-
|
|
73348
|
-
* SUBRC_OK where sy-subrc is checked
|
|
73349
|
-
|
|
73364
|
+
extendedInformation: `* NO_HANDLER with handler
|
|
73365
|
+
|
|
73366
|
+
* NEEDED without definition
|
|
73367
|
+
|
|
73368
|
+
* NO_TEXT without texts
|
|
73369
|
+
|
|
73370
|
+
* SUBRC_OK where sy-subrc is checked
|
|
73371
|
+
|
|
73350
73372
|
NO_HANDLER inside macros are not checked`,
|
|
73351
73373
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
73352
|
-
badExample: `TRY.
|
|
73353
|
-
...
|
|
73354
|
-
CATCH zcx_abapgit_exception ##NO_HANDLER.
|
|
73355
|
-
RETURN. " it has a handler
|
|
73356
|
-
ENDTRY.
|
|
73357
|
-
MESSAGE w125(zbar) WITH c_foo INTO message ##NEEDED ##NO_TEXT.
|
|
73358
|
-
SELECT SINGLE * FROM tadir INTO @DATA(sdfs) ##SUBRC_OK.
|
|
73359
|
-
IF sy-subrc <> 0.
|
|
73374
|
+
badExample: `TRY.
|
|
73375
|
+
...
|
|
73376
|
+
CATCH zcx_abapgit_exception ##NO_HANDLER.
|
|
73377
|
+
RETURN. " it has a handler
|
|
73378
|
+
ENDTRY.
|
|
73379
|
+
MESSAGE w125(zbar) WITH c_foo INTO message ##NEEDED ##NO_TEXT.
|
|
73380
|
+
SELECT SINGLE * FROM tadir INTO @DATA(sdfs) ##SUBRC_OK.
|
|
73381
|
+
IF sy-subrc <> 0.
|
|
73360
73382
|
ENDIF.`,
|
|
73361
|
-
goodExample: `TRY.
|
|
73362
|
-
...
|
|
73363
|
-
CATCH zcx_abapgit_exception.
|
|
73364
|
-
RETURN.
|
|
73365
|
-
ENDTRY.
|
|
73366
|
-
MESSAGE w125(zbar) WITH c_foo INTO message.
|
|
73367
|
-
SELECT SINGLE * FROM tadir INTO @DATA(sdfs).
|
|
73368
|
-
IF sy-subrc <> 0.
|
|
73369
|
-
ENDIF.
|
|
73370
|
-
|
|
73371
|
-
DATA: BEGIN OF blah ##NEEDED,
|
|
73372
|
-
test1 TYPE string,
|
|
73373
|
-
test2 TYPE string,
|
|
73383
|
+
goodExample: `TRY.
|
|
73384
|
+
...
|
|
73385
|
+
CATCH zcx_abapgit_exception.
|
|
73386
|
+
RETURN.
|
|
73387
|
+
ENDTRY.
|
|
73388
|
+
MESSAGE w125(zbar) WITH c_foo INTO message.
|
|
73389
|
+
SELECT SINGLE * FROM tadir INTO @DATA(sdfs).
|
|
73390
|
+
IF sy-subrc <> 0.
|
|
73391
|
+
ENDIF.
|
|
73392
|
+
|
|
73393
|
+
DATA: BEGIN OF blah ##NEEDED,
|
|
73394
|
+
test1 TYPE string,
|
|
73395
|
+
test2 TYPE string,
|
|
73374
73396
|
END OF blah.`,
|
|
73375
73397
|
};
|
|
73376
73398
|
}
|
|
@@ -73537,18 +73559,18 @@ class UnnecessaryReturn extends _abap_rule_1.ABAPRule {
|
|
|
73537
73559
|
shortDescription: `Finds unnecessary RETURN statements`,
|
|
73538
73560
|
extendedInformation: `Finds unnecessary RETURN statements`,
|
|
73539
73561
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
73540
|
-
badExample: `FORM hello1.
|
|
73541
|
-
WRITE 'world'.
|
|
73542
|
-
RETURN.
|
|
73543
|
-
ENDFORM.
|
|
73544
|
-
|
|
73545
|
-
FORM foo.
|
|
73546
|
-
IF 1 = 2.
|
|
73547
|
-
RETURN.
|
|
73548
|
-
ENDIF.
|
|
73562
|
+
badExample: `FORM hello1.
|
|
73563
|
+
WRITE 'world'.
|
|
73564
|
+
RETURN.
|
|
73565
|
+
ENDFORM.
|
|
73566
|
+
|
|
73567
|
+
FORM foo.
|
|
73568
|
+
IF 1 = 2.
|
|
73569
|
+
RETURN.
|
|
73570
|
+
ENDIF.
|
|
73549
73571
|
ENDFORM.`,
|
|
73550
|
-
goodExample: `FORM hello2.
|
|
73551
|
-
WRITE 'world'.
|
|
73572
|
+
goodExample: `FORM hello2.
|
|
73573
|
+
WRITE 'world'.
|
|
73552
73574
|
ENDFORM.`,
|
|
73553
73575
|
};
|
|
73554
73576
|
}
|
|
@@ -73899,13 +73921,13 @@ class UnusedMacros {
|
|
|
73899
73921
|
title: "Unused macros",
|
|
73900
73922
|
shortDescription: `Checks for unused macro definitions definitions`,
|
|
73901
73923
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
73902
|
-
badExample: `DEFINE foobar1.
|
|
73903
|
-
WRITE 'hello'.
|
|
73924
|
+
badExample: `DEFINE foobar1.
|
|
73925
|
+
WRITE 'hello'.
|
|
73904
73926
|
END-OF-DEFINITION.`,
|
|
73905
|
-
goodExample: `DEFINE foobar2.
|
|
73906
|
-
WRITE 'hello'.
|
|
73907
|
-
END-OF-DEFINITION.
|
|
73908
|
-
|
|
73927
|
+
goodExample: `DEFINE foobar2.
|
|
73928
|
+
WRITE 'hello'.
|
|
73929
|
+
END-OF-DEFINITION.
|
|
73930
|
+
|
|
73909
73931
|
foobar2.`,
|
|
73910
73932
|
};
|
|
73911
73933
|
}
|
|
@@ -74017,18 +74039,18 @@ class UnusedMethods {
|
|
|
74017
74039
|
key: "unused_methods",
|
|
74018
74040
|
title: "Unused methods",
|
|
74019
74041
|
shortDescription: `Checks for unused methods`,
|
|
74020
|
-
extendedInformation: `Checks private and protected methods.
|
|
74021
|
-
|
|
74022
|
-
Unused methods are not reported if the object contains parser or syntax errors.
|
|
74023
|
-
Quick fixes only appears for private methods or projected methods where the class doesnt have any subclasses.
|
|
74024
|
-
|
|
74025
|
-
Skips:
|
|
74026
|
-
* methods FOR TESTING
|
|
74027
|
-
* methods SETUP + TEARDOWN + CLASS_SETUP + CLASS_TEARDOWN in testclasses
|
|
74028
|
-
* class_constructor + constructor methods
|
|
74029
|
-
* event handlers
|
|
74030
|
-
* methods that are redefined
|
|
74031
|
-
* INCLUDEs
|
|
74042
|
+
extendedInformation: `Checks private and protected methods.
|
|
74043
|
+
|
|
74044
|
+
Unused methods are not reported if the object contains parser or syntax errors.
|
|
74045
|
+
Quick fixes only appears for private methods or projected methods where the class doesnt have any subclasses.
|
|
74046
|
+
|
|
74047
|
+
Skips:
|
|
74048
|
+
* methods FOR TESTING
|
|
74049
|
+
* methods SETUP + TEARDOWN + CLASS_SETUP + CLASS_TEARDOWN in testclasses
|
|
74050
|
+
* class_constructor + constructor methods
|
|
74051
|
+
* event handlers
|
|
74052
|
+
* methods that are redefined
|
|
74053
|
+
* INCLUDEs
|
|
74032
74054
|
`,
|
|
74033
74055
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
74034
74056
|
pragma: "##CALLED",
|
|
@@ -74504,23 +74526,23 @@ class UnusedVariables {
|
|
|
74504
74526
|
key: "unused_variables",
|
|
74505
74527
|
title: "Unused variables",
|
|
74506
74528
|
shortDescription: `Checks for unused variables and constants`,
|
|
74507
|
-
extendedInformation: `Skips event parameters.
|
|
74508
|
-
|
|
74509
|
-
Note that this currently does not work if the source code uses macros.
|
|
74510
|
-
|
|
74511
|
-
Unused variables are not reported if the object contains parser or syntax errors.
|
|
74512
|
-
|
|
74529
|
+
extendedInformation: `Skips event parameters.
|
|
74530
|
+
|
|
74531
|
+
Note that this currently does not work if the source code uses macros.
|
|
74532
|
+
|
|
74533
|
+
Unused variables are not reported if the object contains parser or syntax errors.
|
|
74534
|
+
|
|
74513
74535
|
Errors found in INCLUDES are reported for the main program.`,
|
|
74514
74536
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
74515
74537
|
pragma: "##NEEDED",
|
|
74516
74538
|
pseudoComment: "EC NEEDED",
|
|
74517
|
-
badExample: `DATA: BEGIN OF blah1,
|
|
74518
|
-
test TYPE string,
|
|
74519
|
-
test2 TYPE string,
|
|
74539
|
+
badExample: `DATA: BEGIN OF blah1,
|
|
74540
|
+
test TYPE string,
|
|
74541
|
+
test2 TYPE string,
|
|
74520
74542
|
END OF blah1.`,
|
|
74521
|
-
goodExample: `DATA: BEGIN OF blah2 ##NEEDED,
|
|
74522
|
-
test TYPE string,
|
|
74523
|
-
test2 TYPE string,
|
|
74543
|
+
goodExample: `DATA: BEGIN OF blah2 ##NEEDED,
|
|
74544
|
+
test TYPE string,
|
|
74545
|
+
test2 TYPE string,
|
|
74524
74546
|
END OF blah2.`,
|
|
74525
74547
|
};
|
|
74526
74548
|
}
|
|
@@ -74739,15 +74761,15 @@ class UseBoolExpression extends _abap_rule_1.ABAPRule {
|
|
|
74739
74761
|
shortDescription: `Use boolean expression, xsdbool from 740sp08 and up, boolc from 702 and up`,
|
|
74740
74762
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-xsdbool-to-set-boolean-variables`,
|
|
74741
74763
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
74742
|
-
badExample: `IF line IS INITIAL.
|
|
74743
|
-
has_entries = abap_false.
|
|
74744
|
-
ELSE.
|
|
74745
|
-
has_entries = abap_true.
|
|
74746
|
-
ENDIF.
|
|
74747
|
-
|
|
74764
|
+
badExample: `IF line IS INITIAL.
|
|
74765
|
+
has_entries = abap_false.
|
|
74766
|
+
ELSE.
|
|
74767
|
+
has_entries = abap_true.
|
|
74768
|
+
ENDIF.
|
|
74769
|
+
|
|
74748
74770
|
DATA(fsdf) = COND #( WHEN foo <> bar THEN abap_true ELSE abap_false ).`,
|
|
74749
|
-
goodExample: `DATA(has_entries) = xsdbool( line IS NOT INITIAL ).
|
|
74750
|
-
|
|
74771
|
+
goodExample: `DATA(has_entries) = xsdbool( line IS NOT INITIAL ).
|
|
74772
|
+
|
|
74751
74773
|
DATA(fsdf) = xsdbool( foo <> bar ).`,
|
|
74752
74774
|
};
|
|
74753
74775
|
}
|
|
@@ -74865,15 +74887,15 @@ class UseClassBasedExceptions extends _abap_rule_1.ABAPRule {
|
|
|
74865
74887
|
shortDescription: `Use class based exceptions, checks interface and class definitions`,
|
|
74866
74888
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-class-based-exceptions`,
|
|
74867
74889
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
74868
|
-
badExample: `INTERFACE lif.
|
|
74869
|
-
METHODS load_data
|
|
74870
|
-
EXCEPTIONS
|
|
74871
|
-
invalid_parameter.
|
|
74890
|
+
badExample: `INTERFACE lif.
|
|
74891
|
+
METHODS load_data
|
|
74892
|
+
EXCEPTIONS
|
|
74893
|
+
invalid_parameter.
|
|
74872
74894
|
ENDINTERFACE.`,
|
|
74873
|
-
goodExample: `INTERFACE lif.
|
|
74874
|
-
METHODS load_data
|
|
74875
|
-
RAISING
|
|
74876
|
-
cx_something.
|
|
74895
|
+
goodExample: `INTERFACE lif.
|
|
74896
|
+
METHODS load_data
|
|
74897
|
+
RAISING
|
|
74898
|
+
cx_something.
|
|
74877
74899
|
ENDINTERFACE.`,
|
|
74878
74900
|
};
|
|
74879
74901
|
}
|
|
@@ -74933,15 +74955,15 @@ class UseLineExists extends _abap_rule_1.ABAPRule {
|
|
|
74933
74955
|
key: "use_line_exists",
|
|
74934
74956
|
title: "Use line_exists",
|
|
74935
74957
|
shortDescription: `Use line_exists, from 740sp02 and up`,
|
|
74936
|
-
extendedInformation: `
|
|
74937
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-line_exists-to-read-table-or-loop-at
|
|
74938
|
-
|
|
74958
|
+
extendedInformation: `
|
|
74959
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-line_exists-to-read-table-or-loop-at
|
|
74960
|
+
|
|
74939
74961
|
Not reported if the READ TABLE statement contains BINARY SEARCH.`,
|
|
74940
74962
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
74941
|
-
badExample: `READ TABLE my_table TRANSPORTING NO FIELDS WITH KEY key = 'A'.
|
|
74942
|
-
IF sy-subrc = 0.
|
|
74963
|
+
badExample: `READ TABLE my_table TRANSPORTING NO FIELDS WITH KEY key = 'A'.
|
|
74964
|
+
IF sy-subrc = 0.
|
|
74943
74965
|
ENDIF.`,
|
|
74944
|
-
goodExample: `IF line_exists( my_table[ key = 'A' ] ).
|
|
74966
|
+
goodExample: `IF line_exists( my_table[ key = 'A' ] ).
|
|
74945
74967
|
ENDIF.`,
|
|
74946
74968
|
};
|
|
74947
74969
|
}
|
|
@@ -75051,10 +75073,10 @@ class UseNew extends _abap_rule_1.ABAPRule {
|
|
|
75051
75073
|
key: "use_new",
|
|
75052
75074
|
title: "Use NEW",
|
|
75053
75075
|
shortDescription: `Checks for deprecated CREATE OBJECT statements.`,
|
|
75054
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-new-to-create-object
|
|
75055
|
-
|
|
75056
|
-
If the target variable is referenced in the CREATE OBJECT statement, no errors are issued
|
|
75057
|
-
|
|
75076
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-new-to-create-object
|
|
75077
|
+
|
|
75078
|
+
If the target variable is referenced in the CREATE OBJECT statement, no errors are issued
|
|
75079
|
+
|
|
75058
75080
|
Applicable from v740sp02 and up`,
|
|
75059
75081
|
badExample: `CREATE OBJECT ref.`,
|
|
75060
75082
|
goodExample: `ref = NEW #( ).`,
|
|
@@ -75152,13 +75174,13 @@ class WhenOthersLast extends _abap_rule_1.ABAPRule {
|
|
|
75152
75174
|
title: "WHEN OTHERS last",
|
|
75153
75175
|
shortDescription: `Checks that WHEN OTHERS is placed the last within a CASE statement.`,
|
|
75154
75176
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
75155
|
-
badExample: `CASE bar.
|
|
75156
|
-
WHEN OTHERS.
|
|
75157
|
-
WHEN 2.
|
|
75177
|
+
badExample: `CASE bar.
|
|
75178
|
+
WHEN OTHERS.
|
|
75179
|
+
WHEN 2.
|
|
75158
75180
|
ENDCASE.`,
|
|
75159
|
-
goodExample: `CASE bar.
|
|
75160
|
-
WHEN 2.
|
|
75161
|
-
WHEN OTHERS.
|
|
75181
|
+
goodExample: `CASE bar.
|
|
75182
|
+
WHEN 2.
|
|
75183
|
+
WHEN OTHERS.
|
|
75162
75184
|
ENDCASE.`,
|
|
75163
75185
|
};
|
|
75164
75186
|
}
|