I have this macro, which works fine.
macro gDefineTypeExtended*(tn, t, tp, f, c: static[string]): stmt =
var
cc = indent("\n" & c, 4)
s = """
proc $2Init(self: $1) {.cdecl.}
proc $2ClassInit(klass: $1Class) {.cdecl.}
var $2ParentClass: Gpointer = nil
var $1PrivateOffset: cint
proc $2ClassInternInit(klass: Gpointer) {.cdecl.} =
$2ParentClass = typeClassPeekParent(klass)
if $1PrivateOffset != 0:
typeClassAdjustPrivateOffset(klass, $1PrivateOffset)
$2ClassInit(cast[$1Class](klass))
proc $2GetInstancePrivate(self: $1): $1Private {.cdecl.} =
return cast[$1Private](gStructMemberP(self, $1PrivateOffset))
proc $2GetType*(): GType {.cdecl.} =
var gDefineTypeIdVolatile {.global.}: Gsize = 0
if onceInitEnter(addr(gDefineTypeIdVolatile)):
var gDefineTypeId: GType = registerStaticSimple($3,
internStaticString("$1"),
sizeof($1ClassObj).cuint,
cast[GClassInitFunc]($2ClassInternInit),
sizeof($1Obj).cuint,
cast[GInstanceInitFunc]($2Init),
cast[GTypeFlags]($4))
$5
onceInitLeave(addr(gDefineTypeIdVolatile), gDefineTypeId)
return gDefineTypeIdVolatile
""" % [tn, t, tp, f, cc]
#echo s
result = parseStmt(s)
But it would be nice if proc $2GetInstancePrivate is not generated when last macro parameter c is "". May it be possible to put a when statement in this macro to opionally suppress generation of proc $2GetInstancePrivate? (Of course I can make a copy of this macro with another name and without that proc)
[EDIT]
Indeed I think for this case making a copy of that macro is the best solution -- just did it and it works fine. If we do not want a copy: Divide the string into three parts and joining them, with the second string in a when clause? Like "a" & when "b": b & "c" May that work?