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

100% Statements 47/47
100% Branches 14/14
100% Functions 1/1
100% Lines 47/47

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 471x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 26x 26x 26x 26x 26x 26x 4x 4x 22x 22x 26x 1x 1x 22x 22x 26x 6x 6x 22x 26x 19x 19x 19x 19x 26x 9x 9x 19x 26x 6x 6x 19x 26x 26x 1x
import {ExpressionNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import * as Expressions from "../../2_statements/expressions";
import {For} from "./for";
import {Source} from "./source";
import {AbstractType} from "../../types/basic/_abstract_type";
import {Let} from "./let";
import {FieldAssignment} from "./field_assignment";
import {ScopeType} from "../_scope_type";
 
export class ValueBody {
  public runSyntax(
    node: ExpressionNode | undefined,
    scope: CurrentScope,
    filename: string,
    targetType: AbstractType | undefined): AbstractType | undefined {
 
    if (node === undefined) {
      return targetType;
    }
 
    const letNode = node.findDirectExpression(Expressions.Let);
    if (letNode) {
      new Let().runSyntax(letNode, scope, filename);
    }
 
    const forNode = node.findDirectExpression(Expressions.For);
    if (forNode) {
      new For().runSyntax(forNode, scope, filename);
    }
 
    for (const s of node.findDirectExpressions(Expressions.FieldAssignment)) {
      new FieldAssignment().runSyntax(s, scope, filename, targetType);
    }
 
    let type: AbstractType | undefined = undefined; // todo, this is only correct if there is a single source in the body
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      type = new Source().runSyntax(s, scope, filename);
    }
 
    if (scope.getType() === ScopeType.For) {
      scope.pop(node.getLastToken().getEnd());
    }
 
    return targetType ? targetType : type;
  }
}