@abaplint/core 2.120.53 → 2.120.55
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/src/abap/2_statements/statements/call_transaction.js +1 -1
- package/build/src/registry.js +1 -1
- package/build/src/rules/align_parameters.js +1 -1
- package/build/src/rules/constant_classes.js +1 -1
- package/build/src/rules/downport.js +30 -1
- package/build/src/rules/index.js +1 -0
- package/build/src/rules/keyword_case.js +1 -1
- package/build/src/rules/prefer_insert_into_table.js +110 -0
- package/build/src/rules/sequential_blank.js +2 -0
- package/package.json +1 -1
|
@@ -8,7 +8,7 @@ class CallTransaction {
|
|
|
8
8
|
getMatcher() {
|
|
9
9
|
const options = (0, combi_1.seq)("OPTIONS FROM", expressions_1.Source);
|
|
10
10
|
const messages = (0, combi_1.seq)("MESSAGES INTO", expressions_1.Target);
|
|
11
|
-
const auth = (0, combi_1.seq)((0, combi_1.altPrio)("WITH", "WITHOUT"), "AUTHORITY-CHECK");
|
|
11
|
+
const auth = (0, combi_1.ver)(version_1.Release.v740sp02, (0, combi_1.seq)((0, combi_1.altPrio)("WITH", "WITHOUT"), "AUTHORITY-CHECK"), { also: combi_1.AlsoIn.OpenABAP });
|
|
12
12
|
const perm = (0, combi_1.per)((0, combi_1.seq)("UPDATE", expressions_1.Source), "AND SKIP FIRST SCREEN", options, messages, (0, combi_1.seq)("MODE", expressions_1.Source));
|
|
13
13
|
const ret = (0, combi_1.seq)("CALL TRANSACTION", expressions_1.Source, (0, combi_1.optPrio)(auth), (0, combi_1.optPrio)((0, combi_1.seq)("USING", expressions_1.Source)), (0, combi_1.opt)(perm));
|
|
14
14
|
return (0, combi_1.verNotLang)(version_1.LanguageVersion.Cloud, ret);
|
package/build/src/registry.js
CHANGED
|
@@ -64,7 +64,7 @@ class AlignParameters extends _abap_rule_1.ABAPRule {
|
|
|
64
64
|
* CREATE OBJECT statements
|
|
65
65
|
* RAISE EVENT statements
|
|
66
66
|
|
|
67
|
-
https://github.com/SAP/styleguides/blob/
|
|
67
|
+
https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#align-parameters
|
|
68
68
|
|
|
69
69
|
Does not take effect on non functional method calls, use https://rules.abaplint.org/functional_writing/
|
|
70
70
|
|
|
@@ -57,7 +57,7 @@ class ConstantClasses {
|
|
|
57
57
|
key: "constant_classes",
|
|
58
58
|
title: "Validate constant classes",
|
|
59
59
|
shortDescription: `Checks that a class contains exactly the constants corresponding to a domain's fixed values.`,
|
|
60
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-
|
|
60
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-enum-to-constants-interfaces`,
|
|
61
61
|
tags: [_irule_1.RuleTag.Styleguide],
|
|
62
62
|
};
|
|
63
63
|
}
|
|
@@ -381,7 +381,11 @@ Make sure to test the downported code, it might not always be completely correct
|
|
|
381
381
|
return found;
|
|
382
382
|
}
|
|
383
383
|
*/
|
|
384
|
-
let found = this.
|
|
384
|
+
let found = this.stripCallTransactionAuthorityCheck(high, lowFile);
|
|
385
|
+
if (found) {
|
|
386
|
+
return found;
|
|
387
|
+
}
|
|
388
|
+
found = this.downportEnum(low, high, lowFile, highSyntax, highFile);
|
|
385
389
|
if (found) {
|
|
386
390
|
return found;
|
|
387
391
|
}
|
|
@@ -2875,6 +2879,31 @@ ${indentation} output = ${uniqueName}.\n`;
|
|
|
2875
2879
|
}
|
|
2876
2880
|
return false;
|
|
2877
2881
|
}
|
|
2882
|
+
/** WITH/WITHOUT AUTHORITY-CHECK on CALL TRANSACTION requires v740sp02, so the statement is
|
|
2883
|
+
* Unknown in the low version, note that only WITHOUT is handled here */
|
|
2884
|
+
stripCallTransactionAuthorityCheck(high, lowFile) {
|
|
2885
|
+
if (!(high.get() instanceof Statements.CallTransaction)) {
|
|
2886
|
+
return undefined;
|
|
2887
|
+
}
|
|
2888
|
+
else if (this.lowReg.getConfig().isOpenABAP()) {
|
|
2889
|
+
// open-abap supports the addition
|
|
2890
|
+
return undefined;
|
|
2891
|
+
}
|
|
2892
|
+
const tokens = high.getTokens();
|
|
2893
|
+
// the lexer splits "AUTHORITY-CHECK" into three tokens: AUTHORITY, -, CHECK
|
|
2894
|
+
for (let i = 1; i < tokens.length - 3; i++) {
|
|
2895
|
+
if (tokens[i].getStr().toUpperCase() === "WITHOUT"
|
|
2896
|
+
&& tokens[i + 1].getStr().toUpperCase() === "AUTHORITY"
|
|
2897
|
+
&& tokens[i + 2].getStr() === "-"
|
|
2898
|
+
&& tokens[i + 3].getStr().toUpperCase() === "CHECK") {
|
|
2899
|
+
// also remove the preceding space so no double space is left behind
|
|
2900
|
+
const fix = edit_helper_1.EditHelper.deleteRange(lowFile, tokens[i - 1].getEnd(), tokens[i + 3].getEnd());
|
|
2901
|
+
const message = "Remove WITHOUT AUTHORITY-CHECK from CALL TRANSACTION";
|
|
2902
|
+
return issue_1.Issue.atToken(lowFile, tokens[i], message, this.getMetadata().key, this.conf.severity, fix);
|
|
2903
|
+
}
|
|
2904
|
+
}
|
|
2905
|
+
return undefined;
|
|
2906
|
+
}
|
|
2878
2907
|
replaceXsdBool(node, lowFile, highSyntax) {
|
|
2879
2908
|
if (this.lowReg.getConfig().isOpenABAP()) {
|
|
2880
2909
|
return undefined;
|
package/build/src/rules/index.js
CHANGED
|
@@ -145,6 +145,7 @@ __exportStar(require("./parser_missing_space"), exports);
|
|
|
145
145
|
__exportStar(require("./pragma_style"), exports);
|
|
146
146
|
__exportStar(require("./prefer_corresponding"), exports);
|
|
147
147
|
__exportStar(require("./prefer_inline"), exports);
|
|
148
|
+
__exportStar(require("./prefer_insert_into_table"), exports);
|
|
148
149
|
__exportStar(require("./prefer_is_not"), exports);
|
|
149
150
|
__exportStar(require("./prefer_pragmas"), exports);
|
|
150
151
|
__exportStar(require("./prefer_raise_exception_new"), exports);
|
|
@@ -146,7 +146,7 @@ class KeywordCase extends _abap_rule_1.ABAPRule {
|
|
|
146
146
|
key: "keyword_case",
|
|
147
147
|
title: "Keyword case",
|
|
148
148
|
shortDescription: `Checks that keywords have the same case. Non-keywords must be lower case.`,
|
|
149
|
-
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-your-
|
|
149
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#use-your-teams-abap-formatter-settings`,
|
|
150
150
|
tags: [_irule_1.RuleTag.Styleguide, _irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Quickfix],
|
|
151
151
|
badExample: `write 'hello world'.`,
|
|
152
152
|
goodExample: `WRITE 'hello world'.`,
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PreferInsertIntoTable = exports.PreferInsertIntoTableConf = void 0;
|
|
37
|
+
const issue_1 = require("../issue");
|
|
38
|
+
const Statements = __importStar(require("../abap/2_statements/statements"));
|
|
39
|
+
const _abap_rule_1 = require("./_abap_rule");
|
|
40
|
+
const _basic_rule_config_1 = require("./_basic_rule_config");
|
|
41
|
+
const _irule_1 = require("./_irule");
|
|
42
|
+
const edit_helper_1 = require("../edit_helper");
|
|
43
|
+
class PreferInsertIntoTableConf extends _basic_rule_config_1.BasicRuleConfig {
|
|
44
|
+
}
|
|
45
|
+
exports.PreferInsertIntoTableConf = PreferInsertIntoTableConf;
|
|
46
|
+
class PreferInsertIntoTable extends _abap_rule_1.ABAPRule {
|
|
47
|
+
constructor() {
|
|
48
|
+
super(...arguments);
|
|
49
|
+
this.conf = new PreferInsertIntoTableConf();
|
|
50
|
+
}
|
|
51
|
+
getMetadata() {
|
|
52
|
+
return {
|
|
53
|
+
key: "prefer_insert_into_table",
|
|
54
|
+
title: "Prefer INSERT INTO TABLE over APPEND",
|
|
55
|
+
shortDescription: `Prefer INSERT INTO TABLE over APPEND`,
|
|
56
|
+
// eslint-disable-next-line max-len
|
|
57
|
+
extendedInformation: `INSERT INTO TABLE respects the table type, while APPEND always tries to add to the end. This will dump if the sort order of a sorted table would change.\n\nhttps://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-insert-into-table-to-append-to`,
|
|
58
|
+
tags: [_irule_1.RuleTag.SingleFile, _irule_1.RuleTag.Styleguide, _irule_1.RuleTag.Quickfix],
|
|
59
|
+
badExample: `APPEND row TO itab.`,
|
|
60
|
+
goodExample: `INSERT row INTO TABLE itab.`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
getConfig() { return this.conf; }
|
|
64
|
+
setConfig(conf) { this.conf = conf; }
|
|
65
|
+
runParsed(file) {
|
|
66
|
+
const issues = [];
|
|
67
|
+
for (const stat of file.getStatements()) {
|
|
68
|
+
if (!(stat.get() instanceof Statements.Append)) {
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (stat.concatTokens().toUpperCase().includes(" SORTED BY ")) {
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
const fix = this.buildFix(file, stat);
|
|
75
|
+
const message = "Prefer INSERT INTO TABLE over APPEND";
|
|
76
|
+
issues.push(issue_1.Issue.atStatement(file, stat, message, this.getMetadata().key, this.conf.severity, fix));
|
|
77
|
+
}
|
|
78
|
+
return issues;
|
|
79
|
+
}
|
|
80
|
+
buildFix(file, stat) {
|
|
81
|
+
const tokens = stat.getTokens();
|
|
82
|
+
// Find the APPEND token (first token)
|
|
83
|
+
const appendToken = tokens[0];
|
|
84
|
+
if (appendToken.getStr().toUpperCase() !== "APPEND") {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
// Find the last "TO" token that precedes the table target.
|
|
88
|
+
// In all fixable forms the table target follows the last standalone "TO":
|
|
89
|
+
// APPEND row TO itab
|
|
90
|
+
// APPEND LINES OF itab2 TO itab
|
|
91
|
+
// APPEND LINES OF itab2 FROM 1 TO 3 TO itab <- last TO is the table
|
|
92
|
+
// APPEND INITIAL LINE TO itab
|
|
93
|
+
let lastToIndex = -1;
|
|
94
|
+
for (let i = tokens.length - 1; i >= 0; i--) {
|
|
95
|
+
if (tokens[i].getStr().toUpperCase() === "TO") {
|
|
96
|
+
lastToIndex = i;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (lastToIndex < 0) {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
const toToken = tokens[lastToIndex];
|
|
104
|
+
const fix1 = edit_helper_1.EditHelper.replaceToken(file, appendToken, "INSERT");
|
|
105
|
+
const fix2 = edit_helper_1.EditHelper.replaceToken(file, toToken, "INTO TABLE");
|
|
106
|
+
return edit_helper_1.EditHelper.merge(fix1, fix2);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.PreferInsertIntoTable = PreferInsertIntoTable;
|
|
110
|
+
//# sourceMappingURL=prefer_insert_into_table.js.map
|
|
@@ -30,6 +30,8 @@ class SequentialBlank extends _abap_rule_1.ABAPRule {
|
|
|
30
30
|
key: "sequential_blank",
|
|
31
31
|
title: "Sequential blank lines",
|
|
32
32
|
shortDescription: `Checks that code does not contain more than the configured number of blank lines in a row.`,
|
|
33
|
+
// eslint-disable-next-line max-len
|
|
34
|
+
extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#add-a-single-blank-line-to-separate-things-but-not-more`,
|
|
33
35
|
tags: [_irule_1.RuleTag.Whitespace, _irule_1.RuleTag.Quickfix, _irule_1.RuleTag.SingleFile],
|
|
34
36
|
};
|
|
35
37
|
}
|