diff --git a/compiler/cbuilder.nim b/compiler/cbuilder.nim new file mode 100644 index 000000000000..fd4ae752f1a8 --- /dev/null +++ b/compiler/cbuilder.nim @@ -0,0 +1,19 @@ +type + Snippet = string + Builder = string + +template newBuilder(s: string): Builder = + s + +proc addField(obj: var Builder; field: Snippet;) = + obj.add field + obj.add ";\n" + + +template withStruct(obj: var Builder; structOrUnion: string; name: string; inheritance: string; body: typed) = + if inheritance.len > 0: + obj.add "$1 $2 : public $1 {$n" % [structOrUnion, name, inheritance] + else: + obj.add "$1 $2 {$n" % [structOrUnion, name] + body + obj.add("};\n") diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim index 5c3e82346d25..b6cedcb319b2 100644 --- a/compiler/ccgtypes.nim +++ b/compiler/ccgtypes.nim @@ -868,14 +868,13 @@ proc getRecordDesc(m: BModule; typ: PType, name: Rope, proc getTupleDesc(m: BModule; typ: PType, name: Rope, check: var IntSet): Rope = - result = "$1 $2 {$n" % [structOrUnion(typ), name] - var desc: Rope = "" - for i, a in typ.ikids: - desc.addf("$1 Field$2;$n", - [getTypeDescAux(m, a, check, dkField), rope(i)]) - if desc == "": result.add("char dummy;\L") - else: result.add(desc) - result.add("};\L") + result = newBuilder("") + withStruct(result, structOrUnion(typ), name, ""): + if kidsLen(typ) > 0: + for i, a in typ.ikids: + result.addField "$1 Field$2" % [getTypeDescAux(m, a, check, dkField), rope(i)] + else: + result.addField "char dummy" proc scanCppGenericSlot(pat: string, cursor, outIdx, outStars: var int): bool = # A helper proc for handling cppimport patterns, involving numeric diff --git a/compiler/cgen.nim b/compiler/cgen.nim index 2fde0e9ffdd0..833903cbe1c6 100644 --- a/compiler/cgen.nim +++ b/compiler/cgen.nim @@ -373,6 +373,7 @@ proc dataField(p: BProc): Rope = proc genProcPrototype(m: BModule, sym: PSym) +include cbuilder include ccgliterals include ccgtypes