mirror of
https://github.com/nim-lang/Nim.git
synced 2026-06-04 02:44:44 +00:00
Bugfix: Allow matching on nkExprEqExpr against varargs[untyped]
This enables macros accepting arbitrary keyword arguments:
log("foo", prop1 = "bar", prop2 = "baz")
As an added bonus, simple templates with varargs arguments can now
forward their params to procs accepting keyword arguments.
This commit is contained in:
committed by
Andreas Rumpf
parent
2b8bf8fc4a
commit
e678a4285d
@@ -2173,7 +2173,8 @@ proc matchesAux(c: PContext, n, nOrig: PNode,
|
||||
var formal: PSym = if formalLen > 1: m.callee.n.sons[1].sym else: nil
|
||||
|
||||
while a < n.len:
|
||||
if a >= formalLen-1 and formal != nil and formal.typ.isVarargsUntyped:
|
||||
if a >= formalLen-1 and f < formalLen and m.callee.n[f].typ.isVarargsUntyped:
|
||||
formal = m.callee.n.sons[f].sym
|
||||
incl(marker, formal.position)
|
||||
if container.isNil:
|
||||
container = newNodeIT(nkArgList, n.sons[a].info, arrayConstr(c, n.info))
|
||||
|
||||
@@ -6,6 +6,10 @@ output: '''baz
|
||||
a
|
||||
b
|
||||
c
|
||||
x: 1, y: test 1
|
||||
x: 2, y: test 2
|
||||
x: 10, y: test 3
|
||||
x: 4, y: test 4
|
||||
'''
|
||||
"""
|
||||
|
||||
@@ -35,3 +39,14 @@ templateForwarding fooVarargs, "test".len > 3, Foo(x: 10), Foo(x: 100), Foo(x: 1
|
||||
|
||||
procForwarding "a", "b", "c"
|
||||
|
||||
proc hasKeywordArgs(x = 10, y = "y") =
|
||||
echo "x: ", x, ", y: ", y
|
||||
|
||||
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, y = "test 3")
|
||||
templateForwarding(hasKeywordArgs, true, y = "test 4", x = 4)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user