@abaplint/core
Version:
abaplint - Core API
188 lines (183 loc) • 7.85 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.UnnecessaryPragma = exports.UnnecessaryPragmaConf = void 0;
const issue_1 = require("../issue");
const Statements = require("../abap/2_statements/statements");
const Expressions = require("../abap/2_statements/expressions");
const _abap_rule_1 = require("./_abap_rule");
const _basic_rule_config_1 = require("./_basic_rule_config");
const _statement_1 = require("../abap/2_statements/statements/_statement");
const _irule_1 = require("./_irule");
const edit_helper_1 = require("../edit_helper");
class UnnecessaryPragmaConf extends _basic_rule_config_1.BasicRuleConfig {
constructor() {
super(...arguments);
/** Allow NO_TEXT in global CLAS and INTF definitions,
its added automatically by SE24 in some cases where it should not */
this.allowNoTextGlobal = false;
}
}
exports.UnnecessaryPragmaConf = UnnecessaryPragmaConf;
class UnnecessaryPragma extends _abap_rule_1.ABAPRule {
constructor() {
super(...arguments);
this.conf = new UnnecessaryPragmaConf();
}
getMetadata() {
return {
key: "unnecessary_pragma",
title: "Unnecessary Pragma",
shortDescription: `Finds pragmas which can be removed`,
extendedInformation: `* NO_HANDLER with handler
* NEEDED without definition
* NO_TEXT without texts
* SUBRC_OK where sy-subrc is checked
NO_HANDLER inside macros are not checked`,
tags: [_irule_1.RuleTag.SingleFile],
badExample: `TRY.
...
CATCH zcx_abapgit_exception ##NO_HANDLER.
RETURN. " it has a handler
ENDTRY.
MESSAGE w125(zbar) WITH c_foo INTO message ##NEEDED ##NO_TEXT.
SELECT SINGLE * FROM tadir INTO @DATA(sdfs) ##SUBRC_OK.
IF sy-subrc <> 0.
ENDIF.`,
goodExample: `TRY.
...
CATCH zcx_abapgit_exception.
RETURN.
ENDTRY.
MESSAGE w125(zbar) WITH c_foo INTO message.
SELECT SINGLE * FROM tadir INTO @DATA(sdfs).
IF sy-subrc <> 0.
ENDIF.
DATA: BEGIN OF blah ##NEEDED,
test1 TYPE string,
test2 TYPE string,
END OF blah.`,
};
}
getConfig() {
return this.conf;
}
setConfig(conf) {
this.conf = conf;
}
runParsed(file) {
const issues = [];
let noHandler = false;
let globalDefinition = false;
const statements = file.getStatements();
for (let i = 0; i < statements.length; i++) {
const statement = statements[i];
const nextStatement = statements[i + 1];
if (statement.get() instanceof Statements.EndTry) {
noHandler = false;
}
else if (statement.get() instanceof Statements.ClassDefinition
|| statement.get() instanceof Statements.Interface) {
if (statement.findDirectExpression(Expressions.ClassGlobal)) {
globalDefinition = true;
}
}
else if (statement.get() instanceof Statements.EndClass
|| statement.get() instanceof Statements.EndInterface) {
globalDefinition = false;
}
else if (statement.get() instanceof _statement_1.Comment) {
continue;
}
else if (noHandler === true && !(statement.get() instanceof Statements.Catch)) {
const message = "NO_HANDLER pragma or pseudo comment can be removed";
const issue = issue_1.Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity);
issues.push(issue);
noHandler = false;
}
else {
noHandler = this.containsNoHandler(statement, statements[i + 1]);
}
if (this.getConfig().allowNoTextGlobal === true && globalDefinition === true) {
// skip
}
else {
issues.push(...this.checkText(statement, file));
}
issues.push(...this.checkNeeded(statement, file));
if (globalDefinition === false) {
issues.push(...this.checkSubrc(statement, nextStatement, file));
}
}
return issues;
}
checkText(statement, file) {
const p = statement.getPragmas().find(t => t.getStr().toUpperCase() === "##NO_TEXT");
if (p === undefined) {
return [];
}
if (statement.findFirstExpression(Expressions.ConstantString) === undefined
&& statement.findFirstExpression(Expressions.StringTemplate) === undefined) {
const message = "There is no text, NO_TEXT can be removed";
const fix = edit_helper_1.EditHelper.deleteToken(file, p);
return [issue_1.Issue.atToken(file, p, message, this.getMetadata().key, this.getConfig().severity, fix)];
}
return [];
}
checkSubrc(statement, next, file) {
const p = statement.getPragmas().find(t => t.getStr().toUpperCase() === "##SUBRC_OK");
if (p === undefined) {
return [];
}
const concat = (next === null || next === void 0 ? void 0 : next.concatTokens().toUpperCase()) || "";
if (concat.includes(" SY-SUBRC")) {
const message = "SUBRC_OK can be removed as sy-subrc is checked";
const fix = edit_helper_1.EditHelper.deleteToken(file, p);
return [issue_1.Issue.atToken(file, p, message, this.getMetadata().key, this.getConfig().severity, fix)];
}
return [];
}
checkNeeded(statement, file) {
const p = statement.getPragmas().find(t => t.getStr().toUpperCase() === "##NEEDED");
if (p === undefined) {
return [];
}
if (statement.findFirstExpression(Expressions.InlineData) === undefined
&& !(statement.get() instanceof Statements.Parameter)
&& !(statement.get() instanceof Statements.Data)
&& !(statement.get() instanceof Statements.DataBegin)
&& !(statement.get() instanceof Statements.ClassData)
&& !(statement.get() instanceof Statements.ClassDataBegin)
&& !(statement.get() instanceof Statements.Type)
&& !(statement.get() instanceof Statements.Form)
&& !(statement.get() instanceof Statements.Tables)
&& !(statement.get() instanceof Statements.TypeBegin)
&& !(statement.get() instanceof Statements.Constant)
&& !(statement.get() instanceof Statements.ConstantBegin)
&& !(statement.get() instanceof Statements.TypeEnum)
&& !(statement.get() instanceof Statements.TypeEnumBegin)
&& !(statement.get() instanceof Statements.MethodImplementation)
&& !(statement.get() instanceof Statements.MethodDef)
&& statement.findFirstExpression(Expressions.InlineFS) === undefined) {
const message = "There is no data definition, NEEDED can be removed";
const fix = edit_helper_1.EditHelper.deleteToken(file, p);
return [issue_1.Issue.atToken(file, p, message, this.getMetadata().key, this.getConfig().severity, fix)];
}
return [];
}
containsNoHandler(statement, next) {
for (const t of statement.getPragmas()) {
if (t.getStr().toUpperCase() === "##NO_HANDLER") {
return true;
}
}
if (next
&& next.get() instanceof _statement_1.Comment
&& !(statement.get() instanceof _statement_1.MacroContent)
&& next.concatTokens().toUpperCase().includes("#EC NO_HANDLER")) {
return true;
}
return false;
}
}
exports.UnnecessaryPragma = UnnecessaryPragma;
//# sourceMappingURL=unnecessary_pragma.js.map