All files / src/rules local_class_naming.ts

97.67% Statements 84/86
95.24% Branches 20/21
100% Functions 7/7
97.67% Lines 84/86

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 79 80 81 82 83 84 85 861x 1x 1x 1x 1x 1x 1x 1x 1x 15309x 15309x 15309x 15309x 15309x 15309x 15309x 15309x 1x 7655x 7655x 7655x 7655x 7655x 22843x 22843x 22843x 22843x 22843x 22843x 22843x 7655x 7655x 27x 27x 27x 27x 7655x 7655x 7346x 7346x 7655x 7655x 141x 141x 7655x 7655x 169x 169x 1x 1x 169x 169x 169x 169x 92x 28x 28x 64x 64x 64x 64x 92x 7x 92x 6x 57x 51x 51x 92x     64x 64x 92x 27x 27x 27x 27x 27x 27x 27x 92x 169x 169x 7655x 7655x
import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import {NamingRuleConfig} from "./_naming_rule_config";
import {NameValidator} from "../utils/name_validator";
import {RuleTag} from "./_irule";
import {ABAPObject} from "../objects/_abap_object";
import {DDIC} from "../ddic";
import {ABAPFile} from "../abap/abap_file";
 
export class LocalClassNamingConf extends NamingRuleConfig {
  /** The pattern for local class names */
  public local: string = "^LCL_.+$";
  /** The pattern for local exception names */
  public exception: string = "^LCX_.+$";
  /** The pattern for local test class names */
  public test: string = "^LTCL_.+$";
}
 
export class LocalClassNaming extends ABAPRule {
 
  private conf = new LocalClassNamingConf();
 
  public getMetadata() {
    return {
      key: "local_class_naming",
      title: "Local class naming conventions",
      shortDescription: `Allows you to enforce a pattern, such as a prefix, for local class names.`,
      tags: [RuleTag.Naming, RuleTag.SingleFile],
    };
  }
 
  private getDescription(expected: string, actual: string): string {
    return this.conf.patternKind === "required" ?
      "Local class name does not match pattern " + expected + ": " + actual :
      "Local class name must not match pattern " + expected + ": " + actual;
  }
 
  public getConfig(): LocalClassNamingConf {
    return this.conf;
  }
 
  public setConfig(conf: LocalClassNamingConf) {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile, obj: ABAPObject): Issue[] {
    const issues: Issue[] = [];
    if (this.conf.patternKind === undefined) {
      this.conf.patternKind = "required";
    }
 
    const ddic = new DDIC(this.reg);
 
    for (const classDef of file.getInfo().listClassDefinitions()) {
      if (classDef.isGlobal) {
        continue;
      }
 
      const className = classDef.name;
      let expected = "";
 
      if (classDef.isForTesting) {
        expected = this.conf.test;
      } else if (ddic.isException(classDef, obj) ) {
        expected = this.conf.exception;
      } else {
        expected = this.conf.local;
      }
      if (expected === undefined || expected.length === 0) {
        continue;
      }
      const regex = new RegExp(expected, "i");
 
      if (NameValidator.violatesRule(className, regex, this.conf)) {
        issues.push(
          Issue.atIdentifier(
            classDef.identifier,
            this.getDescription(expected, className),
            this.getMetadata().key,
            this.conf.severity));
      }
    }
    return issues;
  }
 
}