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

86.79% Statements 46/53
42.85% Branches 3/7
100% Functions 1/1
86.79% Lines 46/53

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 531x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 5x 5x 5x     5x 5x 1x 1x 5x 5x 5x 5x 5x 1x 1x 1x 1x 1x 1x 1x   1x 1x 1x 1x 5x 5x 5x 5x 5x 5x 5x 5x 5x 5x         5x 1x
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, TableKeyType} 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();
 
    if (nameToken && nameToken.getStr().length > 8) {
      throw new Error("Select-option name too long, " + nameToken.getStr());
    }
 
    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);
    if (found && nameToken) {
      if (found instanceof StructureType) {
        let length = 0;
        for (const c of found.getComponents()) {
          if (c.type instanceof CharacterType) {
            length += c.type.getLength();
          }
        }
        if (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, keyType: TableKeyType.default})));
      return;
    }

    if (nameToken) {
      scope.addIdentifier(new TypedIdentifier(nameToken, filename, new UnknownType("Select option, fallback")));
    }
  }
}