simpleFormalParameter method

Parser<SimpleParameterNode> simpleFormalParameter()
inherited

Implementation

Parser<SimpleParameterNode> simpleFormalParameter() => [
  // Typed with name: int x
  seq5(
    ref0(covariantToken).optional(),
    [ref0(finalToken), ref0(varToken)].toChoiceParser().optional(),
    ref0(type),
    ref0(identifier),
    (ref1(token, '=') & ref0(expression))
        .map((l) => l[1] as ExpressionNode)
        .optional(),
  ).map5(
    (cov, finalOrVar, type, name, defaultVal) => SimpleParameterNode(
      name: name,
      type: type,
      defaultValue: defaultVal,
      isFinal: finalOrVar?.value == 'final',
      isVar: finalOrVar?.value == 'var',
    ),
  ),
  // Untyped name (e.g. `(x)`) or type-only parameter in function types (e.g. `(int)`)
  seq5(
    ref0(covariantToken).optional(),
    [ref0(finalToken), ref0(varToken)].toChoiceParser().optional(),
    epsilon(),
    ref0(type),
    (ref1(token, '=') & ref0(expression))
        .map((l) => l[1] as ExpressionNode)
        .optional(),
  ).map5((cov, finalOrVar, _, type, defaultVal) {
    if (type is NamedTypeNode &&
        !type.isNullable &&
        type.typeArguments.isEmpty) {
      return SimpleParameterNode(
        name: type.name,
        defaultValue: defaultVal,
        isFinal: finalOrVar?.value == 'final',
        isVar: finalOrVar?.value == 'var',
      );
    }
    return SimpleParameterNode(
      name: '',
      type: type,
      defaultValue: defaultVal,
      isFinal: finalOrVar?.value == 'final',
      isVar: finalOrVar?.value == 'var',
    );
  }),
].toChoiceParser();