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

91.66% Statements 44/48
83.33% Branches 10/12
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 7x 7x 7x 7x 7x 7x 7x 2x 7x 5x 5x 5x 5x 5x         5x 3x 3x 5x 5x 1x 1x 1x 1x 5x 7x 6x 7x 12x 12x 6x 6x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {TableType, StringType, VoidType, UnknownType, TableKeyType} from "../../types/basic";
import {InlineData} from "../expressions/inline_data";
import {Source} from "../expressions/source";
import {Target} from "../expressions/target";
import {StatementSyntax} from "../_statement_syntax";
import {TypeUtils} from "../_type_utils";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
 
export class Split implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput): void {
 
    const intoTable = node.findTokenSequencePosition("INTO", "TABLE") !== undefined;
    const type = intoTable ? new TableType(StringType.get(), {withHeader: false, keyType: TableKeyType.default}) : StringType.get();
 
    for (const target of node.findAllExpressions(Expressions.Target)) {
      const inline = target.findDirectExpression(Expressions.InlineData);
      if (inline) {
        new InlineData().runSyntax(inline, input, type);
      } else {
        let targetType = new Target().runSyntax(target, input);
        if (intoTable) {
          if (!(targetType instanceof TableType)
              && !(targetType instanceof UnknownType)
              && !(targetType instanceof VoidType)) {
            const message = "Into must be table typed";
            input.issues.push(syntaxIssue(input, target.getFirstToken(), message));
            return;
          }
          if (targetType instanceof TableType) {
            targetType = targetType.getRowType();
          }
        }
        if (new TypeUtils(input.scope).isCharLikeStrict(targetType) === false) {
          const message = "Incompatible, target not character like";
          input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
          return;
        }
      }
    }
 
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      new Source().runSyntax(s, input);
    }
 
  }
}