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