get codegen working on GenericMap example
This commit is contained in:
parent
1c8e132b9b
commit
7da1dc8159
3 changed files with 149 additions and 15 deletions
|
@ -1186,8 +1186,17 @@ private:
|
|||
kj::String defaultParams = defaultOffset == 0 ? kj::str("null, 0") : kj::str(
|
||||
"Schemas.b_", kj::hex(typeId), ", ", defaultOffset);
|
||||
|
||||
auto typeParamVec = getTypeParameters(field.getContainingStruct());
|
||||
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 {
|
||||
kj::strTree(
|
||||
kj::mv(unionDiscrim.readerIsDef),
|
||||
|
@ -1195,10 +1204,28 @@ private:
|
|||
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\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, "_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",
|
||||
spaces(indent), " }\n"
|
||||
)
|
||||
),
|
||||
"\n"),
|
||||
|
||||
kj::strTree(
|
||||
|
@ -1207,19 +1234,75 @@ private:
|
|||
spaces(indent), " return !_pointerFieldIsNull(", offset, ");\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,
|
||||
" 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",
|
||||
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",
|
||||
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), " }\n")
|
||||
)
|
||||
),
|
||||
|
||||
|
||||
};
|
||||
} else {
|
||||
KJ_UNREACHABLE;
|
||||
|
|
|
@ -609,6 +609,47 @@ class EncodingSuite extends FunSuite {
|
|||
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:
|
||||
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
|
||||
// message)
|
||||
|
|
|
@ -377,6 +377,16 @@ struct TestUseGenerics {
|
|||
listOfGenerics @11 :List(TestGenerics(TestAllTypes, Text));
|
||||
}
|
||||
|
||||
struct GenericMap(K, V)
|
||||
{
|
||||
entries @0 :List(Entry);
|
||||
|
||||
struct Entry
|
||||
{
|
||||
key @0 :K;
|
||||
value @1 :V;
|
||||
}
|
||||
}
|
||||
|
||||
struct TestEmptyStruct {}
|
||||
|
||||
|
|
Loading…
Reference in a new issue