All files / src/abap/2_statements/expressions assign_source.ts

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

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 371x 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 {seq, alt, tok, opt, Expression, ver, AlsoIn, verNotLang} from "../combi";
import {InstanceArrow, StaticArrow} from "../../1_lexer/tokens";
import {IStatementRunnable} from "../statement_runnable";
import {Source} from "./source";
import {Dynamic} from "./dynamic";
import {Field} from "./field";
import {SimpleSource3} from "./simple_source3";
import {Release, LanguageVersion} from "../../../version";
 
export class AssignSource extends Expression {
  public getRunnable(): IStatementRunnable {
    const component = seq("COMPONENT",
                          alt(SimpleSource3, ver(Release.v740sp02, Source, {also: AlsoIn.OpenABAP})),
                          "OF STRUCTURE",
                          Source);
 
    // TABLE FIELD form: blocked in KeyUser
    const tableField = verNotLang(LanguageVersion.KeyUser, seq("TABLE FIELD", alt(Source, Dynamic)));
 
    // class=>(dyn_attr) via static arrow is blocked in KeyUser
    // ref->(dyn_comp) via instance arrow is allowed — leave unguarded
    const arrowDynamic = alt(
      tok(InstanceArrow),
      verNotLang(LanguageVersion.KeyUser, tok(StaticArrow)),
    );
 
    const anyArrow = alt(tok(InstanceArrow), tok(StaticArrow));
    const source = alt(seq(Source, opt(seq(arrowDynamic, Dynamic))),
                       component,
                       tableField,
                       // standalone dynamic symbol (dyn_sym) blocked in KeyUser
                       verNotLang(LanguageVersion.KeyUser,
                                  seq(Dynamic, opt(seq(anyArrow, alt(Field, Dynamic))))));
 
    return source;
  }
}