diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index b419c0f..6041392 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -1031,6 +1031,16 @@ private: unionDiscrim.set, spaces(indent), " return _initPointerField(", factoryArg, ", ", offset, ", size);\n", spaces(indent), " }\n", + + (field.getType().getBrandParameter() == nullptr ? kj::strTree() : + kj::strTree(spaces(indent), " public <", readerType, "> void set", titleCase, + "(org.capnproto.SetPointerBuilder<", builderType, ",", readerType, "> factory,", + readerType, " value) {\n", + unionDiscrim.set, + spaces(indent), " _setPointerField(factory, ", offset, ", value);\n", + spaces(indent), " }\n")), + + "\n"), }; diff --git a/compiler/src/test/scala/org/capnproto/EncodingTest.scala b/compiler/src/test/scala/org/capnproto/EncodingTest.scala index 789cd47..9c153bc 100644 --- a/compiler/src/test/scala/org/capnproto/EncodingTest.scala +++ b/compiler/src/test/scala/org/capnproto/EncodingTest.scala @@ -63,18 +63,23 @@ class EncodingSuite extends FunSuite { val factory = TestGenerics.newFactory(TestAllTypes.factory, Text.factory); val root = message.initRoot(factory); TestUtil.initTestMessage(root.getFoo()); - //root.getRev().setFoo(Text.factory, new Text.Reader("Hello")); - val bar = root.getRev().initBar(1); + root.getDub().setFoo(Text.factory, new Text.Reader("Hello")); + val bar = root.getDub().initBar(1); bar.set(0, 11); - val dubFoo = root.getDub().getFoo() - dubFoo.setInt8Field(111); - var boolList = dubFoo.initBoolList(2); + val revBar = root.getRev().getBar() + revBar.setInt8Field(111); + var boolList = revBar.initBoolList(2); boolList.set(0, false); boolList.set(1, true); - TestUtil.checkTestMessage(root.getFoo()); - TestUtil.checkTestMessage(root.asReader(factory).getFoo()); + val rootReader = root.asReader(factory); + TestUtil.checkTestMessage(rootReader.getFoo()); + val dubReader = root.getDub(); + dubReader.getFoo().toString() should equal ("Hello"); + val barReader = dubReader.getBar(); + barReader.size() should equal (1); + barReader.get(0) should equal (11); } test("Defaults") { diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index b5566c3..ffcf671 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -325,8 +325,8 @@ struct TestNewVersion { struct TestGenerics(Foo, Bar) { foo @0 :Foo; bar @1 :Bar; - rev @2 :TestGenerics(Text, List(UInt8)); - dub @3 :TestGenerics(Foo, Bar); + rev @2 :TestGenerics(Bar, Foo); + dub @3 :TestGenerics(Text, List(UInt8)); struct Inner { foo @0 :Foo; @@ -348,6 +348,33 @@ struct TestGenerics(Foo, Bar) { } } +struct TestGenericsWrapper(Foo, Bar) { + value @0 :TestGenerics(Foo, Bar); +} + +struct TestGenericsWrapper2 { + value @0 :TestGenericsWrapper(Text, TestAllTypes); +} + +struct TestUseGenerics { + basic @0 :TestGenerics(TestAllTypes, TestAnyPointer); + inner @1 :TestGenerics(TestAllTypes, TestAnyPointer).Inner; + inner2 @2 :TestGenerics(TestAllTypes, TestAnyPointer).Inner2(Text); + unspecified @3 :TestGenerics; + unspecifiedInner @4 :TestGenerics.Inner2(Text); + wrapper @8 :TestGenericsWrapper(TestAllTypes, TestAnyPointer); + + default @5 :TestGenerics(TestAllTypes, Text) = + (foo = (int16Field = 123), rev = (foo = "text", rev = (foo = (int16Field = 321)))); + defaultInner @6 :TestGenerics(TestAllTypes, Text).Inner = + (foo = (int16Field = 123), bar = "text"); + defaultUser @7 :TestUseGenerics = (basic = (foo = (int16Field = 123))); + defaultWrapper @9 :TestGenericsWrapper(Text, TestAllTypes) = + (value = (foo = "text", rev = (foo = (int16Field = 321)))); + defaultWrapper2 @10 :TestGenericsWrapper2 = + (value = (value = (foo = "text", rev = (foo = (int16Field = 321))))); +} + struct TestEmptyStruct {} diff --git a/runtime/src/main/java/org/capnproto/Data.java b/runtime/src/main/java/org/capnproto/Data.java index 0c1f0c3..6748c09 100644 --- a/runtime/src/main/java/org/capnproto/Data.java +++ b/runtime/src/main/java/org/capnproto/Data.java @@ -27,7 +27,7 @@ public final class Data { public static final class Factory implements FromPointerReaderBlobDefault, PointerFactory, FromPointerBuilderBlobDefault, - SetPointerBuilder { + SetPointerBuilder { public final Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { return WireHelpers.readDataPointer(segment, pointer, defaultBuffer, defaultOffset, defaultSize); diff --git a/runtime/src/main/java/org/capnproto/ListBuilder.java b/runtime/src/main/java/org/capnproto/ListBuilder.java index 8fb3fbe..c10bd22 100644 --- a/runtime/src/main/java/org/capnproto/ListBuilder.java +++ b/runtime/src/main/java/org/capnproto/ListBuilder.java @@ -138,7 +138,7 @@ public class ListBuilder { elementCount); } - protected final void _setPointerElement(SetPointerBuilder factory, int index, Reader value) { + protected final void _setPointerElement(SetPointerBuilder factory, int index, Reader value) { factory.setPointerBuilder(this.segment, (this.ptr + (index * this.step / Constants.BITS_PER_BYTE)) / Constants.BYTES_PER_WORD, value); diff --git a/runtime/src/main/java/org/capnproto/ListFactory.java b/runtime/src/main/java/org/capnproto/ListFactory.java index 0113b3c..bbb8444 100644 --- a/runtime/src/main/java/org/capnproto/ListFactory.java +++ b/runtime/src/main/java/org/capnproto/ListFactory.java @@ -24,7 +24,7 @@ package org.capnproto; public abstract class ListFactory implements ListBuilder.Factory, FromPointerBuilderRefDefault, - SetPointerBuilder, + SetPointerBuilder, ListReader.Factory, PointerFactory, FromPointerReaderRefDefault { diff --git a/runtime/src/main/java/org/capnproto/SetPointerBuilder.java b/runtime/src/main/java/org/capnproto/SetPointerBuilder.java index 4cdc576..636c3a2 100644 --- a/runtime/src/main/java/org/capnproto/SetPointerBuilder.java +++ b/runtime/src/main/java/org/capnproto/SetPointerBuilder.java @@ -21,6 +21,6 @@ package org.capnproto; -public interface SetPointerBuilder { +public interface SetPointerBuilder { void setPointerBuilder(SegmentBuilder segment, int pointer, Reader value); } diff --git a/runtime/src/main/java/org/capnproto/StructBuilder.java b/runtime/src/main/java/org/capnproto/StructBuilder.java index 7cdb934..548e6a0 100644 --- a/runtime/src/main/java/org/capnproto/StructBuilder.java +++ b/runtime/src/main/java/org/capnproto/StructBuilder.java @@ -194,8 +194,7 @@ public class StructBuilder { return factory.initFromPointerBuilder(this.segment, this.pointers + index, elementCount); } - protected final void _setPointerField(SetPointerBuilder factory, int index, Reader value) { + protected final void _setPointerField(SetPointerBuilder factory, int index, Reader value) { factory.setPointerBuilder(this.segment, this.pointers + index, value); } - } diff --git a/runtime/src/main/java/org/capnproto/StructFactory.java b/runtime/src/main/java/org/capnproto/StructFactory.java index 23d5573..5ff08e0 100644 --- a/runtime/src/main/java/org/capnproto/StructFactory.java +++ b/runtime/src/main/java/org/capnproto/StructFactory.java @@ -25,7 +25,7 @@ public abstract class StructFactory implements PointerFactory, FromPointerBuilderRefDefault, StructBuilder.Factory, - SetPointerBuilder, + SetPointerBuilder, FromPointerReaderRefDefault, StructReader.Factory { public final Reader fromPointerReaderRefDefault(SegmentReader segment, int pointer, diff --git a/runtime/src/main/java/org/capnproto/Text.java b/runtime/src/main/java/org/capnproto/Text.java index 4eac07e..679cdb6 100644 --- a/runtime/src/main/java/org/capnproto/Text.java +++ b/runtime/src/main/java/org/capnproto/Text.java @@ -28,7 +28,7 @@ public final class Text { FromPointerReaderBlobDefault, FromPointerBuilderBlobDefault, PointerFactory, - SetPointerBuilder { + SetPointerBuilder { public final Reader fromPointerReaderBlobDefault(SegmentReader segment, int pointer, java.nio.ByteBuffer defaultBuffer, int defaultOffset, int defaultSize) { return WireHelpers.readTextPointer(segment, pointer, defaultBuffer, defaultOffset, defaultSize);