All files / src/rules prefer_pragmas.ts

100% Statements 78/78
100% Branches 14/14
100% Functions 6/6
100% Lines 78/78

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 791x 1x 1x 1x 1x 1x 1x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 29365x 1x 14684x 14684x 14684x 14684x 100396x 100396x 100396x 100396x 100396x 100396x 100396x 100396x 100396x 100396x 14684x 14684x 14423x 14423x 14684x 14684x 264x 264x 14684x 14684x 294x 294x 294x 294x 294x 1651x 1622x 1622x 29x 29x 1651x 20x 20x 9x 1651x 36x 9x 9x 9x 36x 9x 294x 294x 294x 14684x 14684x  
import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
import {Comment} from "../abap/2_statements/statements/_statement";
 
export class PreferPragmasConf extends BasicRuleConfig {
  public check: {pseudo: string, pragma: string}[] = [
    {
      pseudo: "#EC CI_SUBRC",
      pragma: "SUBRC_OK",
    },
    {
      pseudo: "#EC NEEDED",
      pragma: "NEEDED",
    },
    {
      pseudo: "#EC NOTEXT",
      pragma: "NO_TEXT",
    },
    {
      pseudo: "#EC NO_HANDLER",
      pragma: "NO_HANDLER",
    },
  ];
}
 
export class PreferPragmas extends ABAPRule {
  private conf = new PreferPragmasConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "prefer_pragmas",
      title: "prefer pragmas over pseudo comments ",
      shortDescription: `prefer pragmas over pseudo comments`,
      extendedInformation: `https://github.com/SAP/styleguides/blob/main/clean-abap/CleanABAP.md#prefer-pragmas-to-pseudo-comments`,
      tags: [RuleTag.SingleFile, RuleTag.Styleguide],
      badExample: `DATA foo1 TYPE i. "#EC NEEDED`,
      goodExample: `DATA foo2 TYPE i ##NEEDED.`,
    };
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: PreferPragmasConf) {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile) {
    const issues: Issue[] = [];
 
    const config = this.getConfig();
 
    for (const statement of file.getStatements()) {
      if (!(statement.get() instanceof Comment)) {
        continue;
      }
 
      const concat = statement.concatTokens().toUpperCase();
      if (concat.includes("#EC") === false) {
        continue;
      }
 
      for (const check of config.check) {
        if (concat.includes(check.pseudo.toUpperCase())) {
          const message = `Prefer pragma ${check.pragma}`;
          issues.push(Issue.atStatement(file, statement, message, this.getMetadata().key, this.getConfig().severity));
        }
      }
    }
 
    return issues;
  }
 
}