cpp_file.h revision fbaaef999ba563838ebd00874ed8a1c01fbf286d
14fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Protocol Buffers - Google's data interchange format
24fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Copyright 2008 Google Inc.  All rights reserved.
34fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// http://code.google.com/p/protobuf/
44fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//
54fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// Redistribution and use in source and binary forms, with or without
64fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// modification, are permitted provided that the following conditions are
74fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// met:
84fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//
94fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//     * Redistributions of source code must retain the above copyright
104fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// notice, this list of conditions and the following disclaimer.
114fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//     * Redistributions in binary form must reproduce the above
124fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// copyright notice, this list of conditions and the following disclaimer
134fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// in the documentation and/or other materials provided with the
144fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// distribution.
154fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//     * Neither the name of Google Inc. nor the names of its
164fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// contributors may be used to endorse or promote products derived from
174fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// this software without specific prior written permission.
184fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//
194fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
209db7dbb918ca49f4ee6c181e4917e7b6ec547353Douglas Gregor// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
214fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2215de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas Gregor// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
234fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
244fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
254fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
264fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27770b4a8834670e9427d3ce5a1a8472eb86f45fd2Benjamin Kramer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
294fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
304fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
315cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu// Author: kenton@google.com (Kenton Varda)
324fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor//  Based on original Protocol Buffers design by
335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner//  Sanjay Ghemawat, Jeff Dean, and others.
345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner
355f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner#ifndef GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
364fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#define GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
370d59292581dbaa4203451709077de40e0ad72c18Anders Carlsson
381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include <string>
394fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#include <vector>
40d1420c6fa788669e49f21e184927c7833881e399Richard Smith#include <google/protobuf/stubs/common.h>
41d1420c6fa788669e49f21e184927c7833881e399Richard Smith#include <google/protobuf/compiler/cpp/cpp_field.h>
42d1420c6fa788669e49f21e184927c7833881e399Richard Smith
435cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieunamespace google {
444fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace protobuf {
454fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  class FileDescriptor;        // descriptor.h
464fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  namespace io {
474fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor    class Printer;             // printer.h
484fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  }
49162e1c1b487352434552147967c3dd296ebee2f7Richard Smith}
504fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
514fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace protobuf {
524fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace compiler {
534fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregornamespace cpp {
544fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
554fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorclass EnumGenerator;           // enum.h
5657ad37823e198f977cac605dbfbaefb4daf325e9Chris Lattnerclass MessageGenerator;        // message.h
574fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorclass ServiceGenerator;        // service.h
584fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregorclass ExtensionGenerator;      // extension.h
5915de72cf580840c61e5704c2f8a2b56f9d0638e1Douglas Gregor
6028ac87e1a22ee15f284643d9007640d25b1aab5bPeter Collingbourneclass FileGenerator {
6159e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor public:
628419fa3af97208eb00f0cd6c62354ce4ff986677Douglas Gregor  // See generator.cc for the meaning of dllexport_decl.
636c9c94053132e5ca0655124b70f1c386a332e71dDouglas Gregor  explicit FileGenerator(const FileDescriptor* file,
6459e63570359b8adb9eb257759fe766d7aac1995aDouglas Gregor                         const string& dllexport_decl);
654fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  ~FileGenerator();
6698a57868d696cb5faf6195a609ad084a711c6bbeRichard Smith
675cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu  void GenerateHeader(io::Printer* printer);
685cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu  void GenerateSource(io::Printer* printer);
694fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
704fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor private:
714fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  // Generate the BuildDescriptors() procedure, which builds all descriptors
724fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  // for types defined in the file.
734fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  void GenerateBuildDescriptors(io::Printer* printer);
744fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
754fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  void GenerateNamespaceOpeners(io::Printer* printer);
764fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  void GenerateNamespaceClosers(io::Printer* printer);
774fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
787ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall  const FileDescriptor* file_;
797ba107a1863ddfa1664555854f0d7bdb3c491c92John McCall
80f53eaa59c4936f9b095e69557ce7366b26ca90cbAnders Carlsson  scoped_array<scoped_ptr<MessageGenerator> > message_generators_;
819488ea120e093068021f944176c3d610dd540914John McCall  scoped_array<scoped_ptr<EnumGenerator> > enum_generators_;
825cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu  scoped_array<scoped_ptr<ServiceGenerator> > service_generators_;
835cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu  scoped_array<scoped_ptr<ExtensionGenerator> > extension_generators_;
845cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu
851bea8807bcd2be10bf6309a3a848489434464cedDouglas Gregor  // E.g. if the package is foo.bar, package_parts_ is {"foo", "bar"}.
864fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  vector<string> package_parts_;
874fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
884fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor  string dllexport_decl_;
895cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu
905cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu  GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(FileGenerator);
9130c42404202d2e2512e51efc6066bd614cfdb5a4Douglas Gregor};
924fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor
934fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor}  // namespace cpp
945f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner}  // namespace compiler
955cb3d699f0e37de1767eb23d26d03953a46cf1ffRichard Trieu}  // namespace protobuf
96d1420c6fa788669e49f21e184927c7833881e399Richard Smith
97f88df8652e0726fe9eee5d78f92e3c5b34d0a537Anders Carlsson}  // namespace google
984fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor#endif  // GOOGLE_PROTOBUF_COMPILER_CPP_FILE_H__
994fe0c8e9c76b96e7aff21696a40dacc09d0237bcDouglas Gregor