1a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Protocol Buffers - Google's data interchange format 2a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Copyright 2008 Google Inc. All rights reserved. 3afb4b72037e3f13db208590fc782c4bc8e27f862Jeff Davidson// https://developers.google.com/protocol-buffers/ 4a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 5a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Redistribution and use in source and binary forms, with or without 6a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// modification, are permitted provided that the following conditions are 7a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// met: 8a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 9a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Redistributions of source code must retain the above copyright 10a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// notice, this list of conditions and the following disclaimer. 11a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Redistributions in binary form must reproduce the above 12a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// copyright notice, this list of conditions and the following disclaimer 13a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// in the documentation and/or other materials provided with the 14a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// distribution. 15a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// * Neither the name of Google Inc. nor the names of its 16a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// contributors may be used to endorse or promote products derived from 17a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// this software without specific prior written permission. 18a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 19a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 31a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Author: kenton@google.com (Kenton Varda) 32a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Author: jonp@google.com (Jon Perlow) 33a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Based on original Protocol Buffers design by 34a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// Sanjay Ghemawat, Jeff Dean, and others. 35a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 36a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <map> 37a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <string> 38a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/logging.h> 40a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/common.h> 41a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_context.h> 42a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_doc_comment.h> 43a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_helpers.h> 44a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_name_resolver.h> 45a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/compiler/java/java_string_field.h> 46a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/io/printer.h> 47a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/wire_format.h> 48a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson#include <google/protobuf/stubs/strutil.h> 49a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 50a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace google { 51a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace protobuf { 52a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace compiler { 53a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace java { 54a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 55a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing internal::WireFormat; 56a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonusing internal::WireFormatLite; 57a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 58a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonnamespace { 59a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 60a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid SetPrimitiveVariables(const FieldDescriptor* descriptor, 61a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 62a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 63a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const FieldGeneratorInfo* info, 64a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ClassNameResolver* name_resolver, 65a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson map<string, string>* variables) { 66a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonFieldVariables(descriptor, info, variables); 67a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 68a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["empty_list"] = "com.google.protobuf.LazyStringArrayList.EMPTY"; 69a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 70a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["default"] = ImmutableDefaultValue(descriptor, name_resolver); 71a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["default_init"] = 72a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "= " + ImmutableDefaultValue(descriptor, name_resolver); 73a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["capitalized_type"] = "String"; 74a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor)); 75a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["tag_size"] = SimpleItoa( 76a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WireFormat::TagSize(descriptor->number(), GetType(descriptor))); 77a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["null_check"] = 78a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (value == null) {\n" 79a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " throw new NullPointerException();\n" 80a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"; 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["writeString"] = 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "com.google.protobuf.GeneratedMessage.writeString"; 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["computeStringSize"] = 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "com.google.protobuf.GeneratedMessage.computeStringSize"; 85a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 86a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported 87a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // by the proto compiler 88a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["deprecation"] = descriptor->options().deprecated() 89a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson ? "@java.lang.Deprecated " : ""; 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer (*variables)["on_changed"] = "onChanged();"; 91a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 92a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor->file())) { 93a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For singular messages and builders, one bit is used for the hasField bit. 94a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); 95a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); 96a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 97a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Note that these have a trailing ";". 98a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_message"] = 99a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBit(messageBitIndex) + ";"; 100a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_builder"] = 101a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBit(builderBitIndex) + ";"; 102a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_has_field_bit_builder"] = 103a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateClearBit(builderBitIndex) + ";"; 104a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 105a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex); 106a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 107a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_message"] = ""; 108a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_builder"] = ""; 109a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_has_field_bit_builder"] = ""; 110a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 111a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["is_field_present_message"] = 112a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "!get" + (*variables)["capitalized_name"] + "Bytes().isEmpty()"; 113a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 114a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 115a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For repeated builders, one bit is used for whether the array is immutable. 116a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); 117a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); 118a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); 119a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 120a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // For repeated fields, one bit is used for whether the array is immutable 121a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // in the parsing constructor. 122a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_mutable_bit_parser"] = 123a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateGetBitMutableLocal(builderBitIndex); 124a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_mutable_bit_parser"] = 125a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBitMutableLocal(builderBitIndex); 126a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 127a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["get_has_field_bit_from_local"] = 128a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateGetBitFromLocal(builderBitIndex); 129a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson (*variables)["set_has_field_bit_to_local"] = 130a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson GenerateSetBitToLocal(messageBitIndex); 131a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 132a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 133a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace 134a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 135a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 136a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 137a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringFieldGenerator:: 138a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringFieldGenerator(const FieldDescriptor* descriptor, 139a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 140a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 141a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 142a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 143a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builderBitIndex_(builderBitIndex), context_(context), 144a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_(context->GetNameResolver()) { 145a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 146a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetFieldGeneratorInfo(descriptor), 147a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_, &variables_); 148a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 149a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 150a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringFieldGenerator::~ImmutableStringFieldGenerator() {} 151a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 152a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutableStringFieldGenerator::GetNumBitsForMessage() const { 153a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 154a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 155a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 156a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint ImmutableStringFieldGenerator::GetNumBitsForBuilder() const { 157a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 158a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 159a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 160a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// A note about how strings are handled. This code used to just store a String 161a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// in the Message. This had two issues: 162a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 163a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 1. It wouldn't roundtrip byte arrays that were not vaid UTF-8 encoded 164a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// strings, but rather fields that were raw bytes incorrectly marked 165a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// as strings in the proto file. This is common because in the proto1 166a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// syntax, string was the way to indicate bytes and C++ engineers can 167a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// easily make this mistake without affecting the C++ API. By converting to 168a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// strings immediately, some java code might corrupt these byte arrays as 169a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// it passes through a java server even if the field was never accessed by 170a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// application code. 171a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 172a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 2. There's a performance hit to converting between bytes and strings and 173a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// it many cases, the field is never even read by the application code. This 174a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// avoids unnecessary conversions in the common use cases. 175a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 176a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// So now, the field for String is maintained as an Object reference which can 177a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// either store a String or a ByteString. The code uses an instanceof check 178a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// to see which one it has and converts to the other one if needed. It remembers 179a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// the last value requested (in a thread safe manner) as this is most likely 180a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// the one needed next. The thread safety is such that if two threads both 181a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// convert the field because the changes made by each thread were not visible to 182a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// the other, they may cause a conversion to happen more times than would 183a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// otherwise be necessary. This was deemed better than adding synchronization 184a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// overhead. It will not cause any corruption issues or affect the behavior of 185a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// the API. The instanceof check is also highly optimized in the JVM and we 186a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// decided it was better to reduce the memory overhead by not having two 187a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// separate fields but rather use dynamic type checking. 188a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// 189a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// For single fields, the logic for this is done inside the generated code. For 190a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// repeated fields, the logic is done in LazyStringArrayList and 191a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// UnmodifiableLazyStringList. 192a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 193a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const { 194a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 195a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 196a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 197a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$boolean has$capitalized_name$();\n"); 198a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 199a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 200a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 201a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$java.lang.String get$capitalized_name$();\n"); 202a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 203a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 204a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$com.google.protobuf.ByteString\n" 205a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes();\n"); 206a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 207a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 208a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 209a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const { 210a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "private volatile java.lang.Object $name$_;\n"); 212a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 213a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 214a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 215a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 216a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 217a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 218a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $get_has_field_bit_message$;\n" 219a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 220a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 221a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 222a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 223a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 224a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$() {\n" 225a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref = $name$_;\n" 226a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof java.lang.String) {\n" 227a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (java.lang.String) ref;\n" 228a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 229a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString bs = \n" 230a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (com.google.protobuf.ByteString) ref;\n" 231a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String s = bs.toStringUtf8();\n"); 232a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 233a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 234a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = s;\n"); 235a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 236a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 237a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (bs.isValidUtf8()) {\n" 238a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = s;\n" 239a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"); 240a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 241a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 242a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return s;\n" 243a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 244a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 245a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 246a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 247a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 248a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes() {\n" 249a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref = $name$_;\n" 250a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof java.lang.String) {\n" 251a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString b = \n" 252a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString.copyFromUtf8(\n" 253a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (java.lang.String) ref);\n" 254a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = b;\n" 255a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return b;\n" 256a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 257a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (com.google.protobuf.ByteString) ref;\n" 258a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 259a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 260a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 261a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 262a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 263a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const { 264a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 265a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private java.lang.Object $name$_ $default_init$;\n"); 266a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 267a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 268a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 269a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 270a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $get_has_field_bit_builder$;\n" 271a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 272a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 273a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 274a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 275a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 276a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$() {\n" 277a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref = $name$_;\n" 278a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!(ref instanceof java.lang.String)) {\n" 279a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString bs =\n" 280a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (com.google.protobuf.ByteString) ref;\n" 281a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String s = bs.toStringUtf8();\n"); 282a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 283a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 284a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = s;\n"); 285a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 286a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 287a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (bs.isValidUtf8()) {\n" 288a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = s;\n" 289a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"); 290a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 291a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 292a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return s;\n" 293a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 294a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (java.lang.String) ref;\n" 295a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 296a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 297a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 298a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 299a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 300a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 301a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes() {\n" 302a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref = $name$_;\n" 303a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof String) {\n" 304a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString b = \n" 305a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString.copyFromUtf8(\n" 306a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (java.lang.String) ref);\n" 307a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = b;\n" 308a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return b;\n" 309a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 310a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (com.google.protobuf.ByteString) ref;\n" 311a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 312a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 313a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 314a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 315a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 316a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$(\n" 317a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String value) {\n" 318a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$" 319a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_builder$\n" 320a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = value;\n" 321a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 322a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 323a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 324a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 325a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 326a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 327a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_has_field_bit_builder$\n"); 328a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The default value is not a simple literal so we want to avoid executing 329a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // it multiple times. Instead, get the default out of the default instance. 330a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 331a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = getDefaultInstance().get$capitalized_name$();\n"); 332a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 333a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 334a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 335a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 336a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 337a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 338a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 339a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$Bytes(\n" 340a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString value) {\n" 341a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$"); 342a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 343a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 344a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " checkByteStringIsUtf8(value);\n"); 345a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 346a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 347a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_builder$\n" 348a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = value;\n" 349a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 350a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 351a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 352a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 353a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 354a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 355a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer) const { 356a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for primitives 357a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 358a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 359a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 360a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInitializationCode(io::Printer* printer) const { 361a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, "$name$_ = $default$;\n"); 362a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 363a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 364a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 365a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const { 366a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 367a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = $default$;\n" 368a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$clear_has_field_bit_builder$\n"); 369a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 370a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 371a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 372a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const { 373a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 374a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Allow a slight breach of abstraction here in order to avoid forcing 375a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // all string fields to Strings when copying fields from a Message. 376a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 377a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (other.has$capitalized_name$()) {\n" 378a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_builder$\n" 379a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = other.$name$_;\n" 380a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 381a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 382a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 383a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 384a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (!other.get$capitalized_name$().isEmpty()) {\n" 385a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = other.$name$_;\n" 386a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 387a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 388a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 389a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 390a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 391a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 392a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const { 393a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 394a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 395a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_has_field_bit_from_local$) {\n" 396a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_has_field_bit_to_local$;\n" 397a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 398a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 399a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 400a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result.$name$_ = $name$_;\n"); 401a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 402a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 403a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 404a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const { 405a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 406a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 407b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "java.lang.String s = input.readStringRequireUtf8();\n" 408a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_has_field_bit_message$\n" 409a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = s;\n"); 410a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 411a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 412a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "com.google.protobuf.ByteString bs = input.readBytes();\n" 413a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_has_field_bit_message$\n" 414a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = bs;\n"); 415a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 416a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 417a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 418a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 419a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const { 420a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for strings. 421a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 422a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 423a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 424a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const { 425a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 426a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($is_field_present_message$) {\n" 427b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $writeString$(output, $number$, $name$_);\n" 428a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 429a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 430a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 431a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 432a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const { 433a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 434a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($is_field_present_message$) {\n" 435b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " size += $computeStringSize$($number$, $name$_);\n" 436a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 437a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 438a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 439a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 440a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const { 441a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 442a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && get$capitalized_name$()\n" 443a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .equals(other.get$capitalized_name$());\n"); 444a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 445a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 446a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringFieldGenerator:: 447a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const { 448a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 449a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (37 * hash) + $constant_name$;\n"); 450a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 451a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); 452a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 453a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 454a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring ImmutableStringFieldGenerator::GetBoxedType() const { 455a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return "java.lang.String"; 456a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 457a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 458a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 459a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 460a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringOneofFieldGenerator:: 461a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringOneofFieldGenerator(const FieldDescriptor* descriptor, 462a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 463a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 464a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 465a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : ImmutableStringFieldGenerator( 466a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson descriptor, messageBitIndex, builderBitIndex, context) { 467a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson const OneofGeneratorInfo* info = 468a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetOneofGeneratorInfo(descriptor->containing_oneof()); 469a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetCommonOneofVariables(descriptor, info, &variables_); 470a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 471a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 472a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonImmutableStringOneofFieldGenerator:: 473a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~ImmutableStringOneofFieldGenerator() {} 474a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 475a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 476a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const { 477a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 478a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 479a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 480a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 481a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 482a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 483a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $has_oneof_case_message$;\n" 484a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 485a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 486a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 487a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 488a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 489a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$() {\n" 490a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref $default_init$;\n" 491a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 492a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ref = $oneof_name$_;\n" 493a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 494a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof java.lang.String) {\n" 495a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (java.lang.String) ref;\n" 496a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 497a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString bs = \n" 498a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (com.google.protobuf.ByteString) ref;\n" 499a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String s = bs.toStringUtf8();\n"); 500a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 501a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 502a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 503a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = s;\n" 504a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"); 505a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 506a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 507a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (bs.isValidUtf8() && ($has_oneof_case_message$)) {\n" 508a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = s;\n" 509a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"); 510a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 511a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 512a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return s;\n" 513a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 514a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 515a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 516a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 517a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 518a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 519a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes() {\n" 520a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref $default_init$;\n" 521a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 522a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ref = $oneof_name$_;\n" 523a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 524a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof java.lang.String) {\n" 525a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString b = \n" 526a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString.copyFromUtf8(\n" 527a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (java.lang.String) ref);\n" 528a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 529a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = b;\n" 530a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 531a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return b;\n" 532a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 533a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (com.google.protobuf.ByteString) ref;\n" 534a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 535a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 536a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 537a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 538a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 539a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const { 540a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (SupportFieldPresence(descriptor_->file())) { 541a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 542a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 543a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public boolean has$capitalized_name$() {\n" 544a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $has_oneof_case_message$;\n" 545a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 546a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 547a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 548a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 549a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 550a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$() {\n" 551a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref $default_init$;\n" 552a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 553a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ref = $oneof_name$_;\n" 554a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 555a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!(ref instanceof java.lang.String)) {\n" 556a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString bs =\n" 557a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (com.google.protobuf.ByteString) ref;\n" 558a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String s = bs.toStringUtf8();\n" 559a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n"); 560a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 561a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 562a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = s;\n"); 563a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 564a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 565a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (bs.isValidUtf8()) {\n" 566a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = s;\n" 567a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n"); 568a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 569a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 570a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 571a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return s;\n" 572a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 573a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (java.lang.String) ref;\n" 574a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 575a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 576a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 577a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 578a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 579a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 580a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes() {\n" 581a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Object ref $default_init$;\n" 582a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 583a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ref = $oneof_name$_;\n" 584a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 585a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (ref instanceof String) {\n" 586a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString b = \n" 587a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString.copyFromUtf8(\n" 588a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " (java.lang.String) ref);\n" 589a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 590a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = b;\n" 591a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 592a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return b;\n" 593a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 594a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return (com.google.protobuf.ByteString) ref;\n" 595a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 596a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 597a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 598a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 599a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 600a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$(\n" 601a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String value) {\n" 602a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$" 603a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_oneof_case_message$;\n" 604a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = value;\n" 605a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 606a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 607a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 608a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 609a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 610a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 611a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($has_oneof_case_message$) {\n" 612a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_oneof_case_message$;\n" 613a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = null;\n" 614a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 615a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 616a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 617a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 618a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 619a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 620a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 621a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$Bytes(\n" 622a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString value) {\n" 623a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$"); 624a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 625a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 626a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " checkByteStringIsUtf8(value);\n"); 627a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 628a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 629a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_oneof_case_message$;\n" 630a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $oneof_name$_ = value;\n" 631a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 632a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 633a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 634a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 635a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 636a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 637a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const { 638a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Allow a slight breach of abstraction here in order to avoid forcing 639a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // all string fields to Strings when copying fields from a Message. 640a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 641a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_oneof_case_message$;\n" 642a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$oneof_name$_ = other.$oneof_name$_;\n" 643a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$on_changed$\n"); 644a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 645a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 646a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 647a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const { 648a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 649a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 650a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " result.$oneof_name$_ = $oneof_name$_;\n" 651a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 652a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 653a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 654a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 655a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const { 656a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 657a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 658b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "java.lang.String s = input.readStringRequireUtf8();\n" 659a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_oneof_case_message$;\n" 660b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "$oneof_name$_ = s;\n"); 661a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 662a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 663a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "com.google.protobuf.ByteString bs = input.readBytes();\n" 664a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$set_oneof_case_message$;\n" 665a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$oneof_name$_ = bs;\n"); 666a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 667a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 668a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 669a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 670a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const { 671a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 672a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 673b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $writeString$(output, $number$, $oneof_name$_);\n" 674a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 675a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 676a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 677a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid ImmutableStringOneofFieldGenerator:: 678a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const { 679a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 680a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($has_oneof_case_message$) {\n" 681b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " size += $computeStringSize$($number$, $oneof_name$_);\n" 682a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 683a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 684a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 685a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson// =================================================================== 686a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 687a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableStringFieldGenerator:: 688a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableStringFieldGenerator(const FieldDescriptor* descriptor, 689a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int messageBitIndex, 690a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson int builderBitIndex, 691a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson Context* context) 692a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 693a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson builderBitIndex_(builderBitIndex), context_(context), 694a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_(context->GetNameResolver()) { 695a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson SetPrimitiveVariables(descriptor, messageBitIndex, builderBitIndex, 696a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson context->GetFieldGeneratorInfo(descriptor), 697a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson name_resolver_, &variables_); 698a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 699a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 700a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonRepeatedImmutableStringFieldGenerator:: 701a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson~RepeatedImmutableStringFieldGenerator() {} 702a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 703a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutableStringFieldGenerator::GetNumBitsForMessage() const { 704a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 0; 705a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 706a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 707a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonint RepeatedImmutableStringFieldGenerator::GetNumBitsForBuilder() const { 708a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return 1; 709a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 710a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 711a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 712a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInterfaceMembers(io::Printer* printer) const { 713a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 714a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 715a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$com.google.protobuf.ProtocolStringList\n" 716a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$List();\n"); 717a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 718a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 719a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$int get$capitalized_name$Count();\n"); 720a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 721a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 722a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$java.lang.String get$capitalized_name$(int index);\n"); 723a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 724a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 725a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$com.google.protobuf.ByteString\n" 726a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes(int index);\n"); 727a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 728a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 729a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 730a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 731a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMembers(io::Printer* printer) const { 732a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 733a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private com.google.protobuf.LazyStringList $name$_;\n"); 734a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson PrintExtraFieldInfo(variables_, printer); 735a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 736a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 737a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ProtocolStringList\n" 738a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$List() {\n" 739a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_;\n" // note: unmodifiable list 740a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 741a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 742a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 743a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public int get$capitalized_name$Count() {\n" 744a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.size();\n" 745a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 746a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 747a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 748a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" 749a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.get(index);\n" 750a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 751a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 752a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 753a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 754a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes(int index) {\n" 755a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.getByteString(index);\n" 756a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 757a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 758a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 759a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 760a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderMembers(io::Printer* printer) const { 761a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // One field is the list and the bit field keeps track of whether the 762a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list is immutable. If it's immutable, the invariant is that it must 763a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // either an instance of Collections.emptyList() or it's an ArrayList 764a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // wrapped in a Collections.unmodifiableList() wrapper and nobody else has 765a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // a refererence to the underlying ArrayList. This invariant allows us to 766a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // share instances of lists between protocol buffers avoiding expensive 767a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // memory allocations. Note, immutable is a strong guarantee here -- not 768a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // just that the list cannot be modified via the reference but that the 769a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list can never be modified. 770a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 771a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private com.google.protobuf.LazyStringList $name$_ = $empty_list$;\n"); 772a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 773a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 774a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "private void ensure$capitalized_name$IsMutable() {\n" 775a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if (!$get_mutable_bit_builder$) {\n" 776a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = new com.google.protobuf.LazyStringArrayList($name$_);\n" 777a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_mutable_bit_builder$;\n" 778a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 779a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 780a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 781a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // Note: We return an unmodifiable list because otherwise the caller 782a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // could hold on to the returned list and modify it after the message 783a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // has been built, thus mutating the message which is supposed to be 784a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // immutable. 785a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 786a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 787a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ProtocolStringList\n" 788a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$List() {\n" 789a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.getUnmodifiableView();\n" 790a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 791a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 792a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 793a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public int get$capitalized_name$Count() {\n" 794a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.size();\n" 795a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 796a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 797a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 798a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public java.lang.String get$capitalized_name$(int index) {\n" 799a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.get(index);\n" 800a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 801a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 802a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 803a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public com.google.protobuf.ByteString\n" 804a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " get$capitalized_name$Bytes(int index) {\n" 805a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return $name$_.getByteString(index);\n" 806a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 807a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 808a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 809a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder set$capitalized_name$(\n" 810a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " int index, java.lang.String value) {\n" 811a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$" 812a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 813a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.set(index, value);\n" 814a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 815a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 816a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 817a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 818a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 819a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder add$capitalized_name$(\n" 820a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.String value) {\n" 821a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$" 822a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 823a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.add(value);\n" 824a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 825a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 826a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 827a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 828a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 829a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder addAll$capitalized_name$(\n" 830a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " java.lang.Iterable<java.lang.String> values) {\n" 831a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 832a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.AbstractMessageLite.Builder.addAll(\n" 833a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " values, $name$_);\n" 834a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 835a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 836a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 837a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 838a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 839a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder clear$capitalized_name$() {\n" 840a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $empty_list$;\n" 841a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 842a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 843a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 844a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 845a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 846a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson WriteFieldDocComment(printer, descriptor_); 847a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 848a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$deprecation$public Builder add$capitalized_name$Bytes(\n" 849a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " com.google.protobuf.ByteString value) {\n" 850a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$null_check$"); 851a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 852a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 853a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " checkByteStringIsUtf8(value);\n"); 854a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 855a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 856a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 857a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.add(value);\n" 858a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 859a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " return this;\n" 860a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 861a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 862a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 863a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 864a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateFieldBuilderInitializationCode(io::Printer* printer) const { 865a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // noop for primitives 866a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 867a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 868a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 869a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateInitializationCode(io::Printer* printer) const { 870a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, "$name$_ = $empty_list$;\n"); 871a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 872a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 873a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 874a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuilderClearCode(io::Printer* printer) const { 875a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 876a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_ = $empty_list$;\n" 877a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$clear_mutable_bit_builder$;\n"); 878a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 879a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 880a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 881a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateMergingCode(io::Printer* printer) const { 882a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The code below does two optimizations: 883a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 1. If the other list is empty, there's nothing to do. This ensures we 884a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // don't allocate a new array if we already have an immutable one. 885a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // 2. If the other list is non-empty and our current list is empty, we can 886a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // reuse the other list which is guaranteed to be immutable. 887a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 888a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (!other.$name$_.isEmpty()) {\n" 889a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " if ($name$_.isEmpty()) {\n" 890a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = other.$name$_;\n" 891a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 892a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " } else {\n" 893a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " ensure$capitalized_name$IsMutable();\n" 894a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_.addAll(other.$name$_);\n" 895a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " }\n" 896a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $on_changed$\n" 897a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 898a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 899a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 900a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 901a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateBuildingCode(io::Printer* printer) const { 902a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // The code below ensures that the result has an immutable list. If our 903a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson // list is immutable, we can just reuse it. If not, we make it immutable. 904a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 905a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 906a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_mutable_bit_builder$) {\n" 907a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $name$_.getUnmodifiableView();\n" 908a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $clear_mutable_bit_builder$;\n" 909a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n" 910a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result.$name$_ = $name$_;\n"); 911a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 912a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 913a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 914a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingCode(io::Printer* printer) const { 915a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 916a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 917b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "java.lang.String s = input.readStringRequireUtf8();\n"); 918a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 919a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 920a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "com.google.protobuf.ByteString bs = input.readBytes();\n"); 921a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 922a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 923a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (!$get_mutable_bit_parser$) {\n" 924a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = new com.google.protobuf.LazyStringArrayList();\n" 925a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $set_mutable_bit_parser$;\n" 926a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 927a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson if (CheckUtf8(descriptor_)) { 928a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 929a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_.add(s);\n"); 930a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } else { 931a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 932a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "$name$_.add(bs);\n"); 933a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson } 934a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 935a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 936a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 937a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateParsingDoneCode(io::Printer* printer) const { 938a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 939a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if ($get_mutable_bit_parser$) {\n" 940a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " $name$_ = $name$_.getUnmodifiableView();\n" 941a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 942a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 943a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 944a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 945a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializationCode(io::Printer* printer) const { 946b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 947b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "for (int i = 0; i < $name$_.size(); i++) {\n" 948b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " $writeString$(output, $number$, $name$_.getRaw(i));\n" 949b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "}\n"); 950a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 951a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 952a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 953a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateSerializedSizeCode(io::Printer* printer) const { 954a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 955a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "{\n" 956a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " int dataSize = 0;\n"); 957a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Indent(); 958a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 959a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 960a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "for (int i = 0; i < $name$_.size(); i++) {\n" 961b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer " dataSize += computeStringSizeNoTag($name$_.getRaw(i));\n" 962a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 963a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 964a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print( 965a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "size += dataSize;\n"); 966a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 967b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer printer->Print(variables_, 968b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer "size += $tag_size$ * get$capitalized_name$List().size();\n"); 969a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 970a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Outdent(); 971a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print("}\n"); 972a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 973a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 974a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 975a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateEqualsCode(io::Printer* printer) const { 976a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 977a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "result = result && get$capitalized_name$List()\n" 978a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " .equals(other.get$capitalized_name$List());\n"); 979a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 980a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 981a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonvoid RepeatedImmutableStringFieldGenerator:: 982a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff DavidsonGenerateHashCode(io::Printer* printer) const { 983a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson printer->Print(variables_, 984a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "if (get$capitalized_name$Count() > 0) {\n" 985a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " hash = (37 * hash) + $constant_name$;\n" 986a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" 987a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson "}\n"); 988a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 989a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 990a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidsonstring RepeatedImmutableStringFieldGenerator::GetBoxedType() const { 991a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson return "String"; 992a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} 993a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson 994a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace java 995a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace compiler 996a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace protobuf 997a3b2a6da25a76f17c73d31def3952feb0fd2296eJeff Davidson} // namespace google 998