| OLD | NEW |
| 1 // Protocol Buffers - Google's data interchange format | 1 // Protocol Buffers - Google's data interchange format |
| 2 // Copyright 2008 Google Inc. All rights reserved. | 2 // Copyright 2008 Google Inc. All rights reserved. |
| 3 // https://developers.google.com/protocol-buffers/ | 3 // https://developers.google.com/protocol-buffers/ |
| 4 // | 4 // |
| 5 // Redistribution and use in source and binary forms, with or without | 5 // Redistribution and use in source and binary forms, with or without |
| 6 // modification, are permitted provided that the following conditions are | 6 // modification, are permitted provided that the following conditions are |
| 7 // met: | 7 // met: |
| 8 // | 8 // |
| 9 // * Redistributions of source code must retain the above copyright | 9 // * Redistributions of source code must retain the above copyright |
| 10 // notice, this list of conditions and the following disclaimer. | 10 // notice, this list of conditions and the following disclaimer. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 } | 87 } |
| 88 | 88 |
| 89 MessageBuilderGenerator::~MessageBuilderGenerator() {} | 89 MessageBuilderGenerator::~MessageBuilderGenerator() {} |
| 90 | 90 |
| 91 void MessageBuilderGenerator:: | 91 void MessageBuilderGenerator:: |
| 92 Generate(io::Printer* printer) { | 92 Generate(io::Printer* printer) { |
| 93 WriteMessageDocComment(printer, descriptor_); | 93 WriteMessageDocComment(printer, descriptor_); |
| 94 if (descriptor_->extension_range_count() > 0) { | 94 if (descriptor_->extension_range_count() > 0) { |
| 95 printer->Print( | 95 printer->Print( |
| 96 "public static final class Builder extends\n" | 96 "public static final class Builder extends\n" |
| 97 " com.google.protobuf.GeneratedMessage.ExtendableBuilder<\n" | 97 " com.google.protobuf.GeneratedMessage$ver$.ExtendableBuilder<\n" |
| 98 " $classname$, Builder> implements\n" | 98 " $classname$, Builder> implements\n" |
| 99 " $extra_interfaces$\n" | 99 " $extra_interfaces$\n" |
| 100 " $classname$OrBuilder {\n", | 100 " $classname$OrBuilder {\n", |
| 101 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 101 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 102 "extra_interfaces", ExtraBuilderInterfaces(descriptor_)); | 102 "extra_interfaces", ExtraBuilderInterfaces(descriptor_), |
| 103 "ver", GeneratedCodeVersionSuffix()); |
| 103 } else { | 104 } else { |
| 104 printer->Print( | 105 printer->Print( |
| 105 "public static final class Builder extends\n" | 106 "public static final class Builder extends\n" |
| 106 " com.google.protobuf.GeneratedMessage.Builder<Builder> implements\n" | 107 " com.google.protobuf.GeneratedMessage$ver$.Builder<Builder> implements
\n" |
| 107 " $extra_interfaces$\n" | 108 " $extra_interfaces$\n" |
| 108 " $classname$OrBuilder {\n", | 109 " $classname$OrBuilder {\n", |
| 109 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 110 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 110 "extra_interfaces", ExtraBuilderInterfaces(descriptor_)); | 111 "extra_interfaces", ExtraBuilderInterfaces(descriptor_), |
| 112 "ver", GeneratedCodeVersionSuffix()); |
| 111 } | 113 } |
| 112 printer->Indent(); | 114 printer->Indent(); |
| 113 | 115 |
| 114 GenerateDescriptorMethods(printer); | 116 GenerateDescriptorMethods(printer); |
| 115 GenerateCommonBuilderMethods(printer); | 117 GenerateCommonBuilderMethods(printer); |
| 116 | 118 |
| 117 if (context_->HasGeneratedMethods(descriptor_)) { | 119 if (context_->HasGeneratedMethods(descriptor_)) { |
| 118 GenerateIsInitialized(printer); | 120 GenerateIsInitialized(printer); |
| 119 GenerateBuilderParsingMethods(printer); | 121 GenerateBuilderParsingMethods(printer); |
| 120 } | 122 } |
| 121 | 123 |
| 122 // oneof | 124 // oneof |
| 123 map<string, string> vars; | 125 std::map<string, string> vars; |
| 124 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { | 126 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { |
| 125 vars["oneof_name"] = context_->GetOneofGeneratorInfo( | 127 vars["oneof_name"] = context_->GetOneofGeneratorInfo( |
| 126 descriptor_->oneof_decl(i))->name; | 128 descriptor_->oneof_decl(i))->name; |
| 127 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( | 129 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( |
| 128 descriptor_->oneof_decl(i))->capitalized_name; | 130 descriptor_->oneof_decl(i))->capitalized_name; |
| 129 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); | 131 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); |
| 130 // oneofCase_ and oneof_ | 132 // oneofCase_ and oneof_ |
| 131 printer->Print(vars, | 133 printer->Print(vars, |
| 132 "private int $oneof_name$Case_ = 0;\n" | 134 "private int $oneof_name$Case_ = 0;\n" |
| 133 "private java.lang.Object $oneof_name$_;\n"); | 135 "private java.lang.Object $oneof_name$_;\n"); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 "public final Builder setUnknownFields(\n" | 176 "public final Builder setUnknownFields(\n" |
| 175 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" | 177 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 176 " return this;\n" | 178 " return this;\n" |
| 177 "}\n" | 179 "}\n" |
| 178 "\n" | 180 "\n" |
| 179 "public final Builder mergeUnknownFields(\n" | 181 "public final Builder mergeUnknownFields(\n" |
| 180 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" | 182 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 181 " return this;\n" | 183 " return this;\n" |
| 182 "}\n" | 184 "}\n" |
| 183 "\n"); | 185 "\n"); |
| 186 } else { |
| 187 // Override methods declared in GeneratedMessage to return the concrete |
| 188 // generated type so callsites won't depend on GeneratedMessage. This |
| 189 // is needed to keep binary compatibility when we change generated code |
| 190 // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release |
| 191 // we changed all generated code to subclass GeneratedMessageV3). |
| 192 printer->Print( |
| 193 "public final Builder setUnknownFields(\n" |
| 194 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 195 " return super.setUnknownFields(unknownFields);\n" |
| 196 "}\n" |
| 197 "\n" |
| 198 "public final Builder mergeUnknownFields(\n" |
| 199 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 200 " return super.mergeUnknownFields(unknownFields);\n" |
| 201 "}\n" |
| 202 "\n"); |
| 184 } | 203 } |
| 185 | 204 |
| 186 printer->Print( | 205 printer->Print( |
| 187 "\n" | 206 "\n" |
| 188 "// @@protoc_insertion_point(builder_scope:$full_name$)\n", | 207 "// @@protoc_insertion_point(builder_scope:$full_name$)\n", |
| 189 "full_name", descriptor_->full_name()); | 208 "full_name", descriptor_->full_name()); |
| 190 | 209 |
| 191 printer->Outdent(); | 210 printer->Outdent(); |
| 192 printer->Print("}\n"); | 211 printer->Print("}\n"); |
| 193 } | 212 } |
| 194 | 213 |
| 195 // =================================================================== | 214 // =================================================================== |
| 196 | 215 |
| 197 void MessageBuilderGenerator:: | 216 void MessageBuilderGenerator:: |
| 198 GenerateDescriptorMethods(io::Printer* printer) { | 217 GenerateDescriptorMethods(io::Printer* printer) { |
| 199 if (!descriptor_->options().no_standard_descriptor_accessor()) { | 218 if (!descriptor_->options().no_standard_descriptor_accessor()) { |
| 200 printer->Print( | 219 printer->Print( |
| 201 "public static final com.google.protobuf.Descriptors.Descriptor\n" | 220 "public static final com.google.protobuf.Descriptors.Descriptor\n" |
| 202 " getDescriptor() {\n" | 221 " getDescriptor() {\n" |
| 203 " return $fileclass$.internal_$identifier$_descriptor;\n" | 222 " return $fileclass$.internal_$identifier$_descriptor;\n" |
| 204 "}\n" | 223 "}\n" |
| 205 "\n", | 224 "\n", |
| 206 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), | 225 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), |
| 207 "identifier", UniqueFileScopeIdentifier(descriptor_)); | 226 "identifier", UniqueFileScopeIdentifier(descriptor_)); |
| 208 } | 227 } |
| 209 vector<const FieldDescriptor*> map_fields; | 228 std::vector<const FieldDescriptor*> map_fields; |
| 210 for (int i = 0; i < descriptor_->field_count(); i++) { | 229 for (int i = 0; i < descriptor_->field_count(); i++) { |
| 211 const FieldDescriptor* field = descriptor_->field(i); | 230 const FieldDescriptor* field = descriptor_->field(i); |
| 212 if (GetJavaType(field) == JAVATYPE_MESSAGE && | 231 if (GetJavaType(field) == JAVATYPE_MESSAGE && |
| 213 IsMapEntry(field->message_type())) { | 232 IsMapEntry(field->message_type())) { |
| 214 map_fields.push_back(field); | 233 map_fields.push_back(field); |
| 215 } | 234 } |
| 216 } | 235 } |
| 217 if (!map_fields.empty()) { | 236 if (!map_fields.empty()) { |
| 218 printer->Print( | 237 printer->Print( |
| 219 "@SuppressWarnings({\"rawtypes\"})\n" | 238 "@SuppressWarnings({\"rawtypes\"})\n" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 261 "default:\n" | 280 "default:\n" |
| 262 " throw new RuntimeException(\n" | 281 " throw new RuntimeException(\n" |
| 263 " \"Invalid map field number: \" + number);\n"); | 282 " \"Invalid map field number: \" + number);\n"); |
| 264 printer->Outdent(); | 283 printer->Outdent(); |
| 265 printer->Outdent(); | 284 printer->Outdent(); |
| 266 printer->Print( | 285 printer->Print( |
| 267 " }\n" | 286 " }\n" |
| 268 "}\n"); | 287 "}\n"); |
| 269 } | 288 } |
| 270 printer->Print( | 289 printer->Print( |
| 271 "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n" | 290 "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" |
| 272 " internalGetFieldAccessorTable() {\n" | 291 " internalGetFieldAccessorTable() {\n" |
| 273 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" | 292 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" |
| 274 " .ensureFieldAccessorsInitialized(\n" | 293 " .ensureFieldAccessorsInitialized(\n" |
| 275 " $classname$.class, $classname$.Builder.class);\n" | 294 " $classname$.class, $classname$.Builder.class);\n" |
| 276 "}\n" | 295 "}\n" |
| 277 "\n", | 296 "\n", |
| 278 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 297 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 279 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), | 298 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), |
| 280 "identifier", UniqueFileScopeIdentifier(descriptor_)); | 299 "identifier", UniqueFileScopeIdentifier(descriptor_), |
| 300 "ver", GeneratedCodeVersionSuffix()); |
| 281 } | 301 } |
| 282 | 302 |
| 283 // =================================================================== | 303 // =================================================================== |
| 284 | 304 |
| 285 void MessageBuilderGenerator:: | 305 void MessageBuilderGenerator:: |
| 286 GenerateCommonBuilderMethods(io::Printer* printer) { | 306 GenerateCommonBuilderMethods(io::Printer* printer) { |
| 287 printer->Print( | 307 printer->Print( |
| 288 "// Construct using $classname$.newBuilder()\n" | 308 "// Construct using $classname$.newBuilder()\n" |
| 289 "private Builder() {\n" | 309 "private Builder() {\n" |
| 290 " maybeForceBuilderInitialization();\n" | 310 " maybeForceBuilderInitialization();\n" |
| 291 "}\n" | 311 "}\n" |
| 292 "\n", | 312 "\n", |
| 293 "classname", name_resolver_->GetImmutableClassName(descriptor_)); | 313 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 294 | 314 |
| 295 printer->Print( | 315 printer->Print( |
| 296 "private Builder(\n" | 316 "private Builder(\n" |
| 297 " com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n" | 317 " com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n" |
| 298 " super(parent);\n" | 318 " super(parent);\n" |
| 299 " maybeForceBuilderInitialization();\n" | 319 " maybeForceBuilderInitialization();\n" |
| 300 "}\n", | 320 "}\n", |
| 301 "classname", name_resolver_->GetImmutableClassName(descriptor_)); | 321 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 322 "ver", GeneratedCodeVersionSuffix()); |
| 302 | 323 |
| 303 printer->Print( | 324 printer->Print( |
| 304 "private void maybeForceBuilderInitialization() {\n" | 325 "private void maybeForceBuilderInitialization() {\n" |
| 305 " if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n"); | 326 " if (com.google.protobuf.GeneratedMessage$ver$\n" |
| 327 " .alwaysUseFieldBuilders) {\n", |
| 328 "ver", GeneratedCodeVersionSuffix()); |
| 306 | 329 |
| 307 printer->Indent(); | 330 printer->Indent(); |
| 308 printer->Indent(); | 331 printer->Indent(); |
| 309 for (int i = 0; i < descriptor_->field_count(); i++) { | 332 for (int i = 0; i < descriptor_->field_count(); i++) { |
| 310 if (!descriptor_->field(i)->containing_oneof()) { | 333 if (!descriptor_->field(i)->containing_oneof()) { |
| 311 field_generators_.get(descriptor_->field(i)) | 334 field_generators_.get(descriptor_->field(i)) |
| 312 .GenerateFieldBuilderInitializationCode(printer); | 335 .GenerateFieldBuilderInitializationCode(printer); |
| 313 } | 336 } |
| 314 } | 337 } |
| 315 printer->Outdent(); | 338 printer->Outdent(); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 | 454 |
| 432 printer->Print( | 455 printer->Print( |
| 433 " onBuilt();\n"); | 456 " onBuilt();\n"); |
| 434 | 457 |
| 435 printer->Print( | 458 printer->Print( |
| 436 " return result;\n" | 459 " return result;\n" |
| 437 "}\n" | 460 "}\n" |
| 438 "\n", | 461 "\n", |
| 439 "classname", name_resolver_->GetImmutableClassName(descriptor_)); | 462 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 440 | 463 |
| 464 // Override methods declared in GeneratedMessage to return the concrete |
| 465 // generated type so callsites won't depend on GeneratedMessage. This |
| 466 // is needed to keep binary compatibility when we change generated code |
| 467 // to subclass a different GeneratedMessage class (e.g., in v3.0.0 release |
| 468 // we changed all generated code to subclass GeneratedMessageV3). |
| 469 printer->Print( |
| 470 "public Builder clone() {\n" |
| 471 " return (Builder) super.clone();\n" |
| 472 "}\n" |
| 473 "public Builder setField(\n" |
| 474 " com.google.protobuf.Descriptors.FieldDescriptor field,\n" |
| 475 " Object value) {\n" |
| 476 " return (Builder) super.setField(field, value);\n" |
| 477 "}\n" |
| 478 "public Builder clearField(\n" |
| 479 " com.google.protobuf.Descriptors.FieldDescriptor field) {\n" |
| 480 " return (Builder) super.clearField(field);\n" |
| 481 "}\n" |
| 482 "public Builder clearOneof(\n" |
| 483 " com.google.protobuf.Descriptors.OneofDescriptor oneof) {\n" |
| 484 " return (Builder) super.clearOneof(oneof);\n" |
| 485 "}\n" |
| 486 "public Builder setRepeatedField(\n" |
| 487 " com.google.protobuf.Descriptors.FieldDescriptor field,\n" |
| 488 " int index, Object value) {\n" |
| 489 " return (Builder) super.setRepeatedField(field, index, value);\n" |
| 490 "}\n" |
| 491 "public Builder addRepeatedField(\n" |
| 492 " com.google.protobuf.Descriptors.FieldDescriptor field,\n" |
| 493 " Object value) {\n" |
| 494 " return (Builder) super.addRepeatedField(field, value);\n" |
| 495 "}\n"); |
| 496 |
| 497 if (descriptor_->extension_range_count() > 0) { |
| 498 printer->Print( |
| 499 "public <Type> Builder setExtension(\n" |
| 500 " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" |
| 501 " $classname$, Type> extension,\n" |
| 502 " Type value) {\n" |
| 503 " return (Builder) super.setExtension(extension, value);\n" |
| 504 "}\n" |
| 505 "public <Type> Builder setExtension(\n" |
| 506 " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" |
| 507 " $classname$, java.util.List<Type>> extension,\n" |
| 508 " int index, Type value) {\n" |
| 509 " return (Builder) super.setExtension(extension, index, value);\n" |
| 510 "}\n" |
| 511 "public <Type> Builder addExtension(\n" |
| 512 " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" |
| 513 " $classname$, java.util.List<Type>> extension,\n" |
| 514 " Type value) {\n" |
| 515 " return (Builder) super.addExtension(extension, value);\n" |
| 516 "}\n" |
| 517 "public <Type> Builder clearExtension(\n" |
| 518 " com.google.protobuf.GeneratedMessage.GeneratedExtension<\n" |
| 519 " $classname$, ?> extension) {\n" |
| 520 " return (Builder) super.clearExtension(extension);\n" |
| 521 "}\n", |
| 522 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 523 } |
| 524 |
| 441 // ----------------------------------------------------------------- | 525 // ----------------------------------------------------------------- |
| 442 | 526 |
| 443 if (context_->HasGeneratedMethods(descriptor_)) { | 527 if (context_->HasGeneratedMethods(descriptor_)) { |
| 444 printer->Print( | 528 printer->Print( |
| 445 "public Builder mergeFrom(com.google.protobuf.Message other) {\n" | 529 "public Builder mergeFrom(com.google.protobuf.Message other) {\n" |
| 446 " if (other instanceof $classname$) {\n" | 530 " if (other instanceof $classname$) {\n" |
| 447 " return mergeFrom(($classname$)other);\n" | 531 " return mergeFrom(($classname$)other);\n" |
| 448 " } else {\n" | 532 " } else {\n" |
| 449 " super.mergeFrom(other);\n" | 533 " super.mergeFrom(other);\n" |
| 450 " return this;\n" | 534 " return this;\n" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 608 printer->Print( | 692 printer->Print( |
| 609 " if (!get$name$().isInitialized()) {\n" | 693 " if (!get$name$().isInitialized()) {\n" |
| 610 " return false;\n" | 694 " return false;\n" |
| 611 " }\n" | 695 " }\n" |
| 612 "}\n", | 696 "}\n", |
| 613 "name", info->capitalized_name); | 697 "name", info->capitalized_name); |
| 614 break; | 698 break; |
| 615 case FieldDescriptor::LABEL_REPEATED: | 699 case FieldDescriptor::LABEL_REPEATED: |
| 616 if (IsMapEntry(field->message_type())) { | 700 if (IsMapEntry(field->message_type())) { |
| 617 printer->Print( | 701 printer->Print( |
| 618 "for ($type$ item : get$name$().values()) {\n" | 702 "for ($type$ item : get$name$Map().values()) {\n" |
| 619 " if (!item.isInitialized()) {\n" | 703 " if (!item.isInitialized()) {\n" |
| 620 " return false;\n" | 704 " return false;\n" |
| 621 " }\n" | 705 " }\n" |
| 622 "}\n", | 706 "}\n", |
| 623 "type", MapValueImmutableClassdName(field->message_type(), | 707 "type", MapValueImmutableClassdName(field->message_type(), |
| 624 name_resolver_), | 708 name_resolver_), |
| 625 "name", info->capitalized_name); | 709 "name", info->capitalized_name); |
| 626 } else { | 710 } else { |
| 627 printer->Print( | 711 printer->Print( |
| 628 "for (int i = 0; i < get$name$Count(); i++) {\n" | 712 "for (int i = 0; i < get$name$Count(); i++) {\n" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 653 "}\n" | 737 "}\n" |
| 654 "\n"); | 738 "\n"); |
| 655 } | 739 } |
| 656 | 740 |
| 657 // =================================================================== | 741 // =================================================================== |
| 658 | 742 |
| 659 } // namespace java | 743 } // namespace java |
| 660 } // namespace compiler | 744 } // namespace compiler |
| 661 } // namespace protobuf | 745 } // namespace protobuf |
| 662 } // namespace google | 746 } // namespace google |
| OLD | NEW |