Protobuf: fixed a bug in name resolving
This commit is contained in:
+3
-2
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+2
-1
@@ -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");
|
||||||
|
|||||||
+2
-1
@@ -38,8 +38,9 @@ bool FileGenerator::Generate(const FileDescriptor *file, const string ¶meter
|
|||||||
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -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];
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user