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 |