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
- macro typedefImportCObject*(name: untyped, importc, header: string, typ, reclist: untyped): typed =
- echo treerepr reclist
- assert(typ.kind == nnkObjectTy)
- var typCpy = copyNimNode(typ)
- var reclistNode = newNimNode(nnkRecList)
- reclistNode.add(reclist)
- typCpy.add(reclistNode)
- newWhenUseWinSdkTypedef(name, importc, header, typCpy)
- when isMainModule:
- dumpTree:
- f1: int32
- typedefImportCObject(NimType, "ImportedType", "header.h", object):
- f1: int32
- var x: NimType
- x = 42
- # dumpTree produces:
- # StmtList
- # Call
- # Ident !"f1"
- # StmtList
- # Ident !"int32"
- # macro produces:
- # when defined(useWinSdk):
- # type
- # NimType {.importC: "ImportedType", header: "header.h".} = object
- # f1(
- # int32)
- #
- # else:
- # type
- # NimType = object
- # f1(
- # int32)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement