diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2018-12-19 11:11:33 +0100 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2018-12-19 11:11:33 +0100 |
commit | 3300c8a500d0b730507180746278ecbd2a1ac1d0 (patch) | |
tree | aec63bfafa9692b58dd1477d20050835d322dafc | |
parent | 8e90ed06188ca27932028703b7f31640cdbfa99a (diff) | |
download | Nim-3300c8a500d0b730507180746278ecbd2a1ac1d0.tar.gz |
much simpler implementation of constant tuple declarations
-rw-r--r-- | compiler/ast.nim | 3 | ||||
-rw-r--r-- | compiler/parser.nim | 54 | ||||
-rw-r--r-- | compiler/semstmts.nim | 24 | ||||
-rw-r--r-- | lib/core/macros.nim | 7 |
4 files changed, 33 insertions, 55 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim index 9ac27cb57..5f5f296cb 100644 --- a/compiler/ast.nim +++ b/compiler/ast.nim @@ -222,8 +222,7 @@ type nkState, # give a label to a code section (for iterators) nkBreakState, # special break statement for easier code generation nkFuncDef, # a func - nkTupleConstr, # a tuple constructor - nkConstTuple # a ``const (a, b) = expr`` construct + nkTupleConstr # a tuple constructor TNodeKinds* = set[TNodeKind] diff --git a/compiler/parser.nim b/compiler/parser.nim index 01da560c2..e26ea5ee2 100644 --- a/compiler/parser.nim +++ b/compiler/parser.nim @@ -1764,43 +1764,6 @@ proc parseSection(p: var TParser, kind: TNodeKind, else: parMessage(p, errIdentifierExpected, p.tok) -proc parseConstTuple(p: var TParser): PNode = - result = newNodeP(nkConstTuple, p) - getTok(p) # skip '(' - optInd(p, result) - while p.tok.tokType in {tkSymbol, tkAccent}: - addSon(result, identWithPragma(p)) - if p.tok.tokType == tkColon: - getTok(p) - optInd(p, result) - addSon(result, parseTypeDesc(p)) - if p.tok.tokType != tkComma: break - getTok(p) - - addSon(result, p.emptyNode) - eat(p, tkParRi) - eat(p, tkEquals) - optInd(p, result) - addSon(result, parseExpr(p)) - indAndComment(p, result) - -proc parseConstant(p: var TParser): PNode = - #| constant = identWithPragma (colon typeDesc)? '=' optInd expr indAndComment - if p.tok.tokType == tkParLe: result = parseConstTuple(p) - else: - result = newNodeP(nkConstDef, p) - addSon(result, identWithPragma(p)) - if p.tok.tokType == tkColon: - getTok(p) - optInd(p, result) - addSon(result, parseTypeDesc(p)) - else: - addSon(result, p.emptyNode) - eat(p, tkEquals) - optInd(p, result) - addSon(result, parseExpr(p)) - indAndComment(p, result) - proc parseEnum(p: var TParser): PNode = #| enum = 'enum' optInd (symbol optInd ('=' optInd expr COMMENT?)? comma?)+ result = newNodeP(nkEnumTy, p) @@ -2057,6 +2020,23 @@ proc parseVariable(p: var TParser): PNode = result[^1] = postExprBlocks(p, result[^1]) indAndComment(p, result) +proc parseConstant(p: var TParser): PNode = + #| constant = (parseVarTuple / identWithPragma) (colon typeDesc)? '=' optInd expr indAndComment + if p.tok.tokType == tkParLe: result = parseVarTuple(p) + else: + result = newNodeP(nkConstDef, p) + addSon(result, identWithPragma(p)) + if p.tok.tokType == tkColon: + getTok(p) + optInd(p, result) + addSon(result, parseTypeDesc(p)) + else: + addSon(result, p.emptyNode) + eat(p, tkEquals) + optInd(p, result) + addSon(result, parseExpr(p)) + indAndComment(p, result) + proc parseBind(p: var TParser, k: TNodeKind): PNode = #| bindStmt = 'bind' optInd qualifiedIdent ^+ comma #| mixinStmt = 'mixin' optInd qualifiedIdent ^+ comma diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index 9bc5fa432..4b714e1f3 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -542,7 +542,7 @@ proc semConst(c: PContext, n: PNode): PNode = var a = n.sons[i] if c.config.cmd == cmdIdeTools: suggestStmt(c, a) if a.kind == nkCommentStmt: continue - if a.kind notin {nkConstDef, nkConstTuple}: illFormedAst(a, c.config) + if a.kind notin {nkConstDef, nkVarTuple}: illFormedAst(a, c.config) checkMinSonsLen(a, 3, c.config) var length = sonsLen(a) @@ -567,16 +567,16 @@ proc semConst(c: PContext, n: PNode): PNode = continue var b: PNode - if a.kind == nkConstTuple: + if a.kind == nkVarTuple: if typ.kind != tyTuple: localError(c.config, a.info, errXExpected, "tuple") elif int(length/2) != sonsLen(typ): localError(c.config, a.info, errWrongNumberOfVariables) - b = newNodeI(nkConstTuple, a.info) + b = newNodeI(nkVarTuple, a.info) newSons(b, length) b.sons[length-2] = a.sons[length-2] b.sons[length-1] = def - + for j in countup(0, length-3): var v = semIdentDef(c, a.sons[j], skConst) if sfGenSym notin v.flags: addInterfaceDecl(c, v) @@ -584,14 +584,14 @@ proc semConst(c: PContext, n: PNode): PNode = styleCheckDef(c.config, v) onDef(a[j].info, v) - if a.kind != nkConstTuple: - setVarType(c, v, typ) - v.ast = def # no need to copy - b = newNodeI(nkConstDef, a.info) - if importantComments(c.config): b.comment = a.comment - addSon(b, newSymNode(v)) - addSon(b, a.sons[1]) - addSon(b, copyTree(def)) + if a.kind != nkVarTuple: + setVarType(c, v, typ) + v.ast = def # no need to copy + b = newNodeI(nkConstDef, a.info) + if importantComments(c.config): b.comment = a.comment + addSon(b, newSymNode(v)) + addSon(b, a.sons[1]) + addSon(b, copyTree(def)) else: setVarType(c, v, typ.sons[j]) v.ast = def[j] diff --git a/lib/core/macros.nim b/lib/core/macros.nim index 7f0bda080..291858bed 100644 --- a/lib/core/macros.nim +++ b/lib/core/macros.nim @@ -81,8 +81,7 @@ type nnkState, nnkBreakState, nnkFuncDef, - nnkTupleConstr, - nnkConstTuple + nnkTupleConstr NimNodeKinds* = set[NimNodeKind] NimTypeKind* = enum # some types are no longer used, see ast.nim @@ -278,9 +277,9 @@ when defined(nimHasSymOwnerInMacro): when defined(nimHasInstantiationOfInMacro): proc isInstantiationOf*(instanceProcSym, genProcSym: NimNode): bool {.magic: "SymIsInstantiationOf", noSideEffect.} ## check if proc symbol is instance of the generic proc symbol - ## useful to check proc symbols against generic symbols + ## useful to check proc symbols against generic symbols ## returned by `bindSym` - + proc getType*(n: NimNode): NimNode {.magic: "NGetType", noSideEffect.} ## with 'getType' you can access the node's `type`:idx:. A Nim type is ## mapped to a Nim AST too, so it's slightly confusing but it means the same |