All files / src/abap/2_statements result.ts

100% Statements 47/47
100% Branches 8/8
100% Functions 7/7
100% Lines 47/47

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 471x 1x 1x 1x 1x 1x 1x 1x 1x 1x 192132x 192132x 192132x 192132x 192132x 192132x 29704x 29704x 192132x 1x 1x 1001841x 1001841x 1x 1x 162428x 162428x 162428x 162428x 1x 1x 212512x 212512x 1x 1x 336560x 336560x 1x 1x 161595x 161595x 1x 1x 1500231x 1500231x 1x 1x
import {Token} from "../1_lexer/tokens/_token";
import {ExpressionNode} from "../nodes/expression_node";
import {TokenNode} from "../nodes/token_node";
 
export class Result {
  private readonly tokens: readonly Token[];
  private readonly tokenIndex: number;
  private nodes: (ExpressionNode | TokenNode)[] | undefined;
 
  public constructor(tokens: readonly Token[], tokenIndex: number, nodes?: (ExpressionNode | TokenNode)[]) {
// tokens: all tokens, from the tokenIndex = not yet matched
// nodes: matched tokens
    this.tokens = tokens;
    this.tokenIndex = tokenIndex;
    this.nodes = nodes;
    if (this.nodes === undefined) {
      this.nodes = [];
    }
  }
 
  public peek(): Token {
    return this.tokens[this.tokenIndex];
  }
 
  public shift(node: ExpressionNode | TokenNode): Result {
    const cp = this.nodes!.slice();
    cp.push(node);
    return new Result(this.tokens, this.tokenIndex + 1, cp);
  }
 
  public popNode(): ExpressionNode | TokenNode | undefined {
    return this.nodes!.pop();
  }
 
  public getNodes(): (ExpressionNode | TokenNode)[] {
    return this.nodes!;
  }
 
  public setNodes(n: (ExpressionNode | TokenNode)[]): void {
    this.nodes = n;
  }
 
  public remainingLength(): number {
    return this.tokens.length - this.tokenIndex;
  }
 
}