164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Protocol Buffers - Google's data interchange format
264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Copyright 2008 Google Inc.  All rights reserved.
364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// http://code.google.com/p/protobuf/
464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Redistribution and use in source and binary forms, with or without
664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// modification, are permitted provided that the following conditions are
764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// met:
864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions of source code must retain the above copyright
1064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// notice, this list of conditions and the following disclaimer.
1164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Redistributions in binary form must reproduce the above
1264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// copyright notice, this list of conditions and the following disclaimer
1364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// in the documentation and/or other materials provided with the
1464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// distribution.
1564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//     * Neither the name of Google Inc. nor the names of its
1664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// contributors may be used to endorse or promote products derived from
1764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// this software without specific prior written permission.
1864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//
1964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// Author: kenton@google.com (Kenton Varda)
3264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//  Based on original Protocol Buffers design by
3364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//  Sanjay Ghemawat, Jeff Dean, and others.
3464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <map>
3664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <string>
3764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
3864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_message_field.h>
3964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/compiler/javanano/javanano_helpers.h>
4064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/io/printer.h>
4164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/wire_format.h>
4264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci#include <google/protobuf/stubs/strutil.h>
4364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
4464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace google {
4564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace protobuf {
4664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace compiler {
4764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace javanano {
4864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
4964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciusing internal::WireFormat;
5064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazciusing internal::WireFormatLite;
5164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
5264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcinamespace {
5364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
5464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
5564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci//   repeat code between this and the other field types.
5664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid SetMessageVariables(const Params& params,
5764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    const FieldDescriptor* descriptor, map<string, string>* variables) {
5864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["name"] =
59f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao    RenameJavaKeywords(UnderscoresToCamelCase(descriptor));
6064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["capitalized_name"] =
61f4e01452f159ae6b53f5edd25fa647ca2919ae10Tom Chao    RenameJavaKeywords(UnderscoresToCapitalizedCamelCase(descriptor));
6264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["number"] = SimpleItoa(descriptor->number());
6364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["type"] = ClassName(params, descriptor->message_type());
6464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["group_or_message"] =
6564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    (descriptor->type() == FieldDescriptor::TYPE_GROUP) ?
6664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "Group" : "Message";
6764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["message_name"] = descriptor->containing_type()->name();
6864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  //(*variables)["message_type"] = descriptor->message_type()->name();
6964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
7064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
7164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace
7364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// ===================================================================
7564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
7664d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciMessageFieldGenerator::
7764d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
7864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  : FieldGenerator(params), descriptor_(descriptor) {
7964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  SetMessageVariables(params, descriptor, &variables_);
8064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
8164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
8264d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciMessageFieldGenerator::~MessageFieldGenerator() {}
8364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
8464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid MessageFieldGenerator::
855cc242074f189837b38e7768b57ccfb0bca258dfMax CaiGenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const {
8664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
875ae438cf71487d5bc8cb5c0d0e637f976734d110Max Cai    "public $type$ $name$;\n");
8864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
8964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
9064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid MessageFieldGenerator::
91e74fe623e115237968a3de1143d7cdb4df710858Max CaiGenerateClearCode(io::Printer* printer) const {
9264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
93e74fe623e115237968a3de1143d7cdb4df710858Max Cai    "$name$ = null;\n");
94e74fe623e115237968a3de1143d7cdb4df710858Max Cai}
95e74fe623e115237968a3de1143d7cdb4df710858Max Cai
96e74fe623e115237968a3de1143d7cdb4df710858Max Caivoid MessageFieldGenerator::
97e74fe623e115237968a3de1143d7cdb4df710858Max CaiGenerateMergingCode(io::Printer* printer) const {
98e74fe623e115237968a3de1143d7cdb4df710858Max Cai  printer->Print(variables_,
99e74fe623e115237968a3de1143d7cdb4df710858Max Cai    "if (this.$name$ == null) {\n"
100e74fe623e115237968a3de1143d7cdb4df710858Max Cai    "  this.$name$ = new $type$();\n"
101286271f75aa6ff1f3746379b77d6dc55415baa16Max Cai    "}\n");
10264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
10364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
10464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
1050f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci      "input.readGroup(this.$name$, $number$);\n");
10664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  } else {
10764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
1080f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci      "input.readMessage(this.$name$);\n");
10964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
11064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
11164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
11264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid MessageFieldGenerator::
11364d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciGenerateSerializationCode(io::Printer* printer) const {
11464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
1150f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci    "if (this.$name$ != null) {\n"
1160f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci    "  output.write$group_or_message$($number$, this.$name$);\n"
11764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "}\n");
11864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
11964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
12064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid MessageFieldGenerator::
12164d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciGenerateSerializedSizeCode(io::Printer* printer) const {
12264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
1230f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci    "if (this.$name$ != null) {\n"
12464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "  size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
1250f1c4eb967517e21701a3b425d115baff5d15b4fUlas Kirazci    "    .compute$group_or_message$Size($number$, this.$name$);\n"
12664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "}\n");
12764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
12864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
129ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duffvoid MessageFieldGenerator::
130bcf45045f229edab8c2589c1f561e7b7495a763bBrian DuffGenerateFixClonedCode(io::Printer* printer) const {
131bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff  printer->Print(variables_,
132bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "if (this.$name$ != null) {\n"
133bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "  cloned.$name$ = this.$name$.clone();\n"
134bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "}\n");
135bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff}
136bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
137bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duffvoid MessageFieldGenerator::
138ccc48faf20dbf3b3cddcffe78d198876d543529bBrian DuffGenerateEqualsCode(io::Printer* printer) const {
139ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  printer->Print(variables_,
140ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "if (this.$name$ == null) { \n"
141ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "  if (other.$name$ != null) {\n"
142ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "    return false;\n"
143ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "  }\n"
144ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "} else {\n"
145ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "  if (!this.$name$.equals(other.$name$)) {\n"
146ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "    return false;\n"
147ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "  }\n"
148ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "}\n");
149ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff}
150ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
151ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duffvoid MessageFieldGenerator::
152ccc48faf20dbf3b3cddcffe78d198876d543529bBrian DuffGenerateHashCodeCode(io::Printer* printer) const {
153ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  printer->Print(variables_,
154ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "result = 31 * result +\n"
155ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "    (this.$name$ == null ? 0 : this.$name$.hashCode());\n");
15664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
15764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
15864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci// ===================================================================
15964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
16064d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciRepeatedMessageFieldGenerator::
16164d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
16264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  : FieldGenerator(params), descriptor_(descriptor) {
16364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  SetMessageVariables(params, descriptor, &variables_);
16464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
16564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
16664d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
16764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
16864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid RepeatedMessageFieldGenerator::
1695cc242074f189837b38e7768b57ccfb0bca258dfMax CaiGenerateMembers(io::Printer* printer, bool /* unused lazy_init */) const {
17064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
1715ae438cf71487d5bc8cb5c0d0e637f976734d110Max Cai    "public $type$[] $name$;\n");
17264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
17364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
17464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid RepeatedMessageFieldGenerator::
175e74fe623e115237968a3de1143d7cdb4df710858Max CaiGenerateClearCode(io::Printer* printer) const {
176e74fe623e115237968a3de1143d7cdb4df710858Max Cai  printer->Print(variables_,
1775cc242074f189837b38e7768b57ccfb0bca258dfMax Cai    "$name$ = $type$.emptyArray();\n");
178e74fe623e115237968a3de1143d7cdb4df710858Max Cai}
179e74fe623e115237968a3de1143d7cdb4df710858Max Cai
180e74fe623e115237968a3de1143d7cdb4df710858Max Caivoid RepeatedMessageFieldGenerator::
181e74fe623e115237968a3de1143d7cdb4df710858Max CaiGenerateMergingCode(io::Printer* printer) const {
18264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  // First, figure out the length of the array, then parse.
18364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
184286271f75aa6ff1f3746379b77d6dc55415baa16Max Cai    "int arrayLength = com.google.protobuf.nano.WireFormatNano\n"
1855ae438cf71487d5bc8cb5c0d0e637f976734d110Max Cai    "    .getRepeatedFieldArrayLength(input, $tag$);\n"
186e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    "int i = this.$name$ == null ? 0 : this.$name$.length;\n"
187286271f75aa6ff1f3746379b77d6dc55415baa16Max Cai    "$type$[] newArray =\n"
188286271f75aa6ff1f3746379b77d6dc55415baa16Max Cai    "    new $type$[i + arrayLength];\n"
189334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "if (i != 0) {\n"
190334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "  java.lang.System.arraycopy(this.$name$, 0, newArray, 0, i);\n"
191e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    "}\n"
192334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "for (; i < newArray.length - 1; i++) {\n"
193334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "  newArray[i] = new $type$();\n");
19464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
19564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
19664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
197334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      "  input.readGroup(newArray[i], $number$);\n");
19864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  } else {
19964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
200334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      "  input.readMessage(newArray[i]);\n");
20164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
20264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
20364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
20464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "  input.readTag();\n"
20564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "}\n"
20664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "// Last one without readTag.\n"
207334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "newArray[i] = new $type$();\n");
20864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
20964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
21064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
211334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      "input.readGroup(newArray[i], $number$);\n");
21264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  } else {
21364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    printer->Print(variables_,
214334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai      "input.readMessage(newArray[i]);\n");
21564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  }
216334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai
217334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai  printer->Print(variables_,
218334a7d1117a576bc6010c14677fb6444639c1ddaMax Cai    "this.$name$ = newArray;\n");
21964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
22064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
22164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid RepeatedMessageFieldGenerator::
22264d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciGenerateSerializationCode(io::Printer* printer) const {
22364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
224beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "if (this.$name$ != null && this.$name$.length > 0) {\n"
225beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "  for (int i = 0; i < this.$name$.length; i++) {\n"
226beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    $type$ element = this.$name$[i];\n"
227beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    if (element != null) {\n"
228beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "      output.write$group_or_message$($number$, element);\n"
229beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    }\n"
230e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    "  }\n"
23164d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "}\n");
23264d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
23364d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
23464d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazcivoid RepeatedMessageFieldGenerator::
23564d8d8f89050c5ada85341f967af391f4716a7cbUlas KirazciGenerateSerializedSizeCode(io::Printer* printer) const {
23664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci  printer->Print(variables_,
237beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "if (this.$name$ != null && this.$name$.length > 0) {\n"
238beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "  for (int i = 0; i < this.$name$.length; i++) {\n"
239beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    $type$ element = this.$name$[i];\n"
240beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    if (element != null) {\n"
241beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "      size += com.google.protobuf.nano.CodedOutputByteBufferNano\n"
242beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "        .compute$group_or_message$Size($number$, element);\n"
243beb57e08a44a140bf52235717f1f907ca857f360Aurash Mahbod    "    }\n"
244e03e9f4b5774c0ffe04140d83bbdb532863b1720Brian Duff    "  }\n"
24564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci    "}\n");
24664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
24764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
248ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duffvoid RepeatedMessageFieldGenerator::
249bcf45045f229edab8c2589c1f561e7b7495a763bBrian DuffGenerateFixClonedCode(io::Printer* printer) const {
250bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff  printer->Print(variables_,
251bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "if (this.$name$ != null && this.$name$.length > 0) {\n"
252bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "  cloned.$name$ = new $type$[this.$name$.length];\n"
253bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "  for (int i = 0; i < this.$name$.length; i++) {\n"
254bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "    if (this.$name$[i] != null) {\n"
255bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "      cloned.$name$[i] = this.$name$[i].clone();\n"
256bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "    }\n"
257bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "  }\n"
258bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff    "}\n");
259bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff}
260bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duff
261bcf45045f229edab8c2589c1f561e7b7495a763bBrian Duffvoid RepeatedMessageFieldGenerator::
262ccc48faf20dbf3b3cddcffe78d198876d543529bBrian DuffGenerateEqualsCode(io::Printer* printer) const {
263ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  printer->Print(variables_,
264ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "if (!com.google.protobuf.nano.InternalNano.equals(\n"
265ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "    this.$name$, other.$name$)) {\n"
266ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "  return false;\n"
267ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "}\n");
268ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff}
269ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff
270ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duffvoid RepeatedMessageFieldGenerator::
271ccc48faf20dbf3b3cddcffe78d198876d543529bBrian DuffGenerateHashCodeCode(io::Printer* printer) const {
272ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff  printer->Print(variables_,
273ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "result = 31 * result\n"
274ccc48faf20dbf3b3cddcffe78d198876d543529bBrian Duff    "    + com.google.protobuf.nano.InternalNano.hashCode(this.$name$);\n");
27564d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}
27664d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci
27764d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace javanano
27864d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace compiler
27964d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace protobuf
28064d8d8f89050c5ada85341f967af391f4716a7cbUlas Kirazci}  // namespace google
281