'newEnum' proc added to macros.nim (#6000)
This commit is contained in:
parent
d072229975
commit
963184fea6
1 changed files with 42 additions and 0 deletions
|
|
@ -895,6 +895,48 @@ proc newIfStmt*(branches: varargs[tuple[cond, body: NimNode]]):
|
||||||
for i in branches:
|
for i in branches:
|
||||||
result.add(newNimNode(nnkElifBranch).add(i.cond, i.body))
|
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.}=
|
proc copyChildrenTo*(src, dest: NimNode) {.compileTime.}=
|
||||||
## Copy all children from `src` to `dest`
|
## Copy all children from `src` to `dest`
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue