Mark Slee | e9ce01c | 2007-05-16 02:29:53 +0000 | [diff] [blame] | 1 | // 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 Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 7 | #ifndef T_PROGRAM_H |
8 | #define T_PROGRAM_H | ||||
9 | |||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 10 | #include <map> |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 11 | #include <string> |
12 | #include <vector> | ||||
13 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 14 | // For program_name() |
15 | #include "main.h" | ||||
16 | |||||
David Reiss | c2532a9 | 2007-07-30 23:46:11 +0000 | [diff] [blame] | 17 | #include "t_doc.h" |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 18 | #include "t_scope.h" |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 19 | #include "t_base_type.h" |
20 | #include "t_typedef.h" | ||||
21 | #include "t_enum.h" | ||||
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 22 | #include "t_const.h" |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 23 | #include "t_struct.h" |
24 | #include "t_service.h" | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 25 | #include "t_list.h" |
26 | #include "t_map.h" | ||||
27 | #include "t_set.h" | ||||
ccheever | f53b5cf | 2007-02-05 20:33:11 +0000 | [diff] [blame] | 28 | //#include "t_doc.h" |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 29 | |
30 | /** | ||||
31 | * Top level class representing an entire thrift program. A program consists | ||||
32 | * fundamentally of the following: | ||||
33 | * | ||||
34 | * Typedefs | ||||
35 | * Enumerations | ||||
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 36 | * Constants |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 37 | * Structs |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 38 | * Exceptions |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 39 | * Services |
40 | * | ||||
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 41 | * The program module also contains the definitions of the base types. |
42 | * | ||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 43 | * @author Mark Slee <mcslee@facebook.com> |
44 | */ | ||||
David Reiss | c2532a9 | 2007-07-30 23:46:11 +0000 | [diff] [blame] | 45 | class t_program : public t_doc { |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 46 | public: |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 47 | t_program(std::string path, std::string name) : |
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 48 | path_(path), |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 49 | name_(name) { |
50 | scope_ = new t_scope(); | ||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 51 | } |
52 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 53 | t_program(std::string path) : |
54 | path_(path) { | ||||
55 | name_ = program_name(path); | ||||
56 | scope_ = new t_scope(); | ||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 57 | } |
58 | |||||
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 59 | // Path accessor |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 60 | const std::string& get_path() const { return path_; } |
61 | |||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 62 | // Name accessor |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 63 | const std::string& get_name() const { return name_; } |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 64 | |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 65 | // Namespace |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 66 | const std::string& get_namespace() const { return namespace_; } |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 67 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 68 | // Accessors for program elements |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 69 | const std::vector<t_typedef*>& get_typedefs() const { return typedefs_; } |
70 | const std::vector<t_enum*>& get_enums() const { return enums_; } | ||||
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 71 | const std::vector<t_const*>& get_consts() const { return consts_; } |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 72 | const std::vector<t_struct*>& get_structs() const { return structs_; } |
73 | const std::vector<t_struct*>& get_xceptions() const { return xceptions_; } | ||||
74 | const std::vector<t_service*>& get_services() const { return services_; } | ||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 75 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 76 | // Program elements |
77 | void add_typedef (t_typedef* td) { typedefs_.push_back(td); } | ||||
78 | void add_enum (t_enum* te) { enums_.push_back(te); } | ||||
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 79 | void add_const (t_const* tc) { consts_.push_back(tc); } |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 80 | void add_struct (t_struct* ts) { structs_.push_back(ts); } |
81 | void add_xception (t_struct* tx) { xceptions_.push_back(tx); } | ||||
82 | void add_service (t_service* ts) { services_.push_back(ts); } | ||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 83 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 84 | // Programs to include |
85 | const std::vector<t_program*>& get_includes() const { return includes_; } | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 86 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 87 | // Scoping and namespacing |
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 88 | void set_namespace(std::string name) { |
89 | namespace_ = name; | ||||
90 | } | ||||
91 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 92 | // Scope accessor |
93 | t_scope* scope() { | ||||
94 | return scope_; | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 95 | } |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 96 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 97 | // Includes |
98 | |||||
99 | void add_include(std::string path) { | ||||
100 | includes_.push_back(new t_program(path)); | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 101 | } |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 102 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 103 | std::vector<t_program*>& get_includes() { |
104 | return includes_; | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 105 | } |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 106 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 107 | // Language specific namespace / packaging |
108 | |||||
109 | void set_cpp_namespace(std::string cpp_namespace) { | ||||
110 | cpp_namespace_ = cpp_namespace; | ||||
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 111 | } |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 112 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 113 | const std::string& get_cpp_namespace() const { |
114 | return cpp_namespace_; | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 115 | } |
116 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 117 | void add_cpp_include(std::string path) { |
118 | cpp_includes_.push_back(path); | ||||
119 | } | ||||
120 | |||||
121 | const std::vector<std::string>& get_cpp_includes() { | ||||
122 | return cpp_includes_; | ||||
123 | } | ||||
124 | |||||
Mark Slee | e888b37 | 2007-01-12 01:06:24 +0000 | [diff] [blame] | 125 | void set_php_namespace(std::string php_namespace) { |
126 | php_namespace_ = php_namespace; | ||||
127 | } | ||||
128 | |||||
129 | const std::string& get_php_namespace() const { | ||||
130 | return php_namespace_; | ||||
131 | } | ||||
132 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 133 | void set_java_package(std::string java_package) { |
134 | java_package_ = java_package; | ||||
135 | } | ||||
136 | |||||
137 | const std::string& get_java_package() const { | ||||
138 | return java_package_; | ||||
139 | } | ||||
140 | |||||
Mark Slee | 0d9199e | 2007-01-31 02:08:30 +0000 | [diff] [blame] | 141 | void set_xsd_namespace(std::string xsd_namespace) { |
142 | xsd_namespace_ = xsd_namespace; | ||||
143 | } | ||||
144 | |||||
145 | const std::string& get_xsd_namespace() const { | ||||
146 | return xsd_namespace_; | ||||
147 | } | ||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 148 | |
Mark Slee | 58dfb4f | 2007-07-06 02:45:25 +0000 | [diff] [blame] | 149 | void set_ruby_namespace(std::string ruby_namespace) { |
150 | ruby_namespace_ = ruby_namespace; | ||||
151 | } | ||||
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 152 | |
Mark Slee | 58dfb4f | 2007-07-06 02:45:25 +0000 | [diff] [blame] | 153 | const std::string& get_ruby_namespace() const { |
154 | return ruby_namespace_; | ||||
155 | } | ||||
156 | |||||
David Reiss | c6fc329 | 2007-08-30 00:58:43 +0000 | [diff] [blame] | 157 | void set_py_module(std::string py_module) { |
158 | py_module_ = py_module; | ||||
159 | } | ||||
160 | |||||
161 | const std::string& get_py_module() const { | ||||
162 | return py_module_; | ||||
163 | } | ||||
164 | |||||
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 165 | void set_perl_package(std::string perl_package) { |
166 | perl_package_ = perl_package; | ||||
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 167 | } |
168 | |||||
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 169 | const std::string& get_perl_package() const { |
170 | return perl_package_; | ||||
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 171 | } |
172 | |||||
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 173 | private: |
Mark Slee | f5377b3 | 2006-10-10 01:42:59 +0000 | [diff] [blame] | 174 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 175 | // File path |
176 | std::string path_; | ||||
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 177 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 178 | // Name |
179 | std::string name_; | ||||
180 | |||||
Mark Slee | 9cb7c61 | 2006-09-01 22:17:45 +0000 | [diff] [blame] | 181 | // Namespace |
182 | std::string namespace_; | ||||
183 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 184 | // Included programs |
185 | std::vector<t_program*> includes_; | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 186 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 187 | // Identifier lookup scope |
188 | t_scope* scope_; | ||||
Mark Slee | e854063 | 2006-05-30 09:24:40 +0000 | [diff] [blame] | 189 | |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 190 | // Components to generate code for |
191 | std::vector<t_typedef*> typedefs_; | ||||
192 | std::vector<t_enum*> enums_; | ||||
Mark Slee | 3015287 | 2006-11-28 01:24:07 +0000 | [diff] [blame] | 193 | std::vector<t_const*> consts_; |
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 194 | std::vector<t_struct*> structs_; |
195 | std::vector<t_struct*> xceptions_; | ||||
196 | std::vector<t_service*> services_; | ||||
197 | |||||
198 | // C++ namespace | ||||
199 | std::string cpp_namespace_; | ||||
200 | |||||
201 | // C++ extra includes | ||||
202 | std::vector<std::string> cpp_includes_; | ||||
203 | |||||
Mark Slee | e888b37 | 2007-01-12 01:06:24 +0000 | [diff] [blame] | 204 | // PHP namespace |
205 | std::string php_namespace_; | ||||
206 | |||||
Mark Slee | f0712dc | 2006-10-25 19:03:57 +0000 | [diff] [blame] | 207 | // Java package |
208 | std::string java_package_; | ||||
209 | |||||
Mark Slee | 0d9199e | 2007-01-31 02:08:30 +0000 | [diff] [blame] | 210 | // XSD namespace |
211 | std::string xsd_namespace_; | ||||
212 | |||||
Mark Slee | 58dfb4f | 2007-07-06 02:45:25 +0000 | [diff] [blame] | 213 | // Ruby namespace |
214 | std::string ruby_namespace_; | ||||
215 | |||||
David Reiss | c6fc329 | 2007-08-30 00:58:43 +0000 | [diff] [blame] | 216 | // Python namespace |
217 | std::string py_module_; | ||||
218 | |||||
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 219 | // Perl namespace |
Mark Slee | 27ed6ec | 2007-08-16 01:26:31 +0000 | [diff] [blame] | 220 | std::string perl_package_; |
Mark Slee | 2c44d20 | 2007-05-16 02:18:07 +0000 | [diff] [blame] | 221 | |
Mark Slee | 3198572 | 2006-05-24 21:45:31 +0000 | [diff] [blame] | 222 | }; |
223 | |||||
224 | #endif |