From cefd8eaaa2d0f932dda8bbcc96ec1983368f7e52 Mon Sep 17 00:00:00 2001 From: Vaci Koblizek Date: Mon, 9 Nov 2020 15:43:23 +0000 Subject: [PATCH] add AnyStruct --- compiler/pom.xml | 4 +- compiler/src/main/cpp/capnpc-java.c++ | 26 +++++---- .../test/java/org/capnproto/EncodingTest.java | 8 +++ compiler/src/test/schema/test.capnp | 6 ++ .../main/java/org/capnproto/AnyStruct.java | 56 +++++++++++++++++++ 5 files changed, 87 insertions(+), 13 deletions(-) create mode 100644 runtime/src/main/java/org/capnproto/AnyStruct.java diff --git a/compiler/pom.xml b/compiler/pom.xml index 3fcafa3..43fb798 100644 --- a/compiler/pom.xml +++ b/compiler/pom.xml @@ -83,13 +83,13 @@ generate-test-sources - + - + diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 0a77097..54744ae 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -412,6 +412,8 @@ private: switch (type.whichAnyPointerKind()) { case schema::Type::AnyPointer::Unconstrained::CAPABILITY: return kj::strTree("org.capnproto.Capability.", suffix); + case schema::Type::AnyPointer::Unconstrained::STRUCT: + return kj::strTree("org.capnproto.AnyStruct.", suffix); default: return kj::strTree("org.capnproto.AnyPointer.", suffix); } @@ -775,8 +777,10 @@ private: } else { switch (type.whichAnyPointerKind()) { - case schema::Type::AnyPointer::Unconstrained::CAPABILITY: - return kj::str("org.capnproto.Capability.factory"); + case schema::Type::AnyPointer::Unconstrained::CAPABILITY: + return kj::str("org.capnproto.Capability.factory"); + case schema::Type::AnyPointer::Unconstrained::STRUCT: + return kj::str("org.capnproto.AnyStruct.factory"); default: return kj::str("org.capnproto.AnyPointer.factory"); } @@ -1035,7 +1039,7 @@ private: kind = FieldKind::ANY_POINTER; break; case schema::Type::AnyPointer::Unconstrained::STRUCT: - kind = FieldKind::STRUCT; + kind = FieldKind::ANY_POINTER; break; case schema::Type::AnyPointer::Unconstrained::LIST: kind = FieldKind::LIST; @@ -1967,14 +1971,14 @@ private: } if (resultProto.getIsGeneric()) { - auto resultFactoryArgs = getFactoryArguments(resultSchema, paramSchema); - resultFactory = resultFactoryArgs.size() == 0 - ? kj::str(shortResultType, ".factory") - : kj::strTree("newFactory(", - kj::StringTree(KJ_MAP(arg, resultFactoryArgs) { - return kj::strTree(arg); - }, ", "), - ")").flatten(); + auto resultFactoryArgs = getFactoryArguments(resultSchema, paramSchema); + resultFactory = resultFactoryArgs.size() == 0 + ? kj::str(shortResultType, ".factory") + : kj::strTree("newFactory(", + kj::StringTree(KJ_MAP(arg, resultFactoryArgs) { + return kj::strTree(arg); + }, ", "), + ")").flatten(); } auto paramBuilder = kj::str(shortParamType, ".Builder"); diff --git a/compiler/src/test/java/org/capnproto/EncodingTest.java b/compiler/src/test/java/org/capnproto/EncodingTest.java index f4c48a3..18b9344 100644 --- a/compiler/src/test/java/org/capnproto/EncodingTest.java +++ b/compiler/src/test/java/org/capnproto/EncodingTest.java @@ -1,5 +1,6 @@ package org.capnproto.test; +import org.capnproto.test.Test; import org.capnproto.*; import org.capnproto.Void; import org.junit.Assert; @@ -845,6 +846,13 @@ public class EncodingTest { TestUtil.checkTestMessage(listReader.get(1)); } + @org.junit.Test + public void testAnyStruct() { + MessageBuilder builder = new MessageBuilder(); + var root = builder.initRoot(Test.TestAnyOthers.factory); + var anyStruct = root.initAnyStructField(); + } + @org.junit.Test public void testCopyAnyPointer() { MessageBuilder message1 = new MessageBuilder(); diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index af2f92d..c0332cd 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -148,6 +148,12 @@ struct TestAnyPointer { # in the struct. } +struct TestAnyOthers { + anyStructField @0 :AnyStruct; + #anyListField @1 :AnyPointer; # not currently implemented + #capabilityField @2 :Capability; +} + struct TestOutOfOrder { foo @3 :Text; bar @2 :Text; diff --git a/runtime/src/main/java/org/capnproto/AnyStruct.java b/runtime/src/main/java/org/capnproto/AnyStruct.java new file mode 100644 index 0000000..0e7a4a3 --- /dev/null +++ b/runtime/src/main/java/org/capnproto/AnyStruct.java @@ -0,0 +1,56 @@ +package org.capnproto; + +public class AnyStruct { + + public static final org.capnproto.StructSize STRUCT_SIZE = new org.capnproto.StructSize((short)0,(short)0); + + public static final class Factory extends org.capnproto.StructFactory { + public Factory() { + } + public final Reader constructReader(org.capnproto.SegmentReader segment, int data,int pointers, int dataSize, short pointerCount, int nestingLimit) { + return new Reader(segment,data,pointers,dataSize,pointerCount,nestingLimit); + } + public final Builder constructBuilder(org.capnproto.SegmentBuilder segment, int data,int pointers, int dataSize, short pointerCount) { + return new Builder(segment, data, pointers, dataSize, pointerCount); + } + public final org.capnproto.StructSize structSize() { + return AnyStruct.STRUCT_SIZE; + } + public final Reader asReader(Builder builder) { + return builder.asReader(); + } + } + + public static final Factory factory = new Factory(); + + public static final org.capnproto.StructList.Factory listFactory = + new org.capnproto.StructList.Factory<>(factory); + + public static final class Builder extends org.capnproto.StructBuilder { + Builder(org.capnproto.SegmentBuilder segment, int data, int pointers,int dataSize, short pointerCount){ + super(segment, data, pointers, dataSize, pointerCount); + } + public final Reader asReader() { + return new Reader(segment, data, pointers, dataSize, pointerCount, 0x7fffffff); + } + + public final T initAs(StructBuilder.Factory factory) { + return factory.constructBuilder(this.segment, this.capTable, this.data, this.pointers, this.dataSize, this.pointerCount); + } + + public final T setAs(StructBuilder.Factory factory) { + return factory.constructBuilder(this.segment, this.capTable, this.data, this.pointers, this.dataSize, this.pointerCount); + } + + } + + public static final class Reader extends org.capnproto.StructReader { + Reader(org.capnproto.SegmentReader segment, int data, int pointers,int dataSize, short pointerCount, int nestingLimit){ + super(segment, data, pointers, dataSize, pointerCount, nestingLimit); + } + + public final T getAs(StructReader.Factory factory) { + return factory.constructReader(this.segment, this.capTable, this.data, this.pointers, this.dataSize, this.pointerCount, this.nestingLimit); + } + } +}