All files / src/objects program.ts

98.07% Statements 102/104
76.31% Branches 29/38
100% Functions 10/10
98.07% Lines 102/104

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 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 1051x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 44358x 44358x 1x 1x 4612x 4612x     4612x 4612x 1x 1x 2x 2x 2x 1x 1x 174x 174x 174x 174x 174x 1x 1x 10396x 10396x 10396x 1x 1x 4860x 4860x 4860x 1x 1x 169x 169x 169x 1x 1x 6x 6x 6x 1x 1x 187x 187x 187x 1x 1x 1x 1x 5224x 2267x 2267x 2957x 2957x 2957x 5224x 2896x 2896x 2896x 2896x 2896x 2896x 2896x 2896x 2896x 61x 61x 61x 5224x 96x 34x 96x 19x 19x 96x 61x 61x 61x 61x 5224x 5224x 5224x 5224x 5224x 5224x 5224x 1x  
import {ABAPObject, ITextElements} from "./_abap_object";
import {ABAPFile} from "../abap/abap_file";
import {DynproList, parseDynpros} from "./_dynpros";
import {xmlToArray, unescape} from "../xml_utils";
 
export class Program extends ABAPObject {
  private parsedXML: {
    isInclude: boolean,
    isModulePool: boolean,
    description: string | undefined,
    dynpros: DynproList,
    selectionTexts: ITextElements,
  } | undefined;
 
  public getType(): string {
    return "PROG";
  }
 
  public getSequencedFiles(): readonly ABAPFile[] {
    const main = this.getMainABAPFile();
    if (main === undefined) {
      return [];
    }
    return [main];
  }
 
  public getDescription(): string | undefined {
    this.parseXML();
    return this.parsedXML?.description;
  }
 
  public getAllowedNaming() {
    return {
      maxLength: 40,
      allowNamespace: true,
    };
  }
 
  public setDirty(): void {
    this.parsedXML = undefined;
    super.setDirty();
  }
 
  public isInclude(): boolean {
    this.parseXML();
    return this.parsedXML!.isInclude;
  }
 
  public isModulePool(): boolean {
    this.parseXML();
    return this.parsedXML!.isModulePool;
  }
 
  public getDynpros(): DynproList {
    this.parseXML();
    return this.parsedXML!.dynpros || [];
  }
 
  public getSelectionTexts(): ITextElements {
    this.parseXML();
    return this.parsedXML!.selectionTexts;
  }
 
////////////////////////////
 
  private parseXML() {
    if (this.parsedXML !== undefined) {
      return;
    }
 
    const file = this.getXMLFile();
    const parsed = this.parseRaw2();
    if (parsed === undefined) {
      this.parsedXML = {
        isInclude: false,
        isModulePool: false,
        description: undefined,
        dynpros: [],
        selectionTexts: {},
      };
      return;
    }
 
    let description = "";
    const selectionTexts: ITextElements = {};
    for (const t of xmlToArray(parsed.abapGit?.["asx:abap"]["asx:values"]?.TPOOL?.item)) {
      if (t?.ID === "R") {
        description = t.ENTRY ? unescape(t.ENTRY) : "";
      } else if (t?.ID === "S" && t.KEY !== undefined) {
        selectionTexts[t.KEY.toUpperCase()] = {entry: t.ENTRY ? unescape(t.ENTRY) : "", maxLength: parseInt(t.LENGTH, 10)};
      }
    }
 
    const dynpros = parseDynpros(parsed);
 
    this.parsedXML = {
      isInclude: file ? file.getRaw().includes("<SUBC>I</SUBC>") : false,
      isModulePool: file ? file.getRaw().includes("<SUBC>M</SUBC>") : false,
      dynpros: dynpros,
      description: description,
      selectionTexts: selectionTexts,
    };
  }
}