nested lists now at least typecheck

This commit is contained in:
David Renshaw 2014-10-04 15:34:34 -04:00
parent fcad26acb6
commit ddcd478567
2 changed files with 55 additions and 50 deletions

View file

@ -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)") :

View file

@ -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 {