Protobuf: fixed a bug in name resolving

This commit is contained in:
dsavvinov
2016-08-10 19:35:02 +03:00
parent 458075312a
commit c9c3f91706
5 changed files with 13 additions and 9 deletions
@@ -104,15 +104,16 @@ ClassGenerator::ClassGenerator(Descriptor const *descriptor, NameResolver * name
int nested_types_count = descriptor->nested_type_count(); int nested_types_count = descriptor->nested_type_count();
for (int i = 0; i < nested_types_count; ++i) { for (int i = 0; i < nested_types_count; ++i) {
Descriptor const * nestedClassDescriptor = descriptor->nested_type(i); Descriptor const * nestedClassDescriptor = descriptor->nested_type(i);
nameResolver->addClass(nestedClassDescriptor->name(), getFullType());
classesDeclarations.push_back(new ClassGenerator(nestedClassDescriptor, nameResolver)); 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(); int enums_declarations_count = descriptor->enum_type_count();
for (int i = 0; i < enums_declarations_count; ++i) { for (int i = 0; i < enums_declarations_count; ++i) {
EnumDescriptor const * nestedEnumDescriptor = descriptor->enum_type(i); EnumDescriptor const * nestedEnumDescriptor = descriptor->enum_type(i);
nameResolver->addClass(nestedEnumDescriptor->name(), getFullType());
enumsDeclaraions.push_back(new EnumGenerator(nestedEnumDescriptor, nameResolver)); enumsDeclaraions.push_back(new EnumGenerator(nestedEnumDescriptor, nameResolver));
nameResolver->addClass(nestedEnumDescriptor->name(), getFullType(), /* classGenerator = */ nullptr);
} }
/** /**
@@ -81,7 +81,8 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i
bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES &&
descriptor->type() != FieldDescriptor::TYPE_MESSAGE && descriptor->type() != FieldDescriptor::TYPE_MESSAGE &&
descriptor->type() != FieldDescriptor::TYPE_STRING; descriptor->type() != FieldDescriptor::TYPE_STRING &&
descriptor->type() != FieldDescriptor::TYPE_ENUM;
if (isRead) { if (isRead) {
if (!noTag) { if (!noTag) {
printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n");
@@ -38,8 +38,9 @@ bool FileGenerator::Generate(const FileDescriptor *file, const string &parameter
for (int i = 0; i < topLevelMessagesCount; ++i) { for (int i = 0; i < topLevelMessagesCount; ++i) {
Descriptor const * descriptor = file->message_type(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 // 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); ClassGenerator * cgen = new ClassGenerator(descriptor, nameResolver);
nameResolver->addClass(descriptor->name(), /* parentName = */ "", cgen); nameResolver->addGeneratorForClass(descriptor->name(), cgen);
classes.push_back(cgen); classes.push_back(cgen);
} }
@@ -7,7 +7,6 @@
#include <google/protobuf/descriptor.h> #include <google/protobuf/descriptor.h>
#include "UnreachableStateException.h" #include "UnreachableStateException.h"
#include <string> #include <string>
namespace google { namespace google {
namespace protobuf { namespace protobuf {
namespace compiler { namespace compiler {
@@ -202,9 +201,7 @@ NameResolver::NameResolver() {
generators = map<string, ClassGenerator *>(); generators = map<string, ClassGenerator *>();
} }
void NameResolver::addClass(string simpleName, string parentName, ClassGenerator * classGenerator) { void NameResolver::addClass(string simpleName, string parentName) {
generators[simpleName] = classGenerator;
if (parentName == "") { if (parentName == "") {
names[simpleName] = simpleName; names[simpleName] = simpleName;
builders[simpleName] = simpleName + ".Builder" + 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) { string NameResolver::getClassName(string simpleName) {
return names[simpleName]; return names[simpleName];
} }
@@ -23,7 +23,8 @@ class NameResolver {
public: public:
NameResolver(); 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 getClassName (string simpleName);
string getBuilderName (string classSimpleName); string getBuilderName (string classSimpleName);
ClassGenerator * getClassGenerator (string simpleName); ClassGenerator * getClassGenerator (string simpleName);