Re: Create type with macro that depends on other types in a type block
Got it! :) at first i dumped the ast: World {.dumpAstGen.} = ref object guids: GUID storeHealthAble: Store[CompHealthAble] storeDrawAble: Store[CompDrawAble] storeNameAble: Store[CompNameAble] Run this works because the ast that generates this type is passed to the dumpAstGen. Then i copied the ast into a new macro and added my generation code. The only thing was that i had to put Components into its own type section.: type Component = enum DrawAble, HealthAble, NameAble, FOOAble macro genWorld(left: typed, componentEnum: untyped) = var typeTree = newNimNode(nnkRecList) typeTree.add nnkIdentDefs.newTree( newIdentNode("guids"), newIdentNode("GUID"), newEmptyNode() ) for component in Component: typeTree.add nnkIdentDefs.newTree( newIdentNode("store" & $component ), nnkBracketExpr.newTree( newIdentNode("Store"), newIdentNode("Comp" & $component) ), newEmptyNode() ) return nnkTypeDef.newTree( nnkPragmaExpr.newTree( newIdentNode("World"), nnkPragma.newTree( ) ), newEmptyNode(), nnkRefTy.newTree( nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), typeTree ) ) ) # another type section type World {.genWorld: Component.} Run
Create type with macro that depends on other types in a type block
I create a type in a macro which depends on other type ( i create the World type) The issue is that the world type depends on other types (Store and Entity) which are in the same typeblock. It seems that i cannot call the create macro inside the type block to create the type. When i call the gen macro above or below the type block there are types missing. Any idea how i can do this? type # i want to create the world type World = ref object guids: GUID storeHealthAble: Store[CompHealthAble] storeDrawAble: Store[CompDrawAble] storeNameAble: Store[CompNameAble] Entity = object id: GUID world: World Store[T] = Table[Entity,T] # Following for completeness. Component = enum DrawAble, HealthAble, NameAble Run the type creation macro which creates World: macro genWorld() = var typeTree = newNimNode(nnkRecList) typeTree.add nnkIdentDefs.newTree( newIdentNode("guids"), newIdentNode("GUID"), newEmptyNode() ) for component in Component: typeTree.add nnkIdentDefs.newTree( newIdentNode("store" & $component ), nnkBracketExpr.newTree( newIdentNode("Store"), newIdentNode("Comp" & $component) ), newEmptyNode() ) result = nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("World"), newEmptyNode(), nnkRefTy.newTree( nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), typeTree ) ) ) ) ) Run