formalParameterListInternal method

Parser<List<ParameterNode>> formalParameterListInternal()
inherited

Implementation

Parser<List<ParameterNode>> formalParameterListInternal() => [
  // 1. Positional + named: a, b, {c, d}
  seq3(
    ref0(normalFormalParameter)
        .plusSeparated(ref1(token, ','))
        .map((l) => l.elements),
    ref1(token, ',') & ref0(optionalNamedFormalParameters),
    ref1(token, ',').optional(),
  ).map3(
    (normal, named, _) => [...normal, ...named[1] as List<ParameterNode>],
  ),
  // 2. Positional + optional positional: a, b, [c, d]
  seq3(
    ref0(normalFormalParameter)
        .plusSeparated(ref1(token, ','))
        .map((l) => l.elements),
    ref1(token, ',') & ref0(optionalPositionalFormalParameters),
    ref1(token, ',').optional(),
  ).map3((normal, opt, _) => [...normal, ...opt[1] as List<ParameterNode>]),
  // 3. Only named: {a, b}
  seq2(
    ref0(optionalNamedFormalParameters),
    ref1(token, ',').optional(),
  ).map2((named, _) => named),
  // 4. Only optional positional: [a, b]
  seq2(
    ref0(optionalPositionalFormalParameters),
    ref1(token, ',').optional(),
  ).map2((opt, _) => opt),
  // 5. Only positional: a, b
  seq2(
    ref0(normalFormalParameter)
        .plusSeparated(ref1(token, ','))
        .map((l) => l.elements),
    ref1(token, ',').optional(),
  ).map2((normal, _) => normal),
].toChoiceParser();