1555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Protocol Buffers - Google's data interchange format 2555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Copyright 2008 Google Inc. All rights reserved. 3555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// http://code.google.com/p/protobuf/ 4555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 5555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Redistribution and use in source and binary forms, with or without 6555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// modification, are permitted provided that the following conditions are 7555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// met: 8555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 9555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions of source code must retain the above copyright 10555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// notice, this list of conditions and the following disclaimer. 11555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Redistributions in binary form must reproduce the above 12555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// copyright notice, this list of conditions and the following disclaimer 13555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// in the documentation and/or other materials provided with the 14555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// distribution. 15555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// * Neither the name of Google Inc. nor the names of its 16555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// contributors may be used to endorse or promote products derived from 17555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// this software without specific prior written permission. 18555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 19555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 31555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Author: robinson@google.com (Will Robinson) 32555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// 33555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Generates Python code for a given .proto file. 34555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 35555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#ifndef GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ 36555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#define GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ 37555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 38555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <string> 39555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 40555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/compiler/code_generator.h> 41555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#include <google/protobuf/stubs/common.h> 42555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 43555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace google { 44555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace protobuf { 45555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 46555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass Descriptor; 47555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass EnumDescriptor; 48555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass EnumValueDescriptor; 49555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass FieldDescriptor; 50555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass ServiceDescriptor; 51555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 52555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace io { class Printer; } 53555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 54555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace compiler { 55555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotnamespace python { 56555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 57555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodeGenerator implementation for generated Python protocol buffer classes. 58555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// If you create your own protocol compiler binary and you want it to support 59555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// Python output, you can do so by registering an instance of this 60555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot// CodeGenerator with the CommandLineInterface in your main() function. 61555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robotclass LIBPROTOC_EXPORT Generator : public CodeGenerator { 62555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot public: 63555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot Generator(); 64555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual ~Generator(); 65555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 66555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // CodeGenerator methods. 67555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot virtual bool Generate(const FileDescriptor* file, 68555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& parameter, 69555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GeneratorContext* generator_context, 70555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string* error) const; 71555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 72555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot private: 73555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintImports() const; 74555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintFileDescriptor() const; 75555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintTopLevelEnums() const; 76555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintAllNestedEnumsInFile() const; 77555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintNestedEnums(const Descriptor& descriptor) const; 78555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintEnum(const EnumDescriptor& enum_descriptor) const; 79555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 80555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintTopLevelExtensions() const; 81555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 82555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintFieldDescriptor( 83555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor& field, bool is_extension) const; 84555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintFieldDescriptorsInDescriptor( 85555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Descriptor& message_descriptor, 86555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool is_extension, 87555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& list_variable_name, 88555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot int (Descriptor::*CountFn)() const, 89555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor* (Descriptor::*GetterFn)(int) const) const; 90555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintFieldsInDescriptor(const Descriptor& message_descriptor) const; 91555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintExtensionsInDescriptor(const Descriptor& message_descriptor) const; 92555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintMessageDescriptors() const; 93555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintDescriptor(const Descriptor& message_descriptor) const; 94555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintNestedDescriptors(const Descriptor& containing_descriptor) const; 95555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 96555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintMessages() const; 97555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintMessage(const Descriptor& message_descriptor) const; 98555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintNestedMessages(const Descriptor& containing_descriptor) const; 99555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 100555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInDescriptors() const; 101555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInDescriptor( 102555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Descriptor& descriptor, 103555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Descriptor* containing_descriptor) const; 104555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInField(const Descriptor* containing_type, 105555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor& field, 106555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& python_dict_name) const; 107555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void AddMessageToFileDescriptor(const Descriptor& descriptor) const; 108555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string FieldReferencingExpression(const Descriptor* containing_type, 109555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor& field, 110555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& python_dict_name) const; 111555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename DescriptorT> 112555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixContainingTypeInDescriptor( 113555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const DescriptorT& descriptor, 114555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const Descriptor* containing_descriptor) const; 115555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 116555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInExtensions() const; 117555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInExtension( 118555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const FieldDescriptor& extension_field) const; 119555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixForeignFieldsInNestedExtensions(const Descriptor& descriptor) const; 120555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 121555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintServices() const; 122555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintServiceDescriptor(const ServiceDescriptor& descriptor) const; 123555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintServiceClass(const ServiceDescriptor& descriptor) const; 124555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintServiceStub(const ServiceDescriptor& descriptor) const; 125555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 126555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintEnumValueDescriptor(const EnumValueDescriptor& descriptor) const; 127555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string OptionsValue(const string& class_name, 128555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const string& serialized_options) const; 129555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot bool GeneratingDescriptorProto() const; 130555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 131555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename DescriptorT> 132555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string ModuleLevelDescriptorName(const DescriptorT& descriptor) const; 133555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string ModuleLevelMessageName(const Descriptor& descriptor) const; 134555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot string ModuleLevelServiceDescriptorName( 135555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const ServiceDescriptor& descriptor) const; 136555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 137555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot template <typename DescriptorT, typename DescriptorProtoT> 138555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void PrintSerializedPbInterval( 139555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot const DescriptorT& descriptor, DescriptorProtoT& proto) const; 140555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 141555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixAllDescriptorOptions() const; 142555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixOptionsForField(const FieldDescriptor& field) const; 143555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixOptionsForEnum(const EnumDescriptor& descriptor) const; 144555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot void FixOptionsForMessage(const Descriptor& descriptor) const; 145555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 146555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Very coarse-grained lock to ensure that Generate() is reentrant. 147555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot // Guards file_, printer_ and file_descriptor_serialized_. 148555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot mutable Mutex mutex_; 149555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot mutable const FileDescriptor* file_; // Set in Generate(). Under mutex_. 150555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot mutable string file_descriptor_serialized_; 151555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot mutable io::Printer* printer_; // Set in Generate(). Under mutex_. 152555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 153555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(Generator); 154555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot}; 155555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 156555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace python 157555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace compiler 158555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace protobuf 159555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot 160555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot} // namespace google 161555d6a58708babe6bb79b5824ef24eb1f37f708android-build-team Robot#endif // GOOGLE_PROTOBUF_COMPILER_PYTHON_GENERATOR_H__ 162