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 25893x 25893x 25893x 25893x 1x 12947x 12947x 12947x 12947x 12947x 12947x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 113117x 12947x 12947x 12403x 12403x 12947x 12947x 255x 255x 255x 12947x 12947x 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 12947x 12947x
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;
  }
 
}