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