From c9c3f91706d0338cf5cc108b51b87b4023c16d05 Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Wed, 10 Aug 2016 19:35:02 +0300 Subject: [PATCH] Protobuf: fixed a bug in name resolving --- .../compiler/kotlin/src/kotlin_class_generator.cc | 5 +++-- .../compiler/kotlin/src/kotlin_field_generator.cc | 3 ++- .../protobuf/compiler/kotlin/src/kotlin_file_generator.cc | 3 ++- .../protobuf/compiler/kotlin/src/kotlin_name_resolver.cc | 8 ++++---- .../protobuf/compiler/kotlin/src/kotlin_name_resolver.h | 3 ++- 5 files changed, 13 insertions(+), 9 deletions(-) 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 a1d09b3093c..8d696c104b2 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 @@ -104,15 +104,16 @@ ClassGenerator::ClassGenerator(Descriptor const *descriptor, NameResolver * name int nested_types_count = descriptor->nested_type_count(); for (int i = 0; i < nested_types_count; ++i) { Descriptor const * nestedClassDescriptor = descriptor->nested_type(i); + nameResolver->addClass(nestedClassDescriptor->name(), getFullType()); classesDeclarations.push_back(new ClassGenerator(nestedClassDescriptor, nameResolver)); - nameResolver->addClass(nestedClassDescriptor->name(), getFullType(), classesDeclarations.back()); + nameResolver->addGeneratorForClass(nestedClassDescriptor->name(), classesDeclarations.back()); } int enums_declarations_count = descriptor->enum_type_count(); for (int i = 0; i < enums_declarations_count; ++i) { EnumDescriptor const * nestedEnumDescriptor = descriptor->enum_type(i); + nameResolver->addClass(nestedEnumDescriptor->name(), getFullType()); enumsDeclaraions.push_back(new EnumGenerator(nestedEnumDescriptor, nameResolver)); - nameResolver->addClass(nestedEnumDescriptor->name(), getFullType(), /* classGenerator = */ nullptr); } /** 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 be459e068bb..16a5bd1e72b 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 @@ -81,7 +81,8 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING; + descriptor->type() != FieldDescriptor::TYPE_STRING && + descriptor->type() != FieldDescriptor::TYPE_ENUM; if (isRead) { if (!noTag) { printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); 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 c5e3a8c6587..91ad3f5d58e 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 @@ -38,8 +38,9 @@ bool FileGenerator::Generate(const FileDescriptor *file, const string ¶meter for (int i = 0; i < topLevelMessagesCount; ++i) { Descriptor const * descriptor = file->message_type(i); // TODO: think about order of initialization and cross-branches calls. If we don't allow such things, everythign is ok atm + nameResolver->addClass(descriptor->name(), /* parentName = */ ""); ClassGenerator * cgen = new ClassGenerator(descriptor, nameResolver); - nameResolver->addClass(descriptor->name(), /* parentName = */ "", cgen); + nameResolver->addGeneratorForClass(descriptor->name(), cgen); classes.push_back(cgen); } 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 index 1d847e26831..e05be1af93d 100644 --- 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 @@ -7,7 +7,6 @@ #include #include "UnreachableStateException.h" #include - namespace google { namespace protobuf { namespace compiler { @@ -202,9 +201,7 @@ NameResolver::NameResolver() { generators = map(); } -void NameResolver::addClass(string simpleName, string parentName, ClassGenerator * classGenerator) { - generators[simpleName] = classGenerator; - +void NameResolver::addClass(string simpleName, string parentName) { if (parentName == "") { names[simpleName] = simpleName; builders[simpleName] = simpleName + ".Builder" + simpleName; @@ -216,6 +213,9 @@ void NameResolver::addClass(string simpleName, string parentName, ClassGenerator } } +void NameResolver::addGeneratorForClass(string simpleName, ClassGenerator *classGenerator) { + generators[simpleName] = classGenerator; +} string NameResolver::getClassName(string simpleName) { return names[simpleName]; } 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 index 99dcc9840a1..f3c6b91260b 100644 --- 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 @@ -23,7 +23,8 @@ class NameResolver { public: NameResolver(); - void addClass (string simpleName, string parentName, ClassGenerator * classGenerator); + void addClass (string simpleName, string parentName); + void addGeneratorForClass (string simpleName, ClassGenerator * classGenerator); string getClassName (string simpleName); string getBuilderName (string classSimpleName); ClassGenerator * getClassGenerator (string simpleName);