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

88% Statements 22/25
62.5% Branches 10/16
100% Functions 1/1
88% Lines 22/25

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 491x     1x 1x 1x 1x     1x   5x   5x 1x     5x 5x 5x 5x 1x 1x 1x 1x     1x     1x       5x           5x 5x              
import * as Expressions from "../../2_statements/expressions";
import {StatementNode} from "../../nodes";
import {CurrentScope} from "../_current_scope";
import {TypedIdentifier} from "../../types/_typed_identifier";
import {UnknownType, TableType, StructureType, CharacterType, VoidType} from "../../types/basic";
import {BasicTypes} from "../basic_types";
import {Dynamic} from "../expressions/dynamic";
import {StatementSyntax} from "../_statement_syntax";
 
export class SelectOption implements StatementSyntax {
  public runSyntax(node: StatementNode, scope: CurrentScope, filename: string): void {
    const nameToken = node.findFirstExpression(Expressions.FieldSub)?.getFirstToken();
 
    for(const d of node.findDirectExpressions(Expressions.Dynamic)) {
      new Dynamic().runSyntax(d, scope, filename);
    }
 
    const nameExpression = node.findFirstExpression(Expressions.FieldChain);
    let found = new BasicTypes(filename, scope).resolveLikeName(nameExpression);
    Eif (found && nameToken) {
      if (found instanceof StructureType) {
        let length = 0;
        for (const c of found.getComponents()) {
          Eif (c.type instanceof CharacterType) {
            length += c.type.getLength();
          }
        }
        Iif (length === 0) {
          found = new VoidType("Selectoption, fallback");
        } else {
          found = new CharacterType(length);
        }
      }
 
      const stru = new StructureType([
        {name: "SIGN", type: new CharacterType(1)},
        {name: "OPTION", type: new CharacterType(2)},
        {name: "LOW", type: found},
        {name: "HIGH", type: found},
      ]);
      scope.addIdentifier(new TypedIdentifier(nameToken, filename, new TableType(stru, {withHeader: true})));
      return;
    }
 
    if (nameToken) {
      scope.addIdentifier(new TypedIdentifier(nameToken, filename, new UnknownType("Select option, fallback")));
    }
  }
}