All files / src/rules local_class_naming.ts

97.77% Statements 88/90
95.23% Branches 20/21
100% Functions 7/7
97.77% Lines 88/90

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 86 87 88 89 90 911x 1x 1x 1x 1x 1x 1x 1x 1x 23427x 23427x 23427x 23427x 23427x 23427x 23427x 23427x 1x 11714x 11714x 11714x 11714x 11714x 35048x 35048x 35048x 35048x 35048x 35048x 35048x 35048x 35048x 35048x 35048x 11714x 11714x 49x 49x 49x 49x 11714x 11714x 11175x 11175x 11714x 11714x 255x 255x 11714x 11714x 291x 291x 1x 1x 291x 291x 291x 291x 147x 47x 47x 100x 100x 100x 100x 147x 7x 147x 6x 93x 87x 87x 147x     100x 100x 147x 49x 49x 49x 49x 49x 49x 49x 147x 291x 291x 11714x 11714x  
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],
      badExample: `CLASS helper DEFINITION.
ENDCLASS.`,
      goodExample: `CLASS lcl_helper DEFINITION.
ENDCLASS.`,
    };
  }
 
  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;
  }
 
}