From bfff1ac8b2435595351194f6c4b1268d38301401 Mon Sep 17 00:00:00 2001 From: Zahary Karadjov Date: Sun, 26 May 2013 01:36:34 +0300 Subject: [PATCH] allow keyword params for the `[]` and `{}` operators conceptually, these operators are not very different from regular procs in the way they are defined and overloaded. keyword params for them are admittedly less useful, but they improve consistency and may help with generic instantiations once default generic parameters are supported. --- compiler/parser.nim | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/compiler/parser.nim b/compiler/parser.nim index 7cfd35a41..e400f4bb5 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -627,6 +627,13 @@ proc identOrLiteral(p: var TParser, mode: TPrimaryMode): PNode = getTok(p) # we must consume a token here to prevend endless loops! result = ast.emptyNode +proc namedParams(p: var TParser, callee: PNode, + kind: TNodeKind, endTok: TTokType): PNode = + let a = callee + result = newNodeP(kind, p) + addSon(result, a) + exprColonEqExprListAux(p, endTok, result) + proc primarySuffix(p: var TParser, r: PNode): PNode = #| primarySuffix = '(' (exprColonEqExpr comma?)* ')' doBlocks? #| | doBlocks @@ -636,11 +643,8 @@ proc primarySuffix(p: var TParser, r: PNode): PNode = result = r while p.tok.indent < 0: case p.tok.tokType - of tkParLe: - var a = result - result = newNodeP(nkCall, p) - addSon(result, a) - exprColonEqExprListAux(p, tkParRi, result) + of tkParLe: + result = namedParams(p, result, nkCall, tkParRi) if result.len > 1 and result.sons[1].kind == nkExprColonExpr: result.kind = nkObjConstr else: @@ -653,10 +657,10 @@ proc primarySuffix(p: var TParser, r: PNode): PNode = of tkDot: result = dotExpr(p, result) result = parseGStrLit(p, result) - of tkBracketLe: - result = indexExprList(p, result, nkBracketExpr, tkBracketRi) + of tkBracketLe: + result = namedParams(p, result, nkBracketExpr, tkBracketRi) of tkCurlyLe: - result = indexExprList(p, result, nkCurlyExpr, tkCurlyRi) + result = namedParams(p, result, nkCurlyExpr, tkCurlyRi) else: break proc primary(p: var TParser, mode: TPrimaryMode): PNode