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