LCOV - code coverage report
Current view: top level - third_party/protobuf/src/google/protobuf/compiler/java - java_message_field.cc (source / functions) Hit Total Coverage
Test: tmp.zDYK9MVh93 Lines: 0 356 0.0 %
Date: 2015-10-10 Functions: 0 55 0.0 %

          Line data    Source code
       1             : // Protocol Buffers - Google's data interchange format
       2             : // Copyright 2008 Google Inc.  All rights reserved.
       3             : // https://developers.google.com/protocol-buffers/
       4             : //
       5             : // Redistribution and use in source and binary forms, with or without
       6             : // modification, are permitted provided that the following conditions are
       7             : // met:
       8             : //
       9             : //     * Redistributions of source code must retain the above copyright
      10             : // notice, this list of conditions and the following disclaimer.
      11             : //     * Redistributions in binary form must reproduce the above
      12             : // copyright notice, this list of conditions and the following disclaimer
      13             : // in the documentation and/or other materials provided with the
      14             : // distribution.
      15             : //     * Neither the name of Google Inc. nor the names of its
      16             : // contributors may be used to endorse or promote products derived from
      17             : // this software without specific prior written permission.
      18             : //
      19             : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
      20             : // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
      21             : // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
      22             : // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
      23             : // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
      24             : // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
      25             : // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
      26             : // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      27             : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
      28             : // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
      29             : // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
      30             : 
      31             : // Author: kenton@google.com (Kenton Varda)
      32             : //  Based on original Protocol Buffers design by
      33             : //  Sanjay Ghemawat, Jeff Dean, and others.
      34             : 
      35             : #include <map>
      36             : #include <string>
      37             : 
      38             : #include <google/protobuf/compiler/java/java_context.h>
      39             : #include <google/protobuf/compiler/java/java_message_field.h>
      40             : #include <google/protobuf/compiler/java/java_doc_comment.h>
      41             : #include <google/protobuf/compiler/java/java_helpers.h>
      42             : #include <google/protobuf/compiler/java/java_name_resolver.h>
      43             : #include <google/protobuf/io/printer.h>
      44             : #include <google/protobuf/wire_format.h>
      45             : #include <google/protobuf/stubs/strutil.h>
      46             : 
      47             : namespace google {
      48             : namespace protobuf {
      49             : namespace compiler {
      50             : namespace java {
      51             : 
      52             : namespace {
      53             : 
      54           0 : void SetMessageVariables(const FieldDescriptor* descriptor,
      55             :                          int messageBitIndex,
      56             :                          int builderBitIndex,
      57             :                          const FieldGeneratorInfo* info,
      58             :                          ClassNameResolver* name_resolver,
      59             :                          map<string, string>* variables) {
      60           0 :   SetCommonFieldVariables(descriptor, info, variables);
      61             : 
      62           0 :   (*variables)["type"] =
      63             :       name_resolver->GetImmutableClassName(descriptor->message_type());
      64           0 :   (*variables)["mutable_type"] =
      65             :       name_resolver->GetMutableClassName(descriptor->message_type());
      66           0 :   (*variables)["group_or_message"] =
      67           0 :     (GetType(descriptor) == FieldDescriptor::TYPE_GROUP) ?
      68             :     "Group" : "Message";
      69             :   // TODO(birdo): Add @deprecated javadoc when generating javadoc is supported
      70             :   // by the proto compiler
      71           0 :   (*variables)["deprecation"] = descriptor->options().deprecated()
      72             :       ? "@java.lang.Deprecated " : "";
      73           0 :   (*variables)["on_changed"] =
      74           0 :       HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : "";
      75             : 
      76           0 :   if (SupportFieldPresence(descriptor->file())) {
      77             :     // For singular messages and builders, one bit is used for the hasField bit.
      78           0 :     (*variables)["get_has_field_bit_message"] = GenerateGetBit(messageBitIndex);
      79           0 :     (*variables)["get_has_field_bit_builder"] = GenerateGetBit(builderBitIndex);
      80             : 
      81             :     // Note that these have a trailing ";".
      82           0 :     (*variables)["set_has_field_bit_message"] =
      83           0 :         GenerateSetBit(messageBitIndex) + ";";
      84           0 :     (*variables)["set_has_field_bit_builder"] =
      85           0 :         GenerateSetBit(builderBitIndex) + ";";
      86           0 :     (*variables)["clear_has_field_bit_builder"] =
      87           0 :         GenerateClearBit(builderBitIndex) + ";";
      88             : 
      89           0 :     (*variables)["is_field_present_message"] = GenerateGetBit(messageBitIndex);
      90             :   } else {
      91           0 :     (*variables)["set_has_field_bit_message"] = "";
      92           0 :     (*variables)["set_has_field_bit_builder"] = "";
      93           0 :     (*variables)["clear_has_field_bit_builder"] = "";
      94             : 
      95           0 :     (*variables)["is_field_present_message"] =
      96           0 :         (*variables)["name"] + "_ != null";
      97             :   }
      98             : 
      99             :   // For repated builders, one bit is used for whether the array is immutable.
     100           0 :   (*variables)["get_mutable_bit_builder"] = GenerateGetBit(builderBitIndex);
     101           0 :   (*variables)["set_mutable_bit_builder"] = GenerateSetBit(builderBitIndex);
     102           0 :   (*variables)["clear_mutable_bit_builder"] = GenerateClearBit(builderBitIndex);
     103             : 
     104             :   // For repeated fields, one bit is used for whether the array is immutable
     105             :   // in the parsing constructor.
     106           0 :   (*variables)["get_mutable_bit_parser"] =
     107             :       GenerateGetBitMutableLocal(builderBitIndex);
     108           0 :   (*variables)["set_mutable_bit_parser"] =
     109             :       GenerateSetBitMutableLocal(builderBitIndex);
     110             : 
     111           0 :   (*variables)["get_has_field_bit_from_local"] =
     112             :       GenerateGetBitFromLocal(builderBitIndex);
     113           0 :   (*variables)["set_has_field_bit_to_local"] =
     114             :       GenerateSetBitToLocal(messageBitIndex);
     115           0 : }
     116             : 
     117             : }  // namespace
     118             : 
     119             : // ===================================================================
     120             : 
     121           0 : ImmutableMessageFieldGenerator::
     122             : ImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
     123             :                       int messageBitIndex,
     124             :                       int builderBitIndex,
     125             :                       Context* context)
     126             :   : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
     127             :     builderBitIndex_(builderBitIndex), context_(context),
     128           0 :     name_resolver_(context->GetNameResolver()) {
     129             :     SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
     130             :                         context->GetFieldGeneratorInfo(descriptor),
     131           0 :                         name_resolver_, &variables_);
     132           0 : }
     133             : 
     134           0 : ImmutableMessageFieldGenerator::~ImmutableMessageFieldGenerator() {}
     135             : 
     136           0 : int ImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
     137           0 :   return 1;
     138             : }
     139             : 
     140           0 : int ImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
     141           0 :   return 1;
     142             : }
     143             : 
     144           0 : void ImmutableMessageFieldGenerator::
     145             : GenerateInterfaceMembers(io::Printer* printer) const {
     146             :   // TODO(jonp): In the future, consider having a method specific to the
     147             :   // interface so that builders can choose dynamically to either return a
     148             :   // message or a nested builder, so that asking for the interface doesn't
     149             :   // cause a message to ever be built.
     150           0 :   if (SupportFieldPresence(descriptor_->file()) ||
     151           0 :       descriptor_->containing_oneof() == NULL) {
     152           0 :     WriteFieldDocComment(printer, descriptor_);
     153             :     printer->Print(variables_,
     154           0 :       "$deprecation$boolean has$capitalized_name$();\n");
     155             :   }
     156           0 :   WriteFieldDocComment(printer, descriptor_);
     157             :   printer->Print(variables_,
     158           0 :     "$deprecation$$type$ get$capitalized_name$();\n");
     159             : 
     160           0 :   WriteFieldDocComment(printer, descriptor_);
     161             :   printer->Print(variables_,
     162           0 :     "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder();\n");
     163           0 : }
     164             : 
     165           0 : void ImmutableMessageFieldGenerator::
     166             : GenerateMembers(io::Printer* printer) const {
     167             :   printer->Print(variables_,
     168           0 :     "private $type$ $name$_;\n");
     169           0 :   PrintExtraFieldInfo(variables_, printer);
     170             : 
     171           0 :   if (SupportFieldPresence(descriptor_->file())) {
     172           0 :     WriteFieldDocComment(printer, descriptor_);
     173             :     printer->Print(variables_,
     174             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     175             :       "  return $get_has_field_bit_message$;\n"
     176           0 :       "}\n");
     177           0 :     WriteFieldDocComment(printer, descriptor_);
     178             :     printer->Print(variables_,
     179             :       "$deprecation$public $type$ get$capitalized_name$() {\n"
     180             :       "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
     181           0 :       "}\n");
     182             : 
     183           0 :     WriteFieldDocComment(printer, descriptor_);
     184             :     printer->Print(variables_,
     185             :       "$deprecation$public $type$OrBuilder "
     186             :       "get$capitalized_name$OrBuilder() {\n"
     187             :       "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
     188           0 :       "}\n");
     189             :   } else {
     190           0 :     WriteFieldDocComment(printer, descriptor_);
     191             :     printer->Print(variables_,
     192             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     193             :       "  return $name$_ != null;\n"
     194           0 :       "}\n");
     195           0 :     WriteFieldDocComment(printer, descriptor_);
     196             :     printer->Print(variables_,
     197             :       "$deprecation$public $type$ get$capitalized_name$() {\n"
     198             :       "  return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n"
     199           0 :       "}\n");
     200             : 
     201           0 :     WriteFieldDocComment(printer, descriptor_);
     202             :     printer->Print(variables_,
     203             :       "$deprecation$public $type$OrBuilder "
     204             :       "get$capitalized_name$OrBuilder() {\n"
     205             :       "  return get$capitalized_name$();\n"
     206           0 :       "}\n");
     207             :   }
     208           0 : }
     209             : 
     210           0 : void ImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
     211             :     io::Printer* printer,
     212             :     const char* regular_case,
     213             :     const char* nested_builder_case) const {
     214           0 :   printer->Print(variables_, "if ($name$Builder_ == null) {\n");
     215           0 :   printer->Indent();
     216           0 :   printer->Print(variables_, regular_case);
     217           0 :   printer->Outdent();
     218           0 :   printer->Print("} else {\n");
     219           0 :   printer->Indent();
     220           0 :   printer->Print(variables_, nested_builder_case);
     221           0 :   printer->Outdent();
     222           0 :   printer->Print("}\n");
     223           0 : }
     224             : 
     225           0 : void ImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
     226             :     io::Printer* printer,
     227             :     const char* method_prototype,
     228             :     const char* regular_case,
     229             :     const char* nested_builder_case,
     230             :     const char* trailing_code) const {
     231           0 :   printer->Print(variables_, method_prototype);
     232           0 :   printer->Print(" {\n");
     233           0 :   printer->Indent();
     234           0 :   PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
     235           0 :   if (trailing_code != NULL) {
     236           0 :     printer->Print(variables_, trailing_code);
     237             :   }
     238           0 :   printer->Outdent();
     239           0 :   printer->Print("}\n");
     240           0 : }
     241             : 
     242           0 : void ImmutableMessageFieldGenerator::
     243             : GenerateBuilderMembers(io::Printer* printer) const {
     244             :   // When using nested-builders, the code initially works just like the
     245             :   // non-nested builder case. It only creates a nested builder lazily on
     246             :   // demand and then forever delegates to it after creation.
     247             : 
     248           0 :   bool support_field_presence = SupportFieldPresence(descriptor_->file());
     249             : 
     250             :   printer->Print(variables_,
     251           0 :     "private $type$ $name$_ = null;\n");
     252             : 
     253             :   printer->Print(variables_,
     254             :       // If this builder is non-null, it is used and the other fields are
     255             :       // ignored.
     256             :       "private com.google.protobuf.SingleFieldBuilder<\n"
     257             :       "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
     258           0 :       "\n");
     259             : 
     260             :   // The comments above the methods below are based on a hypothetical
     261             :   // field of type "Field" called "Field".
     262             : 
     263             :   // boolean hasField()
     264           0 :   WriteFieldDocComment(printer, descriptor_);
     265           0 :   if (support_field_presence) {
     266             :     printer->Print(variables_,
     267             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     268             :       "  return $get_has_field_bit_builder$;\n"
     269           0 :       "}\n");
     270             :   } else {
     271             :     printer->Print(variables_,
     272             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     273             :       "  return $name$Builder_ != null || $name$_ != null;\n"
     274           0 :       "}\n");
     275             :   }
     276             : 
     277             :   // Field getField()
     278           0 :   WriteFieldDocComment(printer, descriptor_);
     279             :   PrintNestedBuilderFunction(printer,
     280             :     "$deprecation$public $type$ get$capitalized_name$()",
     281             :     "return $name$_ == null ? $type$.getDefaultInstance() : $name$_;\n",
     282             :     "return $name$Builder_.getMessage();\n",
     283           0 :     NULL);
     284             : 
     285             :   // Field.Builder setField(Field value)
     286           0 :   WriteFieldDocComment(printer, descriptor_);
     287             :   PrintNestedBuilderFunction(printer,
     288             :     "$deprecation$public Builder set$capitalized_name$($type$ value)",
     289             : 
     290             :     "if (value == null) {\n"
     291             :     "  throw new NullPointerException();\n"
     292             :     "}\n"
     293             :     "$name$_ = value;\n"
     294             :     "$on_changed$\n",
     295             : 
     296             :     "$name$Builder_.setMessage(value);\n",
     297             : 
     298             :     "$set_has_field_bit_builder$\n"
     299           0 :     "return this;\n");
     300             : 
     301             :   // Field.Builder setField(Field.Builder builderForValue)
     302           0 :   WriteFieldDocComment(printer, descriptor_);
     303             :   PrintNestedBuilderFunction(printer,
     304             :     "$deprecation$public Builder set$capitalized_name$(\n"
     305             :     "    $type$.Builder builderForValue)",
     306             : 
     307             :     "$name$_ = builderForValue.build();\n"
     308             :     "$on_changed$\n",
     309             : 
     310             :     "$name$Builder_.setMessage(builderForValue.build());\n",
     311             : 
     312             :     "$set_has_field_bit_builder$\n"
     313           0 :     "return this;\n");
     314             : 
     315             :   // Field.Builder mergeField(Field value)
     316           0 :   WriteFieldDocComment(printer, descriptor_);
     317             :   PrintNestedBuilderFunction(printer,
     318             :     "$deprecation$public Builder merge$capitalized_name$($type$ value)",
     319             : 
     320             :     support_field_presence
     321             :         ? "if ($get_has_field_bit_builder$ &&\n"
     322             :           "    $name$_ != null &&\n"
     323             :           "    $name$_ != $type$.getDefaultInstance()) {\n"
     324             :           "  $name$_ =\n"
     325             :           "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
     326             :           "} else {\n"
     327             :           "  $name$_ = value;\n"
     328             :           "}\n"
     329             :           "$on_changed$\n"
     330             :         : "if ($name$_ != null) {\n"
     331             :           "  $name$_ =\n"
     332             :           "    $type$.newBuilder($name$_).mergeFrom(value).buildPartial();\n"
     333             :           "} else {\n"
     334             :           "  $name$_ = value;\n"
     335             :           "}\n"
     336             :           "$on_changed$\n",
     337             : 
     338             :     "$name$Builder_.mergeFrom(value);\n",
     339             : 
     340             :     "$set_has_field_bit_builder$\n"
     341           0 :     "return this;\n");
     342             : 
     343             :   // Field.Builder clearField()
     344           0 :   WriteFieldDocComment(printer, descriptor_);
     345             :   PrintNestedBuilderFunction(printer,
     346             :     "$deprecation$public Builder clear$capitalized_name$()",
     347             : 
     348             :     "$name$_ = null;\n"
     349             :     "$on_changed$\n",
     350             : 
     351             :     support_field_presence
     352             :         ? "$name$Builder_.clear();\n"
     353             :         : "$name$_ = null;\n"
     354             :           "$name$Builder_ = null;\n",
     355             : 
     356             :     "$clear_has_field_bit_builder$\n"
     357           0 :     "return this;\n");
     358             : 
     359           0 :   WriteFieldDocComment(printer, descriptor_);
     360             :   printer->Print(variables_,
     361             :     "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
     362             :     "  $set_has_field_bit_builder$\n"
     363             :     "  $on_changed$\n"
     364             :     "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
     365           0 :     "}\n");
     366           0 :   WriteFieldDocComment(printer, descriptor_);
     367             :   printer->Print(variables_,
     368             :     "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
     369             :     "  if ($name$Builder_ != null) {\n"
     370             :     "    return $name$Builder_.getMessageOrBuilder();\n"
     371             :     "  } else {\n"
     372             :     "    return $name$_ == null ?\n"
     373             :     "        $type$.getDefaultInstance() : $name$_;\n"
     374             :     "  }\n"
     375           0 :     "}\n");
     376           0 :   WriteFieldDocComment(printer, descriptor_);
     377             :   printer->Print(variables_,
     378             :     "private com.google.protobuf.SingleFieldBuilder<\n"
     379             :     "    $type$, $type$.Builder, $type$OrBuilder> \n"
     380             :     "    get$capitalized_name$FieldBuilder() {\n"
     381             :     "  if ($name$Builder_ == null) {\n"
     382             :     "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
     383             :     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     384             :     "            get$capitalized_name$(),\n"
     385             :     "            getParentForChildren(),\n"
     386             :     "            isClean());\n"
     387             :     "    $name$_ = null;\n"
     388             :     "  }\n"
     389             :     "  return $name$Builder_;\n"
     390           0 :     "}\n");
     391           0 : }
     392             : 
     393           0 : void ImmutableMessageFieldGenerator::
     394             : GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
     395           0 :   if (SupportFieldPresence(descriptor_->file())) {
     396             :     printer->Print(variables_,
     397           0 :       "get$capitalized_name$FieldBuilder();\n");
     398             :   }
     399           0 : }
     400             : 
     401             : 
     402           0 : void ImmutableMessageFieldGenerator::
     403           0 : GenerateInitializationCode(io::Printer* printer) const {}
     404             : 
     405           0 : void ImmutableMessageFieldGenerator::
     406             : GenerateBuilderClearCode(io::Printer* printer) const {
     407           0 :   if (SupportFieldPresence(descriptor_->file())) {
     408             :     PrintNestedBuilderCondition(printer,
     409             :       "$name$_ = null;\n",
     410             : 
     411           0 :       "$name$Builder_.clear();\n");
     412           0 :     printer->Print(variables_, "$clear_has_field_bit_builder$\n");
     413             :   } else {
     414             :     PrintNestedBuilderCondition(printer,
     415             :       "$name$_ = null;\n",
     416             : 
     417             :       "$name$_ = null;\n"
     418           0 :       "$name$Builder_ = null;\n");
     419             :   }
     420           0 : }
     421             : 
     422           0 : void ImmutableMessageFieldGenerator::
     423             : GenerateMergingCode(io::Printer* printer) const {
     424             :   printer->Print(variables_,
     425             :     "if (other.has$capitalized_name$()) {\n"
     426             :     "  merge$capitalized_name$(other.get$capitalized_name$());\n"
     427           0 :     "}\n");
     428           0 : }
     429             : 
     430           0 : void ImmutableMessageFieldGenerator::
     431             : GenerateBuildingCode(io::Printer* printer) const {
     432           0 :   if (SupportFieldPresence(descriptor_->file())) {
     433             :     printer->Print(variables_,
     434             :         "if ($get_has_field_bit_from_local$) {\n"
     435             :         "  $set_has_field_bit_to_local$;\n"
     436           0 :         "}\n");
     437             :   }
     438             : 
     439             :   PrintNestedBuilderCondition(printer,
     440             :     "result.$name$_ = $name$_;\n",
     441             : 
     442           0 :     "result.$name$_ = $name$Builder_.build();\n");
     443           0 : }
     444             : 
     445           0 : void ImmutableMessageFieldGenerator::
     446             : GenerateParsingCode(io::Printer* printer) const {
     447             :   printer->Print(variables_,
     448             :     "$type$.Builder subBuilder = null;\n"
     449             :     "if ($is_field_present_message$) {\n"
     450             :     "  subBuilder = $name$_.toBuilder();\n"
     451           0 :     "}\n");
     452             : 
     453           0 :   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     454             :     printer->Print(variables_,
     455             :       "$name$_ = input.readGroup($number$, $type$.parser(),\n"
     456           0 :       "    extensionRegistry);\n");
     457             :   } else {
     458             :     printer->Print(variables_,
     459           0 :       "$name$_ = input.readMessage($type$.parser(), extensionRegistry);\n");
     460             :   }
     461             : 
     462             :   printer->Print(variables_,
     463             :     "if (subBuilder != null) {\n"
     464             :     "  subBuilder.mergeFrom($name$_);\n"
     465             :     "  $name$_ = subBuilder.buildPartial();\n"
     466             :     "}\n"
     467           0 :     "$set_has_field_bit_message$\n");
     468           0 : }
     469             : 
     470           0 : void ImmutableMessageFieldGenerator::
     471             : GenerateParsingDoneCode(io::Printer* printer) const {
     472             :   // noop for messages.
     473           0 : }
     474             : 
     475           0 : void ImmutableMessageFieldGenerator::
     476             : GenerateSerializationCode(io::Printer* printer) const {
     477             :   printer->Print(variables_,
     478             :     "if ($is_field_present_message$) {\n"
     479             :     "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
     480           0 :     "}\n");
     481           0 : }
     482             : 
     483           0 : void ImmutableMessageFieldGenerator::
     484             : GenerateSerializedSizeCode(io::Printer* printer) const {
     485             :   printer->Print(variables_,
     486             :     "if ($is_field_present_message$) {\n"
     487             :     "  size += com.google.protobuf.CodedOutputStream\n"
     488             :     "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
     489           0 :     "}\n");
     490           0 : }
     491             : 
     492           0 : void ImmutableMessageFieldGenerator::
     493             : GenerateEqualsCode(io::Printer* printer) const {
     494             :   printer->Print(variables_,
     495             :     "result = result && get$capitalized_name$()\n"
     496           0 :     "    .equals(other.get$capitalized_name$());\n");
     497           0 : }
     498             : 
     499           0 : void ImmutableMessageFieldGenerator::
     500             : GenerateHashCode(io::Printer* printer) const {
     501             :   printer->Print(variables_,
     502             :     "hash = (37 * hash) + $constant_name$;\n"
     503           0 :     "hash = (53 * hash) + get$capitalized_name$().hashCode();\n");
     504           0 : }
     505             : 
     506           0 : string ImmutableMessageFieldGenerator::GetBoxedType() const {
     507           0 :   return name_resolver_->GetImmutableClassName(descriptor_->message_type());
     508             : }
     509             : 
     510             : // ===================================================================
     511             : 
     512           0 : ImmutableMessageOneofFieldGenerator::
     513           0 : ImmutableMessageOneofFieldGenerator(const FieldDescriptor* descriptor,
     514             :                                  int messageBitIndex,
     515             :                                  int builderBitIndex,
     516             :                                  Context* context)
     517             :     : ImmutableMessageFieldGenerator(
     518           0 :           descriptor, messageBitIndex, builderBitIndex, context) {
     519             :   const OneofGeneratorInfo* info =
     520           0 :       context->GetOneofGeneratorInfo(descriptor->containing_oneof());
     521           0 :   SetCommonOneofVariables(descriptor, info, &variables_);
     522           0 : }
     523             : 
     524           0 : ImmutableMessageOneofFieldGenerator::
     525           0 : ~ImmutableMessageOneofFieldGenerator() {}
     526             : 
     527           0 : void ImmutableMessageOneofFieldGenerator::
     528             : GenerateMembers(io::Printer* printer) const {
     529           0 :   PrintExtraFieldInfo(variables_, printer);
     530           0 :   if (SupportFieldPresence(descriptor_->file())) {
     531           0 :     WriteFieldDocComment(printer, descriptor_);
     532             :     printer->Print(variables_,
     533             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     534             :       "  return $has_oneof_case_message$;\n"
     535           0 :       "}\n");
     536             :   }
     537           0 :   WriteFieldDocComment(printer, descriptor_);
     538             :   printer->Print(variables_,
     539             :     "$deprecation$public $type$ get$capitalized_name$() {\n"
     540             :     "  if ($has_oneof_case_message$) {\n"
     541             :     "     return ($type$) $oneof_name$_;\n"
     542             :     "  }\n"
     543             :     "  return $type$.getDefaultInstance();\n"
     544           0 :     "}\n");
     545             : 
     546           0 :   WriteFieldDocComment(printer, descriptor_);
     547             :   printer->Print(variables_,
     548             :     "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
     549             :     "  if ($has_oneof_case_message$) {\n"
     550             :     "     return ($type$) $oneof_name$_;\n"
     551             :     "  }\n"
     552             :     "  return $type$.getDefaultInstance();\n"
     553           0 :     "}\n");
     554           0 : }
     555             : 
     556           0 : void ImmutableMessageOneofFieldGenerator::
     557             : GenerateBuilderMembers(io::Printer* printer) const {
     558             :   // When using nested-builders, the code initially works just like the
     559             :   // non-nested builder case. It only creates a nested builder lazily on
     560             :   // demand and then forever delegates to it after creation.
     561             :   printer->Print(variables_,
     562             :     // If this builder is non-null, it is used and the other fields are
     563             :     // ignored.
     564             :     "private com.google.protobuf.SingleFieldBuilder<\n"
     565             :     "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;"
     566           0 :     "\n");
     567             : 
     568             :   // The comments above the methods below are based on a hypothetical
     569             :   // field of type "Field" called "Field".
     570             : 
     571           0 :   if (SupportFieldPresence(descriptor_->file())) {
     572             :     // boolean hasField()
     573           0 :     WriteFieldDocComment(printer, descriptor_);
     574             :     printer->Print(variables_,
     575             :       "$deprecation$public boolean has$capitalized_name$() {\n"
     576             :       "  return $has_oneof_case_message$;\n"
     577           0 :       "}\n");
     578             :   }
     579             : 
     580             :   // Field getField()
     581           0 :   WriteFieldDocComment(printer, descriptor_);
     582             :   PrintNestedBuilderFunction(printer,
     583             :     "$deprecation$public $type$ get$capitalized_name$()",
     584             : 
     585             :     "if ($has_oneof_case_message$) {\n"
     586             :     "  return ($type$) $oneof_name$_;\n"
     587             :     "}\n"
     588             :     "return $type$.getDefaultInstance();\n",
     589             : 
     590             :     "if ($has_oneof_case_message$) {\n"
     591             :     "  return $name$Builder_.getMessage();\n"
     592             :     "}\n"
     593             :     "return $type$.getDefaultInstance();\n",
     594             : 
     595           0 :     NULL);
     596             : 
     597             :   // Field.Builder setField(Field value)
     598           0 :   WriteFieldDocComment(printer, descriptor_);
     599             :   PrintNestedBuilderFunction(printer,
     600             :     "$deprecation$public Builder set$capitalized_name$($type$ value)",
     601             : 
     602             :     "if (value == null) {\n"
     603             :     "  throw new NullPointerException();\n"
     604             :     "}\n"
     605             :     "$oneof_name$_ = value;\n"
     606             :     "$on_changed$\n",
     607             : 
     608             :     "$name$Builder_.setMessage(value);\n",
     609             : 
     610             :     "$set_oneof_case_message$;\n"
     611           0 :     "return this;\n");
     612             : 
     613             :   // Field.Builder setField(Field.Builder builderForValue)
     614           0 :   WriteFieldDocComment(printer, descriptor_);
     615             :   PrintNestedBuilderFunction(printer,
     616             :     "$deprecation$public Builder set$capitalized_name$(\n"
     617             :     "    $type$.Builder builderForValue)",
     618             : 
     619             :     "$oneof_name$_ = builderForValue.build();\n"
     620             :     "$on_changed$\n",
     621             : 
     622             :     "$name$Builder_.setMessage(builderForValue.build());\n",
     623             : 
     624             :     "$set_oneof_case_message$;\n"
     625           0 :     "return this;\n");
     626             : 
     627             :   // Field.Builder mergeField(Field value)
     628           0 :   WriteFieldDocComment(printer, descriptor_);
     629             :   PrintNestedBuilderFunction(printer,
     630             :     "$deprecation$public Builder merge$capitalized_name$($type$ value)",
     631             : 
     632             :     "if ($has_oneof_case_message$ &&\n"
     633             :     "    $oneof_name$_ != $type$.getDefaultInstance()) {\n"
     634             :     "  $oneof_name$_ = $type$.newBuilder(($type$) $oneof_name$_)\n"
     635             :     "      .mergeFrom(value).buildPartial();\n"
     636             :     "} else {\n"
     637             :     "  $oneof_name$_ = value;\n"
     638             :     "}\n"
     639             :     "$on_changed$\n",
     640             : 
     641             :     "if ($has_oneof_case_message$) {\n"
     642             :     "  $name$Builder_.mergeFrom(value);\n"
     643             :     "}\n"
     644             :     "$name$Builder_.setMessage(value);\n",
     645             : 
     646             :     "$set_oneof_case_message$;\n"
     647           0 :     "return this;\n");
     648             : 
     649             :   // Field.Builder clearField()
     650           0 :   WriteFieldDocComment(printer, descriptor_);
     651             :   PrintNestedBuilderFunction(printer,
     652             :     "$deprecation$public Builder clear$capitalized_name$()",
     653             : 
     654             :     "if ($has_oneof_case_message$) {\n"
     655             :     "  $clear_oneof_case_message$;\n"
     656             :     "  $oneof_name$_ = null;\n"
     657             :     "  $on_changed$\n"
     658             :     "}\n",
     659             : 
     660             :     "if ($has_oneof_case_message$) {\n"
     661             :     "  $clear_oneof_case_message$;\n"
     662             :     "  $oneof_name$_ = null;\n"
     663             :     "}\n"
     664             :     "$name$Builder_.clear();\n",
     665             : 
     666           0 :     "return this;\n");
     667             : 
     668           0 :   WriteFieldDocComment(printer, descriptor_);
     669             :   printer->Print(variables_,
     670             :     "$deprecation$public $type$.Builder get$capitalized_name$Builder() {\n"
     671             :     "  return get$capitalized_name$FieldBuilder().getBuilder();\n"
     672           0 :     "}\n");
     673           0 :   WriteFieldDocComment(printer, descriptor_);
     674             :   printer->Print(variables_,
     675             :     "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder() {\n"
     676             :     "  if (($has_oneof_case_message$) && ($name$Builder_ != null)) {\n"
     677             :     "    return $name$Builder_.getMessageOrBuilder();\n"
     678             :     "  } else {\n"
     679             :     "    if ($has_oneof_case_message$) {\n"
     680             :     "      return ($type$) $oneof_name$_;\n"
     681             :     "    }\n"
     682             :     "    return $type$.getDefaultInstance();\n"
     683             :     "  }\n"
     684           0 :     "}\n");
     685           0 :   WriteFieldDocComment(printer, descriptor_);
     686             :   printer->Print(variables_,
     687             :     "private com.google.protobuf.SingleFieldBuilder<\n"
     688             :     "    $type$, $type$.Builder, $type$OrBuilder> \n"
     689             :     "    get$capitalized_name$FieldBuilder() {\n"
     690             :     "  if ($name$Builder_ == null) {\n"
     691             :     "    if (!($has_oneof_case_message$)) {\n"
     692             :     "      $oneof_name$_ = $type$.getDefaultInstance();\n"
     693             :     "    }\n"
     694             :     "    $name$Builder_ = new com.google.protobuf.SingleFieldBuilder<\n"
     695             :     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
     696             :     "            ($type$) $oneof_name$_,\n"
     697             :     "            getParentForChildren(),\n"
     698             :     "            isClean());\n"
     699             :     "    $oneof_name$_ = null;\n"
     700             :     "  }\n"
     701             :     "  $set_oneof_case_message$;\n"
     702             :     "  $on_changed$;\n"
     703             :     "  return $name$Builder_;\n"
     704           0 :     "}\n");
     705           0 : }
     706             : 
     707           0 : void ImmutableMessageOneofFieldGenerator::
     708             : GenerateBuildingCode(io::Printer* printer) const {
     709             : 
     710             :   printer->Print(variables_,
     711           0 :                  "if ($has_oneof_case_message$) {\n");
     712           0 :   printer->Indent();
     713             : 
     714             :   PrintNestedBuilderCondition(printer,
     715             :     "result.$oneof_name$_ = $oneof_name$_;\n",
     716             : 
     717           0 :     "result.$oneof_name$_ = $name$Builder_.build();\n");
     718             : 
     719           0 :   printer->Outdent();
     720           0 :   printer->Print("}\n");
     721           0 : }
     722             : 
     723           0 : void ImmutableMessageOneofFieldGenerator::
     724             : GenerateMergingCode(io::Printer* printer) const {
     725             :   printer->Print(variables_,
     726           0 :     "merge$capitalized_name$(other.get$capitalized_name$());\n");
     727           0 : }
     728             : 
     729           0 : void ImmutableMessageOneofFieldGenerator::
     730             : GenerateParsingCode(io::Printer* printer) const {
     731             :   printer->Print(variables_,
     732             :     "$type$.Builder subBuilder = null;\n"
     733             :     "if ($has_oneof_case_message$) {\n"
     734             :     "  subBuilder = (($type$) $oneof_name$_).toBuilder();\n"
     735           0 :     "}\n");
     736             : 
     737           0 :   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
     738             :     printer->Print(variables_,
     739             :       "$oneof_name$_ = input.readGroup($number$, $type$.parser(),\n"
     740           0 :       "    extensionRegistry);\n");
     741             :   } else {
     742             :     printer->Print(variables_,
     743             :       "$oneof_name$_ =\n"
     744           0 :       "    input.readMessage($type$.parser(), extensionRegistry);\n");
     745             :   }
     746             : 
     747             :   printer->Print(variables_,
     748             :     "if (subBuilder != null) {\n"
     749             :     "  subBuilder.mergeFrom(($type$) $oneof_name$_);\n"
     750             :     "  $oneof_name$_ = subBuilder.buildPartial();\n"
     751           0 :     "}\n");
     752             :   printer->Print(variables_,
     753           0 :     "$set_oneof_case_message$;\n");
     754           0 : }
     755             : 
     756           0 : void ImmutableMessageOneofFieldGenerator::
     757             : GenerateSerializationCode(io::Printer* printer) const {
     758             :   printer->Print(variables_,
     759             :     "if ($has_oneof_case_message$) {\n"
     760             :     "  output.write$group_or_message$($number$, ($type$) $oneof_name$_);\n"
     761           0 :     "}\n");
     762           0 : }
     763             : 
     764           0 : void ImmutableMessageOneofFieldGenerator::
     765             : GenerateSerializedSizeCode(io::Printer* printer) const {
     766             :   printer->Print(variables_,
     767             :     "if ($has_oneof_case_message$) {\n"
     768             :     "  size += com.google.protobuf.CodedOutputStream\n"
     769             :     "    .compute$group_or_message$Size($number$, ($type$) $oneof_name$_);\n"
     770           0 :     "}\n");
     771           0 : }
     772             : 
     773             : // ===================================================================
     774             : 
     775           0 : RepeatedImmutableMessageFieldGenerator::
     776             : RepeatedImmutableMessageFieldGenerator(const FieldDescriptor* descriptor,
     777             :                                        int messageBitIndex,
     778             :                                        int builderBitIndex,
     779             :                                        Context* context)
     780             :   : descriptor_(descriptor), messageBitIndex_(messageBitIndex),
     781             :     builderBitIndex_(builderBitIndex), context_(context),
     782           0 :     name_resolver_(context->GetNameResolver())  {
     783             :   SetMessageVariables(descriptor, messageBitIndex, builderBitIndex,
     784             :                       context->GetFieldGeneratorInfo(descriptor),
     785           0 :                       name_resolver_, &variables_);
     786           0 : }
     787             : 
     788           0 : RepeatedImmutableMessageFieldGenerator::
     789           0 : ~RepeatedImmutableMessageFieldGenerator() {}
     790             : 
     791           0 : int RepeatedImmutableMessageFieldGenerator::GetNumBitsForMessage() const {
     792           0 :   return 0;
     793             : }
     794             : 
     795           0 : int RepeatedImmutableMessageFieldGenerator::GetNumBitsForBuilder() const {
     796           0 :   return 1;
     797             : }
     798             : 
     799           0 : void RepeatedImmutableMessageFieldGenerator::
     800             : GenerateInterfaceMembers(io::Printer* printer) const {
     801             :   // TODO(jonp): In the future, consider having methods specific to the
     802             :   // interface so that builders can choose dynamically to either return a
     803             :   // message or a nested builder, so that asking for the interface doesn't
     804             :   // cause a message to ever be built.
     805           0 :   WriteFieldDocComment(printer, descriptor_);
     806             :   printer->Print(variables_,
     807             :     "$deprecation$java.util.List<$type$> \n"
     808           0 :     "    get$capitalized_name$List();\n");
     809           0 :   WriteFieldDocComment(printer, descriptor_);
     810             :   printer->Print(variables_,
     811           0 :     "$deprecation$$type$ get$capitalized_name$(int index);\n");
     812           0 :   WriteFieldDocComment(printer, descriptor_);
     813             :   printer->Print(variables_,
     814           0 :     "$deprecation$int get$capitalized_name$Count();\n");
     815             : 
     816           0 :   WriteFieldDocComment(printer, descriptor_);
     817             :   printer->Print(variables_,
     818             :     "$deprecation$java.util.List<? extends $type$OrBuilder> \n"
     819           0 :     "    get$capitalized_name$OrBuilderList();\n");
     820           0 :   WriteFieldDocComment(printer, descriptor_);
     821             :   printer->Print(variables_,
     822             :     "$deprecation$$type$OrBuilder get$capitalized_name$OrBuilder(\n"
     823           0 :     "    int index);\n");
     824           0 : }
     825             : 
     826           0 : void RepeatedImmutableMessageFieldGenerator::
     827             : GenerateMembers(io::Printer* printer) const {
     828             :   printer->Print(variables_,
     829           0 :     "private java.util.List<$type$> $name$_;\n");
     830           0 :   PrintExtraFieldInfo(variables_, printer);
     831           0 :   WriteFieldDocComment(printer, descriptor_);
     832             :   printer->Print(variables_,
     833             :     "$deprecation$public java.util.List<$type$> get$capitalized_name$List() {\n"
     834             :     "  return $name$_;\n"   // note:  unmodifiable list
     835           0 :     "}\n");
     836           0 :   WriteFieldDocComment(printer, descriptor_);
     837             :   printer->Print(variables_,
     838             :     "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
     839             :     "    get$capitalized_name$OrBuilderList() {\n"
     840             :     "  return $name$_;\n"
     841           0 :     "}\n");
     842           0 :   WriteFieldDocComment(printer, descriptor_);
     843             :   printer->Print(variables_,
     844             :     "$deprecation$public int get$capitalized_name$Count() {\n"
     845             :     "  return $name$_.size();\n"
     846           0 :     "}\n");
     847           0 :   WriteFieldDocComment(printer, descriptor_);
     848             :   printer->Print(variables_,
     849             :     "$deprecation$public $type$ get$capitalized_name$(int index) {\n"
     850             :     "  return $name$_.get(index);\n"
     851           0 :     "}\n");
     852           0 :   WriteFieldDocComment(printer, descriptor_);
     853             :   printer->Print(variables_,
     854             :     "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
     855             :     "    int index) {\n"
     856             :     "  return $name$_.get(index);\n"
     857           0 :     "}\n");
     858             : 
     859           0 : }
     860             : 
     861           0 : void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderCondition(
     862             :     io::Printer* printer,
     863             :     const char* regular_case,
     864             :     const char* nested_builder_case) const {
     865           0 :   printer->Print(variables_, "if ($name$Builder_ == null) {\n");
     866           0 :   printer->Indent();
     867           0 :   printer->Print(variables_, regular_case);
     868           0 :   printer->Outdent();
     869           0 :   printer->Print("} else {\n");
     870           0 :   printer->Indent();
     871           0 :   printer->Print(variables_, nested_builder_case);
     872           0 :   printer->Outdent();
     873           0 :   printer->Print("}\n");
     874           0 : }
     875             : 
     876           0 : void RepeatedImmutableMessageFieldGenerator::PrintNestedBuilderFunction(
     877             :     io::Printer* printer,
     878             :     const char* method_prototype,
     879             :     const char* regular_case,
     880             :     const char* nested_builder_case,
     881             :     const char* trailing_code) const {
     882           0 :   printer->Print(variables_, method_prototype);
     883           0 :   printer->Print(" {\n");
     884           0 :   printer->Indent();
     885           0 :   PrintNestedBuilderCondition(printer, regular_case, nested_builder_case);
     886           0 :   if (trailing_code != NULL) {
     887           0 :     printer->Print(variables_, trailing_code);
     888             :   }
     889           0 :   printer->Outdent();
     890           0 :   printer->Print("}\n");
     891           0 : }
     892             : 
     893           0 : void RepeatedImmutableMessageFieldGenerator::
     894             : GenerateBuilderMembers(io::Printer* printer) const {
     895             :   // When using nested-builders, the code initially works just like the
     896             :   // non-nested builder case. It only creates a nested builder lazily on
     897             :   // demand and then forever delegates to it after creation.
     898             : 
     899             :   printer->Print(variables_,
     900             :     // Used when the builder is null.
     901             :     // One field is the list and the other field keeps track of whether the
     902             :     // list is immutable. If it's immutable, the invariant is that it must
     903             :     // either an instance of Collections.emptyList() or it's an ArrayList
     904             :     // wrapped in a Collections.unmodifiableList() wrapper and nobody else has
     905             :     // a refererence to the underlying ArrayList. This invariant allows us to
     906             :     // share instances of lists between protocol buffers avoiding expensive
     907             :     // memory allocations. Note, immutable is a strong guarantee here -- not
     908             :     // just that the list cannot be modified via the reference but that the
     909             :     // list can never be modified.
     910             :     "private java.util.List<$type$> $name$_ =\n"
     911             :     "  java.util.Collections.emptyList();\n"
     912             : 
     913             :     "private void ensure$capitalized_name$IsMutable() {\n"
     914             :     "  if (!$get_mutable_bit_builder$) {\n"
     915             :     "    $name$_ = new java.util.ArrayList<$type$>($name$_);\n"
     916             :     "    $set_mutable_bit_builder$;\n"
     917             :     "   }\n"
     918             :     "}\n"
     919           0 :     "\n");
     920             : 
     921             :   printer->Print(variables_,
     922             :     // If this builder is non-null, it is used and the other fields are
     923             :     // ignored.
     924             :     "private com.google.protobuf.RepeatedFieldBuilder<\n"
     925             :     "    $type$, $type$.Builder, $type$OrBuilder> $name$Builder_;\n"
     926           0 :     "\n");
     927             : 
     928             :   // The comments above the methods below are based on a hypothetical
     929             :   // repeated field of type "Field" called "RepeatedField".
     930             : 
     931             :   // List<Field> getRepeatedFieldList()
     932           0 :   WriteFieldDocComment(printer, descriptor_);
     933             :   PrintNestedBuilderFunction(printer,
     934             :     "$deprecation$public java.util.List<$type$> get$capitalized_name$List()",
     935             : 
     936             :     "return java.util.Collections.unmodifiableList($name$_);\n",
     937             :     "return $name$Builder_.getMessageList();\n",
     938             : 
     939           0 :     NULL);
     940             : 
     941             :   // int getRepeatedFieldCount()
     942           0 :   WriteFieldDocComment(printer, descriptor_);
     943             :   PrintNestedBuilderFunction(printer,
     944             :     "$deprecation$public int get$capitalized_name$Count()",
     945             : 
     946             :     "return $name$_.size();\n",
     947             :     "return $name$Builder_.getCount();\n",
     948             : 
     949           0 :     NULL);
     950             : 
     951             :   // Field getRepeatedField(int index)
     952           0 :   WriteFieldDocComment(printer, descriptor_);
     953             :   PrintNestedBuilderFunction(printer,
     954             :     "$deprecation$public $type$ get$capitalized_name$(int index)",
     955             : 
     956             :     "return $name$_.get(index);\n",
     957             : 
     958             :     "return $name$Builder_.getMessage(index);\n",
     959             : 
     960           0 :     NULL);
     961             : 
     962             :   // Builder setRepeatedField(int index, Field value)
     963           0 :   WriteFieldDocComment(printer, descriptor_);
     964             :   PrintNestedBuilderFunction(printer,
     965             :     "$deprecation$public Builder set$capitalized_name$(\n"
     966             :     "    int index, $type$ value)",
     967             :     "if (value == null) {\n"
     968             :     "  throw new NullPointerException();\n"
     969             :     "}\n"
     970             :     "ensure$capitalized_name$IsMutable();\n"
     971             :     "$name$_.set(index, value);\n"
     972             :     "$on_changed$\n",
     973             :     "$name$Builder_.setMessage(index, value);\n",
     974           0 :     "return this;\n");
     975             : 
     976             :   // Builder setRepeatedField(int index, Field.Builder builderForValue)
     977           0 :   WriteFieldDocComment(printer, descriptor_);
     978             :   PrintNestedBuilderFunction(printer,
     979             :     "$deprecation$public Builder set$capitalized_name$(\n"
     980             :     "    int index, $type$.Builder builderForValue)",
     981             : 
     982             :     "ensure$capitalized_name$IsMutable();\n"
     983             :     "$name$_.set(index, builderForValue.build());\n"
     984             :     "$on_changed$\n",
     985             : 
     986             :     "$name$Builder_.setMessage(index, builderForValue.build());\n",
     987             : 
     988           0 :     "return this;\n");
     989             : 
     990             :   // Builder addRepeatedField(Field value)
     991           0 :   WriteFieldDocComment(printer, descriptor_);
     992             :   PrintNestedBuilderFunction(printer,
     993             :     "$deprecation$public Builder add$capitalized_name$($type$ value)",
     994             : 
     995             :     "if (value == null) {\n"
     996             :     "  throw new NullPointerException();\n"
     997             :     "}\n"
     998             :     "ensure$capitalized_name$IsMutable();\n"
     999             :     "$name$_.add(value);\n"
    1000             : 
    1001             :     "$on_changed$\n",
    1002             : 
    1003             :     "$name$Builder_.addMessage(value);\n",
    1004             : 
    1005           0 :     "return this;\n");
    1006             : 
    1007             :   // Builder addRepeatedField(int index, Field value)
    1008           0 :   WriteFieldDocComment(printer, descriptor_);
    1009             :   PrintNestedBuilderFunction(printer,
    1010             :     "$deprecation$public Builder add$capitalized_name$(\n"
    1011             :     "    int index, $type$ value)",
    1012             : 
    1013             :     "if (value == null) {\n"
    1014             :     "  throw new NullPointerException();\n"
    1015             :     "}\n"
    1016             :     "ensure$capitalized_name$IsMutable();\n"
    1017             :     "$name$_.add(index, value);\n"
    1018             :     "$on_changed$\n",
    1019             : 
    1020             :     "$name$Builder_.addMessage(index, value);\n",
    1021             : 
    1022           0 :     "return this;\n");
    1023             : 
    1024             :   // Builder addRepeatedField(Field.Builder builderForValue)
    1025           0 :   WriteFieldDocComment(printer, descriptor_);
    1026             :   PrintNestedBuilderFunction(printer,
    1027             :     "$deprecation$public Builder add$capitalized_name$(\n"
    1028             :     "    $type$.Builder builderForValue)",
    1029             : 
    1030             :     "ensure$capitalized_name$IsMutable();\n"
    1031             :     "$name$_.add(builderForValue.build());\n"
    1032             :     "$on_changed$\n",
    1033             : 
    1034             :     "$name$Builder_.addMessage(builderForValue.build());\n",
    1035             : 
    1036           0 :     "return this;\n");
    1037             : 
    1038             :   // Builder addRepeatedField(int index, Field.Builder builderForValue)
    1039           0 :   WriteFieldDocComment(printer, descriptor_);
    1040             :   PrintNestedBuilderFunction(printer,
    1041             :     "$deprecation$public Builder add$capitalized_name$(\n"
    1042             :     "    int index, $type$.Builder builderForValue)",
    1043             : 
    1044             :     "ensure$capitalized_name$IsMutable();\n"
    1045             :     "$name$_.add(index, builderForValue.build());\n"
    1046             :     "$on_changed$\n",
    1047             : 
    1048             :     "$name$Builder_.addMessage(index, builderForValue.build());\n",
    1049             : 
    1050           0 :     "return this;\n");
    1051             : 
    1052             :   // Builder addAllRepeatedField(Iterable<Field> values)
    1053           0 :   WriteFieldDocComment(printer, descriptor_);
    1054             :   PrintNestedBuilderFunction(printer,
    1055             :     "$deprecation$public Builder addAll$capitalized_name$(\n"
    1056             :     "    java.lang.Iterable<? extends $type$> values)",
    1057             : 
    1058             :     "ensure$capitalized_name$IsMutable();\n"
    1059             :     "com.google.protobuf.AbstractMessageLite.Builder.addAll(\n"
    1060             :     "    values, $name$_);\n"
    1061             :     "$on_changed$\n",
    1062             : 
    1063             :     "$name$Builder_.addAllMessages(values);\n",
    1064             : 
    1065           0 :     "return this;\n");
    1066             : 
    1067             :   // Builder clearAllRepeatedField()
    1068           0 :   WriteFieldDocComment(printer, descriptor_);
    1069             :   PrintNestedBuilderFunction(printer,
    1070             :     "$deprecation$public Builder clear$capitalized_name$()",
    1071             : 
    1072             :     "$name$_ = java.util.Collections.emptyList();\n"
    1073             :     "$clear_mutable_bit_builder$;\n"
    1074             :     "$on_changed$\n",
    1075             : 
    1076             :     "$name$Builder_.clear();\n",
    1077             : 
    1078           0 :     "return this;\n");
    1079             : 
    1080             :   // Builder removeRepeatedField(int index)
    1081           0 :   WriteFieldDocComment(printer, descriptor_);
    1082             :   PrintNestedBuilderFunction(printer,
    1083             :     "$deprecation$public Builder remove$capitalized_name$(int index)",
    1084             : 
    1085             :     "ensure$capitalized_name$IsMutable();\n"
    1086             :     "$name$_.remove(index);\n"
    1087             :     "$on_changed$\n",
    1088             : 
    1089             :     "$name$Builder_.remove(index);\n",
    1090             : 
    1091           0 :     "return this;\n");
    1092             : 
    1093           0 :   WriteFieldDocComment(printer, descriptor_);
    1094             :   printer->Print(variables_,
    1095             :     "$deprecation$public $type$.Builder get$capitalized_name$Builder(\n"
    1096             :     "    int index) {\n"
    1097             :     "  return get$capitalized_name$FieldBuilder().getBuilder(index);\n"
    1098           0 :     "}\n");
    1099             : 
    1100           0 :   WriteFieldDocComment(printer, descriptor_);
    1101             :       printer->Print(variables_,
    1102             :     "$deprecation$public $type$OrBuilder get$capitalized_name$OrBuilder(\n"
    1103             :     "    int index) {\n"
    1104             :     "  if ($name$Builder_ == null) {\n"
    1105             :     "    return $name$_.get(index);"
    1106             :     "  } else {\n"
    1107             :     "    return $name$Builder_.getMessageOrBuilder(index);\n"
    1108             :     "  }\n"
    1109           0 :     "}\n");
    1110             : 
    1111           0 :   WriteFieldDocComment(printer, descriptor_);
    1112             :       printer->Print(variables_,
    1113             :     "$deprecation$public java.util.List<? extends $type$OrBuilder> \n"
    1114             :     "     get$capitalized_name$OrBuilderList() {\n"
    1115             :     "  if ($name$Builder_ != null) {\n"
    1116             :     "    return $name$Builder_.getMessageOrBuilderList();\n"
    1117             :     "  } else {\n"
    1118             :     "    return java.util.Collections.unmodifiableList($name$_);\n"
    1119             :     "  }\n"
    1120           0 :     "}\n");
    1121             : 
    1122           0 :   WriteFieldDocComment(printer, descriptor_);
    1123             :       printer->Print(variables_,
    1124             :     "$deprecation$public $type$.Builder add$capitalized_name$Builder() {\n"
    1125             :     "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
    1126             :     "      $type$.getDefaultInstance());\n"
    1127           0 :     "}\n");
    1128           0 :   WriteFieldDocComment(printer, descriptor_);
    1129             :       printer->Print(variables_,
    1130             :     "$deprecation$public $type$.Builder add$capitalized_name$Builder(\n"
    1131             :     "    int index) {\n"
    1132             :     "  return get$capitalized_name$FieldBuilder().addBuilder(\n"
    1133             :     "      index, $type$.getDefaultInstance());\n"
    1134           0 :     "}\n");
    1135           0 :   WriteFieldDocComment(printer, descriptor_);
    1136             :       printer->Print(variables_,
    1137             :     "$deprecation$public java.util.List<$type$.Builder> \n"
    1138             :     "     get$capitalized_name$BuilderList() {\n"
    1139             :     "  return get$capitalized_name$FieldBuilder().getBuilderList();\n"
    1140             :     "}\n"
    1141             :     "private com.google.protobuf.RepeatedFieldBuilder<\n"
    1142             :     "    $type$, $type$.Builder, $type$OrBuilder> \n"
    1143             :     "    get$capitalized_name$FieldBuilder() {\n"
    1144             :     "  if ($name$Builder_ == null) {\n"
    1145             :     "    $name$Builder_ = new com.google.protobuf.RepeatedFieldBuilder<\n"
    1146             :     "        $type$, $type$.Builder, $type$OrBuilder>(\n"
    1147             :     "            $name$_,\n"
    1148             :     "            $get_mutable_bit_builder$,\n"
    1149             :     "            getParentForChildren(),\n"
    1150             :     "            isClean());\n"
    1151             :     "    $name$_ = null;\n"
    1152             :     "  }\n"
    1153             :     "  return $name$Builder_;\n"
    1154           0 :     "}\n");
    1155           0 : }
    1156             : 
    1157           0 : void RepeatedImmutableMessageFieldGenerator::
    1158             : GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
    1159             :   printer->Print(variables_,
    1160           0 :     "get$capitalized_name$FieldBuilder();\n");
    1161           0 : }
    1162             : 
    1163           0 : void RepeatedImmutableMessageFieldGenerator::
    1164             : GenerateInitializationCode(io::Printer* printer) const {
    1165           0 :   printer->Print(variables_, "$name$_ = java.util.Collections.emptyList();\n");
    1166           0 : }
    1167             : 
    1168           0 : void RepeatedImmutableMessageFieldGenerator::
    1169             : GenerateBuilderClearCode(io::Printer* printer) const {
    1170             :   PrintNestedBuilderCondition(printer,
    1171             :     "$name$_ = java.util.Collections.emptyList();\n"
    1172             :     "$clear_mutable_bit_builder$;\n",
    1173             : 
    1174           0 :     "$name$Builder_.clear();\n");
    1175           0 : }
    1176             : 
    1177           0 : void RepeatedImmutableMessageFieldGenerator::
    1178             : GenerateMergingCode(io::Printer* printer) const {
    1179             :   // The code below does two optimizations (non-nested builder case):
    1180             :   //   1. If the other list is empty, there's nothing to do. This ensures we
    1181             :   //      don't allocate a new array if we already have an immutable one.
    1182             :   //   2. If the other list is non-empty and our current list is empty, we can
    1183             :   //      reuse the other list which is guaranteed to be immutable.
    1184             :   PrintNestedBuilderCondition(printer,
    1185             :     "if (!other.$name$_.isEmpty()) {\n"
    1186             :     "  if ($name$_.isEmpty()) {\n"
    1187             :     "    $name$_ = other.$name$_;\n"
    1188             :     "    $clear_mutable_bit_builder$;\n"
    1189             :     "  } else {\n"
    1190             :     "    ensure$capitalized_name$IsMutable();\n"
    1191             :     "    $name$_.addAll(other.$name$_);\n"
    1192             :     "  }\n"
    1193             :     "  $on_changed$\n"
    1194             :     "}\n",
    1195             : 
    1196             :     "if (!other.$name$_.isEmpty()) {\n"
    1197             :     "  if ($name$Builder_.isEmpty()) {\n"
    1198             :     "    $name$Builder_.dispose();\n"
    1199             :     "    $name$Builder_ = null;\n"
    1200             :     "    $name$_ = other.$name$_;\n"
    1201             :     "    $clear_mutable_bit_builder$;\n"
    1202             :     "    $name$Builder_ = \n"
    1203             :     "      com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders ?\n"
    1204             :     "         get$capitalized_name$FieldBuilder() : null;\n"
    1205             :     "  } else {\n"
    1206             :     "    $name$Builder_.addAllMessages(other.$name$_);\n"
    1207             :     "  }\n"
    1208           0 :     "}\n");
    1209           0 : }
    1210             : 
    1211           0 : void RepeatedImmutableMessageFieldGenerator::
    1212             : GenerateBuildingCode(io::Printer* printer) const {
    1213             :   // The code below (non-nested builder case) ensures that the result has an
    1214             :   // immutable list. If our list is immutable, we can just reuse it. If not,
    1215             :   // we make it immutable.
    1216             :   PrintNestedBuilderCondition(printer,
    1217             :     "if ($get_mutable_bit_builder$) {\n"
    1218             :     "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
    1219             :     "  $clear_mutable_bit_builder$;\n"
    1220             :     "}\n"
    1221             :     "result.$name$_ = $name$_;\n",
    1222             : 
    1223           0 :     "result.$name$_ = $name$Builder_.build();\n");
    1224           0 : }
    1225             : 
    1226           0 : void RepeatedImmutableMessageFieldGenerator::
    1227             : GenerateParsingCode(io::Printer* printer) const {
    1228             :   printer->Print(variables_,
    1229             :     "if (!$get_mutable_bit_parser$) {\n"
    1230             :     "  $name$_ = new java.util.ArrayList<$type$>();\n"
    1231             :     "  $set_mutable_bit_parser$;\n"
    1232           0 :     "}\n");
    1233             : 
    1234           0 :   if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) {
    1235             :     printer->Print(variables_,
    1236             :       "$name$_.add(input.readGroup($number$, $type$.parser(),\n"
    1237           0 :       "    extensionRegistry));\n");
    1238             :   } else {
    1239             :     printer->Print(variables_,
    1240           0 :       "$name$_.add(input.readMessage($type$.parser(), extensionRegistry));\n");
    1241             :   }
    1242           0 : }
    1243             : 
    1244           0 : void RepeatedImmutableMessageFieldGenerator::
    1245             : GenerateParsingDoneCode(io::Printer* printer) const {
    1246             :   printer->Print(variables_,
    1247             :     "if ($get_mutable_bit_parser$) {\n"
    1248             :     "  $name$_ = java.util.Collections.unmodifiableList($name$_);\n"
    1249           0 :     "}\n");
    1250           0 : }
    1251             : 
    1252           0 : void RepeatedImmutableMessageFieldGenerator::
    1253             : GenerateSerializationCode(io::Printer* printer) const {
    1254             :   printer->Print(variables_,
    1255             :     "for (int i = 0; i < $name$_.size(); i++) {\n"
    1256             :     "  output.write$group_or_message$($number$, $name$_.get(i));\n"
    1257           0 :     "}\n");
    1258           0 : }
    1259             : 
    1260           0 : void RepeatedImmutableMessageFieldGenerator::
    1261             : GenerateSerializedSizeCode(io::Printer* printer) const {
    1262             :   printer->Print(variables_,
    1263             :     "for (int i = 0; i < $name$_.size(); i++) {\n"
    1264             :     "  size += com.google.protobuf.CodedOutputStream\n"
    1265             :     "    .compute$group_or_message$Size($number$, $name$_.get(i));\n"
    1266           0 :     "}\n");
    1267           0 : }
    1268             : 
    1269           0 : void RepeatedImmutableMessageFieldGenerator::
    1270             : GenerateEqualsCode(io::Printer* printer) const {
    1271             :   printer->Print(variables_,
    1272             :     "result = result && get$capitalized_name$List()\n"
    1273           0 :     "    .equals(other.get$capitalized_name$List());\n");
    1274           0 : }
    1275             : 
    1276           0 : void RepeatedImmutableMessageFieldGenerator::
    1277             : GenerateHashCode(io::Printer* printer) const {
    1278             :   printer->Print(variables_,
    1279             :     "if (get$capitalized_name$Count() > 0) {\n"
    1280             :     "  hash = (37 * hash) + $constant_name$;\n"
    1281             :     "  hash = (53 * hash) + get$capitalized_name$List().hashCode();\n"
    1282           0 :     "}\n");
    1283           0 : }
    1284             : 
    1285           0 : string RepeatedImmutableMessageFieldGenerator::GetBoxedType() const {
    1286           0 :   return name_resolver_->GetImmutableClassName(descriptor_->message_type());
    1287             : }
    1288             : 
    1289             : }  // namespace java
    1290             : }  // namespace compiler
    1291             : }  // namespace protobuf
    1292             : }  // namespace google

Generated by: LCOV version 1.10