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

96% Statements 48/50
88.88% Branches 16/18
100% Functions 1/1
96% Lines 48/50

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 501x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11x 11x 11x 11x 11x 11x 3x 1x 3x 2x 2x 11x 8x 8x 8x 1x 1x 8x 9x 11x 2x 2x 2x     2x 2x 9x 11x 18x 18x 18x 1x 1x 18x 8x 8x 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 {StringType, TableType, UnknownType, VoidType, XStringType} from "../../types/basic";
import {InlineData} from "../expressions/inline_data";
import {StatementSyntax} from "../_statement_syntax";
import {TypeUtils} from "../_type_utils";
 
export class Concatenate implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
    const byteMode = node.findDirectTokenByText("BYTE") !== undefined;
    const linesMode = node.findDirectTokenByText("LINES") !== undefined;
 
    const target = node.findFirstExpression(Expressions.Target);
    const inline = target?.findDirectExpression(Expressions.InlineData);
    if (inline) {
      if (byteMode) {
        new InlineData().runSyntax(inline, scope, filename, new XStringType());
      } else {
        new InlineData().runSyntax(inline, scope, filename, StringType.get());
      }
    } else if (target) {
      const type = new Target().runSyntax(target, scope, filename);
      const compatible = byteMode ? new TypeUtils(scope).isHexLike(type) : new TypeUtils(scope).isCharLikeStrict(type);
      if (compatible === false) {
        throw new Error("Target type not compatible");
      }
    }
 
    if (linesMode) {
      for (const s of node.findDirectExpressions(Expressions.Source)) {
        const type = new Source().runSyntax(s, scope, filename);
        if (!(type instanceof UnknownType) && !(type instanceof VoidType) && !(type instanceof TableType)) {
          throw new Error("Source must be an internal table");
        }
      }
    }
 
    for (const s of node.findDirectExpressions(Expressions.SimpleSource3)) {
      const type = new Source().runSyntax(s, scope, filename);
      const compatible = byteMode ? new TypeUtils(scope).isHexLike(type) : new TypeUtils(scope).isCharLikeStrict(type);
      if (compatible === false) {
        throw new Error("Source type not compatible");
      }
    }
 
  }
}