Advertisement
Guest User

nim-typeImportC-macro

a guest
Apr 7th, 2017
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.96 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. macro typedefImportCObject*(name: untyped, importc, header: string, typ, reclist: untyped): typed =
  31.   echo treerepr reclist
  32.   assert(typ.kind == nnkObjectTy)
  33.   var typCpy = copyNimNode(typ)
  34.   var reclistNode = newNimNode(nnkRecList)
  35.   reclistNode.add(reclist)
  36.   typCpy.add(reclistNode)
  37.   newWhenUseWinSdkTypedef(name, importc, header, typCpy)
  38.  
  39. when isMainModule:
  40.   dumpTree:
  41.     f1: int32
  42.   typedefImportCObject(NimType, "ImportedType", "header.h", object):
  43.     f1: int32
  44.   var x: NimType
  45.   x = 42
  46.  
  47. # dumpTree produces:
  48. # StmtList
  49. #   Call
  50. #     Ident !"f1"
  51. #     StmtList
  52. #       Ident !"int32"
  53.  
  54. # macro produces:
  55. # when defined(useWinSdk):
  56. #   type
  57. #     NimType {.importC: "ImportedType", header: "header.h".} = object
  58. #         f1(
  59. #           int32)
  60. #
  61. # else:
  62. #   type
  63. #     NimType = object
  64. #         f1(
  65. #           int32)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement