summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelog.md2
-rw-r--r--compiler/parser.nim17
-rw-r--r--tests/overload/tparam_forwarding.nim5
3 files changed, 18 insertions, 6 deletions
diff --git a/changelog.md b/changelog.md
index 9af2aae83..fe935106a 100644
--- a/changelog.md
+++ b/changelog.md
@@ -95,11 +95,13 @@
 
 - ``nil`` for strings/seqs is finally gone. Instead the default value for
   these is ``"" / @[]``.
+
 - Accessing the binary zero terminator in Nim's native strings
   is now invalid. Internally a Nim string still has the trailing zero for
   zero-copy interoperability with ``cstring``. Compile your code with the
   new switch ``--laxStrings:on`` if you need a transition period.
 
+- The command syntax now supports keyword arguments after the first comma.
 
 ### Tool changes
 
diff --git a/compiler/parser.nim b/compiler/parser.nim
index 14683e307..0a3815f13 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -702,10 +702,17 @@ proc namedParams(p: var TParser, callee: PNode,
   # progress guaranteed
   exprColonEqExprListAux(p, endTok, result)
 
-proc commandParam(p: var TParser): PNode =
+proc commandParam(p: var TParser, isFirstParam: var bool): PNode =
   result = parseExpr(p)
   if p.tok.tokType == tkDo:
     result = postExprBlocks(p, result)
+  elif p.tok.tokType == tkEquals and not isFirstParam:
+    let lhs = result
+    result = newNodeP(nkExprEqExpr, p)
+    getTok(p)
+    addSon(result, lhs)
+    addSon(result, parseExpr(p))
+  isFirstParam = false
 
 proc primarySuffix(p: var TParser, r: PNode, baseIndent: int): PNode =
   #| primarySuffix = '(' (exprColonEqExpr comma?)* ')' doBlocks?
@@ -748,10 +755,11 @@ proc primarySuffix(p: var TParser, r: PNode, baseIndent: int): PNode =
         let a = result
         result = newNodeP(nkCommand, p)
         addSon(result, a)
+        var isFirstParam = true
         when true:
           # progress NOT guaranteed
           p.hasProgress = false
-          addSon result, commandParam(p)
+          addSon result, commandParam(p, isFirstParam)
           if not p.hasProgress: break
         else:
           while p.tok.tokType != tkEof:
@@ -1303,17 +1311,18 @@ proc parseExprStmt(p: var TParser): PNode =
     addSon(result, b)
   else:
     # simpleExpr parsed 'p a' from 'p a, b'?
+    var isFirstParam = false
     if p.tok.indent < 0 and p.tok.tokType == tkComma and a.kind == nkCommand:
       result = a
       while true:
         getTok(p)
         optInd(p, result)
-        addSon(result, commandParam(p))
+        addSon(result, commandParam(p, isFirstParam))
         if p.tok.tokType != tkComma: break
     elif p.tok.indent < 0 and isExprStart(p):
       result = newNode(nkCommand, a.info, @[a])
       while true:
-        addSon(result, commandParam(p))
+        addSon(result, commandParam(p, isFirstParam))
         if p.tok.tokType != tkComma: break
         getTok(p)
         optInd(p, result)
diff --git a/tests/overload/tparam_forwarding.nim b/tests/overload/tparam_forwarding.nim
index cd3de32e3..b0eea42c7 100644
--- a/tests/overload/tparam_forwarding.nim
+++ b/tests/overload/tparam_forwarding.nim
@@ -46,7 +46,8 @@ proc hasRegularArgs(x: int, y: string) =
   echo "x: ", x, ", y: ", y
 
 templateForwarding(hasRegularArgs, true, 1, "test 1")
-templateForwarding(hasKeywordArgs, true, 2, "test 2")
+templateForwarding hasKeywordArgs, true, 2, "test 2"
+
 templateForwarding(hasKeywordArgs, true, y = "test 3")
-templateForwarding(hasKeywordArgs, true, y = "test 4", x = 4)
+templateForwarding hasKeywordArgs, true, y = "test 4", x = 4