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

92.85% Statements 52/56
88.88% Branches 16/18
100% Functions 1/1
92.85% Lines 52/56

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 50 51 52 53 54 55 561x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 12x 12x 12x 12x 12x 12x 3x 1x 3x 2x 2x 12x 9x 9x 9x 1x 1x 1x 1x 9x 11x 12x 2x 2x 2x         2x 2x 11x 12x 22x 22x 22x 1x 1x 1x 1x 22x 10x 10x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
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";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
 
export class Concatenate implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput): 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, input, new XStringType());
      } else {
        new InlineData().runSyntax(inline, input, StringType.get());
      }
    } else if (target) {
      const type = new Target().runSyntax(target, input);
      const compatible = byteMode ? new TypeUtils(input.scope).isHexLike(type) : new TypeUtils(input.scope).isCharLikeStrict(type);
      if (compatible === false) {
        const message = "Target type not compatible";
        input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
        return;
      }
    }
 
    if (linesMode) {
      for (const s of node.findDirectExpressions(Expressions.Source)) {
        const type = new Source().runSyntax(s, input);
        if (!(type instanceof UnknownType) && !(type instanceof VoidType) && !(type instanceof TableType)) {
          const message = "Source must be an internal table";
          input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
          return;
        }
      }
    }
 
    for (const s of node.findDirectExpressions(Expressions.SimpleSource3)) {
      const type = new Source().runSyntax(s, input);
      const compatible = byteMode ? new TypeUtils(input.scope).isHexLike(type) : new TypeUtils(input.scope).isCharLikeStrict(type);
      if (compatible === false) {
        const message = "Source type not compatible";
        input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
        return;
      }
    }
 
  }
}