|
|
|
@ -54,6 +54,39 @@ namespace google { |
|
|
|
|
namespace protobuf { |
|
|
|
|
namespace compiler { |
|
|
|
|
namespace cpp { |
|
|
|
|
namespace { |
|
|
|
|
// The list of names that are defined as macros on some platforms. We need to
|
|
|
|
|
// #undef them for the generated code to compile.
|
|
|
|
|
const char* kMacroNames[] = {"major", "minor"}; |
|
|
|
|
|
|
|
|
|
bool IsMacroName(const string& name) { |
|
|
|
|
// Just do a linear search as the number of elements is very small.
|
|
|
|
|
for (int i = 0; i < GOOGLE_ARRAYSIZE(kMacroNames); ++i) { |
|
|
|
|
if (name == kMacroNames[i]) return true; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CollectMacroNames(const Descriptor* message, vector<string>* names) { |
|
|
|
|
for (int i = 0; i < message->field_count(); ++i) { |
|
|
|
|
const FieldDescriptor* field = message->field(i); |
|
|
|
|
if (IsMacroName(field->name())) { |
|
|
|
|
names->push_back(field->name()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
for (int i = 0; i < message->nested_type_count(); ++i) { |
|
|
|
|
CollectMacroNames(message->nested_type(i), names); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void CollectMacroNames(const FileDescriptor* file, vector<string>* names) { |
|
|
|
|
for (int i = 0; i < file->message_type_count(); ++i) { |
|
|
|
|
CollectMacroNames(file->message_type(i), names); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
// ===================================================================
|
|
|
|
|
|
|
|
|
@ -103,10 +136,23 @@ FileGenerator::FileGenerator(const FileDescriptor* file, const Options& options) |
|
|
|
|
|
|
|
|
|
FileGenerator::~FileGenerator() {} |
|
|
|
|
|
|
|
|
|
void FileGenerator::GenerateMacroUndefs(io::Printer* printer) { |
|
|
|
|
vector<string> names_to_undef; |
|
|
|
|
CollectMacroNames(file_, &names_to_undef); |
|
|
|
|
for (int i = 0; i < names_to_undef.size(); ++i) { |
|
|
|
|
printer->Print( |
|
|
|
|
"#ifdef $name$\n" |
|
|
|
|
"#undef $name$\n" |
|
|
|
|
"#endif\n", |
|
|
|
|
"name", names_to_undef[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void FileGenerator::GenerateHeader(io::Printer* printer) { |
|
|
|
|
printer->Print( |
|
|
|
|
"// @@protoc_insertion_point(includes)\n"); |
|
|
|
|
|
|
|
|
|
GenerateMacroUndefs(printer); |
|
|
|
|
|
|
|
|
|
GenerateForwardDeclarations(printer); |
|
|
|
|
|
|
|
|
|