mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-22 07:15:22 +00:00
'newEnum' proc added to macros.nim (#6000)
This commit is contained in:
@@ -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`
|
||||
|
||||
Reference in New Issue
Block a user