@abaplint/transpiler-cli 2.10.18 → 2.10.20
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/build/bundle.js +957 -867
- package/build/types.d.ts +3 -3
- package/package.json +7 -5
package/build/bundle.js
CHANGED
|
@@ -83,17 +83,20 @@ class FileOperations {
|
|
|
83
83
|
const filter = (config.input_filter ?? []).map(pattern => new RegExp(pattern, "i"));
|
|
84
84
|
let skipped = 0;
|
|
85
85
|
let added = 0;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
const folders = Array.isArray(config.input_folder) ? config.input_folder : [config.input_folder];
|
|
87
|
+
for (const folder of folders) {
|
|
88
|
+
for (const filename of glob.sync(folder + "/**", { nosort: true, nodir: true })) {
|
|
89
|
+
if (filter.length > 0 && filter.some(a => a.test(filename)) === false) {
|
|
90
|
+
skipped++;
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
files.push({
|
|
94
|
+
filename: path.basename(filename),
|
|
95
|
+
relative: path.relative(config.output_folder, path.dirname(filename)),
|
|
96
|
+
contents: fs.readFileSync(filename, "utf8"),
|
|
97
|
+
});
|
|
98
|
+
added++;
|
|
90
99
|
}
|
|
91
|
-
files.push({
|
|
92
|
-
filename: path.basename(filename),
|
|
93
|
-
relative: path.relative(config.output_folder, path.dirname(filename)),
|
|
94
|
-
contents: fs.readFileSync(filename, "utf8"),
|
|
95
|
-
});
|
|
96
|
-
added++;
|
|
97
100
|
}
|
|
98
101
|
console.log(added + " files added from source");
|
|
99
102
|
console.log(skipped + " files skipped in source");
|
|
@@ -18965,6 +18968,7 @@ class ABAPFileInformation {
|
|
|
18965
18968
|
identifier: new _identifier_1.Identifier(methodName, this.filename),
|
|
18966
18969
|
isRedefinition: def.findDirectExpression(Expressions.Redefinition) !== undefined,
|
|
18967
18970
|
isForTesting: def.concatTokens().toUpperCase().includes(" FOR TESTING"),
|
|
18971
|
+
isFinal: def.concatTokens().toUpperCase().includes(" FINAL"),
|
|
18968
18972
|
isAbstract: def.findDirectExpression(Expressions.Abstract) !== undefined,
|
|
18969
18973
|
isEventHandler: def.findDirectExpression(Expressions.EventHandler) !== undefined,
|
|
18970
18974
|
visibility,
|
|
@@ -30986,6 +30990,7 @@ const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifie
|
|
|
30986
30990
|
const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
|
|
30987
30991
|
const basic_types_1 = __webpack_require__(/*! ../basic_types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js");
|
|
30988
30992
|
const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
|
|
30993
|
+
const tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
|
|
30989
30994
|
class Parameter {
|
|
30990
30995
|
runSyntax(node, input) {
|
|
30991
30996
|
var _a;
|
|
@@ -30995,19 +31000,24 @@ class Parameter {
|
|
|
30995
31000
|
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
30996
31001
|
return;
|
|
30997
31002
|
}
|
|
31003
|
+
else if (nameToken === undefined) {
|
|
31004
|
+
return;
|
|
31005
|
+
}
|
|
30998
31006
|
if (node.findDirectTokenByText("RADIOBUTTON") && node.findDirectTokenByText("LENGTH")) {
|
|
30999
31007
|
const message = "RADIOBUTTON and LENGTH not possible together";
|
|
31000
31008
|
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, node.getFirstToken(), message));
|
|
31001
31009
|
return;
|
|
31002
31010
|
}
|
|
31003
31011
|
const bfound = new basic_types_1.BasicTypes(input).parseType(node);
|
|
31004
|
-
if (
|
|
31012
|
+
if (bfound) {
|
|
31005
31013
|
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, bfound));
|
|
31006
|
-
return;
|
|
31007
31014
|
}
|
|
31008
|
-
|
|
31015
|
+
else {
|
|
31009
31016
|
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, new basic_1.UnknownType("Parameter, fallback")));
|
|
31010
31017
|
}
|
|
31018
|
+
const magicName = "%_" + nameToken.getStr() + "_%_app_%";
|
|
31019
|
+
const magicToken = new tokens_1.Identifier(nameToken.getStart(), magicName);
|
|
31020
|
+
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(magicToken, input.filename, new basic_1.VoidType("PARAMETER magic")));
|
|
31011
31021
|
}
|
|
31012
31022
|
}
|
|
31013
31023
|
exports.Parameter = Parameter;
|
|
@@ -31668,12 +31678,18 @@ exports.SelectionScreen = void 0;
|
|
|
31668
31678
|
const Expressions = __webpack_require__(/*! ../../2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
|
|
31669
31679
|
const _typed_identifier_1 = __webpack_require__(/*! ../../types/_typed_identifier */ "./node_modules/@abaplint/core/build/src/abap/types/_typed_identifier.js");
|
|
31670
31680
|
const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@abaplint/core/build/src/abap/types/basic/index.js");
|
|
31681
|
+
const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
|
|
31671
31682
|
class SelectionScreen {
|
|
31672
31683
|
runSyntax(node, input) {
|
|
31673
31684
|
const field = node.findFirstExpression(Expressions.InlineField);
|
|
31674
31685
|
if (field === undefined) {
|
|
31675
31686
|
return;
|
|
31676
31687
|
}
|
|
31688
|
+
if (field.getFirstToken().getStr().length > 8) {
|
|
31689
|
+
const message = "SELECTION-SCREEN name too long, " + field.getFirstToken().getStr();
|
|
31690
|
+
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, field.getFirstToken(), message));
|
|
31691
|
+
return;
|
|
31692
|
+
}
|
|
31677
31693
|
const name = field.getFirstToken();
|
|
31678
31694
|
const concat = node.concatTokens().toUpperCase();
|
|
31679
31695
|
if (concat.includes("BEGIN OF TABBED BLOCK")) {
|
|
@@ -31713,6 +31729,7 @@ const basic_1 = __webpack_require__(/*! ../../types/basic */ "./node_modules/@ab
|
|
|
31713
31729
|
const basic_types_1 = __webpack_require__(/*! ../basic_types */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/basic_types.js");
|
|
31714
31730
|
const dynamic_1 = __webpack_require__(/*! ../expressions/dynamic */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/expressions/dynamic.js");
|
|
31715
31731
|
const _syntax_input_1 = __webpack_require__(/*! ../_syntax_input */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_syntax_input.js");
|
|
31732
|
+
const tokens_1 = __webpack_require__(/*! ../../1_lexer/tokens */ "./node_modules/@abaplint/core/build/src/abap/1_lexer/tokens/index.js");
|
|
31716
31733
|
class SelectOption {
|
|
31717
31734
|
runSyntax(node, input) {
|
|
31718
31735
|
var _a;
|
|
@@ -31722,12 +31739,15 @@ class SelectOption {
|
|
|
31722
31739
|
input.issues.push((0, _syntax_input_1.syntaxIssue)(input, nameToken, message));
|
|
31723
31740
|
return;
|
|
31724
31741
|
}
|
|
31742
|
+
else if (nameToken === undefined) {
|
|
31743
|
+
return;
|
|
31744
|
+
}
|
|
31725
31745
|
for (const d of node.findDirectExpressions(Expressions.Dynamic)) {
|
|
31726
31746
|
new dynamic_1.Dynamic().runSyntax(d, input);
|
|
31727
31747
|
}
|
|
31728
31748
|
const nameExpression = node.findFirstExpression(Expressions.FieldChain);
|
|
31729
31749
|
let found = new basic_types_1.BasicTypes(input).resolveLikeName(nameExpression);
|
|
31730
|
-
if (found
|
|
31750
|
+
if (found) {
|
|
31731
31751
|
if (found instanceof basic_1.StructureType) {
|
|
31732
31752
|
let length = 0;
|
|
31733
31753
|
for (const c of found.getComponents()) {
|
|
@@ -31749,11 +31769,13 @@ class SelectOption {
|
|
|
31749
31769
|
{ name: "HIGH", type: found },
|
|
31750
31770
|
]);
|
|
31751
31771
|
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, new basic_1.TableType(stru, { withHeader: true, keyType: basic_1.TableKeyType.default })));
|
|
31752
|
-
return;
|
|
31753
31772
|
}
|
|
31754
|
-
|
|
31773
|
+
else {
|
|
31755
31774
|
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(nameToken, input.filename, new basic_1.UnknownType("Select option, fallback")));
|
|
31756
31775
|
}
|
|
31776
|
+
const magicName = "%_" + nameToken.getStr() + "_%_app_%";
|
|
31777
|
+
const magicToken = new tokens_1.Identifier(nameToken.getStart(), magicName);
|
|
31778
|
+
input.scope.addIdentifier(new _typed_identifier_1.TypedIdentifier(magicToken, input.filename, new basic_1.VoidType("SELECT-OPTION magic")));
|
|
31757
31779
|
}
|
|
31758
31780
|
}
|
|
31759
31781
|
exports.SelectOption = SelectOption;
|
|
@@ -34073,13 +34095,13 @@ class FlowGraph {
|
|
|
34073
34095
|
this.label = label;
|
|
34074
34096
|
}
|
|
34075
34097
|
toDigraph() {
|
|
34076
|
-
return `digraph G {
|
|
34077
|
-
labelloc="t";
|
|
34078
|
-
label="${this.label}";
|
|
34079
|
-
graph [fontname = "helvetica"];
|
|
34080
|
-
node [fontname = "helvetica", shape="box"];
|
|
34081
|
-
edge [fontname = "helvetica"];
|
|
34082
|
-
${this.toTextEdges()}
|
|
34098
|
+
return `digraph G {
|
|
34099
|
+
labelloc="t";
|
|
34100
|
+
label="${this.label}";
|
|
34101
|
+
graph [fontname = "helvetica"];
|
|
34102
|
+
node [fontname = "helvetica", shape="box"];
|
|
34103
|
+
edge [fontname = "helvetica"];
|
|
34104
|
+
${this.toTextEdges()}
|
|
34083
34105
|
}`;
|
|
34084
34106
|
}
|
|
34085
34107
|
listSources(node) {
|
|
@@ -42329,13 +42351,13 @@ class Help {
|
|
|
42329
42351
|
/////////////////////////////////////////////////
|
|
42330
42352
|
static dumpABAP(file, reg, textDocument, position) {
|
|
42331
42353
|
let content = "";
|
|
42332
|
-
content = `
|
|
42333
|
-
<a href="#_tokens" rel="no-refresh">Tokens</a> |
|
|
42334
|
-
<a href="#_statements" rel="no-refresh">Statements</a> |
|
|
42335
|
-
<a href="#_structure" rel="no-refresh">Structure</a> |
|
|
42336
|
-
<a href="#_files" rel="no-refresh">Files</a> |
|
|
42337
|
-
<a href="#_info" rel="no-refresh">Info Dump</a>
|
|
42338
|
-
<hr>
|
|
42354
|
+
content = `
|
|
42355
|
+
<a href="#_tokens" rel="no-refresh">Tokens</a> |
|
|
42356
|
+
<a href="#_statements" rel="no-refresh">Statements</a> |
|
|
42357
|
+
<a href="#_structure" rel="no-refresh">Structure</a> |
|
|
42358
|
+
<a href="#_files" rel="no-refresh">Files</a> |
|
|
42359
|
+
<a href="#_info" rel="no-refresh">Info Dump</a>
|
|
42360
|
+
<hr>
|
|
42339
42361
|
` +
|
|
42340
42362
|
"<tt>" + textDocument.uri + " (" +
|
|
42341
42363
|
(position.line + 1) + ", " +
|
|
@@ -49083,7 +49105,7 @@ class RenameGlobalClass {
|
|
|
49083
49105
|
}
|
|
49084
49106
|
const main = obj.getMainABAPFile();
|
|
49085
49107
|
if (main === undefined) {
|
|
49086
|
-
throw new Error(
|
|
49108
|
+
throw new Error(`Main file not found, ${obj.getType()} ${obj.getName()}`);
|
|
49087
49109
|
}
|
|
49088
49110
|
let changes = [];
|
|
49089
49111
|
// todo, this is actually the same as "id" ?
|
|
@@ -51655,7 +51677,7 @@ class Registry {
|
|
|
51655
51677
|
}
|
|
51656
51678
|
static abaplintVersion() {
|
|
51657
51679
|
// magic, see build script "version.sh"
|
|
51658
|
-
return "2.113.
|
|
51680
|
+
return "2.113.16";
|
|
51659
51681
|
}
|
|
51660
51682
|
getDDICReferences() {
|
|
51661
51683
|
return this.ddicReferences;
|
|
@@ -51974,10 +51996,10 @@ class SevenBitAscii {
|
|
|
51974
51996
|
key: "7bit_ascii",
|
|
51975
51997
|
title: "Check for 7bit ascii",
|
|
51976
51998
|
shortDescription: `Only allow characters from the 7bit ASCII set.`,
|
|
51977
|
-
extendedInformation: `https://docs.abapopenchecks.org/checks/05/
|
|
51978
|
-
|
|
51979
|
-
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
|
|
51980
|
-
|
|
51999
|
+
extendedInformation: `https://docs.abapopenchecks.org/checks/05/
|
|
52000
|
+
|
|
52001
|
+
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
|
|
52002
|
+
|
|
51981
52003
|
Checkes files with extensions ".abap" and ".asddls"`,
|
|
51982
52004
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
51983
52005
|
badExample: `WRITE '뽑'.`,
|
|
@@ -52183,10 +52205,10 @@ class Abapdoc extends _abap_rule_1.ABAPRule {
|
|
|
52183
52205
|
key: "abapdoc",
|
|
52184
52206
|
title: "Check abapdoc",
|
|
52185
52207
|
shortDescription: `Various checks regarding abapdoc.`,
|
|
52186
|
-
extendedInformation: `Base rule checks for existence of abapdoc for public class methods and all interface methods.
|
|
52187
|
-
|
|
52188
|
-
Plus class and interface definitions.
|
|
52189
|
-
|
|
52208
|
+
extendedInformation: `Base rule checks for existence of abapdoc for public class methods and all interface methods.
|
|
52209
|
+
|
|
52210
|
+
Plus class and interface definitions.
|
|
52211
|
+
|
|
52190
52212
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#abap-doc-only-for-public-apis`,
|
|
52191
52213
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
52192
52214
|
};
|
|
@@ -52323,27 +52345,27 @@ class AddTestAttributes extends _abap_rule_1.ABAPRule {
|
|
|
52323
52345
|
title: "Add test attributes for tests classes with test methods",
|
|
52324
52346
|
shortDescription: `Add test attributes DURATION and RISK LEVEL for tests classes with test methods`,
|
|
52325
52347
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
52326
|
-
badExample: `CLASS ltcl_test1 DEFINITION FINAL FOR TESTING.
|
|
52327
|
-
PUBLIC SECTION.
|
|
52328
|
-
PROTECTED SECTION.
|
|
52329
|
-
PRIVATE SECTION.
|
|
52330
|
-
METHODS test FOR TESTING RAISING cx_static_check.
|
|
52331
|
-
ENDCLASS.
|
|
52332
|
-
|
|
52333
|
-
CLASS ltcl_test1 IMPLEMENTATION.
|
|
52334
|
-
METHOD test.
|
|
52335
|
-
ENDMETHOD.
|
|
52348
|
+
badExample: `CLASS ltcl_test1 DEFINITION FINAL FOR TESTING.
|
|
52349
|
+
PUBLIC SECTION.
|
|
52350
|
+
PROTECTED SECTION.
|
|
52351
|
+
PRIVATE SECTION.
|
|
52352
|
+
METHODS test FOR TESTING RAISING cx_static_check.
|
|
52353
|
+
ENDCLASS.
|
|
52354
|
+
|
|
52355
|
+
CLASS ltcl_test1 IMPLEMENTATION.
|
|
52356
|
+
METHOD test.
|
|
52357
|
+
ENDMETHOD.
|
|
52336
52358
|
ENDCLASS.`,
|
|
52337
|
-
goodExample: `CLASS ltcl_test2 DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
52338
|
-
PUBLIC SECTION.
|
|
52339
|
-
PROTECTED SECTION.
|
|
52340
|
-
PRIVATE SECTION.
|
|
52341
|
-
METHODS test FOR TESTING RAISING cx_static_check.
|
|
52342
|
-
ENDCLASS.
|
|
52343
|
-
|
|
52344
|
-
CLASS ltcl_test2 IMPLEMENTATION.
|
|
52345
|
-
METHOD test.
|
|
52346
|
-
ENDMETHOD.
|
|
52359
|
+
goodExample: `CLASS ltcl_test2 DEFINITION FINAL FOR TESTING DURATION SHORT RISK LEVEL HARMLESS.
|
|
52360
|
+
PUBLIC SECTION.
|
|
52361
|
+
PROTECTED SECTION.
|
|
52362
|
+
PRIVATE SECTION.
|
|
52363
|
+
METHODS test FOR TESTING RAISING cx_static_check.
|
|
52364
|
+
ENDCLASS.
|
|
52365
|
+
|
|
52366
|
+
CLASS ltcl_test2 IMPLEMENTATION.
|
|
52367
|
+
METHOD test.
|
|
52368
|
+
ENDMETHOD.
|
|
52347
52369
|
ENDCLASS.`,
|
|
52348
52370
|
};
|
|
52349
52371
|
}
|
|
@@ -52429,49 +52451,49 @@ class AlignParameters extends _abap_rule_1.ABAPRule {
|
|
|
52429
52451
|
key: "align_parameters",
|
|
52430
52452
|
title: "Align Parameters",
|
|
52431
52453
|
shortDescription: `Checks for vertially aligned parameters`,
|
|
52432
|
-
extendedInformation: `Checks:
|
|
52433
|
-
* function module calls
|
|
52434
|
-
* method calls
|
|
52435
|
-
* VALUE constructors
|
|
52436
|
-
* NEW constructors
|
|
52437
|
-
* RAISE EXCEPTION statements
|
|
52438
|
-
* CREATE OBJECT statements
|
|
52439
|
-
* RAISE EVENT statements
|
|
52440
|
-
|
|
52441
|
-
https://github.com/SAP/styleguides/blob/master/clean-abap/CleanABAP.md#align-parameters
|
|
52442
|
-
|
|
52443
|
-
Does not take effect on non functional method calls, use https://rules.abaplint.org/functional_writing/
|
|
52444
|
-
|
|
52445
|
-
If parameters are on the same row, no issues are reported, see
|
|
52454
|
+
extendedInformation: `Checks:
|
|
52455
|
+
* function module calls
|
|
52456
|
+
* method calls
|
|
52457
|
+
* VALUE constructors
|
|
52458
|
+
* NEW constructors
|
|
52459
|
+
* RAISE EXCEPTION statements
|
|
52460
|
+
* CREATE OBJECT statements
|
|
52461
|
+
* RAISE EVENT statements
|
|
52462
|
+
|
|
52463
|
+
https://github.com/SAP/styleguides/blob/master/clean-abap/CleanABAP.md#align-parameters
|
|
52464
|
+
|
|
52465
|
+
Does not take effect on non functional method calls, use https://rules.abaplint.org/functional_writing/
|
|
52466
|
+
|
|
52467
|
+
If parameters are on the same row, no issues are reported, see
|
|
52446
52468
|
https://rules.abaplint.org/max_one_method_parameter_per_line/ for splitting parameters to lines`,
|
|
52447
52469
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
52448
|
-
badExample: `CALL FUNCTION 'FOOBAR'
|
|
52449
|
-
EXPORTING
|
|
52450
|
-
foo = 2
|
|
52451
|
-
parameter = 3.
|
|
52452
|
-
|
|
52453
|
-
foobar( moo = 1
|
|
52454
|
-
param = 1 ).
|
|
52455
|
-
|
|
52456
|
-
foo = VALUE #(
|
|
52457
|
-
foo = bar
|
|
52470
|
+
badExample: `CALL FUNCTION 'FOOBAR'
|
|
52471
|
+
EXPORTING
|
|
52472
|
+
foo = 2
|
|
52473
|
+
parameter = 3.
|
|
52474
|
+
|
|
52475
|
+
foobar( moo = 1
|
|
52476
|
+
param = 1 ).
|
|
52477
|
+
|
|
52478
|
+
foo = VALUE #(
|
|
52479
|
+
foo = bar
|
|
52458
52480
|
moo = 2 ).`,
|
|
52459
|
-
goodExample: `CALL FUNCTION 'FOOBAR'
|
|
52460
|
-
EXPORTING
|
|
52461
|
-
foo = 2
|
|
52462
|
-
parameter = 3.
|
|
52463
|
-
|
|
52464
|
-
foobar( moo = 1
|
|
52465
|
-
param = 1 ).
|
|
52466
|
-
|
|
52467
|
-
foo = VALUE #(
|
|
52468
|
-
foo = bar
|
|
52469
|
-
moo = 2 ).
|
|
52470
|
-
|
|
52471
|
-
DATA(sdf) = VALUE type(
|
|
52472
|
-
common_val = 2
|
|
52473
|
-
another_common = 5
|
|
52474
|
-
( row_value = 4
|
|
52481
|
+
goodExample: `CALL FUNCTION 'FOOBAR'
|
|
52482
|
+
EXPORTING
|
|
52483
|
+
foo = 2
|
|
52484
|
+
parameter = 3.
|
|
52485
|
+
|
|
52486
|
+
foobar( moo = 1
|
|
52487
|
+
param = 1 ).
|
|
52488
|
+
|
|
52489
|
+
foo = VALUE #(
|
|
52490
|
+
foo = bar
|
|
52491
|
+
moo = 2 ).
|
|
52492
|
+
|
|
52493
|
+
DATA(sdf) = VALUE type(
|
|
52494
|
+
common_val = 2
|
|
52495
|
+
another_common = 5
|
|
52496
|
+
( row_value = 4
|
|
52475
52497
|
value_foo = 5 ) ).`,
|
|
52476
52498
|
};
|
|
52477
52499
|
}
|
|
@@ -52905,37 +52927,37 @@ class AlignTypeExpressions extends _abap_rule_1.ABAPRule {
|
|
|
52905
52927
|
key: "align_type_expressions",
|
|
52906
52928
|
title: "Align TYPE expressions",
|
|
52907
52929
|
shortDescription: `Align TYPE expressions in statements`,
|
|
52908
|
-
extendedInformation: `
|
|
52909
|
-
Currently works for METHODS + BEGIN OF
|
|
52910
|
-
|
|
52911
|
-
If BEGIN OF has an INCLUDE TYPE its ignored
|
|
52912
|
-
|
|
52913
|
-
Also note that clean ABAP does not recommend aligning TYPE clauses:
|
|
52930
|
+
extendedInformation: `
|
|
52931
|
+
Currently works for METHODS + BEGIN OF
|
|
52932
|
+
|
|
52933
|
+
If BEGIN OF has an INCLUDE TYPE its ignored
|
|
52934
|
+
|
|
52935
|
+
Also note that clean ABAP does not recommend aligning TYPE clauses:
|
|
52914
52936
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-align-type-clauses`,
|
|
52915
52937
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix],
|
|
52916
|
-
badExample: `
|
|
52917
|
-
TYPES: BEGIN OF foo,
|
|
52918
|
-
bar TYPE i,
|
|
52919
|
-
foobar TYPE i,
|
|
52920
|
-
END OF foo.
|
|
52921
|
-
|
|
52922
|
-
INTERFACE lif.
|
|
52923
|
-
METHODS bar
|
|
52924
|
-
IMPORTING
|
|
52925
|
-
foo TYPE i
|
|
52926
|
-
foobar TYPE i.
|
|
52938
|
+
badExample: `
|
|
52939
|
+
TYPES: BEGIN OF foo,
|
|
52940
|
+
bar TYPE i,
|
|
52941
|
+
foobar TYPE i,
|
|
52942
|
+
END OF foo.
|
|
52943
|
+
|
|
52944
|
+
INTERFACE lif.
|
|
52945
|
+
METHODS bar
|
|
52946
|
+
IMPORTING
|
|
52947
|
+
foo TYPE i
|
|
52948
|
+
foobar TYPE i.
|
|
52927
52949
|
ENDINTERFACE.`,
|
|
52928
|
-
goodExample: `
|
|
52929
|
-
TYPES: BEGIN OF foo,
|
|
52930
|
-
bar TYPE i,
|
|
52931
|
-
foobar TYPE i,
|
|
52932
|
-
END OF foo.
|
|
52933
|
-
|
|
52934
|
-
INTERFACE lif.
|
|
52935
|
-
METHODS bar
|
|
52936
|
-
IMPORTING
|
|
52937
|
-
foo TYPE i
|
|
52938
|
-
foobar TYPE i.
|
|
52950
|
+
goodExample: `
|
|
52951
|
+
TYPES: BEGIN OF foo,
|
|
52952
|
+
bar TYPE i,
|
|
52953
|
+
foobar TYPE i,
|
|
52954
|
+
END OF foo.
|
|
52955
|
+
|
|
52956
|
+
INTERFACE lif.
|
|
52957
|
+
METHODS bar
|
|
52958
|
+
IMPORTING
|
|
52959
|
+
foo TYPE i
|
|
52960
|
+
foobar TYPE i.
|
|
52939
52961
|
ENDINTERFACE.`,
|
|
52940
52962
|
};
|
|
52941
52963
|
}
|
|
@@ -53214,16 +53236,17 @@ class AmbiguousStatement extends _abap_rule_1.ABAPRule {
|
|
|
53214
53236
|
return {
|
|
53215
53237
|
key: "ambiguous_statement",
|
|
53216
53238
|
title: "Check for ambigious statements",
|
|
53217
|
-
shortDescription: `Checks for ambiguity between deleting or modifying from internal and database table
|
|
53218
|
-
Add "TABLE" keyword or "@" for escaping SQL variables
|
|
53219
|
-
|
|
53239
|
+
shortDescription: `Checks for ambiguity between deleting or modifying from internal and database table
|
|
53240
|
+
Add "TABLE" keyword or "@" for escaping SQL variables
|
|
53241
|
+
|
|
53220
53242
|
Only works if the target version is 740sp05 or above`,
|
|
53221
53243
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
53222
|
-
badExample: `DELETE foo FROM bar.
|
|
53244
|
+
badExample: `DELETE foo FROM bar.
|
|
53223
53245
|
MODIFY foo FROM bar.`,
|
|
53224
|
-
goodExample: `DELETE foo FROM @bar.
|
|
53225
|
-
|
|
53226
|
-
MODIFY zfoo FROM @wa
|
|
53246
|
+
goodExample: `DELETE foo FROM @bar.
|
|
53247
|
+
DELETE TABLE itab FROM 2.
|
|
53248
|
+
MODIFY zfoo FROM @wa.
|
|
53249
|
+
MODIFY TABLE foo FROM bar.`,
|
|
53227
53250
|
};
|
|
53228
53251
|
}
|
|
53229
53252
|
getMessage() {
|
|
@@ -53327,16 +53350,16 @@ class AvoidUse extends _abap_rule_1.ABAPRule {
|
|
|
53327
53350
|
key: "avoid_use",
|
|
53328
53351
|
title: "Avoid use of certain statements",
|
|
53329
53352
|
shortDescription: `Detects usage of certain statements.`,
|
|
53330
|
-
extendedInformation: `DEFAULT KEY: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key
|
|
53331
|
-
|
|
53332
|
-
Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
53333
|
-
|
|
53334
|
-
STATICS: use CLASS-DATA instead
|
|
53335
|
-
|
|
53336
|
-
DESCRIBE TABLE LINES: use lines() instead (quickfix exists)
|
|
53337
|
-
|
|
53338
|
-
TEST-SEAMS: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-test-seams-as-temporary-workaround
|
|
53339
|
-
|
|
53353
|
+
extendedInformation: `DEFAULT KEY: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-default-key
|
|
53354
|
+
|
|
53355
|
+
Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
53356
|
+
|
|
53357
|
+
STATICS: use CLASS-DATA instead
|
|
53358
|
+
|
|
53359
|
+
DESCRIBE TABLE LINES: use lines() instead (quickfix exists)
|
|
53360
|
+
|
|
53361
|
+
TEST-SEAMS: https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-test-seams-as-temporary-workaround
|
|
53362
|
+
|
|
53340
53363
|
BREAK points`,
|
|
53341
53364
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
53342
53365
|
};
|
|
@@ -53468,11 +53491,11 @@ class BeginEndNames extends _abap_rule_1.ABAPRule {
|
|
|
53468
53491
|
title: "Check BEGIN END names",
|
|
53469
53492
|
shortDescription: `Check BEGIN OF and END OF names match, plus there must be statements between BEGIN and END`,
|
|
53470
53493
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
53471
|
-
badExample: `DATA: BEGIN OF stru,
|
|
53472
|
-
field TYPE i,
|
|
53494
|
+
badExample: `DATA: BEGIN OF stru,
|
|
53495
|
+
field TYPE i,
|
|
53473
53496
|
END OF structure_not_the_same.`,
|
|
53474
|
-
goodExample: `DATA: BEGIN OF stru,
|
|
53475
|
-
field TYPE i,
|
|
53497
|
+
goodExample: `DATA: BEGIN OF stru,
|
|
53498
|
+
field TYPE i,
|
|
53476
53499
|
END OF stru.`,
|
|
53477
53500
|
};
|
|
53478
53501
|
}
|
|
@@ -53569,20 +53592,20 @@ class BeginSingleInclude extends _abap_rule_1.ABAPRule {
|
|
|
53569
53592
|
title: "BEGIN contains single INCLUDE",
|
|
53570
53593
|
shortDescription: `Finds TYPE BEGIN with just one INCLUDE TYPE, and DATA with single INCLUDE STRUCTURE`,
|
|
53571
53594
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
53572
|
-
badExample: `TYPES: BEGIN OF dummy1.
|
|
53573
|
-
INCLUDE TYPE dselc.
|
|
53574
|
-
TYPES: END OF dummy1.
|
|
53575
|
-
|
|
53576
|
-
DATA BEGIN OF foo.
|
|
53577
|
-
INCLUDE STRUCTURE syst.
|
|
53578
|
-
DATA END OF foo.
|
|
53579
|
-
|
|
53580
|
-
STATICS BEGIN OF bar.
|
|
53581
|
-
INCLUDE STRUCTURE syst.
|
|
53595
|
+
badExample: `TYPES: BEGIN OF dummy1.
|
|
53596
|
+
INCLUDE TYPE dselc.
|
|
53597
|
+
TYPES: END OF dummy1.
|
|
53598
|
+
|
|
53599
|
+
DATA BEGIN OF foo.
|
|
53600
|
+
INCLUDE STRUCTURE syst.
|
|
53601
|
+
DATA END OF foo.
|
|
53602
|
+
|
|
53603
|
+
STATICS BEGIN OF bar.
|
|
53604
|
+
INCLUDE STRUCTURE syst.
|
|
53582
53605
|
STATICS END OF bar.`,
|
|
53583
|
-
goodExample: `DATA BEGIN OF foo.
|
|
53584
|
-
DATA field TYPE i.
|
|
53585
|
-
INCLUDE STRUCTURE dselc.
|
|
53606
|
+
goodExample: `DATA BEGIN OF foo.
|
|
53607
|
+
DATA field TYPE i.
|
|
53608
|
+
INCLUDE STRUCTURE dselc.
|
|
53586
53609
|
DATA END OF foo.`,
|
|
53587
53610
|
};
|
|
53588
53611
|
}
|
|
@@ -53672,9 +53695,9 @@ class CallTransactionAuthorityCheck extends _abap_rule_1.ABAPRule {
|
|
|
53672
53695
|
extendedInformation: `https://docs.abapopenchecks.org/checks/54/`,
|
|
53673
53696
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Security],
|
|
53674
53697
|
badExample: `CALL TRANSACTION 'FOO'.`,
|
|
53675
|
-
goodExample: `TRY.
|
|
53676
|
-
CALL TRANSACTION 'FOO' WITH AUTHORITY-CHECK.
|
|
53677
|
-
CATCH cx_sy_authorization_error.
|
|
53698
|
+
goodExample: `TRY.
|
|
53699
|
+
CALL TRANSACTION 'FOO' WITH AUTHORITY-CHECK.
|
|
53700
|
+
CATCH cx_sy_authorization_error.
|
|
53678
53701
|
ENDTRY.`,
|
|
53679
53702
|
};
|
|
53680
53703
|
}
|
|
@@ -53739,10 +53762,10 @@ class CDSCommentStyle {
|
|
|
53739
53762
|
key: "cds_comment_style",
|
|
53740
53763
|
title: "CDS Comment Style",
|
|
53741
53764
|
shortDescription: `Check for obsolete comment style`,
|
|
53742
|
-
extendedInformation: `Check for obsolete comment style
|
|
53743
|
-
|
|
53744
|
-
Comments starting with "--" are considered obsolete
|
|
53745
|
-
|
|
53765
|
+
extendedInformation: `Check for obsolete comment style
|
|
53766
|
+
|
|
53767
|
+
Comments starting with "--" are considered obsolete
|
|
53768
|
+
|
|
53746
53769
|
https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abencds_general_syntax_rules.htm`,
|
|
53747
53770
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
53748
53771
|
badExample: "-- this is a comment",
|
|
@@ -53808,10 +53831,10 @@ class CDSLegacyView {
|
|
|
53808
53831
|
key: "cds_legacy_view",
|
|
53809
53832
|
title: "CDS Legacy View",
|
|
53810
53833
|
shortDescription: `Identify CDS Legacy Views`,
|
|
53811
|
-
extendedInformation: `Use DEFINE VIEW ENTITY instead of DEFINE VIEW
|
|
53812
|
-
|
|
53813
|
-
https://blogs.sap.com/2021/10/16/a-new-generation-of-cds-views-how-to-migrate-your-cds-views-to-cds-view-entities/
|
|
53814
|
-
|
|
53834
|
+
extendedInformation: `Use DEFINE VIEW ENTITY instead of DEFINE VIEW
|
|
53835
|
+
|
|
53836
|
+
https://blogs.sap.com/2021/10/16/a-new-generation-of-cds-views-how-to-migrate-your-cds-views-to-cds-view-entities/
|
|
53837
|
+
|
|
53815
53838
|
v755 and up`,
|
|
53816
53839
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Upport],
|
|
53817
53840
|
};
|
|
@@ -53966,10 +53989,10 @@ class ChainMainlyDeclarations extends _abap_rule_1.ABAPRule {
|
|
|
53966
53989
|
key: "chain_mainly_declarations",
|
|
53967
53990
|
title: "Chain mainly declarations",
|
|
53968
53991
|
shortDescription: `Chain mainly declarations, allows chaining for the configured statements, reports errors for other statements.`,
|
|
53969
|
-
extendedInformation: `
|
|
53970
|
-
https://docs.abapopenchecks.org/checks/23/
|
|
53971
|
-
|
|
53972
|
-
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenchained_statements_guidl.htm
|
|
53992
|
+
extendedInformation: `
|
|
53993
|
+
https://docs.abapopenchecks.org/checks/23/
|
|
53994
|
+
|
|
53995
|
+
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenchained_statements_guidl.htm
|
|
53973
53996
|
`,
|
|
53974
53997
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
53975
53998
|
badExample: `CALL METHOD: bar.`,
|
|
@@ -54145,17 +54168,17 @@ class ChangeIfToCase extends _abap_rule_1.ABAPRule {
|
|
|
54145
54168
|
title: "Change IF to CASE",
|
|
54146
54169
|
shortDescription: `Finds IF constructs that can be changed to CASE`,
|
|
54147
54170
|
// eslint-disable-next-line max-len
|
|
54148
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-case-to-else-if-for-multiple-alternative-conditions
|
|
54149
|
-
|
|
54171
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-case-to-else-if-for-multiple-alternative-conditions
|
|
54172
|
+
|
|
54150
54173
|
If the first comparison is a boolean compare, no issue is reported.`,
|
|
54151
54174
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
54152
|
-
badExample: `IF l_fcat-fieldname EQ 'FOO'.
|
|
54153
|
-
ELSEIF l_fcat-fieldname = 'BAR'
|
|
54154
|
-
OR l_fcat-fieldname = 'MOO'.
|
|
54175
|
+
badExample: `IF l_fcat-fieldname EQ 'FOO'.
|
|
54176
|
+
ELSEIF l_fcat-fieldname = 'BAR'
|
|
54177
|
+
OR l_fcat-fieldname = 'MOO'.
|
|
54155
54178
|
ENDIF.`,
|
|
54156
|
-
goodExample: `CASE l_fcat-fieldname.
|
|
54157
|
-
WHEN 'FOO'.
|
|
54158
|
-
WHEN 'BAR' OR 'MOO'.
|
|
54179
|
+
goodExample: `CASE l_fcat-fieldname.
|
|
54180
|
+
WHEN 'FOO'.
|
|
54181
|
+
WHEN 'BAR' OR 'MOO'.
|
|
54159
54182
|
ENDCASE.`,
|
|
54160
54183
|
};
|
|
54161
54184
|
}
|
|
@@ -54292,8 +54315,8 @@ class CheckAbstract extends _abap_rule_1.ABAPRule {
|
|
|
54292
54315
|
return {
|
|
54293
54316
|
key: "check_abstract",
|
|
54294
54317
|
title: "Check abstract methods and classes",
|
|
54295
|
-
shortDescription: `Checks abstract methods and classes:
|
|
54296
|
-
- class defined as abstract and final,
|
|
54318
|
+
shortDescription: `Checks abstract methods and classes:
|
|
54319
|
+
- class defined as abstract and final,
|
|
54297
54320
|
- non-abstract class contains abstract methods`,
|
|
54298
54321
|
extendedInformation: `If a class defines only constants, use an interface instead`,
|
|
54299
54322
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
@@ -54374,11 +54397,11 @@ class CheckComments extends _abap_rule_1.ABAPRule {
|
|
|
54374
54397
|
return {
|
|
54375
54398
|
key: "check_comments",
|
|
54376
54399
|
title: "Check Comments",
|
|
54377
|
-
shortDescription: `
|
|
54400
|
+
shortDescription: `
|
|
54378
54401
|
Various checks for comment usage.`,
|
|
54379
|
-
extendedInformation: `
|
|
54380
|
-
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
54381
|
-
|
|
54402
|
+
extendedInformation: `
|
|
54403
|
+
Detects end of line comments. Comments starting with "#EC" or "##" are ignored
|
|
54404
|
+
|
|
54382
54405
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#put-comments-before-the-statement-they-relate-to`,
|
|
54383
54406
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
54384
54407
|
badExample: `WRITE 2. " descriptive comment`,
|
|
@@ -54540,9 +54563,9 @@ class CheckInclude {
|
|
|
54540
54563
|
key: "check_include",
|
|
54541
54564
|
title: "Check INCLUDEs",
|
|
54542
54565
|
shortDescription: `Checks INCLUDE statements`,
|
|
54543
|
-
extendedInformation: `
|
|
54544
|
-
* Reports unused includes
|
|
54545
|
-
* Errors if the includes are not found
|
|
54566
|
+
extendedInformation: `
|
|
54567
|
+
* Reports unused includes
|
|
54568
|
+
* Errors if the includes are not found
|
|
54546
54569
|
* Error if including a main program`,
|
|
54547
54570
|
tags: [_irule_1.RuleTag.Syntax],
|
|
54548
54571
|
};
|
|
@@ -54618,14 +54641,14 @@ class CheckSubrc extends _abap_rule_1.ABAPRule {
|
|
|
54618
54641
|
key: "check_subrc",
|
|
54619
54642
|
title: "Check sy-subrc",
|
|
54620
54643
|
shortDescription: `Check sy-subrc`,
|
|
54621
|
-
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
54622
|
-
|
|
54623
|
-
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
54624
|
-
|
|
54625
|
-
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
54626
|
-
|
|
54627
|
-
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
54628
|
-
|
|
54644
|
+
extendedInformation: `Pseudo comment "#EC CI_SUBRC can be added to suppress findings
|
|
54645
|
+
|
|
54646
|
+
If sy-dbcnt is checked after database statements, it is considered okay.
|
|
54647
|
+
|
|
54648
|
+
"SELECT SINGLE @abap_true FROM " is considered as an existence check, also "SELECT COUNT( * )" is considered okay
|
|
54649
|
+
|
|
54650
|
+
If IS ASSIGNED is checked after assigning, it is considered okay.
|
|
54651
|
+
|
|
54629
54652
|
FIND statement with MATCH COUNT is considered okay if subrc is not checked`,
|
|
54630
54653
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
54631
54654
|
pseudoComment: "EC CI_SUBRC",
|
|
@@ -55195,17 +55218,17 @@ class ClassicExceptionsOverlap extends _abap_rule_1.ABAPRule {
|
|
|
55195
55218
|
shortDescription: `Find overlapping classic exceptions`,
|
|
55196
55219
|
extendedInformation: `When debugging its typically good to know exactly which exception is caught`,
|
|
55197
55220
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
55198
|
-
badExample: `CALL FUNCTION 'SOMETHING'
|
|
55199
|
-
EXCEPTIONS
|
|
55200
|
-
system_failure = 1 MESSAGE lv_message
|
|
55201
|
-
communication_failure = 1 MESSAGE lv_message
|
|
55202
|
-
resource_failure = 1
|
|
55221
|
+
badExample: `CALL FUNCTION 'SOMETHING'
|
|
55222
|
+
EXCEPTIONS
|
|
55223
|
+
system_failure = 1 MESSAGE lv_message
|
|
55224
|
+
communication_failure = 1 MESSAGE lv_message
|
|
55225
|
+
resource_failure = 1
|
|
55203
55226
|
OTHERS = 1.`,
|
|
55204
|
-
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
55205
|
-
EXCEPTIONS
|
|
55206
|
-
system_failure = 1 MESSAGE lv_message
|
|
55207
|
-
communication_failure = 2 MESSAGE lv_message
|
|
55208
|
-
resource_failure = 3
|
|
55227
|
+
goodExample: `CALL FUNCTION 'SOMETHING'
|
|
55228
|
+
EXCEPTIONS
|
|
55229
|
+
system_failure = 1 MESSAGE lv_message
|
|
55230
|
+
communication_failure = 2 MESSAGE lv_message
|
|
55231
|
+
resource_failure = 3
|
|
55209
55232
|
OTHERS = 4.`,
|
|
55210
55233
|
};
|
|
55211
55234
|
}
|
|
@@ -55451,7 +55474,7 @@ class CommentedCode extends _abap_rule_1.ABAPRule {
|
|
|
55451
55474
|
key: "commented_code",
|
|
55452
55475
|
title: "Find commented code",
|
|
55453
55476
|
shortDescription: `Detects usage of commented out code.`,
|
|
55454
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
55477
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#delete-code-instead-of-commenting-it
|
|
55455
55478
|
https://docs.abapopenchecks.org/checks/14/`,
|
|
55456
55479
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
55457
55480
|
badExample: `* WRITE 'hello world'.`,
|
|
@@ -55684,10 +55707,10 @@ class ConstructorVisibilityPublic {
|
|
|
55684
55707
|
key: "constructor_visibility_public",
|
|
55685
55708
|
title: "Check constructor visibility is public",
|
|
55686
55709
|
shortDescription: `Constructor must be placed in the public section, even if the class is not CREATE PUBLIC.`,
|
|
55687
|
-
extendedInformation: `
|
|
55688
|
-
This only applies to global classes.
|
|
55689
|
-
|
|
55690
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
55710
|
+
extendedInformation: `
|
|
55711
|
+
This only applies to global classes.
|
|
55712
|
+
|
|
55713
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#if-your-global-class-is-create-private-leave-the-constructor-public
|
|
55691
55714
|
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abeninstance_constructor_guidl.htm`,
|
|
55692
55715
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
55693
55716
|
};
|
|
@@ -55762,8 +55785,8 @@ class ContainsTab extends _abap_rule_1.ABAPRule {
|
|
|
55762
55785
|
key: "contains_tab",
|
|
55763
55786
|
title: "Code contains tab",
|
|
55764
55787
|
shortDescription: `Checks for usage of tabs (enable to enforce spaces)`,
|
|
55765
|
-
extendedInformation: `
|
|
55766
|
-
https://docs.abapopenchecks.org/checks/09/
|
|
55788
|
+
extendedInformation: `
|
|
55789
|
+
https://docs.abapopenchecks.org/checks/09/
|
|
55767
55790
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#indent-and-snap-to-tab`,
|
|
55768
55791
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
55769
55792
|
badExample: `\tWRITE 'hello world'.`,
|
|
@@ -55850,10 +55873,10 @@ class CyclicOO {
|
|
|
55850
55873
|
key: "cyclic_oo",
|
|
55851
55874
|
title: "Cyclic OO",
|
|
55852
55875
|
shortDescription: `Finds cyclic/circular OO references`,
|
|
55853
|
-
extendedInformation: `Runs for global INTF + CLAS objects
|
|
55854
|
-
|
|
55855
|
-
Objects must be without syntax errors for this rule to take effect
|
|
55856
|
-
|
|
55876
|
+
extendedInformation: `Runs for global INTF + CLAS objects
|
|
55877
|
+
|
|
55878
|
+
Objects must be without syntax errors for this rule to take effect
|
|
55879
|
+
|
|
55857
55880
|
References in testclass includes are ignored`,
|
|
55858
55881
|
};
|
|
55859
55882
|
}
|
|
@@ -56078,6 +56101,7 @@ class DangerousStatementConf extends _basic_rule_config_1.BasicRuleConfig {
|
|
|
56078
56101
|
this.generateSubroutine = true;
|
|
56079
56102
|
this.deleteReport = true;
|
|
56080
56103
|
this.deleteTextpool = true;
|
|
56104
|
+
this.insertTextpool = true;
|
|
56081
56105
|
this.deleteDynpro = true;
|
|
56082
56106
|
this.exportDynpro = true;
|
|
56083
56107
|
/** Finds instances of dynamic SQL: SELECT, UPDATE, DELETE, INSERT, MODIFY */
|
|
@@ -56095,7 +56119,7 @@ class DangerousStatement extends _abap_rule_1.ABAPRule {
|
|
|
56095
56119
|
key: "dangerous_statement",
|
|
56096
56120
|
title: "Dangerous statement",
|
|
56097
56121
|
shortDescription: `Detects potentially dangerous statements`,
|
|
56098
|
-
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
56122
|
+
extendedInformation: `Dynamic SQL: Typically ABAP logic does not need dynamic SQL,
|
|
56099
56123
|
dynamic SQL can potentially create SQL injection problems`,
|
|
56100
56124
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Security],
|
|
56101
56125
|
};
|
|
@@ -56141,6 +56165,9 @@ dynamic SQL can potentially create SQL injection problems`,
|
|
|
56141
56165
|
else if (this.conf.deleteTextpool && statement instanceof Statements.DeleteTextpool) {
|
|
56142
56166
|
message = "DELETE TEXTPOOL";
|
|
56143
56167
|
}
|
|
56168
|
+
else if (this.conf.insertTextpool && statement instanceof Statements.InsertTextpool) {
|
|
56169
|
+
message = "INSERT TEXTPOOL";
|
|
56170
|
+
}
|
|
56144
56171
|
else if (this.conf.deleteDynpro && statement instanceof Statements.DeleteDynpro) {
|
|
56145
56172
|
message = "DELETE DYNPRO";
|
|
56146
56173
|
}
|
|
@@ -56299,13 +56326,13 @@ class DefinitionsTop extends _abap_rule_1.ABAPRule {
|
|
|
56299
56326
|
shortDescription: `Checks that definitions are placed at the beginning of METHODs, FORMs and FUNCTIONs.`,
|
|
56300
56327
|
extendedInformation: `https://docs.abapopenchecks.org/checks/17/`,
|
|
56301
56328
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
56302
|
-
badExample: `FROM foo.
|
|
56303
|
-
WRITE 'hello'.
|
|
56304
|
-
DATA int TYPE i.
|
|
56329
|
+
badExample: `FROM foo.
|
|
56330
|
+
WRITE 'hello'.
|
|
56331
|
+
DATA int TYPE i.
|
|
56305
56332
|
ENDFORM.`,
|
|
56306
|
-
goodExample: `FROM foo.
|
|
56307
|
-
DATA int TYPE i.
|
|
56308
|
-
WRITE 'hello'.
|
|
56333
|
+
goodExample: `FROM foo.
|
|
56334
|
+
DATA int TYPE i.
|
|
56335
|
+
WRITE 'hello'.
|
|
56309
56336
|
ENDFORM.`,
|
|
56310
56337
|
};
|
|
56311
56338
|
}
|
|
@@ -56844,39 +56871,39 @@ class Downport {
|
|
|
56844
56871
|
key: "downport",
|
|
56845
56872
|
title: "Downport statement",
|
|
56846
56873
|
shortDescription: `Downport functionality`,
|
|
56847
|
-
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
56848
|
-
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
56849
|
-
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
56850
|
-
|
|
56851
|
-
Current rules:
|
|
56852
|
-
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
56853
|
-
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
56854
|
-
* FIELD-SYMBOL() definitions are outlined
|
|
56855
|
-
* CONV is outlined
|
|
56856
|
-
* COND is outlined
|
|
56857
|
-
* REDUCE is outlined
|
|
56858
|
-
* SWITCH is outlined
|
|
56859
|
-
* FILTER is outlined
|
|
56860
|
-
* APPEND expression is outlined
|
|
56861
|
-
* INSERT expression is outlined
|
|
56862
|
-
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
56863
|
-
* CAST changed to ?=
|
|
56864
|
-
* LOOP AT method_call( ) is outlined
|
|
56865
|
-
* VALUE # with structure fields
|
|
56866
|
-
* VALUE # with internal table lines
|
|
56867
|
-
* Table Expressions are outlined
|
|
56868
|
-
* SELECT INTO @DATA definitions are outlined
|
|
56869
|
-
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
56870
|
-
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
56871
|
-
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
56872
|
-
* RAISE EXCEPTION ... MESSAGE
|
|
56873
|
-
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
56874
|
-
* line_exists and line_index is downported to READ TABLE
|
|
56875
|
-
* ENUMs, but does not nessesarily give the correct type and value
|
|
56876
|
-
* MESSAGE with non simple source
|
|
56877
|
-
|
|
56878
|
-
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
56879
|
-
|
|
56874
|
+
extendedInformation: `Much like the 'commented_code' rule this rule loops through unknown statements and tries parsing with
|
|
56875
|
+
a higher level language version. If successful, various rules are applied to downport the statement.
|
|
56876
|
+
Target downport version is always v702, thus rule is only enabled if target version is v702.
|
|
56877
|
+
|
|
56878
|
+
Current rules:
|
|
56879
|
+
* NEW transformed to CREATE OBJECT, opposite of https://rules.abaplint.org/use_new/
|
|
56880
|
+
* DATA() definitions are outlined, opposite of https://rules.abaplint.org/prefer_inline/
|
|
56881
|
+
* FIELD-SYMBOL() definitions are outlined
|
|
56882
|
+
* CONV is outlined
|
|
56883
|
+
* COND is outlined
|
|
56884
|
+
* REDUCE is outlined
|
|
56885
|
+
* SWITCH is outlined
|
|
56886
|
+
* FILTER is outlined
|
|
56887
|
+
* APPEND expression is outlined
|
|
56888
|
+
* INSERT expression is outlined
|
|
56889
|
+
* EMPTY KEY is changed to DEFAULT KEY, opposite of DEFAULT KEY in https://rules.abaplint.org/avoid_use/
|
|
56890
|
+
* CAST changed to ?=
|
|
56891
|
+
* LOOP AT method_call( ) is outlined
|
|
56892
|
+
* VALUE # with structure fields
|
|
56893
|
+
* VALUE # with internal table lines
|
|
56894
|
+
* Table Expressions are outlined
|
|
56895
|
+
* SELECT INTO @DATA definitions are outlined
|
|
56896
|
+
* Some occurrences of string template formatting option ALPHA changed to function module call
|
|
56897
|
+
* SELECT/INSERT/MODIFY/DELETE/UPDATE "," in field list removed, "@" in source/targets removed
|
|
56898
|
+
* PARTIALLY IMPLEMENTED removed, it can be quick fixed via rule implement_methods
|
|
56899
|
+
* RAISE EXCEPTION ... MESSAGE
|
|
56900
|
+
* Moving with +=, -=, /=, *=, &&= is expanded
|
|
56901
|
+
* line_exists and line_index is downported to READ TABLE
|
|
56902
|
+
* ENUMs, but does not nessesarily give the correct type and value
|
|
56903
|
+
* MESSAGE with non simple source
|
|
56904
|
+
|
|
56905
|
+
Only one transformation is applied to a statement at a time, so multiple steps might be required to do the full downport.
|
|
56906
|
+
|
|
56880
56907
|
Make sure to test the downported code, it might not always be completely correct.`,
|
|
56881
56908
|
tags: [_irule_1.RuleTag.Downport, _irule_1.RuleTag.Quickfix],
|
|
56882
56909
|
};
|
|
@@ -57454,17 +57481,17 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
57454
57481
|
const fieldName = f.concatTokens();
|
|
57455
57482
|
fieldDefinition += indentation + " " + fieldName + " TYPE " + tableName + "-" + fieldName + ",\n";
|
|
57456
57483
|
}
|
|
57457
|
-
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
57484
|
+
fieldDefinition = `DATA: BEGIN OF ${name},
|
|
57458
57485
|
${fieldDefinition}${indentation} END OF ${name}.`;
|
|
57459
57486
|
}
|
|
57460
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
57487
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `${fieldDefinition}
|
|
57461
57488
|
${indentation}`);
|
|
57462
57489
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
57463
57490
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
57464
57491
|
return issue_1.Issue.atToken(lowFile, inlineData.getFirstToken(), "Outline SELECT @DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
57465
57492
|
}
|
|
57466
57493
|
downportSelectTableInline(low, high, lowFile, highSyntax) {
|
|
57467
|
-
var _a, _b, _c;
|
|
57494
|
+
var _a, _b, _c, _d, _e;
|
|
57468
57495
|
if (!(low.get() instanceof _statement_1.Unknown)) {
|
|
57469
57496
|
return undefined;
|
|
57470
57497
|
}
|
|
@@ -57490,23 +57517,28 @@ ${indentation}`);
|
|
|
57490
57517
|
return undefined;
|
|
57491
57518
|
}
|
|
57492
57519
|
let fieldDefinitions = "";
|
|
57493
|
-
for (const f of fieldList.findAllExpressions(Expressions.
|
|
57494
|
-
let fieldName = f.concatTokens();
|
|
57520
|
+
for (const f of fieldList.findAllExpressions(Expressions.SQLField)) {
|
|
57521
|
+
let fieldName = (_c = f.findFirstExpression(Expressions.SQLFieldName)) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
57522
|
+
if (fieldName === undefined) {
|
|
57523
|
+
continue;
|
|
57524
|
+
}
|
|
57495
57525
|
if (fieldName.includes("~")) {
|
|
57496
57526
|
const split = fieldName.split("~");
|
|
57497
57527
|
tableName = split[0];
|
|
57498
57528
|
fieldName = split[1];
|
|
57499
57529
|
}
|
|
57500
|
-
|
|
57530
|
+
const typeName = tableName + "-" + fieldName;
|
|
57531
|
+
fieldName = ((_d = f.findFirstExpression(Expressions.SQLAsName)) === null || _d === void 0 ? void 0 : _d.concatTokens()) || fieldName;
|
|
57532
|
+
fieldDefinitions += indentation + " " + fieldName + " TYPE " + typeName + ",\n";
|
|
57501
57533
|
}
|
|
57502
57534
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
57503
|
-
const name = ((
|
|
57504
|
-
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
57505
|
-
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
57506
|
-
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
57535
|
+
const name = ((_e = inlineData.findFirstExpression(Expressions.TargetField)) === null || _e === void 0 ? void 0 : _e.concatTokens()) || "error";
|
|
57536
|
+
let fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `TYPES: BEGIN OF ${uniqueName},
|
|
57537
|
+
${fieldDefinitions}${indentation} END OF ${uniqueName}.
|
|
57538
|
+
${indentation}DATA ${name} TYPE STANDARD TABLE OF ${uniqueName} WITH DEFAULT KEY.
|
|
57507
57539
|
${indentation}`);
|
|
57508
57540
|
if (fieldDefinitions === "") {
|
|
57509
|
-
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
57541
|
+
fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getStart(), `DATA ${name} TYPE STANDARD TABLE OF ${tableName} WITH DEFAULT KEY.
|
|
57510
57542
|
${indentation}`);
|
|
57511
57543
|
}
|
|
57512
57544
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, inlineData.getFirstToken().getStart(), inlineData.getLastToken().getEnd(), name);
|
|
@@ -57574,7 +57606,7 @@ ${indentation}`);
|
|
|
57574
57606
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
57575
57607
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
57576
57608
|
const firstToken = high.getFirstToken();
|
|
57577
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
57609
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
57578
57610
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
57579
57611
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
57580
57612
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -57628,7 +57660,7 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
57628
57660
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
57629
57661
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
57630
57662
|
const firstToken = high.getFirstToken();
|
|
57631
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
57663
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${target === null || target === void 0 ? void 0 : target.concatTokens()}.
|
|
57632
57664
|
${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
57633
57665
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, source.getFirstToken().getStart(), source.getLastToken().getEnd(), uniqueName);
|
|
57634
57666
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -57670,14 +57702,14 @@ ${indentation}${uniqueName} = ${source.concatTokens()}.\n${indentation}`);
|
|
|
57670
57702
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
57671
57703
|
const firstToken = high.getFirstToken();
|
|
57672
57704
|
// note that the tabix restore should be done before throwing the exception
|
|
57673
|
-
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
57674
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
57675
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
57676
|
-
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
57677
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
57678
|
-
${indentation}IF sy-subrc <> 0.
|
|
57679
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
57680
|
-
${indentation}ENDIF.
|
|
57705
|
+
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, firstToken.getStart(), `DATA ${uniqueName} LIKE LINE OF ${pre}.
|
|
57706
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
57707
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
57708
|
+
${indentation}READ TABLE ${pre} ${condition}INTO ${uniqueName}.
|
|
57709
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
57710
|
+
${indentation}IF sy-subrc <> 0.
|
|
57711
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
57712
|
+
${indentation}ENDIF.
|
|
57681
57713
|
${indentation}`);
|
|
57682
57714
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, startToken.getStart(), tableExpression.getLastToken().getEnd(), uniqueName);
|
|
57683
57715
|
const fix = edit_helper_1.EditHelper.merge(fix2, fix1);
|
|
@@ -57734,7 +57766,7 @@ ${indentation}`);
|
|
|
57734
57766
|
const className = classNames[0].concatTokens();
|
|
57735
57767
|
const targetName = (_b = target.findFirstExpression(Expressions.TargetField)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
57736
57768
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
57737
|
-
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
57769
|
+
const code = ` DATA ${targetName} TYPE REF TO ${className}.
|
|
57738
57770
|
${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
57739
57771
|
const fix = edit_helper_1.EditHelper.replaceRange(lowFile, node.getStart(), node.getEnd(), code);
|
|
57740
57772
|
return issue_1.Issue.atToken(lowFile, node.getFirstToken(), "Outline DATA", this.getMetadata().key, this.conf.severity, fix);
|
|
@@ -57896,16 +57928,16 @@ ${indentation}CATCH ${className} INTO ${targetName}.`;
|
|
|
57896
57928
|
const uniqueName1 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
57897
57929
|
const uniqueName2 = this.uniqueName(node.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
57898
57930
|
const indentation = " ".repeat(node.getFirstToken().getStart().getCol() - 1);
|
|
57899
|
-
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
57900
|
-
${indentation}${uniqueName1}-msgid = ${id}.
|
|
57931
|
+
let abap = `DATA ${uniqueName1} LIKE if_t100_message=>t100key.
|
|
57932
|
+
${indentation}${uniqueName1}-msgid = ${id}.
|
|
57901
57933
|
${indentation}${uniqueName1}-msgno = ${number}.\n`;
|
|
57902
57934
|
if (withs.length > 0) {
|
|
57903
|
-
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
57904
|
-
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
57905
|
-
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
57935
|
+
abap += `${indentation}${uniqueName1}-attr1 = 'IF_T100_DYN_MSG~MSGV1'.
|
|
57936
|
+
${indentation}${uniqueName1}-attr2 = 'IF_T100_DYN_MSG~MSGV2'.
|
|
57937
|
+
${indentation}${uniqueName1}-attr3 = 'IF_T100_DYN_MSG~MSGV3'.
|
|
57906
57938
|
${indentation}${uniqueName1}-attr4 = 'IF_T100_DYN_MSG~MSGV4'.\n`;
|
|
57907
57939
|
}
|
|
57908
|
-
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
57940
|
+
abap += `${indentation}DATA ${uniqueName2} TYPE REF TO ${className}.
|
|
57909
57941
|
${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`;
|
|
57910
57942
|
if (withs.length > 0) {
|
|
57911
57943
|
abap += `${indentation}${uniqueName2}->if_t100_dyn_msg~msgty = 'E'.\n`;
|
|
@@ -58017,10 +58049,10 @@ ${indentation}CREATE OBJECT ${uniqueName2} EXPORTING textid = ${uniqueName1}.\n`
|
|
|
58017
58049
|
let code = "";
|
|
58018
58050
|
if (sourceRef.findFirstExpression(Expressions.TableExpression)) {
|
|
58019
58051
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58020
|
-
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
58021
|
-
IF sy-subrc <> 0.
|
|
58022
|
-
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58023
|
-
ENDIF.
|
|
58052
|
+
code = `ASSIGN ${sourceRef.concatTokens()} TO FIELD-SYMBOL(<${uniqueName}>).
|
|
58053
|
+
IF sy-subrc <> 0.
|
|
58054
|
+
RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58055
|
+
ENDIF.
|
|
58024
58056
|
GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
58025
58057
|
}
|
|
58026
58058
|
else {
|
|
@@ -58109,20 +58141,20 @@ GET REFERENCE OF <${uniqueName}> INTO ${target.concatTokens()}`;
|
|
|
58109
58141
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58110
58142
|
const uniqueFS = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58111
58143
|
const uniqueNameIndex = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58112
|
-
code += ` items LIKE ${loopSourceName},
|
|
58113
|
-
END OF ${groupTargetName}type.
|
|
58114
|
-
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
58115
|
-
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
58144
|
+
code += ` items LIKE ${loopSourceName},
|
|
58145
|
+
END OF ${groupTargetName}type.
|
|
58146
|
+
DATA ${groupTargetName}tab TYPE STANDARD TABLE OF ${groupTargetName}type WITH DEFAULT KEY.
|
|
58147
|
+
DATA ${uniqueName} LIKE LINE OF ${groupTargetName}tab.
|
|
58116
58148
|
LOOP AT ${loopSourceName} ${(_l = high.findFirstExpression(Expressions.LoopTarget)) === null || _l === void 0 ? void 0 : _l.concatTokens()}.\n`;
|
|
58117
58149
|
if (groupIndexName !== undefined) {
|
|
58118
58150
|
code += `DATA(${uniqueNameIndex}) = sy-tabix.\n`;
|
|
58119
58151
|
}
|
|
58120
|
-
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
58152
|
+
code += `READ TABLE ${groupTargetName}tab ASSIGNING FIELD-SYMBOL(<${uniqueFS}>) WITH KEY ${condition}.
|
|
58121
58153
|
IF sy-subrc = 0.\n`;
|
|
58122
58154
|
if (groupCountName !== undefined) {
|
|
58123
58155
|
code += ` <${uniqueFS}>-${groupCountName} = <${uniqueFS}>-${groupCountName} + 1.\n`;
|
|
58124
58156
|
}
|
|
58125
|
-
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
58157
|
+
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE <${uniqueFS}>-items.
|
|
58126
58158
|
ELSE.\n`;
|
|
58127
58159
|
code += ` CLEAR ${uniqueName}.\n`;
|
|
58128
58160
|
for (const c of group.findAllExpressions(Expressions.LoopGroupByComponent)) {
|
|
@@ -58143,8 +58175,8 @@ ELSE.\n`;
|
|
|
58143
58175
|
}
|
|
58144
58176
|
code += ` INSERT ${loopTargetName}${isReference ? "->*" : ""} INTO TABLE ${uniqueName}-items.\n`;
|
|
58145
58177
|
code += ` INSERT ${uniqueName} INTO TABLE ${groupTargetName}tab.\n`;
|
|
58146
|
-
code += `ENDIF.
|
|
58147
|
-
ENDLOOP.
|
|
58178
|
+
code += `ENDIF.
|
|
58179
|
+
ENDLOOP.
|
|
58148
58180
|
LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
58149
58181
|
let fix = edit_helper_1.EditHelper.replaceRange(lowFile, high.getFirstToken().getStart(), high.getLastToken().getEnd(), code);
|
|
58150
58182
|
for (const l of ((_m = highFile.getStructure()) === null || _m === void 0 ? void 0 : _m.findAllStructures(Structures.Loop)) || []) {
|
|
@@ -58316,7 +58348,7 @@ LOOP AT ${groupTargetName}tab ${groupTarget}.`;
|
|
|
58316
58348
|
const enumName = (_b = high.findExpressionAfterToken("ENUM")) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
58317
58349
|
const structureName = (_c = high.findExpressionAfterToken("STRUCTURE")) === null || _c === void 0 ? void 0 : _c.concatTokens();
|
|
58318
58350
|
// all ENUMS are char like?
|
|
58319
|
-
let code = `TYPES ${enumName} TYPE string.
|
|
58351
|
+
let code = `TYPES ${enumName} TYPE string.
|
|
58320
58352
|
CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
58321
58353
|
let count = 1;
|
|
58322
58354
|
for (const e of enumStructure.findDirectStatements(Statements.TypeEnum).concat(enumStructure.findDirectStatements(Statements.Type))) {
|
|
@@ -58360,14 +58392,14 @@ CONSTANTS: BEGIN OF ${structureName},\n`;
|
|
|
58360
58392
|
const tabixBackup = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58361
58393
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
58362
58394
|
// restore tabix before exeption
|
|
58363
|
-
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
58364
|
-
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
58365
|
-
${indentation}${tabixBackup} = sy-tabix.
|
|
58366
|
-
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
58367
|
-
${indentation}sy-tabix = ${tabixBackup}.
|
|
58368
|
-
${indentation}IF sy-subrc <> 0.
|
|
58369
|
-
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58370
|
-
${indentation}ENDIF.
|
|
58395
|
+
const code = `FIELD-SYMBOLS ${uniqueName} LIKE LINE OF ${tName}.
|
|
58396
|
+
${indentation}DATA ${tabixBackup} LIKE sy-tabix.
|
|
58397
|
+
${indentation}${tabixBackup} = sy-tabix.
|
|
58398
|
+
${indentation}READ TABLE ${tName} ${condition}ASSIGNING ${uniqueName}.
|
|
58399
|
+
${indentation}sy-tabix = ${tabixBackup}.
|
|
58400
|
+
${indentation}IF sy-subrc <> 0.
|
|
58401
|
+
${indentation} RAISE EXCEPTION TYPE cx_sy_itab_line_not_found.
|
|
58402
|
+
${indentation}ENDIF.
|
|
58371
58403
|
${indentation}${uniqueName}`;
|
|
58372
58404
|
const start = target.getFirstToken().getStart();
|
|
58373
58405
|
const end = (_a = tableExpression.findDirectTokenByText("]")) === null || _a === void 0 ? void 0 : _a.getEnd();
|
|
@@ -58451,11 +58483,11 @@ ${indentation}${uniqueName}`;
|
|
|
58451
58483
|
const indentation = " ".repeat(high.getFirstToken().getStart().getCol() - 1);
|
|
58452
58484
|
const source = (_b = templateSource === null || templateSource === void 0 ? void 0 : templateSource.findDirectExpression(Expressions.Source)) === null || _b === void 0 ? void 0 : _b.concatTokens();
|
|
58453
58485
|
const uniqueName = this.uniqueName(high.getFirstToken().getStart(), lowFile.getFilename(), highSyntax);
|
|
58454
|
-
const code = `DATA ${uniqueName} TYPE string.
|
|
58455
|
-
${indentation}CALL FUNCTION '${functionName}'
|
|
58456
|
-
${indentation} EXPORTING
|
|
58457
|
-
${indentation} input = ${source}
|
|
58458
|
-
${indentation} IMPORTING
|
|
58486
|
+
const code = `DATA ${uniqueName} TYPE string.
|
|
58487
|
+
${indentation}CALL FUNCTION '${functionName}'
|
|
58488
|
+
${indentation} EXPORTING
|
|
58489
|
+
${indentation} input = ${source}
|
|
58490
|
+
${indentation} IMPORTING
|
|
58459
58491
|
${indentation} output = ${uniqueName}.\n`;
|
|
58460
58492
|
const fix1 = edit_helper_1.EditHelper.insertAt(lowFile, high.getFirstToken().getStart(), code);
|
|
58461
58493
|
const fix2 = edit_helper_1.EditHelper.replaceRange(lowFile, child.getFirstToken().getStart(), child.getLastToken().getEnd(), uniqueName);
|
|
@@ -59767,12 +59799,12 @@ class EasyToFindMessages {
|
|
|
59767
59799
|
key: "easy_to_find_messages",
|
|
59768
59800
|
title: "Easy to find messages",
|
|
59769
59801
|
shortDescription: `Make messages easy to find`,
|
|
59770
|
-
extendedInformation: `All messages must be statically referenced exactly once
|
|
59771
|
-
|
|
59772
|
-
Only MESSAGE and RAISE statments are counted as static references
|
|
59773
|
-
|
|
59774
|
-
Also see rule "message_exists"
|
|
59775
|
-
|
|
59802
|
+
extendedInformation: `All messages must be statically referenced exactly once
|
|
59803
|
+
|
|
59804
|
+
Only MESSAGE and RAISE statments are counted as static references
|
|
59805
|
+
|
|
59806
|
+
Also see rule "message_exists"
|
|
59807
|
+
|
|
59776
59808
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#make-messages-easy-to-find`,
|
|
59777
59809
|
tags: [_irule_1.RuleTag.Styleguide],
|
|
59778
59810
|
};
|
|
@@ -59853,13 +59885,13 @@ class EmptyEvent extends _abap_rule_1.ABAPRule {
|
|
|
59853
59885
|
shortDescription: `Empty selection screen or list processing event block`,
|
|
59854
59886
|
extendedInformation: ``,
|
|
59855
59887
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
59856
|
-
badExample: `
|
|
59857
|
-
INITIALIZATION.
|
|
59858
|
-
WRITE 'hello'.
|
|
59888
|
+
badExample: `
|
|
59889
|
+
INITIALIZATION.
|
|
59890
|
+
WRITE 'hello'.
|
|
59859
59891
|
END-OF-SELECTION.`,
|
|
59860
|
-
goodExample: `
|
|
59861
|
-
START-OF-SELECTION.
|
|
59862
|
-
PERFORM sdf.
|
|
59892
|
+
goodExample: `
|
|
59893
|
+
START-OF-SELECTION.
|
|
59894
|
+
PERFORM sdf.
|
|
59863
59895
|
COMMIT WORK.`,
|
|
59864
59896
|
};
|
|
59865
59897
|
}
|
|
@@ -59951,8 +59983,8 @@ class EmptyLineinStatement extends _abap_rule_1.ABAPRule {
|
|
|
59951
59983
|
key: "empty_line_in_statement",
|
|
59952
59984
|
title: "Find empty lines in statements",
|
|
59953
59985
|
shortDescription: `Checks that statements do not contain empty lines.`,
|
|
59954
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
59955
|
-
|
|
59986
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-obsess-with-separating-blank-lines
|
|
59987
|
+
|
|
59956
59988
|
https://docs.abapopenchecks.org/checks/41/`,
|
|
59957
59989
|
tags: [_irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
59958
59990
|
badExample: `WRITE\n\nhello.`,
|
|
@@ -60128,13 +60160,13 @@ class EmptyStructure extends _abap_rule_1.ABAPRule {
|
|
|
60128
60160
|
shortDescription: `Checks that the code does not contain empty blocks.`,
|
|
60129
60161
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-empty-if-branches`,
|
|
60130
60162
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
60131
|
-
badExample: `IF foo = bar.
|
|
60132
|
-
ENDIF.
|
|
60133
|
-
|
|
60134
|
-
DO 2 TIMES.
|
|
60163
|
+
badExample: `IF foo = bar.
|
|
60164
|
+
ENDIF.
|
|
60165
|
+
|
|
60166
|
+
DO 2 TIMES.
|
|
60135
60167
|
ENDDO.`,
|
|
60136
|
-
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
60137
|
-
ENDLOOP.
|
|
60168
|
+
goodExample: `LOOP AT itab WHERE qty = 0 OR date > sy-datum.
|
|
60169
|
+
ENDLOOP.
|
|
60138
60170
|
result = xsdbool( sy-subrc = 0 ).`,
|
|
60139
60171
|
};
|
|
60140
60172
|
}
|
|
@@ -60276,10 +60308,10 @@ class ExitOrCheck extends _abap_rule_1.ABAPRule {
|
|
|
60276
60308
|
return {
|
|
60277
60309
|
key: "exit_or_check",
|
|
60278
60310
|
title: "Find EXIT or CHECK outside loops",
|
|
60279
|
-
shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
|
|
60311
|
+
shortDescription: `Detects usages of EXIT or CHECK statements outside of loops.
|
|
60280
60312
|
Use RETURN to leave procesing blocks instead.`,
|
|
60281
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
|
|
60282
|
-
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
|
|
60313
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abenleave_processing_blocks.htm
|
|
60314
|
+
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapcheck_processing_blocks.htm
|
|
60283
60315
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#check-vs-return`,
|
|
60284
60316
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
60285
60317
|
};
|
|
@@ -60362,12 +60394,12 @@ class ExpandMacros extends _abap_rule_1.ABAPRule {
|
|
|
60362
60394
|
key: "expand_macros",
|
|
60363
60395
|
title: "Expand Macros",
|
|
60364
60396
|
shortDescription: `Allows expanding macro calls with quick fixes`,
|
|
60365
|
-
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
60366
|
-
|
|
60397
|
+
extendedInformation: `Macros: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abenmacros_guidl.htm
|
|
60398
|
+
|
|
60367
60399
|
Note that macros/DEFINE cannot be used in the ABAP Cloud programming model`,
|
|
60368
|
-
badExample: `DEFINE _hello.
|
|
60369
|
-
WRITE 'hello'.
|
|
60370
|
-
END-OF-DEFINITION.
|
|
60400
|
+
badExample: `DEFINE _hello.
|
|
60401
|
+
WRITE 'hello'.
|
|
60402
|
+
END-OF-DEFINITION.
|
|
60371
60403
|
_hello.`,
|
|
60372
60404
|
goodExample: `WRITE 'hello'.`,
|
|
60373
60405
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Upport],
|
|
@@ -60454,7 +60486,7 @@ class Exporting extends _abap_rule_1.ABAPRule {
|
|
|
60454
60486
|
shortDescription: `Detects EXPORTING statements which can be omitted.`,
|
|
60455
60487
|
badExample: `call_method( EXPORTING foo = bar ).`,
|
|
60456
60488
|
goodExample: `call_method( foo = bar ).`,
|
|
60457
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
|
|
60489
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-optional-keyword-exporting
|
|
60458
60490
|
https://docs.abapopenchecks.org/checks/30/`,
|
|
60459
60491
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
60460
60492
|
};
|
|
@@ -60552,7 +60584,7 @@ class ForbiddenIdentifier extends _abap_rule_1.ABAPRule {
|
|
|
60552
60584
|
key: "forbidden_identifier",
|
|
60553
60585
|
title: "Forbidden Identifier",
|
|
60554
60586
|
shortDescription: `Forbid use of specified identifiers, list of regex.`,
|
|
60555
|
-
extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
|
|
60587
|
+
extendedInformation: `Used in the transpiler to find javascript keywords in ABAP identifiers,
|
|
60556
60588
|
https://github.com/abaplint/transpiler/blob/bda94b8b56e2b7f2f87be2168f12361aa530220e/packages/transpiler/src/validation.ts#L44`,
|
|
60557
60589
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
60558
60590
|
};
|
|
@@ -60794,8 +60826,8 @@ class ForbiddenVoidType {
|
|
|
60794
60826
|
key: "forbidden_void_type",
|
|
60795
60827
|
title: "Forbidden Void Types",
|
|
60796
60828
|
shortDescription: `Avoid usage of specified void types.`,
|
|
60797
|
-
extendedInformation: `Inspiration:
|
|
60798
|
-
BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
|
|
60829
|
+
extendedInformation: `Inspiration:
|
|
60830
|
+
BOOLEAN, BOOLE_D, CHAR01, CHAR1, CHAR10, CHAR12, CHAR128, CHAR2, CHAR20, CHAR4, CHAR70,
|
|
60799
60831
|
DATS, TIMS, DATUM, FLAG, INT4, NUMC3, NUMC4, SAP_BOOL, TEXT25, TEXT80, X255, XFELD`,
|
|
60800
60832
|
};
|
|
60801
60833
|
}
|
|
@@ -61038,7 +61070,7 @@ class FullyTypeITabs extends _abap_rule_1.ABAPRule {
|
|
|
61038
61070
|
key: "fully_type_itabs",
|
|
61039
61071
|
title: "Fully type internal tables",
|
|
61040
61072
|
shortDescription: `No implict table types or table keys`,
|
|
61041
|
-
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
61073
|
+
badExample: `DATA lt_foo TYPE TABLE OF ty.
|
|
61042
61074
|
DATA lt_bar TYPE STANDARD TABLE OF ty.`,
|
|
61043
61075
|
goodExample: `DATA lt_foo TYPE STANDARD TABLE OF ty WITH EMPTY KEY.`,
|
|
61044
61076
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
@@ -61223,26 +61255,26 @@ class FunctionalWriting extends _abap_rule_1.ABAPRule {
|
|
|
61223
61255
|
key: "functional_writing",
|
|
61224
61256
|
title: "Use functional writing",
|
|
61225
61257
|
shortDescription: `Detects usage of call method when functional style calls can be used.`,
|
|
61226
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
|
|
61258
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-calls
|
|
61227
61259
|
https://docs.abapopenchecks.org/checks/07/`,
|
|
61228
61260
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
61229
|
-
badExample: `CALL METHOD zcl_class=>method( ).
|
|
61230
|
-
CALL METHOD cl_abap_typedescr=>describe_by_name
|
|
61231
|
-
EXPORTING
|
|
61232
|
-
p_name = 'NAME'
|
|
61233
|
-
RECEIVING
|
|
61234
|
-
p_descr_ref = lr_typedescr
|
|
61235
|
-
EXCEPTIONS
|
|
61236
|
-
type_not_found = 1
|
|
61261
|
+
badExample: `CALL METHOD zcl_class=>method( ).
|
|
61262
|
+
CALL METHOD cl_abap_typedescr=>describe_by_name
|
|
61263
|
+
EXPORTING
|
|
61264
|
+
p_name = 'NAME'
|
|
61265
|
+
RECEIVING
|
|
61266
|
+
p_descr_ref = lr_typedescr
|
|
61267
|
+
EXCEPTIONS
|
|
61268
|
+
type_not_found = 1
|
|
61237
61269
|
OTHERS = 2.`,
|
|
61238
|
-
goodExample: `zcl_class=>method( ).
|
|
61239
|
-
cl_abap_typedescr=>describe_by_name(
|
|
61240
|
-
EXPORTING
|
|
61241
|
-
p_name = 'NAME'
|
|
61242
|
-
RECEIVING
|
|
61243
|
-
p_descr_ref = lr_typedescr
|
|
61244
|
-
EXCEPTIONS
|
|
61245
|
-
type_not_found = 1
|
|
61270
|
+
goodExample: `zcl_class=>method( ).
|
|
61271
|
+
cl_abap_typedescr=>describe_by_name(
|
|
61272
|
+
EXPORTING
|
|
61273
|
+
p_name = 'NAME'
|
|
61274
|
+
RECEIVING
|
|
61275
|
+
p_descr_ref = lr_typedescr
|
|
61276
|
+
EXCEPTIONS
|
|
61277
|
+
type_not_found = 1
|
|
61246
61278
|
OTHERS = 2 ).`,
|
|
61247
61279
|
};
|
|
61248
61280
|
}
|
|
@@ -61353,14 +61385,14 @@ class GlobalClass extends _abap_rule_1.ABAPRule {
|
|
|
61353
61385
|
key: "global_class",
|
|
61354
61386
|
title: "Global class checks",
|
|
61355
61387
|
shortDescription: `Checks related to global classes`,
|
|
61356
|
-
extendedInformation: `* global classes must be in own files
|
|
61357
|
-
|
|
61358
|
-
* file names must match class name
|
|
61359
|
-
|
|
61360
|
-
* file names must match interface name
|
|
61361
|
-
|
|
61362
|
-
* global classes must be global definitions
|
|
61363
|
-
|
|
61388
|
+
extendedInformation: `* global classes must be in own files
|
|
61389
|
+
|
|
61390
|
+
* file names must match class name
|
|
61391
|
+
|
|
61392
|
+
* file names must match interface name
|
|
61393
|
+
|
|
61394
|
+
* global classes must be global definitions
|
|
61395
|
+
|
|
61364
61396
|
* global interfaces must be global definitions`,
|
|
61365
61397
|
tags: [_irule_1.RuleTag.Syntax],
|
|
61366
61398
|
};
|
|
@@ -61459,21 +61491,21 @@ class IdenticalConditions extends _abap_rule_1.ABAPRule {
|
|
|
61459
61491
|
return {
|
|
61460
61492
|
key: "identical_conditions",
|
|
61461
61493
|
title: "Identical conditions",
|
|
61462
|
-
shortDescription: `Find identical conditions in IF + CASE + WHILE etc
|
|
61463
|
-
|
|
61494
|
+
shortDescription: `Find identical conditions in IF + CASE + WHILE etc
|
|
61495
|
+
|
|
61464
61496
|
Prerequsites: code is pretty printed with identical cAsE`,
|
|
61465
61497
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
61466
|
-
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
61467
|
-
ENDIF.
|
|
61468
|
-
CASE bar.
|
|
61469
|
-
WHEN '1'.
|
|
61470
|
-
WHEN 'A' OR '1'.
|
|
61498
|
+
badExample: `IF foo = bar OR 1 = a OR foo = bar.
|
|
61499
|
+
ENDIF.
|
|
61500
|
+
CASE bar.
|
|
61501
|
+
WHEN '1'.
|
|
61502
|
+
WHEN 'A' OR '1'.
|
|
61471
61503
|
ENDCASE.`,
|
|
61472
|
-
goodExample: `IF foo = bar OR 1 = a.
|
|
61473
|
-
ENDIF.
|
|
61474
|
-
CASE bar.
|
|
61475
|
-
WHEN '1'.
|
|
61476
|
-
WHEN 'A'.
|
|
61504
|
+
goodExample: `IF foo = bar OR 1 = a.
|
|
61505
|
+
ENDIF.
|
|
61506
|
+
CASE bar.
|
|
61507
|
+
WHEN '1'.
|
|
61508
|
+
WHEN 'A'.
|
|
61477
61509
|
ENDCASE.`,
|
|
61478
61510
|
};
|
|
61479
61511
|
}
|
|
@@ -61607,23 +61639,23 @@ class IdenticalContents extends _abap_rule_1.ABAPRule {
|
|
|
61607
61639
|
key: "identical_contents",
|
|
61608
61640
|
title: "Identical contents",
|
|
61609
61641
|
shortDescription: `Find identical contents in blocks inside IFs, both in the beginning and in the end.`,
|
|
61610
|
-
extendedInformation: `
|
|
61611
|
-
Prerequsites: code is pretty printed with identical cAsE
|
|
61612
|
-
|
|
61642
|
+
extendedInformation: `
|
|
61643
|
+
Prerequsites: code is pretty printed with identical cAsE
|
|
61644
|
+
|
|
61613
61645
|
Chained statments are ignored`,
|
|
61614
61646
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
61615
|
-
badExample: `IF foo = bar.
|
|
61616
|
-
WRITE 'bar'.
|
|
61617
|
-
WRITE 'world'.
|
|
61618
|
-
ELSE.
|
|
61619
|
-
WRITE 'foo'.
|
|
61620
|
-
WRITE 'world'.
|
|
61647
|
+
badExample: `IF foo = bar.
|
|
61648
|
+
WRITE 'bar'.
|
|
61649
|
+
WRITE 'world'.
|
|
61650
|
+
ELSE.
|
|
61651
|
+
WRITE 'foo'.
|
|
61652
|
+
WRITE 'world'.
|
|
61621
61653
|
ENDIF.`,
|
|
61622
|
-
goodExample: `IF foo = bar.
|
|
61623
|
-
WRITE 'bar'.
|
|
61624
|
-
ELSE.
|
|
61625
|
-
WRITE 'foo'.
|
|
61626
|
-
ENDIF.
|
|
61654
|
+
goodExample: `IF foo = bar.
|
|
61655
|
+
WRITE 'bar'.
|
|
61656
|
+
ELSE.
|
|
61657
|
+
WRITE 'foo'.
|
|
61658
|
+
ENDIF.
|
|
61627
61659
|
WRITE 'world'.`,
|
|
61628
61660
|
};
|
|
61629
61661
|
}
|
|
@@ -61731,12 +61763,12 @@ class IdenticalDescriptions {
|
|
|
61731
61763
|
key: "identical_descriptions",
|
|
61732
61764
|
title: "Identical descriptions",
|
|
61733
61765
|
shortDescription: `Searches for objects with the same type and same description`,
|
|
61734
|
-
extendedInformation: `Case insensitive
|
|
61735
|
-
|
|
61736
|
-
Only checks the master language descriptions
|
|
61737
|
-
|
|
61738
|
-
Dependencies are skipped
|
|
61739
|
-
|
|
61766
|
+
extendedInformation: `Case insensitive
|
|
61767
|
+
|
|
61768
|
+
Only checks the master language descriptions
|
|
61769
|
+
|
|
61770
|
+
Dependencies are skipped
|
|
61771
|
+
|
|
61740
61772
|
Works for: INTF, CLAS, DOMA, DTEL, FUNC in same FUGR`,
|
|
61741
61773
|
tags: [],
|
|
61742
61774
|
};
|
|
@@ -61910,43 +61942,43 @@ class IfInIf extends _abap_rule_1.ABAPRule {
|
|
|
61910
61942
|
key: "if_in_if",
|
|
61911
61943
|
title: "IF in IF",
|
|
61912
61944
|
shortDescription: `Detects nested ifs which can be refactored.`,
|
|
61913
|
-
extendedInformation: `
|
|
61914
|
-
Directly nested IFs without ELSE can be refactored to a single condition using AND.
|
|
61915
|
-
|
|
61916
|
-
ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
|
|
61917
|
-
|
|
61918
|
-
https://docs.abapopenchecks.org/checks/01/
|
|
61945
|
+
extendedInformation: `
|
|
61946
|
+
Directly nested IFs without ELSE can be refactored to a single condition using AND.
|
|
61947
|
+
|
|
61948
|
+
ELSE condtions with directly nested IF refactored to ELSEIF, quickfixes are suggested for this case.
|
|
61949
|
+
|
|
61950
|
+
https://docs.abapopenchecks.org/checks/01/
|
|
61919
61951
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low`,
|
|
61920
|
-
badExample: `IF condition1.
|
|
61921
|
-
IF condition2.
|
|
61922
|
-
...
|
|
61923
|
-
ENDIF.
|
|
61924
|
-
ENDIF.
|
|
61925
|
-
|
|
61926
|
-
IF condition1.
|
|
61927
|
-
...
|
|
61928
|
-
ELSE.
|
|
61929
|
-
IF condition2.
|
|
61930
|
-
...
|
|
61931
|
-
ENDIF.
|
|
61952
|
+
badExample: `IF condition1.
|
|
61953
|
+
IF condition2.
|
|
61954
|
+
...
|
|
61955
|
+
ENDIF.
|
|
61956
|
+
ENDIF.
|
|
61957
|
+
|
|
61958
|
+
IF condition1.
|
|
61959
|
+
...
|
|
61960
|
+
ELSE.
|
|
61961
|
+
IF condition2.
|
|
61962
|
+
...
|
|
61963
|
+
ENDIF.
|
|
61932
61964
|
ENDIF.`,
|
|
61933
|
-
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
61934
|
-
...
|
|
61935
|
-
ENDIF.
|
|
61936
|
-
|
|
61937
|
-
IF condition1.
|
|
61938
|
-
...
|
|
61939
|
-
ELSEIF condition2.
|
|
61940
|
-
...
|
|
61941
|
-
ENDIF.
|
|
61942
|
-
|
|
61943
|
-
CASE variable.
|
|
61944
|
-
WHEN value1.
|
|
61945
|
-
...
|
|
61946
|
-
WHEN value2.
|
|
61947
|
-
IF condition2.
|
|
61948
|
-
...
|
|
61949
|
-
ENDIF.
|
|
61965
|
+
goodExample: `IF ( condition1 ) AND ( condition2 ).
|
|
61966
|
+
...
|
|
61967
|
+
ENDIF.
|
|
61968
|
+
|
|
61969
|
+
IF condition1.
|
|
61970
|
+
...
|
|
61971
|
+
ELSEIF condition2.
|
|
61972
|
+
...
|
|
61973
|
+
ENDIF.
|
|
61974
|
+
|
|
61975
|
+
CASE variable.
|
|
61976
|
+
WHEN value1.
|
|
61977
|
+
...
|
|
61978
|
+
WHEN value2.
|
|
61979
|
+
IF condition2.
|
|
61980
|
+
...
|
|
61981
|
+
ENDIF.
|
|
61950
61982
|
ENDCASE.`,
|
|
61951
61983
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
61952
61984
|
};
|
|
@@ -62131,9 +62163,9 @@ class ImplementMethods extends _abap_rule_1.ABAPRule {
|
|
|
62131
62163
|
for (const i of ((_a = file.getStructure()) === null || _a === void 0 ? void 0 : _a.findAllStatements(Statements.ClassImplementation)) || []) {
|
|
62132
62164
|
const name = (_b = i.findFirstExpression(Expressions.ClassName)) === null || _b === void 0 ? void 0 : _b.getFirstToken().getStr().toUpperCase();
|
|
62133
62165
|
if (name === impl.identifier.getName().toUpperCase()) {
|
|
62134
|
-
return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
|
|
62135
|
-
METHOD ${methodName.toLowerCase()}.
|
|
62136
|
-
RETURN. " todo, implement method
|
|
62166
|
+
return edit_helper_1.EditHelper.insertAt(file, i.getLastToken().getEnd(), `
|
|
62167
|
+
METHOD ${methodName.toLowerCase()}.
|
|
62168
|
+
RETURN. " todo, implement method
|
|
62137
62169
|
ENDMETHOD.`);
|
|
62138
62170
|
}
|
|
62139
62171
|
}
|
|
@@ -62312,14 +62344,14 @@ class ImplicitStartOfSelection extends _abap_rule_1.ABAPRule {
|
|
|
62312
62344
|
key: "implicit_start_of_selection",
|
|
62313
62345
|
title: "Implicit START-OF-SELECTION",
|
|
62314
62346
|
shortDescription: `Add explicit selection screen event handling`,
|
|
62315
|
-
extendedInformation: `Only runs for executable programs
|
|
62316
|
-
|
|
62347
|
+
extendedInformation: `Only runs for executable programs
|
|
62348
|
+
|
|
62317
62349
|
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapstart-of-selection.htm`,
|
|
62318
62350
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
62319
|
-
badExample: `REPORT zfoo.
|
|
62351
|
+
badExample: `REPORT zfoo.
|
|
62320
62352
|
WRITE 'hello'.`,
|
|
62321
|
-
goodExample: `
|
|
62322
|
-
START-OF-SELECTION.
|
|
62353
|
+
goodExample: `
|
|
62354
|
+
START-OF-SELECTION.
|
|
62323
62355
|
WRITE 'hello'.`,
|
|
62324
62356
|
};
|
|
62325
62357
|
}
|
|
@@ -62424,19 +62456,19 @@ class InStatementIndentation extends _abap_rule_1.ABAPRule {
|
|
|
62424
62456
|
key: "in_statement_indentation",
|
|
62425
62457
|
title: "In-statement indentation",
|
|
62426
62458
|
shortDescription: "Checks alignment within statements which span multiple lines.",
|
|
62427
|
-
extendedInformation: `Lines following the first line should be indented once (2 spaces).
|
|
62428
|
-
|
|
62429
|
-
For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
|
|
62459
|
+
extendedInformation: `Lines following the first line should be indented once (2 spaces).
|
|
62460
|
+
|
|
62461
|
+
For block declaration statements, lines after the first should be indented an additional time (default: +2 spaces)
|
|
62430
62462
|
to distinguish them better from code within the block.`,
|
|
62431
|
-
badExample: `IF 1 = 1
|
|
62432
|
-
AND 2 = 2.
|
|
62433
|
-
WRITE 'hello' &&
|
|
62434
|
-
'world'.
|
|
62463
|
+
badExample: `IF 1 = 1
|
|
62464
|
+
AND 2 = 2.
|
|
62465
|
+
WRITE 'hello' &&
|
|
62466
|
+
'world'.
|
|
62435
62467
|
ENDIF.`,
|
|
62436
|
-
goodExample: `IF 1 = 1
|
|
62437
|
-
AND 2 = 2.
|
|
62438
|
-
WRITE 'hello' &&
|
|
62439
|
-
'world'.
|
|
62468
|
+
goodExample: `IF 1 = 1
|
|
62469
|
+
AND 2 = 2.
|
|
62470
|
+
WRITE 'hello' &&
|
|
62471
|
+
'world'.
|
|
62440
62472
|
ENDIF.`,
|
|
62441
62473
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
62442
62474
|
};
|
|
@@ -62559,23 +62591,23 @@ class Indentation extends _abap_rule_1.ABAPRule {
|
|
|
62559
62591
|
title: "Indentation",
|
|
62560
62592
|
shortDescription: `Checks indentation`,
|
|
62561
62593
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
62562
|
-
badExample: `CLASS lcl DEFINITION.
|
|
62563
|
-
PRIVATE SECTION.
|
|
62564
|
-
METHODS constructor.
|
|
62565
|
-
ENDCLASS.
|
|
62566
|
-
|
|
62567
|
-
CLASS lcl IMPLEMENTATION.
|
|
62568
|
-
METHOD constructor.
|
|
62569
|
-
ENDMETHOD.
|
|
62594
|
+
badExample: `CLASS lcl DEFINITION.
|
|
62595
|
+
PRIVATE SECTION.
|
|
62596
|
+
METHODS constructor.
|
|
62597
|
+
ENDCLASS.
|
|
62598
|
+
|
|
62599
|
+
CLASS lcl IMPLEMENTATION.
|
|
62600
|
+
METHOD constructor.
|
|
62601
|
+
ENDMETHOD.
|
|
62570
62602
|
ENDCLASS.`,
|
|
62571
|
-
goodExample: `CLASS lcl DEFINITION.
|
|
62572
|
-
PRIVATE SECTION.
|
|
62573
|
-
METHODS constructor.
|
|
62574
|
-
ENDCLASS.
|
|
62575
|
-
|
|
62576
|
-
CLASS lcl IMPLEMENTATION.
|
|
62577
|
-
METHOD constructor.
|
|
62578
|
-
ENDMETHOD.
|
|
62603
|
+
goodExample: `CLASS lcl DEFINITION.
|
|
62604
|
+
PRIVATE SECTION.
|
|
62605
|
+
METHODS constructor.
|
|
62606
|
+
ENDCLASS.
|
|
62607
|
+
|
|
62608
|
+
CLASS lcl IMPLEMENTATION.
|
|
62609
|
+
METHOD constructor.
|
|
62610
|
+
ENDMETHOD.
|
|
62579
62611
|
ENDCLASS.`,
|
|
62580
62612
|
};
|
|
62581
62613
|
}
|
|
@@ -62609,6 +62641,7 @@ ENDCLASS.`,
|
|
|
62609
62641
|
};
|
|
62610
62642
|
const expected = new indent_1.Indent(indentOpts).getExpectedIndents(file);
|
|
62611
62643
|
const ret = [];
|
|
62644
|
+
let previous = undefined;
|
|
62612
62645
|
for (const statement of file.getStatements()) {
|
|
62613
62646
|
const position = statement.getFirstToken().getStart();
|
|
62614
62647
|
if (position instanceof virtual_position_1.VirtualPosition) {
|
|
@@ -62643,6 +62676,12 @@ ENDCLASS.`,
|
|
|
62643
62676
|
continue;
|
|
62644
62677
|
}
|
|
62645
62678
|
}
|
|
62679
|
+
// only apply for the first statement in a chain
|
|
62680
|
+
if (statement.getColon() !== undefined
|
|
62681
|
+
&& (previous === null || previous === void 0 ? void 0 : previous.getColon()) !== undefined
|
|
62682
|
+
&& statement.getColon().getStart().equals(previous.getColon().getStart())) {
|
|
62683
|
+
continue;
|
|
62684
|
+
}
|
|
62646
62685
|
if (indent && indent > 0 && indent !== position.getCol()) {
|
|
62647
62686
|
const expected = indent - 1;
|
|
62648
62687
|
const fix = edit_helper_1.EditHelper.replaceRange(file, new position_1.Position(position.getRow(), 1), position, " ".repeat(expected));
|
|
@@ -62653,6 +62692,7 @@ ENDCLASS.`,
|
|
|
62653
62692
|
break;
|
|
62654
62693
|
}
|
|
62655
62694
|
}
|
|
62695
|
+
previous = statement;
|
|
62656
62696
|
}
|
|
62657
62697
|
return ret;
|
|
62658
62698
|
}
|
|
@@ -62968,9 +63008,9 @@ class IntfReferencingClas {
|
|
|
62968
63008
|
key: "intf_referencing_clas",
|
|
62969
63009
|
title: "INTF referencing CLAS",
|
|
62970
63010
|
shortDescription: `Interface contains references to class`,
|
|
62971
|
-
extendedInformation: `Only global interfaces are checked.
|
|
62972
|
-
Only first level references are checked.
|
|
62973
|
-
Exception class references are ignored.
|
|
63011
|
+
extendedInformation: `Only global interfaces are checked.
|
|
63012
|
+
Only first level references are checked.
|
|
63013
|
+
Exception class references are ignored.
|
|
62974
63014
|
Void references are ignored.`,
|
|
62975
63015
|
};
|
|
62976
63016
|
}
|
|
@@ -63055,9 +63095,9 @@ class InvalidTableIndex extends _abap_rule_1.ABAPRule {
|
|
|
63055
63095
|
title: "Invalid Table Index",
|
|
63056
63096
|
shortDescription: `Issues error for constant table index zero, as ABAP starts from 1`,
|
|
63057
63097
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
63058
|
-
badExample: `DATA(first) = table[ 0 ].
|
|
63098
|
+
badExample: `DATA(first) = table[ 0 ].
|
|
63059
63099
|
READ TABLE gt_stack ASSIGNING <ls_stack> INDEX 0.`,
|
|
63060
|
-
goodExample: `DATA(first) = table[ 1 ].
|
|
63100
|
+
goodExample: `DATA(first) = table[ 1 ].
|
|
63061
63101
|
READ TABLE gt_stack ASSIGNING <ls_stack> INDEX 1.`,
|
|
63062
63102
|
};
|
|
63063
63103
|
}
|
|
@@ -63658,8 +63698,8 @@ class LineBreakStyle {
|
|
|
63658
63698
|
return {
|
|
63659
63699
|
key: "line_break_style",
|
|
63660
63700
|
title: "Makes sure line breaks are consistent in the ABAP code",
|
|
63661
|
-
shortDescription: `Enforces LF as newlines in ABAP files
|
|
63662
|
-
|
|
63701
|
+
shortDescription: `Enforces LF as newlines in ABAP files
|
|
63702
|
+
|
|
63663
63703
|
abapGit does not work with CRLF`,
|
|
63664
63704
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile],
|
|
63665
63705
|
};
|
|
@@ -63728,7 +63768,7 @@ class LineLength extends _abap_rule_1.ABAPRule {
|
|
|
63728
63768
|
key: "line_length",
|
|
63729
63769
|
title: "Line length",
|
|
63730
63770
|
shortDescription: `Detects lines exceeding the provided maximum length.`,
|
|
63731
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
|
|
63771
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#stick-to-a-reasonable-line-length
|
|
63732
63772
|
https://docs.abapopenchecks.org/checks/04/`,
|
|
63733
63773
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
63734
63774
|
};
|
|
@@ -63799,7 +63839,7 @@ class LineOnlyPunc extends _abap_rule_1.ABAPRule {
|
|
|
63799
63839
|
key: "line_only_punc",
|
|
63800
63840
|
title: "Line containing only punctuation",
|
|
63801
63841
|
shortDescription: `Detects lines containing only punctuation.`,
|
|
63802
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
|
|
63842
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#close-brackets-at-line-end
|
|
63803
63843
|
https://docs.abapopenchecks.org/checks/16/`,
|
|
63804
63844
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
63805
63845
|
badExample: "zcl_class=>method(\n).",
|
|
@@ -63835,7 +63875,7 @@ https://docs.abapopenchecks.org/checks/16/`,
|
|
|
63835
63875
|
const position = new position_1.Position(i + 1, column);
|
|
63836
63876
|
// merge punc into previous row
|
|
63837
63877
|
let rowContent = rows[i].trim();
|
|
63838
|
-
// if reported row contains
|
|
63878
|
+
// if reported row contains parentheses, prefix with space if needed
|
|
63839
63879
|
if (rowContent.length > 1 && !rows[i - 1].endsWith(" ") && !rows[i - 1].endsWith(" \r")) {
|
|
63840
63880
|
rowContent = " " + rowContent;
|
|
63841
63881
|
}
|
|
@@ -63845,7 +63885,10 @@ https://docs.abapopenchecks.org/checks/16/`,
|
|
|
63845
63885
|
}
|
|
63846
63886
|
const startPos = new position_1.Position(i, rows[i - 1].length + 1 + offset);
|
|
63847
63887
|
const endPos = new position_1.Position(i + 1, rows[i].length + 1);
|
|
63848
|
-
|
|
63888
|
+
let fix = edit_helper_1.EditHelper.replaceRange(file, startPos, endPos, rowContent);
|
|
63889
|
+
if (rows[i - 1] === undefined || rows[i - 1].indexOf("*") === 0 || rows[i - 1].includes(`"`)) {
|
|
63890
|
+
fix = undefined;
|
|
63891
|
+
}
|
|
63849
63892
|
const issue = issue_1.Issue.atPosition(file, position, this.getMessage(), this.getMetadata().key, this.conf.severity, fix);
|
|
63850
63893
|
issues.push(issue);
|
|
63851
63894
|
}
|
|
@@ -64059,15 +64102,15 @@ class LocalVariableNames extends _abap_rule_1.ABAPRule {
|
|
|
64059
64102
|
return {
|
|
64060
64103
|
key: "local_variable_names",
|
|
64061
64104
|
title: "Local variable naming conventions",
|
|
64062
|
-
shortDescription: `
|
|
64063
|
-
Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
|
|
64105
|
+
shortDescription: `
|
|
64106
|
+
Allows you to enforce a pattern, such as a prefix, for local variables, constants and field symbols.
|
|
64064
64107
|
Regexes are case-insensitive.`,
|
|
64065
64108
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile],
|
|
64066
|
-
badExample: `FORM bar.
|
|
64067
|
-
DATA foo.
|
|
64109
|
+
badExample: `FORM bar.
|
|
64110
|
+
DATA foo.
|
|
64068
64111
|
ENDFORM.`,
|
|
64069
|
-
goodExample: `FORM bar.
|
|
64070
|
-
DATA lv_foo.
|
|
64112
|
+
goodExample: `FORM bar.
|
|
64113
|
+
DATA lv_foo.
|
|
64071
64114
|
ENDFORM.`,
|
|
64072
64115
|
};
|
|
64073
64116
|
}
|
|
@@ -64219,9 +64262,9 @@ class MacroNaming extends _abap_rule_1.ABAPRule {
|
|
|
64219
64262
|
shortDescription: `Allows you to enforce a pattern for macro definitions`,
|
|
64220
64263
|
extendedInformation: `Use rule "avoid_use" to avoid macros altogether.`,
|
|
64221
64264
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile],
|
|
64222
|
-
badExample: `DEFINE something.
|
|
64265
|
+
badExample: `DEFINE something.
|
|
64223
64266
|
END-OF-DEFINITION.`,
|
|
64224
|
-
goodExample: `DEFINE _something.
|
|
64267
|
+
goodExample: `DEFINE _something.
|
|
64225
64268
|
END-OF-DEFINITION.`,
|
|
64226
64269
|
};
|
|
64227
64270
|
}
|
|
@@ -64294,10 +64337,10 @@ class MainFileContents {
|
|
|
64294
64337
|
key: "main_file_contents",
|
|
64295
64338
|
title: "Main file contents",
|
|
64296
64339
|
shortDescription: `Checks related to report declarations.`,
|
|
64297
|
-
extendedInformation: `Does not run if the target version is Cloud
|
|
64298
|
-
|
|
64299
|
-
* PROGs must begin with "REPORT <name>." or "PROGRAM <name>.
|
|
64300
|
-
* TYPEs must begin with "TYPE-POOL <name>."
|
|
64340
|
+
extendedInformation: `Does not run if the target version is Cloud
|
|
64341
|
+
|
|
64342
|
+
* PROGs must begin with "REPORT <name>." or "PROGRAM <name>.
|
|
64343
|
+
* TYPEs must begin with "TYPE-POOL <name>."
|
|
64301
64344
|
`,
|
|
64302
64345
|
};
|
|
64303
64346
|
}
|
|
@@ -64413,17 +64456,17 @@ class ManyParentheses extends _abap_rule_1.ABAPRule {
|
|
|
64413
64456
|
title: "Too many parentheses",
|
|
64414
64457
|
shortDescription: `Searches for expressions where extra parentheses can safely be removed`,
|
|
64415
64458
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
64416
|
-
badExample: `
|
|
64417
|
-
IF ( destination IS INITIAL ).
|
|
64418
|
-
ENDIF.
|
|
64419
|
-
IF foo = boo AND ( bar = lar AND moo = loo ).
|
|
64420
|
-
ENDIF.
|
|
64459
|
+
badExample: `
|
|
64460
|
+
IF ( destination IS INITIAL ).
|
|
64461
|
+
ENDIF.
|
|
64462
|
+
IF foo = boo AND ( bar = lar AND moo = loo ).
|
|
64463
|
+
ENDIF.
|
|
64421
64464
|
`,
|
|
64422
|
-
goodExample: `
|
|
64423
|
-
IF destination IS INITIAL.
|
|
64424
|
-
ENDIF.
|
|
64425
|
-
IF foo = boo AND bar = lar AND moo = loo.
|
|
64426
|
-
ENDIF.
|
|
64465
|
+
goodExample: `
|
|
64466
|
+
IF destination IS INITIAL.
|
|
64467
|
+
ENDIF.
|
|
64468
|
+
IF foo = boo AND bar = lar AND moo = loo.
|
|
64469
|
+
ENDIF.
|
|
64427
64470
|
`,
|
|
64428
64471
|
};
|
|
64429
64472
|
}
|
|
@@ -64597,14 +64640,14 @@ class MaxOneMethodParameterPerLine extends _abap_rule_1.ABAPRule {
|
|
|
64597
64640
|
title: "Max one method parameter definition per line",
|
|
64598
64641
|
shortDescription: `Keep max one method parameter description per line`,
|
|
64599
64642
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Whitespace],
|
|
64600
|
-
badExample: `
|
|
64601
|
-
METHODS apps_scope_token
|
|
64602
|
-
IMPORTING
|
|
64643
|
+
badExample: `
|
|
64644
|
+
METHODS apps_scope_token
|
|
64645
|
+
IMPORTING
|
|
64603
64646
|
body TYPE bodyapps_scope_token client_id TYPE str.`,
|
|
64604
|
-
goodExample: `
|
|
64605
|
-
METHODS apps_scope_token
|
|
64606
|
-
IMPORTING
|
|
64607
|
-
body TYPE bodyapps_scope_token
|
|
64647
|
+
goodExample: `
|
|
64648
|
+
METHODS apps_scope_token
|
|
64649
|
+
IMPORTING
|
|
64650
|
+
body TYPE bodyapps_scope_token
|
|
64608
64651
|
client_id TYPE str.`,
|
|
64609
64652
|
};
|
|
64610
64653
|
}
|
|
@@ -64669,11 +64712,11 @@ class MaxOneStatement extends _abap_rule_1.ABAPRule {
|
|
|
64669
64712
|
key: "max_one_statement",
|
|
64670
64713
|
title: "Max one statement per line",
|
|
64671
64714
|
shortDescription: `Checks that each line contains only a single statement.`,
|
|
64672
|
-
extendedInformation: `Does not report empty statements, use rule empty_statement for detecting empty statements.
|
|
64673
|
-
|
|
64674
|
-
Does not report anything for chained statements.
|
|
64675
|
-
|
|
64676
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-more-than-one-statement-per-line
|
|
64715
|
+
extendedInformation: `Does not report empty statements, use rule empty_statement for detecting empty statements.
|
|
64716
|
+
|
|
64717
|
+
Does not report anything for chained statements.
|
|
64718
|
+
|
|
64719
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#no-more-than-one-statement-per-line
|
|
64677
64720
|
https://docs.abapopenchecks.org/checks/11/`,
|
|
64678
64721
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
64679
64722
|
badExample: `WRITE foo. WRITE bar.`,
|
|
@@ -65011,8 +65054,8 @@ class MethodLength {
|
|
|
65011
65054
|
key: "method_length",
|
|
65012
65055
|
title: "Method/Form Length",
|
|
65013
65056
|
shortDescription: `Checks relating to method/form length.`,
|
|
65014
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-methods-small
|
|
65015
|
-
|
|
65057
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-methods-small
|
|
65058
|
+
|
|
65016
65059
|
Abstract methods without statements are considered okay.`,
|
|
65017
65060
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
65018
65061
|
};
|
|
@@ -65117,20 +65160,20 @@ class MethodOverwritesBuiltIn extends _abap_rule_1.ABAPRule {
|
|
|
65117
65160
|
key: "method_overwrites_builtin",
|
|
65118
65161
|
title: "Method name overwrites builtin function",
|
|
65119
65162
|
shortDescription: `Checks Method names that overwrite builtin SAP functions`,
|
|
65120
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
|
|
65121
|
-
|
|
65122
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
|
|
65123
|
-
|
|
65163
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abenbuilt_in_functions_overview.htm
|
|
65164
|
+
|
|
65165
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obscuring-built-in-functions
|
|
65166
|
+
|
|
65124
65167
|
Interface method names are ignored`,
|
|
65125
65168
|
tags: [_irule_1.RuleTag.Naming, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
65126
|
-
badExample: `CLASS lcl DEFINITION.
|
|
65127
|
-
PUBLIC SECTION.
|
|
65128
|
-
METHODS matches.
|
|
65129
|
-
ENDCLASS.
|
|
65130
|
-
|
|
65131
|
-
CLASS lcl IMPLEMENTATION.
|
|
65132
|
-
METHOD matches.
|
|
65133
|
-
ENDMETHOD.
|
|
65169
|
+
badExample: `CLASS lcl DEFINITION.
|
|
65170
|
+
PUBLIC SECTION.
|
|
65171
|
+
METHODS matches.
|
|
65172
|
+
ENDCLASS.
|
|
65173
|
+
|
|
65174
|
+
CLASS lcl IMPLEMENTATION.
|
|
65175
|
+
METHOD matches.
|
|
65176
|
+
ENDMETHOD.
|
|
65134
65177
|
ENDCLASS.`,
|
|
65135
65178
|
};
|
|
65136
65179
|
}
|
|
@@ -65321,12 +65364,12 @@ class MixReturning extends _abap_rule_1.ABAPRule {
|
|
|
65321
65364
|
// eslint-disable-next-line max-len
|
|
65322
65365
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-either-returning-or-exporting-or-changing-but-not-a-combination`,
|
|
65323
65366
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
65324
|
-
badExample: `CLASS lcl DEFINITION.
|
|
65325
|
-
PUBLIC SECTION.
|
|
65326
|
-
METHODS
|
|
65327
|
-
foobar
|
|
65328
|
-
EXPORTING foo TYPE i
|
|
65329
|
-
RETURNING VALUE(rv_string) TYPE string.
|
|
65367
|
+
badExample: `CLASS lcl DEFINITION.
|
|
65368
|
+
PUBLIC SECTION.
|
|
65369
|
+
METHODS
|
|
65370
|
+
foobar
|
|
65371
|
+
EXPORTING foo TYPE i
|
|
65372
|
+
RETURNING VALUE(rv_string) TYPE string.
|
|
65330
65373
|
ENDCLASS.`,
|
|
65331
65374
|
};
|
|
65332
65375
|
}
|
|
@@ -65706,7 +65749,7 @@ class Nesting extends _abap_rule_1.ABAPRule {
|
|
|
65706
65749
|
key: "nesting",
|
|
65707
65750
|
title: "Check nesting depth",
|
|
65708
65751
|
shortDescription: `Checks for methods exceeding a maximum nesting depth`,
|
|
65709
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low
|
|
65752
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#keep-the-nesting-depth-low
|
|
65710
65753
|
https://docs.abapopenchecks.org/checks/74/`,
|
|
65711
65754
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
65712
65755
|
};
|
|
@@ -65949,7 +65992,7 @@ class NoChainedAssignment extends _abap_rule_1.ABAPRule {
|
|
|
65949
65992
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-chain-assignments`,
|
|
65950
65993
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
65951
65994
|
badExample: `var1 = var2 = var3.`,
|
|
65952
|
-
goodExample: `var2 = var3.
|
|
65995
|
+
goodExample: `var2 = var3.
|
|
65953
65996
|
var1 = var2.`,
|
|
65954
65997
|
};
|
|
65955
65998
|
}
|
|
@@ -66008,8 +66051,8 @@ class NoExternalFormCalls extends _abap_rule_1.ABAPRule {
|
|
|
66008
66051
|
key: "no_external_form_calls",
|
|
66009
66052
|
title: "No external FORM calls",
|
|
66010
66053
|
shortDescription: `Detect external form calls`,
|
|
66011
|
-
badExample: `PERFORM foo IN PROGRAM bar.
|
|
66012
|
-
|
|
66054
|
+
badExample: `PERFORM foo IN PROGRAM bar.
|
|
66055
|
+
|
|
66013
66056
|
PERFORM foo(bar).`,
|
|
66014
66057
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
66015
66058
|
};
|
|
@@ -66070,17 +66113,17 @@ class NoInlineInOptionalBranches extends _abap_rule_1.ABAPRule {
|
|
|
66070
66113
|
key: "no_inline_in_optional_branches",
|
|
66071
66114
|
title: "Don't declare inline in optional branches",
|
|
66072
66115
|
shortDescription: `Don't declare inline in optional branches`,
|
|
66073
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-declare-inline-in-optional-branches
|
|
66074
|
-
|
|
66075
|
-
Considered optional branches:
|
|
66076
|
-
* inside IF/ELSEIF/ELSE
|
|
66077
|
-
* inside LOOP
|
|
66078
|
-
* inside WHILE
|
|
66079
|
-
* inside CASE/WHEN, CASE TYPE OF
|
|
66080
|
-
* inside DO
|
|
66081
|
-
* inside SELECT loops
|
|
66082
|
-
|
|
66083
|
-
Not considered optional branches:
|
|
66116
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#dont-declare-inline-in-optional-branches
|
|
66117
|
+
|
|
66118
|
+
Considered optional branches:
|
|
66119
|
+
* inside IF/ELSEIF/ELSE
|
|
66120
|
+
* inside LOOP
|
|
66121
|
+
* inside WHILE
|
|
66122
|
+
* inside CASE/WHEN, CASE TYPE OF
|
|
66123
|
+
* inside DO
|
|
66124
|
+
* inside SELECT loops
|
|
66125
|
+
|
|
66126
|
+
Not considered optional branches:
|
|
66084
66127
|
* TRY/CATCH/CLEANUP`,
|
|
66085
66128
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
66086
66129
|
};
|
|
@@ -66180,12 +66223,12 @@ class NoPrefixes extends _abap_rule_1.ABAPRule {
|
|
|
66180
66223
|
key: "no_prefixes",
|
|
66181
66224
|
title: "No Prefixes",
|
|
66182
66225
|
shortDescription: `Dont use hungarian notation`,
|
|
66183
|
-
extendedInformation: `
|
|
66184
|
-
Note: not prefixing TYPES will require changing the errorNamespace in the abaplint configuration,
|
|
66185
|
-
allowing all types to become voided, abaplint will then provide less precise syntax errors.
|
|
66186
|
-
|
|
66187
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-encodings-esp-hungarian-notation-and-prefixes
|
|
66188
|
-
|
|
66226
|
+
extendedInformation: `
|
|
66227
|
+
Note: not prefixing TYPES will require changing the errorNamespace in the abaplint configuration,
|
|
66228
|
+
allowing all types to become voided, abaplint will then provide less precise syntax errors.
|
|
66229
|
+
|
|
66230
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-encodings-esp-hungarian-notation-and-prefixes
|
|
66231
|
+
|
|
66189
66232
|
https://github.com/SAP/styleguides/blob/main/clean-abap/sub-sections/AvoidEncodings.md`,
|
|
66190
66233
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
66191
66234
|
badExample: `DATA lv_foo TYPE i.`,
|
|
@@ -66364,7 +66407,7 @@ class NoPublicAttributes extends _abap_rule_1.ABAPRule {
|
|
|
66364
66407
|
return {
|
|
66365
66408
|
key: "no_public_attributes",
|
|
66366
66409
|
title: "No public attributes",
|
|
66367
|
-
shortDescription: `Checks that classes and interfaces don't contain any public attributes.
|
|
66410
|
+
shortDescription: `Checks that classes and interfaces don't contain any public attributes.
|
|
66368
66411
|
Exceptions are excluded from this rule.`,
|
|
66369
66412
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#members-private-by-default-protected-only-if-needed`,
|
|
66370
66413
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
@@ -66465,13 +66508,13 @@ class NoYodaConditions extends _abap_rule_1.ABAPRule {
|
|
|
66465
66508
|
key: "no_yoda_conditions",
|
|
66466
66509
|
title: "No Yoda conditions",
|
|
66467
66510
|
shortDescription: `Finds Yoda conditions and reports issues`,
|
|
66468
|
-
extendedInformation: `https://en.wikipedia.org/wiki/Yoda_conditions
|
|
66469
|
-
|
|
66511
|
+
extendedInformation: `https://en.wikipedia.org/wiki/Yoda_conditions
|
|
66512
|
+
|
|
66470
66513
|
Conditions with operators CP, NP, CS, NS, CA, NA, CO, CN are ignored`,
|
|
66471
66514
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
66472
|
-
badExample: `IF 0 <> sy-subrc.
|
|
66515
|
+
badExample: `IF 0 <> sy-subrc.
|
|
66473
66516
|
ENDIF.`,
|
|
66474
|
-
goodExample: `IF sy-subrc <> 0.
|
|
66517
|
+
goodExample: `IF sy-subrc <> 0.
|
|
66475
66518
|
ENDIF.`,
|
|
66476
66519
|
};
|
|
66477
66520
|
}
|
|
@@ -66572,8 +66615,8 @@ class NROBConsistency {
|
|
|
66572
66615
|
key: "nrob_consistency",
|
|
66573
66616
|
title: "Number range consistency",
|
|
66574
66617
|
shortDescription: `Consistency checks for number ranges`,
|
|
66575
|
-
extendedInformation: `Issue reported if percentage warning is over 50%
|
|
66576
|
-
|
|
66618
|
+
extendedInformation: `Issue reported if percentage warning is over 50%
|
|
66619
|
+
|
|
66577
66620
|
Issue reported if the referenced domain is not found(taking error namespace into account)`,
|
|
66578
66621
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
66579
66622
|
};
|
|
@@ -66850,58 +66893,58 @@ class ObsoleteStatement extends _abap_rule_1.ABAPRule {
|
|
|
66850
66893
|
title: "Obsolete statements",
|
|
66851
66894
|
shortDescription: `Checks for usages of certain obsolete statements`,
|
|
66852
66895
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
66853
|
-
extendedInformation: `
|
|
66854
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-language-constructs
|
|
66855
|
-
|
|
66856
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements
|
|
66857
|
-
|
|
66858
|
-
SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapset_extended_check.htm
|
|
66859
|
-
|
|
66860
|
-
IS REQUESTED: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenlogexp_requested.htm
|
|
66861
|
-
|
|
66862
|
-
WITH HEADER LINE: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapdata_header_line.htm
|
|
66863
|
-
|
|
66864
|
-
FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapfield-symbols_obsolete_typing.htm
|
|
66865
|
-
|
|
66866
|
-
TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
66867
|
-
|
|
66868
|
-
LOAD addition: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
66869
|
-
|
|
66870
|
-
COMMUICATION: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapcommunication.htm
|
|
66871
|
-
|
|
66872
|
-
OCCURS: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapdata_occurs.htm
|
|
66873
|
-
|
|
66874
|
-
PARAMETER: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapparameter.htm
|
|
66875
|
-
|
|
66876
|
-
RANGES: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapranges.htm
|
|
66877
|
-
|
|
66878
|
-
PACK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abappack.htm
|
|
66879
|
-
|
|
66880
|
-
MOVE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapmove_obs.htm
|
|
66881
|
-
|
|
66882
|
-
SELECT without INTO: https://help.sap.com/doc/abapdocu_731_index_htm/7.31/en-US/abapselect_obsolete.htm
|
|
66883
|
-
SELECT COUNT(*) is considered okay
|
|
66884
|
-
|
|
66885
|
-
FREE MEMORY: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapfree_mem_id_obsolete.htm
|
|
66886
|
-
|
|
66887
|
-
SORT BY FS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapsort_itab_obsolete.htm
|
|
66888
|
-
|
|
66889
|
-
CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapcall_transformation_objects.htm
|
|
66890
|
-
|
|
66891
|
-
POSIX REGEX: https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/index.htm
|
|
66892
|
-
|
|
66893
|
-
OCCURENCES: check for OCCURENCES vs OCCURRENCES
|
|
66894
|
-
|
|
66896
|
+
extendedInformation: `
|
|
66897
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-functional-to-procedural-language-constructs
|
|
66898
|
+
|
|
66899
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#avoid-obsolete-language-elements
|
|
66900
|
+
|
|
66901
|
+
SET EXTENDED CHECK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapset_extended_check.htm
|
|
66902
|
+
|
|
66903
|
+
IS REQUESTED: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenlogexp_requested.htm
|
|
66904
|
+
|
|
66905
|
+
WITH HEADER LINE: https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abapdata_header_line.htm
|
|
66906
|
+
|
|
66907
|
+
FIELD-SYMBOLS STRUCTURE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapfield-symbols_obsolete_typing.htm
|
|
66908
|
+
|
|
66909
|
+
TYPE-POOLS: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
66910
|
+
|
|
66911
|
+
LOAD addition: from 702, https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abennews-71-program_load.htm
|
|
66912
|
+
|
|
66913
|
+
COMMUICATION: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapcommunication.htm
|
|
66914
|
+
|
|
66915
|
+
OCCURS: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapdata_occurs.htm
|
|
66916
|
+
|
|
66917
|
+
PARAMETER: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapparameter.htm
|
|
66918
|
+
|
|
66919
|
+
RANGES: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapranges.htm
|
|
66920
|
+
|
|
66921
|
+
PACK: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abappack.htm
|
|
66922
|
+
|
|
66923
|
+
MOVE: https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abapmove_obs.htm
|
|
66924
|
+
|
|
66925
|
+
SELECT without INTO: https://help.sap.com/doc/abapdocu_731_index_htm/7.31/en-US/abapselect_obsolete.htm
|
|
66926
|
+
SELECT COUNT(*) is considered okay
|
|
66927
|
+
|
|
66928
|
+
FREE MEMORY: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abapfree_mem_id_obsolete.htm
|
|
66929
|
+
|
|
66930
|
+
SORT BY FS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapsort_itab_obsolete.htm
|
|
66931
|
+
|
|
66932
|
+
CALL TRANSFORMATION OBJECTS: https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-US/abapcall_transformation_objects.htm
|
|
66933
|
+
|
|
66934
|
+
POSIX REGEX: https://help.sap.com/doc/abapdocu_755_index_htm/7.55/en-US/index.htm
|
|
66935
|
+
|
|
66936
|
+
OCCURENCES: check for OCCURENCES vs OCCURRENCES
|
|
66937
|
+
|
|
66895
66938
|
CLIENT SPECIFIED, from 754: https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm?file=abapselect_client_obsolete.htm`,
|
|
66896
|
-
badExample: `REFRESH itab.
|
|
66897
|
-
|
|
66898
|
-
COMPUTE foo = 2 + 2.
|
|
66899
|
-
|
|
66900
|
-
MULTIPLY lv_foo BY 2.
|
|
66901
|
-
|
|
66902
|
-
INTERFACE intf LOAD.
|
|
66903
|
-
|
|
66904
|
-
IF foo IS SUPPLIED.
|
|
66939
|
+
badExample: `REFRESH itab.
|
|
66940
|
+
|
|
66941
|
+
COMPUTE foo = 2 + 2.
|
|
66942
|
+
|
|
66943
|
+
MULTIPLY lv_foo BY 2.
|
|
66944
|
+
|
|
66945
|
+
INTERFACE intf LOAD.
|
|
66946
|
+
|
|
66947
|
+
IF foo IS SUPPLIED.
|
|
66905
66948
|
ENDIF.`,
|
|
66906
66949
|
};
|
|
66907
66950
|
}
|
|
@@ -67241,9 +67284,9 @@ class OmitParameterName {
|
|
|
67241
67284
|
key: "omit_parameter_name",
|
|
67242
67285
|
title: "Omit parameter name",
|
|
67243
67286
|
shortDescription: `Omit the parameter name in single parameter calls`,
|
|
67244
|
-
extendedInformation: `
|
|
67245
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-parameter-name-in-single-parameter-calls
|
|
67246
|
-
|
|
67287
|
+
extendedInformation: `
|
|
67288
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-the-parameter-name-in-single-parameter-calls
|
|
67289
|
+
|
|
67247
67290
|
EXPORTING must already be omitted for this rule to take effect, https://rules.abaplint.org/exporting/`,
|
|
67248
67291
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
67249
67292
|
badExample: `method( param = 2 ).`,
|
|
@@ -67449,20 +67492,20 @@ class OmitReceiving extends _abap_rule_1.ABAPRule {
|
|
|
67449
67492
|
shortDescription: `Omit RECEIVING`,
|
|
67450
67493
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#omit-receiving`,
|
|
67451
67494
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
67452
|
-
badExample: `
|
|
67453
|
-
upload_pack(
|
|
67454
|
-
EXPORTING
|
|
67455
|
-
io_client = lo_client
|
|
67456
|
-
iv_url = iv_url
|
|
67457
|
-
iv_deepen_level = iv_deepen_level
|
|
67458
|
-
it_hashes = lt_hashes
|
|
67459
|
-
RECEIVING
|
|
67495
|
+
badExample: `
|
|
67496
|
+
upload_pack(
|
|
67497
|
+
EXPORTING
|
|
67498
|
+
io_client = lo_client
|
|
67499
|
+
iv_url = iv_url
|
|
67500
|
+
iv_deepen_level = iv_deepen_level
|
|
67501
|
+
it_hashes = lt_hashes
|
|
67502
|
+
RECEIVING
|
|
67460
67503
|
rt_objects = et_objects ).`,
|
|
67461
|
-
goodExample: `
|
|
67462
|
-
et_objects = upload_pack(
|
|
67463
|
-
io_client = lo_client
|
|
67464
|
-
iv_url = iv_url
|
|
67465
|
-
iv_deepen_level = iv_deepen_level
|
|
67504
|
+
goodExample: `
|
|
67505
|
+
et_objects = upload_pack(
|
|
67506
|
+
io_client = lo_client
|
|
67507
|
+
iv_url = iv_url
|
|
67508
|
+
iv_deepen_level = iv_deepen_level
|
|
67466
67509
|
it_hashes = lt_hashes ).`,
|
|
67467
67510
|
};
|
|
67468
67511
|
}
|
|
@@ -67526,8 +67569,8 @@ class Parser702Chaining extends _abap_rule_1.ABAPRule {
|
|
|
67526
67569
|
return {
|
|
67527
67570
|
key: "parser_702_chaining",
|
|
67528
67571
|
title: "Parser Error, bad chanining on 702",
|
|
67529
|
-
shortDescription: `ABAP on 702 does not allow for method chaining with IMPORTING/EXPORTING/CHANGING keywords,
|
|
67530
|
-
this rule finds these and reports errors.
|
|
67572
|
+
shortDescription: `ABAP on 702 does not allow for method chaining with IMPORTING/EXPORTING/CHANGING keywords,
|
|
67573
|
+
this rule finds these and reports errors.
|
|
67531
67574
|
Only active on target version 702 and below.`,
|
|
67532
67575
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.SingleFile],
|
|
67533
67576
|
};
|
|
@@ -67607,8 +67650,8 @@ class ParserError {
|
|
|
67607
67650
|
return {
|
|
67608
67651
|
key: "parser_error",
|
|
67609
67652
|
title: "Parser error",
|
|
67610
|
-
shortDescription: `Checks for syntax not recognized by abaplint.
|
|
67611
|
-
|
|
67653
|
+
shortDescription: `Checks for syntax not recognized by abaplint.
|
|
67654
|
+
|
|
67612
67655
|
See recognized syntax at https://syntax.abaplint.org`,
|
|
67613
67656
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.SingleFile],
|
|
67614
67657
|
};
|
|
@@ -67693,7 +67736,7 @@ class ParserMissingSpace extends _abap_rule_1.ABAPRule {
|
|
|
67693
67736
|
return {
|
|
67694
67737
|
key: "parser_missing_space",
|
|
67695
67738
|
title: "Parser Error, missing space",
|
|
67696
|
-
shortDescription: `In special cases the ABAP language allows for not having spaces before or after string literals.
|
|
67739
|
+
shortDescription: `In special cases the ABAP language allows for not having spaces before or after string literals.
|
|
67697
67740
|
This rule makes sure the spaces are consistently required across the language.`,
|
|
67698
67741
|
tags: [_irule_1.RuleTag.Syntax, _irule_1.RuleTag.Whitespace, _irule_1.RuleTag.SingleFile],
|
|
67699
67742
|
badExample: `IF ( foo = 'bar').`,
|
|
@@ -68105,25 +68148,25 @@ class PreferInline {
|
|
|
68105
68148
|
key: "prefer_inline",
|
|
68106
68149
|
title: "Prefer Inline Declarations",
|
|
68107
68150
|
shortDescription: `Prefer inline to up-front declarations.`,
|
|
68108
|
-
extendedInformation: `EXPERIMENTAL
|
|
68109
|
-
|
|
68110
|
-
Activates if language version is v740sp02 or above.
|
|
68111
|
-
|
|
68112
|
-
Variables must be local(METHOD or FORM).
|
|
68113
|
-
|
|
68114
|
-
No generic or void typed variables. No syntax errors.
|
|
68115
|
-
|
|
68116
|
-
First position used must be a full/pure write.
|
|
68117
|
-
|
|
68118
|
-
Move statment is not a cast(?=)
|
|
68119
|
-
|
|
68151
|
+
extendedInformation: `EXPERIMENTAL
|
|
68152
|
+
|
|
68153
|
+
Activates if language version is v740sp02 or above.
|
|
68154
|
+
|
|
68155
|
+
Variables must be local(METHOD or FORM).
|
|
68156
|
+
|
|
68157
|
+
No generic or void typed variables. No syntax errors.
|
|
68158
|
+
|
|
68159
|
+
First position used must be a full/pure write.
|
|
68160
|
+
|
|
68161
|
+
Move statment is not a cast(?=)
|
|
68162
|
+
|
|
68120
68163
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-inline-to-up-front-declarations`,
|
|
68121
68164
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Upport, _irule_1.RuleTag.Experimental, _irule_1.RuleTag.Quickfix],
|
|
68122
|
-
badExample: `DATA foo TYPE i.
|
|
68123
|
-
foo = 2.
|
|
68124
|
-
DATA percentage TYPE decfloat34.
|
|
68165
|
+
badExample: `DATA foo TYPE i.
|
|
68166
|
+
foo = 2.
|
|
68167
|
+
DATA percentage TYPE decfloat34.
|
|
68125
68168
|
percentage = ( comment_number / abs_statement_number ) * 100.`,
|
|
68126
|
-
goodExample: `DATA(foo) = 2.
|
|
68169
|
+
goodExample: `DATA(foo) = 2.
|
|
68127
68170
|
DATA(percentage) = CONV decfloat34( comment_number / abs_statement_number ) * 100.`,
|
|
68128
68171
|
};
|
|
68129
68172
|
}
|
|
@@ -68337,18 +68380,18 @@ class PreferIsNot extends _abap_rule_1.ABAPRule {
|
|
|
68337
68380
|
key: "prefer_is_not",
|
|
68338
68381
|
title: "Prefer IS NOT to NOT IS",
|
|
68339
68382
|
shortDescription: `Prefer IS NOT to NOT IS`,
|
|
68340
|
-
extendedInformation: `
|
|
68341
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-is-not-to-not-is
|
|
68342
|
-
|
|
68383
|
+
extendedInformation: `
|
|
68384
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-is-not-to-not-is
|
|
68385
|
+
|
|
68343
68386
|
"if not is_valid( )." examples are skipped`,
|
|
68344
68387
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
68345
|
-
goodExample: `IF variable IS NOT INITIAL.
|
|
68346
|
-
IF variable NP 'TODO*'.
|
|
68347
|
-
IF variable <> 42.
|
|
68388
|
+
goodExample: `IF variable IS NOT INITIAL.
|
|
68389
|
+
IF variable NP 'TODO*'.
|
|
68390
|
+
IF variable <> 42.
|
|
68348
68391
|
IF variable CO 'hello'.`,
|
|
68349
|
-
badExample: `IF NOT variable IS INITIAL.
|
|
68350
|
-
IF NOT variable CP 'TODO*'.
|
|
68351
|
-
IF NOT variable = 42.
|
|
68392
|
+
badExample: `IF NOT variable IS INITIAL.
|
|
68393
|
+
IF NOT variable CP 'TODO*'.
|
|
68394
|
+
IF NOT variable = 42.
|
|
68352
68395
|
IF NOT variable CA 'hello'.`,
|
|
68353
68396
|
};
|
|
68354
68397
|
}
|
|
@@ -68536,14 +68579,14 @@ class PreferRaiseExceptionNew extends _abap_rule_1.ABAPRule {
|
|
|
68536
68579
|
key: "prefer_raise_exception_new",
|
|
68537
68580
|
title: "Prefer RAISE EXCEPTION NEW to RAISE EXCEPTION TYPE",
|
|
68538
68581
|
shortDescription: `Prefer RAISE EXCEPTION NEW to RAISE EXCEPTION TYPE`,
|
|
68539
|
-
extendedInformation: `
|
|
68540
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-raise-exception-new-to-raise-exception-type
|
|
68541
|
-
|
|
68582
|
+
extendedInformation: `
|
|
68583
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-raise-exception-new-to-raise-exception-type
|
|
68584
|
+
|
|
68542
68585
|
From 752 and up`,
|
|
68543
68586
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Upport],
|
|
68544
68587
|
goodExample: `RAISE EXCEPTION NEW cx_generation_error( previous = exception ).`,
|
|
68545
|
-
badExample: `RAISE EXCEPTION TYPE cx_generation_error
|
|
68546
|
-
EXPORTING
|
|
68588
|
+
badExample: `RAISE EXCEPTION TYPE cx_generation_error
|
|
68589
|
+
EXPORTING
|
|
68547
68590
|
previous = exception.`,
|
|
68548
68591
|
};
|
|
68549
68592
|
}
|
|
@@ -68621,12 +68664,12 @@ class PreferReturningToExporting extends _abap_rule_1.ABAPRule {
|
|
|
68621
68664
|
key: "prefer_returning_to_exporting",
|
|
68622
68665
|
title: "Prefer RETURNING to EXPORTING",
|
|
68623
68666
|
shortDescription: `Prefer RETURNING to EXPORTING. Generic types cannot be RETURNING.`,
|
|
68624
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-returning-to-exporting
|
|
68667
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-returning-to-exporting
|
|
68625
68668
|
https://docs.abapopenchecks.org/checks/44/`,
|
|
68626
68669
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
68627
|
-
badExample: `CLASS lcl DEFINITION.
|
|
68628
|
-
PUBLIC SECTION.
|
|
68629
|
-
METHODS test EXPORTING ev_foo TYPE i.
|
|
68670
|
+
badExample: `CLASS lcl DEFINITION.
|
|
68671
|
+
PUBLIC SECTION.
|
|
68672
|
+
METHODS test EXPORTING ev_foo TYPE i.
|
|
68630
68673
|
ENDCLASS.`,
|
|
68631
68674
|
};
|
|
68632
68675
|
}
|
|
@@ -68722,8 +68765,8 @@ class PreferXsdbool extends _abap_rule_1.ABAPRule {
|
|
|
68722
68765
|
key: "prefer_xsdbool",
|
|
68723
68766
|
title: "Prefer xsdbool over boolc",
|
|
68724
68767
|
shortDescription: `Prefer xsdbool over boolc`,
|
|
68725
|
-
extendedInformation: `Activates if language version is v740sp08 or above.
|
|
68726
|
-
|
|
68768
|
+
extendedInformation: `Activates if language version is v740sp08 or above.
|
|
68769
|
+
|
|
68727
68770
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-xsdbool-to-set-boolean-variables`,
|
|
68728
68771
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Upport, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
68729
68772
|
badExample: `DATA(sdf) = boolc( 1 = 2 ).`,
|
|
@@ -68795,9 +68838,9 @@ class PreferredCompareOperator extends _abap_rule_1.ABAPRule {
|
|
|
68795
68838
|
title: "Preferred compare operator",
|
|
68796
68839
|
shortDescription: `Configure undesired operator variants`,
|
|
68797
68840
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
68798
|
-
badExample: `IF foo EQ bar.
|
|
68841
|
+
badExample: `IF foo EQ bar.
|
|
68799
68842
|
ENDIF.`,
|
|
68800
|
-
goodExample: `IF foo = bar.
|
|
68843
|
+
goodExample: `IF foo = bar.
|
|
68801
68844
|
ENDIF.`,
|
|
68802
68845
|
};
|
|
68803
68846
|
}
|
|
@@ -69021,26 +69064,26 @@ class ReduceProceduralCode extends _abap_rule_1.ABAPRule {
|
|
|
69021
69064
|
key: "reduce_procedural_code",
|
|
69022
69065
|
title: "Reduce procedural code",
|
|
69023
69066
|
shortDescription: `Checks FORM and FUNCTION-MODULE have few statements`,
|
|
69024
|
-
extendedInformation: `Delegate logic to a class method instead of using FORM or FUNCTION-MODULE.
|
|
69025
|
-
|
|
69026
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-object-orientation-to-procedural-programming
|
|
69027
|
-
|
|
69067
|
+
extendedInformation: `Delegate logic to a class method instead of using FORM or FUNCTION-MODULE.
|
|
69068
|
+
|
|
69069
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-object-orientation-to-procedural-programming
|
|
69070
|
+
|
|
69028
69071
|
Comments are not counted as statements.`,
|
|
69029
69072
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide],
|
|
69030
|
-
badExample: `FORM foo.
|
|
69031
|
-
DATA lv_bar TYPE i.
|
|
69032
|
-
lv_bar = 2 + 2.
|
|
69033
|
-
IF lv_bar = 4.
|
|
69034
|
-
WRITE 'hello world'.
|
|
69035
|
-
ENDIF.
|
|
69036
|
-
DATA lv_bar TYPE i.
|
|
69037
|
-
lv_bar = 2 + 2.
|
|
69038
|
-
IF lv_bar = 4.
|
|
69039
|
-
WRITE 'hello world'.
|
|
69040
|
-
ENDIF.
|
|
69073
|
+
badExample: `FORM foo.
|
|
69074
|
+
DATA lv_bar TYPE i.
|
|
69075
|
+
lv_bar = 2 + 2.
|
|
69076
|
+
IF lv_bar = 4.
|
|
69077
|
+
WRITE 'hello world'.
|
|
69078
|
+
ENDIF.
|
|
69079
|
+
DATA lv_bar TYPE i.
|
|
69080
|
+
lv_bar = 2 + 2.
|
|
69081
|
+
IF lv_bar = 4.
|
|
69082
|
+
WRITE 'hello world'.
|
|
69083
|
+
ENDIF.
|
|
69041
69084
|
ENDFORM.`,
|
|
69042
|
-
goodExample: `FORM foo.
|
|
69043
|
-
NEW zcl_global_class( )->run_logic( ).
|
|
69085
|
+
goodExample: `FORM foo.
|
|
69086
|
+
NEW zcl_global_class( )->run_logic( ).
|
|
69044
69087
|
ENDFORM.`,
|
|
69045
69088
|
};
|
|
69046
69089
|
}
|
|
@@ -69284,10 +69327,10 @@ class RemoveDescriptions {
|
|
|
69284
69327
|
return {
|
|
69285
69328
|
key: "remove_descriptions",
|
|
69286
69329
|
title: "Remove descriptions",
|
|
69287
|
-
shortDescription: `Ensures you have no descriptions in metadata of methods, parameters, etc.
|
|
69288
|
-
|
|
69289
|
-
Class descriptions are required, see rule description_empty.
|
|
69290
|
-
|
|
69330
|
+
shortDescription: `Ensures you have no descriptions in metadata of methods, parameters, etc.
|
|
69331
|
+
|
|
69332
|
+
Class descriptions are required, see rule description_empty.
|
|
69333
|
+
|
|
69291
69334
|
Consider using ABAP Doc for documentation.`,
|
|
69292
69335
|
tags: [],
|
|
69293
69336
|
};
|
|
@@ -69412,14 +69455,14 @@ class RFCErrorHandling extends _abap_rule_1.ABAPRule {
|
|
|
69412
69455
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
69413
69456
|
shortDescription: `Checks that exceptions 'system_failure' and 'communication_failure' are handled in RFC calls`,
|
|
69414
69457
|
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abenrfc_exception.htm`,
|
|
69415
|
-
badExample: `CALL FUNCTION 'ZRFC'
|
|
69458
|
+
badExample: `CALL FUNCTION 'ZRFC'
|
|
69416
69459
|
DESTINATION lv_rfc.`,
|
|
69417
|
-
goodExample: `CALL FUNCTION 'ZRFC'
|
|
69418
|
-
DESTINATION lv_rfc
|
|
69419
|
-
EXCEPTIONS
|
|
69420
|
-
system_failure = 1 MESSAGE msg
|
|
69421
|
-
communication_failure = 2 MESSAGE msg
|
|
69422
|
-
resource_failure = 3
|
|
69460
|
+
goodExample: `CALL FUNCTION 'ZRFC'
|
|
69461
|
+
DESTINATION lv_rfc
|
|
69462
|
+
EXCEPTIONS
|
|
69463
|
+
system_failure = 1 MESSAGE msg
|
|
69464
|
+
communication_failure = 2 MESSAGE msg
|
|
69465
|
+
resource_failure = 3
|
|
69423
69466
|
OTHERS = 4.`,
|
|
69424
69467
|
};
|
|
69425
69468
|
}
|
|
@@ -69503,11 +69546,11 @@ class SelectAddOrderBy {
|
|
|
69503
69546
|
key: "select_add_order_by",
|
|
69504
69547
|
title: "SELECT add ORDER BY",
|
|
69505
69548
|
shortDescription: `SELECTs add ORDER BY clause`,
|
|
69506
|
-
extendedInformation: `
|
|
69507
|
-
This will make sure that the SELECT statement returns results in the same sequence on different databases
|
|
69508
|
-
|
|
69509
|
-
add ORDER BY PRIMARY KEY if in doubt
|
|
69510
|
-
|
|
69549
|
+
extendedInformation: `
|
|
69550
|
+
This will make sure that the SELECT statement returns results in the same sequence on different databases
|
|
69551
|
+
|
|
69552
|
+
add ORDER BY PRIMARY KEY if in doubt
|
|
69553
|
+
|
|
69511
69554
|
If the target is a sorted/hashed table, no issue is reported`,
|
|
69512
69555
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
69513
69556
|
badExample: `SELECT * FROM db INTO TABLE @DATA(tab).`,
|
|
@@ -69638,14 +69681,14 @@ class SelectPerformance {
|
|
|
69638
69681
|
key: "select_performance",
|
|
69639
69682
|
title: "SELECT performance",
|
|
69640
69683
|
shortDescription: `Various checks regarding SELECT performance.`,
|
|
69641
|
-
extendedInformation: `ENDSELECT: not reported when the corresponding SELECT has PACKAGE SIZE
|
|
69642
|
-
|
|
69684
|
+
extendedInformation: `ENDSELECT: not reported when the corresponding SELECT has PACKAGE SIZE
|
|
69685
|
+
|
|
69643
69686
|
SELECT *: not reported if using INTO/APPENDING CORRESPONDING FIELDS OF`,
|
|
69644
69687
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Performance],
|
|
69645
|
-
badExample: `SELECT field1, field2 FROM table
|
|
69646
|
-
INTO @DATA(structure) UP TO 1 ROWS ORDER BY field3 DESCENDING.
|
|
69688
|
+
badExample: `SELECT field1, field2 FROM table
|
|
69689
|
+
INTO @DATA(structure) UP TO 1 ROWS ORDER BY field3 DESCENDING.
|
|
69647
69690
|
ENDSELECT.`,
|
|
69648
|
-
goodExample: `SELECT field1, field2 FROM table UP TO 1 ROWS
|
|
69691
|
+
goodExample: `SELECT field1, field2 FROM table UP TO 1 ROWS
|
|
69649
69692
|
INTO TABLE @DATA(table) ORDER BY field3 DESCENDING`,
|
|
69650
69693
|
};
|
|
69651
69694
|
}
|
|
@@ -69759,8 +69802,8 @@ class SelectSingleFullKey {
|
|
|
69759
69802
|
key: "select_single_full_key",
|
|
69760
69803
|
title: "Detect SELECT SINGLE which are possibily not unique",
|
|
69761
69804
|
shortDescription: `Detect SELECT SINGLE which are possibily not unique`,
|
|
69762
|
-
extendedInformation: `Table definitions must be known, ie. inside the errorNamespace
|
|
69763
|
-
|
|
69805
|
+
extendedInformation: `Table definitions must be known, ie. inside the errorNamespace
|
|
69806
|
+
|
|
69764
69807
|
If the statement contains a JOIN it is not checked`,
|
|
69765
69808
|
pseudoComment: "EC CI_NOORDER",
|
|
69766
69809
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
@@ -70184,8 +70227,8 @@ class SICFConsistency {
|
|
|
70184
70227
|
key: "sicf_consistency",
|
|
70185
70228
|
title: "SICF consistency",
|
|
70186
70229
|
shortDescription: `Checks the validity of ICF services`,
|
|
70187
|
-
extendedInformation: `* Class defined in handler must exist
|
|
70188
|
-
* Class must not have any syntax errors
|
|
70230
|
+
extendedInformation: `* Class defined in handler must exist
|
|
70231
|
+
* Class must not have any syntax errors
|
|
70189
70232
|
* Class must implement interface IF_HTTP_EXTENSION`,
|
|
70190
70233
|
};
|
|
70191
70234
|
}
|
|
@@ -70297,23 +70340,23 @@ class SlowParameterPassing {
|
|
|
70297
70340
|
shortDescription: `Detects slow pass by value passing for methods where parameter is not changed`,
|
|
70298
70341
|
extendedInformation: `Method parameters defined in interfaces is not checked`,
|
|
70299
70342
|
tags: [_irule_1.RuleTag.Performance],
|
|
70300
|
-
badExample: `CLASS lcl DEFINITION.
|
|
70301
|
-
PUBLIC SECTION.
|
|
70302
|
-
METHODS bar IMPORTING VALUE(sdf) TYPE string.
|
|
70303
|
-
ENDCLASS.
|
|
70304
|
-
CLASS lcl IMPLEMENTATION.
|
|
70305
|
-
METHOD bar.
|
|
70306
|
-
WRITE sdf.
|
|
70307
|
-
ENDMETHOD.
|
|
70343
|
+
badExample: `CLASS lcl DEFINITION.
|
|
70344
|
+
PUBLIC SECTION.
|
|
70345
|
+
METHODS bar IMPORTING VALUE(sdf) TYPE string.
|
|
70346
|
+
ENDCLASS.
|
|
70347
|
+
CLASS lcl IMPLEMENTATION.
|
|
70348
|
+
METHOD bar.
|
|
70349
|
+
WRITE sdf.
|
|
70350
|
+
ENDMETHOD.
|
|
70308
70351
|
ENDCLASS.`,
|
|
70309
|
-
goodExample: `CLASS lcl DEFINITION.
|
|
70310
|
-
PUBLIC SECTION.
|
|
70311
|
-
METHODS bar IMPORTING sdf TYPE string.
|
|
70312
|
-
ENDCLASS.
|
|
70313
|
-
CLASS lcl IMPLEMENTATION.
|
|
70314
|
-
METHOD bar.
|
|
70315
|
-
WRITE sdf.
|
|
70316
|
-
ENDMETHOD.
|
|
70352
|
+
goodExample: `CLASS lcl DEFINITION.
|
|
70353
|
+
PUBLIC SECTION.
|
|
70354
|
+
METHODS bar IMPORTING sdf TYPE string.
|
|
70355
|
+
ENDCLASS.
|
|
70356
|
+
CLASS lcl IMPLEMENTATION.
|
|
70357
|
+
METHOD bar.
|
|
70358
|
+
WRITE sdf.
|
|
70359
|
+
ENDMETHOD.
|
|
70317
70360
|
ENDCLASS.`,
|
|
70318
70361
|
};
|
|
70319
70362
|
}
|
|
@@ -70570,8 +70613,8 @@ class SpaceBeforeDot extends _abap_rule_1.ABAPRule {
|
|
|
70570
70613
|
key: "space_before_dot",
|
|
70571
70614
|
title: "Space before dot",
|
|
70572
70615
|
shortDescription: `Checks for extra spaces before dots at the ends of statements`,
|
|
70573
|
-
extendedInformation: `
|
|
70574
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#be-consistent
|
|
70616
|
+
extendedInformation: `
|
|
70617
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#be-consistent
|
|
70575
70618
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#condense-your-code`,
|
|
70576
70619
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
70577
70620
|
badExample: `WRITE bar .`,
|
|
@@ -70757,12 +70800,12 @@ class SQLValueConversion {
|
|
|
70757
70800
|
key: "sql_value_conversion",
|
|
70758
70801
|
title: "Implicit SQL Value Conversion",
|
|
70759
70802
|
shortDescription: `Ensure types match when selecting from database`,
|
|
70760
|
-
extendedInformation: `
|
|
70761
|
-
* Integer to CHAR conversion
|
|
70762
|
-
* Integer to NUMC conversion
|
|
70763
|
-
* NUMC to Integer conversion
|
|
70764
|
-
* CHAR to Integer conversion
|
|
70765
|
-
* Source field longer than database field, CHAR -> CHAR
|
|
70803
|
+
extendedInformation: `
|
|
70804
|
+
* Integer to CHAR conversion
|
|
70805
|
+
* Integer to NUMC conversion
|
|
70806
|
+
* NUMC to Integer conversion
|
|
70807
|
+
* CHAR to Integer conversion
|
|
70808
|
+
* Source field longer than database field, CHAR -> CHAR
|
|
70766
70809
|
* Source field longer than database field, NUMC -> NUMC`,
|
|
70767
70810
|
tags: [],
|
|
70768
70811
|
};
|
|
@@ -70834,7 +70877,7 @@ class StartAtTab extends _abap_rule_1.ABAPRule {
|
|
|
70834
70877
|
key: "start_at_tab",
|
|
70835
70878
|
title: "Start at tab",
|
|
70836
70879
|
shortDescription: `Checks that statements start at tabstops.`,
|
|
70837
|
-
extendedInformation: `Reports max 100 issues per file
|
|
70880
|
+
extendedInformation: `Reports max 100 issues per file
|
|
70838
70881
|
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#indent-and-snap-to-tab`,
|
|
70839
70882
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
70840
70883
|
badExample: ` WRITE a.`,
|
|
@@ -71011,12 +71054,12 @@ class StrictSQL extends _abap_rule_1.ABAPRule {
|
|
|
71011
71054
|
key: "strict_sql",
|
|
71012
71055
|
title: "Strict SQL",
|
|
71013
71056
|
shortDescription: `Strict SQL`,
|
|
71014
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm
|
|
71015
|
-
|
|
71016
|
-
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm
|
|
71017
|
-
|
|
71018
|
-
Also see separate rule sql_escape_host_variables
|
|
71019
|
-
|
|
71057
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-US/abapinto_clause.htm
|
|
71058
|
+
|
|
71059
|
+
https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenopensql_strict_mode_750.htm
|
|
71060
|
+
|
|
71061
|
+
Also see separate rule sql_escape_host_variables
|
|
71062
|
+
|
|
71020
71063
|
Activates from v750 and up`,
|
|
71021
71064
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Quickfix],
|
|
71022
71065
|
badExample: `SELECT * FROM ztabl INTO TABLE @rt_content WHERE type = @iv_type ORDER BY PRIMARY KEY.`,
|
|
@@ -71270,11 +71313,11 @@ class SyModification extends _abap_rule_1.ABAPRule {
|
|
|
71270
71313
|
key: "sy_modification",
|
|
71271
71314
|
title: "Modification of SY fields",
|
|
71272
71315
|
shortDescription: `Finds modification of sy fields`,
|
|
71273
|
-
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abensystem_fields.htm
|
|
71274
|
-
|
|
71316
|
+
extendedInformation: `https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abensystem_fields.htm
|
|
71317
|
+
|
|
71275
71318
|
Changes to SY-TVAR* fields are not reported`,
|
|
71276
71319
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
71277
|
-
badExample: `sy-uname = 2.
|
|
71320
|
+
badExample: `sy-uname = 2.
|
|
71278
71321
|
sy = sy.`,
|
|
71279
71322
|
};
|
|
71280
71323
|
}
|
|
@@ -71336,8 +71379,8 @@ class TABLEnhancementCategory {
|
|
|
71336
71379
|
key: "tabl_enhancement_category",
|
|
71337
71380
|
title: "TABL enhancement category must be set",
|
|
71338
71381
|
shortDescription: `Checks that tables do not have the enhancement category 'not classified'.`,
|
|
71339
|
-
extendedInformation: `SAP note 3063227 changes the default to 'Cannot be enhanced'.
|
|
71340
|
-
|
|
71382
|
+
extendedInformation: `SAP note 3063227 changes the default to 'Cannot be enhanced'.
|
|
71383
|
+
|
|
71341
71384
|
You may use standard report RS_DDIC_CLASSIFICATION_FINAL for adjustment.`,
|
|
71342
71385
|
tags: [],
|
|
71343
71386
|
};
|
|
@@ -71402,8 +71445,8 @@ class TablesDeclaredLocally extends _abap_rule_1.ABAPRule {
|
|
|
71402
71445
|
shortDescription: `TABLES are always global, so declare them globally`,
|
|
71403
71446
|
extendedInformation: `https://help.sap.com/doc/abapdocu_752_index_htm/7.52/en-us/abaptables.htm`,
|
|
71404
71447
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
71405
|
-
badExample: `FORM foo.
|
|
71406
|
-
TABLES t100.
|
|
71448
|
+
badExample: `FORM foo.
|
|
71449
|
+
TABLES t100.
|
|
71407
71450
|
ENDFORM.`,
|
|
71408
71451
|
goodExample: `TABLES t000.`,
|
|
71409
71452
|
};
|
|
@@ -71531,9 +71574,9 @@ class TypeFormParameters extends _abap_rule_1.ABAPRule {
|
|
|
71531
71574
|
title: "Type FORM parameters",
|
|
71532
71575
|
shortDescription: `Checks for untyped FORM parameters`,
|
|
71533
71576
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
71534
|
-
badExample: `FORM foo USING bar.
|
|
71577
|
+
badExample: `FORM foo USING bar.
|
|
71535
71578
|
ENDFORM.`,
|
|
71536
|
-
goodExample: `FORM foo USING bar TYPE string.
|
|
71579
|
+
goodExample: `FORM foo USING bar TYPE string.
|
|
71537
71580
|
ENDFORM.`,
|
|
71538
71581
|
};
|
|
71539
71582
|
}
|
|
@@ -72206,38 +72249,38 @@ class UnnecessaryPragma extends _abap_rule_1.ABAPRule {
|
|
|
72206
72249
|
key: "unnecessary_pragma",
|
|
72207
72250
|
title: "Unnecessary Pragma",
|
|
72208
72251
|
shortDescription: `Finds pragmas which can be removed`,
|
|
72209
|
-
extendedInformation: `* NO_HANDLER with handler
|
|
72210
|
-
|
|
72211
|
-
* NEEDED without definition
|
|
72212
|
-
|
|
72213
|
-
* NO_TEXT without texts
|
|
72214
|
-
|
|
72215
|
-
* SUBRC_OK where sy-subrc is checked
|
|
72216
|
-
|
|
72252
|
+
extendedInformation: `* NO_HANDLER with handler
|
|
72253
|
+
|
|
72254
|
+
* NEEDED without definition
|
|
72255
|
+
|
|
72256
|
+
* NO_TEXT without texts
|
|
72257
|
+
|
|
72258
|
+
* SUBRC_OK where sy-subrc is checked
|
|
72259
|
+
|
|
72217
72260
|
NO_HANDLER inside macros are not checked`,
|
|
72218
72261
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
72219
|
-
badExample: `TRY.
|
|
72220
|
-
...
|
|
72221
|
-
CATCH zcx_abapgit_exception ##NO_HANDLER.
|
|
72222
|
-
RETURN. " it has a handler
|
|
72223
|
-
ENDTRY.
|
|
72224
|
-
MESSAGE w125(zbar) WITH c_foo INTO message ##NEEDED ##NO_TEXT.
|
|
72225
|
-
SELECT SINGLE * FROM tadir INTO @DATA(sdfs) ##SUBRC_OK.
|
|
72226
|
-
IF sy-subrc <> 0.
|
|
72262
|
+
badExample: `TRY.
|
|
72263
|
+
...
|
|
72264
|
+
CATCH zcx_abapgit_exception ##NO_HANDLER.
|
|
72265
|
+
RETURN. " it has a handler
|
|
72266
|
+
ENDTRY.
|
|
72267
|
+
MESSAGE w125(zbar) WITH c_foo INTO message ##NEEDED ##NO_TEXT.
|
|
72268
|
+
SELECT SINGLE * FROM tadir INTO @DATA(sdfs) ##SUBRC_OK.
|
|
72269
|
+
IF sy-subrc <> 0.
|
|
72227
72270
|
ENDIF.`,
|
|
72228
|
-
goodExample: `TRY.
|
|
72229
|
-
...
|
|
72230
|
-
CATCH zcx_abapgit_exception.
|
|
72231
|
-
RETURN.
|
|
72232
|
-
ENDTRY.
|
|
72233
|
-
MESSAGE w125(zbar) WITH c_foo INTO message.
|
|
72234
|
-
SELECT SINGLE * FROM tadir INTO @DATA(sdfs).
|
|
72235
|
-
IF sy-subrc <> 0.
|
|
72236
|
-
ENDIF.
|
|
72237
|
-
|
|
72238
|
-
DATA: BEGIN OF blah ##NEEDED,
|
|
72239
|
-
test1 TYPE string,
|
|
72240
|
-
test2 TYPE string,
|
|
72271
|
+
goodExample: `TRY.
|
|
72272
|
+
...
|
|
72273
|
+
CATCH zcx_abapgit_exception.
|
|
72274
|
+
RETURN.
|
|
72275
|
+
ENDTRY.
|
|
72276
|
+
MESSAGE w125(zbar) WITH c_foo INTO message.
|
|
72277
|
+
SELECT SINGLE * FROM tadir INTO @DATA(sdfs).
|
|
72278
|
+
IF sy-subrc <> 0.
|
|
72279
|
+
ENDIF.
|
|
72280
|
+
|
|
72281
|
+
DATA: BEGIN OF blah ##NEEDED,
|
|
72282
|
+
test1 TYPE string,
|
|
72283
|
+
test2 TYPE string,
|
|
72241
72284
|
END OF blah.`,
|
|
72242
72285
|
};
|
|
72243
72286
|
}
|
|
@@ -72404,18 +72447,18 @@ class UnnecessaryReturn extends _abap_rule_1.ABAPRule {
|
|
|
72404
72447
|
shortDescription: `Finds unnecessary RETURN statements`,
|
|
72405
72448
|
extendedInformation: `Finds unnecessary RETURN statements`,
|
|
72406
72449
|
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
72407
|
-
badExample: `FORM hello1.
|
|
72408
|
-
WRITE 'world'.
|
|
72409
|
-
RETURN.
|
|
72410
|
-
ENDFORM.
|
|
72411
|
-
|
|
72412
|
-
FORM foo.
|
|
72413
|
-
IF 1 = 2.
|
|
72414
|
-
RETURN.
|
|
72415
|
-
ENDIF.
|
|
72450
|
+
badExample: `FORM hello1.
|
|
72451
|
+
WRITE 'world'.
|
|
72452
|
+
RETURN.
|
|
72453
|
+
ENDFORM.
|
|
72454
|
+
|
|
72455
|
+
FORM foo.
|
|
72456
|
+
IF 1 = 2.
|
|
72457
|
+
RETURN.
|
|
72458
|
+
ENDIF.
|
|
72416
72459
|
ENDFORM.`,
|
|
72417
|
-
goodExample: `FORM hello2.
|
|
72418
|
-
WRITE 'world'.
|
|
72460
|
+
goodExample: `FORM hello2.
|
|
72461
|
+
WRITE 'world'.
|
|
72419
72462
|
ENDFORM.`,
|
|
72420
72463
|
};
|
|
72421
72464
|
}
|
|
@@ -72766,13 +72809,13 @@ class UnusedMacros {
|
|
|
72766
72809
|
title: "Unused macros",
|
|
72767
72810
|
shortDescription: `Checks for unused macro definitions definitions`,
|
|
72768
72811
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
72769
|
-
badExample: `DEFINE foobar1.
|
|
72770
|
-
WRITE 'hello'.
|
|
72812
|
+
badExample: `DEFINE foobar1.
|
|
72813
|
+
WRITE 'hello'.
|
|
72771
72814
|
END-OF-DEFINITION.`,
|
|
72772
|
-
goodExample: `DEFINE foobar2.
|
|
72773
|
-
WRITE 'hello'.
|
|
72774
|
-
END-OF-DEFINITION.
|
|
72775
|
-
|
|
72815
|
+
goodExample: `DEFINE foobar2.
|
|
72816
|
+
WRITE 'hello'.
|
|
72817
|
+
END-OF-DEFINITION.
|
|
72818
|
+
|
|
72776
72819
|
foobar2.`,
|
|
72777
72820
|
};
|
|
72778
72821
|
}
|
|
@@ -72827,6 +72870,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
|
|
|
72827
72870
|
exports.UnusedMethods = exports.UnusedMethodsConf = void 0;
|
|
72828
72871
|
const issue_1 = __webpack_require__(/*! ../issue */ "./node_modules/@abaplint/core/build/src/issue.js");
|
|
72829
72872
|
const _basic_rule_config_1 = __webpack_require__(/*! ./_basic_rule_config */ "./node_modules/@abaplint/core/build/src/rules/_basic_rule_config.js");
|
|
72873
|
+
const _irule_1 = __webpack_require__(/*! ./_irule */ "./node_modules/@abaplint/core/build/src/rules/_irule.js");
|
|
72830
72874
|
const syntax_1 = __webpack_require__(/*! ../abap/5_syntax/syntax */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/syntax.js");
|
|
72831
72875
|
const _abap_object_1 = __webpack_require__(/*! ../objects/_abap_object */ "./node_modules/@abaplint/core/build/src/objects/_abap_object.js");
|
|
72832
72876
|
const _scope_type_1 = __webpack_require__(/*! ../abap/5_syntax/_scope_type */ "./node_modules/@abaplint/core/build/src/abap/5_syntax/_scope_type.js");
|
|
@@ -72835,6 +72879,8 @@ const _reference_1 = __webpack_require__(/*! ../abap/5_syntax/_reference */ "./n
|
|
|
72835
72879
|
const visibility_1 = __webpack_require__(/*! ../abap/4_file_information/visibility */ "./node_modules/@abaplint/core/build/src/abap/4_file_information/visibility.js");
|
|
72836
72880
|
const edit_helper_1 = __webpack_require__(/*! ../edit_helper */ "./node_modules/@abaplint/core/build/src/edit_helper.js");
|
|
72837
72881
|
const _statement_1 = __webpack_require__(/*! ../abap/2_statements/statements/_statement */ "./node_modules/@abaplint/core/build/src/abap/2_statements/statements/_statement.js");
|
|
72882
|
+
const Structures = __webpack_require__(/*! ../abap/3_structures/structures */ "./node_modules/@abaplint/core/build/src/abap/3_structures/structures/index.js");
|
|
72883
|
+
const Expressions = __webpack_require__(/*! ../abap/2_statements/expressions */ "./node_modules/@abaplint/core/build/src/abap/2_statements/expressions/index.js");
|
|
72838
72884
|
class UnusedMethodsConf extends _basic_rule_config_1.BasicRuleConfig {
|
|
72839
72885
|
}
|
|
72840
72886
|
exports.UnusedMethodsConf = UnusedMethodsConf;
|
|
@@ -72847,6 +72893,7 @@ class WorkArea {
|
|
|
72847
72893
|
this.list.push(id);
|
|
72848
72894
|
}
|
|
72849
72895
|
removeIfExists(id) {
|
|
72896
|
+
// todo: optimize
|
|
72850
72897
|
for (let i = 0; i < this.list.length; i++) {
|
|
72851
72898
|
if (id.equals(this.list[i].identifier)) {
|
|
72852
72899
|
this.list.splice(i, 1);
|
|
@@ -72880,19 +72927,20 @@ class UnusedMethods {
|
|
|
72880
72927
|
key: "unused_methods",
|
|
72881
72928
|
title: "Unused methods",
|
|
72882
72929
|
shortDescription: `Checks for unused methods`,
|
|
72883
|
-
extendedInformation: `Checks private and protected methods.
|
|
72884
|
-
|
|
72885
|
-
Unused methods are not reported if the object contains parser or syntax errors.
|
|
72886
|
-
|
|
72887
|
-
|
|
72888
|
-
|
|
72889
|
-
* methods
|
|
72890
|
-
*
|
|
72891
|
-
*
|
|
72892
|
-
*
|
|
72893
|
-
*
|
|
72930
|
+
extendedInformation: `Checks private and protected methods.
|
|
72931
|
+
|
|
72932
|
+
Unused methods are not reported if the object contains parser or syntax errors.
|
|
72933
|
+
Quick fixes only appears for private methods or projected methods where the class doesnt have any subclasses.
|
|
72934
|
+
|
|
72935
|
+
Skips:
|
|
72936
|
+
* methods FOR TESTING
|
|
72937
|
+
* methods SETUP + TEARDOWN + CLASS_SETUP + CLASS_TEARDOWN in testclasses
|
|
72938
|
+
* class_constructor + constructor methods
|
|
72939
|
+
* event handlers
|
|
72940
|
+
* methods that are redefined
|
|
72941
|
+
* INCLUDEs
|
|
72894
72942
|
`,
|
|
72895
|
-
tags: [],
|
|
72943
|
+
tags: [_irule_1.RuleTag.Quickfix],
|
|
72896
72944
|
pragma: "##CALLED",
|
|
72897
72945
|
pseudoComment: "EC CALLED",
|
|
72898
72946
|
};
|
|
@@ -72974,11 +73022,53 @@ Skips:
|
|
|
72974
73022
|
else if (this.suppressedbyPseudo(statement, file)) {
|
|
72975
73023
|
continue;
|
|
72976
73024
|
}
|
|
73025
|
+
let fix = undefined;
|
|
73026
|
+
if (i.visibility === visibility_1.Visibility.Private
|
|
73027
|
+
|| i.isFinal === true
|
|
73028
|
+
|| (i.visibility === visibility_1.Visibility.Protected && this.hasSubClass(obj) === false)) {
|
|
73029
|
+
const implementation = this.findMethodImplementation(i, file);
|
|
73030
|
+
if (implementation !== undefined) {
|
|
73031
|
+
const fix1 = edit_helper_1.EditHelper.deleteStatement(file, statement);
|
|
73032
|
+
const fix2 = edit_helper_1.EditHelper.deleteRange(file, implementation.getFirstToken().getStart(), implementation.getLastToken().getEnd());
|
|
73033
|
+
fix = edit_helper_1.EditHelper.merge(fix1, fix2);
|
|
73034
|
+
}
|
|
73035
|
+
}
|
|
72977
73036
|
const message = "Method \"" + i.identifier.getName() + "\" not used";
|
|
72978
|
-
issues.push(issue_1.Issue.atIdentifier(i.identifier, message, this.getMetadata().key, this.conf.severity));
|
|
73037
|
+
issues.push(issue_1.Issue.atIdentifier(i.identifier, message, this.getMetadata().key, this.conf.severity, fix));
|
|
72979
73038
|
}
|
|
72980
73039
|
return issues;
|
|
72981
73040
|
}
|
|
73041
|
+
hasSubClass(obj) {
|
|
73042
|
+
var _a, _b, _c;
|
|
73043
|
+
if (!(obj instanceof objects_1.Class)) {
|
|
73044
|
+
return false;
|
|
73045
|
+
}
|
|
73046
|
+
if (((_a = obj.getDefinition()) === null || _a === void 0 ? void 0 : _a.isFinal()) === true) {
|
|
73047
|
+
return false;
|
|
73048
|
+
}
|
|
73049
|
+
for (const r of this.reg.getObjects()) {
|
|
73050
|
+
if (r instanceof objects_1.Class
|
|
73051
|
+
&& ((_c = (_b = r.getDefinition()) === null || _b === void 0 ? void 0 : _b.getSuperClass()) === null || _c === void 0 ? void 0 : _c.toUpperCase()) === obj.getName().toUpperCase()) {
|
|
73052
|
+
return true;
|
|
73053
|
+
}
|
|
73054
|
+
}
|
|
73055
|
+
return false;
|
|
73056
|
+
}
|
|
73057
|
+
findMethodImplementation(method, file) {
|
|
73058
|
+
var _a, _b;
|
|
73059
|
+
for (const classImplementation of ((_a = file.getStructure()) === null || _a === void 0 ? void 0 : _a.findAllStructures(Structures.ClassImplementation)) || []) {
|
|
73060
|
+
// todo, this will break if there are class implemtations with the same method names
|
|
73061
|
+
// const className = classImplementation.findFirstExpression(Expressions.ClassName)?.concatTokens().toUpperCase();
|
|
73062
|
+
for (const methodImplementation of classImplementation.findAllStructures(Structures.Method)) {
|
|
73063
|
+
const methodName = ((_b = methodImplementation.findFirstExpression(Expressions.MethodName)) === null || _b === void 0 ? void 0 : _b.concatTokens().toUpperCase()) || "";
|
|
73064
|
+
if (methodName !== method.name.toUpperCase()) {
|
|
73065
|
+
continue;
|
|
73066
|
+
}
|
|
73067
|
+
return methodImplementation;
|
|
73068
|
+
}
|
|
73069
|
+
}
|
|
73070
|
+
return undefined;
|
|
73071
|
+
}
|
|
72982
73072
|
suppressedbyPseudo(statement, file) {
|
|
72983
73073
|
if (statement === undefined) {
|
|
72984
73074
|
return false;
|
|
@@ -73324,23 +73414,23 @@ class UnusedVariables {
|
|
|
73324
73414
|
key: "unused_variables",
|
|
73325
73415
|
title: "Unused variables",
|
|
73326
73416
|
shortDescription: `Checks for unused variables and constants`,
|
|
73327
|
-
extendedInformation: `Skips event parameters.
|
|
73328
|
-
|
|
73329
|
-
Note that this currently does not work if the source code uses macros.
|
|
73330
|
-
|
|
73331
|
-
Unused variables are not reported if the object contains parser or syntax errors.
|
|
73332
|
-
|
|
73417
|
+
extendedInformation: `Skips event parameters.
|
|
73418
|
+
|
|
73419
|
+
Note that this currently does not work if the source code uses macros.
|
|
73420
|
+
|
|
73421
|
+
Unused variables are not reported if the object contains parser or syntax errors.
|
|
73422
|
+
|
|
73333
73423
|
Errors found in INCLUDES are reported for the main program.`,
|
|
73334
73424
|
tags: [_irule_1.RuleTag.Quickfix],
|
|
73335
73425
|
pragma: "##NEEDED",
|
|
73336
73426
|
pseudoComment: "EC NEEDED",
|
|
73337
|
-
badExample: `DATA: BEGIN OF blah1,
|
|
73338
|
-
test TYPE string,
|
|
73339
|
-
test2 TYPE string,
|
|
73427
|
+
badExample: `DATA: BEGIN OF blah1,
|
|
73428
|
+
test TYPE string,
|
|
73429
|
+
test2 TYPE string,
|
|
73340
73430
|
END OF blah1.`,
|
|
73341
|
-
goodExample: `DATA: BEGIN OF blah2 ##NEEDED,
|
|
73342
|
-
test TYPE string,
|
|
73343
|
-
test2 TYPE string,
|
|
73431
|
+
goodExample: `DATA: BEGIN OF blah2 ##NEEDED,
|
|
73432
|
+
test TYPE string,
|
|
73433
|
+
test2 TYPE string,
|
|
73344
73434
|
END OF blah2.`,
|
|
73345
73435
|
};
|
|
73346
73436
|
}
|
|
@@ -73559,15 +73649,15 @@ class UseBoolExpression extends _abap_rule_1.ABAPRule {
|
|
|
73559
73649
|
shortDescription: `Use boolean expression, xsdbool from 740sp08 and up, boolc from 702 and up`,
|
|
73560
73650
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-xsdbool-to-set-boolean-variables`,
|
|
73561
73651
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
73562
|
-
badExample: `IF line IS INITIAL.
|
|
73563
|
-
has_entries = abap_false.
|
|
73564
|
-
ELSE.
|
|
73565
|
-
has_entries = abap_true.
|
|
73566
|
-
ENDIF.
|
|
73567
|
-
|
|
73652
|
+
badExample: `IF line IS INITIAL.
|
|
73653
|
+
has_entries = abap_false.
|
|
73654
|
+
ELSE.
|
|
73655
|
+
has_entries = abap_true.
|
|
73656
|
+
ENDIF.
|
|
73657
|
+
|
|
73568
73658
|
DATA(fsdf) = COND #( WHEN foo <> bar THEN abap_true ELSE abap_false ).`,
|
|
73569
|
-
goodExample: `DATA(has_entries) = xsdbool( line IS NOT INITIAL ).
|
|
73570
|
-
|
|
73659
|
+
goodExample: `DATA(has_entries) = xsdbool( line IS NOT INITIAL ).
|
|
73660
|
+
|
|
73571
73661
|
DATA(fsdf) = xsdbool( foo <> bar ).`,
|
|
73572
73662
|
};
|
|
73573
73663
|
}
|
|
@@ -73685,15 +73775,15 @@ class UseClassBasedExceptions extends _abap_rule_1.ABAPRule {
|
|
|
73685
73775
|
shortDescription: `Use class based exceptions, checks interface and class definitions`,
|
|
73686
73776
|
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-class-based-exceptions`,
|
|
73687
73777
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
73688
|
-
badExample: `INTERFACE lif.
|
|
73689
|
-
METHODS load_data
|
|
73690
|
-
EXCEPTIONS
|
|
73691
|
-
invalid_parameter.
|
|
73778
|
+
badExample: `INTERFACE lif.
|
|
73779
|
+
METHODS load_data
|
|
73780
|
+
EXCEPTIONS
|
|
73781
|
+
invalid_parameter.
|
|
73692
73782
|
ENDINTERFACE.`,
|
|
73693
|
-
goodExample: `INTERFACE lif.
|
|
73694
|
-
METHODS load_data
|
|
73695
|
-
RAISING
|
|
73696
|
-
cx_something.
|
|
73783
|
+
goodExample: `INTERFACE lif.
|
|
73784
|
+
METHODS load_data
|
|
73785
|
+
RAISING
|
|
73786
|
+
cx_something.
|
|
73697
73787
|
ENDINTERFACE.`,
|
|
73698
73788
|
};
|
|
73699
73789
|
}
|
|
@@ -73753,15 +73843,15 @@ class UseLineExists extends _abap_rule_1.ABAPRule {
|
|
|
73753
73843
|
key: "use_line_exists",
|
|
73754
73844
|
title: "Use line_exists",
|
|
73755
73845
|
shortDescription: `Use line_exists, from 740sp02 and up`,
|
|
73756
|
-
extendedInformation: `
|
|
73757
|
-
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-line_exists-to-read-table-or-loop-at
|
|
73758
|
-
|
|
73846
|
+
extendedInformation: `
|
|
73847
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-line_exists-to-read-table-or-loop-at
|
|
73848
|
+
|
|
73759
73849
|
Not reported if the READ TABLE statement contains BINARY SEARCH.`,
|
|
73760
73850
|
tags: [_irule_1.RuleTag.Upport, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile],
|
|
73761
|
-
badExample: `READ TABLE my_table TRANSPORTING NO FIELDS WITH KEY key = 'A'.
|
|
73762
|
-
IF sy-subrc = 0.
|
|
73851
|
+
badExample: `READ TABLE my_table TRANSPORTING NO FIELDS WITH KEY key = 'A'.
|
|
73852
|
+
IF sy-subrc = 0.
|
|
73763
73853
|
ENDIF.`,
|
|
73764
|
-
goodExample: `IF line_exists( my_table[ key = 'A' ] ).
|
|
73854
|
+
goodExample: `IF line_exists( my_table[ key = 'A' ] ).
|
|
73765
73855
|
ENDIF.`,
|
|
73766
73856
|
};
|
|
73767
73857
|
}
|
|
@@ -73871,10 +73961,10 @@ class UseNew extends _abap_rule_1.ABAPRule {
|
|
|
73871
73961
|
key: "use_new",
|
|
73872
73962
|
title: "Use NEW",
|
|
73873
73963
|
shortDescription: `Checks for deprecated CREATE OBJECT statements.`,
|
|
73874
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-new-to-create-object
|
|
73875
|
-
|
|
73876
|
-
If the target variable is referenced in the CREATE OBJECT statement, no errors are issued
|
|
73877
|
-
|
|
73964
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-new-to-create-object
|
|
73965
|
+
|
|
73966
|
+
If the target variable is referenced in the CREATE OBJECT statement, no errors are issued
|
|
73967
|
+
|
|
73878
73968
|
Applicable from v740sp02 and up`,
|
|
73879
73969
|
badExample: `CREATE OBJECT ref.`,
|
|
73880
73970
|
goodExample: `ref = NEW #( ).`,
|
|
@@ -73972,13 +74062,13 @@ class WhenOthersLast extends _abap_rule_1.ABAPRule {
|
|
|
73972
74062
|
title: "WHEN OTHERS last",
|
|
73973
74063
|
shortDescription: `Checks that WHEN OTHERS is placed the last within a CASE statement.`,
|
|
73974
74064
|
tags: [_irule_1.RuleTag.SingleFile],
|
|
73975
|
-
badExample: `CASE bar.
|
|
73976
|
-
WHEN OTHERS.
|
|
73977
|
-
WHEN 2.
|
|
74065
|
+
badExample: `CASE bar.
|
|
74066
|
+
WHEN OTHERS.
|
|
74067
|
+
WHEN 2.
|
|
73978
74068
|
ENDCASE.`,
|
|
73979
|
-
goodExample: `CASE bar.
|
|
73980
|
-
WHEN 2.
|
|
73981
|
-
WHEN OTHERS.
|
|
74069
|
+
goodExample: `CASE bar.
|
|
74070
|
+
WHEN 2.
|
|
74071
|
+
WHEN OTHERS.
|
|
73982
74072
|
ENDCASE.`,
|
|
73983
74073
|
};
|
|
73984
74074
|
}
|
|
@@ -81060,7 +81150,7 @@ class DeleteDatabaseTranspiler {
|
|
|
81060
81150
|
transpile(node, traversal) {
|
|
81061
81151
|
const dbtab = node.findFirstExpression(abaplint.Expressions.DatabaseTable);
|
|
81062
81152
|
if (dbtab === undefined) {
|
|
81063
|
-
throw new Error("internal error,
|
|
81153
|
+
throw new Error("internal error, DeleteDatabaseTranspiler");
|
|
81064
81154
|
}
|
|
81065
81155
|
const table = new expressions_1.DatabaseTableTranspiler(false).transpile(dbtab, traversal);
|
|
81066
81156
|
const options = [];
|
|
@@ -101137,7 +101227,7 @@ async function run() {
|
|
|
101137
101227
|
if (!fs.existsSync(outputFolder)) {
|
|
101138
101228
|
fs.mkdirSync(outputFolder);
|
|
101139
101229
|
}
|
|
101140
|
-
writeObjects(output.objects, config.write_source_map, outputFolder, files);
|
|
101230
|
+
writeObjects(output.objects, config.write_source_map || false, outputFolder, files);
|
|
101141
101231
|
console.log(output.objects.length + " objects written to disk");
|
|
101142
101232
|
if (config.write_unit_tests === true) {
|
|
101143
101233
|
// breaking change? rename this output file,
|