1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <map>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string>
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_context.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_message_field.h>
40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_doc_comment.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_helpers.h>
42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_name_resolver.h>
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h>
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetMessageVariables(const FieldDescriptor* descriptor,
55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         int messageBitIndex,
56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         int builderBitIndex,
57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         const FieldGeneratorInfo* info,
58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                         ClassNameResolver* name_resolver,
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                         map<string, string>* variables) {
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonFieldVariables(descriptor, info, variables);
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["type"] =
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      name_resolver->GetImmutableClassName(descriptor->message_type());
64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["mutable_type"] =
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      name_resolver->GetMutableClassName(descriptor->message_type());
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["group_or_message"] =
67d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "Group" : "Message";
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // by the proto compiler
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["deprecation"] = descriptor->options().deprecated()
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      ? "@java.lang.Deprecated " : "";
73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["on_changed"] = "onChanged();";
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor->file())) {
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // For singular messages and builders, one bit is used for the hasField bit.
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex);
79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Note that these have a trailing ";".
81a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_message"] =
82a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateSetBit(messageBitIndex) + ";";
83a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_builder"] =
84a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateSetBit(builderBitIndex) + ";";
85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["clear_has_field_bit_builder"] =
86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateClearBit(builderBitIndex) + ";";
87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex);
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_message"] = "";
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_builder"] = "";
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["clear_has_field_bit_builder"] = "";
93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["is_field_present_message"] =
95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        (*variables)["name"] + "_ != null";
96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // For repated builders, one bit is used for whether the array is immutable.
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex);
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex);
101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex);
102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // For repeated fields, one bit is used for whether the array is immutable
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // in the parsing constructor.
105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_mutable_bit_parser"] =
106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateGetBitMutableLocal(builderBitIndex);
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_mutable_bit_parser"] =
108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateSetBitMutableLocal(builderBitIndex);
109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_has_field_bit_from_local"] =
111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateGetBitFromLocal(builderBitIndex);
112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_has_field_bit_to_local"] =
113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateSetBitToLocal(messageBitIndex);
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageFieldGenerator::
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      int messageBitIndex,
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      int builderBitIndex,
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      Context* context)
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    builderBitIndex_(builderBitIndex), context_(context),
127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name_resolver_(context->GetNameResolver()) {
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        context->GetFieldGeneratorInfo(descriptor),
130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        name_resolver_, &variables_);
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {}
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const {
145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(jonp): In the future, consider having a method specific to the
146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // interface so that builders can choose dynamically to either return a
147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // message or a nested builder, so that asking for the interface doesn't
148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // cause a message to ever be built.
149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file()) ||
150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      descriptor_->containing_oneof() == NULL) {
151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$boolean has$capitalized_name$();\n");
154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$$type$ get$capitalized_name$();\n");
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const {
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private $type$ $name$_;\n");
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $get_has_field_bit_message$;\n"
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public $type$ get$capitalized_name$() {\n"
179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecation$public $type$OrBuilder "
185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "get$capitalized_name$OrBuilder() {\n"
186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $name$_ != null;\n"
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public $type$ get$capitalized_name$() {\n"
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    WriteFieldDocComment(printer, descriptor_);
201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    printer->Print(variables_,
202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$deprecation$public $type$OrBuilder "
203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "get$capitalized_name$OrBuilder() {\n"
204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "  return get$capitalized_name$();\n"
205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "}\n");
206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    io::Printer* printer,
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* regular_case,
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* nested_builder_case) const {
213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, "if ($name$Builder_ == null) {\n");
214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Indent();
215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, regular_case);
216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Outdent();
217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print("} else {\n");
218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Indent();
219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, nested_builder_case);
220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Outdent();
221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print("}\n");
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    io::Printer* printer,
226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* method_prototype,
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* regular_case,
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* nested_builder_case,
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* trailing_code) const {
230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, method_prototype);
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(" {\n");
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Indent();
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (trailing_code != NULL) {
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_, trailing_code);
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Outdent();
238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print("}\n");
239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const {
243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // When using nested-builders, the code initially works just like the
244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // non-nested builder case. It only creates a nested builder lazily on
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // demand and then forever delegates to it after creation.
246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  bool support_field_presence = SupportFieldPresence(descriptor_->file());
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private $type$ $name$_ = null;\n");
251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      // If this builder is non-null, it is used and the other fields are
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      // ignored.
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "private com.google.protobuf.SingleFieldBuilder<\n"
256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "\n");
258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The comments above the methods below are based on a hypothetical
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // field of type "Field" called "Field".
261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // boolean hasField()
263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (support_field_presence) {
265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $get_has_field_bit_builder$;\n"
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $name$Builder_ != null || $name$_ != null;\n"
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field getField()
277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$()",
280b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$Builder_.getMessage();\n",
282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    NULL);
283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder setField(Field value)
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$($type$ value)",
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (value == null) {\n"
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  throw new NullPointerException();\n"
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = value;\n"
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(value);\n",
296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_has_field_bit_builder$\n"
298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder setField(Field.Builder builderForValue)
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$(\n"
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $type$.Builder builderForValue)",
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = builderForValue.build();\n"
307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(builderForValue.build());\n",
310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_has_field_bit_builder$\n"
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder mergeField(Field value)
315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder merge$capitalized_name$($type$ value)",
318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    support_field_presence
320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ? "if ($get_has_field_bit_builder$ &&\n"
321b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer          "    $name$_ != null &&\n"
322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "    $name$_ != $type$.getDefaultInstance()) {\n"
323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "  $name$_ =\n"
324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "} else {\n"
326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "  $name$_ = value;\n"
327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "}\n"
328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "$on_changed$\n"
329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        : "if ($name$_ != null) {\n"
330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "  $name$_ =\n"
331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "} else {\n"
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "  $name$_ = value;\n"
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "}\n"
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "$on_changed$\n",
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.mergeFrom(value);\n",
338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_has_field_bit_builder$\n"
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder clearField()
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$()",
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
347b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$name$_ = null;\n"
348b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$on_changed$\n",
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    support_field_presence
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        ? "$name$Builder_.clear();\n"
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        : "$name$_ = null;\n"
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "$name$Builder_ = null;\n",
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$clear_has_field_bit_builder$\n"
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
358b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
359b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
360b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
361b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  $set_has_field_bit_builder$\n"
362b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  $on_changed$\n"
363b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
364b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
365b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
366b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
367b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
368b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ != null) {\n"
369b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$Builder_.getMessageOrBuilder();\n"
370b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  } else {\n"
371b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$_ == null ?\n"
372b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "        $type$.getDefaultInstance() : $name$_;\n"
373b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
374b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
375b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
376b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
377b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private com.google.protobuf.SingleFieldBuilder<\n"
378b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $type$, $type$.Builder, $type$OrBuilder> \n"
379b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    get$capitalized_name$FieldBuilder() {\n"
380b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ == null) {\n"
381b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
382b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
383b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            get$capitalized_name$(),\n"
384b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            getParentForChildren(),\n"
385b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            isClean());\n"
386b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $name$_ = null;\n"
387b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
388b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $name$Builder_;\n"
389b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
390fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
391fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "get$capitalized_name$FieldBuilder();\n");
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
402b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas BerghammerGenerateInitializationCode(io::Printer* printer) const {}
403d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const {
406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    PrintNestedBuilderCondition(printer,
408b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$name$_ = null;\n",
409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$name$Builder_.clear();\n");
411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_, "$clear_has_field_bit_builder$\n");
412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    PrintNestedBuilderCondition(printer,
414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$name$_ = null;\n",
415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$name$_ = null;\n"
417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$name$Builder_ = null;\n");
418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
422fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
423fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
424fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "if (other.has$capitalized_name$()) {\n"
425fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  merge$capitalized_name$(other.get$capitalized_name$());\n"
426fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
427fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
428fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
430fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const {
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "if ($get_has_field_bit_from_local$) {\n"
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "  $set_has_field_bit_to_local$;\n"
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "}\n");
436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer,
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$_;\n",
440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$Builder_.build();\n");
442fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
443fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
445fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const {
446fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$type$.Builder subBuilder = null;\n"
448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($is_field_present_message$) {\n"
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  subBuilder = $name$_.toBuilder();\n"
450fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
451fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
452d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
453fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
454b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$name$_ = input.readGroup($number$, $type$.parser(),\n"
455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "    extensionRegistry);\n");
456fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
457fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
458b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$name$_ = input.readMessage($type$.parser(), extensionRegistry);\n");
459fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
460fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
461fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (subBuilder != null) {\n"
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  subBuilder.mergeFrom($name$_);\n"
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = subBuilder.buildPartial();\n"
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_has_field_bit_message$\n");
467fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
468fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const {
471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // noop for messages.
472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
475fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const {
476fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($is_field_present_message$) {\n"
478b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
480fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
481fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
483fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
484fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($is_field_present_message$) {\n"
486fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  size += com.google.protobuf.CodedOutputStream\n"
487b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
488fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
489fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
490fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const {
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result = result && get$capitalized_name$()\n"
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .equals(other.get$capitalized_name$());\n");
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageFieldGenerator::
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const {
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "hash = (37 * hash) + $constant_name$;\n"
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring ImmutableMessageFieldGenerator::GetBoxedType() const {
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return name_resolver_->GetImmutableClassName(descriptor_->message_type());
507fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
508fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
509fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
510fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageOneofFieldGenerator::
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int messageBitIndex,
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int builderBitIndex,
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 Context* context)
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    : ImmutableMessageFieldGenerator(
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          descriptor, messageBitIndex, builderBitIndex, context) {
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofGeneratorInfo* info =
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      context->GetOneofGeneratorInfo(descriptor->containing_oneof());
520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonOneofVariables(descriptor, info, &variables_);
521fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
522fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableMessageOneofFieldGenerator::
524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~ImmutableMessageOneofFieldGenerator() {}
525fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
527fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const {
528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $has_oneof_case_message$;\n"
534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
537fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$() {\n"
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($has_oneof_case_message$) {\n"
540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "     return ($type$) $oneof_name$_;\n"
541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $type$.getDefaultInstance();\n"
543fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
545b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
546b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
547b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
548b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($has_oneof_case_message$) {\n"
549b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "     return ($type$) $oneof_name$_;\n"
550b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
551b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $type$.getDefaultInstance();\n"
552b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
553fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
554fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
556fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const {
557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // When using nested-builders, the code initially works just like the
558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // non-nested builder case. It only creates a nested builder lazily on
559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // demand and then forever delegates to it after creation.
560b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
561b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // If this builder is non-null, it is used and the other fields are
562b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // ignored.
563b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private com.google.protobuf.SingleFieldBuilder<\n"
564b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
565b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "\n");
566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The comments above the methods below are based on a hypothetical
568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // field of type "Field" called "Field".
569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // boolean hasField()
572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $has_oneof_case_message$;\n"
576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field getField()
580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$()",
583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return ($type$) $oneof_name$_;\n"
586fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $type$.getDefaultInstance();\n",
588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$Builder_.getMessage();\n"
591fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $type$.getDefaultInstance();\n",
593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    NULL);
595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder setField(Field value)
597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$($type$ value)",
600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (value == null) {\n"
602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  throw new NullPointerException();\n"
603fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$oneof_name$_ = value;\n"
605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(value);\n",
608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_oneof_case_message$;\n"
610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder setField(Field.Builder builderForValue)
613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$(\n"
616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $type$.Builder builderForValue)",
617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$oneof_name$_ = builderForValue.build();\n"
619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(builderForValue.build());\n",
622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_oneof_case_message$;\n"
624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder mergeField(Field value)
627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder merge$capitalized_name$($type$ value)",
630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$ &&\n"
632a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $oneof_name$_ != $type$.getDefaultInstance()) {\n"
633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "      .mergeFrom(value).buildPartial();\n"
635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "} else {\n"
636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = value;\n"
637fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$Builder_.mergeFrom(value);\n"
642fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(value);\n",
644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_oneof_case_message$;\n"
646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field.Builder clearField()
649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$()",
652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_oneof_case_message$;\n"
655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = null;\n"
656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n",
658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_oneof_case_message$;\n"
661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = null;\n"
662fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.clear();\n",
664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
667b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
668b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
669b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
670b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
671b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
672b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
674b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
675b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n"
676b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$Builder_.getMessageOrBuilder();\n"
677b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  } else {\n"
678b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    if ($has_oneof_case_message$) {\n"
679b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      return ($type$) $oneof_name$_;\n"
680b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    }\n"
681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $type$.getDefaultInstance();\n"
682b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
683b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
684b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
685b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
686b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private com.google.protobuf.SingleFieldBuilder<\n"
687b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $type$, $type$.Builder, $type$OrBuilder> \n"
688b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    get$capitalized_name$FieldBuilder() {\n"
689b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ == null) {\n"
690b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    if (!($has_oneof_case_message$)) {\n"
691b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      $oneof_name$_ = $type$.getDefaultInstance();\n"
692b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    }\n"
693b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
694b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
695b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            ($type$) $oneof_name$_,\n"
696b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            getParentForChildren(),\n"
697b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            isClean());\n"
698b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $oneof_name$_ = null;\n"
699b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
700b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  $set_oneof_case_message$;\n"
701b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  $on_changed$;\n"
702b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $name$Builder_;\n"
703b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const {
708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                 "if ($has_oneof_case_message$) {\n");
711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Indent();
712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer,
714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$oneof_name$_ = $oneof_name$_;\n",
715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$oneof_name$_ = $name$Builder_.build();\n");
717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Outdent();
719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print("}\n");
720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const {
724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "merge$capitalized_name$(other.get$capitalized_name$());\n");
726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const {
730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$type$.Builder subBuilder = null;\n"
732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
738b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$oneof_name$_ = input.readGroup($number$, $type$.parser(),\n"
739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "    extensionRegistry);\n");
740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
742b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$oneof_name$_ =\n"
743b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "    input.readMessage($type$.parser(), extensionRegistry);\n");
744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (subBuilder != null) {\n"
748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = subBuilder.buildPartial();\n"
750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_oneof_case_message$;\n");
753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const {
757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableMessageOneofFieldGenerator::
764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const {
765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  size += com.google.protobuf.CodedOutputStream\n"
768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ===================================================================
773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableMessageFieldGenerator::
775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                       int messageBitIndex,
777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                       int builderBitIndex,
778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                       Context* context)
779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    builderBitIndex_(builderBitIndex), context_(context),
781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name_resolver_(context->GetNameResolver())  {
782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      context->GetFieldGeneratorInfo(descriptor),
784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                      name_resolver_, &variables_);
785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableMessageFieldGenerator::
788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~RepeatedImmutableMessageFieldGenerator() {}
789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 0;
792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const {
800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(jonp): In the future, consider having methods specific to the
801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // interface so that builders can choose dynamically to either return a
802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // message or a nested builder, so that asking for the interface doesn't
803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // cause a message to ever be built.
804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$java.util.List<$type$> \n"
807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    get$capitalized_name$List();\n");
808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$$type$ get$capitalized_name$(int index);\n");
811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$int get$capitalized_name$Count();\n");
814b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer
815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
816b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
817b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
818b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    get$capitalized_name$OrBuilderList();\n");
819b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
820b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
821b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
822b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    int index);\n");
823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const {
827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private java.util.List<$type$> $name$_;\n");
829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n"
833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_;\n"   // note:  unmodifiable list
834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    get$capitalized_name$OrBuilderList() {\n"
839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_;\n"
840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public int get$capitalized_name$Count() {\n"
844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.size();\n"
845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.get(index);\n"
850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index) {\n"
855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.get(index);\n"
856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
860a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
861a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    io::Printer* printer,
862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* regular_case,
863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* nested_builder_case) const {
864b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, "if ($name$Builder_ == null) {\n");
865b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Indent();
866b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, regular_case);
867b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Outdent();
868b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print("} else {\n");
869b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Indent();
870b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_, nested_builder_case);
871b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Outdent();
872b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print("}\n");
873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    io::Printer* printer,
877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* method_prototype,
878a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* regular_case,
879a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* nested_builder_case,
880a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    const char* trailing_code) const {
881a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, method_prototype);
882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(" {\n");
883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Indent();
884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
885a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (trailing_code != NULL) {
886a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_, trailing_code);
887a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
888a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Outdent();
889a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print("}\n");
890a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
891a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
892a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
893a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const {
894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // When using nested-builders, the code initially works just like the
895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // non-nested builder case. It only creates a nested builder lazily on
896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // demand and then forever delegates to it after creation.
897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
899a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Used when the builder is null.
900a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // One field is the list and the other field keeps track of whether the
901a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // list is immutable. If it's immutable, the invariant is that it must
902a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // either an instance of Collections.emptyList() or it's an ArrayList
903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // a refererence to the underlying ArrayList. This invariant allows us to
905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // share instances of lists between protocol buffers avoiding expensive
906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // memory allocations. Note, immutable is a strong guarantee here -- not
907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // just that the list cannot be modified via the reference but that the
908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // list can never be modified.
909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private java.util.List<$type$> $name$_ =\n"
910a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  java.util.Collections.emptyList();\n"
911a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
912a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private void ensure$capitalized_name$IsMutable() {\n"
913a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (!$get_mutable_bit_builder$) {\n"
914a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
915a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $set_mutable_bit_builder$;\n"
916a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "   }\n"
917fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
918a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "\n");
919a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
920b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
921b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // If this builder is non-null, it is used and the other fields are
922b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // ignored.
923b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private com.google.protobuf.RepeatedFieldBuilder<\n"
924b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
925b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "\n");
926a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
927a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The comments above the methods below are based on a hypothetical
928a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // repeated field of type "Field" called "RepeatedField".
929a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
930a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // List<Field> getRepeatedFieldList()
931a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
932a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
933a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public java.util.List<$type$> get$capitalized_name$List()",
934a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
935a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return java.util.Collections.unmodifiableList($name$_);\n",
936a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$Builder_.getMessageList();\n",
937a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
938a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    NULL);
939a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
940a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // int getRepeatedFieldCount()
941a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
942a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
943a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public int get$capitalized_name$Count()",
944a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
945a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$_.size();\n",
946a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$Builder_.getCount();\n",
947a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
948a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    NULL);
949a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
950a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Field getRepeatedField(int index)
951a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$(int index)",
954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$_.get(index);\n",
956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return $name$Builder_.getMessage(index);\n",
958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
959a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    NULL);
960a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
961a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder setRepeatedField(int index, Field value)
962a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
963a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
964a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$(\n"
965a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index, $type$ value)",
966a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (value == null) {\n"
967a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  throw new NullPointerException();\n"
968fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n"
969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
970a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.set(index, value);\n"
971a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
972a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(index, value);\n",
973a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
974a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
975a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder setRepeatedField(int index, Field.Builder builderForValue)
976a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
977a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
978a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$(\n"
979a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index, $type$.Builder builderForValue)",
980a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
981a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
982a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.set(index, builderForValue.build());\n"
983a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
984a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
985a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.setMessage(index, builderForValue.build());\n",
986a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
987a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
988a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
989a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder addRepeatedField(Field value)
990a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
991a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
992a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder add$capitalized_name$($type$ value)",
993a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
994a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (value == null) {\n"
995a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  throw new NullPointerException();\n"
996a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
997a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
998a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.add(value);\n"
999a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1000a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1001a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1002a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.addMessage(value);\n",
1003a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1004a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1005a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1006a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder addRepeatedField(int index, Field value)
1007a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1008a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1009a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder add$capitalized_name$(\n"
1010a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index, $type$ value)",
1011a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1012a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (value == null) {\n"
1013a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  throw new NullPointerException();\n"
1014a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
1015a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
1016a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.add(index, value);\n"
1017a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1018a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1019a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.addMessage(index, value);\n",
1020a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1021a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1022a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1023a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder addRepeatedField(Field.Builder builderForValue)
1024a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1025a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1026a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder add$capitalized_name$(\n"
1027a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $type$.Builder builderForValue)",
1028a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1029a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
1030a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.add(builderForValue.build());\n"
1031a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1032a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1033a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.addMessage(builderForValue.build());\n",
1034a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1035a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1036a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1037a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder addRepeatedField(int index, Field.Builder builderForValue)
1038a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1039a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1040a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder add$capitalized_name$(\n"
1041a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index, $type$.Builder builderForValue)",
1042a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1043a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
1044a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.add(index, builderForValue.build());\n"
1045a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1046a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1047a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.addMessage(index, builderForValue.build());\n",
1048a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1049a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1050a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1051a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder addAllRepeatedField(Iterable<Field> values)
1052a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1053a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1054a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder addAll$capitalized_name$(\n"
1055a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    java.lang.Iterable<? extends $type$> values)",
1056a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1057a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
1058a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
1059a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    values, $name$_);\n"
1060a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1061a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1062a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.addAllMessages(values);\n",
1063a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1064a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1065a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1066a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder clearAllRepeatedField()
1067a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1068a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1069a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$()",
1070a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1071a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = java.util.Collections.emptyList();\n"
1072a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$clear_mutable_bit_builder$;\n"
1073a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1074a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1075a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.clear();\n",
1076a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1077a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1078a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1079a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // Builder removeRepeatedField(int index)
1080a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
1081a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderFunction(printer,
1082a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder remove$capitalized_name$(int index)",
1083a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1084a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "ensure$capitalized_name$IsMutable();\n"
1085a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.remove(index);\n"
1086a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$on_changed$\n",
1087a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1088a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.remove(index);\n",
1089a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1090a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "return this;\n");
1091a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1092b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1093b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  printer->Print(variables_,
1094b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n"
1095b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    int index) {\n"
1096b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
1097b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1098a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1099b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
1101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
1102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    int index) {\n"
1103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ == null) {\n"
1104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$_.get(index);"
1105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  } else {\n"
1106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$Builder_.getMessageOrBuilder(index);\n"
1107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
1108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
1112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
1113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "     get$capitalized_name$OrBuilderList() {\n"
1114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ != null) {\n"
1115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return $name$Builder_.getMessageOrBuilderList();\n"
1116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  } else {\n"
1117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    return java.util.Collections.unmodifiableList($name$_);\n"
1118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
1119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
1123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n"
1124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
1125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      $type$.getDefaultInstance());\n"
1126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
1129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n"
1130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    int index) {\n"
1131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
1132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "      index, $type$.getDefaultInstance());\n"
1133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  WriteFieldDocComment(printer, descriptor_);
1135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      printer->Print(variables_,
1136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "$deprecation$public java.util.List<$type$.Builder> \n"
1137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "     get$capitalized_name$BuilderList() {\n"
1138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
1139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n"
1140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "private com.google.protobuf.RepeatedFieldBuilder<\n"
1141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $type$, $type$.Builder, $type$OrBuilder> \n"
1142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    get$capitalized_name$FieldBuilder() {\n"
1143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  if ($name$Builder_ == null) {\n"
1144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
1145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "        $type$, $type$.Builder, $type$OrBuilder>(\n"
1146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            $name$_,\n"
1147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            $get_mutable_bit_builder$,\n"
1148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            getParentForChildren(),\n"
1149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "            isClean());\n"
1150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "    $name$_ = null;\n"
1151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  }\n"
1152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "  return $name$Builder_;\n"
1153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    "}\n");
1154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
1158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
1159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "get$capitalized_name$FieldBuilder();\n");
1160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1163d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateInitializationCode(io::Printer* printer) const {
1164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
1165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const {
1169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer,
1170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = java.util.Collections.emptyList();\n"
1171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$clear_mutable_bit_builder$;\n",
1172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$Builder_.clear();\n");
1174d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
1175d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
1176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
1178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The code below does two optimizations (non-nested builder case):
1179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   1. If the other list is empty, there's nothing to do. This ensures we
1180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //      don't allocate a new array if we already have an immutable one.
1181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   2. If the other list is non-empty and our current list is empty, we can
1182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //      reuse the other list which is guaranteed to be immutable.
1183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer,
1184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (!other.$name$_.isEmpty()) {\n"
1185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($name$_.isEmpty()) {\n"
1186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_ = other.$name$_;\n"
1187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $clear_mutable_bit_builder$;\n"
1188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  } else {\n"
1189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    ensure$capitalized_name$IsMutable();\n"
1190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_.addAll(other.$name$_);\n"
1191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
1192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
1193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n",
1194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "if (!other.$name$_.isEmpty()) {\n"
1196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($name$Builder_.isEmpty()) {\n"
1197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$Builder_.dispose();\n"
1198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$Builder_ = null;\n"
1199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_ = other.$name$_;\n"
1200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $clear_mutable_bit_builder$;\n"
1201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$Builder_ = \n"
1202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "      com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n"
1203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "         get$capitalized_name$FieldBuilder() : null;\n"
1204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  } else {\n"
1205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$Builder_.addAllMessages(other.$name$_);\n"
1206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
1207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const {
1212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The code below (non-nested builder case) ensures that the result has an
1213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // immutable list. If our list is immutable, we can just reuse it. If not,
1214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // we make it immutable.
1215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintNestedBuilderCondition(printer,
1216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($get_mutable_bit_builder$) {\n"
1217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
1218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_mutable_bit_builder$;\n"
1219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
1220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$_;\n",
1221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$Builder_.build();\n");
1223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const {
1227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (!$get_mutable_bit_parser$) {\n"
1229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = new java.util.ArrayList<$type$>();\n"
1230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $set_mutable_bit_parser$;\n"
1231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
1232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1233d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
1234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
1235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$name$_.add(input.readGroup($number$, $type$.parser(),\n"
1236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "    extensionRegistry));\n");
1237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
1238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
1239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      "$name$_.add(input.readMessage($type$.parser(), extensionRegistry));\n");
1240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
1241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const {
1245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($get_mutable_bit_parser$) {\n"
1247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
1248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
1249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const {
1253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "for (int i = 0; i < $name$_.size(); i++) {\n"
1255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  output.write$group_or_message$($number$, $name$_.get(i));\n"
1256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
1261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
1262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "for (int i = 0; i < $name$_.size(); i++) {\n"
1263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  size += com.google.protobuf.CodedOutputStream\n"
1264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
1265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
1266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const {
1270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
1271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result = result && get$capitalized_name$List()\n"
1272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .equals(other.get$capitalized_name$List());\n");
1273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
1274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
1275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableMessageFieldGenerator::
1276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const {
1277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
1278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (get$capitalized_name$Count() > 0) {\n"
1279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  hash = (37 * hash) + $constant_name$;\n"
1280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
1281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
1282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring RepeatedImmutableMessageFieldGenerator::GetBoxedType() const {
1285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return name_resolver_->GetImmutableClassName(descriptor_->message_type());
1286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
1287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
1288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace java
1289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
1290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
1291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
1292