All files / src/rules parser_error.ts

96.34% Statements 79/82
92.85% Branches 13/14
100% Functions 6/6
96.34% Lines 79/82

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 80 81 821x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11300x 11300x 11300x 11300x 11300x 33753x 33753x 33753x 33753x 33753x 33753x 33753x 33753x 33753x 11300x 11300x 253x 253x 253x 11300x 11300x 10802x 10802x 11300x 11300x 232x 232x 11300x 11300x 322x 322x 322x 322x 322x 256x 263x 263x 1434x 1423x 1423x 11x 1434x       1434x 11x 11x 11x 11x 11x 1434x 263x 263x 1x 1x 1x 1x 1x 1x 1x 1x 263x 256x 322x 322x 322x 11300x 11300x
import {Issue} from "../issue";
import {Unknown} from "../abap/2_statements/statements/_statement";
import {BasicRuleConfig} from "./_basic_rule_config";
import {STATEMENT_MAX_TOKENS} from "../abap/2_statements/statement_parser";
import {IRule, RuleTag} from "./_irule";
import {Version} from "../version";
import {ABAPObject} from "../objects/_abap_object";
import {IRegistry} from "../_iregistry";
import {IObject} from "../objects/_iobject";
 
export class ParserErrorConf extends BasicRuleConfig {
}
 
export class ParserError implements IRule {
  private conf = new ParserErrorConf();
  protected reg: IRegistry;
 
  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 initialize(reg: IRegistry) {
    this.reg = reg;
    return this;
  }
 
  public getConfig() {
    return this.conf;
  }
 
  public setConfig(conf: ParserErrorConf) {
    this.conf = conf;
  }
 
  public run(obj: IObject): readonly Issue[] {
    const issues: Issue[] = [];
 
    issues.push(...obj.getParsingIssues());
 
    if (obj instanceof ABAPObject) {
      for (const file of obj.getABAPFiles()) {
 
        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;
  }
 
}