Move MessageGenerator::GenerateMessageHeader over to Printer::Emit

PiperOrigin-RevId: 546930919
pull/13176/head
Thomas Van Lenten 2 years ago committed by Copybara-Service
parent aa72b19bf9
commit 54377be12c
  1. 145
      src/google/protobuf/compiler/objectivec/message.cc

@ -31,9 +31,8 @@
#include "google/protobuf/compiler/objectivec/message.h"
#include <algorithm>
#include <iostream>
#include <cstddef>
#include <memory>
#include <sstream>
#include <string>
#include <vector>
@ -298,70 +297,71 @@ void MessageGenerator::DetermineObjectiveCClassDefinitions(
}
void MessageGenerator::GenerateMessageHeader(io::Printer* printer) const {
// This a a map entry message, just recurse and do nothing directly.
// This a a map entry message, do nothing.
if (IsMapEntryMessage(descriptor_)) {
return;
}
printer->Print(
// clang-format off
"#pragma mark - $classname$\n"
"\n",
// clang-format on
"classname", class_name_);
if (descriptor_->field_count()) {
std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
SortFieldsByNumber(descriptor_));
printer->Print("typedef GPB_ENUM($classname$_FieldNumber) {\n", "classname",
class_name_);
printer->Indent();
for (int i = 0; i < descriptor_->field_count(); i++) {
field_generators_.get(sorted_fields[i])
.GenerateFieldNumberConstant(printer);
}
printer->Outdent();
printer->Print("};\n\n");
}
for (const auto& generator : oneof_generators_) {
generator->GenerateCaseEnum(printer);
}
std::string message_comments;
SourceLocation location;
if (descriptor_->GetSourceLocation(&location)) {
message_comments = BuildCommentsString(location, false);
} else {
message_comments = "";
}
printer->Print(
// clang-format off
"$comments$$deprecated_attribute$GPB_FINAL @interface $classname$ : GPBMessage\n\n",
// clang-format on
"classname", class_name_, "deprecated_attribute", deprecated_attribute_,
"comments", message_comments);
std::vector<char> seen_oneofs(oneof_generators_.size(), 0);
for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor* field = descriptor_->field(i);
const OneofDescriptor* oneof = field->real_containing_oneof();
if (oneof) {
const int oneof_index = oneof->index();
if (!seen_oneofs[oneof_index]) {
seen_oneofs[oneof_index] = 1;
oneof_generators_[oneof_index]->GeneratePublicCasePropertyDeclaration(
printer);
}
}
field_generators_.get(field).GeneratePropertyDeclaration(printer);
}
printer->Print("@end\n\n");
auto vars = printer->WithVars({{"classname", class_name_}});
printer->Emit(
{{"deprecated_attribute", deprecated_attribute_},
{"message_comments",
[&] { EmitCommentsString(printer, descriptor_, false); }},
{"message_fieldnum_enum",
[&] {
if (descriptor_->field_count() == 0) return;
printer->Emit(R"objc(
typedef GPB_ENUM($classname$_FieldNumber) {
$message_fieldnum_enum_values$,
};
)objc");
printer->Emit("\n");
}},
{"message_fieldnum_enum_values",
[&] {
std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
SortFieldsByNumber(descriptor_));
for (size_t i = 0; i < (size_t)descriptor_->field_count(); i++) {
field_generators_.get(sorted_fields[i])
.GenerateFieldNumberConstant(printer);
}
}},
{"oneof_enums",
[&] {
for (const auto& generator : oneof_generators_) {
generator->GenerateCaseEnum(printer);
}
}},
{"message_properties",
[&] {
std::vector<char> seen_oneofs(oneof_generators_.size(), 0);
for (int i = 0; i < descriptor_->field_count(); i++) {
const FieldDescriptor* field = descriptor_->field(i);
const OneofDescriptor* oneof = field->real_containing_oneof();
if (oneof) {
const size_t oneof_index = (size_t)oneof->index();
if (!seen_oneofs[oneof_index]) {
seen_oneofs[oneof_index] = 1;
oneof_generators_[oneof_index]
->GeneratePublicCasePropertyDeclaration(printer);
}
}
field_generators_.get(field).GeneratePropertyDeclaration(printer);
}
}}},
R"objc(
#pragma mark - $classname$
$message_fieldnum_enum$
$oneof_enums$
$message_comments$
$deprecated_attribute$GPB_FINAL @interface $classname$ : GPBMessage
$message_properties$
@end
)objc");
printer->Emit("\n");
for (int i = 0; i < descriptor_->field_count(); i++) {
field_generators_.get(descriptor_->field(i))
@ -372,16 +372,23 @@ void MessageGenerator::GenerateMessageHeader(io::Printer* printer) const {
for (const auto& generator : oneof_generators_) {
generator->GenerateClearFunctionDeclaration(printer);
}
printer->Print("\n");
printer->Emit("\n");
}
if (descriptor_->extension_count() > 0) {
printer->Print("@interface $classname$ (DynamicMethods)\n\n", "classname",
class_name_);
for (const auto generator : extension_generators_) {
generator->GenerateMembersHeader(printer);
}
printer->Print("@end\n\n");
printer->Emit({{"extension_info",
[&] {
for (const auto* generator : extension_generators_) {
generator->GenerateMembersHeader(printer);
}
}}},
R"objc(
@interface $classname$ (DynamicMethods)
$extension_info$
@end
)objc");
printer->Emit("\n");
}
}

Loading…
Cancel
Save