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();
|
||||
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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+2
-1
@@ -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");
|
||||
|
||||
+2
-1
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -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];
|
||||
}
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user