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