summaryrefslogtreecommitdiff
path: root/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/cpp/src/thrift/generate/t_ocaml_generator.cc')
-rw-r--r--compiler/cpp/src/thrift/generate/t_ocaml_generator.cc48
1 files changed, 27 insertions, 21 deletions
diff --git a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
index 5e86de4fc..747adcbac 100644
--- a/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_ocaml_generator.cc
@@ -61,12 +61,9 @@ public:
out_dir_base_ = "gen-ocaml";
}
- /**
- * Init and close methods
- */
+ ~t_ocaml_generator() override;
void init_generator() override;
- void close_generator() override;
/**
* Program-level generation functions
@@ -147,16 +144,20 @@ public:
* Helper rendering functions
*/
- std::string ocaml_autogen_comment();
+ /** Need to disable codegen comment for unit tests to be version-agnostic */
+ virtual std::string ocaml_autogen_comment();
+
std::string ocaml_imports();
std::string type_name(t_type* ttype);
+ std::string exception_ctor(t_type* ttype);
std::string function_signature(t_function* tfunction, std::string prefix = "");
std::string function_type(t_function* tfunc, bool method = false, bool options = false);
std::string argument_list(t_struct* tstruct);
std::string type_to_enum(t_type* ttype);
std::string render_ocaml_type(t_type* type);
-private:
+// Need access to output file streams for testing.
+protected:
/**
* File streams
*/
@@ -216,9 +217,6 @@ void t_ocaml_generator::generate_program() {
// Generate constants
vector<t_const*> consts = program_->get_consts();
generate_consts(consts);
-
- // Close the generator
- close_generator();
}
/**
@@ -262,12 +260,12 @@ string t_ocaml_generator::ocaml_imports() {
return "open Thrift";
}
-/**
- * Closes the type files
- */
-void t_ocaml_generator::close_generator() {
- // Close types file
+t_ocaml_generator::~t_ocaml_generator() {
+ f_consts_.close();
f_types_.close();
+ f_types_i_.close();
+ f_service_.close();
+ f_service_i_.close();
}
/**
@@ -914,10 +912,6 @@ void t_ocaml_generator::generate_service(t_service* tservice) {
generate_service_interface(tservice);
generate_service_client(tservice);
generate_service_server(tservice);
-
- // Close service file
- f_service_.close();
- f_service_i_.close();
}
/**
@@ -1108,7 +1102,7 @@ void t_ocaml_generator::generate_service_client(t_service* tservice) {
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
f_service_ << indent() << "(match result#get_" << (*x_iter)->get_name()
<< " with None -> () | Some _v ->" << endl;
- indent(f_service_) << " raise (" << capitalize(type_name((*x_iter)->get_type()))
+ indent(f_service_) << " raise (" << capitalize(exception_ctor((*x_iter)->get_type()))
<< " _v));" << endl;
}
@@ -1270,7 +1264,7 @@ void t_ocaml_generator::generate_process_function(t_service* tservice, t_functio
indent(f_service_) << "with" << endl;
indent_up();
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
- f_service_ << indent() << "| " << capitalize(type_name((*x_iter)->get_type())) << " "
+ f_service_ << indent() << "| " << capitalize(exception_ctor((*x_iter)->get_type())) << " "
<< (*x_iter)->get_name() << " -> " << endl;
indent_up();
indent_up();
@@ -1665,7 +1659,7 @@ string t_ocaml_generator::type_name(t_type* ttype) {
}
string name = ttype->get_name();
- if (ttype->is_service() || ttype->is_xception()) {
+ if (ttype->is_service()) {
name = capitalize(name);
} else {
name = decapitalize(name);
@@ -1673,6 +1667,18 @@ string t_ocaml_generator::type_name(t_type* ttype) {
return prefix + name;
}
+string t_ocaml_generator::exception_ctor(t_type* ttype) {
+ string prefix = "";
+ t_program* program = ttype->get_program();
+ if (program != nullptr && program != program_) {
+ if (!ttype->is_service()) {
+ prefix = capitalize(program->get_name()) + "_types.";
+ }
+ }
+
+ return prefix + capitalize(ttype->get_name());
+}
+
/**
* Converts the parse type to a Protocol.t_type enum
*/