All files / src/abap/5_syntax/expressions form_param.ts

80% Statements 44/55
75% Branches 12/16
100% Functions 1/1
80% Lines 44/55

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 551x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 54x 54x     54x 54x 4x 4x 54x 54x 10x 10x 10x 10x 10x 10x 8x 8x 10x     10x 10x 44x 44x 44x 54x 24x 24x 24x 20x 20x 54x 20x 20x               1x
import {ExpressionNode} from "../../nodes";
import {TypedIdentifier, IdentifierMeta} from "../../types/_typed_identifier";
import {AnyType, UnknownType} from "../../types/basic";
import {FormParamName, SimpleFieldChain} from "../../2_statements/expressions";
import {BasicTypes} from "../basic_types";
import {AbstractType} from "../../types/basic/_abstract_type";
import {SyntaxInput} from "../_syntax_input";
import {AssertError} from "../assert_error";
import {Identifier} from "../../1_lexer/tokens";
 
export class FormParam {
  public static runSyntax(node: ExpressionNode, input: SyntaxInput): TypedIdentifier {
    const formParamName = node.findFirstExpression(FormParamName);
    if (formParamName === undefined) {
      throw new AssertError("FormParam, could not find FormParamName");
    }
    let nameToken = formParamName.getFirstToken();
    if (formParamName.getChildren().length > 1) {
      nameToken = new Identifier(nameToken.getStart(), formParamName.concatTokens());
    }
 
    if (node.findDirectTokenByText("STRUCTURE") && nameToken) {
      // STRUCTURES typing
      const typeName = node.findDirectExpression(SimpleFieldChain)?.getFirstToken().getStr();
      let type: AbstractType | TypedIdentifier | undefined = undefined;
      if (typeName) {
        type = input.scope.findType(typeName)?.getType();
        if (type === undefined) {
          type = input.scope.getDDIC().lookupTableOrView(typeName).type;
        }
      } else {
        type = new UnknownType("todo, FORM STRUCTURES typing");
      }
      return new TypedIdentifier(nameToken, input.filename, type, [IdentifierMeta.FormParameter]);
    }
 
 
 
    if (node.getChildren().length === 1 && nameToken) {
      // untyped FORM parameter
      return new TypedIdentifier(nameToken, input.filename, AnyType.get(), [IdentifierMeta.FormParameter]);
    }
 
    const bfound = new BasicTypes(input).parseType(node);
    if (nameToken && bfound) {
      return new TypedIdentifier(nameToken, input.filename, bfound, [IdentifierMeta.FormParameter]);
    }

    if (nameToken) {
      return new TypedIdentifier(nameToken, input.filename, new UnknownType("FormParam, todo"), [IdentifierMeta.FormParameter]);
    }

    throw new AssertError("FormParam, unexpected node");
  }
}