All files / src/abap/2_statements/expressions compare.ts

100% Statements 37/37
100% Branches 1/1
100% Functions 1/1
100% Lines 37/37

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 371x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x
import {seq, ver, tok, plus, opt, optPrio, altPrio, Expression} from "../combi";
import {FieldSub, ClassName, Constant, Source, MethodCallChain, CompareOperator} from ".";
import {WParenLeft, ParenRightW} from "../../1_lexer/tokens";
import {Version} from "../../../version";
import {IStatementRunnable} from "../statement_runnable";
 
export class Compare extends Expression {
  public getRunnable(): IStatementRunnable {
    const val = altPrio(FieldSub, Constant);
 
    const list = seq(tok(WParenLeft),
                     val,
                     plus(seq(",", val)),
                     tok(ParenRightW));
 
    const inn = seq(optPrio("NOT"), "IN", altPrio(Source, list));
 
    const sopt = seq("IS",
                     optPrio("NOT"),
                     altPrio("SUPPLIED",
                             "BOUND",
                             ver(Version.v750, seq("INSTANCE OF", ClassName)),
                             "REQUESTED",
                             "ASSIGNED",
                             "INITIAL"));
 
    const between = seq(optPrio("NOT"), "BETWEEN", Source, "AND", Source);
 
    const predicate = ver(Version.v740sp08, MethodCallChain);
 
    const rett = seq(Source, altPrio(seq(CompareOperator, Source), inn, between, sopt));
 
    const ret = seq(opt("NOT"), altPrio(rett, predicate));
 
    return ret;
  }
}