1// Protocol Buffers - Google's data interchange format 2// Copyright 2008 Google Inc. All rights reserved. 3// https://developers.google.com/protocol-buffers/ 4// 5// Redistribution and use in source and binary forms, with or without 6// modification, are permitted provided that the following conditions are 7// met: 8// 9// * Redistributions of source code must retain the above copyright 10// notice, this list of conditions and the following disclaimer. 11// * Redistributions in binary form must reproduce the above 12// copyright notice, this list of conditions and the following disclaimer 13// in the documentation and/or other materials provided with the 14// distribution. 15// * Neither the name of Google Inc. nor the names of its 16// contributors may be used to endorse or promote products derived from 17// this software without specific prior written permission. 18// 19// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 31#ifndef GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__ 32#define GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__ 33 34#include <string> 35#include <vector> 36 37#include <google/protobuf/descriptor.h> 38#include <google/protobuf/descriptor.pb.h> 39 40namespace google { 41namespace protobuf { 42namespace compiler { 43namespace objectivec { 44 45// Generator options (see objectivec_generator.cc for a description of each): 46struct Options { 47 Options(); 48 string expected_prefixes_path; 49}; 50 51// Escape C++ trigraphs by escaping question marks to "\?". 52string EscapeTrigraphs(const string& to_escape); 53 54// Strips ".proto" or ".protodevel" from the end of a filename. 55string StripProto(const string& filename); 56 57// Returns true if the name requires a ns_returns_not_retained attribute applied 58// to it. 59bool IsRetainedName(const string& name); 60 61// Returns true if the name starts with "init" and will need to have special 62// handling under ARC. 63bool IsInitName(const string& name); 64 65// Gets the name of the file we're going to generate (sans the .pb.h 66// extension). This does not include the path to that file. 67string FileName(const FileDescriptor* file); 68 69// Gets the path of the file we're going to generate (sans the .pb.h 70// extension). The path will be dependent on the objectivec package 71// declared in the proto package. 72string FilePath(const FileDescriptor* file); 73 74// Gets the name of the root class we'll generate in the file. This class 75// is not meant for external consumption, but instead contains helpers that 76// the rest of the classes need 77string FileClassName(const FileDescriptor* file); 78 79// These return the fully-qualified class name corresponding to the given 80// descriptor. 81string ClassName(const Descriptor* descriptor); 82string EnumName(const EnumDescriptor* descriptor); 83 84// Returns the fully-qualified name of the enum value corresponding to the 85// the descriptor. 86string EnumValueName(const EnumValueDescriptor* descriptor); 87 88// Returns the name of the enum value corresponding to the descriptor. 89string EnumValueShortName(const EnumValueDescriptor* descriptor); 90 91// Reverse what an enum does. 92string UnCamelCaseEnumShortName(const string& name); 93 94// Returns the name to use for the extension (used as the method off the file's 95// Root class). 96string ExtensionMethodName(const FieldDescriptor* descriptor); 97 98// Returns the transformed field name. 99string FieldName(const FieldDescriptor* field); 100string FieldNameCapitalized(const FieldDescriptor* field); 101 102// Returns the transformed oneof name. 103string OneofEnumName(const OneofDescriptor* descriptor); 104string OneofName(const OneofDescriptor* descriptor); 105string OneofNameCapitalized(const OneofDescriptor* descriptor); 106 107inline bool HasFieldPresence(const FileDescriptor* file) { 108 return file->syntax() != FileDescriptor::SYNTAX_PROTO3; 109} 110 111inline bool HasPreservingUnknownEnumSemantics(const FileDescriptor* file) { 112 return file->syntax() == FileDescriptor::SYNTAX_PROTO3; 113} 114 115inline bool IsMapEntryMessage(const Descriptor* descriptor) { 116 return descriptor->options().map_entry(); 117} 118 119// Reverse of the above. 120string UnCamelCaseFieldName(const string& name, const FieldDescriptor* field); 121 122enum ObjectiveCType { 123 OBJECTIVECTYPE_INT32, 124 OBJECTIVECTYPE_UINT32, 125 OBJECTIVECTYPE_INT64, 126 OBJECTIVECTYPE_UINT64, 127 OBJECTIVECTYPE_FLOAT, 128 OBJECTIVECTYPE_DOUBLE, 129 OBJECTIVECTYPE_BOOLEAN, 130 OBJECTIVECTYPE_STRING, 131 OBJECTIVECTYPE_DATA, 132 OBJECTIVECTYPE_ENUM, 133 OBJECTIVECTYPE_MESSAGE 134}; 135 136template<class TDescriptor> 137string GetOptionalDeprecatedAttribute(const TDescriptor* descriptor, bool preSpace = true, bool postNewline = false) { 138 if (descriptor->options().deprecated()) { 139 string result = "DEPRECATED_ATTRIBUTE"; 140 if (preSpace) { 141 result.insert(0, " "); 142 } 143 if (postNewline) { 144 result.append("\n"); 145 } 146 return result; 147 } else { 148 return ""; 149 } 150} 151 152string GetCapitalizedType(const FieldDescriptor* field); 153 154ObjectiveCType GetObjectiveCType(FieldDescriptor::Type field_type); 155 156inline ObjectiveCType GetObjectiveCType(const FieldDescriptor* field) { 157 return GetObjectiveCType(field->type()); 158} 159 160bool IsPrimitiveType(const FieldDescriptor* field); 161bool IsReferenceType(const FieldDescriptor* field); 162 163string GPBGenericValueFieldName(const FieldDescriptor* field); 164string DefaultValue(const FieldDescriptor* field); 165bool HasNonZeroDefaultValue(const FieldDescriptor* field); 166 167string BuildFlagsString(const vector<string>& strings); 168 169// Builds a HeaderDoc style comment out of the comments in the .proto file. 170string BuildCommentsString(const SourceLocation& location); 171 172// Checks the prefix for a given file and outputs any warnings needed, if 173// there are flat out errors, then out_error is filled in and the result is 174// false. 175bool ValidateObjCClassPrefix(const FileDescriptor* file, 176 const Options& generation_options, 177 string* out_error); 178 179// Generate decode data needed for ObjC's GPBDecodeTextFormatName() to transform 180// the input into the expected output. 181class LIBPROTOC_EXPORT TextFormatDecodeData { 182 public: 183 TextFormatDecodeData() {} 184 185 void AddString(int32 key, const string& input_for_decode, 186 const string& desired_output); 187 size_t num_entries() const { return entries_.size(); } 188 string Data() const; 189 190 static string DecodeDataForString(const string& input_for_decode, 191 const string& desired_output); 192 193 private: 194 GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TextFormatDecodeData); 195 196 typedef std::pair<int32, string> DataEntry; 197 vector<DataEntry> entries_; 198}; 199 200} // namespace objectivec 201} // namespace compiler 202} // namespace protobuf 203} // namespace google 204#endif // GOOGLE_PROTOBUF_COMPILER_OBJECTIVEC_HELPERS_H__ 205