|
@@ -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);
|
|
|
|