lambdaParameters method

  1. @override
Parser<ArgumentsNode> lambdaParameters()
inherited

Lambda parameters — like function params but without type annotations. Overridden by PythonDeclarationGrammar to support *args, **kwargs.

Implementation

@override
Parser<ArgumentsNode> lambdaParameters() =>
    seq2(
      ref0(lambdaParamItem).plusSeparated(ref1(token, ',')),
      ref1(token, ',').optional(),
    ).map2((seq, _) {
      final posonly = <ArgNode>[];
      final args = <ArgNode>[];
      ArgNode? vararg;
      final kwonly = <ArgNode>[];
      final kwDefaults = <ExpressionNode?>[];
      ArgNode? kwarg;
      final defaults = <ExpressionNode>[];

      var seenStar = false;

      for (final item in seq.elements) {
        if (item.isSlash) {
          posonly.addAll(args);
          args.clear();
        } else if (item.isBareStar) {
          seenStar = true;
        } else if (item.isVararg) {
          vararg = item.arg;
          seenStar = true;
        } else if (item.isKwarg) {
          kwarg = item.arg;
        } else if (item.arg case final arg?) {
          final defaultVal = item.defaultVal;
          if (seenStar) {
            kwonly.add(arg);
            kwDefaults.add(defaultVal);
          } else {
            args.add(arg);
            if (defaultVal != null) {
              defaults.add(defaultVal);
            }
          }
        }
      }

      return ArgumentsNode(
        posonlyargs: posonly,
        args: args,
        vararg: vararg,
        kwonlyargs: kwonly,
        kwDefaults: kwDefaults,
        kwarg: kwarg,
        defaults: defaults,
      );
    });