15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc.  All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met:
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions of source code must retain the above copyright
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Redistributions in binary form must reproduce the above
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//     * Neither the name of Google Inc. nor the names of its
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Based on original Protocol Buffers design by
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  Sanjay Ghemawat, Jeff Dean, and others.
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_message_field.h>
393d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include <google/protobuf/compiler/java/java_doc_comment.h>
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_helpers.h>
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/printer.h>
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/wire_format.h>
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h>
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace java {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   repeat code between this and the other field types.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetMessageVariables(const FieldDescriptor* descriptor,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int messageBitIndex,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int builderBitIndex,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         map<string, string>* variables) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["name"] =
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnderscoresToCamelCase(descriptor);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["capitalized_name"] =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnderscoresToCapitalizedCamelCase(descriptor);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["constant_name"] = FieldConstantName(descriptor);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["number"] = SimpleItoa(descriptor->number());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["type"] = ClassName(descriptor->message_type());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["group_or_message"] =
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "Group" : "Message";
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by the proto compiler
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["deprecation"] = descriptor->options().deprecated()
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ? "@java.lang.Deprecated " : "";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["on_changed"] =
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : "";
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For singular messages and builders, one bit is used for the hasField bit.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["clear_has_field_bit_builder"] =
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GenerateClearBit(builderBitIndex);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For repated builders, one bit is used for whether the array is immutable.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // For repeated fields, one bit is used for whether the array is immutable
903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // in the parsing constructor.
913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  (*variables)["get_mutable_bit_parser"] =
923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      GenerateGetBitMutableLocal(builderBitIndex);
933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  (*variables)["set_mutable_bit_parser"] =
943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      GenerateSetBitMutableLocal(builderBitIndex);
953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["get_has_field_bit_from_local"] =
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GenerateGetBitFromLocal(builderBitIndex);
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*variables)["set_has_field_bit_to_local"] =
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GenerateSetBitToLocal(messageBitIndex);
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator::
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator(const FieldDescriptor* descriptor,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int messageBitIndex,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      int builderBitIndex)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    builderBitIndex_(builderBitIndex) {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      &variables_);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator::~MessageFieldGenerator() {}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MessageFieldGenerator::GetNumBitsForMessage() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MessageFieldGenerator::GetNumBitsForBuilder() const {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jonp): In the future, consider having a method specific to the
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interface so that builders can choose dynamically to either return a
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message or a nested builder, so that asking for the interface doesn't
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cause a message to ever be built.
1323d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
1333d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
1343d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "$deprecation$boolean has$capitalized_name$();\n");
1353d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$$type$ get$capitalized_name$();\n");
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
1403d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
1493d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "private $type$ $name$_;\n");
1503d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
1513d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public boolean has$capitalized_name$() {\n"
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $get_has_field_bit_message$;\n"
1543d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
1553d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
1563d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public $type$ get$capitalized_name$() {\n"
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
1623d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return $name$_;\n"
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::PrintNestedBuilderCondition(
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::Printer* printer,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* regular_case,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* nested_builder_case) const {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, "if ($name$Builder_ == null) {\n");
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Indent();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, regular_case);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Outdent();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print("} else {\n");
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Indent();
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, nested_builder_case);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Outdent();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print("}\n");
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, regular_case);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::PrintNestedBuilderFunction(
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::Printer* printer,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* method_prototype,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* regular_case,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* nested_builder_case,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* trailing_code) const {
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, method_prototype);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(" {\n");
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Indent();
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trailing_code != NULL) {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_, trailing_code);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Outdent();
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print("}\n");
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When using nested-builders, the code initially works just like the
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-nested builder case. It only creates a nested builder lazily on
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // demand and then forever delegates to it after creation.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used when the builder is null.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "private $type$ $name$_ = $type$.getDefaultInstance();\n");
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If this builder is non-null, it is used and the other fields are
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // ignored.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "private com.google.protobuf.SingleFieldBuilder<\n"
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\n");
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The comments above the methods below are based on a hypothetical
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // field of type "Field" called "Field".
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // boolean hasField()
2293d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public boolean has$capitalized_name$() {\n"
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $get_has_field_bit_builder$;\n"
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field getField()
2363d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public $type$ get$capitalized_name$()",
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$_;\n",
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$Builder_.getMessage();\n",
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field.Builder setField(Field value)
2473d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder set$capitalized_name$($type$ value)",
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (value == null) {\n"
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  throw new NullPointerException();\n"
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = value;\n"
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.setMessage(value);\n",
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$set_has_field_bit_builder$;\n"
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field.Builder setField(Field.Builder builderForValue)
2633d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder set$capitalized_name$(\n"
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $type$.Builder builderForValue)",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = builderForValue.build();\n"
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.setMessage(builderForValue.build());\n",
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$set_has_field_bit_builder$;\n"
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field.Builder mergeField(Field value)
2773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder merge$capitalized_name$($type$ value)",
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if ($get_has_field_bit_builder$ &&\n"
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$_ != $type$.getDefaultInstance()) {\n"
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_ =\n"
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "} else {\n"
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_ = value;\n"
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.mergeFrom(value);\n",
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$set_has_field_bit_builder$;\n"
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field.Builder clearField()
2963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder clear$capitalized_name$()",
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = $type$.getDefaultInstance();\n"
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.clear();\n",
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$clear_has_field_bit_builder$;\n"
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
3093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  $set_has_field_bit_builder$;\n"
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  $on_changed$\n"
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
3153d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
3163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
3173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    printer->Print(variables_,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if ($name$Builder_ != null) {\n"
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return $name$Builder_.getMessageOrBuilder();\n"
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  } else {\n"
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return $name$_;\n"
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }\n"
3243d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
3253d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
3263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    printer->Print(variables_,
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "private com.google.protobuf.SingleFieldBuilder<\n"
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $type$, $type$.Builder, $type$OrBuilder> \n"
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    get$capitalized_name$FieldBuilder() {\n"
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if ($name$Builder_ == null) {\n"
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "        $type$, $type$.Builder, $type$OrBuilder>(\n"
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            $name$_,\n"
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            getParentForChildren(),\n"
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            isClean());\n"
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $name$_ = null;\n"
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }\n"
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return $name$Builder_;\n"
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "get$capitalized_name$FieldBuilder();\n");
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const {
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_ = $type$.getDefaultInstance();\n");
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = $type$.getDefaultInstance();\n",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.clear();\n");
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$clear_has_field_bit_builder$;\n");
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (other.has$capitalized_name$()) {\n"
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  merge$capitalized_name$(other.get$capitalized_name$());\n"
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const {
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "if ($get_has_field_bit_from_local$) {\n"
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  $set_has_field_bit_to_local$;\n"
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer,
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result.$name$_ = $name$_;\n",
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result.$name$_ = $name$Builder_.build();\n");
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const {
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
3893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "$type$.Builder subBuilder = null;\n"
3903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "if ($get_has_field_bit_message$) {\n"
3913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  subBuilder = $name$_.toBuilder();\n"
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
3963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "$name$_ = input.readGroup($number$, $type$.PARSER,\n"
3973d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "    extensionRegistry);\n");
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
4003d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "$name$_ = input.readMessage($type$.PARSER, extensionRegistry);\n");
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "if (subBuilder != null) {\n"
4053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  subBuilder.mergeFrom($name$_);\n"
4063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  $name$_ = subBuilder.buildPartial();\n"
4073d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
4083d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
4093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "$set_has_field_bit_message$;\n");
4103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
4113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch
4123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid MessageFieldGenerator::
4133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const {
4143d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  // noop for messages.
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const {
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if ($get_has_field_bit_message$) {\n"
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  output.write$group_or_message$($number$, $name$_);\n"
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const {
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if ($get_has_field_bit_message$) {\n"
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  size += com.google.protobuf.CodedOutputStream\n"
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    .compute$group_or_message$Size($number$, $name$_);\n"
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const {
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result = result && get$capitalized_name$()\n"
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    .equals(other.get$capitalized_name$());\n");
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const {
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hash = (37 * hash) + $constant_name$;\n"
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string MessageFieldGenerator::GetBoxedType() const {
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ClassName(descriptor_->message_type());
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ===================================================================
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator::
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor,
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int messageBitIndex,
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int builderBitIndex)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    builderBitIndex_(builderBitIndex) {
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      &variables_);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedMessageFieldGenerator::GetNumBitsForMessage() const {
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedMessageFieldGenerator::GetNumBitsForBuilder() const {
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 1;
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const {
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jonp): In the future, consider having methods specific to the
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // interface so that builders can choose dynamically to either return a
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // message or a nested builder, so that asking for the interface doesn't
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // cause a message to ever be built.
4803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$java.util.List<$type$> \n"
4833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "    get$capitalized_name$List();\n");
4843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
4853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
4863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "$deprecation$$type$ get$capitalized_name$(int index);\n");
4873d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
4883d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$int get$capitalized_name$Count();\n");
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
4913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
4943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "    get$capitalized_name$OrBuilderList();\n");
4953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
4963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    printer->Print(variables_,
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    int index);\n");
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const {
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
5053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "private java.util.List<$type$> $name$_;\n");
5063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
5073d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n"
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"   // note:  unmodifiable list
5103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
5113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
5123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    get$capitalized_name$OrBuilderList() {\n"
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_;\n"
5163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
5173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
5183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public int get$capitalized_name$Count() {\n"
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.size();\n"
5213d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
5223d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
5233d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.get(index);\n"
5263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
5273d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
5283d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  printer->Print(variables_,
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    int index) {\n"
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  return $name$_.get(index);\n"
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::PrintNestedBuilderCondition(
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::Printer* printer,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* regular_case,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* nested_builder_case) const {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, "if ($name$Builder_ == null) {\n");
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Indent();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, regular_case);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Outdent();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print("} else {\n");
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Indent();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, nested_builder_case);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Outdent();
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print("}\n");
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else {
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     printer->Print(variables_, regular_case);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   }
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::PrintNestedBuilderFunction(
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    io::Printer* printer,
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* method_prototype,
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* regular_case,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* nested_builder_case,
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* trailing_code) const {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, method_prototype);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(" {\n");
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Indent();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (trailing_code != NULL) {
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_, trailing_code);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Outdent();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print("}\n");
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const {
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When using nested-builders, the code initially works just like the
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // non-nested builder case. It only creates a nested builder lazily on
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // demand and then forever delegates to it after creation.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used when the builder is null.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // One field is the list and the other field keeps track of whether the
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // list is immutable. If it's immutable, the invariant is that it must
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // either an instance of Collections.emptyList() or it's an ArrayList
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // a refererence to the underlying ArrayList. This invariant allows us to
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // share instances of lists between protocol buffers avoiding expensive
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // memory allocations. Note, immutable is a strong guarantee here -- not
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // just that the list cannot be modified via the reference but that the
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // list can never be modified.
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "private java.util.List<$type$> $name$_ =\n"
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  java.util.Collections.emptyList();\n"
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "private void ensure$capitalized_name$IsMutable() {\n"
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  if (!$get_mutable_bit_builder$) {\n"
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $set_mutable_bit_builder$;\n"
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "   }\n"
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "\n");
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If this builder is non-null, it is used and the other fields are
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // ignored.
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "private com.google.protobuf.RepeatedFieldBuilder<\n"
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "\n");
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The comments above the methods below are based on a hypothetical
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // repeated field of type "Field" called "RepeatedField".
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List<Field> getRepeatedFieldList()
6133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public java.util.List<$type$> get$capitalized_name$List()",
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return java.util.Collections.unmodifiableList($name$_);\n",
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$Builder_.getMessageList();\n",
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // int getRepeatedFieldCount()
6233d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public int get$capitalized_name$Count()",
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$_.size();\n",
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$Builder_.getCount();\n",
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Field getRepeatedField(int index)
6333d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public $type$ get$capitalized_name$(int index)",
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$_.get(index);\n",
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return $name$Builder_.getMessage(index);\n",
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NULL);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder setRepeatedField(int index, Field value)
6443d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder set$capitalized_name$(\n"
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    int index, $type$ value)",
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (value == null) {\n"
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  throw new NullPointerException();\n"
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.set(index, value);\n"
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.setMessage(index, value);\n",
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder setRepeatedField(int index, Field.Builder builderForValue)
6583d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder set$capitalized_name$(\n"
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    int index, $type$.Builder builderForValue)",
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.set(index, builderForValue.build());\n"
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.setMessage(index, builderForValue.build());\n",
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder addRepeatedField(Field value)
6723d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder add$capitalized_name$($type$ value)",
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (value == null) {\n"
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  throw new NullPointerException();\n"
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.add(value);\n"
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.addMessage(value);\n",
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder addRepeatedField(int index, Field value)
6893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder add$capitalized_name$(\n"
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    int index, $type$ value)",
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (value == null) {\n"
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  throw new NullPointerException();\n"
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.add(index, value);\n"
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.addMessage(index, value);\n",
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder addRepeatedField(Field.Builder builderForValue)
7063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder add$capitalized_name$(\n"
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $type$.Builder builderForValue)",
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.add(builderForValue.build());\n"
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.addMessage(builderForValue.build());\n",
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder addRepeatedField(int index, Field.Builder builderForValue)
7203d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder add$capitalized_name$(\n"
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    int index, $type$.Builder builderForValue)",
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.add(index, builderForValue.build());\n"
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.addMessage(index, builderForValue.build());\n",
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder addAllRepeatedField(Iterable<Field> values)
7343d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder addAll$capitalized_name$(\n"
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    java.lang.Iterable<? extends $type$> values)",
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "super.addAll(values, $name$_);\n"
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.addAllMessages(values);\n",
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder clearAllRepeatedField()
7483d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder clear$capitalized_name$()",
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = java.util.Collections.emptyList();\n"
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$clear_mutable_bit_builder$;\n"
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.clear();\n",
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Builder removeRepeatedField(int index)
7613d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch  WriteFieldDocComment(printer, descriptor_);
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderFunction(printer,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$deprecation$public Builder remove$capitalized_name$(int index)",
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "ensure$capitalized_name$IsMutable();\n"
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_.remove(index);\n"
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$on_changed$\n",
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.remove(index);\n",
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "return this;\n");
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (HasNestedBuilders(descriptor_->containing_type())) {
7743d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n"
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    int index) {\n"
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
7793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
7823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        printer->Print(variables_,
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    int index) {\n"
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if ($name$Builder_ == null) {\n"
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return $name$_.get(index);"
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  } else {\n"
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return $name$Builder_.getMessageOrBuilder(index);\n"
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }\n"
7903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
7933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        printer->Print(variables_,
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     get$capitalized_name$OrBuilderList() {\n"
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if ($name$Builder_ != null) {\n"
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return $name$Builder_.getMessageOrBuilderList();\n"
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  } else {\n"
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    return java.util.Collections.unmodifiableList($name$_);\n"
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }\n"
8013d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8033d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
8043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        printer->Print(variables_,
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n"
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      $type$.getDefaultInstance());\n"
8083d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
8093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
8103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        printer->Print(variables_,
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n"
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    int index) {\n"
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      index, $type$.getDefaultInstance());\n"
8153d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "}\n");
8163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    WriteFieldDocComment(printer, descriptor_);
8173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch        printer->Print(variables_,
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "$deprecation$public java.util.List<$type$.Builder> \n"
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "     get$capitalized_name$BuilderList() {\n"
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n"
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "private com.google.protobuf.RepeatedFieldBuilder<\n"
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $type$, $type$.Builder, $type$OrBuilder> \n"
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    get$capitalized_name$FieldBuilder() {\n"
8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if ($name$Builder_ == null) {\n"
8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "        $type$, $type$.Builder, $type$OrBuilder>(\n"
8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            $name$_,\n"
8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            $get_mutable_bit_builder$,\n"
8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            getParentForChildren(),\n"
8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "            isClean());\n"
8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    $name$_ = null;\n"
8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }\n"
8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  return $name$Builder_;\n"
8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "}\n");
8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "get$capitalized_name$FieldBuilder();\n");
8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const {
8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const {
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer,
8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$_ = java.util.Collections.emptyList();\n"
8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$clear_mutable_bit_builder$;\n",
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "$name$Builder_.clear();\n");
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const {
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The code below does two optimizations (non-nested builder case):
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   1. If the other list is empty, there's nothing to do. This ensures we
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      don't allocate a new array if we already have an immutable one.
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   2. If the other list is non-empty and our current list is empty, we can
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //      reuse the other list which is guaranteed to be immutable.
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer,
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (!other.$name$_.isEmpty()) {\n"
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  if ($name$_.isEmpty()) {\n"
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$_ = other.$name$_;\n"
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $clear_mutable_bit_builder$;\n"
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  } else {\n"
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    ensure$capitalized_name$IsMutable();\n"
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$_.addAll(other.$name$_);\n"
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  }\n"
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $on_changed$\n"
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n",
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (!other.$name$_.isEmpty()) {\n"
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  if ($name$Builder_.isEmpty()) {\n"
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$Builder_.dispose();\n"
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$Builder_ = null;\n"
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$_ = other.$name$_;\n"
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $clear_mutable_bit_builder$;\n"
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$Builder_ = \n"
8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "      com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n"
8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "         get$capitalized_name$FieldBuilder() : null;\n"
8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  } else {\n"
8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    $name$Builder_.addAllMessages(other.$name$_);\n"
8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  }\n"
8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const {
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The code below (non-nested builder case) ensures that the result has an
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // immutable list. If our list is immutable, we can just reuse it. If not,
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // we make it immutable.
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrintNestedBuilderCondition(printer,
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if ($get_mutable_bit_builder$) {\n"
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  $clear_mutable_bit_builder$;\n"
9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n"
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result.$name$_ = $name$_;\n",
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result.$name$_ = $name$Builder_.build();\n");
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const {
9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "if (!$get_mutable_bit_parser$) {\n"
9123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  $name$_ = new java.util.ArrayList<$type$>();\n"
9133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  $set_mutable_bit_parser$;\n"
9143d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
9183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "$name$_.add(input.readGroup($number$, $type$.PARSER,\n"
9193d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "    extensionRegistry));\n");
9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    printer->Print(variables_,
9223d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch      "$name$_.add(input.readMessage($type$.PARSER, extensionRegistry));\n");
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
9243d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch}
9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid RepeatedMessageFieldGenerator::
9273d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const {
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9293d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "if ($get_mutable_bit_parser$) {\n"
9303d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
9313d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch    "}\n");
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const {
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "for (int i = 0; i < $name$_.size(); i++) {\n"
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  output.write$group_or_message$($number$, $name$_.get(i));\n"
9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const {
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "for (int i = 0; i < $name$_.size(); i++) {\n"
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  size += com.google.protobuf.CodedOutputStream\n"
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const {
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "result = result && get$capitalized_name$List()\n"
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "    .equals(other.get$capitalized_name$List());\n");
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const {
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  printer->Print(variables_,
9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "if (get$capitalized_name$Count() > 0) {\n"
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  hash = (37 * hash) + $constant_name$;\n"
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "}\n");
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string RepeatedMessageFieldGenerator::GetBoxedType() const {
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ClassName(descriptor_->message_type());
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace java
9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace compiler
9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace protobuf
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace google
975