type method

Parser<TypeNode> type()
inherited

The main type production.

Implementation

Parser<TypeNode> type() => [
  // Standalone Function type without return type: Function(...)
  seq4(
    ref0(functionToken),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref0(formalParameters),
    ref1(token, '?').optional(),
  ).map4(
    (_, typeParams, params, q) => FunctionTypeNode(
      typeParameters: typeParams,
      parameters: params,
      isNullable: q != null,
    ),
  ),
  // Non-function base type with optional Function suffixes
  seq2(
    ref0(nonFunctionType),
    seq4(
      ref0(functionToken),
      ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
      ref0(formalParameters),
      ref1(token, '?').optional(),
    ).star(),
  ).map2((base, functionSuffixes) {
    var current = base;
    for (final suffix in functionSuffixes) {
      current = FunctionTypeNode(
        returnType: current,
        typeParameters: suffix.$2,
        parameters: suffix.$3,
        isNullable: suffix.$4 != null,
      );
    }
    return current;
  }),
].toChoiceParser();