blob: cee5410a8b61cb6b496d9603ada2395c9ab9f0d5 [file] [log] [blame]
Mark Sleee9ce01c2007-05-16 02:29:53 +00001// Copyright (c) 2006- Facebook
2// Distributed under the Thrift Software License
3//
4// See accompanying file LICENSE or visit the Thrift site at:
5// http://developers.facebook.com/thrift/
6
Mark Slee31985722006-05-24 21:45:31 +00007#ifndef T_PROGRAM_H
8#define T_PROGRAM_H
9
Mark Sleee8540632006-05-30 09:24:40 +000010#include <map>
Mark Slee31985722006-05-24 21:45:31 +000011#include <string>
12#include <vector>
13
Mark Sleef0712dc2006-10-25 19:03:57 +000014// For program_name()
15#include "main.h"
16
David Reissc2532a92007-07-30 23:46:11 +000017#include "t_doc.h"
Mark Sleef0712dc2006-10-25 19:03:57 +000018#include "t_scope.h"
Mark Slee31985722006-05-24 21:45:31 +000019#include "t_base_type.h"
20#include "t_typedef.h"
21#include "t_enum.h"
Mark Slee30152872006-11-28 01:24:07 +000022#include "t_const.h"
Mark Slee31985722006-05-24 21:45:31 +000023#include "t_struct.h"
24#include "t_service.h"
Mark Sleee8540632006-05-30 09:24:40 +000025#include "t_list.h"
26#include "t_map.h"
27#include "t_set.h"
ccheeverf53b5cf2007-02-05 20:33:11 +000028//#include "t_doc.h"
Mark Slee31985722006-05-24 21:45:31 +000029
30/**
31 * Top level class representing an entire thrift program. A program consists
32 * fundamentally of the following:
33 *
34 * Typedefs
35 * Enumerations
Mark Slee30152872006-11-28 01:24:07 +000036 * Constants
Mark Slee31985722006-05-24 21:45:31 +000037 * Structs
Mark Slee9cb7c612006-09-01 22:17:45 +000038 * Exceptions
Mark Slee31985722006-05-24 21:45:31 +000039 * Services
40 *
Mark Sleef5377b32006-10-10 01:42:59 +000041 * The program module also contains the definitions of the base types.
42 *
Mark Slee31985722006-05-24 21:45:31 +000043 */
David Reissc2532a92007-07-30 23:46:11 +000044class t_program : public t_doc {
Mark Slee31985722006-05-24 21:45:31 +000045 public:
Mark Sleef0712dc2006-10-25 19:03:57 +000046 t_program(std::string path, std::string name) :
Mark Slee2c44d202007-05-16 02:18:07 +000047 path_(path),
dweatherford65b70752007-10-31 02:18:14 +000048 name_(name),
49 out_path_("./") {
Mark Sleef0712dc2006-10-25 19:03:57 +000050 scope_ = new t_scope();
Mark Slee31985722006-05-24 21:45:31 +000051 }
52
Mark Sleef0712dc2006-10-25 19:03:57 +000053 t_program(std::string path) :
dweatherford65b70752007-10-31 02:18:14 +000054 path_(path),
55 out_path_("./") {
Mark Sleef0712dc2006-10-25 19:03:57 +000056 name_ = program_name(path);
57 scope_ = new t_scope();
Mark Slee31985722006-05-24 21:45:31 +000058 }
59
Mark Slee2c44d202007-05-16 02:18:07 +000060 // Path accessor
Mark Sleef0712dc2006-10-25 19:03:57 +000061 const std::string& get_path() const { return path_; }
62
dweatherford65b70752007-10-31 02:18:14 +000063 // Output path accessor
64 const std::string& get_out_path() const { return out_path_; }
65
Mark Slee31985722006-05-24 21:45:31 +000066 // Name accessor
Mark Sleef0712dc2006-10-25 19:03:57 +000067 const std::string& get_name() const { return name_; }
Mark Slee31985722006-05-24 21:45:31 +000068
Mark Slee9cb7c612006-09-01 22:17:45 +000069 // Namespace
Mark Sleef0712dc2006-10-25 19:03:57 +000070 const std::string& get_namespace() const { return namespace_; }
Mark Slee9cb7c612006-09-01 22:17:45 +000071
kholst76f2c882008-01-16 02:47:41 +000072 // Include prefix accessor
73 const std::string& get_include_prefix() const { return include_prefix_; }
74
Mark Slee31985722006-05-24 21:45:31 +000075 // Accessors for program elements
Mark Slee9cb7c612006-09-01 22:17:45 +000076 const std::vector<t_typedef*>& get_typedefs() const { return typedefs_; }
77 const std::vector<t_enum*>& get_enums() const { return enums_; }
Mark Slee30152872006-11-28 01:24:07 +000078 const std::vector<t_const*>& get_consts() const { return consts_; }
Mark Slee9cb7c612006-09-01 22:17:45 +000079 const std::vector<t_struct*>& get_structs() const { return structs_; }
80 const std::vector<t_struct*>& get_xceptions() const { return xceptions_; }
Mark Slee1c4ced72008-01-14 23:04:43 +000081 const std::vector<t_struct*>& get_objects() const { return objects_; }
Mark Slee9cb7c612006-09-01 22:17:45 +000082 const std::vector<t_service*>& get_services() const { return services_; }
Mark Slee31985722006-05-24 21:45:31 +000083
Mark Sleef0712dc2006-10-25 19:03:57 +000084 // Program elements
85 void add_typedef (t_typedef* td) { typedefs_.push_back(td); }
86 void add_enum (t_enum* te) { enums_.push_back(te); }
Mark Slee30152872006-11-28 01:24:07 +000087 void add_const (t_const* tc) { consts_.push_back(tc); }
Mark Slee1c4ced72008-01-14 23:04:43 +000088 void add_struct (t_struct* ts) { objects_.push_back(ts);
89 structs_.push_back(ts); }
90 void add_xception (t_struct* tx) { objects_.push_back(tx);
91 xceptions_.push_back(tx); }
Mark Sleef0712dc2006-10-25 19:03:57 +000092 void add_service (t_service* ts) { services_.push_back(ts); }
Mark Slee31985722006-05-24 21:45:31 +000093
Mark Sleef0712dc2006-10-25 19:03:57 +000094 // Programs to include
95 const std::vector<t_program*>& get_includes() const { return includes_; }
Mark Sleee8540632006-05-30 09:24:40 +000096
dweatherford65b70752007-10-31 02:18:14 +000097 void set_out_path(std::string out_path) {
98 out_path_ = out_path;
99 // Ensure that it ends with a trailing '/' (or '\' for windows machines)
100 char c = out_path_.at(out_path_.size() - 1);
101 if (!(c == '/' || c == '\\')) {
102 out_path_.push_back('/');
103 }
104 }
105
Mark Sleef0712dc2006-10-25 19:03:57 +0000106 // Scoping and namespacing
Mark Slee9cb7c612006-09-01 22:17:45 +0000107 void set_namespace(std::string name) {
108 namespace_ = name;
109 }
110
Mark Sleef0712dc2006-10-25 19:03:57 +0000111 // Scope accessor
112 t_scope* scope() {
113 return scope_;
Mark Sleee8540632006-05-30 09:24:40 +0000114 }
Mark Sleef5377b32006-10-10 01:42:59 +0000115
Mark Sleef0712dc2006-10-25 19:03:57 +0000116 // Includes
117
kholst76f2c882008-01-16 02:47:41 +0000118 void add_include(std::string path, std::string include_site) {
119 t_program* program = new t_program(path);
120
121 // include prefix for this program is the site at which it was included
122 // (minus the filename)
123 std::string include_prefix;
124 std::string::size_type last_slash = std::string::npos;
125 if ((last_slash = include_site.rfind("/")) != std::string::npos) {
126 include_prefix = include_site.substr(0, last_slash);
127 }
128
129 program->set_include_prefix(include_prefix);
130 includes_.push_back(program);
Mark Sleee8540632006-05-30 09:24:40 +0000131 }
Mark Sleef5377b32006-10-10 01:42:59 +0000132
Mark Sleef0712dc2006-10-25 19:03:57 +0000133 std::vector<t_program*>& get_includes() {
134 return includes_;
Mark Sleee8540632006-05-30 09:24:40 +0000135 }
Mark Sleef5377b32006-10-10 01:42:59 +0000136
kholst76f2c882008-01-16 02:47:41 +0000137 void set_include_prefix(std::string include_prefix) {
138 include_prefix_ = include_prefix;
139
140 // this is intended to be a directory; add a trailing slash if necessary
141 int len = include_prefix_.size();
142 if (len > 0 && include_prefix_[len - 1] != '/') {
143 include_prefix_ += '/';
144 }
145 }
146
David Reiss79eca142008-02-27 01:55:13 +0000147 // Language neutral namespace / packaging
148 void set_namespace(std::string language, std::string name_space) {
149 namespaces_[language] = name_space;
150 }
151
152 std::string get_namespace(std::string language) const {
153 std::map<std::string, std::string>::const_iterator iter = namespaces_.find(language);
154 if (iter == namespaces_.end()) {
155 return std::string();
156 }
157 return iter->second;
158 }
159
Mark Sleef0712dc2006-10-25 19:03:57 +0000160 // Language specific namespace / packaging
161
Mark Sleef0712dc2006-10-25 19:03:57 +0000162 void add_cpp_include(std::string path) {
163 cpp_includes_.push_back(path);
164 }
165
166 const std::vector<std::string>& get_cpp_includes() {
167 return cpp_includes_;
168 }
169
Mark Slee31985722006-05-24 21:45:31 +0000170 private:
Mark Sleef5377b32006-10-10 01:42:59 +0000171
Mark Sleef0712dc2006-10-25 19:03:57 +0000172 // File path
173 std::string path_;
Mark Slee9cb7c612006-09-01 22:17:45 +0000174
Mark Slee31985722006-05-24 21:45:31 +0000175 // Name
176 std::string name_;
177
dweatherford65b70752007-10-31 02:18:14 +0000178 // Output directory
179 std::string out_path_;
180
Mark Slee9cb7c612006-09-01 22:17:45 +0000181 // Namespace
182 std::string namespace_;
183
Mark Sleef0712dc2006-10-25 19:03:57 +0000184 // Included programs
185 std::vector<t_program*> includes_;
Mark Sleee8540632006-05-30 09:24:40 +0000186
kholst76f2c882008-01-16 02:47:41 +0000187 // Include prefix for this program, if any
188 std::string include_prefix_;
189
Mark Sleef0712dc2006-10-25 19:03:57 +0000190 // Identifier lookup scope
191 t_scope* scope_;
Mark Sleee8540632006-05-30 09:24:40 +0000192
Mark Sleef0712dc2006-10-25 19:03:57 +0000193 // Components to generate code for
194 std::vector<t_typedef*> typedefs_;
195 std::vector<t_enum*> enums_;
Mark Slee30152872006-11-28 01:24:07 +0000196 std::vector<t_const*> consts_;
Mark Slee1c4ced72008-01-14 23:04:43 +0000197 std::vector<t_struct*> objects_;
Mark Sleef0712dc2006-10-25 19:03:57 +0000198 std::vector<t_struct*> structs_;
199 std::vector<t_struct*> xceptions_;
200 std::vector<t_service*> services_;
201
David Reiss79eca142008-02-27 01:55:13 +0000202 // Dynamic namespaces
203 std::map<std::string, std::string> namespaces_;
204
Mark Sleef0712dc2006-10-25 19:03:57 +0000205 // C++ extra includes
206 std::vector<std::string> cpp_includes_;
207
Mark Slee31985722006-05-24 21:45:31 +0000208};
209
210#endif