methodOrFunctionDeclaration method

Parser<FunctionDeclarationNode> methodOrFunctionDeclaration()
inherited

Implementation

Parser<FunctionDeclarationNode> methodOrFunctionDeclaration() => [
  // 1. Explicit return type: int foo() {}
  seq7(
    ref0(methodModifier).star(),
    ref0(type),
    ref0(identifier),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref0(formalParameters),
    ref0(asyncOrSyncModifier).optional(),
    ref0(methodBody),
  ).map7(
    (modifiers, returnType, name, typeParams, params, asyncMod, body) =>
        FunctionDeclarationNode(
          name: name,
          returnType: returnType,
          typeParameters: typeParams,
          parameters: params,
          body: body,
          isStatic: modifiers.contains('static'),
          isAbstract: modifiers.contains('abstract'),
          isExternal: modifiers.contains('external'),
        ),
  ),
  // 2. Untyped: foo() {} or foo<T>() {}
  seq6(
    ref0(methodModifier).star(),
    ref0(identifier),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref0(formalParameters),
    ref0(asyncOrSyncModifier).optional(),
    ref0(methodBody),
  ).map6(
    (modifiers, name, typeParams, params, asyncMod, body) =>
        FunctionDeclarationNode(
          name: name,
          typeParameters: typeParams,
          parameters: params,
          body: body,
          isStatic: modifiers.contains('static'),
          isAbstract: modifiers.contains('abstract'),
          isExternal: modifiers.contains('external'),
        ),
  ),
].toChoiceParser();