From fcad26acb6668833826f313dd5d1b446c1895abc Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sat, 4 Oct 2014 14:43:50 -0400 Subject: [PATCH] makeListListFactoryArg --- compiler/src/main/cpp/capnpc-java.c++ | 27 +++++++++++++++++++++------ compiler/src/test/schema/test.capnp | 4 ++-- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index cf77ba6..4f1a424 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -659,6 +659,25 @@ private: ); } + kj::String makeListListFactoryArg(schema::Type::Reader type) { + auto elementType = type.getList().getElementType(); + switch (elementType.which()) { + case schema::Type::STRUCT: + return kj::str("new org.capnproto.StructList.Factory(", + typeName(elementType), ".factory), "); + case schema::Type::LIST: + return kj::str("new org.capnproto.ListList.Factory(", + makeListListFactoryArg(elementType), + "), "); + case schema::Type::ENUM: + return kj::str("new org.capnproto.EnumList.Factory(", + typeName(elementType), + ".values()), "); + default: + return kj::str(typeName(type), ".factory, "); + } + } + FieldText makeFieldText(kj::StringPtr scope, StructSchema::Field field, int indent) { auto proto = field.getProto(); kj::String titleCase = toTitleCase(proto.getName()); @@ -1070,8 +1089,8 @@ private: readerClass = kj::str("Reader<", elementReaderType, ">"); elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()), ".Builder"); builderClass = kj::str("Builder<", elementBuilderType, ">"); - readerFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".factory, "); - builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".factory, "); + readerFactoryArg = makeListListFactoryArg(typeBody.getList().getElementType()); + builderFactoryArg = kj::str(readerFactoryArg); break; case schema::Type::ANY_POINTER: primitiveElement = false; @@ -1096,10 +1115,6 @@ private: fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding"); break; } - if (primitiveElement) { - elementReaderType = kj::str(typeName(typeBody.getList().getElementType())); - elementBuilderType = kj::str(typeName(typeBody.getList().getElementType())); - } } diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index c88da97..c0ce5c9 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -223,8 +223,8 @@ struct TestLists { listP @6 :List(StructP); int32ListList @7 :List(List(Int32)); - #textListList @8 :List(List(Text)); - #structListList @9 :List(List(TestAllTypes)); + textListList @8 :List(List(Text)); + structListList @9 :List(List(TestAllTypes)); #boolListListList @10 :List(List(List(Bool))); #enumListList @11 :List(List(TestEnum)); }