java_helpers.cc revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
1fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Protocol Buffers - Google's data interchange format
2fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Copyright 2008 Google Inc.  All rights reserved.
3fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// http://code.google.com/p/protobuf/
4fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
5fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Redistribution and use in source and binary forms, with or without
6fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// modification, are permitted provided that the following conditions are
7fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// met:
8fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
9fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions of source code must retain the above copyright
10fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// notice, this list of conditions and the following disclaimer.
11fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Redistributions in binary form must reproduce the above
12fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// copyright notice, this list of conditions and the following disclaimer
13fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// in the documentation and/or other materials provided with the
14fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// distribution.
15fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//     * Neither the name of Google Inc. nor the names of its
16fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// contributors may be used to endorse or promote products derived from
17fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// this software without specific prior written permission.
18fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//
19fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
31fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Author: kenton@google.com (Kenton Varda)
32fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Based on original Protocol Buffers design by
33fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville//  Sanjay Ghemawat, Jeff Dean, and others.
34fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
35fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <vector>
36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/compiler/java/java_helpers.h>
38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h>
39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/strutil.h>
40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/stubs/substitute.h>
41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google {
43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf {
44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler {
45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java {
46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char kThickSeparator[] =
48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "// ===================================================================\n";
49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char kThinSeparator[] =
50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  "// -------------------------------------------------------------------\n";
51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace {
53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* kDefaultPackage = "";
55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst string& FieldName(const FieldDescriptor* field) {
57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Groups are hacky:  The name of the field is just the lower-cased name
58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of the group type.  In Java, though, we would like to retain the original
59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // capitalization of the type name.
60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (field->type() == FieldDescriptor::TYPE_GROUP) {
61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return field->message_type()->name();
62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return field->name();
64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCamelCaseImpl(const string& input, bool cap_next_letter) {
68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string result;
69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Note:  I distrust ctype.h due to locales.
70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < input.size(); i++) {
71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if ('a' <= input[i] && input[i] <= 'z') {
72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (cap_next_letter) {
73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += input[i] + ('A' - 'a');
74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += input[i];
76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      cap_next_letter = false;
78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else if ('A' <= input[i] && input[i] <= 'Z') {
79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (i == 0 && !cap_next_letter) {
80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Force first letter to lower-case unless explicitly told to
81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // capitalize it.
82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += input[i] + ('a' - 'A');
83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        // Capital letters after the first are left as-is.
85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        result += input[i];
86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      cap_next_letter = false;
88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else if ('0' <= input[i] && input[i] <= '9') {
89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result += input[i];
90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      cap_next_letter = true;
91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      cap_next_letter = true;
93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
96fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
97fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
98fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace
99fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
100fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCamelCase(const FieldDescriptor* field) {
101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return UnderscoresToCamelCaseImpl(FieldName(field), false);
102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field) {
105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return UnderscoresToCamelCaseImpl(FieldName(field), true);
106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCamelCase(const MethodDescriptor* method) {
109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return UnderscoresToCamelCaseImpl(method->name(), false);
110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring StripProto(const string& filename) {
113fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (HasSuffixString(filename, ".protodevel")) {
114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return StripSuffixString(filename, ".protodevel");
115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return StripSuffixString(filename, ".proto");
117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FileClassName(const FileDescriptor* file) {
121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (file->options().has_java_outer_classname()) {
122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return file->options().java_outer_classname();
123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string basename;
125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string::size_type last_slash = file->name().find_last_of('/');
126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (last_slash == string::npos) {
127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      basename = file->name();
128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    } else {
129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      basename = file->name().substr(last_slash + 1);
130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return UnderscoresToCamelCaseImpl(StripProto(basename), true);
132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FileJavaPackage(const FileDescriptor* file) {
136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (file->options().has_java_package()) {
137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return file->options().java_package();
138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    string result = kDefaultPackage;
140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if (!file->package().empty()) {
141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (!result.empty()) result += '.';
142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      result += file->package();
143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    return result;
145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring ToJavaName(const string& full_name, const FileDescriptor* file) {
149fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string result;
150fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (file->options().java_multiple_files()) {
151fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result = FileJavaPackage(file);
152fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
153fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result = ClassName(file);
154fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
155fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!result.empty()) {
156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result += '.';
157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (file->package().empty()) {
159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result += full_name;
160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  } else {
161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // Strip the proto package from full_name since we've replaced it with
162fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // the Java package.
163fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    result += full_name.substr(file->package().size() + 1);
164fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
165fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
166fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
167fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
168fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring ClassName(const FileDescriptor* descriptor) {
169fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string result = FileJavaPackage(descriptor);
170fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  if (!result.empty()) result += '.';
171fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  result += FileClassName(descriptor);
172fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return result;
173fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
174fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
175fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FieldConstantName(const FieldDescriptor *field) {
176fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  string name = field->name() + "_FIELD_NUMBER";
177fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  UpperString(&name);
178fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return name;
179fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
180fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
181fbaaef999ba563838ebd00874ed8a1c01fbf286dWink SavilleJavaType GetJavaType(FieldDescriptor::Type field_type) {
182fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch (field_type) {
183fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_INT32:
184fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_UINT32:
185fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SINT32:
186fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FIXED32:
187fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SFIXED32:
188fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_INT;
189fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
190fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_INT64:
191fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_UINT64:
192fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SINT64:
193fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FIXED64:
194fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_SFIXED64:
195fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_LONG;
196fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
197fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_FLOAT:
198fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_FLOAT;
199fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
200fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_DOUBLE:
201fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_DOUBLE;
202fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
203fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_BOOL:
204fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_BOOLEAN;
205fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
206fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_STRING:
207fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_STRING;
208fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
209fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_BYTES:
210fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_BYTES;
211fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
212fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_ENUM:
213fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_ENUM;
214fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
215fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_GROUP:
216fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::TYPE_MESSAGE:
217fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return JAVATYPE_MESSAGE;
218fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
219fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // No default because we want the compiler to complain if any new
220fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // types are added.
221fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
222fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
223fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
224fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return JAVATYPE_INT;
225fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
226fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
227fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* BoxedPrimitiveTypeName(JavaType type) {
228fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch (type) {
229fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_INT    : return "java.lang.Integer";
230fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_LONG   : return "java.lang.Long";
231fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_FLOAT  : return "java.lang.Float";
232fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_DOUBLE : return "java.lang.Double";
233fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_BOOLEAN: return "java.lang.Boolean";
234fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_STRING : return "java.lang.String";
235fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_BYTES  : return "com.google.protobuf.ByteString";
236fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_ENUM   : return NULL;
237fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case JAVATYPE_MESSAGE: return NULL;
238fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
239fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // No default because we want the compiler to complain if any new
240fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // JavaTypes are added.
241fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
242fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
243fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
244fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return NULL;
245fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
246fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
247fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillebool AllAscii(const string& text) {
248fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  for (int i = 0; i < text.size(); i++) {
249fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    if ((text[i] & 0x80) != 0) {
250fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return false;
251fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    }
252fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
253fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return true;
254fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
255fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
256fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring DefaultValue(const FieldDescriptor* field) {
257fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // Switch on cpp_type since we need to know which default_value_* method
258fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  // of FieldDescriptor to call.
259fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  switch (field->cpp_type()) {
260fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_INT32:
261fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleItoa(field->default_value_int32());
262fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_UINT32:
263fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      // Need to print as a signed int since Java has no unsigned.
264fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleItoa(static_cast<int32>(field->default_value_uint32()));
265fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_INT64:
266fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleItoa(field->default_value_int64()) + "L";
267fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_UINT64:
268fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleItoa(static_cast<int64>(field->default_value_uint64())) +
269fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville             "L";
270fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_DOUBLE:
271fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleDtoa(field->default_value_double()) + "D";
272fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_FLOAT:
273fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return SimpleFtoa(field->default_value_float()) + "F";
274fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_BOOL:
275fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return field->default_value_bool() ? "true" : "false";
276fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_STRING:
277fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      if (field->type() == FieldDescriptor::TYPE_BYTES) {
278fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (field->has_default_value()) {
279fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // See comments in Internal.java for gory details.
280fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return strings::Substitute(
281fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "com.google.protobuf.Internal.bytesDefaultValue(\"$0\")",
282fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            CEscape(field->default_value_string()));
283fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        } else {
284fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return "com.google.protobuf.ByteString.EMPTY";
285fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
286fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      } else {
287fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        if (AllAscii(field->default_value_string())) {
288fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // All chars are ASCII.  In this case CEscape() works fine.
289fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return "\"" + CEscape(field->default_value_string()) + "\"";
290fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        } else {
291fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          // See comments in Internal.java for gory details.
292fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville          return strings::Substitute(
293fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            "com.google.protobuf.Internal.stringDefaultValue(\"$0\")",
294fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville            CEscape(field->default_value_string()));
295fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville        }
296fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      }
297fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
298fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_ENUM:
299fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return ClassName(field->enum_type()) + "." +
300fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville             field->default_value_enum()->name();
301fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
302fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    case FieldDescriptor::CPPTYPE_MESSAGE:
303fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville      return ClassName(field->message_type()) + ".getDefaultInstance()";
304fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
305fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // No default because we want the compiler to complain if any new
306fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville    // types are added.
307fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  }
308fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
309fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  GOOGLE_LOG(FATAL) << "Can't get here.";
310fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville  return "";
311fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}
312fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville
313fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace java
314fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace compiler
315fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace protobuf
316fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}  // namespace google
317