All files / src/rules names_no_dash.ts

100% Statements 90/90
86.95% Branches 20/23
100% Functions 6/6
100% Lines 90/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 1x 1x 1x 1x 1x 11452x 11452x 11452x 11452x 11452x 34220x 34220x 34220x 34220x 34220x 34220x 34220x 34220x 34220x 11452x 11452x 7x 7x 11452x 11452x 10927x 10927x 11452x 11452x 247x 247x 11452x 11452x 276x 276x 276x 276x 12x 12x 264x 276x 193x 9x 9x 9x 2x 2x 2x 9x 193x 193x 3x 3x 3x 1x 1x 1x 3x 193x 193x 3x 3x 3x 1x 1x 1x 3x 193x 264x 276x 191x 191x 3x 3x 3x 191x 264x 264x 264x 11452x 11452x  
import * as Statements from "../abap/2_statements/statements";
import * as Expressions from "../abap/2_statements/expressions";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {Issue} from "../issue";
import {FormName} from "../abap/2_statements/expressions";
import {IRuleMetadata, RuleTag} from "./_irule";
import {ABAPFile} from "../abap/abap_file";
import {ABAPObject} from "../objects/_abap_object";
 
export class NamesNoDashConf extends BasicRuleConfig {
}
 
// todo, also check for other characters like %&$, rename rule? and extend to more kinds of identifiers?
export class NamesNoDash extends ABAPRule {
 
  private conf = new NamesNoDashConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "names_no_dash",
      title: "No dashes in FORM and DATA names",
      shortDescription: `Checks for a "-" in FORM, DATA, PARAMETER and SELECT-OPTION names`,
      tags: [RuleTag.SingleFile, RuleTag.Naming],
      badExample: "DATA foo-bar TYPE i.",
      goodExample: "DATA foobar TYPE i.",
    };
  }
 
  private getMessage(): string {
    return "No dash allowed in FORM and DATA names";
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: NamesNoDashConf): void {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile, obj: ABAPObject) {
    const issues: Issue[] = [];
 
    const struc = file.getStructure();
    if (struc === undefined) {
      return issues;
    }
 
    if (obj.getType() !== "CLAS" && obj.getType() !== "INTF") {
      for (const form of struc.findAllStatements(Statements.Form)) {
        const expr = form.findFirstExpression(FormName);
        const token = expr?.findDirectTokenByText("-");
        if (token) {
          const issue = Issue.atToken(file, token, this.getMessage(), this.getMetadata().key, this.conf.severity);
          issues.push(issue);
        }
      }
 
      for (const form of struc.findAllStatements(Statements.Parameter)) {
        const expr = form.findFirstExpression(Expressions.FieldSub);
        const token = expr?.findDirectTokenByText("-");
        if (token) {
          const issue = Issue.atToken(file, token, this.getMessage(), this.getMetadata().key, this.conf.severity);
          issues.push(issue);
        }
      }
 
      for (const form of struc.findAllStatements(Statements.SelectOption)) {
        const expr = form.findFirstExpression(Expressions.FieldSub);
        const token = expr?.findDirectTokenByText("-");
        if (token) {
          const issue = Issue.atToken(file, token, this.getMessage(), this.getMetadata().key, this.conf.severity);
          issues.push(issue);
        }
      }
    }
 
    for (const name of struc.findAllExpressions(Expressions.DefinitionName)) {
      const text = name.concatTokens();
      if (text.includes("-")) {
        const issue = Issue.atToken(file, name.getFirstToken(), this.getMessage(), this.getMetadata().key, this.conf.severity);
        issues.push(issue);
      }
    }
 
    return issues;
  }
 
}