All files / src/abap/nodes _abstract_node.ts

100% Statements 42/42
100% Branches 7/7
100% Functions 6/6
100% Lines 42/42

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 421x 1x 1x 1x 1x 1x 1x 1x 1x 1x 637661x 637661x 1x 1x 1x 1x 1x 1x 52421x 32741x 32741x 52421x 52421x 1x 1x 589918x 589918x 589918x 1x 1x 1988723x 1988723x 1x 1x 3725x 3725x 1x 1x 48297x 48297x 1x 1x
import {INode} from "./_inode";
import {AbstractToken} from "../1_lexer/tokens/abstract_token";
 
// shared constant, so nodes without children don't waste memory on empty arrays
const EMPTY: readonly INode[] = Object.freeze([]);
 
export abstract class AbstractNode<T extends INode> implements INode {
  protected children: T[];
 
  public constructor() {
    this.children = EMPTY as T[];
  }
 
  public abstract get(): any;
  public abstract getFirstToken(): AbstractToken;
  public abstract getLastToken(): AbstractToken;
 
  public addChild(n: T) {
    if (this.children === EMPTY) {
      this.children = [];
    }
    this.children.push(n);
  }
 
  public setChildren(children: T[]) {
    // copy, input arrays are built via push() and carry over-allocated backing stores
    this.children = children.slice();
  }
 
  public getChildren(): readonly T[] {
    return this.children;
  }
 
  public getFirstChild(): T | undefined {
    return this.children[0];
  }
 
  public getLastChild(): T | undefined {
    return this.children[this.children.length - 1];
  }
 
}