unify tuple expressions (#13793)
* unify tuple expressions * fix test * fix test * apply feedback * Handle empty tuples * Fix rendering named unary tuple * Protect static NimNode against stripping * Slightly less hacky * Revert "Slightly less hacky" This reverts commit 170c5aec0addc029f637afbc948700ca006b7942. * Slightly less hacky * Cleanup * Fix test * Fix another test * Add condsym * Rebase fallout * changelog: Move from compiler changes to language changes * Add stricter tests * Add empty tuple example to doc/astspec * Fix test Co-authored-by: Clyybber <darkmine956@gmail.com>
This commit is contained in:
parent
35655cd189
commit
159c06e045
13 changed files with 136 additions and 32 deletions
|
|
@ -131,3 +131,4 @@ proc initDefines*(symbols: StringTableRef) =
|
|||
defineSymbol("nimHasHintAsError")
|
||||
defineSymbol("nimHasSpellSuggest")
|
||||
defineSymbol("nimHasCustomLiterals")
|
||||
defineSymbol("nimHasUnifiedTuple")
|
||||
|
|
|
|||
|
|
@ -421,10 +421,9 @@ proc exprColonEqExprListAux(p: var Parser, endTok: TokType, result: PNode) =
|
|||
var a = exprColonEqExpr(p)
|
||||
result.add(a)
|
||||
if p.tok.tokType != tkComma: break
|
||||
getTok(p)
|
||||
# (1,) produces a tuple expression
|
||||
if endTok == tkParRi and p.tok.tokType == tkParRi and result.kind == nkPar:
|
||||
elif result.kind == nkPar:
|
||||
result.transitionSonsKind(nkTupleConstr)
|
||||
getTok(p)
|
||||
skipComment(p, a)
|
||||
optPar(p)
|
||||
eat(p, endTok)
|
||||
|
|
@ -584,7 +583,10 @@ proc parsePar(p: var Parser): PNode =
|
|||
semiStmtList(p, result)
|
||||
elif p.tok.tokType == tkCurlyDotLe:
|
||||
result.add(parseStmtPragma(p))
|
||||
elif p.tok.tokType != tkParRi:
|
||||
elif p.tok.tokType == tkParRi:
|
||||
# Empty tuple '()'
|
||||
result.transitionSonsKind(nkTupleConstr)
|
||||
else:
|
||||
var a = simpleExpr(p)
|
||||
if p.tok.tokType == tkDo:
|
||||
result = postExprBlocks(p, a)
|
||||
|
|
@ -605,13 +607,14 @@ proc parsePar(p: var Parser): PNode =
|
|||
semiStmtList(p, result)
|
||||
else:
|
||||
a = colonOrEquals(p, a)
|
||||
if a.kind == nkExprColonExpr:
|
||||
result.transitionSonsKind(nkTupleConstr)
|
||||
result.add(a)
|
||||
if p.tok.tokType == tkComma:
|
||||
getTok(p)
|
||||
skipComment(p, a)
|
||||
# (1,) produces a tuple expression:
|
||||
if p.tok.tokType == tkParRi:
|
||||
result.transitionSonsKind(nkTupleConstr)
|
||||
result.transitionSonsKind(nkTupleConstr)
|
||||
# progress guaranteed
|
||||
while p.tok.tokType != tkParRi and p.tok.tokType != tkEof:
|
||||
var a = exprColonEqExpr(p)
|
||||
|
|
|
|||
|
|
@ -1182,7 +1182,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
|
|||
of nkTupleConstr:
|
||||
put(g, tkParLe, "(")
|
||||
gcomma(g, n, c)
|
||||
if n.len == 1: put(g, tkComma, ",")
|
||||
if n.len == 1 and n[0].kind != nkExprColonExpr: put(g, tkComma, ",")
|
||||
put(g, tkParRi, ")")
|
||||
of nkCurly:
|
||||
put(g, tkCurlyLe, "{")
|
||||
|
|
|
|||
|
|
@ -2228,6 +2228,12 @@ proc prepareVMValue(arg: PNode): PNode =
|
|||
if arg.kind in nkLiterals:
|
||||
return arg
|
||||
|
||||
if arg.kind == nkExprColonExpr and arg[0].typ != nil and
|
||||
arg[0].typ.sym != nil and arg[0].typ.sym.magic == mPNimrodNode:
|
||||
# Poor mans way of protecting static NimNodes
|
||||
# XXX: Maybe we need a nkNimNode?
|
||||
return arg
|
||||
|
||||
result = copyNode(arg)
|
||||
if arg.kind == nkTupleConstr:
|
||||
for child in arg:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue