diff --git a/compiler/src/main/cpp/capnpc-java.c++ b/compiler/src/main/cpp/capnpc-java.c++ index 8eee711..18abae2 100644 --- a/compiler/src/main/cpp/capnpc-java.c++ +++ b/compiler/src/main/cpp/capnpc-java.c++ @@ -298,8 +298,8 @@ private: case schema::Type::FLOAT32: return kj::strTree("float"); case schema::Type::FLOAT64: return kj::strTree("double"); - case schema::Type::TEXT: return kj::strTree(" org.capnproto.Text.", suffix); - case schema::Type::DATA: return kj::strTree(" org.capnproto.Data.", suffix); + case schema::Type::TEXT: return kj::strTree("org.capnproto.Text.", suffix); + case schema::Type::DATA: return kj::strTree("org.capnproto.Data.", suffix); case schema::Type::ENUM: return javaFullName(type.asEnum()); case schema::Type::STRUCT: { @@ -758,8 +758,25 @@ private: auto elementType = type.asList().getElementType(); switch (elementType.which()) { case schema::Type::STRUCT: { - // XXX - return kj::str(typeName(elementType, kj::str("listFactory"))); + auto elementStructSchema = elementType.asStruct(); + auto elementNode = elementStructSchema.getProto(); + if (elementNode.getIsGeneric()) { + auto factoryArgs = getFactoryArguments(elementStructSchema, elementStructSchema); + return kj::strTree( + "new org.capnproto.StructList.Factory<", + typeName(elementType, kj::str("Builder")), ", ", + typeName(elementType, kj::str("Reader")), + ">(", + javaFullName(elementStructSchema), ".newFactory(", + kj::StringTree( + KJ_MAP(arg, factoryArgs) { + return kj::strTree(arg); + }, ","), + "))" + ).flatten(); + } else { + return kj::str(typeName(elementType, kj::str("listFactory"))); + } } case schema::Type::LIST: return kj::str("new org.capnproto.ListList.Factory<", diff --git a/compiler/src/test/schema/test.capnp b/compiler/src/test/schema/test.capnp index ffcf671..b8ebc1f 100644 --- a/compiler/src/test/schema/test.capnp +++ b/compiler/src/test/schema/test.capnp @@ -373,6 +373,8 @@ struct TestUseGenerics { (value = (foo = "text", rev = (foo = (int16Field = 321)))); defaultWrapper2 @10 :TestGenericsWrapper2 = (value = (value = (foo = "text", rev = (foo = (int16Field = 321))))); + + listOfGenerics @11 :List(TestGenerics(TestAllTypes, Text)); }