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

100% Statements 44/44
100% Branches 20/20
100% Functions 1/1
100% Lines 44/44

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 451x 1x 1x 1x 1x 1x 1x 1x 1x 27x 27x 27x 27x 27x 2x 2x 2x 2x 25x 25x 27x 1x 1x 1x 1x 24x 27x 27x 27x 27x 4x 4x 4x 4x 4x 4x 4x 27x 6x 20x 5x 5x 27x 1x  
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {IdentifierMeta, TypedIdentifier} from "../../types/_typed_identifier";
import {CharacterType, StructureType} from "../../types/basic";
import {StatementSyntax} from "../_statement_syntax";
import {SyntaxInput, syntaxIssue} from "../_syntax_input";
 
export class SelectionScreen implements StatementSyntax {
  public runSyntax(node: StatementNode, input: SyntaxInput) {
 
    const blockNode = node.findFirstExpression(Expressions.BlockName);
    const blockToken = blockNode?.getFirstToken();
    const blockName = blockNode?.concatTokens();
    if (blockName !== undefined && blockName.length > 16) {
      const message = "SELECTION-SCREEN block name too long, " + blockName;
      input.issues.push(syntaxIssue(input, node.getFirstToken(), message));
      return;
    }
 
    const field = node.findFirstExpression(Expressions.InlineField);
    if (field !== undefined && field.getFirstToken().getStr().length > 8) {
      const message = "SELECTION-SCREEN name too long, " + field.getFirstToken().getStr();
      input.issues.push(syntaxIssue(input, field.getFirstToken(), message));
      return;
    }
 
    const fieldName = field?.getFirstToken();
 
    const concat = node.concatTokens().toUpperCase();
    if (concat.includes("BEGIN OF TABBED BLOCK") && blockToken) {
      const type = new StructureType([
        {name: "PROG", type: new CharacterType(40)},
        {name: "DYNNR", type: new CharacterType(4)},
        {name: "ACTIVETAB", type: new CharacterType(132)},
      ]);
 
      input.scope.addIdentifier(new TypedIdentifier(blockToken, input.filename, type, [IdentifierMeta.SelectionScreenTab]));
    } else if (concat.startsWith("SELECTION-SCREEN TAB") && fieldName) {
      input.scope.addIdentifier(new TypedIdentifier(fieldName, input.filename, new CharacterType(83), [IdentifierMeta.SelectionScreenTab]));
    } else if (fieldName) {
      input.scope.addIdentifier(new TypedIdentifier(fieldName, input.filename, new CharacterType(83)));
    }
  }
}