summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2018-12-19 11:11:33 +0100
committerAndreas Rumpf <rumpf_a@web.de>2018-12-19 11:11:33 +0100
commit3300c8a500d0b730507180746278ecbd2a1ac1d0 (patch)
treeaec63bfafa9692b58dd1477d20050835d322dafc
parent8e90ed06188ca27932028703b7f31640cdbfa99a (diff)
downloadNim-3300c8a500d0b730507180746278ecbd2a1ac1d0.tar.gz
much simpler implementation of constant tuple declarations
-rw-r--r--compiler/ast.nim3
-rw-r--r--compiler/parser.nim54
-rw-r--r--compiler/semstmts.nim24
-rw-r--r--lib/core/macros.nim7
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