blob: 6e29a40bf8745047ff72a21288377331a46d4d27 [file] [log] [blame]
jieluo@google.com4de8f552014-07-18 00:47:59 +00001// Protocol Buffers - Google's data interchange format
2// Copyright 2008 Google Inc. All rights reserved.
Feng Xiaoe4288622014-10-01 16:26:23 -07003// https://developers.google.com/protocol-buffers/
jieluo@google.com4de8f552014-07-18 00:47:59 +00004//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright
10// notice, this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above
12// copyright notice, this list of conditions and the following disclaimer
13// in the documentation and/or other materials provided with the
14// distribution.
15// * Neither the name of Google Inc. nor the names of its
16// contributors may be used to endorse or promote products derived from
17// this software without specific prior written permission.
18//
19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31// Author: niwasaki@google.com (Naoki Iwasaki)
32// Based on original Protocol Buffers design by
33// Sanjay Ghemawat, Jeff Dean, and others.
34
35#include <google/protobuf/compiler/java/java_context.h>
36#include <google/protobuf/compiler/java/java_lazy_message_field.h>
37#include <google/protobuf/compiler/java/java_doc_comment.h>
38#include <google/protobuf/compiler/java/java_helpers.h>
39#include <google/protobuf/io/printer.h>
40
41namespace google {
42namespace protobuf {
43namespace compiler {
44namespace java {
45
46ImmutableLazyMessageFieldGenerator::
47ImmutableLazyMessageFieldGenerator(
48 const FieldDescriptor* descriptor,
49 int messageBitIndex,
50 int builderBitIndex,
51 Context* context)
52 : ImmutableMessageFieldGenerator(
53 descriptor, messageBitIndex, builderBitIndex, context) {
54}
55
56ImmutableLazyMessageFieldGenerator::~ImmutableLazyMessageFieldGenerator() {}
57
58void ImmutableLazyMessageFieldGenerator::
59GenerateMembers(io::Printer* printer) const {
60 printer->Print(variables_,
61 "private com.google.protobuf.LazyFieldLite $name$_ =\n"
62 " new com.google.protobuf.LazyFieldLite();\n");
63
64 PrintExtraFieldInfo(variables_, printer);
65 WriteFieldDocComment(printer, descriptor_);
66 printer->Print(variables_,
67 "$deprecation$public boolean has$capitalized_name$() {\n"
68 " return $get_has_field_bit_message$;\n"
69 "}\n");
70 WriteFieldDocComment(printer, descriptor_);
71
72 printer->Print(variables_,
73 "$deprecation$public $type$ get$capitalized_name$() {\n"
74 " return ($type$) $name$_.getValue($type$.getDefaultInstance());\n"
75 "}\n");
76 if (HasNestedBuilders(descriptor_->containing_type())) {
77 WriteFieldDocComment(printer, descriptor_);
78 printer->Print(variables_,
79 "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
80 " return $name$_;\n"
81 "}\n");
82 }
83}
84
85void ImmutableLazyMessageFieldGenerator::
86GenerateBuilderMembers(io::Printer* printer) const {
87 // When using nested-builders, the code initially works just like the
88 // non-nested builder case. It only creates a nested builder lazily on
89 // demand and then forever delegates to it after creation.
90
91 printer->Print(variables_,
92 "private com.google.protobuf.LazyFieldLite $name$_ =\n"
93 " new com.google.protobuf.LazyFieldLite();\n");
94
95 if (HasNestedBuilders(descriptor_->containing_type())) {
96 printer->Print(variables_,
97 // If this builder is non-null, it is used and the other fields are
98 // ignored.
99 "private com.google.protobuf.SingleFieldBuilder<\n"
100 " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
101 "\n");
102 }
103
104 // The comments above the methods below are based on a hypothetical
105 // field of type "Field" called "Field".
106
107 // boolean hasField()
108 WriteFieldDocComment(printer, descriptor_);
109 printer->Print(variables_,
110 "$deprecation$public boolean has$capitalized_name$() {\n"
111 " return $get_has_field_bit_builder$;\n"
112 "}\n");
113
114 printer->Print(variables_,
115 "$deprecation$public $type$ get$capitalized_name$() {\n"
116 " return ($type$) $name$_.getValue($type$.getDefaultInstance());\n"
117 "}\n");
118
119 // Field.Builder setField(Field value)
120 WriteFieldDocComment(printer, descriptor_);
121 PrintNestedBuilderFunction(printer,
122 "$deprecation$public Builder set$capitalized_name$($type$ value)",
123
124 "if (value == null) {\n"
125 " throw new NullPointerException();\n"
126 "}\n"
127 "$name$_.setValue(value);\n"
128 "$on_changed$\n",
129
130 NULL, // Lazy fields are supported only for lite-runtime.
131
132 "$set_has_field_bit_builder$;\n"
133 "return this;\n");
134
135 // Field.Builder setField(Field.Builder builderForValue)
136 WriteFieldDocComment(printer, descriptor_);
137 PrintNestedBuilderFunction(printer,
138 "$deprecation$public Builder set$capitalized_name$(\n"
139 " $type$.Builder builderForValue)",
140
141 "$name$_.setValue(builderForValue.build());\n"
142 "$on_changed$\n",
143
144 NULL,
145
146 "$set_has_field_bit_builder$;\n"
147 "return this;\n");
148
149 // Field.Builder mergeField(Field value)
150 WriteFieldDocComment(printer, descriptor_);
151 PrintNestedBuilderFunction(printer,
152 "$deprecation$public Builder merge$capitalized_name$($type$ value)",
153
154 "if ($get_has_field_bit_builder$ &&\n"
155 " !$name$_.containsDefaultInstance()) {\n"
156 " $name$_.setValue(\n"
157 " $type$.newBuilder(\n"
158 " get$capitalized_name$()).mergeFrom(value).buildPartial());\n"
159 "} else {\n"
160 " $name$_.setValue(value);\n"
161 "}\n"
162 "$on_changed$\n",
163
164 NULL,
165
166 "$set_has_field_bit_builder$;\n"
167 "return this;\n");
168
169 // Field.Builder clearField()
170 WriteFieldDocComment(printer, descriptor_);
171 PrintNestedBuilderFunction(printer,
172 "$deprecation$public Builder clear$capitalized_name$()",
173
174 "$name$_.clear();\n"
175 "$on_changed$\n",
176
177 NULL,
178
179 "$clear_has_field_bit_builder$;\n"
180 "return this;\n");
181
182 if (HasNestedBuilders(descriptor_->containing_type())) {
183 WriteFieldDocComment(printer, descriptor_);
184 printer->Print(variables_,
185 "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
186 " $set_has_field_bit_builder$;\n"
187 " $on_changed$\n"
188 " return get$capitalized_name$FieldBuilder().getBuilder();\n"
189 "}\n");
190 WriteFieldDocComment(printer, descriptor_);
191 printer->Print(variables_,
192 "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
193 " if ($name$Builder_ != null) {\n"
194 " return $name$Builder_.getMessageOrBuilder();\n"
195 " } else {\n"
196 " return $name$_;\n"
197 " }\n"
198 "}\n");
199 WriteFieldDocComment(printer, descriptor_);
200 printer->Print(variables_,
201 "private com.google.protobuf.SingleFieldBuilder<\n"
202 " $type$, $type$.Builder, $type$OrBuilder> \n"
203 " get$capitalized_name$FieldBuilder() {\n"
204 " if ($name$Builder_ == null) {\n"
205 " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
206 " $type$, $type$.Builder, $type$OrBuilder>(\n"
207 " $name$_,\n"
208 " getParentForChildren(),\n"
209 " isClean());\n"
210 " $name$_ = null;\n"
211 " }\n"
212 " return $name$Builder_;\n"
213 "}\n");
214 }
215}
216
217
218void ImmutableLazyMessageFieldGenerator::
219GenerateInitializationCode(io::Printer* printer) const {
220 printer->Print(variables_, "$name$_.clear();\n");
221}
222
223void ImmutableLazyMessageFieldGenerator::
224GenerateBuilderClearCode(io::Printer* printer) const {
225 printer->Print(variables_, "$name$_.clear();\n");
226 printer->Print(variables_, "$clear_has_field_bit_builder$;\n");
227}
228
229void ImmutableLazyMessageFieldGenerator::
230GenerateMergingCode(io::Printer* printer) const {
231 printer->Print(variables_,
232 "if (other.has$capitalized_name$()) {\n"
233 " $name$_.merge(other.$name$_);\n"
234 " $set_has_field_bit_builder$;\n"
235 "}\n");
236}
237
238void ImmutableLazyMessageFieldGenerator::
239GenerateBuildingCode(io::Printer* printer) const {
240 printer->Print(variables_,
241 "if ($get_has_field_bit_from_local$) {\n"
242 " $set_has_field_bit_to_local$;\n"
243 "}\n");
244
245 printer->Print(variables_,
Jisi Liu885b6122015-02-28 14:51:22 -0800246 "result.$name$_.set(\n"
247 " $name$_);\n");
jieluo@google.com4de8f552014-07-18 00:47:59 +0000248}
249
250void ImmutableLazyMessageFieldGenerator::
251GenerateParsingCode(io::Printer* printer) const {
252 printer->Print(variables_,
253 "$name$_.setByteString(input.readBytes(), extensionRegistry);\n");
254 printer->Print(variables_,
255 "$set_has_field_bit_message$;\n");
256}
257
258void ImmutableLazyMessageFieldGenerator::
259GenerateSerializationCode(io::Printer* printer) const {
260 // Do not de-serialize lazy fields.
261 printer->Print(variables_,
262 "if ($get_has_field_bit_message$) {\n"
263 " output.writeBytes($number$, $name$_.toByteString());\n"
264 "}\n");
265}
266
267void ImmutableLazyMessageFieldGenerator::
268GenerateSerializedSizeCode(io::Printer* printer) const {
269 printer->Print(variables_,
270 "if ($get_has_field_bit_message$) {\n"
271 " size += com.google.protobuf.CodedOutputStream\n"
272 " .computeLazyFieldSize($number$, $name$_);\n"
273 "}\n");
274}
275
276// ===================================================================
277
278ImmutableLazyMessageOneofFieldGenerator::
279ImmutableLazyMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
280 int messageBitIndex,
281 int builderBitIndex,
282 Context* context)
283 : ImmutableLazyMessageFieldGenerator(
284 descriptor, messageBitIndex, builderBitIndex, context) {
285 const OneofGeneratorInfo* info =
286 context->GetOneofGeneratorInfo(descriptor->containing_oneof());
287 SetCommonOneofVariables(descriptor, info, &variables_);
288 variables_["lazy_type"] = "com.google.protobuf.LazyFieldLite";
289}
290
291ImmutableLazyMessageOneofFieldGenerator::
292~ImmutableLazyMessageOneofFieldGenerator() {}
293
294void ImmutableLazyMessageOneofFieldGenerator::
295GenerateMembers(io::Printer* printer) const {
296 PrintExtraFieldInfo(variables_, printer);
297 WriteFieldDocComment(printer, descriptor_);
298
299 printer->Print(variables_,
300 "$deprecation$public boolean has$capitalized_name$() {\n"
301 " return $has_oneof_case_message$;\n"
302 "}\n");
303 WriteFieldDocComment(printer, descriptor_);
304
305 printer->Print(variables_,
306 "$deprecation$public $type$ get$capitalized_name$() {\n"
307 " if ($has_oneof_case_message$) {\n"
308 " return ($type$) (($lazy_type$) $oneof_name$_).getValue(\n"
309 " $type$.getDefaultInstance());\n"
310 " }\n"
311 " return $type$.getDefaultInstance();\n"
312 "}\n");
313}
314
315void ImmutableLazyMessageOneofFieldGenerator::
316GenerateBuilderMembers(io::Printer* printer) const {
317 // boolean hasField()
318 WriteFieldDocComment(printer, descriptor_);
319 printer->Print(variables_,
320 "$deprecation$public boolean has$capitalized_name$() {\n"
321 " return $has_oneof_case_message$;\n"
322 "}\n");
323
324 printer->Print(variables_,
325 "$deprecation$public $type$ get$capitalized_name$() {\n"
326 " if ($has_oneof_case_message$) {\n"
327 " return ($type$) (($lazy_type$) $oneof_name$_).getValue(\n"
328 " $type$.getDefaultInstance());\n"
329 " }\n"
330 " return $type$.getDefaultInstance();\n"
331 "}\n");
332
333 // Field.Builder setField(Field value)
334 WriteFieldDocComment(printer, descriptor_);
335 PrintNestedBuilderFunction(printer,
336 "$deprecation$public Builder set$capitalized_name$($type$ value)",
337
338 "if (value == null) {\n"
339 " throw new NullPointerException();\n"
340 "}\n"
341 "if (!($has_oneof_case_message$)) {\n"
342 " $oneof_name$_ = new $lazy_type$();\n"
343 " $set_oneof_case_message$;\n"
344 "}\n"
345 "(($lazy_type$) $oneof_name$_).setValue(value);\n"
346 "$on_changed$\n",
347
348 NULL, // Lazy fields are supported only for lite-runtime.
349
350 "return this;\n");
351
352 // Field.Builder setField(Field.Builder builderForValue)
353 WriteFieldDocComment(printer, descriptor_);
354 PrintNestedBuilderFunction(printer,
355 "$deprecation$public Builder set$capitalized_name$(\n"
356 " $type$.Builder builderForValue)",
357
358 "if (!($has_oneof_case_message$)) {\n"
359 " $oneof_name$_ = new $lazy_type$();\n"
360 " $set_oneof_case_message$;\n"
361 "}\n"
362 "(($lazy_type$) $oneof_name$_).setValue(builderForValue.build());\n"
363 "$on_changed$\n",
364
365 NULL,
366
367 "return this;\n");
368
369 // Field.Builder mergeField(Field value)
370 WriteFieldDocComment(printer, descriptor_);
371 PrintNestedBuilderFunction(printer,
372 "$deprecation$public Builder merge$capitalized_name$($type$ value)",
373
374 "if ($has_oneof_case_message$ &&\n"
375 " !(($lazy_type$) $oneof_name$_).containsDefaultInstance()) {\n"
376 " (($lazy_type$) $oneof_name$_).setValue(\n"
377 " $type$.newBuilder(\n"
378 " get$capitalized_name$()).mergeFrom(value).buildPartial());\n"
379 "} else {\n"
380 " if (!($has_oneof_case_message$)) {\n"
381 " $oneof_name$_ = new $lazy_type$();\n"
382 " $set_oneof_case_message$;\n"
383 " }\n"
384 " (($lazy_type$) $oneof_name$_).setValue(value);\n"
385 "}\n"
386 "$on_changed$\n",
387
388 NULL,
389
390 "return this;\n");
391
392 // Field.Builder clearField()
393 WriteFieldDocComment(printer, descriptor_);
394 PrintNestedBuilderFunction(printer,
395 "$deprecation$public Builder clear$capitalized_name$()",
396
397 "if ($has_oneof_case_message$) {\n"
398 " $clear_oneof_case_message$;\n"
399 " $oneof_name$_ = null;\n"
400 " $on_changed$\n"
401 "}\n",
402
403 NULL,
404
405 "return this;\n");
406}
407
408void ImmutableLazyMessageOneofFieldGenerator::
409GenerateMergingCode(io::Printer* printer) const {
410 printer->Print(variables_,
411 "if (!($has_oneof_case_message$)) {\n"
412 " $oneof_name$_ = new $lazy_type$();\n"
413 "}\n"
414 "(($lazy_type$) $oneof_name$_).merge(\n"
415 " ($lazy_type$) other.$oneof_name$_);\n"
416 "$set_oneof_case_message$;\n");
417}
418
419void ImmutableLazyMessageOneofFieldGenerator::
420GenerateBuildingCode(io::Printer* printer) const {
421 printer->Print(variables_,
422 "if ($has_oneof_case_message$) {\n");
423 printer->Indent();
424
425 printer->Print(variables_,
426 "result.$oneof_name$_ = new $lazy_type$();\n"
Jisi Liu885b6122015-02-28 14:51:22 -0800427 "(($lazy_type$) result.$oneof_name$_).set(\n"
428 " (($lazy_type$) $oneof_name$_));\n");
jieluo@google.com4de8f552014-07-18 00:47:59 +0000429 printer->Outdent();
430 printer->Print("}\n");
431}
432
433void ImmutableLazyMessageOneofFieldGenerator::
434GenerateParsingCode(io::Printer* printer) const {
435 printer->Print(variables_,
436 "if (!($has_oneof_case_message$)) {\n"
437 " $oneof_name$_ = new $lazy_type$();\n"
438 "}\n"
439 "(($lazy_type$) $oneof_name$_).setByteString(\n"
440 " input.readBytes(), extensionRegistry);\n"
441 "$set_oneof_case_message$;\n");
442}
443
444void ImmutableLazyMessageOneofFieldGenerator::
445GenerateSerializationCode(io::Printer* printer) const {
446 // Do not de-serialize lazy fields.
447 printer->Print(variables_,
448 "if ($has_oneof_case_message$) {\n"
449 " output.writeBytes(\n"
450 " $number$, (($lazy_type$) $oneof_name$_).toByteString());\n"
451 "}\n");
452}
453
454void ImmutableLazyMessageOneofFieldGenerator::
455GenerateSerializedSizeCode(io::Printer* printer) const {
456 printer->Print(variables_,
457 "if ($has_oneof_case_message$) {\n"
458 " size += com.google.protobuf.CodedOutputStream\n"
459 " .computeLazyFieldSize($number$, ($lazy_type$) $oneof_name$_);\n"
460 "}\n");
461}
462
463// ===================================================================
464
465RepeatedImmutableLazyMessageFieldGenerator::
466RepeatedImmutableLazyMessageFieldGenerator(
467 const FieldDescriptor* descriptor,
468 int messageBitIndex,
469 int builderBitIndex,
470 Context* context)
471 : RepeatedImmutableMessageFieldGenerator(
472 descriptor, messageBitIndex, builderBitIndex, context) {
473}
474
475
476RepeatedImmutableLazyMessageFieldGenerator::
477~RepeatedImmutableLazyMessageFieldGenerator() {}
478
479void RepeatedImmutableLazyMessageFieldGenerator::
480GenerateMembers(io::Printer* printer) const {
481 printer->Print(variables_,
482 "private java.util.List<com.google.protobuf.LazyFieldLite> $name$_;\n");
483 PrintExtraFieldInfo(variables_, printer);
484 WriteFieldDocComment(printer, descriptor_);
485 printer->Print(variables_,
486 "$deprecation$public java.util.List<$type$>\n"
487 " get$capitalized_name$List() {\n"
488 " java.util.List<$type$> list =\n"
489 " new java.util.ArrayList<$type$>($name$_.size());\n"
490 " for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n"
491 " list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n"
492 " }\n"
493 " return list;\n"
494 "}\n");
495 WriteFieldDocComment(printer, descriptor_);
496 printer->Print(variables_,
497 "$deprecation$public java.util.List<? extends $type$OrBuilder>\n"
498 " get$capitalized_name$OrBuilderList() {\n"
499 " return get$capitalized_name$List();\n"
500 "}\n");
501 WriteFieldDocComment(printer, descriptor_);
502 printer->Print(variables_,
503 "$deprecation$public int get$capitalized_name$Count() {\n"
504 " return $name$_.size();\n"
505 "}\n");
506 WriteFieldDocComment(printer, descriptor_);
507 printer->Print(variables_,
508 "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
509 " return ($type$)\n"
510 " $name$_.get(index).getValue($type$.getDefaultInstance());\n"
511 "}\n");
512 WriteFieldDocComment(printer, descriptor_);
513 printer->Print(variables_,
514 "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
515 " int index) {\n"
516 " return ($type$OrBuilder)\n"
517 " $name$_.get(index).getValue($type$.getDefaultInstance());\n"
518 "}\n");
519}
520
521void RepeatedImmutableLazyMessageFieldGenerator::
522GenerateBuilderMembers(io::Printer* printer) const {
523 // When using nested-builders, the code initially works just like the
524 // non-nested builder case. It only creates a nested builder lazily on
525 // demand and then forever delegates to it after creation.
526
527 printer->Print(variables_,
528 "private java.util.List<com.google.protobuf.LazyFieldLite> $name$_ =\n"
529 " java.util.Collections.emptyList();\n"
530
531 "private void ensure$capitalized_name$IsMutable() {\n"
532 " if (!$get_mutable_bit_builder$) {\n"
533 " $name$_ =\n"
534 " new java.util.ArrayList<com.google.protobuf.LazyFieldLite>(\n"
535 " $name$_);\n"
536 " $set_mutable_bit_builder$;\n"
537 " }\n"
538 "}\n"
539 "\n");
540
541 if (HasNestedBuilders(descriptor_->containing_type())) {
542 printer->Print(variables_,
543 // If this builder is non-null, it is used and the other fields are
544 // ignored.
545 "private com.google.protobuf.RepeatedFieldBuilder<\n"
546 " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
547 "\n");
548 }
549
550 // The comments above the methods below are based on a hypothetical
551 // repeated field of type "Field" called "RepeatedField".
552
553 // List<Field> getRepeatedFieldList()
554 WriteFieldDocComment(printer, descriptor_);
555 PrintNestedBuilderFunction(printer,
556 "$deprecation$public java.util.List<$type$> get$capitalized_name$List()",
557
558 "java.util.List<$type$> list =\n"
559 " new java.util.ArrayList<$type$>($name$_.size());\n"
560 "for (com.google.protobuf.LazyFieldLite lf : $name$_) {\n"
561 " list.add(($type$) lf.getValue($type$.getDefaultInstance()));\n"
562 "}\n"
563 "return java.util.Collections.unmodifiableList(list);\n",
564
565 "return $name$Builder_.getMessageList();\n",
566
567 NULL);
568
569 // int getRepeatedFieldCount()
570 WriteFieldDocComment(printer, descriptor_);
571 PrintNestedBuilderFunction(printer,
572 "$deprecation$public int get$capitalized_name$Count()",
573
574 "return $name$_.size();\n",
575 "return $name$Builder_.getCount();\n",
576
577 NULL);
578
579 // Field getRepeatedField(int index)
580 WriteFieldDocComment(printer, descriptor_);
581 PrintNestedBuilderFunction(printer,
582 "$deprecation$public $type$ get$capitalized_name$(int index)",
583
584 "return ($type$) $name$_.get(index).getValue(\n"
585 " $type$.getDefaultInstance());\n",
586
587 "return $name$Builder_.getMessage(index);\n",
588
589 NULL);
590
591 // Builder setRepeatedField(int index, Field value)
592 WriteFieldDocComment(printer, descriptor_);
593 PrintNestedBuilderFunction(printer,
594 "$deprecation$public Builder set$capitalized_name$(\n"
595 " int index, $type$ value)",
596 "if (value == null) {\n"
597 " throw new NullPointerException();\n"
598 "}\n"
599 "ensure$capitalized_name$IsMutable();\n"
600 "$name$_.set(index, com.google.protobuf.LazyFieldLite.fromValue(value));\n"
601 "$on_changed$\n",
602 "$name$Builder_.setMessage(index, value);\n",
603 "return this;\n");
604
605 // Builder setRepeatedField(int index, Field.Builder builderForValue)
606 WriteFieldDocComment(printer, descriptor_);
607 PrintNestedBuilderFunction(printer,
608 "$deprecation$public Builder set$capitalized_name$(\n"
609 " int index, $type$.Builder builderForValue)",
610
611 "ensure$capitalized_name$IsMutable();\n"
612 "$name$_.set(index, com.google.protobuf.LazyFieldLite.fromValue(\n"
613 " builderForValue.build()));\n"
614 "$on_changed$\n",
615
616 "$name$Builder_.setMessage(index, builderForValue.build());\n",
617
618 "return this;\n");
619
620 // Builder addRepeatedField(Field value)
621 WriteFieldDocComment(printer, descriptor_);
622 PrintNestedBuilderFunction(printer,
623 "$deprecation$public Builder add$capitalized_name$($type$ value)",
624
625 "if (value == null) {\n"
626 " throw new NullPointerException();\n"
627 "}\n"
628 "ensure$capitalized_name$IsMutable();\n"
629 "$name$_.add(com.google.protobuf.LazyFieldLite.fromValue(value));\n"
630
631 "$on_changed$\n",
632
633 "$name$Builder_.addMessage(value);\n",
634
635 "return this;\n");
636
637 // Builder addRepeatedField(int index, Field value)
638 WriteFieldDocComment(printer, descriptor_);
639 PrintNestedBuilderFunction(printer,
640 "$deprecation$public Builder add$capitalized_name$(\n"
641 " int index, $type$ value)",
642
643 "if (value == null) {\n"
644 " throw new NullPointerException();\n"
645 "}\n"
646 "ensure$capitalized_name$IsMutable();\n"
647 "$name$_.add(index, com.google.protobuf.LazyFieldLite.fromValue(value));\n"
648 "$on_changed$\n",
649
650 "$name$Builder_.addMessage(index, value);\n",
651
652 "return this;\n");
653
654 // Builder addRepeatedField(Field.Builder builderForValue)
655 WriteFieldDocComment(printer, descriptor_);
656 PrintNestedBuilderFunction(printer,
657 "$deprecation$public Builder add$capitalized_name$(\n"
658 " $type$.Builder builderForValue)",
659
660 "ensure$capitalized_name$IsMutable();\n"
661 "$name$_.add(com.google.protobuf.LazyFieldLite.fromValue(\n"
662 " builderForValue.build()));\n"
663 "$on_changed$\n",
664
665 "$name$Builder_.addMessage(builderForValue.build());\n",
666
667 "return this;\n");
668
669 // Builder addRepeatedField(int index, Field.Builder builderForValue)
670 WriteFieldDocComment(printer, descriptor_);
671 PrintNestedBuilderFunction(printer,
672 "$deprecation$public Builder add$capitalized_name$(\n"
673 " int index, $type$.Builder builderForValue)",
674
675 "ensure$capitalized_name$IsMutable();\n"
676 "$name$_.add(index, com.google.protobuf.LazyFieldLite.fromValue(\n"
677 " builderForValue.build()));\n"
678 "$on_changed$\n",
679
680 "$name$Builder_.addMessage(index, builderForValue.build());\n",
681
682 "return this;\n");
683
684 // Builder addAllRepeatedField(Iterable<Field> values)
685 WriteFieldDocComment(printer, descriptor_);
686 PrintNestedBuilderFunction(printer,
687 "$deprecation$public Builder addAll$capitalized_name$(\n"
688 " java.lang.Iterable<? extends $type$> values)",
689
690 "ensure$capitalized_name$IsMutable();\n"
691 "for (com.google.protobuf.MessageLite v : values) {\n"
692 " $name$_.add(com.google.protobuf.LazyFieldLite.fromValue(v));\n"
693 "}\n"
694 "$on_changed$\n",
695
696 "$name$Builder_.addAllMessages(values);\n",
697
698 "return this;\n");
699
700 // Builder clearAllRepeatedField()
701 WriteFieldDocComment(printer, descriptor_);
702 PrintNestedBuilderFunction(printer,
703 "$deprecation$public Builder clear$capitalized_name$()",
704
705 "$name$_ = java.util.Collections.emptyList();\n"
706 "$clear_mutable_bit_builder$;\n"
707 "$on_changed$\n",
708
709 "$name$Builder_.clear();\n",
710
711 "return this;\n");
712
713 // Builder removeRepeatedField(int index)
714 WriteFieldDocComment(printer, descriptor_);
715 PrintNestedBuilderFunction(printer,
716 "$deprecation$public Builder remove$capitalized_name$(int index)",
717
718 "ensure$capitalized_name$IsMutable();\n"
719 "$name$_.remove(index);\n"
720 "$on_changed$\n",
721
722 "$name$Builder_.remove(index);\n",
723
724 "return this;\n");
725
726 if (HasNestedBuilders(descriptor_->containing_type())) {
727 WriteFieldDocComment(printer, descriptor_);
728 printer->Print(variables_,
729 "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n"
730 " int index) {\n"
731 " return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
732 "}\n");
733
734 WriteFieldDocComment(printer, descriptor_);
735 printer->Print(variables_,
736 "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
737 " int index) {\n"
738 " if ($name$Builder_ == null) {\n"
739 " return $name$_.get(index);"
740 " } else {\n"
741 " return $name$Builder_.getMessageOrBuilder(index);\n"
742 " }\n"
743 "}\n");
744
745 WriteFieldDocComment(printer, descriptor_);
746 printer->Print(variables_,
747 "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
748 " get$capitalized_name$OrBuilderList() {\n"
749 " if ($name$Builder_ != null) {\n"
750 " return $name$Builder_.getMessageOrBuilderList();\n"
751 " } else {\n"
752 " return java.util.Collections.unmodifiableList($name$_);\n"
753 " }\n"
754 "}\n");
755
756 WriteFieldDocComment(printer, descriptor_);
757 printer->Print(variables_,
758 "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n"
759 " return get$capitalized_name$FieldBuilder().addBuilder(\n"
760 " $type$.getDefaultInstance());\n"
761 "}\n");
762 WriteFieldDocComment(printer, descriptor_);
763 printer->Print(variables_,
764 "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n"
765 " int index) {\n"
766 " return get$capitalized_name$FieldBuilder().addBuilder(\n"
767 " index, $type$.getDefaultInstance());\n"
768 "}\n");
769 WriteFieldDocComment(printer, descriptor_);
770 printer->Print(variables_,
771 "$deprecation$public java.util.List<$type$.Builder> \n"
772 " get$capitalized_name$BuilderList() {\n"
773 " return get$capitalized_name$FieldBuilder().getBuilderList();\n"
774 "}\n"
775 "private com.google.protobuf.RepeatedFieldBuilder<\n"
776 " $type$, $type$.Builder, $type$OrBuilder> \n"
777 " get$capitalized_name$FieldBuilder() {\n"
778 " if ($name$Builder_ == null) {\n"
779 " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
780 " $type$, $type$.Builder, $type$OrBuilder>(\n"
781 " $name$_,\n"
782 " $get_mutable_bit_builder$,\n"
783 " getParentForChildren(),\n"
784 " isClean());\n"
785 " $name$_ = null;\n"
786 " }\n"
787 " return $name$Builder_;\n"
788 "}\n");
789 }
790}
791
792void RepeatedImmutableLazyMessageFieldGenerator::
793GenerateParsingCode(io::Printer* printer) const {
794 printer->Print(variables_,
795 "if (!$get_mutable_bit_parser$) {\n"
796 " $name$_ =\n"
797 " new java.util.ArrayList<com.google.protobuf.LazyFieldLite>();\n"
798 " $set_mutable_bit_parser$;\n"
799 "}\n"
800 "$name$_.add(new com.google.protobuf.LazyFieldLite(\n"
801 " extensionRegistry, input.readBytes()));\n");
802}
803
804void RepeatedImmutableLazyMessageFieldGenerator::
805GenerateSerializationCode(io::Printer* printer) const {
806 printer->Print(variables_,
807 "for (int i = 0; i < $name$_.size(); i++) {\n"
808 " output.writeBytes($number$, $name$_.get(i).toByteString());\n"
809 "}\n");
810}
811
812void RepeatedImmutableLazyMessageFieldGenerator::
813GenerateSerializedSizeCode(io::Printer* printer) const {
814 printer->Print(variables_,
815 "for (int i = 0; i < $name$_.size(); i++) {\n"
816 " size += com.google.protobuf.CodedOutputStream\n"
817 " .computeLazyFieldSize($number$, $name$_.get(i));\n"
818 "}\n");
819}
820
821} // namespace java
822} // namespace compiler
823} // namespace protobuf
824} // namespace google