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