nested lists now at least typecheck
This commit is contained in:
parent
fcad26acb6
commit
ddcd478567
2 changed files with 55 additions and 50 deletions
|
@ -242,7 +242,7 @@ private:
|
||||||
return kj::mv(result);
|
return kj::mv(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
kj::StringTree typeName(schema::Type::Reader type) {
|
kj::StringTree typeName(schema::Type::Reader type, kj::String suffix = nullptr) {
|
||||||
switch (type.which()) {
|
switch (type.which()) {
|
||||||
case schema::Type::VOID: return kj::strTree("org.capnproto.Void");
|
case schema::Type::VOID: return kj::strTree("org.capnproto.Void");
|
||||||
|
|
||||||
|
@ -258,13 +258,13 @@ private:
|
||||||
case schema::Type::FLOAT32: return kj::strTree("float");
|
case schema::Type::FLOAT32: return kj::strTree("float");
|
||||||
case schema::Type::FLOAT64: return kj::strTree("double");
|
case schema::Type::FLOAT64: return kj::strTree("double");
|
||||||
|
|
||||||
case schema::Type::TEXT: return kj::strTree(" org.capnproto.Text");
|
case schema::Type::TEXT: return kj::strTree(" org.capnproto.Text", suffix);
|
||||||
case schema::Type::DATA: return kj::strTree(" org.capnproto.Data");
|
case schema::Type::DATA: return kj::strTree(" org.capnproto.Data", suffix);
|
||||||
|
|
||||||
case schema::Type::ENUM:
|
case schema::Type::ENUM:
|
||||||
return javaFullName(schemaLoader.get(type.getEnum().getTypeId()));
|
return javaFullName(schemaLoader.get(type.getEnum().getTypeId()));
|
||||||
case schema::Type::STRUCT:
|
case schema::Type::STRUCT:
|
||||||
return javaFullName(schemaLoader.get(type.getStruct().getTypeId()));
|
return kj::strTree(javaFullName(schemaLoader.get(type.getStruct().getTypeId())), suffix);
|
||||||
case schema::Type::INTERFACE:
|
case schema::Type::INTERFACE:
|
||||||
return javaFullName(schemaLoader.get(type.getInterface().getTypeId()));
|
return javaFullName(schemaLoader.get(type.getInterface().getTypeId()));
|
||||||
|
|
||||||
|
@ -273,35 +273,44 @@ private:
|
||||||
auto elementType = type.getList().getElementType();
|
auto elementType = type.getList().getElementType();
|
||||||
switch (elementType.which()) {
|
switch (elementType.which()) {
|
||||||
case schema::Type::VOID:
|
case schema::Type::VOID:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Void");
|
return kj::strTree(" org.capnproto.PrimitiveList.Void", suffix);
|
||||||
case schema::Type::BOOL:
|
case schema::Type::BOOL:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Boolean");
|
return kj::strTree(" org.capnproto.PrimitiveList.Boolean", suffix);
|
||||||
case schema::Type::INT8:
|
case schema::Type::INT8:
|
||||||
case schema::Type::UINT8:
|
case schema::Type::UINT8:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Byte");
|
return kj::strTree(" org.capnproto.PrimitiveList.Byte", suffix);
|
||||||
case schema::Type::INT16:
|
case schema::Type::INT16:
|
||||||
case schema::Type::UINT16:
|
case schema::Type::UINT16:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Short");
|
return kj::strTree(" org.capnproto.PrimitiveList.Short", suffix);
|
||||||
case schema::Type::INT32:
|
case schema::Type::INT32:
|
||||||
case schema::Type::UINT32:
|
case schema::Type::UINT32:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Int");
|
return kj::strTree(" org.capnproto.PrimitiveList.Int", suffix);
|
||||||
case schema::Type::INT64:
|
case schema::Type::INT64:
|
||||||
case schema::Type::UINT64:
|
case schema::Type::UINT64:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Long");
|
return kj::strTree(" org.capnproto.PrimitiveList.Long", suffix);
|
||||||
case schema::Type::FLOAT32:
|
case schema::Type::FLOAT32:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Float");
|
return kj::strTree(" org.capnproto.PrimitiveList.Float", suffix);
|
||||||
case schema::Type::FLOAT64:
|
case schema::Type::FLOAT64:
|
||||||
return kj::strTree(" org.capnproto.PrimitiveList.Double");
|
return kj::strTree(" org.capnproto.PrimitiveList.Double", suffix);
|
||||||
case schema::Type::STRUCT:
|
case schema::Type::STRUCT:
|
||||||
return kj::strTree(" org.capnproto.StructList");
|
{
|
||||||
|
auto inner = typeName(elementType, kj::str(suffix));
|
||||||
|
return kj::strTree(" org.capnproto.StructList", suffix, "<", kj::mv(inner), ">");
|
||||||
|
}
|
||||||
case schema::Type::TEXT:
|
case schema::Type::TEXT:
|
||||||
return kj::strTree( "org.capnproto.TextList");
|
return kj::strTree( "org.capnproto.TextList", suffix);
|
||||||
case schema::Type::DATA:
|
case schema::Type::DATA:
|
||||||
return kj::strTree( "org.capnproto.DataList");
|
return kj::strTree( "org.capnproto.DataList", suffix);
|
||||||
case schema::Type::ENUM:
|
case schema::Type::ENUM:
|
||||||
return kj::strTree("org.capnproto.EnumList");
|
{
|
||||||
|
auto inner = typeName(elementType, kj::str(suffix));
|
||||||
|
return kj::strTree("org.capnproto.EnumList", suffix, "<", kj::mv(inner), ">");
|
||||||
|
}
|
||||||
case schema::Type::LIST:
|
case schema::Type::LIST:
|
||||||
return kj::strTree("org.capnproto.ListList");
|
{
|
||||||
|
auto inner = typeName(elementType, kj::str(suffix));
|
||||||
|
return kj::strTree("org.capnproto.ListList", suffix, "<", kj::mv(inner), ">");
|
||||||
|
}
|
||||||
case schema::Type::INTERFACE:
|
case schema::Type::INTERFACE:
|
||||||
case schema::Type::ANY_POINTER:
|
case schema::Type::ANY_POINTER:
|
||||||
KJ_FAIL_REQUIRE("unimplemented");
|
KJ_FAIL_REQUIRE("unimplemented");
|
||||||
|
@ -663,18 +672,23 @@ private:
|
||||||
auto elementType = type.getList().getElementType();
|
auto elementType = type.getList().getElementType();
|
||||||
switch (elementType.which()) {
|
switch (elementType.which()) {
|
||||||
case schema::Type::STRUCT:
|
case schema::Type::STRUCT:
|
||||||
return kj::str("new org.capnproto.StructList.Factory(",
|
return kj::str("new org.capnproto.StructList.Factory<",
|
||||||
typeName(elementType), ".factory), ");
|
typeName(elementType, kj::str(".Builder")),", ",
|
||||||
|
typeName(elementType, kj::str(".Reader")), ">(",
|
||||||
|
typeName(elementType, kj::str("")), ".factory)");
|
||||||
case schema::Type::LIST:
|
case schema::Type::LIST:
|
||||||
return kj::str("new org.capnproto.ListList.Factory(",
|
return kj::str("new org.capnproto.ListList.Factory<",
|
||||||
|
typeName(elementType, kj::str(".Builder")),", ",
|
||||||
|
typeName(elementType, kj::str(".Reader")), ">(",
|
||||||
makeListListFactoryArg(elementType),
|
makeListListFactoryArg(elementType),
|
||||||
"), ");
|
")");
|
||||||
case schema::Type::ENUM:
|
case schema::Type::ENUM:
|
||||||
return kj::str("new org.capnproto.EnumList.Factory(",
|
return kj::str("new org.capnproto.EnumList.Factory<",
|
||||||
typeName(elementType),
|
typeName(elementType), ">(",
|
||||||
".values()), ");
|
typeName(elementType, kj::str("")),
|
||||||
|
".values())");
|
||||||
default:
|
default:
|
||||||
return kj::str(typeName(type), ".factory, ");
|
return kj::str(typeName(type, kj::str("")), ".factory");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -737,7 +751,7 @@ private:
|
||||||
|
|
||||||
FieldKind kind = FieldKind::PRIMITIVE;
|
FieldKind kind = FieldKind::PRIMITIVE;
|
||||||
kj::String ownedType;
|
kj::String ownedType;
|
||||||
kj::String type = typeName(slot.getType()).flatten();
|
kj::String type = typeName(slot.getType(), kj::str("")).flatten();
|
||||||
kj::StringPtr setterDefault; // only for void
|
kj::StringPtr setterDefault; // only for void
|
||||||
kj::String defaultMask; // primitives only
|
kj::String defaultMask; // primitives only
|
||||||
size_t defaultOffset = 0; // pointers only: offset of the default value within the schema.
|
size_t defaultOffset = 0; // pointers only: offset of the default value within the schema.
|
||||||
|
@ -1019,8 +1033,9 @@ private:
|
||||||
kj::String builderFactoryArg = kj::str("");
|
kj::String builderFactoryArg = kj::str("");
|
||||||
kj::String readerFactoryArg = kj::str("");
|
kj::String readerFactoryArg = kj::str("");
|
||||||
kj::String fieldSize;
|
kj::String fieldSize;
|
||||||
kj::String readerClass = kj::str("Reader");
|
kj::String readerClass = kj::str(typeName(typeBody, kj::str(".Reader")));
|
||||||
kj::String builderClass = kj::str("Builder");
|
kj::String builderClass = kj::str(typeName(typeBody, kj::str(".Builder")));
|
||||||
|
|
||||||
bool isStructOrCapList = false;
|
bool isStructOrCapList = false;
|
||||||
bool isStructList = false;
|
bool isStructList = false;
|
||||||
if (kind == FieldKind::LIST) {
|
if (kind == FieldKind::LIST) {
|
||||||
|
@ -1066,12 +1081,8 @@ private:
|
||||||
case schema::Type::ENUM:
|
case schema::Type::ENUM:
|
||||||
primitiveElement = true;
|
primitiveElement = true;
|
||||||
fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES");
|
fieldSize = kj::str("org.capnproto.FieldSize.TWO_BYTES");
|
||||||
elementReaderType = kj::str(typeName(typeBody.getList().getElementType()));
|
readerFactoryArg = kj::str(typeName(typeBody.getList().getElementType(), kj::str("")), ".values(), ");
|
||||||
readerClass = kj::str("Reader<", elementReaderType, ">");
|
builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType(), nullptr), ".values(), ");
|
||||||
elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()));
|
|
||||||
builderClass = kj::str("Builder<", elementBuilderType, ">");
|
|
||||||
readerFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".values(), ");
|
|
||||||
builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".values(), ");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case schema::Type::TEXT:
|
case schema::Type::TEXT:
|
||||||
|
@ -1086,10 +1097,8 @@ private:
|
||||||
primitiveElement = false;
|
primitiveElement = false;
|
||||||
fieldSize = kj::str("org.capnproto.FieldSize.POINTER");
|
fieldSize = kj::str("org.capnproto.FieldSize.POINTER");
|
||||||
elementReaderType = kj::str(typeName(typeBody.getList().getElementType()), ".Reader");
|
elementReaderType = kj::str(typeName(typeBody.getList().getElementType()), ".Reader");
|
||||||
readerClass = kj::str("Reader<", elementReaderType, ">");
|
|
||||||
elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()), ".Builder");
|
elementBuilderType = kj::str(typeName(typeBody.getList().getElementType()), ".Builder");
|
||||||
builderClass = kj::str("Builder<", elementBuilderType, ">");
|
readerFactoryArg = kj::str(makeListListFactoryArg(typeBody.getList().getElementType()), ", ");
|
||||||
readerFactoryArg = makeListListFactoryArg(typeBody.getList().getElementType());
|
|
||||||
builderFactoryArg = kj::str(readerFactoryArg);
|
builderFactoryArg = kj::str(readerFactoryArg);
|
||||||
break;
|
break;
|
||||||
case schema::Type::ANY_POINTER:
|
case schema::Type::ANY_POINTER:
|
||||||
|
@ -1106,10 +1115,6 @@ private:
|
||||||
isStructList = true;
|
isStructList = true;
|
||||||
isStructOrCapList = true;
|
isStructOrCapList = true;
|
||||||
primitiveElement = false;
|
primitiveElement = false;
|
||||||
elementReaderType = kj::str(typeName(typeBody.getList().getElementType()), ".Reader");
|
|
||||||
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, ");
|
readerFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".factory, ");
|
||||||
builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".factory, ");
|
builderFactoryArg = kj::str(typeName(typeBody.getList().getElementType()), ".factory, ");
|
||||||
fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding");
|
fieldSize = kj::str(typeName(typeBody.getList().getElementType()),".STRUCT_SIZE.preferredListEncoding");
|
||||||
|
@ -1125,9 +1130,9 @@ private:
|
||||||
spaces(indent), " return !_reader.getPointerField(", offset, ").isNull();\n",
|
spaces(indent), " return !_reader.getPointerField(", offset, ").isNull();\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final ", type, ".", readerClass,
|
spaces(indent), " public final ", readerClass,
|
||||||
" get", titleCase, "() {\n",
|
" get", titleCase, "() {\n",
|
||||||
spaces(indent), " return new ", type, ".", readerClass, "(\n",
|
spaces(indent), " return new ", readerClass, "(\n",
|
||||||
spaces(indent), " ", readerFactoryArg, "_reader.getPointerField(", offset, ").getList(",
|
spaces(indent), " ", readerFactoryArg, "_reader.getPointerField(", offset, ").getList(",
|
||||||
fieldSize, ")",
|
fieldSize, ")",
|
||||||
");\n",
|
");\n",
|
||||||
|
@ -1140,9 +1145,9 @@ private:
|
||||||
spaces(indent), " return !_builder.getPointerField(", offset, ").isNull();\n",
|
spaces(indent), " return !_builder.getPointerField(", offset, ").isNull();\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final ", type, ".", builderClass,
|
spaces(indent), " public final ", builderClass,
|
||||||
" get", titleCase, "() {\n",
|
" get", titleCase, "() {\n",
|
||||||
spaces(indent), " return new ", type, ".", builderClass, " (\n",
|
spaces(indent), " return new ", builderClass, " (\n",
|
||||||
spaces(indent), " ", builderFactoryArg, "_builder.getPointerField(", offset, ").get",
|
spaces(indent), " ", builderFactoryArg, "_builder.getPointerField(", offset, ").get",
|
||||||
(isStructList ?
|
(isStructList ?
|
||||||
kj::strTree("StructList(", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)") :
|
kj::strTree("StructList(", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)") :
|
||||||
|
@ -1150,13 +1155,13 @@ private:
|
||||||
");\n",
|
");\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final void set", titleCase, "(", type, ".Reader value) {\n",
|
spaces(indent), " public final void set", titleCase, "(", readerClass, " value) {\n",
|
||||||
spaces(indent), " throw new Error();\n",
|
spaces(indent), " throw new Error();\n",
|
||||||
spaces(indent), " }\n",
|
spaces(indent), " }\n",
|
||||||
|
|
||||||
spaces(indent), " public final ", type, ".", builderClass,
|
spaces(indent), " public final ", builderClass,
|
||||||
" init", titleCase, "(int size) {\n",
|
" init", titleCase, "(int size) {\n",
|
||||||
spaces(indent), " return new ", type, ".", builderClass, "(\n",
|
spaces(indent), " return new ", builderClass, "(\n",
|
||||||
spaces(indent), " ", builderFactoryArg, "_builder.getPointerField(", offset, ").init",
|
spaces(indent), " ", builderFactoryArg, "_builder.getPointerField(", offset, ").init",
|
||||||
(isStructList ?
|
(isStructList ?
|
||||||
kj::strTree("StructList(size,", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)") :
|
kj::strTree("StructList(size,", typeName(typeBody.getList().getElementType()),".STRUCT_SIZE)") :
|
||||||
|
|
|
@ -225,8 +225,8 @@ struct TestLists {
|
||||||
int32ListList @7 :List(List(Int32));
|
int32ListList @7 :List(List(Int32));
|
||||||
textListList @8 :List(List(Text));
|
textListList @8 :List(List(Text));
|
||||||
structListList @9 :List(List(TestAllTypes));
|
structListList @9 :List(List(TestAllTypes));
|
||||||
#boolListListList @10 :List(List(List(Bool)));
|
boolListListList @10 :List(List(List(Bool)));
|
||||||
#enumListList @11 :List(List(TestEnum));
|
enumListList @11 :List(List(TestEnum));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct TestFieldZeroIsBit {
|
struct TestFieldZeroIsBit {
|
||||||
|
|
Loading…
Reference in a new issue