summary refs log blame commit diff stats
path: root/tests/macros/tmacro5.nim
blob: 9882ad90d2cdd089c2b3a520e9429aea712d4c95 (plain) (tree)



























                                                             
                                      























                                                                        
                      




                       
import macros,json

var decls{.compileTime.}: seq[PNimrodNode] = @[]
var impls{.compileTime.}: seq[PNimrodNode] = @[]

macro importImpl_forward(name, returns): stmt {.immediate.} =
  result = newNimNode(nnkEmpty)
  var func_name = newNimNode(nnkAccQuoted)
  func_name.add newIdentNode("import")
  func_name.add name

  var res = newNimNode(nnkProcDef)
  res.add newNimNode(nnkPostfix)
  res[0].add newIdentNode("*")
  res[0].add func_name
  res.add newNimNode(nnkEmpty)
  res.add newNimNode(nnkEmpty)
  res.add newNimNode(nnkFormalParams)
  res[3].add returns
  var p1 = newNimNode(nnkIdentDefs)
  p1.add newIdentNode("dat")
  p1.add newIdentNOde("PJsonNode")
  p1.add newNimNode(nnkEmpty)
  res[3].add p1
  var p2 = newNimNode(nnkIdentDefs)
  p2.add newIdentNode("errors")
  p2.add newNimNode(nnkVarTy)
  p2.add newNimNode(nnkEmpty)
  p2[1].add newNimNode(nnkBracketExpr)
  p2[1][0].add newIdentNode("seq")
  p2[1][0].add newIdentNode("string")
  res[3].add p2

  res.add newNimNode(nnkEmpty)
  res.add newNimNode(nnkEmpty)
  res.add newNimNode(nnkEmpty)

  decls.add res
  echo(repr(res))

macro importImpl(name, returns: expr, body: stmt): stmt {.immediate.} = 
  #var res = getAST(importImpl_forward(name, returns))
  discard getAST(importImpl_forward(name, returns))
  var res = copyNimTree(decls[decls.high])
  res[6] = body
  echo repr(res)
  impls.add res

macro okayy:stmt =
  result = newNimNode(nnkStmtList)
  for node in decls: result.add node
  for node in impls: result.add node

importImpl(Item, int):
  echo 42
importImpl(Foo, int16):
  echo 77

okayy