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 |