All files / src/objects data_element.ts

92.36% Statements 121/131
92.06% Branches 58/63
77.77% Functions 7/9
92.36% Lines 121/131

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 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 1321x 1x 1x 1x 1x 1x 1x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 61x 1504x 1504x 61x 61x 82x 82x 82x 61x 61x 42x 42x 42x 42x 42x 61x 61x 77x 77x 77x 61x 61x       61x 61x       61x 61x 229x 229x 229x 229x   229x 229x 229x 27x 2x 27x 25x 25x 229x 2x   2x 2x 2x 202x 200x 20x 200x 180x 180x 180x 180x 180x 180x 180x 180x 180x 180x 180x 200x 229x 229x 229x 16x 16x 229x 229x 229x 61x 61x 171x 112x 112x 59x 59x 59x 59x 171x     59x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 171x 61x 61x  
import {AbstractObject} from "./_abstract_object";
import {AbstractType} from "../abap/types/basic/_abstract_type";
import {IRegistry} from "../_iregistry";
import {DDIC, ILookupResult} from "../ddic";
import * as Types from "../abap/types/basic";
import {IObjectAndToken} from "../_iddic_references";
 
export class DataElement extends AbstractObject {
  private parsedXML: {
    description?: string,
    refkind?: string,
    domname?: string,
    datatype?: string,
    leng?: string,
    texts?: {
      short?: string,
      medium?: string,
      long?: string,
      heading?: string,
    }
    decimals?: string} | undefined = undefined;
 
  public getType(): string {
    return "DTEL";
  }
 
  public getDescription(): string | undefined {
    this.parse();
    return this.parsedXML?.description;
  }
 
  public getAllowedNaming() {
    return {
      maxLength: 30,
      allowNamespace: true,
    };
  }
 
  public setDirty(): void {
    this.parsedXML = undefined;
    super.setDirty();
  }
 
  public getDomainName(): string | undefined {
    this.parse();
    return this.parsedXML?.domname;
  }
 
  public getTexts() {
    this.parse();
    return this.parsedXML?.texts;
  }
 
  public parseType(reg: IRegistry): AbstractType {
    const references: IObjectAndToken[] = [];
 
    let lookup: ILookupResult | undefined = undefined;
    if (this.parsedXML === undefined) {
      lookup = {type: new Types.UnknownType("Data Element " + this.getName() + ", parser error")};
    } else {
      const ddic = new DDIC(reg);
      if (this.parsedXML.refkind === "D") {
        if (this.parsedXML.domname === undefined || this.parsedXML.domname === "") {
          lookup = {type: new Types.UnknownType("DOMNAME unexpectely empty in " + this.getName())};
        } else {
          lookup = ddic.lookupDomain(this.parsedXML.domname, this.getName(), this.getDescription());
        }
      } else if (this.parsedXML.refkind === "R") {
        if (this.parsedXML.domname === undefined || this.parsedXML.domname === "") {
          lookup = {type: new Types.UnknownType("DOMNAME unexpectely empty in " + this.getName())};
        } else {
          lookup = ddic.lookupObject(this.parsedXML.domname);
        }
      } else {
        if (this.parsedXML.datatype === undefined || this.parsedXML.datatype === "") {
          lookup = {type: new Types.UnknownType("DATATYPE unexpectely empty in " + this.getName())};
        } else {
          lookup = {type: ddic.textToType({
            text: this.parsedXML.datatype,
            length: this.parsedXML.leng,
            decimals: this.parsedXML.decimals,
            infoText: this.getName(),
            qualifiedName: this.getName(),
            conversionExit: undefined,
            ddicName: this.getName(),
            description: this.parsedXML.texts?.heading,
          })};
        }
      }
    }
 
    if (lookup.object) {
      references.push({object: lookup.object});
    }
    reg.getDDICReferences().setUsing(this, references);
    return lookup.type;
  }
 
  public parse() {
    if (this.parsedXML !== undefined) {
      return {updated: false, runtime: 0};
    }
 
    const start = Date.now();
    this.parsedXML = {};
    const parsed = super.parseRaw2();
    if (parsed === undefined) {
      return {updated: false, runtime: 0};
    }
 
    const dd04v = parsed.abapGit?.["asx:abap"]?.["asx:values"]?.DD04V;
    this.parsedXML = {
      description: dd04v?.DDTEXT,
      refkind: dd04v?.REFKIND,
      domname: dd04v?.DOMNAME,
      datatype: dd04v?.DATATYPE,
      leng: dd04v?.LENG,
      decimals: dd04v?.DECIMALS,
      texts: {
        short: dd04v?.SCRTEXT_S,
        medium: dd04v?.SCRTEXT_M,
        long: dd04v?.SCRTEXT_L,
        heading: dd04v?.REPTEXT,
      },
    };
 
    const end = Date.now();
    return {updated: true, runtime: end - start};
  }
 
}