All files / src/bdef/expressions bdef_side_effects.ts

100% Statements 46/46
100% Branches 1/1
100% Functions 1/1
100% Lines 46/46

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 471x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x  
import {BDEFFieldPath, BDEFName, BDEFReference} from ".";
import {altPrio, Expression, optPrio, seq, starPrio} from "../../abap/2_statements/combi";
import {IStatementRunnable} from "../../abap/2_statements/statement_runnable";
 
/** eg. "side effects { field Price affects field TotalPrice, messages; }" */
export class BDEFSideEffects extends Expression {
  public getRunnable(): IStatementRunnable {
    const fieldList = seq("(", BDEFName, starPrio(seq(",", BDEFName)), ")");
    // eg. "field *", "field ( A, B )", "field _Item.*" or "field _Root.( A, B )"
    const field = seq("FIELD", altPrio(
      "*",
      fieldList,
      seq(BDEFName, starPrio(seq(".", altPrio("*", fieldList, BDEFName))))));
 
    const permission = altPrio(
      seq("ACTION", BDEFReference),
      field,
      seq(altPrio("CREATE", "UPDATE", "DELETE"), optPrio(BDEFName)));
    const permissions = seq("PERMISSIONS", "(", permission, starPrio(seq(",", permission)), ")");
 
    const target = altPrio(
      field,
      seq("ENTITY", BDEFFieldPath),
      "MESSAGES",
      permissions,
      "$SELF");
    const targets = seq(target, starPrio(seq(",", target)));
 
    const trigger = altPrio(field, seq("ENTITY", BDEFFieldPath), "$SELF");
    const triggers = seq(trigger, starPrio(seq(",", trigger)));
 
    const source = altPrio(
      field,
      seq("ACTION", BDEFReference),
      seq("DETERMINE ACTION", BDEFReference, "EXECUTED ON", triggers),
      seq("ENTITY", BDEFFieldPath),
      seq("EVENT", BDEFName),
      "$SELF");
 
    const recommendation = seq("RECOMMENDATION FUNCTION", BDEFName, "EXECUTED ON", triggers, ";");
 
    const item = altPrio(seq(source, "AFFECTS", targets, ";"), recommendation, ";");
 
    return seq("SIDE EFFECTS", "{", starPrio(item), "}");
  }
}