From 06e51751cde58ba055e6fa8b636e8f8dbe4d3925 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= <hugo@lysator.liu.se>
Date: Thu, 21 Sep 2023 01:40:41 +0200
Subject: [PATCH] Handle function calls with accompanying lambda.

---
 muppet/puppet/ast.py           | 7 +++++++
 muppet/puppet/format/parser.py | 4 +++-
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/muppet/puppet/ast.py b/muppet/puppet/ast.py
index 5b4afb9..de266e8 100644
--- a/muppet/puppet/ast.py
+++ b/muppet/puppet/ast.py
@@ -111,6 +111,7 @@ class PuppetCall(PuppetAST):
 
     func: PuppetAST
     args: list[PuppetAST]
+    block: Optional[PuppetAST] = None
 
 
 @dataclass
@@ -579,6 +580,12 @@ def build_ast(form: Any) -> PuppetAST:
         case ['array', *items]:
             return PuppetArray([build_ast(x) for x in items])
 
+        case ['call', {'functor': func, 'args': args, 'block': block}]:
+            return PuppetCall(
+                build_ast(func),
+                [build_ast(x) for x in args],
+                build_ast(block))
+
         case ['call', {'functor': func, 'args': args}]:
             return PuppetCall(
                 build_ast(func),
diff --git a/muppet/puppet/format/parser.py b/muppet/puppet/format/parser.py
index 0ad5bb1..872a1f5 100644
--- a/muppet/puppet/format/parser.py
+++ b/muppet/puppet/format/parser.py
@@ -365,7 +365,9 @@ class ParserFormatter(Serializer[ParseDirective]):
 
     @override
     def _puppet_call(self, it: PuppetCall) -> ParseDirective:
-        return ws & self.s(it.func) & ws & self.known_array('()', it.args)
+        return ws & self.s(it.func) & \
+                optional(ws & self.known_array('()', it.args)) & \
+                optional(ws & self.s(it.block))
 
     @override
     def _puppet_call_method(self, it: PuppetCallMethod) -> ParseDirective:
-- 
GitLab