1d169d70bSTobias Grosser #include <set>
2d169d70bSTobias Grosser #include <clang/AST/Decl.h>
3d169d70bSTobias Grosser #include "generator.h"
4d169d70bSTobias Grosser 
5d169d70bSTobias Grosser using namespace std;
6d169d70bSTobias Grosser using namespace clang;
7d169d70bSTobias Grosser 
8d169d70bSTobias Grosser class python_generator : public generator {
9d169d70bSTobias Grosser private:
10d169d70bSTobias Grosser 	set<string> done;
11d169d70bSTobias Grosser 
12d169d70bSTobias Grosser public:
python_generator(SourceManager & SM,set<RecordDecl * > & exported_types,set<FunctionDecl * > exported_functions,set<FunctionDecl * > functions)136145b11cSTobias Grosser 	python_generator(SourceManager &SM, set<RecordDecl *> &exported_types,
14d169d70bSTobias Grosser 		set<FunctionDecl *> exported_functions,
15d169d70bSTobias Grosser 		set<FunctionDecl *> functions) :
166145b11cSTobias Grosser 		generator(SM, exported_types, exported_functions, functions) {}
17d169d70bSTobias Grosser 
18d169d70bSTobias Grosser 	virtual void generate();
19d169d70bSTobias Grosser 
20d169d70bSTobias Grosser private:
21d169d70bSTobias Grosser 	void print(const isl_class &clazz);
22*e8227804SMichael Kruse 	void print_method_arguments(int first, int n_arg);
23d169d70bSTobias Grosser 	void print_method_header(bool is_static, const string &name, int n_arg);
24d169d70bSTobias Grosser 	void print_class_header(const isl_class &clazz, const string &name,
25d169d70bSTobias Grosser 		const vector<string> &super);
26*e8227804SMichael Kruse 	void print_type_check(int indent, const string &type, const char *fmt,
27*e8227804SMichael Kruse 		int pos, bool upcast, const string &super,
28*e8227804SMichael Kruse 		const string &name, int n);
29*e8227804SMichael Kruse 	void print_type_checks(const string &cname, FunctionDecl *method,
30*e8227804SMichael Kruse 		bool first_is_ctx, int n, const vector<string> &super);
316145b11cSTobias Grosser 	void print_copy(QualType type);
326145b11cSTobias Grosser 	void print_callback(ParmVarDecl *param, int arg);
33*e8227804SMichael Kruse 	void print_arg_in_call(FunctionDecl *fd, const char *fmt, int arg,
34*e8227804SMichael Kruse 		int skip);
35d169d70bSTobias Grosser 	void print_argtypes(FunctionDecl *fd);
36*e8227804SMichael Kruse 	void print_method_return(int indent, const isl_class &clazz,
37*e8227804SMichael Kruse 		FunctionDecl *method, const char *fmt);
38d169d70bSTobias Grosser 	void print_restype(FunctionDecl *fd);
39d169d70bSTobias Grosser 	void print(map<string, isl_class> &classes, set<string> &done);
40d169d70bSTobias Grosser 	void print_constructor(const isl_class &clazz, FunctionDecl *method);
41*e8227804SMichael Kruse 	void print_upcast_constructors(const isl_class &clazz);
42*e8227804SMichael Kruse 	void print_new(const isl_class &clazz,
43*e8227804SMichael Kruse 		const string &python_name);
44d169d70bSTobias Grosser 	void print_representation(const isl_class &clazz,
45d169d70bSTobias Grosser 		const string &python_name);
46*e8227804SMichael Kruse 	void print_copy_callbacks(const isl_class &clazz);
47d169d70bSTobias Grosser 	void print_method_type(FunctionDecl *fd);
48d169d70bSTobias Grosser 	void print_method_types(const isl_class &clazz);
49*e8227804SMichael Kruse 	void print_get_method(const isl_class &clazz, FunctionDecl *fd);
50d169d70bSTobias Grosser 	void print_method(const isl_class &clazz, FunctionDecl *method,
51d169d70bSTobias Grosser 		vector<string> super);
52*e8227804SMichael Kruse 	void print_method_call(int indent, const isl_class &clazz,
53*e8227804SMichael Kruse 		FunctionDecl *method, const char *fmt,
54*e8227804SMichael Kruse 		int drop_ctx, int drop_user);
55*e8227804SMichael Kruse 	void print_argument_checks(const isl_class &clazz, FunctionDecl *fd,
56*e8227804SMichael Kruse 		int drop_ctx);
57d169d70bSTobias Grosser 	void print_method_overload(const isl_class &clazz,
58d169d70bSTobias Grosser 		FunctionDecl *method);
59d169d70bSTobias Grosser 	void print_method(const isl_class &clazz, const string &fullname,
60*e8227804SMichael Kruse 		const function_set &methods, vector<string> super);
61*e8227804SMichael Kruse 	void print_set_enum(const isl_class &clazz, FunctionDecl *fd,
62*e8227804SMichael Kruse 		int value, const string &name, const vector<string> &super);
63*e8227804SMichael Kruse 	void print_set_enum(const isl_class &clazz, FunctionDecl *fd,
64*e8227804SMichael Kruse 		const vector<string> &super);
65d169d70bSTobias Grosser 
66d169d70bSTobias Grosser };
67