Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import macros
- proc newWhenUseWinSdkTypedef*(name, importc, header, typ: NimNode): NimNode =
- var whenStmt = newNimNode(nnkWhenStmt)
- var useWinSdkBranch = newNimNode(nnkElifBranch)
- var useWinSdkCond = newNimNode(nnkCall)
- useWinSdkCond.add(newIdentNode(!"defined"), newIdentNode(!"useWinSdk"))
- useWinSdkBranch.add(useWinSdkCond)
- var winSdkTypeSec = newNimNode(nnkTypeSection)
- var winSdkTypeDef = newNimNode(nnkTypeDef)
- winSdkTypeDef.add(name)
- var winSdkTypePragma = newNimNode(nnkPragma)
- winSdkTypePragma.add(newColonExpr(newIdentNode(!"importC"), importc))
- winSdkTypePragma.add(newColonExpr(newIdentNode(!"header"), header))
- winSdkTypeDef.add(winSdkTypePragma)
- winSdkTypeDef.add(typ)
- winSdkTypeSec.add(winSdkTypeDef)
- useWinSdkBranch.add(winSdkTypeSec)
- whenStmt.add(useWinSdkBranch)
- var elseBranch = newNimNode(nnkElse)
- var elseTypeSec = newNimNode(nnkTypeSection)
- var elseTypeDef = newNimNode(nnkTypeDef)
- elseTypeDef.add(name, newEmptyNode(), typ)
- elseTypeSec.add(elseTypeDef)
- elseBranch.add(elseTypeSec)
- whenStmt.add(elseBranch)
- result = whenStmt
- echo repr result
- proc newWhenUseWinSdkExportTypedef*(name, importc, header, typ: NimNode): NimNode =
- var exportPostfix = newNimNode(nnkPostfix)
- exportPostfix.add(newIdentNode(!"*"))
- exportPostfix.add(name)
- newWhenUseWinSdkTypedef(exportPostfix, importc, header, typ)
- macro winsdkTypeDef*(name: untyped, importc, header: string, typ: untyped): typed =
- newWhenUseWinSdkTypedef(name, importc, header, typ)
- macro winsdkTypeDefExp*(name: untyped, importc: string, header: string, typ: untyped): typed =
- newWhenUseWinSdkExportTypedef(name, importc, header, typ)
- winsdkTypeDefExp(UlongPtr, "ULONG_PTR", "<Windows.h>", uint)
- # Produces
- # when defined(useWinSdk):
- # type
- # UlongPtr* {.importC: "ULONG_PTR", header: "<Windows.h>".} = uint
- # else:
- # type
- # UlongPtr* = uint
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement