All files / src/rules 7bit_ascii.ts

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

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 801x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10390x 10390x 10390x 10390x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 21124x 10390x 10390x 248x 248x 10390x 10390x 9877x 9877x 10390x 10390x 242x 242x 10390x 10390x 314x 314x 314x 331x 331x 261x 261x 261x 1740x 1740x 1x 1x 1x 1x 1x 1x 1x 1740x 1740x 1740x 1740x 1740x 1x 1x 1x 1x 1x 1x 1x 1740x 1740x 261x 331x 314x 314x 314x 10390x 10390x
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/
 
https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencharacter_set_guidl.htm
 
Checkes files with extensions ".abap" and ".asddls"`,
      tags: [RuleTag.SingleFile],
      badExample: `WRITE '뽑'.`,
      goodExample: `WRITE cl_abap_conv_in_ce=>uccp( 'BF51' ).`,
    };
  }
 
  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;
  }
 
}