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_primitive_field.h>
39e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/stubs/common.h>
40e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/compiler/javamicro/javamicro_helpers.h>
41e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/io/printer.h>
42e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/wire_format.h>
43e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville#include <google/protobuf/stubs/strutil.h>
44e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
45e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace google {
46e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace protobuf {
47e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace compiler {
48e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace javamicro {
49e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
50e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savilleusing internal::WireFormat;
51e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savilleusing internal::WireFormatLite;
52e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
53e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillenamespace {
54e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
55e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savilleconst char* PrimitiveTypeName(JavaType type) {
56e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  switch (type) {
57e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_INT    : return "int";
58e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_LONG   : return "long";
59e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_FLOAT  : return "float";
60e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_DOUBLE : return "double";
61e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BOOLEAN: return "boolean";
62e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_STRING : return "java.lang.String";
63e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BYTES  : return "com.google.protobuf.micro.ByteStringMicro";
64e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_ENUM   : return NULL;
65e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_MESSAGE: return NULL;
66e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
67e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // No default because we want the compiler to complain if any new
68e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // JavaTypes are added.
69e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
70e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
71e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
72e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return NULL;
73e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
74e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
75e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillebool IsReferenceType(JavaType type) {
76e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  switch (type) {
77e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_INT    : return false;
78e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_LONG   : return false;
79e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_FLOAT  : return false;
80e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_DOUBLE : return false;
81e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BOOLEAN: return false;
82e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_STRING : return true;
83e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BYTES  : return true;
84e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_ENUM   : return false;
85e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_MESSAGE: return true;
86e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
87e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // No default because we want the compiler to complain if any new
88e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // JavaTypes are added.
89e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
90e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
91e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
92e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return false;
93e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
94e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
95e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savilleconst char* GetCapitalizedType(const FieldDescriptor* field) {
96e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  switch (field->type()) {
97e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_INT32   : return "Int32"   ;
98e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_UINT32  : return "UInt32"  ;
99e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SINT32  : return "SInt32"  ;
100e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FIXED32 : return "Fixed32" ;
101e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SFIXED32: return "SFixed32";
102e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_INT64   : return "Int64"   ;
103e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_UINT64  : return "UInt64"  ;
104e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SINT64  : return "SInt64"  ;
105e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FIXED64 : return "Fixed64" ;
106e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SFIXED64: return "SFixed64";
107e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FLOAT   : return "Float"   ;
108e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_DOUBLE  : return "Double"  ;
109e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_BOOL    : return "Bool"    ;
110e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_STRING  : return "String"  ;
111e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_BYTES   : return "Bytes"   ;
112e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_ENUM    : return "Enum"    ;
113e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_GROUP   : return "Group"   ;
114e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_MESSAGE : return "Message" ;
115e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
116e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // No default because we want the compiler to complain if any new
117e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // types are added.
118e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
119e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
120e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
121e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return NULL;
122e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
123e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
124e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// For encodings with fixed sizes, returns that size in bytes.  Otherwise
125e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// returns -1.
126e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savilleint FixedSize(FieldDescriptor::Type type) {
127e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  switch (type) {
128e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_INT32   : return -1;
129e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_INT64   : return -1;
130e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_UINT32  : return -1;
131e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_UINT64  : return -1;
132e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SINT32  : return -1;
133e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SINT64  : return -1;
134e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FIXED32 : return WireFormatLite::kFixed32Size;
135e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FIXED64 : return WireFormatLite::kFixed64Size;
136e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SFIXED32: return WireFormatLite::kSFixed32Size;
137e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_SFIXED64: return WireFormatLite::kSFixed64Size;
138e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_FLOAT   : return WireFormatLite::kFloatSize;
139e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_DOUBLE  : return WireFormatLite::kDoubleSize;
140e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
141e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_BOOL    : return WireFormatLite::kBoolSize;
142e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_ENUM    : return -1;
143e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
144e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_STRING  : return -1;
145e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_BYTES   : return -1;
146e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_GROUP   : return -1;
147e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case FieldDescriptor::TYPE_MESSAGE : return -1;
148e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
149e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // No default because we want the compiler to complain if any new
150e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // types are added.
151e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
152e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
153e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return -1;
154e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
155e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
156e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// Return true if the type is a that has variable length
157e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// for instance String's.
158e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillebool IsVariableLenType(JavaType type) {
159e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  switch (type) {
160e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_INT    : return false;
161e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_LONG   : return false;
162e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_FLOAT  : return false;
163e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_DOUBLE : return false;
164e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BOOLEAN: return false;
165e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_STRING : return true;
166e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_BYTES  : return true;
167e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_ENUM   : return false;
168e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    case JAVATYPE_MESSAGE: return true;
169e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
170e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // No default because we want the compiler to complain if any new
171e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    // JavaTypes are added.
172e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
173e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
174e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
175e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return false;
176e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
177e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
1781b639e09d77de609bed080f5d2ca88d72ba42559Wink Savillebool IsFastStringHandling(const FieldDescriptor* descriptor,
179e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      const Params params) {
180e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return ((params.optimization() == JAVAMICRO_OPT_SPEED)
181e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      && (GetJavaType(descriptor) == JAVATYPE_STRING));
182e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
183e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
184e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid SetPrimitiveVariables(const FieldDescriptor* descriptor, const Params params,
185e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville                           map<string, string>* variables) {
186e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["name"] =
187e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    UnderscoresToCamelCase(descriptor);
188e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["capitalized_name"] =
189e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    UnderscoresToCapitalizedCamelCase(descriptor);
190e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["number"] = SimpleItoa(descriptor->number());
1911b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  (*variables)["type"] = PrimitiveTypeName(GetJavaType(descriptor));
1921b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  (*variables)["default"] = DefaultValue(params, descriptor);
193e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["boxed_type"] = BoxedPrimitiveTypeName(GetJavaType(descriptor));
194e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["capitalized_type"] = GetCapitalizedType(descriptor);
195e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["tag"] = SimpleItoa(WireFormat::MakeTag(descriptor));
196e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["tag_size"] = SimpleItoa(
197e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      WireFormat::TagSize(descriptor->number(), descriptor->type()));
198e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (IsReferenceType(GetJavaType(descriptor))) {
199e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    (*variables)["null_check"] =
200e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  if (value == null) {\n"
201e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "    throw new NullPointerException();\n"
202e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  }\n";
203e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
204e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    (*variables)["null_check"] = "";
205e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
206e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  int fixed_size = FixedSize(descriptor->type());
207e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (fixed_size != -1) {
208e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    (*variables)["fixed_size"] = SimpleItoa(fixed_size);
209e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
210e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  (*variables)["message_name"] = descriptor->containing_type()->name();
211e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
212e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace
213e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
214e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// ===================================================================
215e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
216e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavillePrimitiveFieldGenerator::
217e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavillePrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
218e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  : FieldGenerator(params), descriptor_(descriptor) {
219e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  SetPrimitiveVariables(descriptor, params, &variables_);
220e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
221e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
222e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavillePrimitiveFieldGenerator::~PrimitiveFieldGenerator() {}
223e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
224e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid PrimitiveFieldGenerator::
225e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMembers(io::Printer* printer) const {
226e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
227e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "private boolean has$capitalized_name$;\n"
228e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "private $type$ $name$_ = $default$;\n"
2291b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville    "public $type$ get$capitalized_name$() { return $name$_; }\n"
230e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "public boolean has$capitalized_name$() { return has$capitalized_name$; }\n");
2311b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  if (IsFastStringHandling(descriptor_, params_)) {
232e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
2331b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "private byte [] $name$Utf8_ = null;\n"
2341b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "public $message_name$ set$capitalized_name$($type$ value) {\n"
235e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  has$capitalized_name$ = true;\n"
2361b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  $name$_ = value;\n"
2371b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  $name$Utf8_ = null;\n"
238e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
239e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
240e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ clear$capitalized_name$() {\n"
241e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  has$capitalized_name$ = false;\n"
242e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_ = $default$;\n"
2431b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  $name$Utf8_ = null;\n"
244e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
245e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
246e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
247e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (IsVariableLenType(GetJavaType(descriptor_))) {
248e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
249e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ set$capitalized_name$($type$ value) {\n"
250e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  has$capitalized_name$ = true;\n"
251e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_ = value;\n"
252e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
253e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
254e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
255e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  has$capitalized_name$ = false;\n"
256e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_ = $default$;\n"
257e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
258e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
259e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
260e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
261e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ set$capitalized_name$($type$ value) {\n"
262e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  has$capitalized_name$ = true;\n"
263e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_ = value;\n"
264e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
265e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
266e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
267e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  has$capitalized_name$ = false;\n"
268e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_ = $default$;\n"
269e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
270e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
271e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
272e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
273e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
274e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
275e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid PrimitiveFieldGenerator::
276e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMergingCode(io::Printer* printer) const {
277e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
278e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "if (other.has$capitalized_name$()) {\n"
279e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  set$capitalized_name$(other.get$capitalized_name$());\n"
280e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "}\n");
281e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
282e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
283e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid PrimitiveFieldGenerator::
284e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateParsingCode(io::Printer* printer) const {
285e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
286e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "set$capitalized_name$(input.read$capitalized_type$());\n");
287e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
288e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
289e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid PrimitiveFieldGenerator::
290e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializationCode(io::Printer* printer) const {
2911b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  if (IsFastStringHandling(descriptor_, params_)) {
292e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
293e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (has$capitalized_name$()) {\n"
2941b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  output.writeByteArray($number$, $name$Utf8_);\n"
295e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
296e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
297e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
298e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (has$capitalized_name$()) {\n"
299e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  output.write$capitalized_type$($number$, get$capitalized_name$());\n"
300e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
301e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
302e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
303e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
304e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid PrimitiveFieldGenerator::
305e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
3061b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  if (IsFastStringHandling(descriptor_, params_)) {
307e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
308e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (has$capitalized_name$()) {\n"
3091b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  try {\n"
3101b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "    $name$Utf8_ = $name$_.getBytes(\"UTF-8\");\n"
3111b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  } catch (java.io.UnsupportedEncodingException e) {\n"
3121b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "    throw new RuntimeException(\"UTF-8 not supported.\");\n"
3131b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "  }\n"
314e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
3151b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "    .computeByteArraySize($number$, $name$Utf8_);\n"
316e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
317e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
318e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
319e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (has$capitalized_name$()) {\n"
320e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
321e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    .compute$capitalized_type$Size($number$, get$capitalized_name$());\n"
322e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
323e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
324e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
325e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
326e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillestring PrimitiveFieldGenerator::GetBoxedType() const {
327e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
328e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
329e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
330e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville// ===================================================================
331e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
332e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedPrimitiveFieldGenerator::
333e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedPrimitiveFieldGenerator(const FieldDescriptor* descriptor, const Params& params)
334e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  : FieldGenerator(params), descriptor_(descriptor) {
335e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  SetPrimitiveVariables(descriptor, params, &variables_);
336e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
337e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    GOOGLE_LOG(FATAL) << "MicroRuntime does not support packed";
338e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
339e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
340e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
341e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleRepeatedPrimitiveFieldGenerator::~RepeatedPrimitiveFieldGenerator() {}
342e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
343e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedPrimitiveFieldGenerator::
344e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMembers(io::Printer* printer) const {
3451b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville  if (IsFastStringHandling(descriptor_, params_)) {
346e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (params_.java_use_vector()) {
347e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
348e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "private java.util.Vector $name$_ = new java.util.Vector();\n"
349e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public java.util.Vector get$capitalized_name$List() {\n"
350e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return $name$_;\n"
351e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3521b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "private java.util.Vector $name$Utf8_ = new java.util.Vector();\n"
353e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
3541b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $type$ get$capitalized_name$(int index) {\n"
3551b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  return (($type$)$name$_.elementAt(index));\n"
356e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3571b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
358e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
3591b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$_.setElementAt(value, index);\n"
3601b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
361e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
362e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3631b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $message_name$ add$capitalized_name$($type$ value) {\n"
364e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
3651b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$_.addElement(value);\n"
3661b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
367e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
368e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
369e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
370e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.removeAllElements();\n"
3711b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
372e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
373e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
374e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
375e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
376e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "private java.util.List<$type$> $name$_ =\n"
377e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  java.util.Collections.emptyList();\n"
378e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public java.util.List<$type$> get$capitalized_name$List() {\n"
379e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return $name$_;\n"   // note:  unmodifiable list
380e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3811b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "private java.util.List<byte []> $name$Utf8_ = null;\n"
382e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
3831b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $type$ get$capitalized_name$(int index) {\n"
3841b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  return $name$_.get(index);\n"
385e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3861b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
387e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
3881b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$_.set(index, value);\n"
3891b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
390e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
391e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
3921b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "public $message_name$ add$capitalized_name$($type$ value) {\n"
393e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
394e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  if ($name$_.isEmpty()) {\n"
395e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "    $name$_ = new java.util.ArrayList<$type$>();\n"
396e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  }\n"
3971b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$_.add(value);\n"
3981b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
399e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
400e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
401e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
402e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_ = java.util.Collections.emptyList();\n"
4031b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville        "  $name$Utf8_ = null;\n"
404e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
405e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
406e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
407e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else if (params_.java_use_vector()) {
408e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (IsReferenceType(GetJavaType(descriptor_))) {
409e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
410e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "private java.util.Vector $name$_ = new java.util.Vector();\n"
411e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public java.util.Vector get$capitalized_name$List() {\n"
412e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return $name$_;\n"
413e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
414e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
415e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $type$ get$capitalized_name$(int index) {\n"
416e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return ($type$) $name$_.elementAt(index);\n"
417e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
418e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
419e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
420e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.setElementAt(value, index);\n"
421e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
422e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
423e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ add$capitalized_name$($type$ value) {\n"
424e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
425e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.addElement(value);\n"
426e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
427e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
428e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
429e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.removeAllElements();\n"
430e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
431e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
432e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
433e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
434e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "private java.util.Vector $name$_ = new java.util.Vector();\n"
435e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public java.util.Vector get$capitalized_name$List() {\n"
436e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return $name$_;\n"
437e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
438e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
439e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $type$ get$capitalized_name$(int index) {\n"
440e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return (($boxed_type$)$name$_.elementAt(index)).$type$Value();\n"
441e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
442e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
443e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
444e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.setElementAt(new $boxed_type$(value), index);\n"
445e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
446e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
447e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ add$capitalized_name$($type$ value) {\n"
448e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "$null_check$"
449e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.addElement(new $boxed_type$(value));\n"
450e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
451e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n"
452e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "public $message_name$ clear$capitalized_name$() {\n"
453e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  $name$_.removeAllElements();\n"
454e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  return this;\n"
455e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
456e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
457e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
458e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
459e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "private java.util.List<$boxed_type$> $name$_ =\n"
460e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  java.util.Collections.emptyList();\n"
461e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public java.util.List<$boxed_type$> get$capitalized_name$List() {\n"
462e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return $name$_;\n"   // note:  unmodifiable list
463e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
464e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public int get$capitalized_name$Count() { return $name$_.size(); }\n"
465e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $type$ get$capitalized_name$(int index) {\n"
466e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return $name$_.get(index);\n"
467e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
468e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ set$capitalized_name$(int index, $type$ value) {\n"
469e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "$null_check$"
470e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.set(index, value);\n"
471e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
472e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
473e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ add$capitalized_name$($type$ value) {\n"
474e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "$null_check$"
475e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if ($name$_.isEmpty()) {\n"
476e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    $name$_ = new java.util.ArrayList<$boxed_type$>();\n"
477e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
478e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_.add(value);\n"
479e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
480e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
481e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "public $message_name$ clear$capitalized_name$() {\n"
482e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  $name$_ = java.util.Collections.emptyList();\n"
483e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  return this;\n"
484e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
485e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
486e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
487e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
488e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "private int $name$MemoizedSerializedSize;\n");
489e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
490e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
491e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
492e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedPrimitiveFieldGenerator::
493e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateMergingCode(io::Printer* printer) const {
494e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (params_.java_use_vector()) {
495e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
496e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (other.$name$_.size() != 0) {\n"
497e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  for (int i = 0; i < other.$name$_.size(); i++)) {\n"
498e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    result.$name$_.addElement(other.$name$_.elementAt(i));\n"
499e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
500e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
501e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
502e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
503e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "if (!other.$name$_.isEmpty()) {\n"
504e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  if (result.$name$_.isEmpty()) {\n"
505e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "    result.$name$_ = new java.util.ArrayList<$type$>();\n"
506e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  }\n"
507e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  result.$name$_.addAll(other.$name$_);\n"
508e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n");
509e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
510e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
511e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
512e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedPrimitiveFieldGenerator::
513e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateParsingCode(io::Printer* printer) const {
514e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
515e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
516e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "int length = input.readRawVarint32();\n"
517e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "int limit = input.pushLimit(length);\n"
518e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "while (input.getBytesUntilLimit() > 0) {\n"
519e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "  add$capitalized_name$(input.read$capitalized_type$());\n"
520e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "}\n"
521e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "input.popLimit(limit);\n");
522e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
523e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
524e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "add$capitalized_name$(input.read$capitalized_type$());\n");
525e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
526e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
527e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
528e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedPrimitiveFieldGenerator::
529e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializationCode(io::Printer* printer) const {
530e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
531e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
5321b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      "if (get$capitalized_name$List().size() > 0) {\n"
533e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  output.writeRawVarint32($tag$);\n"
534e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  output.writeRawVarint32($name$MemoizedSerializedSize);\n"
535e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
536e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (params_.java_use_vector()) {
537e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
538e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n"
539e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  output.write$capitalized_type$NoTag(get$capitalized_name$(i));\n"
540e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
541e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
542e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
543e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "for ($type$ element : get$capitalized_name$List()) {\n"
544e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  output.write$capitalized_type$NoTag(element);\n"
545e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
546e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
547e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
548e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (params_.java_use_vector()) {
5491b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      if (IsFastStringHandling(descriptor_, params_)) {
550e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
5511b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "for (int i = 0; i < $name$Utf8_.size(); i++) {\n"
5521b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  output.writeByteArray($number$, (byte []) $name$Utf8_.get(i));\n"
553e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
554e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      } else {
555e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
556e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n"
557e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "  output.write$capitalized_type$($number$, get$capitalized_name$(i));\n"
558e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
559e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      }
560e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
5611b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      if (IsFastStringHandling(descriptor_, params_)) {
562e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
5631b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "for (byte [] element : $name$Utf8_) {\n"
5641b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  output.writeByteArray($number$, element);\n"
565e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
566e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      } else {
567e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
568e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "for ($type$ element : get$capitalized_name$List()) {\n"
569e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "  output.write$capitalized_type$($number$, element);\n"
570e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
571e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      }
572e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
573e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
574e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
575e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
576e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillevoid RepeatedPrimitiveFieldGenerator::
577e2d542951c059563a3b7f74c257dac4f222d9dc5Wink SavilleGenerateSerializedSizeCode(io::Printer* printer) const {
578e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(variables_,
579e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "{\n"
580e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    "  int dataSize = 0;\n");
581e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Indent();
582e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
583e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (FixedSize(descriptor_->type()) == -1) {
584e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (params_.java_use_vector()) {
5851b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      if (IsFastStringHandling(descriptor_, params_)) {
586e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
5871b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "$name$Utf8_ = new java.util.Vector();\n"
5881b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "byte[] bytes = null;\n"
5891b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "int sizeArray = get$capitalized_name$List().size();\n"
5901b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "for (int i = 0; i < sizeArray; i++) {\n"
5911b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  $type$ element = ($type$)$name$_.elementAt(i);\n"
5921b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  try {\n"
5931b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "    bytes = element.getBytes(\"UTF-8\");\n"
5941b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  } catch (java.io.UnsupportedEncodingException e) {\n"
5951b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "    throw new RuntimeException(\"UTF-8 not supported.\");\n"
5961b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  }\n"
5971b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  $name$Utf8_.addElement(bytes);\n"
5981b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"
5991b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "    .computeByteArraySizeNoTag(bytes);\n"
600e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
601e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      } else {
602e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
6031b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "for (int i = 0; i < get$capitalized_name$List().size(); i++) {\n"
6041b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          "  dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"
605e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "    .compute$capitalized_type$SizeNoTag(($type$)get$capitalized_name$(i));\n"
606e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
607e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      }
608e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
6091b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville      if (IsFastStringHandling(descriptor_, params_)) {
6101b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville          printer->Print(variables_,
6111b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "$name$Utf8_ = new java.util.ArrayList<byte[]>();\n"
6121b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "byte[] bytes = null;\n"
6131b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "int sizeArray = get$capitalized_name$List().size();\n"
6141b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "for (int i = 0; i < sizeArray; i++) {\n"
6151b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "   $type$ element = get$capitalized_name$(i);\n"
6161b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  try {\n"
6171b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "    bytes = element.getBytes(\"UTF-8\");\n"
6181b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  } catch (java.io.UnsupportedEncodingException e) {\n"
6191b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "    throw new RuntimeException(\"UTF-8 not supported.\");\n"
6201b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  }\n"
6211b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  $name$Utf8_.add(bytes);\n"
6221b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"
6231b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "    .computeByteArraySizeNoTag(bytes);\n"
6241b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "}\n");
625e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      } else {
626e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        printer->Print(variables_,
6271b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "for ($type$ element : get$capitalized_name$List()) {\n"
6281b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "  dataSize += com.google.protobuf.micro.CodedOutputStreamMicro\n"
6291b639e09d77de609bed080f5d2ca88d72ba42559Wink Saville            "    .compute$capitalized_type$SizeNoTag(element);\n"
630e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville          "}\n");
631e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      }
632e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
633e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
634e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
635e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "dataSize = $fixed_size$ * get$capitalized_name$List().size();\n");
636e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
637e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
638e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print(
639e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "size += dataSize;\n");
640e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
641e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
642e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    if (params_.java_use_vector()) {
643e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
644e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "if (get$capitalized_name$List().size() != 0) {\n");
645e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    } else {
646e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      printer->Print(variables_,
647e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "if (!get$capitalized_name$List().isEmpty()) {\n");
648e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    }
649e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
650e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  size += $tag_size$;\n"
651e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "  size += com.google.protobuf.micro.CodedOutputStreamMicro\n"
652e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "      .computeInt32SizeNoTag(dataSize);\n"
653e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville        "}\n");
654e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  } else {
655e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
656e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "size += $tag_size$ * get$capitalized_name$List().size();\n");
657e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
658e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
659e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  // cache the data size for packed fields.
660e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  if (descriptor_->options().packed()) {
661e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville    printer->Print(variables_,
662e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville      "$name$MemoizedSerializedSize = dataSize;\n");
663e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  }
664e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
665e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Outdent();
666e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  printer->Print("}\n");
667e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
668e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
669e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Savillestring RepeatedPrimitiveFieldGenerator::GetBoxedType() const {
670e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville  return BoxedPrimitiveTypeName(GetJavaType(descriptor_));
671e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}
672e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville
673e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace javamicro
674e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace compiler
675e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace protobuf
676e2d542951c059563a3b7f74c257dac4f222d9dc5Wink Saville}  // namespace google
677