Commit 3f9151c6 authored by Aleksey Konovalov's avatar Aleksey Konovalov

Merge branch 'master' into cpp_wide_strings_support

Conflicts:
	test-suite/objc/DjinniObjcTest.xcodeproj/project.pbxproj
parents bf31ef21 2a896c73
......@@ -428,7 +428,6 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory.
* [Slides](https://bit.ly/djinnitalk2) and [video](https://bit.ly/djinnivideo2) from the CppCon 2015 about Djinni implementatino techniques, and the addition of Python.
* You can see a [CppCon 2014 talk](https://www.youtube.com/watch?v=5AZMEm3rZ2Y) by app developers at Dropbox about their cross-platform experiences.
## Authors
- Kannan Goundan
- Tony Grue
......@@ -439,5 +438,5 @@ Run `make test` to invoke the test suite, found in the test-suite subdirectory.
- Andrew Twyman
## Contacts
- Jacob Potter - `djinni@j4cbo.com`
- Andrew Twyman - `atwyman@dropbox.com`
- Jacob Potter - `djinni@j4cbo.com`
......@@ -35,11 +35,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
def writeJniHppFile(name: String, origin: String, includes: Iterable[String], fwds: Iterable[String], f: IndentWriter => Unit, f2: IndentWriter => Unit = (w => {})) =
writeHppFileGeneric(spec.jniHeaderOutFolder.get, spec.jniNamespace, spec.jniFileIdentStyle)(name, origin, includes, fwds, f, f2)
class JNIRefs(name: String) {
class JNIRefs(name: String, cppPrefixOverride: Option[String]=None) {
var jniHpp = mutable.TreeSet[String]()
var jniCpp = mutable.TreeSet[String]()
jniHpp.add("#include " + q(spec.jniIncludeCppPrefix + spec.cppFileIdentStyle(name) + "." + spec.cppHeaderExt))
val cppPrefix = cppPrefixOverride.getOrElse(spec.jniIncludeCppPrefix)
jniHpp.add("#include " + q(cppPrefix + spec.cppFileIdentStyle(name) + "." + spec.cppHeaderExt))
jniHpp.add("#include " + q(spec.jniBaseLibIncludePrefix + "djinni_support.hpp"))
spec.cppNnHeader match {
case Some(nnHdr) => jniHpp.add("#include " + nnHdr)
......@@ -82,7 +83,12 @@ class JNIGenerator(spec: Spec) extends Generator(spec) {
}
override def generateRecord(origin: String, ident: Ident, doc: Doc, params: Seq[TypeParam], r: Record) {
val refs = new JNIRefs(ident.name)
val prefixOverride: Option[String] = if (r.ext.cpp) {
Some(spec.cppExtendedRecordIncludePrefix)
} else {
None
}
val refs = new JNIRefs(ident.name, prefixOverride)
r.fields.foreach(f => refs.find(f.ty))
val jniHelper = jniMarshal.helperClass(ident)
......
......@@ -58,7 +58,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
List(ImportRef(include(d.name)))
case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext
if (ext.cpp && !ext.objc) {
if (!ext.objc) {
List(ImportRef("<Foundation/Foundation.h>"), DeclRef(s"@class ${typename(d.name, d.body)};", None))
}
else {
......@@ -119,7 +119,7 @@ class ObjcMarshal(spec: Spec) extends Marshal(spec) {
case DRecord => (idObjc.ty(d.name), true)
case DInterface =>
val ext = d.body.asInstanceOf[Interface].ext
if (ext.cpp && !ext.objc)
if (!ext.objc)
(idObjc.ty(d.name), true)
else
(s"id<${idObjc.ty(d.name)}>", false)
......
......@@ -73,6 +73,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
refs.privHeader.add("#include <memory>")
refs.privHeader.add("!#include " + q(spec.objcppIncludeCppPrefix + spec.cppFileIdentStyle(ident) + "." + spec.cppHeaderExt))
refs.body.add("!#import " + q(spec.objcppIncludeObjcPrefix + headerName(ident)))
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name)))
spec.cppNnHeader match {
case Some(nnHdr) => refs.privHeader.add("#include " + nnHdr)
......@@ -120,7 +121,6 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
})
if (i.ext.cpp) {
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name)))
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJICppWrapperCache+Private.h"))
refs.body.add("#include <utility>")
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIError.h"))
......@@ -129,7 +129,10 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
if (i.ext.objc) {
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIObjcWrapperCache+Private.h"))
refs.body.add("!#import " + q(spec.objcppIncludePrefix + objcppMarshal.privateHeaderName(ident.name)))
}
if (!i.ext.cpp && !i.ext.objc) {
refs.body.add("#import " + q(spec.objcBaseLibIncludePrefix + "DJIError.h"))
}
writeObjcFile(privateBodyName(ident.name), origin, refs.body, w => {
......@@ -249,7 +252,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
// we don't have to do any casting at all, just access cppRef directly.
w.wl("return " + nnCheck("objc->_cppRefHandle.get()") + ";")
//w.wl(s"return ${spec.cppNnCheckExpression.getOrElse("")}(objc->_cppRefHandle.get());")
} else {
} else if (i.ext.cpp || i.ext.objc) {
// ObjC only, or ObjC and C++.
if (i.ext.cpp) {
// If it could be implemented in C++, we might have to unwrap a proxy object.
......@@ -260,6 +263,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
}
val getProxyExpr = s"::djinni::get_objc_proxy<ObjcProxy>(objc)"
w.wl(s"return ${nnCheck(getProxyExpr)};")
} else {
// Neither ObjC nor C++. Unusable, but generate compilable code.
w.wl("DJINNI_UNIMPLEMENTED(@\"Interface not implementable in any language.\");")
}
}
w.wl
......@@ -272,7 +278,7 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
// ObjC only. In this case we *must* unwrap a proxy object - the dynamic_cast will
// throw bad_cast if we gave it something of the wrong type.
w.wl(s"return dynamic_cast<ObjcProxy&>(*cpp).Handle::get();")
} else {
} else if (i.ext.objc || i.ext.cpp) {
// C++ only, or C++ and ObjC.
if (i.ext.objc) {
// If it could be implemented in ObjC, we might have to unwrap a proxy object.
......@@ -281,6 +287,9 @@ class ObjcppGenerator(spec: Spec) extends BaseObjcGenerator(spec) {
}
}
w.wl(s"return ::djinni::get_cpp_proxy<$objcSelf>(cpp);")
} else {
// Neither ObjC nor C++. Unusable, but generate compilable code.
w.wl("DJINNI_UNIMPLEMENTED(@\"Interface not implementable in any language.\");")
}
}
})
......
......@@ -174,7 +174,7 @@ namespace djinni
static LocalRef<JniType> fromCpp(JNIEnv* jniEnv, const CppType& c)
{
return {jniEnv, jniStringFromUTF8(jniEnv, c.c_str())};
return {jniEnv, jniStringFromUTF8(jniEnv, c)};
}
};
......@@ -249,7 +249,7 @@ namespace djinni
// Using .data() on an empty vector is UB
if(!c.empty())
{
jniEnv->SetByteArrayRegion(j.get(), 0, c.size(), reinterpret_cast<const jbyte*>(c.data()));
jniEnv->SetByteArrayRegion(j.get(), 0, jsize(c.size()), reinterpret_cast<const jbyte*>(c.data()));
}
return j;
}
......
......@@ -366,7 +366,7 @@ jstring jniStringFromUTF8(JNIEnv * env, const std::string & str) {
utf16_encode(utf8_decode(str, i), utf16);
jstring res = env->NewString(
reinterpret_cast<const jchar *>(utf16.data()), utf16.length());
reinterpret_cast<const jchar *>(utf16.data()), jsize(utf16.length()));
DJINNI_ASSERT(res, env);
return res;
}
......
......@@ -18,11 +18,17 @@
namespace djinni {
// Throws an exception for an unimplemented method call.
[[noreturn]] void throwUnimplemented(const char * ctx, NSString * msg);
// Helper function for exception translation. Do not call directly!
[[noreturn]] void throwNSExceptionFromCurrent(const char * ctx);
} // namespace djinni
#define DJINNI_UNIMPLEMENTED(msg) \
::djinni::throwUnimplemented(__PRETTY_FUNCTION__, msg);
#define DJINNI_TRANSLATE_EXCEPTIONS() \
catch (const std::exception & e) { \
::djinni::throwNSExceptionFromCurrent(__PRETTY_FUNCTION__); \
......
......@@ -21,6 +21,11 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
namespace djinni {
[[noreturn]] __attribute__((weak)) void throwUnimplemented(const char * /*ctx*/, NSString * message) {
[NSException raise:NSInternalInconsistencyException format:@"Unimplemented: %@", message];
__builtin_unreachable();
}
[[noreturn]] __attribute__((weak)) void throwNSExceptionFromCurrent(const char * /*ctx*/) {
try {
throw;
......
......@@ -5,5 +5,7 @@ java_only_listener = interface +j {}
# on references to interfaces they don't need.
uses_single_language_listeners = interface +o +j +c {
callForObjC(l: objc_only_listener);
returnForObjC(): objc_only_listener;
callForJava(l: java_only_listener);
returnForJava(): java_only_listener;
}
......@@ -20,7 +20,11 @@ public:
virtual void callForObjC(const std::shared_ptr<ObjcOnlyListener> & l) = 0;
virtual std::shared_ptr<ObjcOnlyListener> returnForObjC() = 0;
virtual void callForJava(const std::shared_ptr<JavaOnlyListener> & l) = 0;
virtual std::shared_ptr<JavaOnlyListener> returnForJava() = 0;
};
} // namespace testsuite
......@@ -14,8 +14,14 @@ import javax.annotation.Nonnull;
public abstract class UsesSingleLanguageListeners {
public abstract void callForObjC(@CheckForNull ObjcOnlyListener l);
@CheckForNull
public abstract ObjcOnlyListener returnForObjC();
public abstract void callForJava(@CheckForNull JavaOnlyListener l);
@CheckForNull
public abstract JavaOnlyListener returnForJava();
private static final class CppProxy extends UsesSingleLanguageListeners
{
private final long nativeRef;
......@@ -47,6 +53,14 @@ public abstract class UsesSingleLanguageListeners {
}
private native void native_callForObjC(long _nativeRef, ObjcOnlyListener l);
@Override
public ObjcOnlyListener returnForObjC()
{
assert !this.destroyed.get() : "trying to use a destroyed object";
return native_returnForObjC(this.nativeRef);
}
private native ObjcOnlyListener native_returnForObjC(long _nativeRef);
@Override
public void callForJava(JavaOnlyListener l)
{
......@@ -54,5 +68,13 @@ public abstract class UsesSingleLanguageListeners {
native_callForJava(this.nativeRef, l);
}
private native void native_callForJava(long _nativeRef, JavaOnlyListener l);
@Override
public JavaOnlyListener returnForJava()
{
assert !this.destroyed.get() : "trying to use a destroyed object";
return native_returnForJava(this.nativeRef);
}
private native JavaOnlyListener native_returnForJava(long _nativeRef);
}
}
......@@ -3,8 +3,8 @@
#pragma once
#include "../../handwritten-src/cpp/extended_record.hpp"
#include "djinni_support.hpp"
#include "extended_record.hpp"
namespace djinni_generated {
......
......@@ -23,6 +23,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForObjC(const std::shared
::djinni::get(::djinni_generated::NativeObjcOnlyListener::fromCpp(jniEnv, c_l)));
::djinni::jniExceptionCheck(jniEnv);
}
std::shared_ptr<::testsuite::ObjcOnlyListener> NativeUsesSingleLanguageListeners::JavaProxy::returnForObjC() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeUsesSingleLanguageListeners>::get();
auto jret = jniEnv->CallObjectMethod(Handle::get().get(), data.method_returnForObjC);
::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeObjcOnlyListener::toCpp(jniEnv, jret);
}
void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
......@@ -31,6 +39,14 @@ void NativeUsesSingleLanguageListeners::JavaProxy::callForJava(const std::shared
::djinni::get(::djinni_generated::NativeJavaOnlyListener::fromCpp(jniEnv, c_l)));
::djinni::jniExceptionCheck(jniEnv);
}
std::shared_ptr<::testsuite::JavaOnlyListener> NativeUsesSingleLanguageListeners::JavaProxy::returnForJava() {
auto jniEnv = ::djinni::jniGetThreadEnv();
::djinni::JniLocalScope jscope(jniEnv, 10);
const auto& data = ::djinni::JniClass<::djinni_generated::NativeUsesSingleLanguageListeners>::get();
auto jret = jniEnv->CallObjectMethod(Handle::get().get(), data.method_returnForJava);
::djinni::jniExceptionCheck(jniEnv);
return ::djinni_generated::NativeJavaOnlyListener::toCpp(jniEnv, jret);
}
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_nativeDestroy(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{
......@@ -49,6 +65,16 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, )
}
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1returnForObjC(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{
try {
DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);
const auto& ref = ::djinni::objectFromHandleAddress<::testsuite::UsesSingleLanguageListeners>(nativeRef);
auto r = ref->returnForObjC();
return ::djinni::release(::djinni_generated::NativeObjcOnlyListener::fromCpp(jniEnv, r));
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
}
CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1callForJava(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef, jobject j_l)
{
try {
......@@ -58,4 +84,14 @@ CJNIEXPORT void JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, )
}
CJNIEXPORT jobject JNICALL Java_com_dropbox_djinni_test_UsesSingleLanguageListeners_00024CppProxy_native_1returnForJava(JNIEnv* jniEnv, jobject /*this*/, jlong nativeRef)
{
try {
DJINNI_FUNCTION_PROLOGUE1(jniEnv, nativeRef);
const auto& ref = ::djinni::objectFromHandleAddress<::testsuite::UsesSingleLanguageListeners>(nativeRef);
auto r = ref->returnForJava();
return ::djinni::release(::djinni_generated::NativeJavaOnlyListener::fromCpp(jniEnv, r));
} JNI_TRANSLATE_EXCEPTIONS_RETURN(jniEnv, 0 /* value doesn't matter */)
}
} // namespace djinni_generated
......@@ -34,7 +34,9 @@ private:
~JavaProxy();
void callForObjC(const std::shared_ptr<::testsuite::ObjcOnlyListener> & l) override;
std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override;
void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & l) override;
std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override;
private:
friend ::djinni::JniInterface<::testsuite::UsesSingleLanguageListeners, ::djinni_generated::NativeUsesSingleLanguageListeners>;
......@@ -42,7 +44,9 @@ private:
const ::djinni::GlobalRef<jclass> clazz { ::djinni::jniFindClass("com/dropbox/djinni/test/UsesSingleLanguageListeners") };
const jmethodID method_callForObjC { ::djinni::jniGetMethodID(clazz.get(), "callForObjC", "(Lcom/dropbox/djinni/test/ObjcOnlyListener;)V") };
const jmethodID method_returnForObjC { ::djinni::jniGetMethodID(clazz.get(), "returnForObjC", "()Lcom/dropbox/djinni/test/ObjcOnlyListener;") };
const jmethodID method_callForJava { ::djinni::jniGetMethodID(clazz.get(), "callForJava", "(Lcom/dropbox/djinni/test/JavaOnlyListener;)V") };
const jmethodID method_returnForJava { ::djinni::jniGetMethodID(clazz.get(), "returnForJava", "()Lcom/dropbox/djinni/test/JavaOnlyListener;") };
};
} // namespace djinni_generated
// AUTOGENERATED FILE - DO NOT MODIFY!
// This file generated by Djinni from single_language_interfaces.djinni
#import "DBJavaOnlyListener+Private.h"
#import "DBJavaOnlyListener.h"
#import "DJIError.h"
static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for this file");
......@@ -12,7 +14,7 @@ auto JavaOnlyListener::toCpp(ObjcType objc) -> CppType
if (!objc) {
return nullptr;
}
return ::djinni::get_objc_proxy<ObjcProxy>(objc);
DJINNI_UNIMPLEMENTED(@"Interface not implementable in any language.");
}
auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
......@@ -20,7 +22,7 @@ auto JavaOnlyListener::fromCppOpt(const CppOptType& cpp) -> ObjcType
if (!cpp) {
return nil;
}
return ::djinni::get_cpp_proxy<DBJavaOnlyListener>(cpp);
DJINNI_UNIMPLEMENTED(@"Interface not implementable in any language.");
}
} // namespace djinni_generated
......@@ -37,12 +37,26 @@ static_assert(__has_feature(objc_arc), "Djinni requires ARC to be enabled for th
} DJINNI_TRANSLATE_EXCEPTIONS()
}
- (void)callForJava:(nullable id<DBJavaOnlyListener>)l {
- (nullable id<DBObjcOnlyListener>)returnForObjC {
try {
auto r = _cppRefHandle.get()->returnForObjC();
return ::djinni_generated::ObjcOnlyListener::fromCpp(r);
} DJINNI_TRANSLATE_EXCEPTIONS()
}
- (void)callForJava:(nullable DBJavaOnlyListener *)l {
try {
_cppRefHandle.get()->callForJava(::djinni_generated::JavaOnlyListener::toCpp(l));
} DJINNI_TRANSLATE_EXCEPTIONS()
}
- (nullable DBJavaOnlyListener *)returnForJava {
try {
auto r = _cppRefHandle.get()->returnForJava();
return ::djinni_generated::JavaOnlyListener::fromCpp(r);
} DJINNI_TRANSLATE_EXCEPTIONS()
}
namespace djinni_generated {
class UsesSingleLanguageListeners::ObjcProxy final
......@@ -57,12 +71,26 @@ public:
[Handle::get() callForObjC:(::djinni_generated::ObjcOnlyListener::fromCpp(c_l))];
}
}
std::shared_ptr<::testsuite::ObjcOnlyListener> returnForObjC() override
{
@autoreleasepool {
auto r = [Handle::get() returnForObjC];
return ::djinni_generated::ObjcOnlyListener::toCpp(r);
}
}
void callForJava(const std::shared_ptr<::testsuite::JavaOnlyListener> & c_l) override
{
@autoreleasepool {
[Handle::get() callForJava:(::djinni_generated::JavaOnlyListener::fromCpp(c_l))];
}
}
std::shared_ptr<::testsuite::JavaOnlyListener> returnForJava() override
{
@autoreleasepool {
auto r = [Handle::get() returnForJava];
return ::djinni_generated::JavaOnlyListener::toCpp(r);
}
}
};
} // namespace djinni_generated
......
......@@ -2,7 +2,7 @@
// This file generated by Djinni from single_language_interfaces.djinni
#import <Foundation/Foundation.h>
@protocol DBJavaOnlyListener;
@class DBJavaOnlyListener;
@protocol DBObjcOnlyListener;
......@@ -14,6 +14,10 @@
- (void)callForObjC:(nullable id<DBObjcOnlyListener>)l;
- (void)callForJava:(nullable id<DBJavaOnlyListener>)l;
- (nullable id<DBObjcOnlyListener>)returnForObjC;
- (void)callForJava:(nullable DBJavaOnlyListener *)l;
- (nullable DBJavaOnlyListener *)returnForJava;
@end
......@@ -76,7 +76,8 @@ bool TestHelpers::check_map_list_record(const MapListRecord & rec) {
}
static const std::string HELLO_WORLD = "Hello World!";
static const std::string NON_ASCII = "Non-ASCII / 非 ASCII 字符";
static const std::string NON_ASCII("Non-ASCII /\0 非 ASCII 字符",
sizeof("Non-ASCII /\0 非 ASCII 字符")-1);
void TestHelpers::check_client_interface_ascii(const std::shared_ptr<ClientInterface> & i) {
ClientReturnedRecord cReturnedRecord = i->get_record(5, HELLO_WORLD, {});
......
......@@ -5,7 +5,7 @@ import javax.annotation.CheckForNull;
public class ClientInterfaceImpl extends ClientInterface {
@Override
public ClientReturnedRecord getRecord(long id, String utf8string, String misc) {
if (!utf8string.equals("Non-ASCII / 非 ASCII 字符") && !utf8string.equals("Hello World!")) {
if (!utf8string.equals("Non-ASCII /\0 非 ASCII 字符") && !utf8string.equals("Hello World!")) {
throw new RuntimeException("Unexpected string. Check UTF-8?");
}
return new ClientReturnedRecord(id, utf8string, misc);
......
......@@ -2,7 +2,7 @@
#import "DBClientReturnedRecord+Private.h"
static NSString *DBHelloWorld = @"Hello World!";
static NSString *DBNonAscii = @"Non-ASCII / 非 ASCII 字符";
static NSString *DBNonAscii = @"Non-ASCII /\0 非 ASCII 字符";
@implementation DBClientInterfaceImpl
......
FROM fedora:24
# Get Java 8 (64-bit)
RUN dnf install -y java-1.8.0-openjdk-devel
# Get other build utils
RUN dnf install -y cmake wget tar make gcc-c++
# Select Java 8
RUN echo 1 | update-alternatives --config java
RUN echo 1 | update-alternatives --config javac
# Get modern ant
RUN yum install -y ant
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.92-5.b14.fc24.x86_64
VOLUME /opt/djinni
CMD /opt/djinni/test-suite/java/docker/build_and_run_tests.sh
......@@ -77,6 +77,9 @@
B5D8FC371C23E2F40045ADCF /* DBConstantRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5D8FC351C23E2F40045ADCF /* DBConstantRecord+Private.mm */; };
B5E9C93B1C1F9D9D0073C123 /* reverse_client_interface_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C9391C1F9D9D0073C123 /* reverse_client_interface_impl.cpp */; };
B5E9C9401C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */; };
B5F06AB11D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */; };
B5F06AB21D499379005BE736 /* DBObjcOnlyListener+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */; };
B5F06AB31D499379005BE736 /* DBJavaOnlyListener+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */; };
CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */; };
CFAED8761B54291900E3B8A3 /* DBEmptyRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = CFAED8741B54291900E3B8A3 /* DBEmptyRecord+Private.mm */; };
CFC5D9D01B15105100BF2DF8 /* extern_record_with_derivings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CFC5D9CE1B15105100BF2DF8 /* extern_record_with_derivings.cpp */; };
......@@ -297,6 +300,18 @@
B5E9C93D1C1F9E9E0073C123 /* DBReverseClientInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBReverseClientInterface.h; sourceTree = "<group>"; };
B5E9C93E1C1F9E9E0073C123 /* DBReverseClientInterface+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBReverseClientInterface+Private.h"; sourceTree = "<group>"; };
B5E9C93F1C1F9E9E0073C123 /* DBReverseClientInterface+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBReverseClientInterface+Private.mm"; sourceTree = "<group>"; };
B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBUsesSingleLanguageListeners+Private.mm"; sourceTree = "<group>"; };
B5F06AA91D499379005BE736 /* DBUsesSingleLanguageListeners+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBUsesSingleLanguageListeners+Private.h"; sourceTree = "<group>"; };
B5F06AAA1D499379005BE736 /* DBUsesSingleLanguageListeners.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBUsesSingleLanguageListeners.h; sourceTree = "<group>"; };
B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBObjcOnlyListener+Private.mm"; sourceTree = "<group>"; };
B5F06AAC1D499379005BE736 /* DBObjcOnlyListener+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBObjcOnlyListener+Private.h"; sourceTree = "<group>"; };
B5F06AAD1D499379005BE736 /* DBObjcOnlyListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBObjcOnlyListener.h; sourceTree = "<group>"; };
B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBJavaOnlyListener+Private.mm"; sourceTree = "<group>"; };
B5F06AAF1D499379005BE736 /* DBJavaOnlyListener+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBJavaOnlyListener+Private.h"; sourceTree = "<group>"; };
B5F06AB01D499379005BE736 /* DBJavaOnlyListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBJavaOnlyListener.h; sourceTree = "<group>"; };
B5F06AB41D49950C005BE736 /* uses_single_language_listeners.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = uses_single_language_listeners.hpp; sourceTree = "<group>"; };
B5F06AB51D49950C005BE736 /* objc_only_listener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = objc_only_listener.hpp; sourceTree = "<group>"; };
B5F06AB61D49950C005BE736 /* java_only_listener.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = java_only_listener.hpp; sourceTree = "<group>"; };
CFAED8711B54291900E3B8A3 /* DBEmptyRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBEmptyRecord.h; sourceTree = "<group>"; };
CFAED8721B54291900E3B8A3 /* DBEmptyRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBEmptyRecord.mm; sourceTree = "<group>"; };
CFAED8731B54291900E3B8A3 /* DBEmptyRecord+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBEmptyRecord+Private.h"; sourceTree = "<group>"; };
......@@ -478,6 +493,15 @@
728E11181D37DE0B005A554D /* DBWcharTestRec.mm */,
728E11191D37DE0B005A554D /* DBWcharTestRec+Private.h */,
728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */,
B5F06AA81D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm */,
B5F06AA91D499379005BE736 /* DBUsesSingleLanguageListeners+Private.h */,
B5F06AAA1D499379005BE736 /* DBUsesSingleLanguageListeners.h */,
B5F06AAB1D499379005BE736 /* DBObjcOnlyListener+Private.mm */,
B5F06AAC1D499379005BE736 /* DBObjcOnlyListener+Private.h */,
B5F06AAD1D499379005BE736 /* DBObjcOnlyListener.h */,
B5F06AAE1D499379005BE736 /* DBJavaOnlyListener+Private.mm */,
B5F06AAF1D499379005BE736 /* DBJavaOnlyListener+Private.h */,
B5F06AB01D499379005BE736 /* DBJavaOnlyListener.h */,
B5D8FC321C23E2F40045ADCF /* DBConstantRecord.h */,
B5D8FC331C23E2F40045ADCF /* DBConstantRecord.mm */,
B5D8FC341C23E2F40045ADCF /* DBConstantRecord+Private.h */,
......@@ -600,6 +624,9 @@
children = (
728E11121D37DDFB005A554D /* wchar_test_helpers.hpp */,
728E11131D37DDFB005A554D /* wchar_test_rec.hpp */,
B5F06AB41D49950C005BE736 /* uses_single_language_listeners.hpp */,
B5F06AB51D49950C005BE736 /* objc_only_listener.hpp */,
B5F06AB61D49950C005BE736 /* java_only_listener.hpp */,
B5D8FC381C23E30D0045ADCF /* constant_record.hpp */,
B5E9C93C1C1F9DCA0073C123 /* reverse_client_interface.hpp */,
A209B57B1BBA2A180070C310 /* opt_color_record.hpp */,
......@@ -735,6 +762,7 @@
655168421C404B81003682A4 /* DBFirstListener+Private.mm in Sources */,
A24850271AF96EBC00AFE907 /* DBClientReturnedRecord.mm in Sources */,
CFC5D9D61B15106400BF2DF8 /* DBExternRecordWithDerivings.mm in Sources */,
B5F06AB31D499379005BE736 /* DBJavaOnlyListener+Private.mm in Sources */,
CFC5DA0E1B15330000BF2DF8 /* record_with_duration_and_derivings.cpp in Sources */,
A238CA941AF84B7100CDDCE5 /* DBMapDateRecord+Private.mm in Sources */,
CFFD588F1B019E79001E10B6 /* DBTestHelpers+Private.mm in Sources */,
......@@ -758,10 +786,12 @@
A24249741AF192FC003BF8F0 /* constants.cpp in Sources */,
CFFD588B1B019E79001E10B6 /* DBClientInterface+Private.mm in Sources */,
B52DA5691B103F72005CE75F /* DBAssortedPrimitives.mm in Sources */,
B5F06AB21D499379005BE736 /* DBObjcOnlyListener+Private.mm in Sources */,
A24850281AF96EBC00AFE907 /* DBConstants.mm in Sources */,
655168431C404B81003682A4 /* DBSecondListener+Private.mm in Sources */,
CFFD58B71B041BFD001E10B6 /* constants_interface.cpp in Sources */,
CFAED8751B54291900E3B8A3 /* DBEmptyRecord.mm in Sources */,
B5F06AB11D499379005BE736 /* DBUsesSingleLanguageListeners+Private.mm in Sources */,
A238CA9A1AF84B7100CDDCE5 /* DBNestedCollection+Private.mm in Sources */,
CFFD58911B019E79001E10B6 /* DBUserToken+Private.mm in Sources */,
A2CB54B419BA6E6000A9E600 /* DJIError.mm in Sources */,
......
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