| 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$ver$.ExtendableBuilder<\n" | 97 " com.google.protobuf.GeneratedMessage.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()); | |
| 104 } else { | 103 } else { |
| 105 printer->Print( | 104 printer->Print( |
| 106 "public static final class Builder extends\n" | 105 "public static final class Builder extends\n" |
| 107 " com.google.protobuf.GeneratedMessage$ver$.Builder<Builder> implements
\n" | 106 " com.google.protobuf.GeneratedMessage.Builder<Builder> implements\n" |
| 108 " $extra_interfaces$\n" | 107 " $extra_interfaces$\n" |
| 109 " $classname$OrBuilder {\n", | 108 " $classname$OrBuilder {\n", |
| 110 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 109 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 111 "extra_interfaces", ExtraBuilderInterfaces(descriptor_), | 110 "extra_interfaces", ExtraBuilderInterfaces(descriptor_)); |
| 112 "ver", GeneratedCodeVersionSuffix()); | |
| 113 } | 111 } |
| 114 printer->Indent(); | 112 printer->Indent(); |
| 115 | 113 |
| 116 GenerateDescriptorMethods(printer); | 114 GenerateDescriptorMethods(printer); |
| 117 GenerateCommonBuilderMethods(printer); | 115 GenerateCommonBuilderMethods(printer); |
| 118 | 116 |
| 119 if (context_->HasGeneratedMethods(descriptor_)) { | 117 if (context_->HasGeneratedMethods(descriptor_)) { |
| 120 GenerateIsInitialized(printer); | 118 GenerateIsInitialized(printer); |
| 121 GenerateBuilderParsingMethods(printer); | 119 GenerateBuilderParsingMethods(printer); |
| 122 } | 120 } |
| 123 | 121 |
| 124 // oneof | 122 // oneof |
| 125 std::map<string, string> vars; | 123 map<string, string> vars; |
| 126 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { | 124 for (int i = 0; i < descriptor_->oneof_decl_count(); i++) { |
| 127 vars["oneof_name"] = context_->GetOneofGeneratorInfo( | 125 vars["oneof_name"] = context_->GetOneofGeneratorInfo( |
| 128 descriptor_->oneof_decl(i))->name; | 126 descriptor_->oneof_decl(i))->name; |
| 129 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( | 127 vars["oneof_capitalized_name"] = context_->GetOneofGeneratorInfo( |
| 130 descriptor_->oneof_decl(i))->capitalized_name; | 128 descriptor_->oneof_decl(i))->capitalized_name; |
| 131 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); | 129 vars["oneof_index"] = SimpleItoa(descriptor_->oneof_decl(i)->index()); |
| 132 // oneofCase_ and oneof_ | 130 // oneofCase_ and oneof_ |
| 133 printer->Print(vars, | 131 printer->Print(vars, |
| 134 "private int $oneof_name$Case_ = 0;\n" | 132 "private int $oneof_name$Case_ = 0;\n" |
| 135 "private java.lang.Object $oneof_name$_;\n"); | 133 "private java.lang.Object $oneof_name$_;\n"); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 176 "public final Builder setUnknownFields(\n" | 174 "public final Builder setUnknownFields(\n" |
| 177 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" | 175 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 178 " return this;\n" | 176 " return this;\n" |
| 179 "}\n" | 177 "}\n" |
| 180 "\n" | 178 "\n" |
| 181 "public final Builder mergeUnknownFields(\n" | 179 "public final Builder mergeUnknownFields(\n" |
| 182 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" | 180 " final com.google.protobuf.UnknownFieldSet unknownFields) {\n" |
| 183 " return this;\n" | 181 " return this;\n" |
| 184 "}\n" | 182 "}\n" |
| 185 "\n"); | 183 "\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"); | |
| 203 } | 184 } |
| 204 | 185 |
| 205 printer->Print( | 186 printer->Print( |
| 206 "\n" | 187 "\n" |
| 207 "// @@protoc_insertion_point(builder_scope:$full_name$)\n", | 188 "// @@protoc_insertion_point(builder_scope:$full_name$)\n", |
| 208 "full_name", descriptor_->full_name()); | 189 "full_name", descriptor_->full_name()); |
| 209 | 190 |
| 210 printer->Outdent(); | 191 printer->Outdent(); |
| 211 printer->Print("}\n"); | 192 printer->Print("}\n"); |
| 212 } | 193 } |
| 213 | 194 |
| 214 // =================================================================== | 195 // =================================================================== |
| 215 | 196 |
| 216 void MessageBuilderGenerator:: | 197 void MessageBuilderGenerator:: |
| 217 GenerateDescriptorMethods(io::Printer* printer) { | 198 GenerateDescriptorMethods(io::Printer* printer) { |
| 218 if (!descriptor_->options().no_standard_descriptor_accessor()) { | 199 if (!descriptor_->options().no_standard_descriptor_accessor()) { |
| 219 printer->Print( | 200 printer->Print( |
| 220 "public static final com.google.protobuf.Descriptors.Descriptor\n" | 201 "public static final com.google.protobuf.Descriptors.Descriptor\n" |
| 221 " getDescriptor() {\n" | 202 " getDescriptor() {\n" |
| 222 " return $fileclass$.internal_$identifier$_descriptor;\n" | 203 " return $fileclass$.internal_$identifier$_descriptor;\n" |
| 223 "}\n" | 204 "}\n" |
| 224 "\n", | 205 "\n", |
| 225 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), | 206 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), |
| 226 "identifier", UniqueFileScopeIdentifier(descriptor_)); | 207 "identifier", UniqueFileScopeIdentifier(descriptor_)); |
| 227 } | 208 } |
| 228 std::vector<const FieldDescriptor*> map_fields; | 209 vector<const FieldDescriptor*> map_fields; |
| 229 for (int i = 0; i < descriptor_->field_count(); i++) { | 210 for (int i = 0; i < descriptor_->field_count(); i++) { |
| 230 const FieldDescriptor* field = descriptor_->field(i); | 211 const FieldDescriptor* field = descriptor_->field(i); |
| 231 if (GetJavaType(field) == JAVATYPE_MESSAGE && | 212 if (GetJavaType(field) == JAVATYPE_MESSAGE && |
| 232 IsMapEntry(field->message_type())) { | 213 IsMapEntry(field->message_type())) { |
| 233 map_fields.push_back(field); | 214 map_fields.push_back(field); |
| 234 } | 215 } |
| 235 } | 216 } |
| 236 if (!map_fields.empty()) { | 217 if (!map_fields.empty()) { |
| 237 printer->Print( | 218 printer->Print( |
| 238 "@SuppressWarnings({\"rawtypes\"})\n" | 219 "@SuppressWarnings({\"rawtypes\"})\n" |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 280 "default:\n" | 261 "default:\n" |
| 281 " throw new RuntimeException(\n" | 262 " throw new RuntimeException(\n" |
| 282 " \"Invalid map field number: \" + number);\n"); | 263 " \"Invalid map field number: \" + number);\n"); |
| 283 printer->Outdent(); | 264 printer->Outdent(); |
| 284 printer->Outdent(); | 265 printer->Outdent(); |
| 285 printer->Print( | 266 printer->Print( |
| 286 " }\n" | 267 " }\n" |
| 287 "}\n"); | 268 "}\n"); |
| 288 } | 269 } |
| 289 printer->Print( | 270 printer->Print( |
| 290 "protected com.google.protobuf.GeneratedMessage$ver$.FieldAccessorTable\n" | 271 "protected com.google.protobuf.GeneratedMessage.FieldAccessorTable\n" |
| 291 " internalGetFieldAccessorTable() {\n" | 272 " internalGetFieldAccessorTable() {\n" |
| 292 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" | 273 " return $fileclass$.internal_$identifier$_fieldAccessorTable\n" |
| 293 " .ensureFieldAccessorsInitialized(\n" | 274 " .ensureFieldAccessorsInitialized(\n" |
| 294 " $classname$.class, $classname$.Builder.class);\n" | 275 " $classname$.class, $classname$.Builder.class);\n" |
| 295 "}\n" | 276 "}\n" |
| 296 "\n", | 277 "\n", |
| 297 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 278 "classname", name_resolver_->GetImmutableClassName(descriptor_), |
| 298 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), | 279 "fileclass", name_resolver_->GetImmutableClassName(descriptor_->file()), |
| 299 "identifier", UniqueFileScopeIdentifier(descriptor_), | 280 "identifier", UniqueFileScopeIdentifier(descriptor_)); |
| 300 "ver", GeneratedCodeVersionSuffix()); | |
| 301 } | 281 } |
| 302 | 282 |
| 303 // =================================================================== | 283 // =================================================================== |
| 304 | 284 |
| 305 void MessageBuilderGenerator:: | 285 void MessageBuilderGenerator:: |
| 306 GenerateCommonBuilderMethods(io::Printer* printer) { | 286 GenerateCommonBuilderMethods(io::Printer* printer) { |
| 307 printer->Print( | 287 printer->Print( |
| 308 "// Construct using $classname$.newBuilder()\n" | 288 "// Construct using $classname$.newBuilder()\n" |
| 309 "private Builder() {\n" | 289 "private Builder() {\n" |
| 310 " maybeForceBuilderInitialization();\n" | 290 " maybeForceBuilderInitialization();\n" |
| 311 "}\n" | 291 "}\n" |
| 312 "\n", | 292 "\n", |
| 313 "classname", name_resolver_->GetImmutableClassName(descriptor_)); | 293 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 314 | 294 |
| 315 printer->Print( | 295 printer->Print( |
| 316 "private Builder(\n" | 296 "private Builder(\n" |
| 317 " com.google.protobuf.GeneratedMessage$ver$.BuilderParent parent) {\n" | 297 " com.google.protobuf.GeneratedMessage.BuilderParent parent) {\n" |
| 318 " super(parent);\n" | 298 " super(parent);\n" |
| 319 " maybeForceBuilderInitialization();\n" | 299 " maybeForceBuilderInitialization();\n" |
| 320 "}\n", | 300 "}\n", |
| 321 "classname", name_resolver_->GetImmutableClassName(descriptor_), | 301 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 322 "ver", GeneratedCodeVersionSuffix()); | |
| 323 | 302 |
| 324 printer->Print( | 303 printer->Print( |
| 325 "private void maybeForceBuilderInitialization() {\n" | 304 "private void maybeForceBuilderInitialization() {\n" |
| 326 " if (com.google.protobuf.GeneratedMessage$ver$\n" | 305 " if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {\n"); |
| 327 " .alwaysUseFieldBuilders) {\n", | |
| 328 "ver", GeneratedCodeVersionSuffix()); | |
| 329 | 306 |
| 330 printer->Indent(); | 307 printer->Indent(); |
| 331 printer->Indent(); | 308 printer->Indent(); |
| 332 for (int i = 0; i < descriptor_->field_count(); i++) { | 309 for (int i = 0; i < descriptor_->field_count(); i++) { |
| 333 if (!descriptor_->field(i)->containing_oneof()) { | 310 if (!descriptor_->field(i)->containing_oneof()) { |
| 334 field_generators_.get(descriptor_->field(i)) | 311 field_generators_.get(descriptor_->field(i)) |
| 335 .GenerateFieldBuilderInitializationCode(printer); | 312 .GenerateFieldBuilderInitializationCode(printer); |
| 336 } | 313 } |
| 337 } | 314 } |
| 338 printer->Outdent(); | 315 printer->Outdent(); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 | 431 |
| 455 printer->Print( | 432 printer->Print( |
| 456 " onBuilt();\n"); | 433 " onBuilt();\n"); |
| 457 | 434 |
| 458 printer->Print( | 435 printer->Print( |
| 459 " return result;\n" | 436 " return result;\n" |
| 460 "}\n" | 437 "}\n" |
| 461 "\n", | 438 "\n", |
| 462 "classname", name_resolver_->GetImmutableClassName(descriptor_)); | 439 "classname", name_resolver_->GetImmutableClassName(descriptor_)); |
| 463 | 440 |
| 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 | |
| 525 // ----------------------------------------------------------------- | 441 // ----------------------------------------------------------------- |
| 526 | 442 |
| 527 if (context_->HasGeneratedMethods(descriptor_)) { | 443 if (context_->HasGeneratedMethods(descriptor_)) { |
| 528 printer->Print( | 444 printer->Print( |
| 529 "public Builder mergeFrom(com.google.protobuf.Message other) {\n" | 445 "public Builder mergeFrom(com.google.protobuf.Message other) {\n" |
| 530 " if (other instanceof $classname$) {\n" | 446 " if (other instanceof $classname$) {\n" |
| 531 " return mergeFrom(($classname$)other);\n" | 447 " return mergeFrom(($classname$)other);\n" |
| 532 " } else {\n" | 448 " } else {\n" |
| 533 " super.mergeFrom(other);\n" | 449 " super.mergeFrom(other);\n" |
| 534 " return this;\n" | 450 " return this;\n" |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 692 printer->Print( | 608 printer->Print( |
| 693 " if (!get$name$().isInitialized()) {\n" | 609 " if (!get$name$().isInitialized()) {\n" |
| 694 " return false;\n" | 610 " return false;\n" |
| 695 " }\n" | 611 " }\n" |
| 696 "}\n", | 612 "}\n", |
| 697 "name", info->capitalized_name); | 613 "name", info->capitalized_name); |
| 698 break; | 614 break; |
| 699 case FieldDescriptor::LABEL_REPEATED: | 615 case FieldDescriptor::LABEL_REPEATED: |
| 700 if (IsMapEntry(field->message_type())) { | 616 if (IsMapEntry(field->message_type())) { |
| 701 printer->Print( | 617 printer->Print( |
| 702 "for ($type$ item : get$name$Map().values()) {\n" | 618 "for ($type$ item : get$name$().values()) {\n" |
| 703 " if (!item.isInitialized()) {\n" | 619 " if (!item.isInitialized()) {\n" |
| 704 " return false;\n" | 620 " return false;\n" |
| 705 " }\n" | 621 " }\n" |
| 706 "}\n", | 622 "}\n", |
| 707 "type", MapValueImmutableClassdName(field->message_type(), | 623 "type", MapValueImmutableClassdName(field->message_type(), |
| 708 name_resolver_), | 624 name_resolver_), |
| 709 "name", info->capitalized_name); | 625 "name", info->capitalized_name); |
| 710 } else { | 626 } else { |
| 711 printer->Print( | 627 printer->Print( |
| 712 "for (int i = 0; i < get$name$Count(); i++) {\n" | 628 "for (int i = 0; i < get$name$Count(); i++) {\n" |
| (...skipping 24 matching lines...) Expand all Loading... |
| 737 "}\n" | 653 "}\n" |
| 738 "\n"); | 654 "\n"); |
| 739 } | 655 } |
| 740 | 656 |
| 741 // =================================================================== | 657 // =================================================================== |
| 742 | 658 |
| 743 } // namespace java | 659 } // namespace java |
| 744 } // namespace compiler | 660 } // namespace compiler |
| 745 } // namespace protobuf | 661 } // namespace protobuf |
| 746 } // namespace google | 662 } // namespace google |
| OLD | NEW |