All files / src/abap/5_syntax/statements move.ts

91.66% Statements 44/48
72.22% Branches 13/18
100% Functions 1/1
91.66% Lines 44/48

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 481x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 857x 857x 857x 857x 857x 857x 857x 640x 640x 609x 608x 608x 1x 1x 608x 825x 825x 857x 857x     789x 857x 204x 204x 204x 788x 857x 4x     857x 11x 11x 857x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {Source} from "../expressions/source";
import {Target} from "../expressions/target";
import {InlineData} from "../expressions/inline_data";
import {AbstractType} from "../../types/basic/_abstract_type";
import {StatementSyntax} from "../_statement_syntax";
import {TypeUtils} from "../_type_utils";
 
export class Move implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
    const targets = node.findDirectExpressions(Expressions.Target);
    const firstTarget = targets[0];
 
    const inline = firstTarget?.findDirectExpression(Expressions.InlineData);
 
    let targetType: AbstractType | undefined = undefined;
    if (inline === undefined) {
      targetType = firstTarget ? new Target().runSyntax(firstTarget, scope, filename) : undefined;
      for (const t of targets) {
        if (t === firstTarget) {
          continue;
        }
        new Target().runSyntax(t, scope, filename);
      }
    }
 
    const source = node.findDirectExpression(Expressions.Source);
    const sourceType = source ? new Source().runSyntax(source, scope, filename, targetType) : undefined;
    if (sourceType === undefined) {
      throw new Error("No source type determined");
    }
 
    if (inline) {
      new InlineData().runSyntax(inline, scope, filename, sourceType);
      targetType = sourceType;
    }
 
    if (node.findDirectTokenByText("?=")) {
      if (new TypeUtils(scope).isCastable(sourceType, targetType) === false) {
        throw new Error("Incompatible types");
      }
    } else if (new TypeUtils(scope).isAssignable(sourceType, targetType) === false) {
      throw new Error("Incompatible types");
    }
  }
}