This commit is contained in:
David Renshaw 2014-10-28 14:28:49 -04:00
parent 6403f605aa
commit 252703ddfa
2 changed files with 45 additions and 14 deletions

View file

@ -224,6 +224,21 @@ private:
return kj::mv(result);
}
kj::Vector<kj::String> getTypeArguments(Schema leaf, Schema schema, kj::String suffix) {
auto node = schema.getProto();
kj::Vector<kj::String> result;
if (node.getScopeId() != 0) {
Schema parent = schemaLoader.get(node.getScopeId());
result = getTypeArguments(leaf, parent, kj::str(suffix));
}
auto brandArguments = leaf.getBrandArgumentsAtScope(node.getId());
auto parameters = node.getParameters();
for (int ii = 0; ii < parameters.size(); ++ii) {
result.add(typeName(brandArguments[ii], kj::str(suffix)).flatten());
}
return kj::mv(result);
}
kj::String toUpperCase(kj::StringPtr name) {
kj::Vector<char> result(name.size() + 4);
@ -271,8 +286,22 @@ private:
case schema::Type::DATA: return kj::strTree(" org.capnproto.Data", suffix);
case schema::Type::ENUM: return javaFullName(type.asEnum());
case schema::Type::STRUCT:
case schema::Type::STRUCT: {
auto structSchema = type.asStruct();
if (structSchema.getProto().getIsGeneric()) {
KJ_LOG(ERROR, suffix);
auto typeArgs = getTypeArguments(structSchema, structSchema, kj::str(suffix));
return kj::strTree(
javaFullName(structSchema), "<",
kj::StringTree(KJ_MAP(arg, typeArgs){
return kj::strTree(arg);
}, ", "),
">", suffix
);
} else {
return kj::strTree(javaFullName(type.asStruct()), suffix);
}
}
case schema::Type::INTERFACE:
return javaFullName(type.asInterface());
@ -753,6 +782,8 @@ private:
FieldKind kind = FieldKind::PRIMITIVE;
kj::String ownedType;
kj::String type = typeName(field.getType(), kj::str("")).flatten();
kj::String builderType = typeName(field.getType(), kj::str(".Builder")).flatten();
kj::String readerType = typeName(field.getType(), kj::str(".Reader")).flatten();
kj::StringPtr setterDefault; // only for void
kj::String defaultMask; // primitives only
size_t defaultOffset = 0; // pointers only: offset of the default value within the schema.
@ -996,7 +1027,7 @@ private:
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
spaces(indent), " }\n",
spaces(indent), " public ", type, ".Reader get", titleCase, "() {\n",
spaces(indent), " public ", readerType, " get", titleCase, "() {\n",
unionDiscrim.check,
spaces(indent), " return ",
"_getPointerField(", type, ".factory,", offset,",", defaultParams, ");\n",
@ -1004,7 +1035,7 @@ private:
kj::strTree(
kj::mv(unionDiscrim.builderIsDef),
spaces(indent), " public final ", type, ".Builder get", titleCase, "() {\n",
spaces(indent), " public final ", builderType, " get", titleCase, "() {\n",
unionDiscrim.check,
spaces(indent), " return ",
"_getPointerField(", type, ".factory, ", offset, ", ", defaultParams, ");\n",

View file

@ -324,7 +324,7 @@ struct TestNewVersion {
struct TestGenerics(Foo, Bar) {
foo @0 :Foo;
# rev @1 :TestGenerics(Bar, Foo);
# rev @1 :TestGenerics(Text, List(UInt8));
# struct Inner {
# foo @0 :Foo;