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

83.72% Statements 36/43
91.66% Branches 11/12
100% Functions 1/1
83.72% Lines 36/43

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 431x 1x 1x 1x 1x 1x 1x 1x 1x 1x 2920x 2920x 582x 582x 2338x 2338x 2338x 2920x 39x 39x 2338x 2338x 2338x 2920x 17x 17x 2321x 2321x 2920x 2319x 36x 2319x 2283x 2283x 2319x               1x
import {ExpressionNode} from "../../nodes";
import * as Expressions from "../../2_statements/expressions";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {UnknownType, VoidType} from "../../types/basic";
import {BasicTypes} from "../basic_types";
import {TypeTable} from "./type_table";
import {SyntaxInput} from "../_syntax_input";
 
export class DataDefinition {
  public static runSyntax(node: ExpressionNode, input: SyntaxInput): TypedIdentifier | undefined {
    const tt = node.findFirstExpression(Expressions.TypeTable);
    if (tt) {
      return TypeTable.runSyntax(node, input);
    }
 
    const valueNode = node.findFirstExpression(Expressions.Value);
    let value: string | undefined = undefined;
    if (valueNode) {
      value = new BasicTypes(input).findValue(node);
    }
 
    const name = node.findFirstExpression(Expressions.DefinitionName);
    const typeStructure = node.findFirstExpression(Expressions.TypeStructure);
    if (typeStructure && name) {
      return new TypedIdentifier(name.getFirstToken(), input.filename, VoidType.get("DataDefinition, TypeStructure"));
    }
 
    const bfound = new BasicTypes(input).simpleType(node);
    if (bfound) {
      if (value) {
        return new TypedIdentifier(bfound.getToken(), input.filename, bfound.getType(), bfound.getMeta(), value);
      } else {
        return bfound;
      }
    }

    if (name) {
      return new TypedIdentifier(name.getFirstToken(), input.filename, new UnknownType("DataDefinition, fallback"));
    }

    return undefined;
  }
}