making progress

This commit is contained in:
David Renshaw 2014-05-10 17:43:40 -04:00
parent d115df6f05
commit c3ac2bb786

View file

@ -167,7 +167,7 @@ kj::String safeIdentifier(kj::StringPtr identifier) {
} }
kj::String spaces(int n) { kj::String spaces(int n) {
return kj::str(std::string(" ", n)); return kj::str(std::string(n * 2, ' '));
} }
// ======================================================================================= // =======================================================================================
@ -244,20 +244,20 @@ private:
switch (type.which()) { switch (type.which()) {
case schema::Type::VOID: return kj::strTree(" ::capnp::Void"); case schema::Type::VOID: return kj::strTree(" ::capnp::Void");
case schema::Type::BOOL: return kj::strTree("bool"); case schema::Type::BOOL: return kj::strTree("boolean");
case schema::Type::INT8: return kj::strTree(" ::int8_t"); case schema::Type::INT8: return kj::strTree(" byte");
case schema::Type::INT16: return kj::strTree(" ::int16_t"); case schema::Type::INT16: return kj::strTree(" short");
case schema::Type::INT32: return kj::strTree(" ::int32_t"); case schema::Type::INT32: return kj::strTree(" int");
case schema::Type::INT64: return kj::strTree(" ::int64_t"); case schema::Type::INT64: return kj::strTree(" long");
case schema::Type::UINT8: return kj::strTree(" ::uint8_t"); case schema::Type::UINT8: return kj::strTree(" byte");
case schema::Type::UINT16: return kj::strTree(" ::uint16_t"); case schema::Type::UINT16: return kj::strTree(" short");
case schema::Type::UINT32: return kj::strTree(" ::uint32_t"); case schema::Type::UINT32: return kj::strTree(" int");
case schema::Type::UINT64: return kj::strTree(" ::uint64_t"); case schema::Type::UINT64: return kj::strTree(" long");
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(" ::capnp::Text"); case schema::Type::TEXT: return kj::strTree(" capnp.Text");
case schema::Type::DATA: return kj::strTree(" ::capnp::Data"); case schema::Type::DATA: return kj::strTree(" capnp.Data");
case schema::Type::ENUM: case schema::Type::ENUM:
return cppFullName(schemaLoader.get(type.getEnum().getTypeId())); return cppFullName(schemaLoader.get(type.getEnum().getTypeId()));
@ -575,7 +575,7 @@ private:
ANY_POINTER ANY_POINTER
}; };
FieldText makeFieldText(kj::StringPtr scope, StructSchema::Field field) { FieldText makeFieldText(kj::StringPtr scope, StructSchema::Field field, int indent) {
auto proto = field.getProto(); auto proto = field.getProto();
kj::String titleCase = toTitleCase(proto.getName()); kj::String titleCase = toTitleCase(proto.getName());
@ -595,7 +595,7 @@ private:
return FieldText { return FieldText {
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.readerIsDecl), kj::mv(unionDiscrim.readerIsDecl),
" inline ", titleCase, "::Reader get", titleCase, "() const;\n" spaces(indent), " public ", titleCase, ".Reader get", titleCase, "();\n"
"\n"), "\n"),
kj::strTree( kj::strTree(
@ -759,7 +759,7 @@ private:
return FieldText { return FieldText {
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.readerIsDecl), kj::mv(unionDiscrim.readerIsDecl),
" inline ", type, " get", titleCase, "() const;\n" spaces(indent), " public", type, " get", titleCase, "();\n"
"\n"), "\n"),
kj::strTree( kj::strTree(
@ -792,75 +792,7 @@ private:
}; };
} else if (kind == FieldKind::INTERFACE) { } else if (kind == FieldKind::INTERFACE) {
return FieldText { KJ_FAIL_REQUIRE("interfaces unimplemented");
kj::strTree(
kj::mv(unionDiscrim.readerIsDecl),
" inline bool has", titleCase, "() const;\n"
" inline ", type, "::Client get", titleCase, "() const;\n"
"\n"),
kj::strTree(
kj::mv(unionDiscrim.builderIsDecl),
" inline bool has", titleCase, "();\n"
" inline ", type, "::Client get", titleCase, "();\n"
" inline void set", titleCase, "(", type, "::Client&& value);\n",
" inline void set", titleCase, "(", type, "::Client& value);\n",
" inline void adopt", titleCase, "(::capnp::Orphan<", type, ">&& value);\n"
" inline ::capnp::Orphan<", type, "> disown", titleCase, "();\n"
"\n"),
kj::strTree(
hasDiscriminantValue(proto) ? kj::strTree() : kj::strTree(
" inline ", type, "::Client get", titleCase, "();\n")),
kj::strTree(
kj::mv(unionDiscrim.isDefs),
"inline bool ", scope, "Reader::has", titleCase, "() const {\n",
unionDiscrim.has,
" return !_reader.getPointerField(", offset, " * ::capnp::POINTERS).isNull();\n"
"}\n"
"inline bool ", scope, "Builder::has", titleCase, "() {\n",
unionDiscrim.has,
" return !_builder.getPointerField(", offset, " * ::capnp::POINTERS).isNull();\n"
"}\n"
"inline ", type, "::Client ", scope, "Reader::get", titleCase, "() const {\n",
unionDiscrim.check,
" return ::capnp::_::PointerHelpers<", type, ">::get(\n"
" _reader.getPointerField(", offset, " * ::capnp::POINTERS));\n"
"}\n"
"inline ", type, "::Client ", scope, "Builder::get", titleCase, "() {\n",
unionDiscrim.check,
" return ::capnp::_::PointerHelpers<", type, ">::get(\n"
" _builder.getPointerField(", offset, " * ::capnp::POINTERS));\n"
"}\n",
hasDiscriminantValue(proto) ? kj::strTree() : kj::strTree(
"inline ", type, "::Client ", scope, "Pipeline::get", titleCase, "() {\n",
" return ", type, "::Client(_typeless.getPointerField(", offset, ").asCap());\n"
"}\n"),
"inline void ", scope, "Builder::set", titleCase, "(", type, "::Client&& cap) {\n",
unionDiscrim.set,
" ::capnp::_::PointerHelpers<", type, ">::set(\n"
" _builder.getPointerField(", offset, " * ::capnp::POINTERS), kj::mv(cap));\n"
"}\n",
"inline void ", scope, "Builder::set", titleCase, "(", type, "::Client& cap) {\n",
unionDiscrim.set,
" ::capnp::_::PointerHelpers<", type, ">::set(\n"
" _builder.getPointerField(", offset, " * ::capnp::POINTERS), cap);\n"
"}\n",
"inline void ", scope, "Builder::adopt", titleCase, "(\n"
" ::capnp::Orphan<", type, ">&& value) {\n",
unionDiscrim.set,
" ::capnp::_::PointerHelpers<", type, ">::adopt(\n"
" _builder.getPointerField(", offset, " * ::capnp::POINTERS), kj::mv(value));\n"
"}\n"
"inline ::capnp::Orphan<", type, "> ", scope, "Builder::disown", titleCase, "() {\n",
unionDiscrim.check,
" return ::capnp::_::PointerHelpers<", type, ">::disown(\n"
" _builder.getPointerField(", offset, " * ::capnp::POINTERS));\n"
"}\n"
"\n")
};
} else if (kind == FieldKind::ANY_POINTER) { } else if (kind == FieldKind::ANY_POINTER) {
return FieldText { return FieldText {
kj::strTree( kj::strTree(
@ -964,8 +896,8 @@ private:
return FieldText { return FieldText {
kj::strTree( kj::strTree(
kj::mv(unionDiscrim.readerIsDecl), kj::mv(unionDiscrim.readerIsDecl),
" inline bool has", titleCase, "() const;\n" spaces(indent), " public bool has", titleCase, "();\n",
" inline ", type, "::Reader get", titleCase, "() const;\n" spaces(indent), " public ", type, ".Reader get", titleCase, "();\n"
"\n"), "\n"),
kj::strTree( kj::strTree(
@ -1072,38 +1004,29 @@ private:
kj::StringTree makeReaderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType, kj::StringTree makeReaderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType,
bool isUnion, kj::Array<kj::StringTree>&& methodDecls, bool isUnion, kj::Array<kj::StringTree>&& methodDecls,
int indent) { int indent) {
return kj::strTree( return kj::strTree(spaces(indent), "public static class Reader {\n",
spaces(indent), "public static class Reader {\n", spaces(indent), " public Reader(capnp.StructReader base){ this.reader = base; }\n",
spaces(indent), " public Reader(::capnp::_::StructReader base): _reader(base) {}\n",
"\n",
spaces(indent), " inline ::capnp::MessageSize totalSize() const {\n",
spaces(indent), " return _reader.totalSize().asPublic();\n",
spaces(indent), " }\n",
"\n", "\n",
isUnion ? kj::strTree(spaces(indent), " inline Which which() const;\n") : kj::strTree(), isUnion ? kj::strTree(spaces(indent), " inline Which which() const;\n") : kj::strTree(),
kj::mv(methodDecls), kj::mv(methodDecls),
spaces(indent), " ::capnp::_::StructReader _reader;\n", spaces(indent), " public capnp.StructReader _reader;\n",
spaces(indent), " template <typename T, ::capnp::Kind k>\n",
spaces(indent), " friend struct ::capnp::ToDynamic_;\n",
spaces(indent), " template <typename T, ::capnp::Kind k>\n",
spaces(indent), "};\n" spaces(indent), "};\n"
"\n"); "\n");
} }
kj::StringTree makeBuilderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType, kj::StringTree makeBuilderDef(kj::StringPtr fullName, kj::StringPtr unqualifiedParentType,
bool isUnion, kj::Array<kj::StringTree>&& methodDecls) { bool isUnion, kj::Array<kj::StringTree>&& methodDecls) {
return kj::strTree( return kj::strTree();/*spaces(indent), "public static class Builder {\n",
"class ", fullName, "::Builder {\n" spaces(indent), " public Builder(::capnp::_::StructBuilder base): _builder(base) {}\n",
" inline explicit Builder(::capnp::_::StructBuilder base): _builder(base) {}\n" " inline operator Reader() const { return Reader(_builder.asReader()); }\n"
" inline operator Reader() const { return Reader(_builder.asReader()); }\n" " inline Reader asReader() const { return *this; }\n"
" inline Reader asReader() const { return *this; }\n" "\n"
"\n" " inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); }\n"
" inline ::capnp::MessageSize totalSize() const { return asReader().totalSize(); }\n" "\n",
"\n", isUnion ? kj::strTree(" inline Which which();\n") : kj::strTree(),
isUnion ? kj::strTree(" inline Which which();\n") : kj::strTree(), kj::mv(methodDecls),
kj::mv(methodDecls), "};\n"
"};\n" "\n"); */
"\n");
} }
StructText makeStructText(kj::StringPtr scope, kj::StringPtr name, StructSchema schema, StructText makeStructText(kj::StringPtr scope, kj::StringPtr name, StructSchema schema,
@ -1111,7 +1034,7 @@ private:
auto proto = schema.getProto(); auto proto = schema.getProto();
auto fullName = kj::str(scope, name); auto fullName = kj::str(scope, name);
auto subScope = kj::str(fullName, "::"); auto subScope = kj::str(fullName, "::");
auto fieldTexts = KJ_MAP(f, schema.getFields()) { return makeFieldText(subScope, f); }; auto fieldTexts = KJ_MAP(f, schema.getFields()) { return makeFieldText(subScope, f, indent + 1); };
auto structNode = proto.getStruct(); auto structNode = proto.getStruct();
uint discrimOffset = structNode.getDiscriminantOffset(); uint discrimOffset = structNode.getDiscriminantOffset();
@ -1124,10 +1047,7 @@ private:
"public static class ", fullName, " {\n", "public static class ", fullName, " {\n",
kj::strTree(makeReaderDef(fullName, name, structNode.getDiscriminantCount() != 0, kj::strTree(makeReaderDef(fullName, name, structNode.getDiscriminantCount() != 0,
KJ_MAP(f, fieldTexts) { return kj::mv(f.readerMethodDecls); }, KJ_MAP(f, fieldTexts) { return kj::mv(f.readerMethodDecls); },
indent)), indent + 1)),
" class Reader;\n"
" class Builder;\n"
" class Pipeline;\n",
structNode.getDiscriminantCount() == 0 ? kj::strTree() : kj::strTree( structNode.getDiscriminantCount() == 0 ? kj::strTree() : kj::strTree(
" enum Which: uint16_t {\n", " enum Which: uint16_t {\n",
KJ_MAP(f, structNode.getFields()) { KJ_MAP(f, structNode.getFields()) {