diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 2c93b73..3990c87 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -299,6 +299,7 @@ private: case schema::Type::DATA: return kj::strTree( "org.capnproto.DataList"); case schema::Type::ENUM: + return kj::strTree("org.capnproto.EnumList"); case schema::Type::INTERFACE: case schema::Type::ANY_POINTER: case schema::Type::LIST: @@ -632,8 +633,6 @@ private: struct FieldText { kj::StringTree readerMethodDecls; kj::StringTree builderMethodDecls; - kj::StringTree pipelineMethodDecls; - kj::StringTree inlineMethodDefs; }; enum class FieldKind { @@ -709,10 +708,7 @@ private: }, " return new ", scope, titleCase, ".Builder(_builder);\n", spaces(indent), " }\n", - "\n"), - - kj::strTree(), - kj::strTree() + "\n") }; } } @@ -866,10 +862,7 @@ private: kj::strTree(spaces(indent), " _builder.set", toTitleCase(type), "Field(", offset, ", value", defaultMaskParam, ");\n"))), spaces(indent), " }\n", - "\n"), - - kj::strTree(), - kj::strTree(), + "\n") }; } else if (kind == FieldKind::INTERFACE) { @@ -910,9 +903,6 @@ private: spaces(indent), " return result;\n", spaces(indent), " }\n", "\n"), - - kj::strTree(), - kj::strTree() }; } else if (kind == FieldKind::STRUCT) { @@ -948,9 +938,6 @@ private: type, ".factory.fromStructBuilder(_builder.getPointerField(", offset, ").initStruct(", type, ".STRUCT_SIZE", "));\n", spaces(indent), " }\n"), - - kj::strTree(), - kj::strTree() }; } else if (kind == FieldKind::BLOB && typeBody.which() == schema::Type::TEXT ) { @@ -994,9 +981,6 @@ private: spaces(indent), " public final ", type, ".Builder init", titleCase, "(int size) {\n", spaces(indent), " throw new Error();\n", spaces(indent), " }\n"), - - kj::strTree(), - kj::strTree() }; } else if (kind == FieldKind::BLOB && typeBody.which() == schema::Type::DATA ) { @@ -1033,9 +1017,6 @@ private: spaces(indent), " public final ", type, ".Builder init", titleCase, "(int size) {\n", spaces(indent), " throw new Error();\n", spaces(indent), " }\n"), - - kj::strTree(), - kj::strTree() }; } else if (kind == FieldKind::LIST) { @@ -1097,6 +1078,12 @@ private: case schema::Type::ENUM: primitiveElement = true; fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES"); + elementReaderType = kj::str(typeName(typeBody.getList().getElementType())); + readerClass = kj::str("Reader<", elementReaderType, ">"); + elementBuilderType = kj::str(typeName(typeBody.getList().getElementType())); + builderClass = kj::str("Builder<", elementBuilderType, ">"); + readerFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".values(), "); + builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".values(), "); break; case schema::Type::TEXT: @@ -1183,59 +1170,6 @@ private: kj::strTree("List(", fieldSize, ", size)")), ");\n", spaces(indent), " }\n"), - - kj::strTree( - kind == FieldKind::STRUCT && !hasDiscriminantValue(proto) - ? kj::strTree( - " inline ", type, "::Pipeline get", titleCase, "();\n") - : kj::strTree()), - - kj::strTree( - kj::mv(unionDiscrim.isDefs), - kind == FieldKind::STRUCT && !hasDiscriminantValue(proto) - ? kj::strTree( - "inline ", type, "::Pipeline ", scope, "Pipeline::get", titleCase, "() {\n", - " return ", type, "::Pipeline(_typeless.getPointerField(", offset, "));\n" - "}\n") - : kj::strTree(), - "inline void ", scope, "Builder::set", titleCase, "(", type, "::Reader value) {\n", - unionDiscrim.set, - " ::capnp::_::PointerHelpers<", type, ">::set(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS), value);\n" - "}\n", - kind == FieldKind::LIST && !isStructOrCapList - ? kj::strTree( - "inline void ", scope, "Builder::set", titleCase, "(::kj::ArrayPtr value) {\n", - unionDiscrim.set, - " ::capnp::_::PointerHelpers<", type, ">::set(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS), value);\n" - "}\n") - : kj::strTree(), - kind == FieldKind::STRUCT - ? kj::strTree( - "inline ", type, "::Builder ", scope, "Builder::init", titleCase, "() {\n", - unionDiscrim.set, - " return ::capnp::_::PointerHelpers<", type, ">::init(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS));\n" - "}\n") - : kj::strTree( - "inline ", type, "::Builder ", scope, "Builder::init", titleCase, "(unsigned int size) {\n", - unionDiscrim.set, - " return ::capnp::_::PointerHelpers<", type, ">::init(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS), size);\n" - "}\n"), - "inline void ", scope, "Builder::adopt", titleCase, "(\n" - " ::capnp::Orphan<", type, ">&& value) {\n", - unionDiscrim.set, - " ::capnp::_::PointerHelpers<", type, ">::adopt(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS), kj::mv(value));\n" - "}\n" - "inline ::capnp::Orphan<", type, "> ", scope, "Builder::disown", titleCase, "() {\n", - unionDiscrim.check, - " return ::capnp::_::PointerHelpers<", type, ">::disown(\n" - " _builder.getPointerField(", offset, " * ::capnp::POINTERS));\n" - "}\n" - "\n") }; } else { KJ_UNREACHABLE; diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala index 8d9be76..82b98f5 100644 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ b/compiler/src/test/scala/org/capnproto/TestUtil.scala @@ -1,7 +1,9 @@ package org.capnproto; +import org.scalatest.Matchers._; import org.capnproto.test.Test._; + object TestUtil { def data(str : String) : Array[Byte] = { @@ -26,7 +28,7 @@ object TestUtil { builder.setFloat32Field(1234.5f); builder.setFloat64Field(-123e45); builder.setTextField("foo"); -// builder.setDataField(data("bar")); + //builder.setDataField(data("bar")); { val subBuilder = builder.initStructField(); @@ -76,6 +78,11 @@ object TestUtil { structList.get(1).setTextField(new Text.Reader("structlist 2")); structList.get(2).setTextField(new Text.Reader("structlist 3")); + + val enumList = builder.initEnumList(2); + enumList.set(0, TestEnum.FOO); + enumList.set(1, TestEnum.GARPLY); + } @@ -143,6 +150,9 @@ object TestUtil { assert(structList.get(2).getTextField().toString() == "structlist 3") */ + val enumList = builder.getEnumList(); + (enumList.get(0)) should equal (TestEnum.FOO); + (enumList.get(1)) should equal (TestEnum.GARPLY); } def checkTestMessage(reader : TestAllTypes.Reader) { @@ -208,6 +218,10 @@ object TestUtil { assert(structList.get(1).getTextField().toString() == "structlist 2") assert(structList.get(2).getTextField().toString() == "structlist 3") + val enumList = reader.getEnumList(); + (enumList.get(0)) should equal (TestEnum.FOO); + (enumList.get(1)) should equal (TestEnum.GARPLY); + } def checkDefaultMessage(builder : TestDefaults.Builder) { diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index 72c6ec0..fae2c21 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -49,7 +49,7 @@ struct TestAllTypes { textList @29 : List(Text); dataList @30 : List(Data); structList @31 : List(TestAllTypes); -# enumList @32 : List(TestEnum); + enumList @32 : List(TestEnum); # interfaceList @33 : List(Void); } diff --git a/runtime/src/main/java/org/capnproto/EnumList.java b/runtime/src/main/java/org/capnproto/EnumList.java index cdcfe96..61fb7fc 100644 --- a/runtime/src/main/java/org/capnproto/EnumList.java +++ b/runtime/src/main/java/org/capnproto/EnumList.java @@ -9,11 +9,11 @@ public class EnumList { return values[index]; } - public static final class Reader { + public static final class Reader { public final ListReader reader; public final T values[]; - public Reader(ListReader reader, T values[]) { + public Reader(T values[], ListReader reader) { this.reader = reader; this.values = values; } @@ -25,10 +25,27 @@ public class EnumList { public T get(int index) { return clampOrdinal(this.values, this.reader.getShortElement(index)); } - } - public static final class Builder { + public static final class Builder { + public final ListBuilder builder; + public final T values[]; + public Builder(T values[], ListBuilder builder) { + this.builder = builder; + this.values = values; + } + + public int size() { + return this.builder.size(); + } + + public T get(int index) { + return clampOrdinal(this.values, this.builder.getShortElement(index)); + } + + public void set(int index, T value) { + this.builder.setShortElement(index, (short)value.ordinal()); + } } }