All files / src/rules parser_error.ts

90.63% Statements 29/32
75% Branches 6/8
100% Functions 5/5
90.63% Lines 29/32

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 7266x     21667x                     7008x       114x       145x   145x 771x 764x     7x         7x 7x 7x 7x       145x 1x 1x 1x 1x 1x         145x      
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;
      }
 
      Iif (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()) {
        Eif (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;
  }
 
}