| 30 |
ashish |
1 |
/*
|
|
|
2 |
* Licensed to the Apache Software Foundation (ASF) under one
|
|
|
3 |
* or more contributor license agreements. See the NOTICE file
|
|
|
4 |
* distributed with this work for additional information
|
|
|
5 |
* regarding copyright ownership. The ASF licenses this file
|
|
|
6 |
* to you under the Apache License, Version 2.0 (the
|
|
|
7 |
* "License"); you may not use this file except in compliance
|
|
|
8 |
* with the License. You may obtain a copy of the License at
|
|
|
9 |
*
|
|
|
10 |
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
11 |
*
|
|
|
12 |
* Unless required by applicable law or agreed to in writing,
|
|
|
13 |
* software distributed under the License is distributed on an
|
|
|
14 |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
|
15 |
* KIND, either express or implied. See the License for the
|
|
|
16 |
* specific language governing permissions and limitations
|
|
|
17 |
* under the License.
|
|
|
18 |
*/
|
|
|
19 |
|
|
|
20 |
#ifndef T_PROGRAM_H
|
|
|
21 |
#define T_PROGRAM_H
|
|
|
22 |
|
|
|
23 |
#include <map>
|
|
|
24 |
#include <string>
|
|
|
25 |
#include <vector>
|
|
|
26 |
|
|
|
27 |
// For program_name()
|
|
|
28 |
#include "main.h"
|
|
|
29 |
|
|
|
30 |
#include "t_doc.h"
|
|
|
31 |
#include "t_scope.h"
|
|
|
32 |
#include "t_base_type.h"
|
|
|
33 |
#include "t_typedef.h"
|
|
|
34 |
#include "t_enum.h"
|
|
|
35 |
#include "t_const.h"
|
|
|
36 |
#include "t_struct.h"
|
|
|
37 |
#include "t_service.h"
|
|
|
38 |
#include "t_list.h"
|
|
|
39 |
#include "t_map.h"
|
|
|
40 |
#include "t_set.h"
|
|
|
41 |
//#include "t_doc.h"
|
|
|
42 |
|
|
|
43 |
/**
|
|
|
44 |
* Top level class representing an entire thrift program. A program consists
|
|
|
45 |
* fundamentally of the following:
|
|
|
46 |
*
|
|
|
47 |
* Typedefs
|
|
|
48 |
* Enumerations
|
|
|
49 |
* Constants
|
|
|
50 |
* Structs
|
|
|
51 |
* Exceptions
|
|
|
52 |
* Services
|
|
|
53 |
*
|
|
|
54 |
* The program module also contains the definitions of the base types.
|
|
|
55 |
*
|
|
|
56 |
*/
|
|
|
57 |
class t_program : public t_doc {
|
|
|
58 |
public:
|
|
|
59 |
t_program(std::string path, std::string name) :
|
|
|
60 |
path_(path),
|
|
|
61 |
name_(name),
|
|
|
62 |
out_path_("./") {
|
|
|
63 |
scope_ = new t_scope();
|
|
|
64 |
}
|
|
|
65 |
|
|
|
66 |
t_program(std::string path) :
|
|
|
67 |
path_(path),
|
|
|
68 |
out_path_("./") {
|
|
|
69 |
name_ = program_name(path);
|
|
|
70 |
scope_ = new t_scope();
|
|
|
71 |
}
|
|
|
72 |
|
|
|
73 |
// Path accessor
|
|
|
74 |
const std::string& get_path() const { return path_; }
|
|
|
75 |
|
|
|
76 |
// Output path accessor
|
|
|
77 |
const std::string& get_out_path() const { return out_path_; }
|
|
|
78 |
|
|
|
79 |
// Name accessor
|
|
|
80 |
const std::string& get_name() const { return name_; }
|
|
|
81 |
|
|
|
82 |
// Namespace
|
|
|
83 |
const std::string& get_namespace() const { return namespace_; }
|
|
|
84 |
|
|
|
85 |
// Include prefix accessor
|
|
|
86 |
const std::string& get_include_prefix() const { return include_prefix_; }
|
|
|
87 |
|
|
|
88 |
// Accessors for program elements
|
|
|
89 |
const std::vector<t_typedef*>& get_typedefs() const { return typedefs_; }
|
|
|
90 |
const std::vector<t_enum*>& get_enums() const { return enums_; }
|
|
|
91 |
const std::vector<t_const*>& get_consts() const { return consts_; }
|
|
|
92 |
const std::vector<t_struct*>& get_structs() const { return structs_; }
|
|
|
93 |
const std::vector<t_struct*>& get_xceptions() const { return xceptions_; }
|
|
|
94 |
const std::vector<t_struct*>& get_objects() const { return objects_; }
|
|
|
95 |
const std::vector<t_service*>& get_services() const { return services_; }
|
|
|
96 |
|
|
|
97 |
// Program elements
|
|
|
98 |
void add_typedef (t_typedef* td) { typedefs_.push_back(td); }
|
|
|
99 |
void add_enum (t_enum* te) { enums_.push_back(te); }
|
|
|
100 |
void add_const (t_const* tc) { consts_.push_back(tc); }
|
|
|
101 |
void add_struct (t_struct* ts) { objects_.push_back(ts);
|
|
|
102 |
structs_.push_back(ts); }
|
|
|
103 |
void add_xception (t_struct* tx) { objects_.push_back(tx);
|
|
|
104 |
xceptions_.push_back(tx); }
|
|
|
105 |
void add_service (t_service* ts) { services_.push_back(ts); }
|
|
|
106 |
|
|
|
107 |
// Programs to include
|
|
|
108 |
const std::vector<t_program*>& get_includes() const { return includes_; }
|
|
|
109 |
|
|
|
110 |
void set_out_path(std::string out_path) {
|
|
|
111 |
out_path_ = out_path;
|
|
|
112 |
// Ensure that it ends with a trailing '/' (or '\' for windows machines)
|
|
|
113 |
char c = out_path_.at(out_path_.size() - 1);
|
|
|
114 |
if (!(c == '/' || c == '\\')) {
|
|
|
115 |
out_path_.push_back('/');
|
|
|
116 |
}
|
|
|
117 |
}
|
|
|
118 |
|
|
|
119 |
// Scoping and namespacing
|
|
|
120 |
void set_namespace(std::string name) {
|
|
|
121 |
namespace_ = name;
|
|
|
122 |
}
|
|
|
123 |
|
|
|
124 |
// Scope accessor
|
|
|
125 |
t_scope* scope() {
|
|
|
126 |
return scope_;
|
|
|
127 |
}
|
|
|
128 |
|
|
|
129 |
// Includes
|
|
|
130 |
|
|
|
131 |
void add_include(std::string path, std::string include_site) {
|
|
|
132 |
t_program* program = new t_program(path);
|
|
|
133 |
|
|
|
134 |
// include prefix for this program is the site at which it was included
|
|
|
135 |
// (minus the filename)
|
|
|
136 |
std::string include_prefix;
|
|
|
137 |
std::string::size_type last_slash = std::string::npos;
|
|
|
138 |
if ((last_slash = include_site.rfind("/")) != std::string::npos) {
|
|
|
139 |
include_prefix = include_site.substr(0, last_slash);
|
|
|
140 |
}
|
|
|
141 |
|
|
|
142 |
program->set_include_prefix(include_prefix);
|
|
|
143 |
includes_.push_back(program);
|
|
|
144 |
}
|
|
|
145 |
|
|
|
146 |
std::vector<t_program*>& get_includes() {
|
|
|
147 |
return includes_;
|
|
|
148 |
}
|
|
|
149 |
|
|
|
150 |
void set_include_prefix(std::string include_prefix) {
|
|
|
151 |
include_prefix_ = include_prefix;
|
|
|
152 |
|
|
|
153 |
// this is intended to be a directory; add a trailing slash if necessary
|
|
|
154 |
int len = include_prefix_.size();
|
|
|
155 |
if (len > 0 && include_prefix_[len - 1] != '/') {
|
|
|
156 |
include_prefix_ += '/';
|
|
|
157 |
}
|
|
|
158 |
}
|
|
|
159 |
|
|
|
160 |
// Language neutral namespace / packaging
|
|
|
161 |
void set_namespace(std::string language, std::string name_space) {
|
|
|
162 |
namespaces_[language] = name_space;
|
|
|
163 |
}
|
|
|
164 |
|
|
|
165 |
std::string get_namespace(std::string language) const {
|
|
|
166 |
std::map<std::string, std::string>::const_iterator iter = namespaces_.find(language);
|
|
|
167 |
if (iter == namespaces_.end()) {
|
|
|
168 |
return std::string();
|
|
|
169 |
}
|
|
|
170 |
return iter->second;
|
|
|
171 |
}
|
|
|
172 |
|
|
|
173 |
// Language specific namespace / packaging
|
|
|
174 |
|
|
|
175 |
void add_cpp_include(std::string path) {
|
|
|
176 |
cpp_includes_.push_back(path);
|
|
|
177 |
}
|
|
|
178 |
|
|
|
179 |
const std::vector<std::string>& get_cpp_includes() {
|
|
|
180 |
return cpp_includes_;
|
|
|
181 |
}
|
|
|
182 |
|
|
|
183 |
private:
|
|
|
184 |
|
|
|
185 |
// File path
|
|
|
186 |
std::string path_;
|
|
|
187 |
|
|
|
188 |
// Name
|
|
|
189 |
std::string name_;
|
|
|
190 |
|
|
|
191 |
// Output directory
|
|
|
192 |
std::string out_path_;
|
|
|
193 |
|
|
|
194 |
// Namespace
|
|
|
195 |
std::string namespace_;
|
|
|
196 |
|
|
|
197 |
// Included programs
|
|
|
198 |
std::vector<t_program*> includes_;
|
|
|
199 |
|
|
|
200 |
// Include prefix for this program, if any
|
|
|
201 |
std::string include_prefix_;
|
|
|
202 |
|
|
|
203 |
// Identifier lookup scope
|
|
|
204 |
t_scope* scope_;
|
|
|
205 |
|
|
|
206 |
// Components to generate code for
|
|
|
207 |
std::vector<t_typedef*> typedefs_;
|
|
|
208 |
std::vector<t_enum*> enums_;
|
|
|
209 |
std::vector<t_const*> consts_;
|
|
|
210 |
std::vector<t_struct*> objects_;
|
|
|
211 |
std::vector<t_struct*> structs_;
|
|
|
212 |
std::vector<t_struct*> xceptions_;
|
|
|
213 |
std::vector<t_service*> services_;
|
|
|
214 |
|
|
|
215 |
// Dynamic namespaces
|
|
|
216 |
std::map<std::string, std::string> namespaces_;
|
|
|
217 |
|
|
|
218 |
// C++ extra includes
|
|
|
219 |
std::vector<std::string> cpp_includes_;
|
|
|
220 |
|
|
|
221 |
};
|
|
|
222 |
|
|
|
223 |
#endif
|