All files / src/abap/types/basic structure_type.ts

91.54% Statements 65/71
86.66% Branches 13/15
87.5% Functions 7/8
91.54% Lines 65/71

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 711x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 10079x 10079x 10079x 10079x 10079x 10079x     10079x 10079x 10079x 1604599x 1604599x 1x 1x 1604598x 1604598x 10078x 10078x 1x 1x 1925x 1925x 1x 1x 701x 701x 1x 1x 11x 11x 186x 186x 11x 11x 11x 1x 1x 670x 670x 1x 1x 14x 14x 14x 14x     1x 1x 29x 29x 1x 1x     1x
import {AbstractType} from "./_abstract_type";
 
export interface IStructureComponent {
  name: string;
  type: AbstractType;
  asInclude?: boolean;
  suffix?: string;
}
 
export class StructureType extends AbstractType {
  private readonly indexed: {[index: string]: AbstractType};
  private readonly components: IStructureComponent[];
 
  public constructor(components: IStructureComponent[], qualifiedName?: string, ddicName?: string, description?: string) {
    super({
      qualifiedName: qualifiedName,
      ddicName: ddicName,
      description: description,
    });
    if (components.length === 0) {
      throw new Error("Structure does not contain any components");
    }
 
    this.indexed = {};
    for (const c of components) {
      const upper = c.name.toUpperCase();
      if (this.indexed[upper] !== undefined) {
        throw new Error("Structure, duplicate field name \"" + upper + "\", " + qualifiedName);
      }
      this.indexed[upper] = c.type;
    }
    this.components = components;
  }
 
  public getComponents(): readonly IStructureComponent[] {
    return this.components;
  }
 
  public getComponentByName(name: string): AbstractType | undefined {
    return this.indexed[name.toUpperCase()];
  }
 
  public toText(level: number) {
    const compo: string[] = [];
    for (const c of this.components) {
      compo.push(c.name + " TYPE " + c.type.toText(level + 1));
    }
    const spaces = "  ".repeat(level);
    return "Structure\n" + spaces + "* " + compo.join("\n" + spaces + "* ");
  }
 
  public isGeneric() {
    return false;
  }
 
  public toABAP(): string {
    const ret = this.getQualifiedName();
    if (ret) {
      return ret;
    }
    return "StructureTypetoABAPtodo";
  }
 
  public containsVoid() {
    return this.getComponents().some(c => { return c.type.containsVoid(); });
  }
 
  public toCDS() {
    return "abap.TODO_STRUCTURE";
  }
}