15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Protocol Buffers - Google's data interchange format 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2008 Google Inc. All rights reserved. 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://code.google.com/p/protobuf/ 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Redistribution and use in source and binary forms, with or without 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// modification, are permitted provided that the following conditions are 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// met: 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions of source code must retain the above copyright 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// notice, this list of conditions and the following disclaimer. 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Redistributions in binary form must reproduce the above 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// copyright notice, this list of conditions and the following disclaimer 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// in the documentation and/or other materials provided with the 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// distribution. 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Neither the name of Google Inc. nor the names of its 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// contributors may be used to endorse or promote products derived from 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this software without specific prior written permission. 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Author: kenton@google.com (Kenton Varda) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Based on original Protocol Buffers design by 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sanjay Ghemawat, Jeff Dean, and others. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_message_field.h> 393d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch#include <google/protobuf/compiler/java/java_doc_comment.h> 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/compiler/java/java_helpers.h> 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/io/printer.h> 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/wire_format.h> 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <google/protobuf/stubs/strutil.h> 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace google { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace protobuf { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace compiler { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace java { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(kenton): Factor out a "SetCommonFieldVariables()" to get rid of 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// repeat code between this and the other field types. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SetMessageVariables(const FieldDescriptor* descriptor, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) map<string, string>* variables) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["name"] = 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnderscoresToCamelCase(descriptor); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["capitalized_name"] = 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UnderscoresToCapitalizedCamelCase(descriptor); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["constant_name"] = FieldConstantName(descriptor); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["number"] = SimpleItoa(descriptor->number()); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["type"] = ClassName(descriptor->message_type()); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["group_or_message"] = 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ? 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Group" : "Message"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // by the proto compiler 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["deprecation"] = descriptor->options().deprecated() 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ? "@java.lang.Deprecated " : ""; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["on_changed"] = 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For singular messages and builders, one bit is used for the hasField bit. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex); 773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch (*variables)["set_has_field_bit_message"] = GenerateSetBit(messageBitIndex); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_has_field_bit_builder"] = GenerateSetBit(builderBitIndex); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["clear_has_field_bit_builder"] = 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateClearBit(builderBitIndex); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For repated builders, one bit is used for whether the array is immutable. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // For repeated fields, one bit is used for whether the array is immutable 903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // in the parsing constructor. 913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch (*variables)["get_mutable_bit_parser"] = 923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GenerateGetBitMutableLocal(builderBitIndex); 933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch (*variables)["set_mutable_bit_parser"] = 943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch GenerateSetBitMutableLocal(builderBitIndex); 953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["get_has_field_bit_from_local"] = 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateGetBitFromLocal(builderBitIndex); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*variables)["set_has_field_bit_to_local"] = 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GenerateSetBitToLocal(messageBitIndex); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator:: 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator(const FieldDescriptor* descriptor, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builderBitIndex_(builderBitIndex) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &variables_); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MessageFieldGenerator::~MessageFieldGenerator() {} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MessageFieldGenerator::GetNumBitsForMessage() const { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MessageFieldGenerator::GetNumBitsForBuilder() const { 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jonp): In the future, consider having a method specific to the 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interface so that builders can choose dynamically to either return a 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message or a nested builder, so that asking for the interface doesn't 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cause a message to ever be built. 1323d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1333d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 1343d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$deprecation$boolean has$capitalized_name$();\n"); 1353d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$$type$ get$capitalized_name$();\n"); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 1403d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n"); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1493d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "private $type$ $name$_;\n"); 1503d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1513d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public boolean has$capitalized_name$() {\n" 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $get_has_field_bit_message$;\n" 1543d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 1553d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1563d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$ get$capitalized_name$() {\n" 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 1623d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::PrintNestedBuilderCondition( 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::Printer* printer, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* regular_case, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* nested_builder_case) const { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "if ($name$Builder_ == null) {\n"); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, regular_case); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("} else {\n"); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, nested_builder_case); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("}\n"); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, regular_case); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator::PrintNestedBuilderFunction( 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::Printer* printer, 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method_prototype, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* regular_case, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* nested_builder_case, 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* trailing_code) const { 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, method_prototype); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(" {\n"); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trailing_code != NULL) { 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, trailing_code); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("}\n"); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const { 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When using nested-builders, the code initially works just like the 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-nested builder case. It only creates a nested builder lazily on 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // demand and then forever delegates to it after creation. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when the builder is null. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private $type$ $name$_ = $type$.getDefaultInstance();\n"); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this builder is non-null, it is used and the other fields are 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ignored. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private com.google.protobuf.SingleFieldBuilder<\n" 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;" 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n"); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The comments above the methods below are based on a hypothetical 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // field of type "Field" called "Field". 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boolean hasField() 2293d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public boolean has$capitalized_name$() {\n" 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $get_has_field_bit_builder$;\n" 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field getField() 2363d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$ get$capitalized_name$()", 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$_;\n", 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$Builder_.getMessage();\n", 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field.Builder setField(Field value) 2473d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$($type$ value)", 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (value == null) {\n" 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " throw new NullPointerException();\n" 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = value;\n" 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.setMessage(value);\n", 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$set_has_field_bit_builder$;\n" 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field.Builder setField(Field.Builder builderForValue) 2633d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$(\n" 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$.Builder builderForValue)", 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = builderForValue.build();\n" 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.setMessage(builderForValue.build());\n", 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$set_has_field_bit_builder$;\n" 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field.Builder mergeField(Field value) 2773d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder merge$capitalized_name$($type$ value)", 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_builder$ &&\n" 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ != $type$.getDefaultInstance()) {\n" 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ =\n" 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n" 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "} else {\n" 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = value;\n" 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.mergeFrom(value);\n", 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$set_has_field_bit_builder$;\n" 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field.Builder clearField() 2963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder clear$capitalized_name$()", 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = $type$.getDefaultInstance();\n" 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.clear();\n", 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$clear_has_field_bit_builder$;\n" 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 3093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n" 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_has_field_bit_builder$;\n" 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return get$capitalized_name$FieldBuilder().getBuilder();\n" 3153d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 3163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 3173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n" 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_ != null) {\n" 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$Builder_.getMessageOrBuilder();\n" 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 3243d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 3253d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 3263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private com.google.protobuf.SingleFieldBuilder<\n" 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder> \n" 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$FieldBuilder() {\n" 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_ == null) {\n" 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n" 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder>(\n" 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_,\n" 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " getParentForChildren(),\n" 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " isClean());\n" 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = null;\n" 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$Builder_;\n" 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer) const { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "get$capitalized_name$FieldBuilder();\n"); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "$name$_ = $type$.getDefaultInstance();\n"); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const { 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = $type$.getDefaultInstance();\n", 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.clear();\n"); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "$clear_has_field_bit_builder$;\n"); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const { 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (other.has$capitalized_name$()) {\n" 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " merge$capitalized_name$(other.get$capitalized_name$());\n" 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const { 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_from_local$) {\n" 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_has_field_bit_to_local$;\n" 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$_;\n", 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$Builder_.build();\n"); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const { 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$type$.Builder subBuilder = null;\n" 3903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "if ($get_has_field_bit_message$) {\n" 3913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " subBuilder = $name$_.toBuilder();\n" 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 3963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$name$_ = input.readGroup($number$, $type$.PARSER,\n" 3973d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " extensionRegistry);\n"); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4003d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$name$_ = input.readMessage($type$.PARSER, extensionRegistry);\n"); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "if (subBuilder != null) {\n" 4053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " subBuilder.mergeFrom($name$_);\n" 4063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " $name$_ = subBuilder.buildPartial();\n" 4073d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 4083d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 4093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$set_has_field_bit_message$;\n"); 4103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 4113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch 4123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid MessageFieldGenerator:: 4133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const { 4143d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch // noop for messages. 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_message$) {\n" 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.write$group_or_message$($number$, $name$_);\n" 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_has_field_bit_message$) {\n" 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " size += com.google.protobuf.CodedOutputStream\n" 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .compute$group_or_message$Size($number$, $name$_);\n" 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const { 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result = result && get$capitalized_name$()\n" 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .equals(other.get$capitalized_name$());\n"); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MessageFieldGenerator:: 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const { 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hash = (37 * hash) + $constant_name$;\n" 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hash = (53 * hash) + get$capitalized_name$().hashCode();\n"); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string MessageFieldGenerator::GetBoxedType() const { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ClassName(descriptor_->message_type()); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// =================================================================== 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator:: 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int messageBitIndex, 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int builderBitIndex) 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : descriptor_(descriptor), messageBitIndex_(messageBitIndex), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) builderBitIndex_(builderBitIndex) { 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetMessageVariables(descriptor, messageBitIndex, builderBitIndex, 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &variables_); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)RepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {} 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedMessageFieldGenerator::GetNumBitsForMessage() const { 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int RepeatedMessageFieldGenerator::GetNumBitsForBuilder() const { 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInterfaceMembers(io::Printer* printer) const { 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(jonp): In the future, consider having methods specific to the 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // interface so that builders can choose dynamically to either return a 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message or a nested builder, so that asking for the interface doesn't 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cause a message to ever be built. 4803d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$java.util.List<$type$> \n" 4833d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " get$capitalized_name$List();\n"); 4843d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4853d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 4863d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$deprecation$$type$ get$capitalized_name$(int index);\n"); 4873d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4883d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$int get$capitalized_name$Count();\n"); 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 4913d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$java.util.List<? extends $type$OrBuilder> \n" 4943d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " get$capitalized_name$OrBuilderList();\n"); 4953d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 4963d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n" 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index);\n"); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMembers(io::Printer* printer) const { 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 5053d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "private java.util.List<$type$> $name$_;\n"); 5063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5073d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n" 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" // note: unmodifiable list 5103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 5113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<? extends $type$OrBuilder> \n" 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$OrBuilderList() {\n" 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_;\n" 5163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 5173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public int get$capitalized_name$Count() {\n" 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.size();\n" 5213d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 5223d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5233d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$ get$capitalized_name$(int index) {\n" 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.get(index);\n" 5263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 5273d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 5283d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index) {\n" 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.get(index);\n" 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::PrintNestedBuilderCondition( 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::Printer* printer, 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* regular_case, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* nested_builder_case) const { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "if ($name$Builder_ == null) {\n"); 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, regular_case); 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("} else {\n"); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, nested_builder_case); 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("}\n"); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, regular_case); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator::PrintNestedBuilderFunction( 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) io::Printer* printer, 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* method_prototype, 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* regular_case, 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* nested_builder_case, 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* trailing_code) const { 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, method_prototype); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(" {\n"); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Indent(); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, regular_case, nested_builder_case); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (trailing_code != NULL) { 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, trailing_code); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Outdent(); 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print("}\n"); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderMembers(io::Printer* printer) const { 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When using nested-builders, the code initially works just like the 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // non-nested builder case. It only creates a nested builder lazily on 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // demand and then forever delegates to it after creation. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used when the builder is null. 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // One field is the list and the other field keeps track of whether the 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list is immutable. If it's immutable, the invariant is that it must 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // either an instance of Collections.emptyList() or it's an ArrayList 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // wrapped in a Collections.unmodifiableList() wrapper and nobody else has 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a refererence to the underlying ArrayList. This invariant allows us to 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // share instances of lists between protocol buffers avoiding expensive 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // memory allocations. Note, immutable is a strong guarantee here -- not 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // just that the list cannot be modified via the reference but that the 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list can never be modified. 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private java.util.List<$type$> $name$_ =\n" 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.util.Collections.emptyList();\n" 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private void ensure$capitalized_name$IsMutable() {\n" 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if (!$get_mutable_bit_builder$) {\n" 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = new java.util.ArrayList<$type$>($name$_);\n" 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $set_mutable_bit_builder$;\n" 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n"); 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this builder is non-null, it is used and the other fields are 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ignored. 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private com.google.protobuf.RepeatedFieldBuilder<\n" 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n" 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "\n"); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The comments above the methods below are based on a hypothetical 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // repeated field of type "Field" called "RepeatedField". 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // List<Field> getRepeatedFieldList() 6133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<$type$> get$capitalized_name$List()", 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return java.util.Collections.unmodifiableList($name$_);\n", 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$Builder_.getMessageList();\n", 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // int getRepeatedFieldCount() 6233d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public int get$capitalized_name$Count()", 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$_.size();\n", 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$Builder_.getCount();\n", 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Field getRepeatedField(int index) 6333d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$ get$capitalized_name$(int index)", 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$_.get(index);\n", 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return $name$Builder_.getMessage(index);\n", 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NULL); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder setRepeatedField(int index, Field value) 6443d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$(\n" 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index, $type$ value)", 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (value == null) {\n" 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " throw new NullPointerException();\n" 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.set(index, value);\n" 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.setMessage(index, value);\n", 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder setRepeatedField(int index, Field.Builder builderForValue) 6583d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder set$capitalized_name$(\n" 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index, $type$.Builder builderForValue)", 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.set(index, builderForValue.build());\n" 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.setMessage(index, builderForValue.build());\n", 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder addRepeatedField(Field value) 6723d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder add$capitalized_name$($type$ value)", 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (value == null) {\n" 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " throw new NullPointerException();\n" 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.add(value);\n" 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.addMessage(value);\n", 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder addRepeatedField(int index, Field value) 6893d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder add$capitalized_name$(\n" 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index, $type$ value)", 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (value == null) {\n" 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " throw new NullPointerException();\n" 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.add(index, value);\n" 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.addMessage(index, value);\n", 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder addRepeatedField(Field.Builder builderForValue) 7063d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder add$capitalized_name$(\n" 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$.Builder builderForValue)", 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.add(builderForValue.build());\n" 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.addMessage(builderForValue.build());\n", 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder addRepeatedField(int index, Field.Builder builderForValue) 7203d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder add$capitalized_name$(\n" 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index, $type$.Builder builderForValue)", 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.add(index, builderForValue.build());\n" 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.addMessage(index, builderForValue.build());\n", 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder addAllRepeatedField(Iterable<Field> values) 7343d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder addAll$capitalized_name$(\n" 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " java.lang.Iterable<? extends $type$> values)", 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "super.addAll(values, $name$_);\n" 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.addAllMessages(values);\n", 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder clearAllRepeatedField() 7483d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder clear$capitalized_name$()", 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = java.util.Collections.emptyList();\n" 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$clear_mutable_bit_builder$;\n" 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.clear();\n", 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Builder removeRepeatedField(int index) 7613d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderFunction(printer, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public Builder remove$capitalized_name$(int index)", 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ensure$capitalized_name$IsMutable();\n" 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_.remove(index);\n" 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$on_changed$\n", 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.remove(index);\n", 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "return this;\n"); 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (HasNestedBuilders(descriptor_->containing_type())) { 7743d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n" 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index) {\n" 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return get$capitalized_name$FieldBuilder().getBuilder(index);\n" 7793d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7813d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7823d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n" 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index) {\n" 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_ == null) {\n" 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$_.get(index);" 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$Builder_.getMessageOrBuilder(index);\n" 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 7903d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7923d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 7933d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<? extends $type$OrBuilder> \n" 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$OrBuilderList() {\n" 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_ != null) {\n" 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$Builder_.getMessageOrBuilderList();\n" 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return java.util.Collections.unmodifiableList($name$_);\n" 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 8013d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8033d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 8043d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n" 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return get$capitalized_name$FieldBuilder().addBuilder(\n" 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$.getDefaultInstance());\n" 8083d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 8093d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 8103d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n" 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " int index) {\n" 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return get$capitalized_name$FieldBuilder().addBuilder(\n" 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " index, $type$.getDefaultInstance());\n" 8153d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 8163d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch WriteFieldDocComment(printer, descriptor_); 8173d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch printer->Print(variables_, 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$deprecation$public java.util.List<$type$.Builder> \n" 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$BuilderList() {\n" 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return get$capitalized_name$FieldBuilder().getBuilderList();\n" 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "private com.google.protobuf.RepeatedFieldBuilder<\n" 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder> \n" 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$FieldBuilder() {\n" 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_ == null) {\n" 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n" 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $type$, $type$.Builder, $type$OrBuilder>(\n" 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_,\n" 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $get_mutable_bit_builder$,\n" 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " getParentForChildren(),\n" 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " isClean());\n" 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = null;\n" 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " return $name$Builder_;\n" 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateFieldBuilderInitializationCode(io::Printer* printer) const { 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "get$capitalized_name$FieldBuilder();\n"); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateInitializationCode(io::Printer* printer) const { 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n"); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuilderClearCode(io::Printer* printer) const { 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$_ = java.util.Collections.emptyList();\n" 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$clear_mutable_bit_builder$;\n", 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "$name$Builder_.clear();\n"); 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateMergingCode(io::Printer* printer) const { 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The code below does two optimizations (non-nested builder case): 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1. If the other list is empty, there's nothing to do. This ensures we 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // don't allocate a new array if we already have an immutable one. 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2. If the other list is non-empty and our current list is empty, we can 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // reuse the other list which is guaranteed to be immutable. 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (!other.$name$_.isEmpty()) {\n" 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$_.isEmpty()) {\n" 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = other.$name$_;\n" 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " ensure$capitalized_name$IsMutable();\n" 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_.addAll(other.$name$_);\n" 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $on_changed$\n" 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n", 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (!other.$name$_.isEmpty()) {\n" 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " if ($name$Builder_.isEmpty()) {\n" 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_.dispose();\n" 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_ = null;\n" 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = other.$name$_;\n" 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_ = \n" 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n" 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " get$capitalized_name$FieldBuilder() : null;\n" 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " } else {\n" 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$Builder_.addAllMessages(other.$name$_);\n" 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " }\n" 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 8915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateBuildingCode(io::Printer* printer) const { 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The code below (non-nested builder case) ensures that the result has an 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // immutable list. If our list is immutable, we can just reuse it. If not, 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we make it immutable. 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrintNestedBuilderCondition(printer, 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if ($get_mutable_bit_builder$) {\n" 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " $clear_mutable_bit_builder$;\n" 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n" 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$_;\n", 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result.$name$_ = $name$Builder_.build();\n"); 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 9095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateParsingCode(io::Printer* printer) const { 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9113d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "if (!$get_mutable_bit_parser$) {\n" 9123d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " $name$_ = new java.util.ArrayList<$type$>();\n" 9133d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " $set_mutable_bit_parser$;\n" 9143d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9183d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$name$_.add(input.readGroup($number$, $type$.PARSER,\n" 9193d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " extensionRegistry));\n"); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 9215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9223d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "$name$_.add(input.readMessage($type$.PARSER, extensionRegistry));\n"); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9243d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch} 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9263d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdochvoid RepeatedMessageFieldGenerator:: 9273d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben MurdochGenerateParsingDoneCode(io::Printer* printer) const { 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9293d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "if ($get_mutable_bit_parser$) {\n" 9303d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch " $name$_ = java.util.Collections.unmodifiableList($name$_);\n" 9313d4dfb6f11fb4e934d658743a8efc26d5490fdb0Ben Murdoch "}\n"); 9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializationCode(io::Printer* printer) const { 9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int i = 0; i < $name$_.size(); i++) {\n" 9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " output.write$group_or_message$($number$, $name$_.get(i));\n" 9395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 9435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateSerializedSizeCode(io::Printer* printer) const { 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "for (int i = 0; i < $name$_.size(); i++) {\n" 9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " size += com.google.protobuf.CodedOutputStream\n" 9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .compute$group_or_message$Size($number$, $name$_.get(i));\n" 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateEqualsCode(io::Printer* printer) const { 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "result = result && get$capitalized_name$List()\n" 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " .equals(other.get$capitalized_name$List());\n"); 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RepeatedMessageFieldGenerator:: 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GenerateHashCode(io::Printer* printer) const { 9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) printer->Print(variables_, 9615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "if (get$capitalized_name$Count() > 0) {\n" 9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " hash = (37 * hash) + $constant_name$;\n" 9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) " hash = (53 * hash) + get$capitalized_name$List().hashCode();\n" 9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "}\n"); 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string RepeatedMessageFieldGenerator::GetBoxedType() const { 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ClassName(descriptor_->message_type()); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace java 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace compiler 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace protobuf 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace google 975