diff options
author | Araq <rumpf_a@web.de> | 2015-04-24 13:08:42 +0200 |
---|---|---|
committer | Araq <rumpf_a@web.de> | 2015-04-24 13:08:42 +0200 |
commit | 6ca38472a13840906d6f113eb92c11a25db49224 (patch) | |
tree | 97bff3450e2a3ec5ccea4c089c3f463c26ce3de6 /compiler | |
parent | a5f321ea8f0cee7929afaba8bb88bde477c37937 (diff) | |
download | Nim-6ca38472a13840906d6f113eb92c11a25db49224.tar.gz |
cleanups for underscores in tuple unpacking
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/lexer.nim | 9 | ||||
-rw-r--r-- | compiler/semstmts.nim | 16 |
2 files changed, 15 insertions, 10 deletions
diff --git a/compiler/lexer.nim b/compiler/lexer.nim index 27cbfa9da..8080e0e8c 100644 --- a/compiler/lexer.nim +++ b/compiler/lexer.nim @@ -868,9 +868,14 @@ proc rawGetTok*(L: var TLexer, tok: var TToken) = tok.tokType = tkAccent inc(L.bufpos) of '_': - tok.tokType = tkSymbol - tok.ident = getIdent("_") inc(L.bufpos) + if L.buf[L.bufpos] notin SymChars: + tok.tokType = tkSymbol + tok.ident = getIdent("_") + else: + tok.literal = $c + tok.tokType = tkInvalid + lexMessage(L, errInvalidToken, c & " (\\" & $(ord(c)) & ')') of '\"': # check for extended raw string literal: var rawMode = L.bufpos > 0 and L.buf[L.bufpos-1] in SymChars diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index a9331b75a..c355a5bf1 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -369,9 +369,10 @@ proc addToVarSection(c: PContext; result: var PNode; orig, identDefs: PNode) = else: result.add identDefs -proc isDiscardUnderscore(n: PNode): bool = - if n.kind != nkIdent: return false - return n.ident.s == "_" +proc isDiscardUnderscore(v: PSym): bool = + if v.name.s == "_": + v.flags.incl(sfGenSym) + result = true proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = var b: PNode @@ -436,10 +437,8 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode = for j in countup(0, length-3): var v = semIdentDef(c, a.sons[j], symkind) - if sfGenSym notin v.flags and - not isDiscardUnderscore(a.sons[j]): addInterfaceDecl(c, v) - if isDiscardUnderscore(a.sons[j]): - v.flags.incl(sfGenSym) + if sfGenSym notin v.flags and not isDiscardUnderscore(v): + addInterfaceDecl(c, v) when oKeepVariableNames: if c.inUnrolledContext > 0: v.flags.incl(sfShadowed) else: @@ -554,7 +553,8 @@ proc semForVars(c: PContext, n: PNode): PNode = if getCurrOwner().kind == skModule: incl(v.flags, sfGlobal) v.typ = iter.sons[i] n.sons[i] = newSymNode(v) - if sfGenSym notin v.flags: addForVarDecl(c, v) + if sfGenSym notin v.flags and not isDiscardUnderscore(v): + addForVarDecl(c, v) inc(c.p.nestedLoopCounter) n.sons[length-1] = semStmt(c, n.sons[length-1]) dec(c.p.nestedLoopCounter) |