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

83.63% Statements 46/55
66.66% Branches 10/15
100% Functions 1/1
83.63% Lines 46/55

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 551x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 5x 5x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x   4x 3x 3x 3x 1x 1x 1x 4x 1x 1x     1x     4x 3x 3x 4x     3x 4x     3x 3x 1x
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {Source} from "../expressions/source";
import {StatementSyntax} from "../_statement_syntax";
import {Target} from "../expressions/target";
import {FSTarget} from "../expressions/fstarget";
import {ComponentCond} from "../expressions/component_cond";
import {AnyType, StructureType, TableType, UnknownType, VoidType} from "../../types/basic";
 
export class ModifyInternal implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
 
    for (const s of node.findDirectExpressions(Expressions.Source)) {
      new Source().runSyntax(s, scope, filename);
    }
 
    // there is only one
    const target = node.findFirstExpression(Expressions.Target);
    const targetExpression = target;
    if (targetExpression) {
      // it might be a dynamic target
      const targetType = new Target().runSyntax(targetExpression, scope, filename);
      if (targetType instanceof VoidType
          || targetType instanceof AnyType
          || targetType instanceof UnknownType) {
        // ok
      } else if (targetType instanceof TableType) {
        if (node.findDirectTokenByText("TABLE")
            && node.findDirectTokenByText("INDEX")
            && targetType.isWithHeader() === false) {
          // MODIFY TABLE INDEX
          throw new Error("Table does not have header line");
        }
      } else if (targetType instanceof StructureType) {
        // it might originate from a TABLES statement
        if (target.concatTokens().toUpperCase() !== targetType.getDDICName()) {
          throw new Error("Not an internal table");
        }
      } else {
        throw new Error("Not an internal table");
      }
    }
 
    const fstarget = node.findDirectExpression(Expressions.FSTarget);
    if (fstarget) {
      new FSTarget().runSyntax(fstarget, scope, filename, undefined);
    }
 
    for (const t of node.findDirectExpressions(Expressions.ComponentCond)) {
      new ComponentCond().runSyntax(t, scope, filename);
    }
 
  }
}