UNPKG

@abaplint/core

Version:
188 lines (183 loc) • 7.85 kB
"use strict"; 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