constructorDeclaration method

Parser<ConstructorDeclarationNode> constructorDeclaration()
inherited

Implementation

Parser<ConstructorDeclarationNode> constructorDeclaration() => [
  // Shorthand constructor syntax: const new(...); or new.named(...);
  seq6(
    ref0(externalToken).optional(),
    ref0(constToken).optional(),
    ref0(newToken),
    ([ref1(token, '.'), epsilon()].toChoiceParser() &
            ref0(constructorIdentifier))
        .map((l) => l[1] as String)
        .optional(),
    ref0(formalParameters),
    ref0(constructorBodyOrInitializers),
  ).map6(
    (externalKw, constKw, _, ctorName, params, initsAndBody) =>
        ConstructorDeclarationNode(
          name: 'new',
          constructorName: ctorName,
          parameters: params,
          initializers: initsAndBody.$1,
          body: initsAndBody.$2,
          isConst: constKw != null,
          isExternal: externalKw != null,
          redirectedConstructor: initsAndBody.$3,
        ),
  ),
  // Standard constructor syntax: ClassName(...) or ClassName.identifier(...) or ClassName.new(...)
  // Also supports concise factory constructors: factory(...) or factory.identifier(...)
  seq7(
        ref0(externalToken).optional(),
        ref0(constToken).optional(),
        ref0(factoryToken).optional(),
        ref0(identifier).optional(),
        (ref1(token, '.') & ref0(constructorIdentifier))
            .map((l) => l[1] as String)
            .optional(),
        ref0(formalParameters),
        ref0(constructorBodyOrInitializers),
      )
      .where(
        (l) => l.$3 != null || l.$4 != null,
        message: 'constructor name expected',
      )
      .map7(
        (
          externalKw,
          constKw,
          factoryKw,
          name,
          ctorName,
          params,
          initsAndBody,
        ) => ConstructorDeclarationNode(
          name: name ?? 'factory',
          constructorName: ctorName,
          parameters: params,
          initializers: initsAndBody.$1,
          body: initsAndBody.$2,
          isConst: constKw != null,
          isFactory: factoryKw != null,
          isExternal: externalKw != null,
          redirectedConstructor: initsAndBody.$3,
        ),
      ),
].toChoiceParser();