|
@@ -185,7 +185,7 @@ MessageGenerator::MessageGenerator(const string& root_classname,
|
|
new ExtensionGenerator(class_name_, descriptor_->extension(i)));
|
|
new ExtensionGenerator(class_name_, descriptor_->extension(i)));
|
|
}
|
|
}
|
|
|
|
|
|
- for (int i = 0; i < descriptor_->oneof_decl_count(); i++) {
|
|
|
|
|
|
+ for (int i = 0; i < descriptor_->real_oneof_decl_count(); i++) {
|
|
OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i));
|
|
OneofGenerator* generator = new OneofGenerator(descriptor_->oneof_decl(i));
|
|
oneof_generators_.emplace_back(generator);
|
|
oneof_generators_.emplace_back(generator);
|
|
}
|
|
}
|
|
@@ -339,11 +339,12 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) {
|
|
"deprecated_attribute", deprecated_attribute_,
|
|
"deprecated_attribute", deprecated_attribute_,
|
|
"comments", message_comments);
|
|
"comments", message_comments);
|
|
|
|
|
|
- std::vector<char> seen_oneofs(descriptor_->oneof_decl_count(), 0);
|
|
|
|
|
|
+ std::vector<char> seen_oneofs(oneof_generators_.size(), 0);
|
|
for (int i = 0; i < descriptor_->field_count(); i++) {
|
|
for (int i = 0; i < descriptor_->field_count(); i++) {
|
|
const FieldDescriptor* field = descriptor_->field(i);
|
|
const FieldDescriptor* field = descriptor_->field(i);
|
|
- if (field->containing_oneof() != NULL) {
|
|
|
|
- const int oneof_index = field->containing_oneof()->index();
|
|
|
|
|
|
+ const OneofDescriptor *oneof = field->real_containing_oneof();
|
|
|
|
+ if (oneof) {
|
|
|
|
+ const int oneof_index = oneof->index();
|
|
if (!seen_oneofs[oneof_index]) {
|
|
if (!seen_oneofs[oneof_index]) {
|
|
seen_oneofs[oneof_index] = 1;
|
|
seen_oneofs[oneof_index] = 1;
|
|
oneof_generators_[oneof_index]->GeneratePublicCasePropertyDeclaration(
|
|
oneof_generators_[oneof_index]->GeneratePublicCasePropertyDeclaration(
|
|
@@ -443,7 +444,7 @@ void MessageGenerator::GenerateSource(io::Printer* printer) {
|
|
field_generators_.SetOneofIndexBase(sizeof_has_storage);
|
|
field_generators_.SetOneofIndexBase(sizeof_has_storage);
|
|
// sizeof_has_storage needs enough bits for the single fields that aren't in
|
|
// sizeof_has_storage needs enough bits for the single fields that aren't in
|
|
// any oneof, and then one int32 for each oneof (to store the field number).
|
|
// any oneof, and then one int32 for each oneof (to store the field number).
|
|
- sizeof_has_storage += descriptor_->oneof_decl_count();
|
|
|
|
|
|
+ sizeof_has_storage += oneof_generators_.size();
|
|
|
|
|
|
printer->Print(
|
|
printer->Print(
|
|
"\n"
|
|
"\n"
|