1e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// Protocol Buffers - Google's data interchange format
2e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// Copyright 2008 Google Inc.  All rights reserved.
3e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// http://code.google.com/p/protobuf/
4e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//
5e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// Redistribution and use in source and binary forms, with or without
6e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// modification, are permitted provided that the following conditions are
7e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// met:
8e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//
9e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//     * Redistributions of source code must retain the above copyright
10e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// notice, this list of conditions and the following disclaimer.
11e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//     * Redistributions in binary form must reproduce the above
12e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// copyright notice, this list of conditions and the following disclaimer
13e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// in the documentation and/or other materials provided with the
14e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// distribution.
15e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//     * Neither the name of Google Inc. nor the names of its
16e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// contributors may be used to endorse or promote products derived from
17e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// this software without specific prior written permission.
18e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//
19e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
31e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// Author: kenton@google.com (Kenton Varda)
32e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//  Based on original Protocol Buffers design by
33e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
35e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <map>
36e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <string>
37e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
38e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/compiler/javamicro/javamicro_message_field.h>
39e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/compiler/javamicro/javamicro_helpers.h>
40e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/io/printer.h>
41e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/wire_format.h>
42e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/stubs/strutil.h>
43e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
44e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace google {
45e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace protobuf {
46e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace compiler {
47e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace javamicro {
48e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
49e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace {
50e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
51e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// TODO(kenton):  Factor out a "SetCommonFieldVariables()" to get rid of
52e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//   repeat code between this and the other field types.
53e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid SetMessageVariables(const Params& params,
54e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    const FieldDescriptor* descriptor, map<string, string>* variables) {
55e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["name"] =
56e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    UnderscoresToCamelCase(descriptor);
57e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["capitalized_name"] =
58e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    UnderscoresToCapitalizedCamelCase(descriptor);
59e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["number"] = SimpleItoa(descriptor->number());
60e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["type"] = ClassName(params, descriptor->message_type());
61e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["group_or_message"] =
62e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    (descriptor->type() == FieldDescriptor::TYPE_GROUP) ?
63e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "Group" : "Message";
64e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["message_name"] = descriptor->containing_type()->name();
65e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  //(*variables)["message_type"] = descriptor->message_type()->name();
66e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
67e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
68e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace
69e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
70e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// ===================================================================
71e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
72e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleMessageFieldGenerator::
73e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
74e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  : FieldGenerator(params), descriptor_(descriptor) {
75e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  SetMessageVariables(params, descriptor, &variables_);
76e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
77e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
78e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleMessageFieldGenerator::~MessageFieldGenerator() {}
79e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
80e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid MessageFieldGenerator::
81e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMembers(io::Printer* printer) const {
82e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
83e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "private boolean has$capitalized_name$;\n"
84e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//    "private $type$ $name$_ = null;\n"
85e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//    "public boolean has$capitalized_name$() { return has$capitalized_name$; }\n"
86e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville//    "public $type$ get$capitalized_name$() { return $name$_; }\n"
87e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "private $type$ $name$_ = null;\n"
88e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "public boolean has$capitalized_name$() { return has$capitalized_name$; }\n"
89e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "public $type$ get$capitalized_name$() { return $name$_; }\n"
90e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "public $message_name$ set$capitalized_name$($type$ value) {\n"
91e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  if (value == null) {\n"
92e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "    throw new NullPointerException();\n"
93e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  }\n"
94e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  has$capitalized_name$ = true;\n"
95e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  $name$_ = value;\n"
96e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  return this;\n"
97e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n"
98e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "public $message_name$ clear$capitalized_name$() {\n"
99e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  has$capitalized_name$ = false;\n"
100e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  $name$_ = null;\n"
101e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  return this;\n"
102e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n");
103e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
104e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
105e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid MessageFieldGenerator::
106e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMergingCode(io::Printer* printer) const {
107e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
108e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "if (other.has$capitalized_name$()) {\n"
109e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  merge$capitalized_name$(other.get$capitalized_name$());\n"
110e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n");
111e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
112e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
113e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid MessageFieldGenerator::
114e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateParsingCode(io::Printer* printer) const {
115e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
116e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "$type$ value = new $type$();\n");
117e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
118e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
119e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
120e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "input.readGroup(value, $number$);\n");
121e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
122e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
123e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "input.readMessage(value);\n");
124e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
125e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
126e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
127e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "set$capitalized_name$(value);\n");
128e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
129e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
130e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid MessageFieldGenerator::
131e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializationCode(io::Printer* printer) const {
132e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
133e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "if (has$capitalized_name$()) {\n"
134e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  output.write$group_or_message$($number$, get$capitalized_name$());\n"
135e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n");
136e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
137e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
138e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid MessageFieldGenerator::
139e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
140e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
141e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "if (has$capitalized_name$()) {\n"
142e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
143e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "    .compute$group_or_message$Size($number$, get$capitalized_name$());\n"
144e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n");
145e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
146e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
147e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillestring MessageFieldGenerator::GetBoxedType() const {
148e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return ClassName(params_, descriptor_->message_type());
149e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
150e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
151e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// ===================================================================
152e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
153e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedMessageFieldGenerator::
154e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedMessageFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
155e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  : FieldGenerator(params), descriptor_(descriptor) {
156e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  SetMessageVariables(params, descriptor, &variables_);
157e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
158e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
159e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedMessageFieldGenerator::~RepeatedMessageFieldGenerator() {}
160e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
161e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedMessageFieldGenerator::
162e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMembers(io::Printer* printer) const {
163e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (params_.java_use_vector()) {
164e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
165e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "private java.util.Vector $name$_ = new java.util.Vector();\n"
166e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public java.util.Vector get$capitalized_name$List() {\n"
167e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return $name$_;\n"
168e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
169e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
170e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $type$ get$capitalized_name$(int index) {\n"
171e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return ($type$) $name$_.elementAt(index);\n"
172e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
173e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
174e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (value == null) {\n"
175e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    throw new NullPointerException();\n"
176e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
177e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.setElementAt(value, index);\n"
178e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
179e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
180e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ add$capitalized_name$($type$ value) {\n"
181e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (value == null) {\n"
182e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    throw new NullPointerException();\n"
183e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
184e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.addElement(value);\n"
185e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
186e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
187e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ clear$capitalized_name$() {\n"
188e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.removeAllElements();\n"
189e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
190e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
191e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
192e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
193e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "private java.util.List<$type$> $name$_ =\n"
194e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  java.util.Collections.emptyList();\n"
195e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public java.util.List<$type$> get$capitalized_name$List() {\n"
196e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return $name$_;\n"
197e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
198e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
199e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $type$ get$capitalized_name$(int index) {\n"
200e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return $name$_.get(index);\n"
201e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
202e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
203e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (value == null) {\n"
204e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    throw new NullPointerException();\n"
205e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
206e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.set(index, value);\n"
207e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
208e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
209e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ add$capitalized_name$($type$ value) {\n"
210e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (value == null) {\n"
211e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    throw new NullPointerException();\n"
212e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
213e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if ($name$_.isEmpty()) {\n"
214e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    $name$_ = new java.util.ArrayList<$type$>();\n"
215e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
216e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.add(value);\n"
217e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
218e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
219e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ clear$capitalized_name$() {\n"
220e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_ = java.util.Collections.emptyList();\n"
221e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
222e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
223e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
224e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
225e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
226e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedMessageFieldGenerator::
227e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMergingCode(io::Printer* printer) const {
228e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (params_.java_use_vector()) {
229e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
230e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (other.$name$_.size() != 0) {\n"
231e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  for (int i = 0; i < other.$name$_.size(); i++) {\n"
232e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    result.$name$_.addElement(other.$name$_.elementAt(i));\n"
233e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
234e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
235e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
236e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
237e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (!other.$name$_.isEmpty()) {\n"
238e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (result.$name$_.isEmpty()) {\n"
239e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    result.$name$_ = new java.util.ArrayList<$type$>();\n"
240e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
241e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  result.$name$_.addAll(other.$name$_);\n"
242e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
243e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
244e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
245e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
246e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedMessageFieldGenerator::
247e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateParsingCode(io::Printer* printer) const {
248e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
249e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "$type$ value = new $type$();\n");
250e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
251e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->type() == FieldDescriptor::TYPE_GROUP) {
252e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
253e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "input.readGroup(value, $number$);\n");
254e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
255e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
256e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "input.readMessage(value);\n");
257e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
258e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
259e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
260e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "add$capitalized_name$(value);\n");
261e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
262e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
263e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedMessageFieldGenerator::
264e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializationCode(io::Printer* printer) const {
265e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (params_.java_use_vector()) {
266e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
267e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n"
268e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  output.write$group_or_message$($number$, get$capitalized_name$(i));\n"
269e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
270e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
271e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
272e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "for ($type$ element : get$capitalized_name$List()) {\n"
273e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  output.write$group_or_message$($number$, element);\n"
274e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
275e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
276e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
277e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
278e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedMessageFieldGenerator::
279e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
280e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (params_.java_use_vector()) {
281e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
282e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n"
283e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
284e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    .compute$group_or_message$Size($number$, get$capitalized_name$(i));\n"
285e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
286e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
287e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
288e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "for ($type$ element : get$capitalized_name$List()) {\n"
289e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
290e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    .compute$group_or_message$Size($number$, element);\n"
291e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
292e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
293e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
294e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
295e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillestring RepeatedMessageFieldGenerator::GetBoxedType() const {
296e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return ClassName(params_, descriptor_->message_type());
297e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
298e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
299e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace javamicro
300e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace compiler
301e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace protobuf
302e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace google
303