All files / src/rules 7bit_ascii.ts

100% Statements 76/76
100% Branches 12/12
100% Functions 6/6
100% Lines 76/76

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 761x 1x 1x 1x 1x 1x 1x 1x 1x 1x 9361x 9361x 9361x 9361x 19027x 19027x 19027x 19027x 19027x 19027x 19027x 19027x 19027x 19027x 9361x 9361x 223x 223x 9361x 9361x 8898x 8898x 9361x 9361x 217x 217x 9361x 9361x 282x 282x 282x 299x 299x 240x 240x 240x 1619x 1619x 1x 1x 1x 1x 1x 1x 1x 1619x 1619x 1619x 1619x 1619x 1x 1x 1x 1x 1x 1x 1x 1619x 1619x 240x 299x 282x 282x 282x 9361x 9361x
import {Issue} from "../issue";
import {Position} from "../position";
import {BasicRuleConfig} from "./_basic_rule_config";
import {IObject} from "../objects/_iobject";
import {IRule, IRuleMetadata, RuleTag} from "./_irule";
import {IRegistry} from "../_iregistry";
 
export class SevenBitAsciiConf extends BasicRuleConfig {
}
 
export class SevenBitAscii implements IRule {
  private conf = new SevenBitAsciiConf();
 
  public getMetadata(): IRuleMetadata {
    return {
      key: "7bit_ascii",
      title: "Check for 7bit ascii",
      shortDescription: `Only allow characters from the 7bit ASCII set.`,
      extendedInformation: `https://docs.abapopenchecks.org/checks/05/
 
Checkes files with extension ".abap" and ".asddls"`,
      tags: [RuleTag.SingleFile],
    };
  }
 
  public initialize(_reg: IRegistry) {
    return this;
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: SevenBitAsciiConf) {
    this.conf = conf;
  }
 
  public run(obj: IObject): Issue[] {
    const output: Issue[] = [];
 
    for (const file of obj.getFiles()) {
      const filename = file.getFilename();
      if (filename.endsWith(".abap") || filename.endsWith(".asddls")) {
        const rows = file.getRawRows();
 
        for (let i = 0; i < rows.length; i++) {
          const found = /[\u007f-\uffff]/.exec(rows[i]);
          if (found !== null) {
            const column = found.index + 1;
            const start = new Position(i + 1, column);
            const end = new Position(i + 1, column + 1);
            const message = "Contains non 7 bit ascii character";
            const issue = Issue.atRange(file, start, end, message, this.getMetadata().key, this.conf.severity);
            output.push(issue);
          }
 
          // method getRawRows() splits by newline, so the carraige return
          // should always be last character if present
          const carriage = /\r.+$/.exec(rows[i]);
          if (carriage !== null) {
            const column = carriage.index + 1;
            const start = new Position(i + 1, column);
            const end = new Position(i + 1, column + 1);
            const message = "Dangling carriage return";
            const issue = Issue.atRange(file, start, end, message, this.getMetadata().key, this.conf.severity);
            output.push(issue);
          }
 
        }
      }
    }
 
    return output;
  }
 
}