typeAliasDeclaration method

Parser<TypeAliasDeclarationNode> typeAliasDeclaration()
inherited

Implementation

Parser<TypeAliasDeclarationNode> typeAliasDeclaration() => [
  // 1. New-style: typedef Name<T> = Type;
  seq5(
    ref0(typedefToken),
    ref0(identifier),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref1(token, '='),
    seq2(ref0(type), ref1(token, ';')),
  ).map5(
    (_, name, typeParams, _, typeAndSemi) => TypeAliasDeclarationNode(
      name: name,
      typeParameters: typeParams,
      type: typeAndSemi.$1,
    ),
  ),
  // 2. Old-style with return type: typedef Type Name<T>(params);
  seq6(
    ref0(typedefToken),
    ref0(type),
    ref0(identifier),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref0(formalParameters),
    ref1(token, ';'),
  ).map6(
    (_, returnType, name, typeParams, params, _) => TypeAliasDeclarationNode(
      name: name,
      typeParameters: typeParams,
      type: FunctionTypeNode(returnType: returnType, parameters: params),
    ),
  ),
  // 3. Old-style untyped: typedef Name<T>(params);
  seq5(
    ref0(typedefToken),
    ref0(identifier),
    ref0(typeParameters).optionalWith(const <TypeParameterNode>[]),
    ref0(formalParameters),
    ref1(token, ';'),
  ).map5(
    (_, name, typeParams, params, _) => TypeAliasDeclarationNode(
      name: name,
      typeParameters: typeParams,
      type: FunctionTypeNode(parameters: params),
    ),
  ),
].toChoiceParser();