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#ifndef GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ 36fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#define GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ 37fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 38fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <string> 39fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.pb.h> 40fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#include <google/protobuf/descriptor.h> 41fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 42fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace google { 43fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace protobuf { 44fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace compiler { 45fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillenamespace java { 46fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 47fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Commonly-used separator comments. Thick is a line of '=', thin is a line 48fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of '-'. 49fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleextern const char kThickSeparator[]; 50fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleextern const char kThinSeparator[]; 51fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 52fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Converts the field's name to camel-case, e.g. "foo_bar_baz" becomes 53fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "fooBarBaz" or "FooBarBaz", respectively. 54fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCamelCase(const FieldDescriptor* field); 55fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCapitalizedCamelCase(const FieldDescriptor* field); 56fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 57fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Similar, but for method names. (Typically, this merely has the effect 58fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// of lower-casing the first letter of the name.) 59fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring UnderscoresToCamelCase(const MethodDescriptor* method); 60fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 61fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Strips ".proto" or ".protodevel" from the end of a filename. 62fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring StripProto(const string& filename); 63fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 64fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Gets the unqualified class name for the file. Each .proto file becomes a 65fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// single Java class, with all its contents nested in that class. 66fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FileClassName(const FileDescriptor* file); 67fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 68fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Returns the file's Java package name. 69fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FileJavaPackage(const FileDescriptor* file); 70fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 71fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Converts the given fully-qualified name in the proto namespace to its 72fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// fully-qualified name in the Java namespace, given that it is in the given 73fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// file. 74fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring ToJavaName(const string& full_name, const FileDescriptor* file); 75fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 76fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// These return the fully-qualified class name corresponding to the given 77fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// descriptor. 78fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string ClassName(const Descriptor* descriptor) { 79fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ToJavaName(descriptor->full_name(), descriptor->file()); 80fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 81fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string ClassName(const EnumDescriptor* descriptor) { 82fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ToJavaName(descriptor->full_name(), descriptor->file()); 83fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 84fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string ClassName(const ServiceDescriptor* descriptor) { 85fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ToJavaName(descriptor->full_name(), descriptor->file()); 86fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 87fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline string ExtensionIdentifierName(const FieldDescriptor* descriptor) { 88fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return ToJavaName(descriptor->full_name(), descriptor->file()); 89fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 90fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring ClassName(const FileDescriptor* descriptor); 91fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 92fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Get the unqualified name that should be used for a field's field 93fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// number constant. 94fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring FieldConstantName(const FieldDescriptor *field); 95fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 96d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Returns the type of the FieldDescriptor. 97d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// This does nothing interesting for the open source release, but is used for 98d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// hacks that improve compatability with version 1 protocol buffers at Google. 99d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleFieldDescriptor::Type GetType(const FieldDescriptor* field); 100d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 101fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleenum JavaType { 102fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_INT, 103fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_LONG, 104fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_FLOAT, 105fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_DOUBLE, 106fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_BOOLEAN, 107fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_STRING, 108fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_BYTES, 109fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_ENUM, 110fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville JAVATYPE_MESSAGE 111fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville}; 112fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 113d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink SavilleJavaType GetJavaType(const FieldDescriptor* field); 114fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 115fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Get the fully-qualified class name for a boxed primitive type, e.g. 116fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// "java.lang.Integer" for JAVATYPE_INT. Returns NULL for enum and message 117fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// types. 118fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleconst char* BoxedPrimitiveTypeName(JavaType type); 119fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 120fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savillestring DefaultValue(const FieldDescriptor* field); 121fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 122fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Does this message class keep track of unknown fields? 123fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool HasUnknownFields(const Descriptor* descriptor) { 124fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor->file()->options().optimize_for() != 125fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileOptions::LITE_RUNTIME; 126fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 127fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 128fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Does this message class have generated parsing, serialization, and other 129fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// standard methods for which reflection-based fallback implementations exist? 130fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool HasGeneratedMethods(const Descriptor* descriptor) { 131fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor->file()->options().optimize_for() != 132fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileOptions::CODE_SIZE; 133fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 134fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 135fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville// Does this message class have descriptor and reflection methods? 136fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool HasDescriptorMethods(const Descriptor* descriptor) { 137fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor->file()->options().optimize_for() != 138fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileOptions::LITE_RUNTIME; 139fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 140fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool HasDescriptorMethods(const EnumDescriptor* descriptor) { 141fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor->file()->options().optimize_for() != 142fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileOptions::LITE_RUNTIME; 143fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 144fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Savilleinline bool HasDescriptorMethods(const FileDescriptor* descriptor) { 145fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville return descriptor->options().optimize_for() != 146fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville FileOptions::LITE_RUNTIME; 147fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} 148fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 149d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville// Should we generate generic services for this file? 150d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Savilleinline bool HasGenericServices(const FileDescriptor *file) { 151d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville return file->service_count() > 0 && 152d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file->options().optimize_for() != FileOptions::LITE_RUNTIME && 153d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville file->options().java_generic_services(); 154d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville} 155d0332953cda33fb4f8e24ebff9c49159b69c43d6Wink Saville 156fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace java 157fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace compiler 158fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace protobuf 159fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville 160fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville} // namespace google 161fbaaef999ba563838ebd00874ed8a1c01fbf286dWink Saville#endif // GOOGLE_PROTOBUF_COMPILER_JAVA_HELPERS_H__ 162