From 46e5e77cc86bcaf56d9aed9107be3fc9a5378d1c Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 29 Oct 2014 10:03:17 -0400 Subject: [PATCH] setters for fields of generic structs --- compiler/src/main/cpp/capnpc-java.c++ | 19 +++++++++++++++++-- .../scala/org/capnproto/EncodingTest.scala | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 6041392..8eee711 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -1049,6 +1049,7 @@ private: kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str( "Schemas.b_", kj::hex(typeId), ", ", defaultOffset); + auto typeParamVec = getTypeParameters(field.getContainingStruct()); auto factoryArg = makeFactoryArg(field.getType()); return FieldText { @@ -1072,8 +1073,22 @@ private: "_getPointerField(", factoryArg, ", ", offset, ", ", defaultParams, ");\n", spaces(indent), " }\n", - // TODO deal with generics here. - (field.getType().asStruct().getProto().getIsGeneric() ? kj::strTree() : + (field.getType().asStruct().getProto().getIsGeneric() ? + kj::strTree( + spaces(indent), " public final ", + (typeParamVec.size() == 0 ? kj::strTree() : + kj::strTree( + "<", + kj::StringTree(KJ_MAP(p, typeParamVec) { + return kj::strTree(p, "_Reader"); + }, ", "), + "> ")), + "void set", titleCase, + "(org.capnproto.SetPointerBuilder<", builderType, ", ", readerType, "> factory, ", readerType, " value) {\n", + unionDiscrim.set, + spaces(indent), " _setPointerField(factory, ", offset, ", value);\n", + spaces(indent), " }\n" + ) : kj::strTree( spaces(indent), " public final void set", titleCase, "(", readerType, " value) {\n", unionDiscrim.set, diff --git a/compiler/src/test/scala/org/capnproto/EncodingTest.scala b/compiler/src/test/scala/org/capnproto/EncodingTest.scala index 9c153bc..4e97eab 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingTest.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingTest.scala @@ -82,6 +82,22 @@ class EncodingSuite extends FunSuite { barReader.get(0) should equal (11); } + test("UseGenerics") { + val message = new MessageBuilder(); + val root = message.initRoot(TestUseGenerics.factory); + { + val message2 = new MessageBuilder(); + val factory2 = TestGenerics.newFactory(AnyPointer.factory, AnyPointer.factory); + val root2 = message2.initRoot(factory2); + val dub2 = root2.initDub().setFoo(Text.factory, new Text.Reader("foobar")); + + root.setUnspecified(factory2, root2.asReader(factory2)); + } + + val rootReader = root.asReader(); + root.getUnspecified().getDub().getFoo().toString() should equal ("foobar"); + } + test("Defaults") { val message = new MessageBuilder(); val defaults = message.initRoot(TestDefaults.factory);