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

100% Statements 47/47
100% Branches 22/22
100% Functions 1/1
100% Lines 47/47

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 481x 1x 1x 1x 1x 1x 1x 1x 1x 35x 35x 35x 35x 35x 35x 35x 35x 35x 3x 3x 3x 3x 32x 32x 35x 1x 1x 1x 1x 31x 35x 35x 35x 4x 4x 4x 4x 4x 4x 4x 35x 10x 27x 5x 5x 35x 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();
    const concat = node.concatTokens().toUpperCase();
 
    const maxNameLengthAllowed = concat.includes("BEGIN OF TABBED BLOCK") ? 16 : 20;
 
    if (blockName !== undefined && blockName.length > maxNameLengthAllowed) {
      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();
 
    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)));
    }
  }
}