[thrift] give the generated Erlang service file a _thrift
Summary: Before they were names Service.erl, but the Service module name should be reserved for more important things. Namespaces what?
Test Plan: with channel server
Riders: also fixes whitespace, puts -erl in its right place
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665271 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_erl_generator.cc b/compiler/cpp/src/generate/t_erl_generator.cc
index e3909bd..8f020bf 100644
--- a/compiler/cpp/src/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/generate/t_erl_generator.cc
@@ -4,8 +4,6 @@
// See accompanying file LICENSE or visit the Thrift site at:
// http://developers.facebook.com/thrift/
-// still missing: inheritance, containers
-
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
@@ -43,7 +41,7 @@
erl_imports() << endl;
f_types_file_ <<
- "-include(\"" << program_name_ << "_types.hrl\")." << endl <<
+ "-include(\"" << program_name_ << "_types.hrl\")." << endl <<
endl;
f_types_hrl_file_ << render_includes() << endl;
@@ -103,7 +101,7 @@
*/
string t_erl_generator::erl_imports() {
return
- string("-include(\"thrift.hrl\").\n") +
+ string("-include(\"thrift.hrl\").\n") +
"-include(\"tApplicationException.hrl\").\n" +
"-include(\"protocol/tProtocol.hrl\").\n";
}
@@ -149,9 +147,9 @@
} else {
++value;
}
-
+
string name = capitalize((*c_iter)->get_name());
-
+
f_types_hrl_file_ <<
indent() << "-define(" << program_name_ << "_" << name << ", " << value << ")."<< endl;
}
@@ -166,7 +164,7 @@
t_type* type = tconst->get_type();
string name = capitalize(tconst->get_name());
t_const_value* value = tconst->get_value();
-
+
f_consts_ << "-define(" << program_name_ << "_" << name << ", " << render_const_value(type, value) << ")." << endl << endl;
}
@@ -252,7 +250,7 @@
out << ",";
}
out << "("
- << render_const_value(ktype, v_iter->first) << ","
+ << render_const_value(ktype, v_iter->first) << ","
<< render_const_value(vtype, v_iter->second) << ")";
}
out << "])";
@@ -310,7 +308,7 @@
* @param txception The struct definition
*/
void t_erl_generator::generate_xception(t_struct* txception) {
- generate_erl_struct(txception, true);
+ generate_erl_struct(txception, true);
}
/**
@@ -330,14 +328,14 @@
ostream& hrl_out,
t_struct* tstruct,
bool is_exception,
- bool is_result)
+ bool is_result)
{
const vector<t_field*>& members = tstruct->get_members();
- vector<t_field*>::const_iterator m_iter;
+ vector<t_field*>::const_iterator m_iter;
indent(out) << "%% struct " << type_name(tstruct) << endl;
- if (is_exception) {
+ if (is_exception) {
}
out << endl;
@@ -363,7 +361,7 @@
indent(out) << "% -record(" << type_name(tstruct) << ", {})." << endl;
indent(hrl_out) << "-record(" << type_name(tstruct) << ", {})." << endl;
}
-
+
out << endl;
hrl_out << endl;
@@ -389,9 +387,9 @@
indent(out) << name << "(Iprot) ->" << endl;
indent_up();
-
+
out <<
- indent() << "?R0(Iprot, readStructBegin)," << endl <<
+ indent() << "?R0(Iprot, readStructBegin)," << endl <<
indent() << "Str = " << type_name(tstruct) << "_read_loop(Iprot, ";
// empty struct
@@ -419,12 +417,12 @@
// Generate deserialization code for known cases
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- out << indent() << "(Fid == " << (*f_iter)->get_key() << ") and (Ftype == "
+ out << indent() << "(Fid == " << (*f_iter)->get_key() << ") and (Ftype == "
<< type_to_enum((*f_iter)->get_type()) << ") ->" << endl;
-
+
indent_up();
generate_deserialize_field(out, *f_iter, "Val");
-
+
out << indent() << "?R0(Iprot, readFieldEnd)," << endl
<< indent() << type_name(tstruct) << "_read_loop(Iprot, "
<< "Str#" << type_name(tstruct)
@@ -432,7 +430,7 @@
<< "=Val});" << endl;
indent_down();
}
-
+
// In the default case we skip the field
out <<
indent() << "true -> " << endl <<
@@ -440,9 +438,9 @@
indent() << " ?R0(Iprot, readFieldEnd)," << endl <<
indent() << " " << type_name(tstruct) << "_read_loop(Iprot, Str)" << endl;
indent_down();
-
- indent(out) << "end." << endl;
-
+
+ indent(out) << "end." << endl;
+
indent_down();
out << endl;
}
@@ -460,10 +458,10 @@
} else {
export_string(fname, 2);
}
-
+
indent(out) << fname << "(Str, Oprot) ->" << endl;
indent_up();
-
+
out <<
indent() << "Str, % suppress unused warnings" << endl <<
indent() << "?R1(Oprot, writeStructBegin, \"" << name << "\")," << endl;
@@ -513,20 +511,20 @@
// ...awesome
service_name_[0] = tolower(service_name_[0]);
- string f_service_hrl_name = string(T_ERL_DIR)+"/"+service_name_+".hrl";
- string f_service_name = string(T_ERL_DIR)+"/"+service_name_+".erl";
+ string f_service_hrl_name = string(T_ERL_DIR)+"/"+service_name_+"_thrift.hrl";
+ string f_service_name = string(T_ERL_DIR)+"/"+service_name_+"_thrift.erl";
f_service_file_.open(f_service_name.c_str());
f_service_hrl_.open(f_service_hrl_name.c_str());
hrl_header(f_service_hrl_, service_name_);
if (tservice->get_extends() != NULL) {
- f_service_hrl_ << "-include(\"" <<
- uncapitalize(tservice->get_extends()->get_name()) << ".hrl\"). % inherit " << endl;
+ f_service_hrl_ << "-include(\"" <<
+ uncapitalize(tservice->get_extends()->get_name()) << "_thrift.hrl\"). % inherit " << endl;
}
f_service_hrl_ <<
- "-include(\"" << program_name_ << "_types.hrl\")." << endl <<
+ "-include(\"" << program_name_ << "_types.hrl\")." << endl <<
endl;
// Generate the three main parts of the service (well, two for now in PHP)
@@ -540,10 +538,10 @@
f_service_file_ <<
erl_autogen_comment() << endl <<
- "-module(" << service_name_ << ")." << endl << endl <<
+ "-module(" << service_name_ << "_thrift)." << endl << endl <<
erl_imports() << endl;
- f_service_file_ << "-include(\"" << uncapitalize(tservice->get_name()) << ".hrl\")." << endl << endl;
+ f_service_file_ << "-include(\"" << uncapitalize(tservice->get_name()) << "_thrift.hrl\")." << endl << endl;
f_service_file_ << "-export([" << export_lines_.str() << "])." << endl << endl;
@@ -570,7 +568,7 @@
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
t_struct* ts = (*f_iter)->get_arglist();
-
+
generate_erl_struct_definition(f_service_, f_service_hrl_, ts, false);
generate_erl_function_helpers(*f_iter);
}
@@ -612,7 +610,7 @@
// }
vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
+ vector<t_function*>::iterator f_iter;
f_service_ << "%%% interface" << endl;
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
f_service_ <<
@@ -659,7 +657,7 @@
// Generate client method implementations
vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::const_iterator f_iter;
+ vector<t_function*>::const_iterator f_iter;
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
t_struct* arg_struct = (*f_iter)->get_arglist();
const vector<t_field*>& fields = arg_struct->get_members();
@@ -718,7 +716,7 @@
bool first = true;
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- f_service_ << (first ? first = false, "" : ", ")
+ f_service_ << (first ? first = false, "" : ", ")
<< (*fld_iter)->get_name()
<< "=" << capitalize((*fld_iter)->get_name());
}
@@ -731,20 +729,20 @@
indent() << "?R0(Oprot, writeMessageEnd)," << endl <<
indent() << "Trans = ?R1(Oprot, get, trans)," << endl <<
indent() << "?R0(Trans, effectful_flush)," << endl <<
- indent() << "ok." << endl;
+ indent() << "ok." << endl;
indent_down();
if (!(*f_iter)->is_async()) {
std::string resultname = uncapitalize((*f_iter)->get_name() + "_result");
t_struct noargs(program_);
-
+
t_function recv_function((*f_iter)->get_returntype(),
string("recv_") + (*f_iter)->get_name(),
&noargs);
export_function(&recv_function, "");
-
+
// Open function
f_service_ <<
endl <<
@@ -776,7 +774,7 @@
std::string result = "Result#"+resultname+".";
if (!(*f_iter)->get_returntype()->is_void()) {
f_service_ <<
- indent() << " " << result << "success /= nil ->" << endl <<
+ indent() << " " << result << "success /= nil ->" << endl <<
indent() << " " << result << "success;" << endl;
}
@@ -797,14 +795,14 @@
} else {
f_service_ <<
indent() << " true -> " << endl <<
- indent() << " throw(tApplicationException:new(?tApplicationException_MISSING_RESULT, \"" << (*f_iter)->get_name() << " failed: unknown result\"))" << endl <<
+ indent() << " throw(tApplicationException:new(?tApplicationException_MISSING_RESULT, \"" << (*f_iter)->get_name() << " failed: unknown result\"))" << endl <<
indent() << " end" << endl;
- }
-
+ }
+
// Close function
indent(f_service_) << "end." << endl << endl;
indent_down();
- }
+ }
}
indent_down();
@@ -819,13 +817,13 @@
void t_erl_generator::generate_service_server(t_service* tservice) {
// Generate the dispatch methods
vector<t_function*> functions = tservice->get_functions();
- vector<t_function*>::iterator f_iter;
+ vector<t_function*>::iterator f_iter;
string extends = "";
string extends_processor = "";
if (tservice->get_extends() != NULL) {
extends = type_name(tservice->get_extends());
- extends_processor = " INHERIT(" + extends + "::Processor) % TODO";
+ extends_processor = " INHERIT(" + extends + "::Processor) % TODO";
}
// Generate the header portion
@@ -856,7 +854,7 @@
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
f_service_ <<
indent() << "@processMap['" << (*f_iter)->get_name() << "'] = method(:process_" << (*f_iter)->get_name() << ")" << endl;
- }
+ }
indent_down();
indent(f_service_) << "end" << endl << endl;
*/
@@ -884,7 +882,7 @@
f_service_ <<
// try to dispatch to one of our process_*
indent() << "case Name of" << endl;
-
+
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
f_service_ <<
indent() << " \"" << (*f_iter)->get_name() << "\" -> process_" << (*f_iter)->get_name() << "(HandlerModule, Seqid, Iprot, Oprot);" << endl;
@@ -927,7 +925,7 @@
t_function* tfunction) {
string name = "process_" + tfunction->get_name();
-
+
export_string(name, 4);
// Open function
@@ -936,9 +934,9 @@
"(HandlerModule, Seqid, Iprot, Oprot) ->" << endl;
indent_up();
- f_service_ <<
+ f_service_ <<
indent() << "Seqid, Oprot, % suppress unused warnings" << endl;
-
+
string argsname = tfunction->get_name() + "_args";
string resultname = tfunction->get_name() + "_result";
@@ -1026,7 +1024,7 @@
indent() << " tApplicationException:write(X, Oprot)," << endl <<
indent() << " {error, X};" << endl <<
indent() << " _:_Kind ->" << endl <<
- indent() << " X = tApplicationException:new(?tApplicationException_HANDLER_ERROR, \"Unknown handler error in "
+ indent() << " X = tApplicationException:new(?tApplicationException_HANDLER_ERROR, \"Unknown handler error in "
<< tfunction->get_name() << "\")," << endl <<
indent() << " ?R3(Oprot, writeMessageBegin, \"" << tfunction->get_name() << "\", ?tMessageType_EXCEPTION, Seqid)," << endl <<
@@ -1046,7 +1044,7 @@
indent_down();
}
-
+
indent(f_service_) << "end." << endl;
indent_down();
@@ -1077,7 +1075,7 @@
} else if (type->is_base_type() || type->is_enum()) {
indent(out) <<
name << " = ?R0(Iprot, ";
-
+
if (type->is_base_type()) {
t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
switch (tbase) {
@@ -1085,7 +1083,7 @@
throw "compiler error: cannot serialize void field in a struct: " +
name;
break;
- case t_base_type::TYPE_STRING:
+ case t_base_type::TYPE_STRING:
out << "readString";
break;
case t_base_type::TYPE_BOOL:
@@ -1117,7 +1115,7 @@
} else {
printf("DO NOT KNOW HOW TO DESERIALIZE FIELD '%s' TYPE '%s'\n",
tfield->get_name().c_str(), type->get_name().c_str());
- }
+ }
}
/**
@@ -1141,7 +1139,7 @@
string ktype = tmp("_ktype");
string vtype = tmp("_vtype");
string etype = tmp("_etype");
-
+
t_field fsize(g_type_i32, size);
t_field fktype(g_type_byte, ktype);
t_field fvtype(g_type_byte, vtype);
@@ -1262,7 +1260,7 @@
* @param tfield The field to serialize
* @param prefix Name to prepend to field name
*/
-void t_erl_generator::generate_serialize_field(ostream &out,
+void t_erl_generator::generate_serialize_field(ostream &out,
t_field* tfield,
string prefix) {
t_type* type = get_true_type(tfield->get_type());
@@ -1272,7 +1270,7 @@
throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " +
prefix + tfield->get_name();
}
-
+
if (type->is_struct() || type->is_xception()) {
generate_serialize_struct(out,
(t_struct*)type,
@@ -1287,7 +1285,7 @@
indent(out) <<
"?R1(Oprot, ";
-
+
if (type->is_base_type()) {
t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
switch (tbase) {
@@ -1367,7 +1365,7 @@
if (ttype->is_map()) {
string kiter = tmp("_kiter");
string viter = tmp("_viter");
- indent(out) <<
+ indent(out) <<
"dict:fold(fun ("<< kiter << ", " << viter << ",_)->" << endl;
indent_up();
generate_serialize_map_element(out, (t_map*)ttype, kiter, viter);
@@ -1376,7 +1374,7 @@
indent(out) << "end, nil," << prefix << ")," << endl;
} else if (ttype->is_set()) {
string iter = tmp("_iter");
- indent(out) <<
+ indent(out) <<
"sets:fold(fun ("<< iter << ",_)->" << endl;
indent_up();
generate_serialize_set_element(out, (t_set*)ttype, iter);
@@ -1385,7 +1383,7 @@
indent(out) << "end, nil," << prefix << ")," << endl;
} else if (ttype->is_list()) {
string iter = tmp("_iter");
- indent(out) <<
+ indent(out) <<
"lists:foldl(fun (" << iter << ",_)->" << endl;
indent_up();
generate_serialize_list_element(out, (t_list*)ttype, iter);
@@ -1393,7 +1391,7 @@
indent_down();
indent(out) << "end,nil," << prefix << ")," << endl;
}
-
+
if (ttype->is_map()) {
indent(out) <<
"?R0(Oprot, writeMapEnd)," << endl;
@@ -1484,8 +1482,8 @@
void t_erl_generator::export_types_function(t_function* tfunction,
string prefix) {
-
- export_types_string(prefix + tfunction->get_name(),
+
+ export_types_string(prefix + tfunction->get_name(),
1 // This
+ ((tfunction->get_arglist())->get_members()).size()
);
@@ -1502,8 +1500,8 @@
void t_erl_generator::export_function(t_function* tfunction,
string prefix) {
-
- export_string(prefix + tfunction->get_name(),
+
+ export_string(prefix + tfunction->get_name(),
1 // This
+ ((tfunction->get_arglist())->get_members()).size()
);
@@ -1541,7 +1539,7 @@
}
string name = ttype->get_name();
-
+
if (ttype->is_struct() || ttype->is_xception() || ttype->is_service()) {
name = uncapitalize(ttype->get_name());
}
@@ -1554,7 +1552,7 @@
*/
string t_erl_generator::type_to_enum(t_type* type) {
type = get_true_type(type);
-
+
if (type->is_base_type()) {
t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
switch (tbase) {
diff --git a/compiler/cpp/src/main.cc b/compiler/cpp/src/main.cc
index 015d1ba..0078055 100644
--- a/compiler/cpp/src/main.cc
+++ b/compiler/cpp/src/main.cc
@@ -35,8 +35,8 @@
#include "generate/t_rb_generator.h"
#include "generate/t_xsd_generator.h"
#include "generate/t_perl_generator.h"
-#include "generate/t_ocaml_generator.h"
#include "generate/t_erl_generator.h"
+#include "generate/t_ocaml_generator.h"
#include "generate/t_hs_generator.h"
#include "generate/t_cocoa_generator.h"
@@ -140,8 +140,8 @@
bool gen_phpi = false;
bool gen_rest = false;
bool gen_perl = false;
-bool gen_ocaml = false;
bool gen_erl = false;
+bool gen_ocaml = false;
bool gen_hs = false;
bool gen_cocoa = false;
bool gen_dense = false;
@@ -562,8 +562,8 @@
fprintf(stderr, " -rb Generate Ruby output files\n");
fprintf(stderr, " -xsd Generate XSD output files\n");
fprintf(stderr, " -perl Generate Perl output files\n");
- fprintf(stderr, " -ocaml Generate OCaml output files\n");
fprintf(stderr, " -erl Generate Erlang output files\n");
+ fprintf(stderr, " -ocaml Generate OCaml output files\n");
fprintf(stderr, " -hs Generate Haskell output files\n");
fprintf(stderr, " -cocoa Generate Cocoa/Objective-C output files\n");
fprintf(stderr, " -I dir Add a directory to the list of directories\n");
@@ -844,6 +844,13 @@
delete perl;
}
+ if (gen_erl) {
+ pverbose("Generating Erlang\n");
+ t_erl_generator* erl = new t_erl_generator(program);
+ erl->generate_program();
+ delete erl;
+ }
+
if (gen_ocaml) {
pverbose("Generating OCaml\n");
t_ocaml_generator* ocaml = new t_ocaml_generator(program);
@@ -851,28 +858,23 @@
delete ocaml;
}
- if (gen_erl) {
- pverbose("Generating Erlang\n");
- t_erl_generator* erl = new t_erl_generator(program);
- erl->generate_program();
- delete erl;
- }
if (gen_hs) {
pverbose("Generating Haskell\n");
t_hs_generator* hs = new t_hs_generator(program);
hs->generate_program();
delete hs;
}
+
if (gen_cocoa) {
pverbose("Generating Cocoa/Objective-C\n");
t_cocoa_generator* cocoa = new t_cocoa_generator(program);
cocoa->generate_program();
delete cocoa;
}
+
if (dump_docs) {
dump_docstrings(program);
}
-
} catch (string s) {
printf("Error: %s\n", s.c_str());
} catch (const char* exc) {
@@ -941,10 +943,10 @@
gen_xsd = true;
} else if (strcmp(arg, "-perl") == 0) {
gen_perl = true;
- } else if (strcmp(arg, "-ocaml") == 0) {
- gen_ocaml = true;
} else if (strcmp(arg, "-erl") == 0) {
gen_erl = true;
+ } else if (strcmp(arg, "-ocaml") == 0) {
+ gen_ocaml = true;
} else if (strcmp(arg, "-hs") == 0) {
gen_hs = true;
} else if (strcmp(arg, "-cocoa") == 0) {
@@ -969,7 +971,7 @@
}
// You gotta generate something!
- if (!gen_cpp && !gen_java && !gen_javabean && !gen_php && !gen_phpi && !gen_py && !gen_rb && !gen_xsd && !gen_perl && !gen_ocaml && !gen_erl && !gen_hs && !gen_cocoa) {
+ if (!gen_cpp && !gen_java && !gen_javabean && !gen_php && !gen_phpi && !gen_py && !gen_rb && !gen_xsd && !gen_perl && !gen_erl && !gen_ocaml && !gen_hs && !gen_cocoa) {
fprintf(stderr, "!!! No output language(s) specified\n\n");
usage();
}