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 2430x 2430x 500x 500x 1930x 1930x 1930x 2430x 34x 34x 1930x 1930x 1930x 2430x 17x 17x 1913x 1913x 2430x 1911x 33x 1911x 1878x 1878x 1911x               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;
  }
}