aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/cpp/cpp_extension.cc
diff options
context:
space:
mode:
authorkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-04-18 00:02:12 +0000
committerkenton@google.com <kenton@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-04-18 00:02:12 +0000
commitcfa2d8aa87cc0b22b5092a5fb3bf7e394f85cbf1 (patch)
tree77ee2f4d02dfb43187511f3eb5a37a00c2f6f5de /src/google/protobuf/compiler/cpp/cpp_extension.cc
parenteb26a1efdef3f1f5e77807d456a08f3c76cc5207 (diff)
downloadprotobuf-cfa2d8aa87cc0b22b5092a5fb3bf7e394f85cbf1.tar.gz
protobuf-cfa2d8aa87cc0b22b5092a5fb3bf7e394f85cbf1.tar.bz2
protobuf-cfa2d8aa87cc0b22b5092a5fb3bf7e394f85cbf1.zip
Generate field number constants. Patch from Michael Poole.
Diffstat (limited to 'src/google/protobuf/compiler/cpp/cpp_extension.cc')
-rw-r--r--src/google/protobuf/compiler/cpp/cpp_extension.cc28
1 files changed, 20 insertions, 8 deletions
diff --git a/src/google/protobuf/compiler/cpp/cpp_extension.cc b/src/google/protobuf/compiler/cpp/cpp_extension.cc
index 0dd8420d..3f212b93 100644
--- a/src/google/protobuf/compiler/cpp/cpp_extension.cc
+++ b/src/google/protobuf/compiler/cpp/cpp_extension.cc
@@ -77,9 +77,11 @@ ExtensionGenerator::~ExtensionGenerator() {}
void ExtensionGenerator::GenerateDeclaration(io::Printer* printer) {
map<string, string> vars;
- vars["extendee" ] = ClassName(descriptor_->containing_type(), true);
- vars["type_traits"] = type_traits_;
- vars["name" ] = descriptor_->name();
+ vars["extendee" ] = ClassName(descriptor_->containing_type(), true);
+ vars["number" ] = SimpleItoa(descriptor_->number());
+ vars["type_traits" ] = type_traits_;
+ vars["name" ] = descriptor_->name();
+ vars["constant_name"] = FieldConstantName(descriptor_);
// If this is a class member, it needs to be declared "static". Otherwise,
// it needs to be "extern".
@@ -91,24 +93,34 @@ void ExtensionGenerator::GenerateDeclaration(io::Printer* printer) {
}
printer->Print(vars,
+ "static const int $constant_name$ = $number$;\n"
"$qualifier$ ::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n"
" ::google::protobuf::internal::$type_traits$ > $name$;\n");
}
void ExtensionGenerator::GenerateDefinition(io::Printer* printer) {
map<string, string> vars;
- vars["extendee" ] = ClassName(descriptor_->containing_type(), true);
- vars["number" ] = SimpleItoa(descriptor_->number());
- vars["type_traits"] = type_traits_;
- vars["name" ] = descriptor_->name();
+ vars["extendee" ] = ClassName(descriptor_->containing_type(), true);
+ vars["type_traits" ] = type_traits_;
+ vars["name" ] = descriptor_->name();
+ vars["constant_name"] = FieldConstantName(descriptor_);
// If this is a class member, it needs to be declared in its class scope.
vars["scope"] = (descriptor_->extension_scope() == NULL) ? "" :
ClassName(descriptor_->extension_scope(), false) + "::";
+ // Likewise, class members need to declare the field constant variable.
+ if (descriptor_->extension_scope() != NULL) {
+ printer->Print(vars,
+ "#ifndef _MSC_VER\n"
+ "const int $scope$$constant_name$;\n"
+ "#endif\n");
+ }
+
printer->Print(vars,
"::google::protobuf::internal::ExtensionIdentifier< $extendee$,\n"
- " ::google::protobuf::internal::$type_traits$ > $scope$$name$($number$);\n");
+ " ::google::protobuf::internal::$type_traits$ > $scope$$name$("
+ "$constant_name$);\n");
}
} // namespace cpp