All files / src/rules parser_error.ts

95.59% Statements 65/68
90.91% Branches 10/11
100% Functions 5/5
95.59% Lines 65/68

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 681x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7654x 7654x 7654x 7654x 22822x 22822x 22822x 22822x 22822x 22822x 22822x 22822x 22822x 7654x 7654x 7346x 7346x 7654x 7654x 139x 139x 7654x 7654x 166x 166x 166x 884x 877x 877x 7x 884x       884x 7x 7x 7x 7x 7x 884x 166x 166x 1x 1x 1x 1x 1x 1x 1x 1x 166x 166x 166x 7654x 7654x
import {Issue} from "../issue";
import {Unknown} from "../abap/2_statements/statements/_statement";
import {ABAPRule} from "./_abap_rule";
import {BasicRuleConfig} from "./_basic_rule_config";
import {STATEMENT_MAX_TOKENS} from "../abap/2_statements/statement_parser";
import {RuleTag} from "./_irule";
import {Version} from "../version";
import {ABAPFile} from "../abap/abap_file";
 
export class ParserErrorConf extends BasicRuleConfig {
}
 
export class ParserError extends ABAPRule {
  private conf = new ParserErrorConf();
 
  public getMetadata() {
    return {
      key: "parser_error",
      title: "Parser error",
      shortDescription: `Checks for syntax not recognized by abaplint.
 
See recognized syntax at https://syntax.abaplint.org`,
      tags: [RuleTag.Syntax, RuleTag.SingleFile],
    };
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: ParserErrorConf) {
    this.conf = conf;
  }
 
  public runParsed(file: ABAPFile) {
    const issues: Issue[] = [];
 
    for (const statement of file.getStatements()) {
      if (!(statement.get() instanceof Unknown)) {
        continue;
      }
 
      if (statement.getTokens().length > STATEMENT_MAX_TOKENS) {
        const message = "Statement too long, refactor statement";
        const issue = Issue.atToken(file, statement.getTokens()[0], message, this.getMetadata().key, this.conf.severity);
        issues.push(issue);
      } else {
        const tok = statement.getFirstToken();
        const message = "Statement does not exist in ABAP" + this.reg.getConfig().getVersion() + "(or a parser error), \"" + tok.getStr() + "\"";
        const issue = Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity);
        issues.push(issue);
      }
    }
 
    if (this.reg.getConfig().getVersion() === Version.v700) {
      for (const statement of file.getStatements()) {
        if (statement.getPragmas().length > 0) {
          const message = "Pragmas not allowed in v700";
          const issue = Issue.atStatement(file, statement, message, this.getMetadata().key, this.conf.severity);
          issues.push(issue);
        }
      }
    }
 
    return issues;
  }
 
}