Commit 6b17a860 authored by Miro Knejp's avatar Miro Knejp Committed by Jacob Potter

Use marshalling objects to generate code for function parameter types

parent 982d0a17
...@@ -42,7 +42,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_textsort_SortItems_createWithListene ...@@ -42,7 +42,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_textsort_SortItems_createWithListene
std::shared_ptr<::textsort::SortItems> cr = ::textsort::SortItems::create_with_listener(c_listener); std::shared_ptr<::textsort::SortItems> cr = ::textsort::SortItems::create_with_listener(c_listener);
return NativeSortItems::toJava(jniEnv, cr); return NativeSortItems::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -12,6 +12,6 @@ ...@@ -12,6 +12,6 @@
- (void)sort:(TXSSortOrder)order items:(TXSItemList *)items; - (void)sort:(TXSSortOrder)order items:(TXSItemList *)items;
+ (TXSSortItems*)createWithListener:(id<TXSTextboxListener>)listener; + (TXSSortItems *)createWithListener:(id<TXSTextboxListener>)listener;
@end @end
...@@ -51,7 +51,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -51,7 +51,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (TXSSortItems*)createWithListener:(id<TXSTextboxListener>)listener { + (TXSSortItems *)createWithListener:(id<TXSTextboxListener>)listener {
try { try {
std::shared_ptr<::textsort::TextboxListener> cppListener = ::djinni_generated::TextboxListenerObjcProxy::textbox_listener_with_objc(listener); std::shared_ptr<::textsort::TextboxListener> cppListener = ::djinni_generated::TextboxListenerObjcProxy::textbox_listener_with_objc(listener);
std::shared_ptr<::textsort::SortItems> cppRet = ::textsort::SortItems::create_with_listener(std::move(cppListener)); std::shared_ptr<::textsort::SortItems> cppRet = ::textsort::SortItems::create_with_listener(std::move(cppListener));
......
...@@ -318,7 +318,7 @@ class CppGenerator(spec: Spec) extends Generator(spec) { ...@@ -318,7 +318,7 @@ class CppGenerator(spec: Spec) extends Generator(spec) {
w.wl w.wl
writeDoc(w, m.doc) writeDoc(w, m.doc)
val ret = m.ret.fold("void")(marshal.typename(_)) val ret = m.ret.fold("void")(marshal.typename(_))
val params = m.params.map(toCppParamType) val params = m.params.map(p => marshal.paramType(p.ty) + " " + idCpp.local(p.ident))
if (m.static) { if (m.static) {
w.wl(s"static $ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")};") w.wl(s"static $ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")};")
} else { } else {
......
...@@ -20,6 +20,9 @@ class CppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -20,6 +20,9 @@ class CppMarshal(spec: Spec) extends Marshal(spec) {
case r: Record => withNs(spec.cppNamespace, idCpp.ty(name)) case r: Record => withNs(spec.cppNamespace, idCpp.ty(name))
} }
override def paramType(tm: MExpr): String = toCppParamType(tm)
override def fqParamType(tm: MExpr): String = toCppParamType(tm, spec.cppNamespace)
private def toCppType(ty: TypeRef, namespace: Option[String] = None): String = toCppType(ty.resolved, namespace) private def toCppType(ty: TypeRef, namespace: Option[String] = None): String = toCppType(ty.resolved, namespace)
private def toCppType(tm: MExpr, namespace: Option[String]): String = { private def toCppType(tm: MExpr, namespace: Option[String]): String = {
def base(m: Meta): String = m match { def base(m: Meta): String = m match {
...@@ -47,15 +50,13 @@ class CppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -47,15 +50,13 @@ class CppMarshal(spec: Spec) extends Marshal(spec) {
} }
// this can be used in c++ generation to know whether a const& should be applied to the parameter or not // this can be used in c++ generation to know whether a const& should be applied to the parameter or not
private def toCppParamType(f: Field): String = toCppParamType(f, None, "") private def toCppParamType(tm: MExpr, namespace: Option[String] = None): String = {
private def toCppParamType(f: Field, namespace: Option[String] = None, prefix: String = ""): String = { val cppType = toCppType(tm, namespace)
val cppType = toCppType(f.ty, namespace) val refType = "const " + cppType + " &"
val localName = prefix + idCpp.local(f.ident); val valueType = cppType
val refType = "const " + cppType + " & " + localName
val valueType = cppType + " " + localName
def toType(expr: MExpr): String = expr.base match { def toType(expr: MExpr): String = expr.base match {
case MPrimitive(_,_,_,_,_,_,_,_) => valueType case p: MPrimitive => valueType
case d: MDef => d.defType match { case d: MDef => d.defType match {
case DEnum => valueType case DEnum => valueType
case _ => refType case _ => refType
...@@ -63,6 +64,6 @@ class CppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -63,6 +64,6 @@ class CppMarshal(spec: Spec) extends Marshal(spec) {
case MOptional => toType(expr.args.head) case MOptional => toType(expr.args.head)
case _ => refType case _ => refType
} }
toType(f.ty.resolved) toType(tm)
} }
} }
...@@ -205,12 +205,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -205,12 +205,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
} }
if (i.ext.java) { if (i.ext.java) {
w.wl w.wl
w.w(s"class JavaProxy final : djinni::JavaProxyCacheEntry, public ${withNs(spec.cppNamespace, idCpp.ty(ident))}").bracedSemi { w.w(s"class JavaProxy final : djinni::JavaProxyCacheEntry, public $cppSelf").bracedSemi {
w.wlOutdent(s"public:") w.wlOutdent(s"public:")
w.wl(s"JavaProxy(jobject obj);") w.wl(s"JavaProxy(jobject obj);")
for (m <- i.methods) { for (m <- i.methods) {
val ret = m.ret.fold("void")(cppMarshal.fqTypename) val ret = m.ret.fold("void")(cppMarshal.fqTypename)
val params = m.params.map(p => toCppParamType(p, spec.cppNamespace)) val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " " + idCpp.local(p.ident))
w.wl(s"virtual $ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")} override;") w.wl(s"virtual $ret ${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")} override;")
} }
w.wl w.wl
...@@ -239,7 +239,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -239,7 +239,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
for (m <- i.methods) { for (m <- i.methods) {
w.wl w.wl
val ret = m.ret.fold("void")(cppMarshal.fqTypename) val ret = m.ret.fold("void")(cppMarshal.fqTypename)
val params = m.params.map(p => toCppParamType(p, spec.cppNamespace, "c_")) val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " c_" + idCpp.local(p.ident))
writeJniTypeParams(w, typeParams) writeJniTypeParams(w, typeParams)
w.w(s"$ret $jniSelf::JavaProxy::JavaProxy::${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")}").bracedSemi { w.w(s"$ret $jniSelf::JavaProxy::JavaProxy::${idCpp.method(m.ident)}${params.mkString("(", ", ", ")")}").bracedSemi {
w.wl(s"JNIEnv * const jniEnv = djinni::jniGetThreadEnv();") w.wl(s"JNIEnv * const jniEnv = djinni::jniGetThreadEnv();")
...@@ -277,15 +277,14 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -277,15 +277,14 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
.replaceAllLiterally(".", "_") .replaceAllLiterally(".", "_")
val prefix = "Java_" + classIdentMunged val prefix = "Java_" + classIdentMunged
def nativeHook(name: String, static: Boolean, params: Iterable[Field], ret: Option[TypeRef], f: => Unit) = { def nativeHook(name: String, static: Boolean, params: Iterable[Field], ret: Option[TypeRef], f: => Unit) = {
val paramList = params.map(p => toJniType(p.ty) + " j_" + idJava.local(p.ident)).mkString(", ") val paramList = params.map(p => jniMarshal.paramType(p.ty) + " j_" + idJava.local(p.ident)).mkString(", ")
val jniRetType = ret.fold("void")(toJniType) val jniRetType = ret.fold("void")(toJniType)
w.wl w.wl
val methodNameMunged = name.replaceAllLiterally("_", "_1") val methodNameMunged = name.replaceAllLiterally("_", "_1")
val zero = ret.fold("")(s => "0 /* value doesn't matter */")
if (static) { if (static) {
w.wl(s"CJNIEXPORT $jniRetType JNICALL ${prefix}_$methodNameMunged(JNIEnv* jniEnv, jobject /*this*/${preComma(paramList)})").braced { w.wl(s"CJNIEXPORT $jniRetType JNICALL ${prefix}_$methodNameMunged(JNIEnv* jniEnv, jobject /*this*/${preComma(paramList)})").braced {
w.w("try").bracedEnd(s" JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, ${ w.w("try").bracedEnd(s" JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, $zero)") {
ret.fold("")(s => "0 /* value doesn't matter */ ")
})") {
w.wl(s"DJINNI_FUNCTION_PROLOGUE0(jniEnv);") w.wl(s"DJINNI_FUNCTION_PROLOGUE0(jniEnv);")
f f
} }
...@@ -293,8 +292,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) { ...@@ -293,8 +292,7 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
} }
else { else {
w.wl(s"CJNIEXPORT $jniRetType JNICALL ${prefix}_00024CppProxy_$methodNameMunged(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef${preComma(paramList)})").braced { w.wl(s"CJNIEXPORT $jniRetType JNICALL ${prefix}_00024CppProxy_$methodNameMunged(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef${preComma(paramList)})").braced {
val zero = "0 /* value doesn't matter*/" w.w("try").bracedEnd(s" JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, $zero)") {
w.w("try").bracedEnd(s" JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, ${ret.fold("")(s => zero)})") {
w.wl(s"DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);") w.wl(s"DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);")
f f
} }
......
...@@ -13,6 +13,9 @@ class JNIMarshal(spec: Spec) extends Marshal(spec) { ...@@ -13,6 +13,9 @@ class JNIMarshal(spec: Spec) extends Marshal(spec) {
override def fqTypename(tm: MExpr): String = typename(tm) override def fqTypename(tm: MExpr): String = typename(tm)
def fqTypename(name: String, ty: TypeDef): String = typename(name, ty) def fqTypename(name: String, ty: TypeDef): String = typename(name, ty)
override def paramType(tm: MExpr): String = toJniType(tm, false)
override def fqParamType(tm: MExpr): String = paramType(tm)
// Name for the autogenerated class containing field/method IDs and toJava()/fromJava() methods // Name for the autogenerated class containing field/method IDs and toJava()/fromJava() methods
def helperClass(name: String) = spec.jniClassIdentStyle(name) def helperClass(name: String) = spec.jniClassIdentStyle(name)
def fqHelperClass(name: String) = withNs(Some(spec.jniNamespace), helperClass(name)) def fqHelperClass(name: String) = withNs(Some(spec.jniNamespace), helperClass(name))
......
...@@ -152,14 +152,14 @@ class JavaGenerator(spec: Spec) extends Generator(spec) { ...@@ -152,14 +152,14 @@ class JavaGenerator(spec: Spec) extends Generator(spec) {
skipFirst { w.wl } skipFirst { w.wl }
writeDoc(w, m.doc) writeDoc(w, m.doc)
val ret = m.ret.fold("void")(marshal.typename(_)) val ret = m.ret.fold("void")(marshal.typename(_))
val params = m.params.map(p => marshal.typename(p.ty) + " " + idJava.local(p.ident)) val params = m.params.map(p => marshal.paramType(p.ty) + " " + idJava.local(p.ident))
w.wl("public abstract " + ret + " " + idJava.method(m.ident) + params.mkString("(", ", ", ")") + throwException + ";") w.wl("public abstract " + ret + " " + idJava.method(m.ident) + params.mkString("(", ", ", ")") + throwException + ";")
} }
for (m <- i.methods if m.static) { for (m <- i.methods if m.static) {
skipFirst { w.wl } skipFirst { w.wl }
writeDoc(w, m.doc) writeDoc(w, m.doc)
val ret = m.ret.fold("void")(marshal.typename(_)) val ret = m.ret.fold("void")(marshal.typename(_))
val params = m.params.map(p => marshal.typename(p.ty) + " " + idJava.local(p.ident)) val params = m.params.map(p => marshal.paramType(p.ty) + " " + idJava.local(p.ident))
w.wl("public static native "+ ret + " " + idJava.method(m.ident) + params.mkString("(", ", ", ")") + ";") w.wl("public static native "+ ret + " " + idJava.method(m.ident) + params.mkString("(", ", ", ")") + ";")
} }
if (i.ext.cpp) { if (i.ext.cpp) {
...@@ -186,7 +186,7 @@ class JavaGenerator(spec: Spec) extends Generator(spec) { ...@@ -186,7 +186,7 @@ class JavaGenerator(spec: Spec) extends Generator(spec) {
for (m <- i.methods if !m.static) { // Static methods not in CppProxy for (m <- i.methods if !m.static) { // Static methods not in CppProxy
val ret = m.ret.fold("void")(marshal.typename(_)) val ret = m.ret.fold("void")(marshal.typename(_))
val returnStmt = m.ret.fold("")(_ => "return ") val returnStmt = m.ret.fold("")(_ => "return ")
val params = m.params.map(p => marshal.typename(p.ty)+" "+idJava.local(p.ident)).mkString(", ") val params = m.params.map(p => marshal.paramType(p.ty) + " " + idJava.local(p.ident)).mkString(", ")
val args = m.params.map(p => idJava.local(p.ident)).mkString(", ") val args = m.params.map(p => idJava.local(p.ident)).mkString(", ")
val meth = idJava.method(m.ident) val meth = idJava.method(m.ident)
w.wl w.wl
......
...@@ -12,7 +12,10 @@ class JavaMarshal(spec: Spec) extends Marshal(spec) { ...@@ -12,7 +12,10 @@ class JavaMarshal(spec: Spec) extends Marshal(spec) {
override def fqTypename(tm: MExpr): String = toJavaType(tm, spec.javaPackage) override def fqTypename(tm: MExpr): String = toJavaType(tm, spec.javaPackage)
def fqTypename(name: String, ty: TypeDef): String = withPackage(spec.javaPackage, idJava.ty(name)) def fqTypename(name: String, ty: TypeDef): String = withPackage(spec.javaPackage, idJava.ty(name))
def toJavaType(tm: MExpr, packageName: Option[String]): String = { override def paramType(tm: MExpr): String = typename(tm)
override def fqParamType(tm: MExpr): String = fqTypename(tm)
private def toJavaType(tm: MExpr, packageName: Option[String]): String = {
def f(tm: MExpr, needRef: Boolean): String = { def f(tm: MExpr, needRef: Boolean): String = {
tm.base match { tm.base match {
case MOptional => case MOptional =>
...@@ -44,6 +47,6 @@ class JavaMarshal(spec: Spec) extends Marshal(spec) { ...@@ -44,6 +47,6 @@ class JavaMarshal(spec: Spec) extends Marshal(spec) {
f(tm, false) f(tm, false)
} }
def withPackage(packageName: Option[String], t: String) = packageName.fold(t)(_+"."+t) private def withPackage(packageName: Option[String], t: String) = packageName.fold(t)(_ + "." + t)
} }
...@@ -16,6 +16,11 @@ abstract class Marshal(spec: Spec) { ...@@ -16,6 +16,11 @@ abstract class Marshal(spec: Spec) {
// Same as typename() but always fully namespace or package qualified // Same as typename() but always fully namespace or package qualified
def fqTypename(tm: MExpr): String def fqTypename(tm: MExpr): String
def fqTypename(ty: TypeRef): String = fqTypename(ty.resolved) def fqTypename(ty: TypeRef): String = fqTypename(ty.resolved)
// Type signature for a function parameter
def paramType(tm: MExpr): String
def paramType(ty: TypeRef): String = paramType(ty.resolved)
def fqParamType(tm: MExpr): String
def fqParamType(ty: TypeRef): String = fqParamType(ty.resolved)
implicit def identToString(ident: Ident): String = ident.name implicit def identToString(ident: Ident): String = ident.name
protected val idCpp = spec.cppIdentStyle protected val idCpp = spec.cppIdentStyle
......
...@@ -154,12 +154,12 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) { ...@@ -154,12 +154,12 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) {
def writeObjcFuncDecl(method: Interface.Method, w: IndentWriter) { def writeObjcFuncDecl(method: Interface.Method, w: IndentWriter) {
val label = if (method.static) "+" else "-" val label = if (method.static) "+" else "-"
val ret = method.ret.fold("void")(toObjcFullType(_)) val ret = method.ret.fold("void")(marshal.paramType)
w.w(s"$label ($ret)${idObjc.method(method.ident)}") w.w(s"$label ($ret)${idObjc.method(method.ident)}")
val skipFirst = SkipFirst() val skipFirst = SkipFirst()
for (p <- method.params) { for (p <- method.params) {
skipFirst { w.w(s" ${idObjc.local(p.ident)}") } skipFirst { w.w(s" ${idObjc.local(p.ident)}") }
w.w(s":(${toObjcFullType(p.ty)})${idObjc.local(p.ident)}") w.w(s":(${marshal.paramType(p.ty)})${idObjc.local(p.ident)}")
} }
} }
...@@ -234,9 +234,9 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) { ...@@ -234,9 +234,9 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) {
if (!r.fields.isEmpty) { if (!r.fields.isEmpty) {
val head = r.fields.head val head = r.fields.head
val skipFirst = SkipFirst() val skipFirst = SkipFirst()
w.w(s"- (id)${idObjc.method("init_with_" + head.ident.name)}:(${toObjcFullType(head.ty)})${idObjc.local(head.ident)}") w.w(s"- (id)${idObjc.method("init_with_" + head.ident.name)}:(${marshal.paramType(head.ty)})${idObjc.local(head.ident)}")
for (f <- r.fields) skipFirst { for (f <- r.fields) skipFirst {
w.w(s" ${idObjc.field(f.ident)}:(${toObjcFullType(f.ty)})${idObjc.field(f.ident)}") w.w(s" ${idObjc.field(f.ident)}:(${marshal.paramType(f.ty)})${idObjc.field(f.ident)}")
} }
w.wl(";") w.wl(";")
} }
...@@ -310,14 +310,6 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) { ...@@ -310,14 +310,6 @@ class ObjcGenerator(spec: Spec) extends Generator(spec) {
f(tm, needRef) f(tm, needRef)
} }
def toObjcFullType(ty: TypeRef): String = toObjcFullType(ty.resolved, false)
def toObjcFullType(ty: TypeRef, needRef: Boolean): String = toObjcFullType(ty.resolved, needRef)
def toObjcFullType(tm: MExpr): String = toObjcFullType(tm, false)
def toObjcFullType(tm: MExpr, needRef: Boolean = false): String = {
val (name, asterisk) = toObjcType(tm, needRef)
name + (if (asterisk) " *" else "")
}
def toObjcTypeDef(ty: TypeRef): String = toObjcTypeDef(ty.resolved, false) def toObjcTypeDef(ty: TypeRef): String = toObjcTypeDef(ty.resolved, false)
def toObjcTypeDef(ty: TypeRef, needRef: Boolean): String = toObjcTypeDef(ty.resolved, needRef) def toObjcTypeDef(ty: TypeRef, needRef: Boolean): String = toObjcTypeDef(ty.resolved, needRef)
def toObjcTypeDef(tm: MExpr): String = toObjcTypeDef(tm, false) def toObjcTypeDef(tm: MExpr): String = toObjcTypeDef(tm, false)
......
...@@ -16,6 +16,9 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -16,6 +16,9 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
override def fqTypename(tm: MExpr): String = typename(tm) override def fqTypename(tm: MExpr): String = typename(tm)
def fqTypename(name: String, ty: TypeDef): String = typename(name, ty) def fqTypename(name: String, ty: TypeDef): String = typename(name, ty)
override def paramType(tm: MExpr): String = toObjcParamType(tm)
override def fqParamType(tm: MExpr): String = paramType(tm)
// Return value: (Type_Name, Is_Class_Or_Not) // Return value: (Type_Name, Is_Class_Or_Not)
def toObjcType(ty: TypeRef): (String, Boolean) = toObjcType(ty.resolved, false) def toObjcType(ty: TypeRef): (String, Boolean) = toObjcType(ty.resolved, false)
def toObjcType(ty: TypeRef, needRef: Boolean): (String, Boolean) = toObjcType(ty.resolved, needRef) def toObjcType(ty: TypeRef, needRef: Boolean): (String, Boolean) = toObjcType(ty.resolved, needRef)
...@@ -46,7 +49,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -46,7 +49,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
case DRecord => (idObjc.ty(d.name), true) case DRecord => (idObjc.ty(d.name), true)
case DInterface => case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext val ext = d.body.asInstanceOf[Interface].ext
(idObjc.ty(d.name), false) (idObjc.ty(d.name), true)
} }
case p: MParam => throw new AssertionError("Parameter should not happen at Obj-C top level") case p: MParam => throw new AssertionError("Parameter should not happen at Obj-C top level")
} }
...@@ -56,4 +59,23 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) { ...@@ -56,4 +59,23 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
f(tm, needRef) f(tm, needRef)
} }
def toObjcParamType(tm: MExpr): String = {
val (name, needRef) = toObjcType(tm)
val param = name + (if(needRef) " *" else "")
tm.base match {
case d: MDef => d.body match {
case i: Interface => if(i.ext.objc) s"id<$name>" else param
case _ => param
}
case MOptional => tm.args.head.base match {
case d: MDef => d.body match {
case i: Interface => if(i.ext.objc) s"id<$name>" else param
case _ => param
}
case _ => param
}
case _ => param
}
}
} }
...@@ -193,12 +193,12 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -193,12 +193,12 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
def writeObjcFuncDecl(method: Interface.Method, w: IndentWriter) { def writeObjcFuncDecl(method: Interface.Method, w: IndentWriter) {
val label = if (method.static) "+" else "-" val label = if (method.static) "+" else "-"
val ret = method.ret.fold("void")(toObjcFullType(_)) val ret = method.ret.fold("void")(objcMarshal.paramType)
w.w(s"$label ($ret)${idObjc.method(method.ident)}") w.w(s"$label ($ret)${idObjc.method(method.ident)}")
val skipFirst = SkipFirst() val skipFirst = SkipFirst()
for (p <- method.params) { for (p <- method.params) {
skipFirst { w.w(s" ${idObjc.local(p.ident)}") } skipFirst { w.w(s" ${idObjc.local(p.ident)}") }
w.w(s":(${toObjcFullType(p.ty)})${idObjc.local(p.ident)}") w.w(s":(${objcMarshal.paramType(p.ty)})${idObjc.local(p.ident)}")
} }
} }
...@@ -294,7 +294,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -294,7 +294,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
w.wl(s"static std::shared_ptr<$cppSelf> ${idCpp.method(ident.name + "_with_objc")} (id<$self> objcRef);") w.wl(s"static std::shared_ptr<$cppSelf> ${idCpp.method(ident.name + "_with_objc")} (id<$self> objcRef);")
for (m <- i.methods) { for (m <- i.methods) {
val ret = m.ret.fold("void")(cppMarshal.fqTypename) val ret = m.ret.fold("void")(cppMarshal.fqTypename)
val params = m.params.map(p => toCppParamType(p, spec.cppNamespace)) val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " " + idCpp.local(p.ident))
w.wl(s"virtual $ret ${idCpp.method(m.ident)} ${params.mkString("(", ", ", ")")} override;") w.wl(s"virtual $ret ${idCpp.method(m.ident)} ${params.mkString("(", ", ", ")")} override;")
} }
} }
...@@ -318,7 +318,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -318,7 +318,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
for (m <- i.methods) { for (m <- i.methods) {
w.wl w.wl
val ret = m.ret.fold("void")(cppMarshal.fqTypename) val ret = m.ret.fold("void")(cppMarshal.fqTypename)
val params = m.params.map(p => toCppParamType(p, spec.cppNamespace)) val params = m.params.map(p => cppMarshal.fqParamType(p.ty) + " " + idCpp.local(p.ident))
w.wl(s"$ret $objcExtSelf::${idCpp.method(m.ident)} ${params.mkString("(", ", ", ")")}").braced { w.wl(s"$ret $objcExtSelf::${idCpp.method(m.ident)} ${params.mkString("(", ", ", ")")}").braced {
w.w("@autoreleasepool").braced { w.w("@autoreleasepool").braced {
m.params.foreach(p => m.params.foreach(p =>
...@@ -410,9 +410,9 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -410,9 +410,9 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
if (!r.fields.isEmpty) { if (!r.fields.isEmpty) {
val head = r.fields.head val head = r.fields.head
val skipFirst = SkipFirst() val skipFirst = SkipFirst()
w.w(s"- (id)${idObjc.method("init_with_" + head.ident.name)}:(${toObjcFullType(head.ty)})${idObjc.field(head.ident)}") w.w(s"- (id)${idObjc.method("init_with_" + head.ident.name)}:(${objcMarshal.paramType(head.ty)})${idObjc.field(head.ident)}")
for (f <- r.fields) skipFirst { for (f <- r.fields) skipFirst {
w.w(s" ${idObjc.field(f.ident.name)}:(${toObjcFullType(f.ty)})${idObjc.local(f.ident)}") w.w(s" ${idObjc.field(f.ident.name)}:(${objcMarshal.paramType(f.ty)})${idObjc.local(f.ident)}")
} }
w.wl w.wl
w.braced { w.braced {
...@@ -728,7 +728,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -728,7 +728,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
case DRecord => w.wl(s"$objcType$objcIdent = [[${self} alloc] initWithCpp${IdentStyle.camelUpper(typeName)}:$cppIdent];") case DRecord => w.wl(s"$objcType$objcIdent = [[${self} alloc] initWithCpp${IdentStyle.camelUpper(typeName)}:$cppIdent];")
case DInterface => case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext val ext = d.body.asInstanceOf[Interface].ext
val objcProxy = withNs(Some(spec.objcppNamespace), idCpp.ty(d.name + "_objc_proxy")) val objcProxy = objcppMarshal.fqHelperClass(d.name + "_objc_proxy")
(ext.cpp, ext.objc) match { (ext.cpp, ext.objc) match {
case (true, true) => throw new AssertionError("Function implemented on both sides") case (true, true) => throw new AssertionError("Function implemented on both sides")
case (false, false) => throw new AssertionError("Function not implemented") case (false, false) => throw new AssertionError("Function not implemented")
...@@ -829,7 +829,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -829,7 +829,7 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
case (true, true) => throw new AssertionError("Function implemented on both sides") case (true, true) => throw new AssertionError("Function implemented on both sides")
case (false, false) => throw new AssertionError("Function not implemented") case (false, false) => throw new AssertionError("Function not implemented")
case (true, false) => w.wl(s"$cppType $cppIdent = $objcIdent.cppRef;") case (true, false) => w.wl(s"$cppType $cppIdent = $objcIdent.cppRef;")
case (false, true) => w.wl(s"$cppType $cppIdent = ${withNs(Some(spec.objcppNamespace), idCpp.ty(d.name + "_objc_proxy"))}" + case (false, true) => w.wl(s"$cppType $cppIdent = ${objcppMarshal.fqHelperClass(d.name + "_objc_proxy")}" +
s"::${idCpp.method(d.name + "_with_objc")}($objcIdent);") s"::${idCpp.method(d.name + "_with_objc")}($objcIdent);")
} }
} }
...@@ -881,14 +881,6 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) { ...@@ -881,14 +881,6 @@ class ObjcppGenerator(spec: Spec) extends Generator(spec) {
f(tm, needRef) f(tm, needRef)
} }
def toObjcFullType(ty: TypeRef): String = toObjcFullType(ty.resolved, false)
def toObjcFullType(ty: TypeRef, needRef: Boolean): String = toObjcFullType(ty.resolved, needRef)
def toObjcFullType(tm: MExpr): String = toObjcFullType(tm, false)
def toObjcFullType(tm: MExpr, needRef: Boolean = false): String = {
val (name, asterisk) = toObjcType(tm, needRef)
name + (if (asterisk) " *" else "")
}
def toObjcTypeDef(ty: TypeRef): String = toObjcTypeDef(ty.resolved, false) def toObjcTypeDef(ty: TypeRef): String = toObjcTypeDef(ty.resolved, false)
def toObjcTypeDef(ty: TypeRef, needRef: Boolean): String = toObjcTypeDef(ty.resolved, needRef) def toObjcTypeDef(ty: TypeRef, needRef: Boolean): String = toObjcTypeDef(ty.resolved, needRef)
def toObjcTypeDef(tm: MExpr): String = toObjcTypeDef(tm, false) def toObjcTypeDef(tm: MExpr): String = toObjcTypeDef(tm, false)
......
...@@ -6,11 +6,14 @@ import djinni.meta._ ...@@ -6,11 +6,14 @@ import djinni.meta._
class ObjcppMarshal(spec: Spec) extends Marshal(spec) { class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
override def typename(tm: MExpr): String = throw new AssertionError("Objcpp has no public types") override def typename(tm: MExpr): String = throw new AssertionError("not applicable")
def typename(name: String, ty: TypeDef): String = throw new AssertionError("Objcpp has no public types") def typename(name: String, ty: TypeDef): String = throw new AssertionError("not applicable")
override def fqTypename(tm: MExpr): String = throw new AssertionError("Objcpp has no public types") override def fqTypename(tm: MExpr): String = throw new AssertionError("not applicable")
def fqTypename(name: String, ty: TypeDef): String = throw new AssertionError("Objcpp has no public types") def fqTypename(name: String, ty: TypeDef): String = throw new AssertionError("not applicable")
def paramType(tm: MExpr): String = throw new AssertionError("not applicable")
def fqParamType(tm: MExpr): String = throw new AssertionError("not applicable")
// Name for the autogenerated proxy class wrapping +o interfaces // Name for the autogenerated proxy class wrapping +o interfaces
def helperClass(name: String) = idCpp.ty(name) def helperClass(name: String) = idCpp.ty(name)
......
...@@ -281,57 +281,8 @@ abstract class Generator(spec: Spec) ...@@ -281,57 +281,8 @@ abstract class Generator(spec: Spec)
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// Render type expression // Render type expression
private def toCppType(ty: TypeRef, namespace: Option[String] = None): String = toCppType(ty.resolved, namespace)
private def toCppType(tm: MExpr, namespace: Option[String]): String = {
def base(m: Meta): String = m match {
case p: MPrimitive => p.cName
case MString => "std::string"
case MDate => "std::chrono::system_clock::time_point"
case MBinary => "std::vector<uint8_t>"
case MOptional => spec.cppOptionalTemplate
case MList => "std::vector"
case MSet => "std::unordered_set"
case MMap => "std::unordered_map"
case d: MDef =>
d.defType match {
case DEnum => withNs(namespace, idCpp.enumType(d.name))
case DRecord => withNs(namespace, idCpp.ty(d.name))
case DInterface => s"std::shared_ptr<${withNs(namespace, idCpp.ty(d.name))}>"
}
case p: MParam => idCpp.typeParam(p.name)
}
def expr(tm: MExpr): String = {
val args = if (tm.args.isEmpty) "" else tm.args.map(expr).mkString("<", ", ", ">")
base(tm.base) + args
}
expr(tm)
}
// this can be used in c++ generation to know whether a const& should be applied to the parameter or not
def toCppParamType(f: Field): String = toCppParamType(f, None, "")
def toCppParamType(f: Field, namespace: Option[String] = None, prefix: String = ""): String = {
val cppType = toCppType(f.ty, namespace)
val localName = prefix + idCpp.local(f.ident);
val refType = "const " + cppType + " & " + localName
val valueType = cppType + " " + localName
def toType(expr: MExpr): String = expr.base match {
case MPrimitive(_,_,_,_,_,_,_,_) => valueType
case MDate => valueType
case d: MDef => d.defType match {
case DEnum => valueType
case _ => refType
}
case MOptional => toType(expr.args.head)
case _ => refType
}
toType(f.ty.resolved)
}
def withNs(namespace: Option[String], t: String) = namespace.fold(t)("::"+_+"::"+t) def withNs(namespace: Option[String], t: String) = namespace.fold(t)("::"+_+"::"+t)
def withPackage(packageName: Option[String], t: String) = packageName.fold(t)(_+"."+t)
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
def writeDoc(w: IndentWriter, doc: Doc) { def writeDoc(w: IndentWriter, doc: Doc) {
......
...@@ -28,7 +28,7 @@ CJNIEXPORT jint JNICALL Java_com_dropbox_djinni_test_CppException_00024CppProxy_ ...@@ -28,7 +28,7 @@ CJNIEXPORT jint JNICALL Java_com_dropbox_djinni_test_CppException_00024CppProxy_
int32_t cr = ref->throw_an_exception(); int32_t cr = ref->throw_an_exception();
return ::djinni::HI32::Unboxed::toJava(jniEnv, cr); return ::djinni::HI32::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter*/) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_CppException_get(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_CppException_get(JNIEnv* jniEnv, jobject /*this*/)
...@@ -39,7 +39,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_CppException_get(JNIEnv* ...@@ -39,7 +39,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_CppException_get(JNIEnv*
std::shared_ptr<CppException> cr = CppException::get(); std::shared_ptr<CppException> cr = CppException::get();
return NativeCppException::toJava(jniEnv, cr); return NativeCppException::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -39,7 +39,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getSetRecord ...@@ -39,7 +39,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getSetRecord
SetRecord cr = TestHelpers::get_set_record(); SetRecord cr = TestHelpers::get_set_record();
return NativeSetRecord::toJava(jniEnv, cr); return NativeSetRecord::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkSetRecord(JNIEnv* jniEnv, jobject /*this*/, jobject j_rec) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkSetRecord(JNIEnv* jniEnv, jobject /*this*/, jobject j_rec)
...@@ -51,7 +51,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkSetRec ...@@ -51,7 +51,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkSetRec
bool cr = TestHelpers::check_set_record(c_rec); bool cr = TestHelpers::check_set_record(c_rec);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getPrimitiveList(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getPrimitiveList(JNIEnv* jniEnv, jobject /*this*/)
...@@ -62,7 +62,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getPrimitive ...@@ -62,7 +62,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getPrimitive
PrimitiveList cr = TestHelpers::get_primitive_list(); PrimitiveList cr = TestHelpers::get_primitive_list();
return NativePrimitiveList::toJava(jniEnv, cr); return NativePrimitiveList::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkPrimitiveList(JNIEnv* jniEnv, jobject /*this*/, jobject j_pl) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkPrimitiveList(JNIEnv* jniEnv, jobject /*this*/, jobject j_pl)
...@@ -74,7 +74,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkPrimit ...@@ -74,7 +74,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkPrimit
bool cr = TestHelpers::check_primitive_list(c_pl); bool cr = TestHelpers::check_primitive_list(c_pl);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getNestedCollection(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getNestedCollection(JNIEnv* jniEnv, jobject /*this*/)
...@@ -85,7 +85,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getNestedCol ...@@ -85,7 +85,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getNestedCol
NestedCollection cr = TestHelpers::get_nested_collection(); NestedCollection cr = TestHelpers::get_nested_collection();
return NativeNestedCollection::toJava(jniEnv, cr); return NativeNestedCollection::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkNestedCollection(JNIEnv* jniEnv, jobject /*this*/, jobject j_nc) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkNestedCollection(JNIEnv* jniEnv, jobject /*this*/, jobject j_nc)
...@@ -97,7 +97,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkNested ...@@ -97,7 +97,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkNested
bool cr = TestHelpers::check_nested_collection(c_nc); bool cr = TestHelpers::check_nested_collection(c_nc);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMap(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMap(JNIEnv* jniEnv, jobject /*this*/)
...@@ -108,7 +108,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMap(JNIEn ...@@ -108,7 +108,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMap(JNIEn
std::unordered_map<std::string, int64_t> cr = TestHelpers::get_map(); std::unordered_map<std::string, int64_t> cr = TestHelpers::get_map();
return ::djinni::HMap<::djinni::HString, ::djinni::HI64>::toJava(jniEnv, cr); return ::djinni::HMap<::djinni::HString, ::djinni::HI64>::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMap(JNIEnv* jniEnv, jobject /*this*/, jobject j_m) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMap(JNIEnv* jniEnv, jobject /*this*/, jobject j_m)
...@@ -120,7 +120,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMap(JN ...@@ -120,7 +120,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMap(JN
bool cr = TestHelpers::check_map(c_m); bool cr = TestHelpers::check_map(c_m);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getEmptyMap(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getEmptyMap(JNIEnv* jniEnv, jobject /*this*/)
...@@ -131,7 +131,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getEmptyMap( ...@@ -131,7 +131,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getEmptyMap(
std::unordered_map<std::string, int64_t> cr = TestHelpers::get_empty_map(); std::unordered_map<std::string, int64_t> cr = TestHelpers::get_empty_map();
return ::djinni::HMap<::djinni::HString, ::djinni::HI64>::toJava(jniEnv, cr); return ::djinni::HMap<::djinni::HString, ::djinni::HI64>::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkEmptyMap(JNIEnv* jniEnv, jobject /*this*/, jobject j_m) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkEmptyMap(JNIEnv* jniEnv, jobject /*this*/, jobject j_m)
...@@ -143,7 +143,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkEmptyM ...@@ -143,7 +143,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkEmptyM
bool cr = TestHelpers::check_empty_map(c_m); bool cr = TestHelpers::check_empty_map(c_m);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMapListRecord(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMapListRecord(JNIEnv* jniEnv, jobject /*this*/)
...@@ -154,7 +154,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMapListRe ...@@ -154,7 +154,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_getMapListRe
MapListRecord cr = TestHelpers::get_map_list_record(); MapListRecord cr = TestHelpers::get_map_list_record();
return NativeMapListRecord::toJava(jniEnv, cr); return NativeMapListRecord::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMapListRecord(JNIEnv* jniEnv, jobject /*this*/, jobject j_m) CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMapListRecord(JNIEnv* jniEnv, jobject /*this*/, jobject j_m)
...@@ -166,7 +166,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMapLis ...@@ -166,7 +166,7 @@ CJNIEXPORT jboolean JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkMapLis
bool cr = TestHelpers::check_map_list_record(c_m); bool cr = TestHelpers::check_map_list_record(c_m);
return ::djinni::HBool::Unboxed::toJava(jniEnv, cr); return ::djinni::HBool::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkClientInterfaceAscii(JNIEnv* jniEnv, jobject /*this*/, jobject j_i) CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkClientInterfaceAscii(JNIEnv* jniEnv, jobject /*this*/, jobject j_i)
...@@ -208,7 +208,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_tokenId(JNIE ...@@ -208,7 +208,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_tokenId(JNIE
std::shared_ptr<Token> cr = TestHelpers::token_id(c_t); std::shared_ptr<Token> cr = TestHelpers::token_id(c_t);
return NativeToken::toJava(jniEnv, cr); return NativeToken::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_createCppToken(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_createCppToken(JNIEnv* jniEnv, jobject /*this*/)
...@@ -219,7 +219,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_createCppTok ...@@ -219,7 +219,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_createCppTok
std::shared_ptr<Token> cr = TestHelpers::create_cpp_token(); std::shared_ptr<Token> cr = TestHelpers::create_cpp_token();
return NativeToken::toJava(jniEnv, cr); return NativeToken::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkCppToken(JNIEnv* jniEnv, jobject /*this*/, jobject j_t) CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_TestHelpers_checkCppToken(JNIEnv* jniEnv, jobject /*this*/, jobject j_t)
...@@ -241,7 +241,7 @@ CJNIEXPORT jlong JNICALL Java_com_dropbox_djinni_test_TestHelpers_cppTokenId(JNI ...@@ -241,7 +241,7 @@ CJNIEXPORT jlong JNICALL Java_com_dropbox_djinni_test_TestHelpers_cppTokenId(JNI
int64_t cr = TestHelpers::cpp_token_id(c_t); int64_t cr = TestHelpers::cpp_token_id(c_t);
return ::djinni::HI64::Unboxed::toJava(jniEnv, cr); return ::djinni::HI64::Unboxed::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_returnNone(JNIEnv* jniEnv, jobject /*this*/) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_returnNone(JNIEnv* jniEnv, jobject /*this*/)
...@@ -252,7 +252,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_returnNone(J ...@@ -252,7 +252,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_returnNone(J
std::experimental::optional<int32_t> cr = TestHelpers::return_none(); std::experimental::optional<int32_t> cr = TestHelpers::return_none();
return ::djinni::HOptional<std::experimental::optional, ::djinni::HI32>::toJava(jniEnv, cr); return ::djinni::HOptional<std::experimental::optional, ::djinni::HI32>::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_assortedIntegersId(JNIEnv* jniEnv, jobject /*this*/, jobject j_i) CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_assortedIntegersId(JNIEnv* jniEnv, jobject /*this*/, jobject j_i)
...@@ -264,7 +264,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_assortedInte ...@@ -264,7 +264,7 @@ CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_TestHelpers_assortedInte
AssortedIntegers cr = TestHelpers::assorted_integers_id(c_i); AssortedIntegers cr = TestHelpers::assorted_integers_id(c_i);
return NativeAssortedIntegers::toJava(jniEnv, cr); return NativeAssortedIntegers::toJava(jniEnv, cr);
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */ ) } JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
} }
} // namespace djinni_generated } // namespace djinni_generated
...@@ -9,6 +9,6 @@ ...@@ -9,6 +9,6 @@
- (int32_t)throwAnException; - (int32_t)throwAnException;
+ (DBCppException*)get; + (DBCppException *)get;
@end @end
...@@ -47,7 +47,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -47,7 +47,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (DBCppException*)get { + (DBCppException *)get {
try { try {
std::shared_ptr<CppException> cppRet = CppException::get(); std::shared_ptr<CppException> cppRet = CppException::get();
DBCppException* objcRet = [DBCppException cppExceptionWithCpp:cppRet]; DBCppException* objcRet = [DBCppException cppExceptionWithCpp:cppRet];
......
...@@ -44,13 +44,13 @@ ...@@ -44,13 +44,13 @@
+ (void)checkEnumMap:(NSDictionary *)m; + (void)checkEnumMap:(NSDictionary *)m;
+ (DBToken*)tokenId:(DBToken*)t; + (DBToken *)tokenId:(DBToken *)t;
+ (DBToken*)createCppToken; + (DBToken *)createCppToken;
+ (void)checkCppToken:(DBToken*)t; + (void)checkCppToken:(DBToken *)t;
+ (int64_t)cppTokenId:(DBToken*)t; + (int64_t)cppTokenId:(DBToken *)t;
+ (NSNumber *)returnNone; + (NSNumber *)returnNone;
......
...@@ -209,7 +209,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -209,7 +209,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (DBToken*)tokenId:(DBToken*)t { + (DBToken *)tokenId:(DBToken *)t {
try { try {
std::shared_ptr<Token> cppT = t.cppRef; std::shared_ptr<Token> cppT = t.cppRef;
std::shared_ptr<Token> cppRet = TestHelpers::token_id(std::move(cppT)); std::shared_ptr<Token> cppRet = TestHelpers::token_id(std::move(cppT));
...@@ -218,7 +218,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -218,7 +218,7 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (DBToken*)createCppToken { + (DBToken *)createCppToken {
try { try {
std::shared_ptr<Token> cppRet = TestHelpers::create_cpp_token(); std::shared_ptr<Token> cppRet = TestHelpers::create_cpp_token();
DBToken* objcRet = [DBToken tokenWithCpp:cppRet]; DBToken* objcRet = [DBToken tokenWithCpp:cppRet];
...@@ -226,14 +226,14 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th ...@@ -226,14 +226,14 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (void)checkCppToken:(DBToken*)t { + (void)checkCppToken:(DBToken *)t {
try { try {
std::shared_ptr<Token> cppT = t.cppRef; std::shared_ptr<Token> cppT = t.cppRef;
TestHelpers::check_cpp_token(std::move(cppT)); TestHelpers::check_cpp_token(std::move(cppT));
} DJINNI_TRANSLATE_EXCEPTIONS() } DJINNI_TRANSLATE_EXCEPTIONS()
} }
+ (int64_t)cppTokenId:(DBToken*)t { + (int64_t)cppTokenId:(DBToken *)t {
try { try {
std::shared_ptr<Token> cppT = t.cppRef; std::shared_ptr<Token> cppT = t.cppRef;
int64_t cppRet = TestHelpers::cpp_token_id(std::move(cppT)); int64_t cppRet = TestHelpers::cpp_token_id(std::move(cppT));
......
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