From 340c3eca1a055aece94edba2a70e5d906198d065 Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Thu, 14 Jul 2016 17:49:41 +0300 Subject: [PATCH] Added support for bytes type. Fixed a bit messages serialization. Made some refactoring --- proto/compiler/README.md | 2 +- .../kotlin/bin/kotlin_class_generator.d | 3 - .../kotlin/bin/kotlin_class_generator.o | Bin 40272 -> 0 bytes .../kotlin/bin/kotlin_enum_generator.d | 2 - .../kotlin/bin/kotlin_enum_generator.o | Bin 24168 -> 0 bytes .../kotlin/bin/kotlin_field_generator.d | 2 - .../kotlin/bin/kotlin_field_generator.o | Bin 35496 -> 0 bytes .../kotlin/bin/kotlin_file_generator.d | 3 - .../kotlin/bin/kotlin_file_generator.o | Bin 12264 -> 0 bytes .../protobuf/compiler/kotlin/bin/main.d | 3 - .../protobuf/compiler/kotlin/bin/main.o | Bin 5696 -> 0 bytes .../google/protobuf/compiler/kotlin/protoc | Bin 65992 -> 0 bytes .../kotlin/src/kotlin_class_generator.cc | 16 +- .../kotlin/src/kotlin_class_generator.h | 3 +- .../kotlin/src/kotlin_enum_generator.cc | 2 +- .../kotlin/src/kotlin_enum_generator.h | 2 +- .../kotlin/src/kotlin_field_generator.cc | 162 ++++++++++++--- .../kotlin/src/kotlin_field_generator.h | 8 +- .../kotlin/src/kotlin_file_generator.cc | 10 +- .../kotlin/src/kotlin_name_resolver.cc | 36 ++++ .../kotlin/src/kotlin_name_resolver.h | 29 +++ .../protobuf/compiler/kotlin/src/main.cc | 3 +- .../compiler/kotlin/test/addressbook.kt | 191 +++++++++++------- .../compiler/kotlin/test/addressbook.proto | 2 + proto/compiler/src/CodedInputStream.kt | 91 +++------ proto/compiler/src/CodedOutputStream.kt | 16 ++ proto/compiler/src/PersonMessage.kt | 150 +++++++++++--- proto/compiler/src/TestMessages.kt | 32 ++- 28 files changed, 523 insertions(+), 245 deletions(-) delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.d delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.d delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.d delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.d delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.o delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.d delete mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.o delete mode 100755 proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc create mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc create mode 100644 proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h diff --git a/proto/compiler/README.md b/proto/compiler/README.md index 2ba1d1c433e..1deeebe1ffa 100644 --- a/proto/compiler/README.md +++ b/proto/compiler/README.md @@ -22,7 +22,7 @@ In folder /src/ you can find sources for ProtoKot-runtime, that will be used by ## Using generated code Example: - + // Messages work only with CodedStream classes, provided by ProtoKot-runtime library. // One can create CodedStream passing any instance of corresponding Stream from Java's library. val s = ByteArrayOutputStream() diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.d b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.d deleted file mode 100644 index 095d3ebe60e..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.d +++ /dev/null @@ -1,3 +0,0 @@ -bin/kotlin_class_generator.o: src/kotlin_class_generator.cc \ - src/kotlin_class_generator.h src/kotlin_field_generator.h \ - src/kotlin_enum_generator.h diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_class_generator.o deleted file mode 100644 index ea513f2069db431a51b0fc322840657fdfd28600..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40272 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 Z+|sLaXZiFvUHQ9dU_`pt5!^Y;|9@b+OsD_= diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.d b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.d deleted file mode 100644 index 443a361d921..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.d +++ /dev/null @@ -1,2 +0,0 @@ -bin/kotlin_enum_generator.o: src/kotlin_enum_generator.cc \ - src/kotlin_enum_generator.h diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_enum_generator.o deleted file mode 100644 index acd6c6424c8104beb28b4723c542ff9d0f8b1fbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24168 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 BBcT8Q diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.d b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.d deleted file mode 100644 index 7e7089bbf82..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.d +++ /dev/null @@ -1,2 +0,0 @@ -bin/kotlin_field_generator.o: src/kotlin_field_generator.cc \ - src/kotlin_field_generator.h diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_field_generator.o deleted file mode 100644 index a5945fe03452cea1192b9ac59ce055e230042c2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35496 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 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.d b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.d deleted file mode 100644 index 04d6f449aab..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.d +++ /dev/null @@ -1,3 +0,0 @@ -bin/kotlin_file_generator.o: src/kotlin_file_generator.cc \ - src/kotlin_file_generator.h src/kotlin_class_generator.h \ - src/kotlin_field_generator.h src/kotlin_enum_generator.h diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/kotlin_file_generator.o deleted file mode 100644 index a097a89d3ce40f09def16294b94ac6914422cab8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12264 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 NP1S?QAdubu{{RYfnY{o2 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.d b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.d deleted file mode 100644 index ab59dd96054..00000000000 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.d +++ /dev/null @@ -1,3 +0,0 @@ -bin/main.o: src/main.cc src/kotlin_file_generator.h \ - src/kotlin_class_generator.h src/kotlin_field_generator.h \ - src/kotlin_enum_generator.h diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.o b/proto/compiler/google/src/google/protobuf/compiler/kotlin/bin/main.o deleted file mode 100644 index 4fc05d90668ab0d2c17c2b6bb04743f6995fee84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5696 zcmb`Le`ws+9l+n6e9g^G&(|N@ytQk!P94cQYnCrf?F`ntoG+2dEipcum9#;Tb+RpT zC*5?qp#4 zztVfYXPuO?ux~i&z0dppdS5;3J>_(zx-Xqd5hf|}HPY)bN=Wf$t{pUsW#2cNV}}Qde$O{c`pf18JhJfRnmf2wirn>hi0@4;?8zTsm?|_1{u{ zsrv7Q?)=NDF9gPZIj{PEs?vdt7fVAw9+1wJ^Bd3o3UGnV zVP03Vy*TI5!71dQw5}7~M|9z;qath(3G^$Qq_A;9cv?rx$j)DI?b$vlP z0~zt&Pf17l?vsInx;iW6G3ZeibkjSKNvXwoUkQDxt7oM(@Xd|T`NISB-=y&&6aP}! z_Sx*iDh1I0wYu_bP$O6-cLXc1GpIiLDwgx1Bh(P44N1&G68R_3@nYze*{v@{8J!@G9L=W%3K!6Gb!x9 zkjh*X$c0qqrvmw1D)VldJd;N969LS~{&IPbxMOafSNogos( zMwQ*8yOaXU@HW~=Ju*X5-F)iy?c1_z@WL1eeg_>}$NSz~el@)}H~gef$%#)4lyWIP$X~Cd|aryA?c7b4&ei6ux{Sb&i zwkPmh0v}4?H}&xjkbEB{cvt}ZLPiMGFb zXm6>iY3%e! z)4V0uIiWS2ML1NLuIspv9)VOm-8iNhOUJYY-D-q^$1SI=!8FZXQ;<_xsT>EzdfU;K z;5^YVtC8Mir5WfpE(X_>GS8JJW+p*!4;+@ovkD}%7MaNlenBy(i@tpb2!noly zTd;??W20rK*@OsH%QmNM&vX}b!wjQe!>j-LTeN-vzgPLqwU+0txGab8PO&o5Jsn#7krG@G+eSaw~TG25M{Nyx77bp(3{fzv!8|GpZ^GRJS>__G|p zmE$i^J_vVymwTDh$9 zX&Y}((>D4*efD?pUCL2^%jr*UpKN;iJdt5j4)05><(ds$hJDT>a$WayBG0$mM0OqQ zpt>TDlVDu#*bVEL**FQK%mx&6*Xy(>!hK)UT~|jP&VxeaMFaNgu3@%34HAHzSBA~9 zY1$ALzWz;l|G~MDU<0SF%q4BX)$!%|e-IIT;IoK+0Th9utOwWLC3@z<+T(k&*i#8x z^d+-KIljaBXU^Vz_?>_pj%Qm1VT?ramq7=gbCP{jKiXHo7TFm5wg^?6-U54TmiZ~d zIJTqpn`R0Tdwy->&@B9}WnYLGMC*SD?BnXcM(cl+76$8&Uv2Dfh}C})7=ArP>vxU< zrVlECMEmnV>sMU!eUc51|eJeGy2Mv$*Vz?-kY#EyC+gEJ}<-bzcS@WYPRbsr`Dy2df{$c*<(<0E1Atp0fBqEn@s;q45yXXhj~7|lN}chvoW=FgrZp4Bi`G(N70*!WcO JbYw6Z|G$M<5n=!U diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc deleted file mode 100755 index 33dfa788ef6abb30138bb29c06752fcefa0a6cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65992 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 diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc index 28838690de2..376c7aa5eec 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc @@ -22,7 +22,7 @@ void ClassGenerator::generateCode(io::Printer *printer, bool isBuilder) const { * Also note that fields should be declared before init section. */ for (FieldGenerator *gen: properties) { - gen->generateCode(printer, isBuilder); + gen->generateCode(printer, isBuilder, simpleName); printer->Print("\n"); } @@ -61,9 +61,6 @@ void ClassGenerator::generateCode(io::Printer *printer, bool isBuilder) const { if (isBuilder) { printer->Print("\n"); generateBuildMethod(printer); - - printer->Print("\n"); - generateSetters(printer); } printer->Outdent(); @@ -72,7 +69,7 @@ void ClassGenerator::generateCode(io::Printer *printer, bool isBuilder) const { ClassGenerator::ClassGenerator(Descriptor const *descriptor) : descriptor(descriptor) { - simpleName = descriptor->name(); // TODO: think about more careful class naming + simpleName = descriptor->name(); int field_count = descriptor->field_count(); for (int i = 0; i < field_count; ++i) { @@ -143,7 +140,6 @@ void ClassGenerator::generateSerializers(io::Printer * printer, bool isRead) con "\n"); printer->Indent(); - //TODO: write message tag and size printer->Print(vars, "$maybeReturn$$funName$NoTag($arg$)\n"); printer->Outdent(); @@ -234,14 +230,6 @@ void ClassGenerator::generateInitSection(io::Printer * printer) const { printer->Print("}\n"); } -void ClassGenerator::generateSetters(io::Printer *printer) const { - for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSetter(printer, "Builder" + simpleName); - printer->Print("\n"); - } -} - - const string ClassModifier::getName() const { string result = ""; switch (type) { diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h index 6b9da71742f..27eeee7409c 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.h @@ -47,7 +47,6 @@ private: void generateBuilder (io::Printer * printer) const; void generateBuildMethod (io::Printer * printer) const; void generateInitSection (io::Printer * printer) const; - void generateSetters (io::Printer * printer) const; /** * Flag isBuilder used for reducing code repeating, as code for class itself * and for its inner builder are structurally very alike and can be generated @@ -67,7 +66,7 @@ private: }; } // namespace kotlin -} // namspace compiler +} // namespace compiler } // namespace protobuf } // namespace google #endif //SRC_KOTLIN_CLASS_GENERATOR_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc index 1f976e31025..8d5bd9ad3b1 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.cc @@ -114,6 +114,6 @@ EnumGenerator::EnumGenerator(EnumDescriptor const *descriptor) { } } // namespace kotlin -} // namspace compiler +} // namespace compiler } // namespace protobuf } // namespace google diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h index 3265777a488..5e9c9f1b9b0 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_enum_generator.h @@ -36,7 +36,7 @@ private: }; } // namespace kotlin -} // namspace compiler +} // namespace compiler } // namespace protobuf } // namespace google diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc index dcd9b714c44..7f7f13d78f2 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc @@ -6,6 +6,7 @@ #include #include #include +#include "kotlin_name_resolver.h" #include namespace google { @@ -28,12 +29,19 @@ string FieldGenerator::protobufToKotlinField() const { postamble = "?"; break; case FieldDescriptor::LABEL_REPEATED: + #ifndef KOTLIN_GENERATED_CODE_LANGUAGE_LEVEL_LOW + preamble = "MutableList <"; + postamble = "> "; + break; + #else preamble = "Array <"; postamble = "> "; break; + #endif } return preamble + protobufToKotlinType() + postamble; } + /** * Simply maps protobuf field type to corresponding Kotlin. */ @@ -43,7 +51,7 @@ string FieldGenerator::protobufToKotlinType() const { case FieldDescriptor::TYPE_BOOL: return "Boolean"; case FieldDescriptor::TYPE_BYTES: - return ""; // TODO: support bytes type + return "ByteArray"; case FieldDescriptor::TYPE_DOUBLE: return "Double"; case FieldDescriptor::TYPE_ENUM: @@ -56,8 +64,6 @@ string FieldGenerator::protobufToKotlinType() const { return "Long"; case FieldDescriptor::TYPE_FLOAT: return "Float"; - case FieldDescriptor::TYPE_GROUP: - return ""; // @deprecated //TODO: make proper error handling there case FieldDescriptor::TYPE_INT32: return "Int"; case FieldDescriptor::TYPE_INT64: @@ -82,25 +88,73 @@ string FieldGenerator::protobufToKotlinType() const { } string FieldGenerator::getInitValue() const { - if (descriptor->is_optional()) { - return "null"; - } if (descriptor->is_repeated()) + #ifndef KOTLIN_GENERATED_CODE_LANGUAGE_LEVEL_LOW + return "mutableListOf()"; + #else return "arrayOf()"; - return fullType + "()"; + #endif + + FieldDescriptor::Type type = descriptor->type(); + switch(type) { + case FieldDescriptor::TYPE_BOOL: + return "false"; + case FieldDescriptor::TYPE_BYTES: + return "ByteArray(0)"; + case FieldDescriptor::TYPE_DOUBLE: + return "0.0"; + case FieldDescriptor::TYPE_ENUM: { + string enumType = descriptor->enum_type()->name(); + return enumType + ".fromIntTo" + enumType + "(0)"; // produce enum from 0, as demanded by Google + } + case FieldDescriptor::TYPE_FIXED32: + return "0"; + case FieldDescriptor::TYPE_FIXED64: + return "0L"; + case FieldDescriptor::TYPE_FLOAT: + return "0f"; + case FieldDescriptor::TYPE_INT32: + return "0"; + case FieldDescriptor::TYPE_INT64: + return "0L"; + case FieldDescriptor::TYPE_MESSAGE: + return string(descriptor->message_type()->name()) + "()"; + case FieldDescriptor::TYPE_SFIXED32: + return "0"; + case FieldDescriptor::TYPE_SFIXED64: + return "0L"; + case FieldDescriptor::TYPE_SINT32: + return "0"; + case FieldDescriptor::TYPE_SINT64: + return "0L"; + case FieldDescriptor::TYPE_STRING: + return "\"\""; + case FieldDescriptor::TYPE_UINT32: + return "0"; // see notes for TYPE_FIXED32 + case FieldDescriptor::TYPE_UINT64: + return "0L"; // see notes for TYPE_FIXED64 + } } -void FieldGenerator::generateCode(io::Printer *printer, bool isBuilder) const { +void FieldGenerator::generateCode(io::Printer *printer, bool isBuilder, string className) const { map vars; vars["name"] = simpleName; vars["field"] = protobufToKotlinField(); printer->Print(vars, "var $name$ : $field$\n"); - // make setter private for fair classes - if (!isBuilder) { - printer->Indent(); - printer->Print("private set\n"); - printer->Outdent(); + // make setter private + printer->Indent(); + printer->Print("private set\n"); + printer->Outdent(); + + // generate setter for builder + if (isBuilder) { + generateSetter(printer, /* builderName = */ "Builder" + className); + } + + // generate additional methods for repeated fields + if (modifier == FieldDescriptor::LABEL_REPEATED) { + generateRepeatedMethods(printer, isBuilder, /* builderName = */ "Builder" + className); } } @@ -137,7 +191,7 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead //TODO: dirty stub here! Normally, reading from input should be delegated to Parsers, with proper error handling and etc. //Currently tag is ignored, and work of the library relies heavily on the field order guarantees. //Thus, backward-compability and extensions are not supported. - printer->Print(vars, "val tag = input.readTag()\n"); + printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); printer->Print(vars, "val listSize = input.readInt32NoTag()\n"); printer->Print(vars, "for (i in 1..listSize) {\n"); printer->Indent(); @@ -146,8 +200,12 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead printer->Print("}\n"); } else { + // tag + printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); + // length - printer->Print(vars, "$arg$.writeInt32NoTag($fieldName$.size)\n"); + printer->Print(vars, "output.writeInt32NoTag($fieldName$.size)\n"); + printer->Print(vars, "output.writeInt32NoTag($fieldName$.size)\n"); // all elements printer->Print(vars, "for (item in $fieldName$) {\n"); @@ -201,11 +259,16 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { vars["fieldName"] = noTag ? "item" : simpleName; vars["maybeNoTag"] = noTag ? "NoTag" : ""; + vars["fieldNumber"] = std::to_string(descriptor->number()); if (isRead) { - printer->Print(vars, "$fieldName$.readFrom$maybeNoTag$(input)\n"); + printer->Print(vars, + "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n" + "$fieldName$.readFrom$maybeNoTag$(input)\n"); } else { - printer->Print(vars, "$fieldName$.writeTo$maybeNoTag$(output)\n"); + printer->Print(vars, + "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n" + "$fieldName$.writeTo$maybeNoTag$(output)\n"); } return; } @@ -217,9 +280,6 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead else { printer->Print(vars, "output.write$type$ ($fieldNumber$, $fieldName$)\n"); } - - - // TODO: support tricky types like enums/messages/repeated fields/etc } string FieldGenerator::protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type type) const { @@ -242,12 +302,10 @@ string FieldGenerator::protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type return "Bool"; case FieldDescriptor::TYPE_STRING: return "String"; - case FieldDescriptor::TYPE_GROUP: - return ""; // deprecated // TODO: think about proper error handling here case FieldDescriptor::TYPE_MESSAGE: - return "Message"; // TODO: support messages + return "Message"; case FieldDescriptor::TYPE_BYTES: - return ""; // TODO: support bytes + return "Bytes"; case FieldDescriptor::TYPE_UINT32: return "UInt32"; case FieldDescriptor::TYPE_ENUM: @@ -265,25 +323,67 @@ string FieldGenerator::protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type void FieldGenerator::generateSetter(io::Printer *printer, string builderName) const { map vars; - // TODO: refactor work with names into separate class - string camelCaseName = simpleName; - camelCaseName[0] = char(std::toupper(camelCaseName[0])); - vars["camelCaseName"] = camelCaseName; - vars["name"] = simpleName; + vars["camelCaseName"] = name_resolving::makeFirstLetterUpper(simpleName); + vars["fieldName"] = simpleName; vars["builderName"] = builderName; vars["type"] = fullType; printer->Print(vars, "fun set$camelCaseName$(value: $type$): $builderName$ {\n"); printer->Indent(); printer->Print(vars, - "$name$ = value\n" + "$fieldName$ = value\n" "return this\n"); printer->Outdent(); printer->Print("}\n"); } +void FieldGenerator::generateRepeatedMethods(io::Printer * printer, bool isBuilder, string builderName) const { + map vars; + vars["elementType"] = underlyingType; + vars["arg"] = "value"; + vars["fieldName"] = simpleName; + vars["builderName"] = builderName; + + // generate indexed setter for builders + if (isBuilder) { + printer->Print(vars, "fun set$elementType$(index: Int, $arg$: $elementType$): $builderName$ {\n"); + printer->Indent(); + printer->Print(vars, "$fieldName$[index] = $arg$\n"); + printer->Print(vars, "return this\n"); + printer->Outdent(); + printer->Print("}\n"); + } + + #ifndef KOTLIN_GENERATED_CODE_LANGUAGE_LEVEL_LOW + if (isBuilder) { + // generate single-add for builders + printer->Print(vars, "fun add$elementType$($arg$: $elementType$): $builderName$ {\n"); + printer->Indent(); + printer->Print(vars, "$fieldName$.add($arg$)\n" + "return this\n"); + printer->Outdent(); + printer->Print(vars, "}\n"); + + // generate addAll for builders + printer->Print(vars, "fun addAll$elementType$($arg$: Iterable<$elementType$>): $builderName$ {\n"); + printer->Indent(); + printer->Print(vars, "for (item in $arg$) {\n"); + printer->Indent(); + printer->Print(vars, "$fieldName$.add(item)\n"); + + printer->Outdent(); // for-loop + printer->Print("}\n"); + + printer->Print("return this\n"); + + printer->Outdent(); // function body + printer->Print("}\n"); + } + #endif +} + } // namespace kotlin -} // namspace compiler +} // namespace compiler } // namespace protobuf } // namespace google \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h index e11c0dccec8..3e61f4beea4 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h @@ -30,7 +30,8 @@ private: * CodedInputStream.readSFixed32(fieldNumber: Int) */ string protobufTypeToKotlinFunctionSuffix(FieldDescriptor::Type type) const; - + void generateSetter(io::Printer * printer, string builderName) const; + void generateRepeatedMethods(io::Printer * printer, bool isBuilder, string builderName) const; public: FieldDescriptor::Label modifier; string simpleName; @@ -45,15 +46,14 @@ public: string fullType; string initValue; - void generateCode(io::Printer * printer, bool isBuilder = false) const; + void generateCode(io::Printer * printer, bool isBuilder, string className) const; void generateSerializationCode(io::Printer * printer, bool isRead = false, bool noTag = false) const; - void generateSetter(io::Printer * printer, string builderName) const; FieldGenerator(FieldDescriptor const * descriptor); }; } // namespace kotlin -} // namspace compiler +} // namespace compiler } // namespace protobuf } // namespace google diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc index 5ff54c22c5d..ee36d46f73d 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_file_generator.cc @@ -10,6 +10,7 @@ #endif #include "kotlin_file_generator.h" #include +#include "kotlin_name_resolver.h" namespace google { namespace protobuf { @@ -26,14 +27,7 @@ void FileGenerator::generateCode(io::Printer *printer, std::vector classes; - - //TODO: maybe wrap work with class names and stuff in separate class (like in Java implementation) - // Get output file name - string const proto_file_name = file->name(); - size_t file_extension_index = proto_file_name.find(".proto"); - string const file_name = proto_file_name.substr(0, file_extension_index) + ".kt"; - - + string const file_name = name_resolving::getKotlinOutputByProtoName(file->name()); google::protobuf::scoped_ptr output(context->Open(file_name)); io::Printer printer(output.get(), '$', /* annotation_collector = */ NULL); diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc new file mode 100644 index 00000000000..d0ff147e446 --- /dev/null +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.cc @@ -0,0 +1,36 @@ +// +// Created by user on 7/14/16. +// + +#include "kotlin_name_resolver.h" +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace kotlin { + +namespace name_resolving { + +using namespace std; + +string makeFirstLetterUpper(std::string s) { + s[0] = std::toupper(s[0]); + return s; +} + +string getFileNameWithoutExtension(string fullName) { + size_t file_extension_index = fullName.find_last_of("."); + return fullName.substr(0, file_extension_index); +} + +string getKotlinOutputByProtoName(string protoName) { + string justName = getFileNameWithoutExtension(protoName); + return justName + ".kt"; +} + +} // namespace name_resolving +} // namespace kotlin +} // namespace compiler +} // namespace protobuf +} // namespace google \ No newline at end of file diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h new file mode 100644 index 00000000000..ddf0453598b --- /dev/null +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_name_resolver.h @@ -0,0 +1,29 @@ +// +// Created by user on 7/14/16. +// + +#ifndef GOOGLE_KOTLIN_NAME_RESOLVER_H +#define GOOGLE_KOTLIN_NAME_RESOLVER_H + +#include + +namespace google { +namespace protobuf { +namespace compiler { +namespace kotlin { +namespace name_resolving { + +std::string makeFirstLetterUpper(std::string s); + +std::string getFileNameWithoutExtension(std::string fullName); + +std::string getKotlinOutputByProtoName(std::string protoName); + +} // namespace name_resolving +} // namespace kotlin +} // namespace compiler +} // namespace protobuf +} // namespace google + + +#endif //GOOGLE_KOTLIN_NAME_RESOLVER_H diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc index 04e3267731a..9e4c462ef47 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/main.cc @@ -3,8 +3,6 @@ #include #include #include -// TODO(teboring): Add it back when php implementation is ready -// #include #include #include #include @@ -12,6 +10,7 @@ #include "kotlin_file_generator.h" #include +//#define KOTLIN_GENERATED_CODE_LANGUAGE_LEVEL_LOW int main(int argc, const char* const * argv) { google::protobuf::compiler::CommandLineInterface cli; diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.kt b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.kt index a35c9e9c4f6..8f90ec5b6f0 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.kt +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.kt @@ -1,4 +1,4 @@ -class Person private constructor (name: kotlin.String? = null, id: Int? = null, email: kotlin.String? = null, phones: Array = arrayOf()) { +class Person private constructor (name: kotlin.String? = "", id: Int? = 0, email: kotlin.String? = "", phones: MutableList = mutableListOf(), someBytes: ByteArray? = ByteArray(0)) { var name : kotlin.String? private set @@ -8,7 +8,10 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, var email : kotlin.String? private set - var phones : Array + var phones : MutableList + private set + + var someBytes : ByteArray? private set @@ -17,6 +20,7 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.id = id this.email = email this.phones = phones + this.someBytes = someBytes } enum class PhoneType(val ord: Int) { MOBILE (0), @@ -34,7 +38,7 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, } } } - class PhoneNumber private constructor (number: kotlin.String? = null, type: PhoneType? = null) { + class PhoneNumber private constructor (number: kotlin.String? = "", type: PhoneType? = PhoneType.fromIntToPhoneType(0)) { var number : kotlin.String? private set @@ -47,19 +51,29 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.type = type } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { output.writeString (1, number) output.writeEnum (2, type?.ord) } - class BuilderPhoneNumber constructor (number: kotlin.String? = null, type: PhoneType? = null) { + class BuilderPhoneNumber constructor (number: kotlin.String? = "", type: PhoneType? = PhoneType.fromIntToPhoneType(0)) { var number : kotlin.String? + private set + fun setNumber(value: kotlin.String?): BuilderPhoneNumber { + number = value + return this + } var type : PhoneType? + private set + fun setType(value: PhoneType?): BuilderPhoneNumber { + type = value + return this + } init { @@ -67,29 +81,19 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.type = type } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderPhoneNumber { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderPhoneNumber { number = input.readString(1) type = PhoneType.fromIntToPhoneType(input.readEnum(2)) - } + return this +} fun build(): PhoneNumber { return PhoneNumber(number, type) } - - fun setNumber(value: kotlin.String?): BuilderPhoneNumber { - number = value - return this - } - - fun setType(value: PhoneType?): BuilderPhoneNumber { - type = value - return this - } - } fun mergeFrom (input: CodedInputStream) { @@ -99,30 +103,75 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { output.writeString (1, name) output.writeInt32 (2, id) output.writeString (3, email) if (phones.size > 0) { + output.writeTag(4, WireType.LENGTH_DELIMITED) + output.writeInt32NoTag(phones.size) output.writeInt32NoTag(phones.size) for (item in phones) { + output.writeTag(4, WireType.LENGTH_DELIMITED) item.writeToNoTag(output) } } + output.writeBytes (5, someBytes) } - class BuilderPerson constructor (name: kotlin.String? = null, id: Int? = null, email: kotlin.String? = null, phones: Array = arrayOf()) { + class BuilderPerson constructor (name: kotlin.String? = "", id: Int? = 0, email: kotlin.String? = "", phones: MutableList = mutableListOf(), someBytes: ByteArray? = ByteArray(0)) { var name : kotlin.String? + private set + fun setName(value: kotlin.String?): BuilderPerson { + name = value + return this + } var id : Int? + private set + fun setId(value: Int?): BuilderPerson { + id = value + return this + } var email : kotlin.String? + private set + fun setEmail(value: kotlin.String?): BuilderPerson { + email = value + return this + } - var phones : Array + var phones : MutableList + private set + fun setPhones(value: MutableList ): BuilderPerson { + phones = value + return this + } + fun setPhoneNumber(index: Int, value: PhoneNumber): BuilderPerson { + phones[index] = value + return this + } + fun addPhoneNumber(value: PhoneNumber): BuilderPerson { + phones.add(value) + return this + } + fun addAllPhoneNumber(value: Iterable): BuilderPerson { + for (item in value) { + phones.add(item) + } + return this + } + + var someBytes : ByteArray? + private set + fun setSomeBytes(value: ByteArray?): BuilderPerson { + someBytes = value + return this + } init { @@ -130,49 +179,31 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.id = id this.email = email this.phones = phones + this.someBytes = someBytes } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderPerson { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderPerson { name = input.readString(1) id = input.readInt32(2) email = input.readString(3) if (phones.size > 0) { - val tag = input.readTag() + val tag = input.readTag(4, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { phones[i - 1].mergeFrom(input) } } - } + someBytes = input.readBytes(5) + return this +} fun build(): Person { - return Person(name, id, email, phones) + return Person(name, id, email, phones, someBytes) } - - fun setName(value: kotlin.String?): BuilderPerson { - name = value - return this - } - - fun setId(value: Int?): BuilderPerson { - id = value - return this - } - - fun setEmail(value: kotlin.String?): BuilderPerson { - email = value - return this - } - - fun setPhones(value: Array ): BuilderPerson { - phones = value - return this - } - } fun mergeFrom (input: CodedInputStream) { @@ -180,18 +211,19 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, id = input.readInt32(2) email = input.readString(3) if (phones.size > 0) { - val tag = input.readTag() + val tag = input.readTag(4, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { phones[i - 1].mergeFrom(input) } } + someBytes = input.readBytes(5) } } -class AddressBook private constructor (people: Array = arrayOf()) { - var people : Array +class AddressBook private constructor (people: MutableList = mutableListOf()) { + var people : MutableList private set @@ -199,55 +231,72 @@ class AddressBook private constructor (people: Array = arrayOf()) { this.people = people } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { if (people.size > 0) { + output.writeTag(1, WireType.LENGTH_DELIMITED) + output.writeInt32NoTag(people.size) output.writeInt32NoTag(people.size) for (item in people) { + output.writeTag(1, WireType.LENGTH_DELIMITED) item.writeToNoTag(output) } } } - class BuilderAddressBook constructor (people: Array = arrayOf()) { - var people : Array + class BuilderAddressBook constructor (people: MutableList = mutableListOf()) { + var people : MutableList + private set + fun setPeople(value: MutableList ): BuilderAddressBook { + people = value + return this + } + fun setPerson(index: Int, value: Person): BuilderAddressBook { + people[index] = value + return this + } + fun addPerson(value: Person): BuilderAddressBook { + people.add(value) + return this + } + fun addAllPerson(value: Iterable): BuilderAddressBook { + for (item in value) { + people.add(item) + } + return this + } init { this.people = people } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderAddressBook { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderAddressBook { if (people.size > 0) { - val tag = input.readTag() + val tag = input.readTag(1, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { people[i - 1].mergeFrom(input) } } - } + return this +} fun build(): AddressBook { return AddressBook(people) } - - fun setPeople(value: Array ): BuilderAddressBook { - people = value - return this - } - } fun mergeFrom (input: CodedInputStream) { if (people.size > 0) { - val tag = input.readTag() + val tag = input.readTag(1, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { people[i - 1].mergeFrom(input) diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.proto index 23cc2f97e76..35bb149cd54 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.proto +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/addressbook.proto @@ -38,6 +38,8 @@ message Person { } repeated PhoneNumber phones = 4; + + bytes someBytes = 5; } // Our address book file is just one of these. diff --git a/proto/compiler/src/CodedInputStream.kt b/proto/compiler/src/CodedInputStream.kt index 1168cd65d94..d60c3ddc290 100644 --- a/proto/compiler/src/CodedInputStream.kt +++ b/proto/compiler/src/CodedInputStream.kt @@ -11,7 +11,7 @@ import java.nio.ByteOrder * */ -// TODO: decide, if we want to optimize for performance (then we have to deal with spaghetti-code) +// TODO: refactor correctness checks into readTag class CodedInputStream(input: java.io.InputStream) { val bufferedInput: java.io.BufferedInputStream @@ -20,7 +20,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readInt32(expectedFieldNumber: Int): Int { - val tag = readTag() + val tag = readTag(expectedFieldNumber, WireType.VARINT) val actualFieldNumber = WireFormat.getTagFieldNumber(tag) val actualWireType = WireFormat.getTagWireType(tag) checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) @@ -31,10 +31,7 @@ class CodedInputStream(input: java.io.InputStream) { // simply stored in the sign bit - similar to Java's protobuf implementation. Hence, all // methods reading unsigned ints simply redirect call to corresponding signed-reading method fun readUInt32(expectedFieldNumber: Int): Int { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readUInt32NoTag() } @@ -43,19 +40,13 @@ class CodedInputStream(input: java.io.InputStream) { } fun readInt64(expectedFieldNumber: Int): Long { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, actualWireType, WireType.VARINT) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readInt64NoTag() } // See note on unsigned integers implementations above fun readUInt64(expectedFieldNumber: Int): Long { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, actualWireType, WireType.VARINT) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readUInt64NoTag() } @@ -64,10 +55,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readBool(expectedFieldNumber: Int): Boolean { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, actualWireType, WireType.VARINT) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readBoolNoTag() } @@ -83,10 +71,7 @@ class CodedInputStream(input: java.io.InputStream) { // Reading enums is like reading one int32 number. Caller is responsible for converting this ordinal to enum-object fun readEnum(expectedFieldNumber: Int): Int { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readEnumNoTag() } @@ -95,10 +80,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readSInt32(expectedFieldNumber: Int): Int { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readSInt32NoTag() } @@ -107,18 +89,12 @@ class CodedInputStream(input: java.io.InputStream) { } fun readSInt64(expectedFieldNumber: Int): Long { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.VARINT, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.VARINT) return readZigZag64NoTag() } fun readFixed32(expectedFieldNumber: Int): Int { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_32, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_32) return readFixed32NoInt() } @@ -127,10 +103,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readSFixed32(expectedFieldNumber: Int): Int { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_32, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_32) return readSFixed32NoTag() } @@ -139,10 +112,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readFixed64(expectedFieldNumber: Int): Long { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_64, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_64) return readFixed64NoTag() } @@ -151,10 +121,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readSFixed64(expectedFieldNumber: Int): Long { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_64, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_64) return readSFixed64NoTag() } @@ -163,10 +130,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readDouble(expectedFieldNumber: Int): Double { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_64, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_64) return readDoubleNoTag() } @@ -175,10 +139,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readFloat(expectedFieldNumber: Int): Float { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.FIX_32, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.FIX_32) return readFloatNoTag() } @@ -187,10 +148,7 @@ class CodedInputStream(input: java.io.InputStream) { } fun readString(expectedFieldNumber: Int): String { - val tag = readTag() - val actualFieldNumber = WireFormat.getTagFieldNumber(tag) - val actualWireType = WireFormat.getTagWireType(tag) - checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.LENGTH_DELIMITED, actualWireType) + val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) return readStringNoTag() } @@ -199,6 +157,17 @@ class CodedInputStream(input: java.io.InputStream) { val value = String(readRawBytes(length)) return value } + + fun readBytes(expectedFieldNumber: Int): ByteArray { + val tag = readTag(expectedFieldNumber, WireType.LENGTH_DELIMITED) + return readBytesNoTag() + } + + fun readBytesNoTag(): ByteArray { + val length = readInt32NoTag() + return readRawBytes(length) + } + /** ============ Utility methods ================== * They are left non-private for cases when one wants to implement her/his own protocol format. * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. @@ -254,7 +223,7 @@ class CodedInputStream(input: java.io.InputStream) { } // reads tag. Note that it returns 0 for the end of message! - fun readTag(): Int { + fun readTag(expectedFieldNumber: Int, expectedWireType: WireType): Int { if (isAtEnd()) { return 0 // we can safely return 0 as sign of end of message, because 0-tags are illegal } @@ -262,6 +231,10 @@ class CodedInputStream(input: java.io.InputStream) { if (tag == 0) { // if we somehow had read 0-tag, then message is corrupted throw InvalidProtocolBufferException("Invalid tag 0") } + + val actualFieldNumber = WireFormat.getTagFieldNumber(tag) + val actualWireType = WireFormat.getTagWireType(tag) + checkFieldCorrectness(expectedFieldNumber, actualFieldNumber, WireType.LENGTH_DELIMITED, actualWireType) return tag } diff --git a/proto/compiler/src/CodedOutputStream.kt b/proto/compiler/src/CodedOutputStream.kt index d5e132bc344..ea1fc24f0d3 100644 --- a/proto/compiler/src/CodedOutputStream.kt +++ b/proto/compiler/src/CodedOutputStream.kt @@ -151,6 +151,22 @@ class CodedOutputStream(val output: java.io.OutputStream) { output.write(value.toByteArray()) } + fun writeBytes(fieldNumber: Int, value: ByteArray?) { + value ?: return + writeTag(fieldNumber, WireType.LENGTH_DELIMITED) + writeBytesNoTag(value) + } + + fun writeBytesNoTag(value: ByteArray) { + writeInt32NoTag(value.size) + output.write(value) + } + + /** ============ Utility methods ================== + * They are left non-private for cases when one wants to implement her/his own protocol format. + * Then she/he can re-use low-level methods for operating with raw values, that are not annotated with Protobuf tags. + */ + fun writeLittleEndian(value: Int?) { value ?: return val bb = ByteBuffer.allocate(4) diff --git a/proto/compiler/src/PersonMessage.kt b/proto/compiler/src/PersonMessage.kt index e29e0fb689b..cde8860f6a1 100644 --- a/proto/compiler/src/PersonMessage.kt +++ b/proto/compiler/src/PersonMessage.kt @@ -1,6 +1,4 @@ -package Addressbook; - -class Person private constructor (name: kotlin.String? = null, id: Int? = null, email: kotlin.String? = null, phones: Array = arrayOf()) { +class Person private constructor (name: kotlin.String? = "", id: Int? = 0, email: kotlin.String? = "", phones: MutableList = mutableListOf(), someBytes: ByteArray? = ByteArray(0)) { var name : kotlin.String? private set @@ -10,7 +8,10 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, var email : kotlin.String? private set - var phones : Array + var phones : MutableList + private set + + var someBytes : ByteArray? private set @@ -19,8 +20,8 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.id = id this.email = email this.phones = phones + this.someBytes = someBytes } - enum class PhoneType(val ord: Int) { MOBILE (0), HOME (1), @@ -37,7 +38,7 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, } } } - class PhoneNumber private constructor (number: kotlin.String? = null, type: PhoneType? = null) { + class PhoneNumber private constructor (number: kotlin.String? = "", type: PhoneType? = PhoneType.fromIntToPhoneType(0)) { var number : kotlin.String? private set @@ -50,19 +51,29 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.type = type } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { output.writeString (1, number) output.writeEnum (2, type?.ord) } - class BuilderPhoneNumber constructor (number: kotlin.String? = null, type: PhoneType? = null) { + class BuilderPhoneNumber constructor (number: kotlin.String? = "", type: PhoneType? = PhoneType.fromIntToPhoneType(0)) { var number : kotlin.String? + private set + fun setNumber(value: kotlin.String?): BuilderPhoneNumber { + number = value + return this + } var type : PhoneType? + private set + fun setType(value: PhoneType?): BuilderPhoneNumber { + type = value + return this + } init { @@ -70,13 +81,14 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.type = type } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderPhoneNumber { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderPhoneNumber { number = input.readString(1) type = PhoneType.fromIntToPhoneType(input.readEnum(2)) + return this } fun build(): PhoneNumber { @@ -91,30 +103,75 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { output.writeString (1, name) output.writeInt32 (2, id) output.writeString (3, email) if (phones.size > 0) { + output.writeTag(4, WireType.LENGTH_DELIMITED) + output.writeInt32NoTag(phones.size) output.writeInt32NoTag(phones.size) for (item in phones) { + output.writeTag(4, WireType.LENGTH_DELIMITED) item.writeToNoTag(output) } } + output.writeBytes (5, someBytes) } - class BuilderPerson constructor (name: kotlin.String? = null, id: Int? = null, email: kotlin.String? = null, phones: Array = arrayOf()) { + class BuilderPerson constructor (name: kotlin.String? = "", id: Int? = 0, email: kotlin.String? = "", phones: MutableList = mutableListOf(), someBytes: ByteArray? = ByteArray(0)) { var name : kotlin.String? + private set + fun setName(value: kotlin.String?): BuilderPerson { + name = value + return this + } var id : Int? + private set + fun setId(value: Int?): BuilderPerson { + id = value + return this + } var email : kotlin.String? + private set + fun setEmail(value: kotlin.String?): BuilderPerson { + email = value + return this + } - var phones : Array + var phones : MutableList + private set + fun setPhones(value: MutableList ): BuilderPerson { + phones = value + return this + } + fun setPhoneNumber(index: Int, value: PhoneNumber): BuilderPerson { + phones[index] = value + return this + } + fun addPhoneNumber(value: PhoneNumber): BuilderPerson { + phones.add(value) + return this + } + fun addAllPhoneNumber(value: Iterable): BuilderPerson { + for (item in value) { + phones.add(item) + } + return this + } + + var someBytes : ByteArray? + private set + fun setSomeBytes(value: ByteArray?): BuilderPerson { + someBytes = value + return this + } init { @@ -122,27 +179,30 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, this.id = id this.email = email this.phones = phones + this.someBytes = someBytes } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderPerson { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderPerson { name = input.readString(1) id = input.readInt32(2) email = input.readString(3) if (phones.size > 0) { - val tag = input.readTag() + val tag = input.readTag(4, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { phones[i - 1].mergeFrom(input) } } + someBytes = input.readBytes(5) + return this } fun build(): Person { - return Person(name, id, email, phones) + return Person(name, id, email, phones, someBytes) } } @@ -151,18 +211,19 @@ class Person private constructor (name: kotlin.String? = null, id: Int? = null, id = input.readInt32(2) email = input.readString(3) if (phones.size > 0) { - val tag = input.readTag() + val tag = input.readTag(4, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { phones[i - 1].mergeFrom(input) } } + someBytes = input.readBytes(5) } } -class AddressBook private constructor (people: Array = arrayOf()) { - var people : Array +class AddressBook private constructor (people: MutableList = mutableListOf()) { + var people : MutableList private set @@ -170,39 +231,62 @@ class AddressBook private constructor (people: Array = arrayOf()) { this.people = people } - fun writeTo (output: CodedOutputStream) { + fun writeTo (output: CodedOutputStream): Unit { writeToNoTag(output) } - fun writeToNoTag (output: CodedOutputStream) { + fun writeToNoTag (output: CodedOutputStream): Unit { if (people.size > 0) { + output.writeTag(1, WireType.LENGTH_DELIMITED) + output.writeInt32NoTag(people.size) output.writeInt32NoTag(people.size) for (item in people) { + output.writeTag(1, WireType.LENGTH_DELIMITED) item.writeToNoTag(output) } } } - class BuilderAddressBook constructor (people: Array = arrayOf()) { - var people : Array + class BuilderAddressBook constructor (people: MutableList = mutableListOf()) { + var people : MutableList + private set + fun setPeople(value: MutableList ): BuilderAddressBook { + people = value + return this + } + fun setPerson(index: Int, value: Person): BuilderAddressBook { + people[index] = value + return this + } + fun addPerson(value: Person): BuilderAddressBook { + people.add(value) + return this + } + fun addAllPerson(value: Iterable): BuilderAddressBook { + for (item in value) { + people.add(item) + } + return this + } init { this.people = people } - fun readFrom (input: CodedInputStream) { - readFromNoTag(input) + fun readFrom (input: CodedInputStream): BuilderAddressBook { + return readFromNoTag(input) } - fun readFromNoTag (input: CodedInputStream) { + fun readFromNoTag (input: CodedInputStream): BuilderAddressBook { if (people.size > 0) { - val tag = input.readTag() + val tag = input.readTag(1, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { people[i - 1].mergeFrom(input) } } + return this } fun build(): AddressBook { @@ -212,7 +296,7 @@ class AddressBook private constructor (people: Array = arrayOf()) { fun mergeFrom (input: CodedInputStream) { if (people.size > 0) { - val tag = input.readTag() + val tag = input.readTag(1, WireType.LENGTH_DELIMITED) val listSize = input.readInt32NoTag() for (i in 1..listSize) { people[i - 1].mergeFrom(input) diff --git a/proto/compiler/src/TestMessages.kt b/proto/compiler/src/TestMessages.kt index b37fa3e48f5..c2d25d0f9af 100644 --- a/proto/compiler/src/TestMessages.kt +++ b/proto/compiler/src/TestMessages.kt @@ -5,18 +5,40 @@ import java.io.ByteArrayOutputStream * Created by user on 7/8/16. */ -import PersonMessage - fun testMessageSerialization() { + // Messages work only with CodedStream classes, provided by ProtoKot-runtime library. + // One can create CodedStream passing any instance of corresponding Stream from Java's library. val s = ByteArrayOutputStream() val outs = CodedOutputStream(s) - val msg = + + // All messages are immutable. Use Builders for creating new messages + val msg = Person.BuilderPerson() + .setEmail("wtf@dasda.com") // all setters return this builder, so you could chain modifiers in LINQ-style + .setId(42) + .setName("John Doe") + .setPhones(arrayOf( // repeated fields stored as Array<>, so use arrayOf() for creating repeated fields + Person.PhoneNumber.BuilderPhoneNumber() + .setNumber("342143-23423-42") + .setType(Person.PhoneType.HOME) + .build() + )) + .build() // don't forget to call build() to produce message msg.writeTo(outs) - val ins = CodedInputStream(ByteArrayInputStream(s.toByteArray())) - val readMsg = Person("", 0, "", arrayOf()) + // Now let's use output stream as input to read our message from it! + var ins = CodedInputStream(ByteArrayInputStream(s.toByteArray())) + + // Create default instance of message + var readMsg = Person.BuilderPerson().build() + // Read in that message data from input stream. readMsg.mergeFrom(ins) + // Note, that currently mergeFrom is the only way to mutate instance of message. + // Don't rely on it, probably mergeFrom will be refactored lately to guarantee full immutability of mesages. + + // Better way to read a message: + ins = CodedInputStream(ByteArrayInputStream(s.toByteArray())) + readMsg = Person.BuilderPerson().readFrom(ins).build() assert(msg == readMsg) }