You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
7.2 KiB
170 lines
7.2 KiB
#include "generator.h"
|
|
|
|
using namespace std;
|
|
using namespace clang;
|
|
|
|
/* Generator for C++ bindings.
|
|
*
|
|
* "checked" is set if C++ bindings should be generated
|
|
* that rely on the user to check for error conditions.
|
|
*/
|
|
class cpp_generator : public generator {
|
|
protected:
|
|
bool checked;
|
|
public:
|
|
cpp_generator(SourceManager &SM, set<RecordDecl *> &exported_types,
|
|
set<FunctionDecl *> exported_functions,
|
|
set<FunctionDecl *> functions,
|
|
bool checked = false) :
|
|
generator(SM, exported_types, exported_functions, functions),
|
|
checked(checked) {}
|
|
|
|
enum function_kind {
|
|
function_kind_static_method,
|
|
function_kind_member_method,
|
|
function_kind_constructor,
|
|
};
|
|
enum method_part {
|
|
decl,
|
|
impl,
|
|
};
|
|
|
|
virtual void generate();
|
|
private:
|
|
void print_forward_declarations(ostream &os);
|
|
void print_declarations(ostream &os);
|
|
void print_class(ostream &os, const isl_class &clazz);
|
|
void print_subclass_type(ostream &os, const isl_class &clazz);
|
|
void print_class_forward_decl(ostream &os, const isl_class &clazz);
|
|
void print_class_factory_decl(ostream &os, const isl_class &clazz,
|
|
const std::string &prefix = std::string());
|
|
void print_protected_constructors_decl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_copy_assignment_decl(ostream &os, const isl_class &clazz);
|
|
void print_public_constructors_decl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_constructors_decl(ostream &os, const isl_class &clazz);
|
|
void print_destructor_decl(ostream &os, const isl_class &clazz);
|
|
void print_ptr_decl(ostream &os, const isl_class &clazz);
|
|
void print_isa_type_template(ostream &os, int indent,
|
|
const isl_class &super);
|
|
void print_downcast_decl(ostream &os, const isl_class &clazz);
|
|
void print_ctx_decl(ostream &os);
|
|
void print_persistent_callback_prototype(ostream &os,
|
|
const isl_class &clazz, FunctionDecl *method,
|
|
bool is_declaration);
|
|
void print_persistent_callback_setter_prototype(ostream &os,
|
|
const isl_class &clazz, FunctionDecl *method,
|
|
bool is_declaration);
|
|
void print_persistent_callback_data(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method);
|
|
void print_persistent_callbacks_decl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_methods_decl(ostream &os, const isl_class &clazz);
|
|
bool next_variant(FunctionDecl *fd, std::vector<bool> &convert);
|
|
template <enum method_part>
|
|
void print_method_variants(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd);
|
|
void print_method_group_decl(ostream &os, const isl_class &clazz,
|
|
const function_set &methods);
|
|
void print_named_method_decl(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd, const string &name, function_kind kind,
|
|
const std::vector<bool> &convert = {});
|
|
template <enum method_part>
|
|
void print_method(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, function_kind kind);
|
|
template <enum method_part>
|
|
void print_method(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, function_kind kind,
|
|
const std::vector<bool> &convert);
|
|
void print_set_enum_decl(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd, const string &name);
|
|
void print_set_enums_decl(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd);
|
|
void print_set_enums_decl(ostream &os, const isl_class &clazz);
|
|
void print_implementations(ostream &os);
|
|
void print_class_impl(ostream &os, const isl_class &clazz);
|
|
void print_check_ptr(ostream &os, const char *ptr);
|
|
void print_check_ptr_start(ostream &os, const isl_class &clazz,
|
|
const char *ptr);
|
|
void print_check_ptr_end(ostream &os, const char *ptr);
|
|
void print_class_factory_impl(ostream &os, const isl_class &clazz);
|
|
void print_protected_constructors_impl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_public_constructors_impl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_constructors_impl(ostream &os, const isl_class &clazz);
|
|
void print_copy_assignment_impl(ostream &os, const isl_class &clazz);
|
|
void print_destructor_impl(ostream &os, const isl_class &clazz);
|
|
void print_check_no_persistent_callback(ostream &os,
|
|
const isl_class &clazz, FunctionDecl *fd);
|
|
void print_ptr_impl(ostream &os, const isl_class &clazz);
|
|
void print_downcast_impl(ostream &os, const isl_class &clazz);
|
|
void print_ctx_impl(ostream &os, const isl_class &clazz);
|
|
void print_persistent_callbacks_impl(ostream &os,
|
|
const isl_class &clazz);
|
|
void print_methods_impl(ostream &os, const isl_class &clazz);
|
|
void print_method_group_impl(ostream &os, const isl_class &clazz,
|
|
const function_set &methods);
|
|
void print_argument_validity_check(ostream &os, FunctionDecl *method,
|
|
function_kind kind);
|
|
void print_save_ctx(ostream &os, FunctionDecl *method,
|
|
function_kind kind);
|
|
void print_on_error_continue(ostream &os);
|
|
void print_exceptional_execution_check(ostream &os,
|
|
const isl_class &clazz, FunctionDecl *method,
|
|
function_kind kind);
|
|
void print_set_persistent_callback(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, function_kind kind);
|
|
void print_method_return(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method);
|
|
void print_set_enum_impl(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd, const string &enum_name,
|
|
const string &method_name);
|
|
void print_set_enums_impl(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd);
|
|
void print_set_enums_impl(ostream &os, const isl_class &clazz);
|
|
template <enum method_part>
|
|
void print_get_method(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *fd);
|
|
void print_invalid(ostream &os, int indent, const char *msg,
|
|
const char *checked_code);
|
|
void print_stream_insertion(ostream &os, const isl_class &clazz);
|
|
void print_method_param_use(ostream &os, ParmVarDecl *param,
|
|
bool load_from_this_ptr);
|
|
std::string get_return_type(const isl_class &clazz, FunctionDecl *fd);
|
|
ParmVarDecl *get_param(FunctionDecl *fd, int pos,
|
|
const std::vector<bool> &convert);
|
|
void print_method_header(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, const string &cname, int num_params,
|
|
bool is_declaration, function_kind kind,
|
|
const std::vector<bool> &convert = {});
|
|
void print_named_method_header(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, string name, bool is_declaration,
|
|
function_kind kind, const std::vector<bool> &convert = {});
|
|
void print_method_header(ostream &os, const isl_class &clazz,
|
|
FunctionDecl *method, bool is_declaration, function_kind kind);
|
|
string generate_callback_args(QualType type, bool cpp);
|
|
string generate_callback_type(QualType type);
|
|
void print_wrapped_call_checked(std::ostream &os, int indent,
|
|
const std::string &call);
|
|
void print_wrapped_call(std::ostream &os, int indent,
|
|
const std::string &call, QualType rtype);
|
|
void print_callback_data_decl(ostream &os, ParmVarDecl *param,
|
|
const string &name);
|
|
void print_callback_body(ostream &os, int indent, ParmVarDecl *param,
|
|
const string &name);
|
|
void print_callback_local(ostream &os, ParmVarDecl *param);
|
|
std::string rename_method(std::string name);
|
|
string isl_bool2cpp();
|
|
string isl_namespace();
|
|
string type2cpp(QualType type);
|
|
bool is_implicit_conversion(const isl_class &clazz, FunctionDecl *cons);
|
|
bool is_subclass(QualType subclass_type, const isl_class &class_type);
|
|
function_kind get_method_kind(const isl_class &clazz,
|
|
FunctionDecl *method);
|
|
public:
|
|
static string type2cpp(const isl_class &clazz);
|
|
static string type2cpp(string type_string);
|
|
};
|