constructorDeclaration method
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();