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