Commit 0fbd8647 authored by Miro Knejp's avatar Miro Knejp

Proper handling of templates in Obj-C translators

parent bc42dcc1
...@@ -24,12 +24,10 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -24,12 +24,10 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
override def fqFieldType(tm: MExpr): String = throw new AssertionError("not applicable") override def fqFieldType(tm: MExpr): String = throw new AssertionError("not applicable")
override def toCpp(tm: MExpr, expr: String): String = { override def toCpp(tm: MExpr, expr: String): String = {
val helper = helperName(tm) + helperTemplates(tm) s"${helperClass(tm)}::toCpp($expr)"
s"$helper::toCpp($expr)"
} }
override def fromCpp(tm: MExpr, expr: String): String = { override def fromCpp(tm: MExpr, expr: String): String = {
val helper = helperName(tm) + helperTemplates(tm) s"${helperClass(tm)}::fromCpp($expr)"
s"$helper::fromCpp($expr)"
} }
def references(m: Meta): Seq[SymbolReference] = m match { def references(m: Meta): Seq[SymbolReference] = m match {
...@@ -49,6 +47,7 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -49,6 +47,7 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
} }
def helperClass(name: String) = idCpp.ty(name) def helperClass(name: String) = idCpp.ty(name)
private def helperClass(tm: MExpr): String = helperName(tm) + helperTemplates(tm)
def privateHeaderName(ident: String): String = idObjc.ty(ident) + "+Private." + spec.objcHeaderExt def privateHeaderName(ident: String): String = idObjc.ty(ident) + "+Private." + spec.objcHeaderExt
...@@ -78,21 +77,20 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -78,21 +77,20 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
}) })
} }
private def helperTemplates(tm: MExpr): String = tm.base match { private def helperTemplates(tm: MExpr): String = {
def f() = if(tm.args.isEmpty) "" else tm.args.map(helperClass).mkString("<", ", ", ">")
tm.base match {
case MOptional => case MOptional =>
assert(tm.args.size == 1) assert(tm.args.size == 1)
val argHelperClass = helperName(tm.args.head) + helperTemplates(tm.args.head) val argHelperClass = helperClass(tm.args.head)
s"<${spec.cppOptionalTemplate}, $argHelperClass>" s"<${spec.cppOptionalTemplate}, $argHelperClass>"
case MList | MSet => case MList | MSet =>
assert(tm.args.size == 1) assert(tm.args.size == 1)
val argHelperClass = helperName(tm.args.head) + helperTemplates(tm.args.head) f
s"<$argHelperClass>"
case MMap => case MMap =>
assert(tm.args.size == 2) assert(tm.args.size == 2)
val keyHelperClass = helperName(tm.args.head) + helperTemplates(tm.args.head) f
val valueHelperClass = helperName(tm.args.tail.head) + helperTemplates(tm.args.tail.head) case _ => f
s"<$keyHelperClass, $valueHelperClass>" }
case _ =>
""
} }
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment