All files / src/rules macro_naming.ts

97.4% Statements 75/77
93.75% Branches 15/16
100% Functions 6/6
97.4% Lines 75/77

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 771x 1x 1x 1x 1x 1x 1x 1x 1x 1x 25799x 25799x 25799x 25799x 1x 12900x 12900x 12900x 12900x 12900x 12900x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 100338x 12900x 12900x 12356x 12356x 12900x 12900x 255x 255x 255x 12900x 12900x 277x 277x 277x 3x 3x 274x 277x 1581x 1581x 1574x 1574x 7x 7x 1581x     7x 7x 7x 1581x 2x 1581x 5x 5x 5x 5x 1581x 1581x 274x 274x 274x 12900x 12900x
import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import * as Statements from "../abap/2_statements/statements";
import * as Expressions from "../abap/2_statements/expressions";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
import {ABAPObject} from "../objects/_abap_object";
import {TypePool} from "../objects";
 
export class MacroNamingConf extends BasicRuleConfig {
  /** The pattern for macros, case insensitive */
  public pattern: string = "^_.+$";
}
 
export class MacroNaming extends ABAPRule {
 
  private conf = new MacroNamingConf();
  private regex = new RegExp(this.conf.pattern, "i");
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "macro_naming",
      title: "Macro naming conventions",
      shortDescription: `Allows you to enforce a pattern for macro definitions`,
      extendedInformation: `Use rule "avoid_use" to avoid macros altogether.`,
      tags: [RuleTag.Naming, RuleTag.SingleFile],
      badExample: `DEFINE something.
END-OF-DEFINITION.`,
      goodExample: `DEFINE _something.
END-OF-DEFINITION.`,
    };
  }
 
  public getConfig(): MacroNamingConf {
    return this.conf;
  }
 
  public setConfig(conf: MacroNamingConf) {
    this.conf = conf;
    this.regex = new RegExp(this.conf.pattern, "i");
  }
 
  public runParsed(file: ABAPFile, obj: ABAPObject) {
    const issues: Issue[] = [];
 
    if (obj instanceof TypePool) {
      return [];
    }
 
    for (const stat of file.getStatements()) {
 
      if (!(stat.get() instanceof Statements.Define)) {
        continue;
      }
 
      const expr = stat.findDirectExpression(Expressions.MacroName);
      if (expr === undefined) {
        continue;
      }
 
      const token = expr.getFirstToken();
 
      if (this.regex.exec(token.getStr())) {
        continue;
      } else {
        const message = "Bad macro name naming, expected \"" + this.conf.pattern + "\", got \"" + token.getStr() + "\"";
        const issue = Issue.atToken(file, token, message, this.getMetadata().key, this.conf.severity);
        issues.push(issue);
      }
 
    }
 
    return issues;
  }
 
}