All files / src/rules space_before_colon.ts

96.96% Statements 64/66
91.66% Branches 11/12
100% Functions 6/6
96.96% Lines 64/66

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 661x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10328x 10328x 10328x 10328x 10328x 30812x 30812x 30812x 30812x 30812x 30812x 30812x 30812x 30812x 30812x 10328x 10328x 2x 2x 10328x 10328x 9814x 9814x 10328x 10328x 241x 241x 10328x 10328x 257x 257x 257x 257x 257x 5838x     5838x 5838x 5838x 2x 2x 2x 2x 2x 2x 2x 2x 5838x 5838x 257x 257x 257x 10328x 10328x
import {Position} from "../position";
import {ABAPFile} from "../abap/abap_file";
import {EditHelper} from "../edit_helper";
import {Issue} from "../issue";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IRuleMetadata, RuleTag} from "./_irule";
 
export class SpaceBeforeColonConf extends BasicRuleConfig {
}
 
export class SpaceBeforeColon extends ABAPRule {
 
  private conf = new SpaceBeforeColonConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "space_before_colon",
      title: "Space before colon",
      shortDescription: `Checks that there are no spaces in front of colons in chained statements.`,
      extendedInformation: `https://docs.abapopenchecks.org/checks/80/`,
      tags: [RuleTag.Whitespace, RuleTag.SingleFile, RuleTag.Quickfix],
      badExample: `DATA : foo TYPE string.`,
      goodExample: `DATA: foo TYPE string.`,
    };
  }
 
  private getMessage(): string {
    return "Remove space before colon";
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: SpaceBeforeColonConf) {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile) {
    const issues: Issue[] = [];
 
    let prev = file.getTokens()[0];
 
    for (const token of file.getTokens()) {
      if (token.getStr() === ":" && !prev) {
        const issue = Issue.atToken(file, token, this.getMessage(), this.getMetadata().key, this.conf.severity);
        issues.push(issue);
      } else if (token.getStr() === ":"
          && prev.getRow() === token.getRow()
          && prev.getCol() + prev.getStr().length < token.getCol()) {
        const start = new Position(token.getRow(), prev.getEnd().getCol());
        const end = new Position(token.getRow(), token.getStart().getCol());
        const fix = EditHelper.deleteRange(file, start, end);
        const issue = Issue.atRowRange(file, start.getRow(),
                                       start.getCol(), end.getCol(),
                                       this.getMessage(), this.getMetadata().key, this.conf.severity, fix);
        issues.push(issue);
      }
      prev = token;
    }
 
    return issues;
  }
 
}