All files / src/abap/2_statements/statements selectionscreen.ts

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

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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 1321x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 1x 1x  
import {IStatement} from "./_statement";
import {verNot, str, seq, altPrio, optPrio, alt, opt, per, regex as reg, tok} from "../combi";
import {ParenLeft, WParenLeft, ParenRightW, ParenRight} from "../../1_lexer/tokens";
import {Integer, Source, Field, Modif, Constant, InlineField, TextElement, BlockName, FieldSub} from "../expressions";
import {Version} from "../../../version";
import {IStatementRunnable} from "../statement_runnable";
 
export class SelectionScreen implements IStatement {
 
  public getMatcher(): IStatementRunnable {
    const beginBlock = seq("BEGIN OF BLOCK",
                           BlockName,
                           optPrio("WITH FRAME"),
                           optPrio(seq("TITLE", alt(InlineField, TextElement))),
                           optPrio("NO INTERVALS"));
    const endBlock = seq("END OF BLOCK", BlockName);
 
    const nesting = seq("NESTING LEVEL", Source);
 
    const scrOptions = per(seq("AS", alt("WINDOW", "SUBSCREEN")),
                           seq("TITLE", alt(InlineField, TextElement)),
                           "NO INTERVALS",
                           nesting);
 
    const beginScreen = seq("BEGIN OF SCREEN",
                            Integer,
                            opt(scrOptions));
 
    const endScreen = seq("END OF SCREEN", Integer);
 
    const beginLine = str("BEGIN OF LINE");
    const endLine = str("END OF LINE");
 
    const modif = seq("MODIF ID", Modif);
 
    const visible = seq("VISIBLE LENGTH", reg(/^\d+$/));
 
    const ldbId = seq("ID", reg(/^\w+$/));
    const ldb = seq("FOR FIELD", FieldSub, optPrio(ldbId));
 
    const commentOpt = per(ldb, modif, visible);
 
    const position = seq(opt(reg(/^\/?[\d\w]+$/)),
                         altPrio(tok(ParenLeft), tok(WParenLeft)),
                         Integer,
                         altPrio(tok(ParenRightW), tok(ParenRight)));
 
    const comment = seq("COMMENT",
                        position,
                        opt(alt(InlineField, TextElement)),
                        opt(commentOpt));
 
    const command = seq("USER-COMMAND", alt(Field, Constant));
 
    const push = seq("PUSHBUTTON",
                     position,
                     alt(InlineField, TextElement),
                     command,
                     opt(modif),
                     opt(visible));
 
    const prog = seq("PROGRAM", Field);
    const def = seq("DEFAULT", opt(prog), "SCREEN", Integer);
 
    const tab = seq("TAB",
                    tok(WParenLeft),
                    Integer,
                    tok(ParenRightW),
                    alt(InlineField, TextElement),
                    command,
                    opt(def),
                    opt(modif));
 
    const func = seq("FUNCTION KEY", Integer);
 
    const skip = seq("SKIP", opt(Integer));
 
    const posSymbols = altPrio("POS_LOW", "POS_HIGH");
 
    // number between 1 and 83
    const posIntegers = reg(/^(0?[1-9]|[1234567][0-9]|8[0-3])$/);
 
    const pos = seq("POSITION",
                    altPrio(posIntegers, posSymbols),
                    opt(seq("FOR TABLE", Field)));
 
    const incl = seq("INCLUDE BLOCKS", BlockName);
 
    const tabbed = seq("BEGIN OF TABBED BLOCK",
                       BlockName,
                       "FOR",
                       Integer,
                       "LINES",
                       optPrio("NO INTERVALS"));
 
    const uline = seq("ULINE", opt(position), opt(modif));
 
    const param = seq("INCLUDE PARAMETERS", Field);
    const iso = seq("INCLUDE SELECT-OPTIONS", Field);
 
    const exclude = seq("EXCLUDE", alt("IDS", "PARAMETERS"), reg(/^\w+$/));
 
    const beginVersion = seq("BEGIN OF VERSION", reg(/^\w+$/), TextElement);
    const endVersion = seq("END OF VERSION", reg(/^\w+$/));
 
    const ret = seq("SELECTION-SCREEN",
                    altPrio(comment,
                            func,
                            skip,
                            pos,
                            incl,
                            iso,
                            push,
                            tab,
                            uline,
                            beginBlock,
                            tabbed,
                            endBlock,
                            beginLine,
                            endLine,
                            param,
                            beginScreen,
                            endScreen,
                            exclude,
                            beginVersion,
                            endVersion,));
 
    return verNot(Version.Cloud, ret);
  }
 
}