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// Author: kenton@google.com (Kenton Varda) 32// Based on original Protocol Buffers design by 33// Sanjay Ghemawat, Jeff Dean, and others. 34 35#ifndef GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ 36#define GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ 37 38#include <string> 39#include <google/protobuf/stubs/port.h> 40#include <google/protobuf/descriptor.pb.h> 41#include <google/protobuf/descriptor.h> 42#include <google/protobuf/compiler/code_generator.h> 43#include <google/protobuf/io/printer.h> 44 45namespace google { 46namespace protobuf { 47namespace compiler { 48namespace csharp { 49 50struct Options; 51class FieldGeneratorBase; 52 53// TODO: start using this enum. 54enum CSharpType { 55 CSHARPTYPE_INT32 = 1, 56 CSHARPTYPE_INT64 = 2, 57 CSHARPTYPE_UINT32 = 3, 58 CSHARPTYPE_UINT64 = 4, 59 CSHARPTYPE_FLOAT = 5, 60 CSHARPTYPE_DOUBLE = 6, 61 CSHARPTYPE_BOOL = 7, 62 CSHARPTYPE_STRING = 8, 63 CSHARPTYPE_BYTESTRING = 9, 64 CSHARPTYPE_MESSAGE = 10, 65 CSHARPTYPE_ENUM = 11, 66 MAX_CSHARPTYPE = 11 67}; 68 69// Converts field type to corresponding C# type. 70CSharpType GetCSharpType(FieldDescriptor::Type type); 71 72std::string StripDotProto(const std::string& proto_file); 73 74// Gets unqualified name of the reflection class 75std::string GetReflectionClassUnqualifiedName(const FileDescriptor* descriptor); 76 77std::string GetClassName(const EnumDescriptor* descriptor); 78 79std::string GetFieldName(const FieldDescriptor* descriptor); 80 81std::string GetFieldConstantName(const FieldDescriptor* field); 82 83std::string GetPropertyName(const FieldDescriptor* descriptor); 84 85int GetFixedSize(FieldDescriptor::Type type); 86 87std::string UnderscoresToCamelCase(const std::string& input, 88 bool cap_next_letter, 89 bool preserve_period); 90 91inline std::string UnderscoresToCamelCase(const std::string& input, bool cap_next_letter) { 92 return UnderscoresToCamelCase(input, cap_next_letter, false); 93} 94 95std::string UnderscoresToPascalCase(const std::string& input); 96 97// Note that we wouldn't normally want to export this (we're not expecting 98// it to be used outside libprotoc itself) but this exposes it for testing. 99std::string LIBPROTOBUF_EXPORT GetEnumValueName(const std::string& enum_name, const std::string& enum_value_name); 100 101// TODO(jtattermusch): perhaps we could move this to strutil 102std::string StringToBase64(const std::string& input); 103 104std::string FileDescriptorToBase64(const FileDescriptor* descriptor); 105 106FieldGeneratorBase* CreateFieldGenerator(const FieldDescriptor* descriptor, 107 int fieldOrdinal, 108 const Options* options); 109 110// Determines whether the given message is a map entry message, 111// i.e. one implicitly created by protoc due to a map<key, value> field. 112inline bool IsMapEntryMessage(const Descriptor* descriptor) { 113 return descriptor->options().map_entry(); 114} 115 116// Determines whether we're generating code for the proto representation of 117// descriptors etc, for use in the runtime. This is the only type which is 118// allowed to use proto2 syntax, and it generates internal classes. 119inline bool IsDescriptorProto(const FileDescriptor* descriptor) { 120 return descriptor->name() == "google/protobuf/descriptor.proto"; 121} 122 123inline bool IsWrapperType(const FieldDescriptor* descriptor) { 124 return descriptor->type() == FieldDescriptor::TYPE_MESSAGE && 125 descriptor->message_type()->file()->name() == "google/protobuf/wrappers.proto"; 126} 127 128} // namespace csharp 129} // namespace compiler 130} // namespace protobuf 131} // namespace google 132#endif // GOOGLE_PROTOBUF_COMPILER_CSHARP_HELPERS_H__ 133