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

79.48% Statements 31/39
60% Branches 3/5
100% Functions 1/1
79.48% Lines 31/39

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 391x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x         4x 4x 4x 2x 1x 1x 1x 1x 2x 2x         2x 4x 4x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {Source} from "../expressions/source";
import {StatementSyntax} from "../_statement_syntax";
import {Target} from "../expressions/target";
import {TypeUtils} from "../_type_utils";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
 
export class Shift implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput): void {
 
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      new Source().runSyntax(s, input);
    }
 
    const target = node.findDirectExpression(Expressions.Target);
    if (target === undefined) {
      const message = "Shift, Target not found";
      input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
      return;
    }
 
    const targetType = new Target().runSyntax(target, input);
    if (node.concatTokens().toUpperCase().includes(" IN BYTE MODE")) {
      if (new TypeUtils(input.scope).isHexLike(targetType) === false) {
        const message = "Shift, Target not hex like";
        input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
        return;
      }
    } else {
      if (new TypeUtils(input.scope).isCharLike(targetType) === false) {
        const message = "Shift, Target not char like";
        input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
        return;
      }
    }
 
  }
}