All files / src/abap/5_syntax/expressions component_name.ts

84.62% Statements 33/39
76.92% Branches 10/13
100% Functions 1/1
84.62% Lines 33/39

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 391x 1x 1x 1x 1x 1x 91x 6x 6x 85x 85x 85x 91x 74x 74x 3x 3x 71x 71x 11x 91x 11x 11x 3x 11x   8x 8x 8x     8x 8x 11x       1x 1x
import {INode} from "../../nodes/_inode";
import {AbstractType} from "../../types/basic/_abstract_type";
import * as Basic from "../../types/basic";
 
export class ComponentName {
  public runSyntax(context: AbstractType | undefined, node: INode): AbstractType | undefined {
    if (context instanceof Basic.VoidType) {
      return context;
    }
 
    const name = node.getFirstToken().getStr();
 
    if (context instanceof Basic.StructureType) {
      const ret = context.getComponentByName(name);
      if (ret === undefined) {
        throw new Error("Component \"" + name + "\" not found in structure");
      }
      return ret;
    }
 
    if (context instanceof Basic.TableType && context.isWithHeader() === true) {
      const rowType = context.getRowType();
      if (rowType instanceof Basic.VoidType) {
        return context;
      } else if (name.toUpperCase() === "TABLE_LINE") {
        return rowType;
      } else if (rowType instanceof Basic.StructureType) {
        const ret = rowType.getComponentByName(name);
        if (ret === undefined) {
          throw new Error("Component \"" + name + "\" not found in structure");
        }
        return ret;
      }
    }

    throw new Error("Not a structure, ComponentName, \"" + name + "\"");
  }
 
}