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