get codegen working on GenericMap example

This commit is contained in:
David Renshaw 2016-09-19 14:59:20 -04:00
parent 1c8e132b9b
commit 7da1dc8159
3 changed files with 149 additions and 15 deletions

View file

@ -1186,8 +1186,17 @@ private:
kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str( kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str(
"Schemas.b_", kj::hex(typeId), ", ", defaultOffset); "Schemas.b_", kj::hex(typeId), ", ", defaultOffset);
auto typeParamVec = getTypeParameters(field.getContainingStruct());
kj::String listFactory = makeFactoryArg(field.getType()); kj::String listFactory = makeFactoryArg(field.getType());
bool isGeneric = false;
{
auto type = field.getType().asList().getElementType();
if (type.isStruct()) {
isGeneric = type.asStruct().getProto().getIsGeneric();
}
}
return FieldText { return FieldText {
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.readerIsDef), kj::mv(unionDiscrim.readerIsDef),
@ -1195,10 +1204,28 @@ private:
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", readerType, (isGeneric ?
" get", titleCase, "() {\n", kj::strTree(
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n", spaces(indent), " public final ",
spaces(indent), " }\n", (typeParamVec.size() == 0 ? kj::strTree() :
kj::strTree(
"<",
kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p, "_Builder");
}, ", "),
"> ")),
readerType,
" get", titleCase, "( org.capnproto.ListFactory<", builderType, ", ", readerType, "> factory) {\n",
spaces(indent), " return _getPointerField(factory,", offset, ");\n",
spaces(indent), " }\n"
) :
kj::strTree(
spaces(indent), " public final ", readerType,
" get", titleCase, "() {\n",
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
spaces(indent), " }\n"
)
),
"\n"), "\n"),
kj::strTree( kj::strTree(
@ -1207,19 +1234,75 @@ private:
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n", spaces(indent), " return !_pointerFieldIsNull(", offset, ");\n",
spaces(indent), " }\n", spaces(indent), " }\n",
spaces(indent), " public final ", builderType, (isGeneric ?
" get", titleCase, "() {\n", kj::strTree(
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n", spaces(indent), " public final ",
spaces(indent), " }\n", (typeParamVec.size() == 0 ? kj::strTree() :
kj::strTree(
"<",
kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p, "_Reader");
}, ", "),
"> ")),
builderType,
" get", titleCase, "( org.capnproto.ListFactory<", builderType, ", ", readerType, "> factory) {\n",
spaces(indent), " return _getPointerField(factory,", offset, ");\n",
spaces(indent), " }\n"
) :
kj::strTree(
spaces(indent), " public final ", builderType,
" get", titleCase, "() {\n",
spaces(indent), " return _getPointerField(", listFactory, ", ", offset, ", ", defaultParams, ");\n",
spaces(indent), " }\n"
)
),
(isGeneric ?
kj::strTree(
spaces(indent), " public final ",
(typeParamVec.size() == 0 ? kj::strTree() :
kj::strTree(
"<",
kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p, "_Reader");
}, ", "),
"> ")),
"void set", titleCase,
"(org.capnproto.SetPointerBuilder<", builderType, ", ", readerType, "> factory, ", readerType, " value) {\n",
spaces(indent), " _setPointerField(factory, ", offset, ", value);\n",
spaces(indent), " }\n"
) :
kj::strTree(
spaces(indent), " public final void set", titleCase, "(", readerType, " value) {\n",
spaces(indent), " _setPointerField(", listFactory, ", ", offset, ", value);\n",
spaces(indent), " }\n"
)
),
(isGeneric ?
kj::strTree(
spaces(indent), " public final ",
(typeParamVec.size() == 0 ? kj::strTree() :
kj::strTree(
"<",
kj::StringTree(KJ_MAP(p, typeParamVec) {
return kj::strTree(p, "_Reader");
}, ", "),
"> ")),
builderType,
" init", titleCase, "( org.capnproto.ListFactory<", builderType, ", ", readerType, "> factory, int size) {\n",
spaces(indent), " return _initPointerField(factory, ", offset, ", size);\n",
spaces(indent), " }\n"
) :
kj::strTree(
spaces(indent), " public final ", builderType,
" init", titleCase, "(int size) {\n",
spaces(indent), " return _initPointerField(", listFactory, ", ", offset, ", size);\n",
spaces(indent), " }\n")
)
),
spaces(indent), " public final void set", titleCase, "(", readerType, " value) {\n",
spaces(indent), " _setPointerField(", listFactory, ", ", offset, ", value);\n",
spaces(indent), " }\n",
spaces(indent), " public final ", builderType,
" init", titleCase, "(int size) {\n",
spaces(indent), " return _initPointerField(", listFactory, ", ", offset, ", size);\n",
spaces(indent), " }\n"),
}; };
} else { } else {
KJ_UNREACHABLE; KJ_UNREACHABLE;

View file

@ -609,6 +609,47 @@ class EncodingSuite extends FunSuite {
TestUtil.checkTestMessage(field.asReader()) TestUtil.checkTestMessage(field.asReader())
} }
test("GenericMap") {
val builder = new MessageBuilder()
val mapFactory = new GenericMap.Factory(Text.factory, TestAllTypes.factory)
val entryFactory = new StructList.Factory(new GenericMap.Entry.Factory(Text.factory, TestAllTypes.factory));
val root = builder.initRoot(mapFactory)
{
val entries = root.initEntries(entryFactory, 3);
val entry0 = entries.get(0)
entry0.setKey(Text.factory, new Text.Reader("foo"))
val value0 = entry0.initValue()
value0.setInt64Field(101);
val entry1 = entries.get(1)
entry1.setKey(Text.factory, new Text.Reader("bar"))
val value1 = entry1.initValue()
value1.setInt64Field(202);
val entry2 = entries.get(2)
entry2.setKey(Text.factory, new Text.Reader("baz"))
val value2 = entry2.initValue()
value2.setInt64Field(303);
}
{
val entries = root.asReader(mapFactory).getEntries(entryFactory)
val entry0 = entries.get(0)
assert(entry0.getKey().toString() == "foo")
assert(entry0.getValue().getInt64Field() == 101)
val entry1 = entries.get(1)
assert(entry1.getKey().toString() == "bar")
assert(entry1.getValue().getInt64Field() == 202)
val entry2 = entries.get(2)
assert(entry2.getKey().toString() == "baz")
assert(entry2.getValue().getInt64Field == 303)
}
}
// to debug, do this: // to debug, do this:
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(), //Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
// message) // message)

View file

@ -377,6 +377,16 @@ struct TestUseGenerics {
listOfGenerics @11 :List(TestGenerics(TestAllTypes, Text)); listOfGenerics @11 :List(TestGenerics(TestAllTypes, Text));
} }
struct GenericMap(K, V)
{
entries @0 :List(Entry);
struct Entry
{
key @0 :K;
value @1 :V;
}
}
struct TestEmptyStruct {} struct TestEmptyStruct {}