Advertisement
Guest User

nim-typeImportC-macro

a guest
Apr 7th, 2017
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.89 KB | None | 0 0
  1. import macros
  2.  
  3. proc newWhenUseWinSdkTypedef*(name, importc, header, typ: NimNode): NimNode =
  4.   var whenStmt = newNimNode(nnkWhenStmt)
  5.   var useWinSdkBranch = newNimNode(nnkElifBranch)
  6.   var useWinSdkCond = newNimNode(nnkCall)
  7.   useWinSdkCond.add(newIdentNode(!"defined"), newIdentNode(!"useWinSdk"))
  8.   useWinSdkBranch.add(useWinSdkCond)
  9.   var winSdkTypeSec = newNimNode(nnkTypeSection)
  10.   var winSdkTypeDef = newNimNode(nnkTypeDef)
  11.   winSdkTypeDef.add(name)
  12.   var winSdkTypePragma = newNimNode(nnkPragma)
  13.   winSdkTypePragma.add(newColonExpr(newIdentNode(!"importC"), importc))
  14.   winSdkTypePragma.add(newColonExpr(newIdentNode(!"header"), header))
  15.   winSdkTypeDef.add(winSdkTypePragma)
  16.   winSdkTypeDef.add(typ)
  17.   winSdkTypeSec.add(winSdkTypeDef)
  18.   useWinSdkBranch.add(winSdkTypeSec)
  19.   whenStmt.add(useWinSdkBranch)
  20.   var elseBranch = newNimNode(nnkElse)
  21.   var elseTypeSec = newNimNode(nnkTypeSection)
  22.   var elseTypeDef = newNimNode(nnkTypeDef)
  23.   elseTypeDef.add(name, newEmptyNode(), typ)
  24.   elseTypeSec.add(elseTypeDef)
  25.   elseBranch.add(elseTypeSec)
  26.   whenStmt.add(elseBranch)
  27.   result = whenStmt
  28.   echo repr result
  29.  
  30. proc newWhenUseWinSdkExportTypedef*(name, importc, header, typ: NimNode): NimNode =
  31.   var exportPostfix = newNimNode(nnkPostfix)
  32.   exportPostfix.add(newIdentNode(!"*"))
  33.   exportPostfix.add(name)
  34.   newWhenUseWinSdkTypedef(exportPostfix, importc, header, typ)
  35.  
  36. macro winsdkTypeDef*(name: untyped, importc, header: string, typ: untyped): typed =
  37.   newWhenUseWinSdkTypedef(name, importc, header, typ)
  38.  
  39. macro winsdkTypeDefExp*(name: untyped, importc: string, header: string, typ: untyped): typed =
  40.   newWhenUseWinSdkExportTypedef(name, importc, header, typ)
  41.  
  42. winsdkTypeDefExp(UlongPtr, "ULONG_PTR", "<Windows.h>", uint)
  43.  
  44. # Produces
  45. # when defined(useWinSdk):
  46. #   type
  47. #     UlongPtr* {.importC: "ULONG_PTR", header: "<Windows.h>".} = uint
  48. # else:
  49. #   type
  50. #     UlongPtr* = uint
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement