'newEnum' proc added to macros.nim (#6000)

This commit is contained in:
WhiteDuke
2017-11-19 00:38:44 +01:00
committed by Andreas Rumpf
parent d072229975
commit 963184fea6

View File

@@ -895,6 +895,48 @@ proc newIfStmt*(branches: varargs[tuple[cond, body: NimNode]]):
for i in branches:
result.add(newNimNode(nnkElifBranch).add(i.cond, i.body))
proc newEnum*(name: NimNode, fields: openArray[NimNode],
public, pure: bool): NimNode {.compileTime.} =
## Creates a new enum. `name` must be an ident. Fields are allowed to be
## either idents or EnumFieldDef
##
## .. code-block:: nim
##
## newEnum(
## name = ident("Colors"),
## fields = [ident("Blue"), ident("Red")],
## public = true, pure = false)
##
## # type Colors* = Blue Red
##
expectKind name, nnkIdent
doAssert len(fields) > 0, "Enum must contain at least one field"
for field in fields:
expectKind field, {nnkIdent, nnkEnumFieldDef}
let enumBody = newNimNode(nnkEnumTy).add(newEmptyNode()).add(fields)
var typeDefArgs = [name, newEmptyNode(), enumBody]
if public:
let postNode = newNimNode(nnkPostfix).add(
newIdentNode("*"), typeDefArgs[0])
typeDefArgs[0] = postNode
if pure:
let pragmaNode = newNimNode(nnkPragmaExpr).add(
typeDefArgs[0],
add(newNimNode(nnkPragma), newIdentNode(!"pure")))
typeDefArgs[0] = pragmaNode
let
typeDef = add(newNimNode(nnkTypeDef), typeDefArgs)
typeSect = add(newNimNode(nnkTypeSection), typeDef)
return typeSect
proc copyChildrenTo*(src, dest: NimNode) {.compileTime.}=
## Copy all children from `src` to `dest`