All files / src/cds/expressions cds_element.ts

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

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 361x 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 {CDSAggregate, CDSAnnotation, CDSArithParen, CDSArithmetics, CDSCase, CDSFunction, CDSInteger, CDSName, CDSPrefixedName, CDSString, CDSType} from ".";
import {Expression, optPrio, seq, starPrio, altPrio} from "../../abap/2_statements/combi";
import {IStatementRunnable} from "../../abap/2_statements/statement_runnable";
import {CDSAs} from "./cds_as";
import {CDSCast} from "./cds_cast";
 
export class CDSElement extends Expression {
  public getRunnable(): IStatementRunnable {
    const redirected = seq(": REDIRECTED TO", optPrio(altPrio("PARENT", "COMPOSITION CHILD")), CDSName);
    const colonThing = seq(":", altPrio(CDSType, CDSName, "LOCALIZED"));
 
    // $extension.* — extension field wildcard
    const extensionWildcard = seq("$extension", ".", "*");
 
    const body = altPrio(extensionWildcard,
                         CDSArithmetics,
                         CDSAggregate,
                         CDSString,
                         CDSArithParen,
                         CDSFunction,
                         CDSCast,
                         CDSCase,
                         seq("(", CDSCase, ")"),
                         seq(CDSPrefixedName, optPrio(CDSAs), optPrio(altPrio(redirected, colonThing))),
                         CDSInteger);
 
    // KEY/VIRTUAL keyword handling via altPrio:
    // - Try keyword form first: if keyword consumed but body fails (e.g. "virtual.Field"),
    //   altPrio backtracks to plain body (which handles "virtual" as a datasource alias prefix).
    // - This gives exactly 1 state in all cases (no exponential blowup from opt()).
    const elementBody = altPrio(seq(altPrio("KEY", "VIRTUAL"), body), body);
 
    return seq(starPrio(CDSAnnotation), elementBody, optPrio(CDSAs));
  }
}