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
38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/common.h>
40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_context.h>
41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_doc_comment.h>
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_helpers.h>
43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_name_resolver.h>
44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_primitive_field.h>
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/io/printer.h>
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/wire_format.h>
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormat;
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleusing internal::WireFormatLite;
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillevoid SetPrimitiveVariables(const FieldDescriptor* descriptor,
60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           int messageBitIndex,
61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           int builderBitIndex,
62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           const FieldGeneratorInfo* info,
63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                           ClassNameResolver* name_resolver,
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville                           map<string, string>* variables) {
65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonFieldVariables(descriptor, info, variables);
66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor));
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor));
69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["field_type"] = (*variables)["type"];
70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["field_list_type"] = "java.util.List<" +
71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      (*variables)["boxed_type"] + ">";
72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["empty_list"] = "java.util.Collections.emptyList()";
73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver);
74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["default_init"] = IsDefaultValueJavaDefault(descriptor) ?
75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "" : ("= " + ImmutableDefaultValue(descriptor, name_resolver));
76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["capitalized_type"] =
77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GetCapitalizedType(descriptor, /* immutable = */ true);
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  (*variables)["tag_size"] = SimpleItoa(
80d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      WireFormat::TagSize(descriptor->number(), GetType(descriptor)));
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (IsReferenceType(GetJavaType(descriptor))) {
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (*variables)["null_check"] =
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  if (value == null) {\n"
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "    throw new NullPointerException();\n"
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        "  }\n";
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (*variables)["null_check"] = "";
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
90a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // by the proto compiler
91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["deprecation"] = descriptor->options().deprecated()
92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      ? "@java.lang.Deprecated " : "";
93d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  int fixed_size = FixedSize(GetType(descriptor));
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (fixed_size != -1) {
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    (*variables)["fixed_size"] = SimpleItoa(fixed_size);
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  (*variables)["on_changed"] = "onChanged();";
98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor->file())) {
100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // For singular messages and builders, one bit is used for the hasField bit.
101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex);
103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    // Note that these have a trailing ";".
105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_message"] =
106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateSetBit(messageBitIndex) + ";";
107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_builder"] =
108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateSetBit(builderBitIndex) + ";";
109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["clear_has_field_bit_builder"] =
110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        GenerateClearBit(builderBitIndex) + ";";
111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex);
113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_message"] = "";
115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["set_has_field_bit_builder"] = "";
116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    (*variables)["clear_has_field_bit_builder"] = "";
117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    if (descriptor->type() == FieldDescriptor::TYPE_BYTES) {
119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      (*variables)["is_field_present_message"] =
120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          "!" + (*variables)["name"] + "_.isEmpty()";
121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    } else {
122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      (*variables)["is_field_present_message"] =
123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          (*variables)["name"] + "_ != " + (*variables)["default"];
124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    }
125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // For repated builders, one bit is used for whether the array is immutable.
128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex);
129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex);
130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex);
131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // For repeated fields, one bit is used for whether the array is immutable
133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // in the parsing constructor.
134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_mutable_bit_parser"] =
135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateGetBitMutableLocal(builderBitIndex);
136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_mutable_bit_parser"] =
137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateSetBitMutableLocal(builderBitIndex);
138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["get_has_field_bit_from_local"] =
140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateGetBitFromLocal(builderBitIndex);
141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  (*variables)["set_has_field_bit_to_local"] =
142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GenerateSetBitToLocal(messageBitIndex);
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator::
150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor,
151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int messageBitIndex,
152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int builderBitIndex,
153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 Context* context)
154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    builderBitIndex_(builderBitIndex), context_(context),
156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name_resolver_(context->GetNameResolver()) {
157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        context->GetFieldGeneratorInfo(descriptor),
159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        name_resolver_, &variables_);
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveFieldGenerator::~ImmutablePrimitiveFieldGenerator() {}
163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const {
165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const {
169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const {
174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$boolean has$capitalized_name$();\n");
178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$$type$ get$capitalized_name$();\n");
182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const {
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private $field_type$ $name$_;\n");
188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $get_has_field_bit_message$;\n"
194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$() {\n"
200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_;\n"
201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const {
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private $field_type$ $name$_ $default_init$;\n");
208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
211a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $get_has_field_bit_builder$;\n"
214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$() {\n"
220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_;\n"
221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$($type$ value) {\n"
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$null_check$"
227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $set_has_field_bit_builder$\n"
228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = value;\n"
229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$() {\n"
236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_has_field_bit_builder$\n");
237d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  JavaType type = GetJavaType(descriptor_);
238d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (type == JAVATYPE_STRING || type == JAVATYPE_BYTES) {
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // The default value is not a simple literal so we want to avoid executing
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // it multiple times.  Instead, get the default out of the default instance.
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  $name$_ = getDefaultInstance().get$capitalized_name$();\n");
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  $name$_ = $default$;\n");
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // noop for primitives
256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
259d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateInitializationCode(io::Printer* printer) const {
260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, "$name$_ = $default$;\n");
261d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
262d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const {
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = $default$;\n"
267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$clear_has_field_bit_builder$\n");
268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const {
272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "if (other.has$capitalized_name$()) {\n"
275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  set$capitalized_name$(other.get$capitalized_name$());\n"
276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  } else {
278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "if (other.get$capitalized_name$() != $default$) {\n"
280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  set$capitalized_name$(other.get$capitalized_name$());\n"
281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const {
287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "if ($get_has_field_bit_from_local$) {\n"
290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  $set_has_field_bit_to_local$;\n"
291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$_;\n");
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const {
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_has_field_bit_message$\n"
301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = input.read$capitalized_type$();\n");
302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const {
306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // noop for primitives.
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const {
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($is_field_present_message$) {\n"
313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  output.write$capitalized_type$($number$, $name$_);\n"
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
318fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
319fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($is_field_present_message$) {\n"
321fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  size += com.google.protobuf.CodedOutputStream\n"
322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .compute$capitalized_type$Size($number$, $name$_);\n"
323fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
324fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
325fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const {
328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  switch (GetJavaType(descriptor_)) {
329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_INT:
330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_LONG:
331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_BOOLEAN:
332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "result = result && (get$capitalized_name$()\n"
334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    == other.get$capitalized_name$());\n");
335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_FLOAT:
338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "result = result && (\n"
340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    java.lang.Float.floatToIntBits(get$capitalized_name$())\n"
341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    == java.lang.Float.floatToIntBits(\n"
342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "        other.get$capitalized_name$()));\n");
343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_DOUBLE:
346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "result = result && (\n"
348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    java.lang.Double.doubleToLongBits(get$capitalized_name$())\n"
349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    == java.lang.Double.doubleToLongBits(\n"
350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "        other.get$capitalized_name$()));\n");
351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_STRING:
354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_BYTES:
355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "result = result && get$capitalized_name$()\n"
357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    .equals(other.get$capitalized_name$());\n");
358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_ENUM:
361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_MESSAGE:
362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    default:
363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GOOGLE_LOG(FATAL) << "Can't get here.";
364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveFieldGenerator::
369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const {
370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "hash = (37 * hash) + $constant_name$;\n");
372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  switch (GetJavaType(descriptor_)) {
373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_INT:
374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + get$capitalized_name$();\n");
376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_LONG:
379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    get$capitalized_name$());\n");
382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_BOOLEAN:
385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(\n"
387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    get$capitalized_name$());\n");
388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_FLOAT:
391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + java.lang.Float.floatToIntBits(\n"
393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    get$capitalized_name$());\n");
394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_DOUBLE:
397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + com.google.protobuf.Internal.hashLong(\n"
399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "    java.lang.Double.doubleToLongBits(get$capitalized_name$()));\n");
400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_STRING:
403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_BYTES:
404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      printer->Print(variables_,
405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson        "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
407a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_ENUM:
409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    case JAVATYPE_MESSAGE:
410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    default:
411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      GOOGLE_LOG(FATAL) << "Can't get here.";
412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      break;
413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring ImmutablePrimitiveFieldGenerator::GetBoxedType() const {
417fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
418fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
419fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
420fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// ===================================================================
421fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator::
423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator(const FieldDescriptor* descriptor,
424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int messageBitIndex,
425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 int builderBitIndex,
426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                 Context* context)
427a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    : ImmutablePrimitiveFieldGenerator(
428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson          descriptor, messageBitIndex, builderBitIndex, context) {
429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  const OneofGeneratorInfo* info =
430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      context->GetOneofGeneratorInfo(descriptor->containing_oneof());
431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetCommonOneofVariables(descriptor, info, &variables_);
432fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
433fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutablePrimitiveOneofFieldGenerator::
435a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~ImmutablePrimitiveOneofFieldGenerator() {}
436fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
438fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMembers(io::Printer* printer) const {
439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $has_oneof_case_message$;\n"
445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$() {\n"
451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($has_oneof_case_message$) {\n"
452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    return ($boxed_type$) $oneof_name$_;\n"
453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $default$;\n"
455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const {
461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  if (SupportFieldPresence(descriptor_->file())) {
462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    WriteFieldDocComment(printer, descriptor_);
463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    printer->Print(variables_,
464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "$deprecation$public boolean has$capitalized_name$() {\n"
465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  return $has_oneof_case_message$;\n"
466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "}\n");
467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  }
468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$() {\n"
472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($has_oneof_case_message$) {\n"
473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    return ($boxed_type$) $oneof_name$_;\n"
474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $default$;\n"
476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
479fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$($type$ value) {\n"
481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$null_check$"
482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $set_oneof_case_message$;\n"
483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $oneof_name$_ = value;\n"
484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return this;\n"
486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$() {\n"
491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($has_oneof_case_message$) {\n"
492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $clear_oneof_case_message$;\n"
493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $oneof_name$_ = null;\n"
494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $on_changed$\n"
495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  }\n"
496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return this;\n"
497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const {
502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  result.$oneof_name$_ = $oneof_name$_;\n"
505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const {
510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "set$capitalized_name$(other.get$capitalized_name$());\n");
512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const {
516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$set_oneof_case_message$;\n"
518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$oneof_name$_ = input.read$capitalized_type$();\n");
519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const {
523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  output.write$capitalized_type$(\n"
526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "      $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutablePrimitiveOneofFieldGenerator::
531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const {
532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($has_oneof_case_message$) {\n"
534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  size += com.google.protobuf.CodedOutputStream\n"
535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .compute$capitalized_type$Size(\n"
536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "        $number$, ($type$)(($boxed_type$) $oneof_name$_));\n"
537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// ===================================================================
541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator::
543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator(const FieldDescriptor* descriptor,
544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                         int messageBitIndex,
545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                         int builderBitIndex,
546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                                         Context* context)
547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    builderBitIndex_(builderBitIndex), context_(context),
549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    name_resolver_(context->GetNameResolver()) {
550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex,
551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        context->GetFieldGeneratorInfo(descriptor),
552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson                        name_resolver_, &variables_);
553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutablePrimitiveFieldGenerator::
556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~RepeatedImmutablePrimitiveFieldGenerator() {}
557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForMessage() const {
559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 0;
560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutablePrimitiveFieldGenerator::GetNumBitsForBuilder() const {
563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  return 1;
564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const {
568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$java.util.List<$boxed_type$> get$capitalized_name$List();\n");
571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$int get$capitalized_name$Count();\n");
574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$$type$ get$capitalized_name$(int index);\n");
577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const {
582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private $field_list_type$ $name$_;\n");
584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  PrintExtraFieldInfo(variables_, printer);
585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public java.util.List<$boxed_type$>\n"
588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    get$capitalized_name$List() {\n"
589fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_;\n"   // note:  unmodifiable list
590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public int get$capitalized_name$Count() {\n"
594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.size();\n"
595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
599fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return $name$_.get(index);\n"
600fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
601fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
602b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (descriptor_->is_packed() &&
603b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer      context_->HasGeneratedMethods(descriptor_->containing_type())) {
604fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
605d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville      "private int $name$MemoizedSerializedSize = -1;\n");
606fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
607fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
608fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
610fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuilderMembers(io::Printer* printer) const {
611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // One field is the list and the bit field keeps track of whether the
612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // list is immutable. If it's immutable, the invariant is that it must
613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // either an instance of Collections.emptyList() or it's an ArrayList
614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // a refererence to the underlying ArrayList. This invariant allows us to
616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // share instances of lists between protocol buffers avoiding expensive
617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // memory allocations. Note, immutable is a strong guarantee here -- not
618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // just that the list cannot be modified via the reference but that the
619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // list can never be modified.
620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private $field_list_type$ $name$_ = $empty_list$;\n");
622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
623fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "private void ensure$capitalized_name$IsMutable() {\n"
625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if (!$get_mutable_bit_builder$) {\n"
626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_ = new java.util.ArrayList<$boxed_type$>($name$_);\n"
627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $set_mutable_bit_builder$;\n"
628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "   }\n"
629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
631fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Note:  We return an unmodifiable list because otherwise the caller
632fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //   could hold on to the returned list and modify it after the message
633fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //   has been built, thus mutating the message which is supposed to be
634fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    //   immutable.
635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public java.util.List<$boxed_type$>\n"
638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    get$capitalized_name$List() {\n"
639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return java.util.Collections.unmodifiableList($name$_);\n"
640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public int get$capitalized_name$Count() {\n"
644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.size();\n"
645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  return $name$_.get(index);\n"
650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder set$capitalized_name$(\n"
654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    int index, $type$ value) {\n"
655fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$null_check$"
656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  ensure$capitalized_name$IsMutable();\n"
657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_.set(index, value);\n"
658a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
659fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
660a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder add$capitalized_name$($type$ value) {\n"
664fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "$null_check$"
665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  ensure$capitalized_name$IsMutable();\n"
666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_.add(value);\n"
667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
668fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder addAll$capitalized_name$(\n"
673fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "    java.lang.Iterable<? extends $boxed_type$> values) {\n"
674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  ensure$capitalized_name$IsMutable();\n"
675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "      values, $name$_);\n"
677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
678fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  WriteFieldDocComment(printer, descriptor_);
681a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$deprecation$public Builder clear$capitalized_name$() {\n"
683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = $empty_list$;\n"
684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_mutable_bit_builder$;\n"
685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
686fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  return this;\n"
687fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
688fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
689fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // noop for primitives
693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
696d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateInitializationCode(io::Printer* printer) const {
697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_, "$name$_ = $empty_list$;\n");
698d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
699d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const {
702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_ = $empty_list$;\n"
704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$clear_mutable_bit_builder$;\n");
705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
708fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateMergingCode(io::Printer* printer) const {
709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The code below does two optimizations:
710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   1. If the other list is empty, there's nothing to do. This ensures we
711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //      don't allocate a new array if we already have an immutable one.
712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //   2. If the other list is non-empty and our current list is empty, we can
713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  //      reuse the other list which is guaranteed to be immutable.
714fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
715fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "if (!other.$name$_.isEmpty()) {\n"
716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  if ($name$_.isEmpty()) {\n"
717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_ = other.$name$_;\n"
718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $clear_mutable_bit_builder$;\n"
719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  } else {\n"
720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    ensure$capitalized_name$IsMutable();\n"
721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    $name$_.addAll(other.$name$_);\n"
722fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  }\n"
723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $on_changed$\n"
724fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "}\n");
725fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
726fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
728fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateBuildingCode(io::Printer* printer) const {
729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // The code below ensures that the result has an immutable list. If our
730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  // list is immutable, we can just reuse it. If not, we make it immutable.
731fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($get_mutable_bit_builder$) {\n"
733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $clear_mutable_bit_builder$;\n"
735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result.$name$_ = $name$_;\n");
737fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
738fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
740fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateParsingCode(io::Printer* printer) const {
741d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (!$get_mutable_bit_parser$) {\n"
743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = new java.util.ArrayList<$boxed_type$>();\n"
744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $set_mutable_bit_parser$;\n"
745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "$name$_.add(input.read$capitalized_type$());\n");
747d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville}
748d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville
749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
750d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleGenerateParsingCodeFromPacked(io::Printer* printer) const {
751d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  printer->Print(variables_,
752d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "int length = input.readRawVarint32();\n"
753d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "int limit = input.pushLimit(length);\n"
754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (!$get_mutable_bit_parser$ && input.getBytesUntilLimit() > 0) {\n"
755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = new java.util.ArrayList<$boxed_type$>();\n"
756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $set_mutable_bit_parser$;\n"
757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n"
758d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "while (input.getBytesUntilLimit() > 0) {\n"
759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_.add(input.read$capitalized_type$());\n"
760d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "}\n"
761d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville    "input.popLimit(limit);\n");
762fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
763fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const {
766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if ($get_mutable_bit_parser$) {\n"
768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
773fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializationCode(io::Printer* printer) const {
774b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (descriptor_->is_packed()) {
775b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // We invoke getSerializedSize in writeTo for messages that have packed
776b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // fields in ImmutableMessageGenerator::GenerateMessageSerializationMethods.
777b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer    // That makes it safe to rely on the memoized size here.
778fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
779fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (get$capitalized_name$List().size() > 0) {\n"
780fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  output.writeRawVarint32($tag$);\n"
781fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
782fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n"
783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "for (int i = 0; i < $name$_.size(); i++) {\n"
784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  output.write$capitalized_type$NoTag($name$_.get(i));\n"
785fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
786fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
787fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "for (int i = 0; i < $name$_.size(); i++) {\n"
789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "  output.write$capitalized_type$($number$, $name$_.get(i));\n"
790fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
791fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
792fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
793fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
795fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
796fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(variables_,
797fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "{\n"
798fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    "  int dataSize = 0;\n");
799fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Indent();
800fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
801d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville  if (FixedSize(GetType(descriptor_)) == -1) {
802fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "for (int i = 0; i < $name$_.size(); i++) {\n"
804fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  dataSize += com.google.protobuf.CodedOutputStream\n"
805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson      "    .compute$capitalized_type$SizeNoTag($name$_.get(i));\n"
806fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
807fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
808fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
809fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n");
810fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
811fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
812fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print(
813fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "size += dataSize;\n");
814fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
815b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (descriptor_->is_packed()) {
816fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
817fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "if (!get$capitalized_name$List().isEmpty()) {\n"
818fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  size += $tag_size$;\n"
819fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "  size += com.google.protobuf.CodedOutputStream\n"
820fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "      .computeInt32SizeNoTag(dataSize);\n"
821fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "}\n");
822fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
823fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
824fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "size += $tag_size$ * get$capitalized_name$List().size();\n");
825fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
826fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
827fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // cache the data size for packed fields.
828b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer  if (descriptor_->is_packed()) {
829fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    printer->Print(variables_,
830fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      "$name$MemoizedSerializedSize = dataSize;\n");
831fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
832fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
833fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Outdent();
834fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  printer->Print("}\n");
835fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
836fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const {
839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "result = result && get$capitalized_name$List()\n"
841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "    .equals(other.get$capitalized_name$List());\n");
842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutablePrimitiveFieldGenerator::
845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const {
846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson  printer->Print(variables_,
847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "if (get$capitalized_name$Count() > 0) {\n"
848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  hash = (37 * hash) + $constant_name$;\n"
849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson    "}\n");
851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson}
852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson
853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring RepeatedImmutablePrimitiveFieldGenerator::GetBoxedType() const {
854fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
855fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
856fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
857fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace java
858fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
859fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
860fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
861