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();
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);
}
/**
@@ -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");
@@ -38,8 +38,9 @@ bool FileGenerator::Generate(const FileDescriptor *file, const string &parameter
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);
}
@@ -7,7 +7,6 @@
#include <google/protobuf/descriptor.h>
#include "UnreachableStateException.h"
#include <string>
namespace google {
namespace protobuf {
namespace compiler {
@@ -202,9 +201,7 @@ NameResolver::NameResolver() {
generators = map<string, ClassGenerator *>();
}
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];
}
@@ -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);