51 namespace objectivec {
53 using internal::WireFormat;
54 using internal::WireFormatLite;
57 struct FieldOrderingByNumber {
60 return a->number() <
b->number();
129 struct FieldOrderingByStorageSize {
133 const int order_group_a = OrderGroupForFieldDescriptor(
a);
134 const int order_group_b = OrderGroupForFieldDescriptor(
b);
135 if (order_group_a != order_group_b) {
136 return order_group_a < order_group_b;
139 return a->number() <
b->number();
143 struct ExtensionRangeOrdering {
144 bool operator()(
const Descriptor::ExtensionRange*
a,
145 const Descriptor::ExtensionRange*
b)
const {
146 return a->start <
b->start;
171 FieldOrderingByStorageSize());
179 : root_classname_(root_classname),
183 deprecated_attribute_(
215 generator->GenerateStaticVariablesInitialization(printer);
219 generator->GenerateStaticVariablesInitialization(printer);
233 generator->DetermineForwardDeclarations(fwd_decls);
243 if (generator->IncludesOneOfDefinition()) {
253 generator->GenerateHeader(printer);
257 generator->GenerateEnumHeader(printer);
264 generator->GenerateRegistrationSource(printer);
268 generator->GenerateExtensionRegistrationSource(printer);
276 generator->GenerateMessageHeader(printer);
282 "#pragma mark - $classname$\n"
287 std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
290 printer->
Print(
"typedef GPB_ENUM($classname$_FieldNumber) {\n",
300 printer->
Print(
"};\n\n");
304 generator->GenerateCaseEnum(printer);
307 string message_comments;
312 message_comments =
"";
316 "$comments$$deprecated_attribute$@interface $classname$ : GPBMessage\n\n",
319 "comments", message_comments);
325 const int oneof_index =
field->containing_oneof()->index();
326 if (!seen_oneofs[oneof_index]) {
327 seen_oneofs[oneof_index] = 1;
335 printer->
Print(
"@end\n\n");
344 generator->GenerateClearFunctionDeclaration(printer);
346 printer->
Print(
"\n");
350 printer->
Print(
"@interface $classname$ (DynamicMethods)\n\n",
353 generator->GenerateMembersHeader(printer);
355 printer->
Print(
"@end\n\n");
359 generator->GenerateMessageHeader(printer);
366 "#pragma mark - $classname$\n"
373 "#pragma clang diagnostic push\n"
374 "#pragma clang diagnostic ignored \"-Wdeprecated-implementations\"\n"
378 printer->
Print(
"@implementation $classname$\n\n",
382 generator->GeneratePropertyImplementation(printer);
390 std::unique_ptr<const FieldDescriptor*[]> sorted_fields(
392 std::unique_ptr<const FieldDescriptor*[]> size_order_fields(
395 std::vector<const Descriptor::ExtensionRange*> sorted_extensions;
400 std::sort(sorted_extensions.begin(), sorted_extensions.end(),
401 ExtensionRangeOrdering());
409 size_t sizeof_has_storage = (num_has_bits + 31) / 32;
410 if (sizeof_has_storage == 0) {
415 sizeof_has_storage = 1;
419 generator->SetOneofIndexBase(sizeof_has_storage);
428 "typedef struct $classname$__storage_ {\n"
429 " uint32_t _has_storage_[$sizeof_has_storage$];\n",
431 "sizeof_has_storage",
StrCat(sizeof_has_storage));
444 "// This method is threadsafe because it is initially called\n"
445 "// in +initialize for each subclass.\n"
446 "+ (GPBDescriptor *)descriptor {\n"
447 " static GPBDescriptor *descriptor = nil;\n"
448 " if (!descriptor) {\n");
453 string field_description_type;
455 field_description_type =
"GPBMessageFieldDescriptionWithDefault";
457 field_description_type =
"GPBMessageFieldDescription";
461 " static $field_description_type$ fields[] = {\n",
462 "field_description_type", field_description_type);
483 std::map<string, string> vars;
486 vars[
"fields"] = has_fields ?
"fields" :
"NULL";
488 vars[
"fields_count"] =
489 "(uint32_t)(sizeof(fields) / sizeof(" + field_description_type +
"))";
491 vars[
"fields_count"] =
"0";
494 std::vector<string> init_flags;
496 init_flags.push_back(
"GPBDescriptorInitializationFlag_FieldsWithDefault");
499 init_flags.push_back(
"GPBDescriptorInitializationFlag_WireFormat");
506 " GPBDescriptor *localDescriptor =\n"
507 " [GPBDescriptor allocDescriptorForClass:[$classname$ class]\n"
508 " rootClass:[$rootclassname$ class]\n"
509 " file:$rootclassname$_FileDescriptor()\n"
511 " fieldCount:$fields_count$\n"
512 " storageSize:sizeof($classname$__storage_)\n"
513 " flags:$init_flags$];\n");
516 " static const char *oneofs[] = {\n");
518 printer->
Print(
" \"$name$\",\n",
"name",
519 generator->DescriptorName());
523 " [localDescriptor setupOneofs:oneofs\n"
524 " count:(uint32_t)(sizeof(oneofs) / sizeof(char*))\n"
525 " firstHasIndex:$first_has_index$];\n",
529 const string text_format_data_str(text_format_decode_data.
Data());
531 "#if !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n"
532 " static const char *extraTextFormatInfo =");
533 static const int kBytesPerLine = 40;
534 for (
int i = 0;
i < text_format_data_str.size();
i += kBytesPerLine) {
538 CEscape(text_format_data_str.substr(
i, kBytesPerLine))));
542 " [localDescriptor setupExtraTextInfo:extraTextFormatInfo];\n"
543 "#endif // !GPBOBJC_SKIP_MESSAGE_TEXTFORMAT_EXTRAS\n");
545 if (sorted_extensions.size() != 0) {
547 " static const GPBExtensionRange ranges[] = {\n");
548 for (
int i = 0;
i < sorted_extensions.size();
i++) {
549 printer->
Print(
" { .start = $start$, .end = $end$ },\n",
555 " [localDescriptor setupExtensionRanges:ranges\n"
556 " count:(uint32_t)(sizeof(ranges) / sizeof(GPBExtensionRange))];\n");
561 " [localDescriptor setupContainingMessageClassName:GPBStringifySymbol($parent_name$)];\n",
562 "parent_name", parent_class_name);
566 if (suffix_added.size() > 0) {
568 " [localDescriptor setupMessageClassNameSuffix:@\"$suffix$\"];\n",
569 "suffix", suffix_added);
572 " #if defined(DEBUG) && DEBUG\n"
573 " NSAssert(descriptor == nil, @\"Startup recursed!\");\n"
575 " descriptor = localDescriptor;\n"
577 " return descriptor;\n"
583 "#pragma clang diagnostic pop\n"
593 generator->GenerateClearFunctionImplementation(printer);
598 generator->GenerateSource(printer);
602 generator->GenerateSource(printer);