THRIFT-643. smalltalk: Generated code doesnt load on Squeak3.10.2-7179-basic and PharoCore-1.0-10491rc1 images
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@900660 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_generator.h b/compiler/cpp/src/generate/t_generator.h
index 7514fb1..617015d 100644
--- a/compiler/cpp/src/generate/t_generator.h
+++ b/compiler/cpp/src/generate/t_generator.h
@@ -178,6 +178,14 @@
}
return in;
}
+ /**
+ * Transforms a camel case string to an equivalent one separated by underscores
+ * e.g. aMultiWord -> a_multi_word
+ * someName -> some_name
+ * CamelCase -> camel_case
+ * name -> name
+ * Name -> name
+ */
std::string underscore(std::string in) {
in[0] = tolower(in[0]);
for (size_t i = 1; i < in.size(); ++i) {
@@ -188,6 +196,31 @@
}
return in;
}
+ /**
+ * Transforms a string with words separated by underscores to a camel case equivalent
+ * e.g. a_multi_word -> aMultiWord
+ * some_name -> someName
+ * name -> name
+ */
+ std::string camelcase(std::string in) {
+ std::ostringstream out;
+ bool underscore = false;
+
+ for (size_t i = 0; i < in.size(); i++) {
+ if (in[i] == '_') {
+ underscore = true;
+ continue;
+ }
+ if (underscore) {
+ out << (char) toupper(in[i]);
+ underscore = false;
+ continue;
+ }
+ out << in[i];
+ }
+
+ return out.str();
+ }
/**
* Get the true type behind a series of typedefs.
diff --git a/compiler/cpp/src/generate/t_st_generator.cc b/compiler/cpp/src/generate/t_st_generator.cc
index 1d2d323..2ed76a4 100644
--- a/compiler/cpp/src/generate/t_st_generator.cc
+++ b/compiler/cpp/src/generate/t_st_generator.cc
@@ -124,7 +124,6 @@
std::string client_class_name();
std::string prefix(std::string name);
std::string declare_field(t_field* tfield);
- std::string sanitize(std::string s);
std::string type_name(t_type* ttype);
std::string function_signature(t_function* tfunction);
@@ -495,7 +494,7 @@
if (members.size() > 0) {
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
if (m_iter != members.begin()) out << " ";
- out << sanitize((*m_iter)->get_name());
+ out << camelcase((*m_iter)->get_name());
}
}
@@ -536,7 +535,7 @@
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
st_accessors(out,
capitalize(type_name(tstruct)),
- sanitize((*m_iter)->get_name()),
+ camelcase((*m_iter)->get_name()),
a_type((*m_iter)->get_type()));
}
out << endl;
@@ -706,8 +705,8 @@
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
bool optional = (*fld_iter)->get_req() == t_field::T_OPTIONAL;
- string fname = (*fld_iter)->get_name();
- string accessor = sname + " " + sanitize(fname);
+ string fname = camelcase((*fld_iter)->get_name());
+ string accessor = sname + " " + camelcase(fname);
if (optional) {
out << indent() << accessor << " ifNotNil: [" << endl;
@@ -765,7 +764,7 @@
indent_up();
out << indent() << found << " := true." << endl <<
- indent() << val << " " << sanitize((*fld_iter)->get_name()) << ": " <<
+ indent() << val << " " << camelcase((*fld_iter)->get_name()) << ": " <<
read_val((*fld_iter)->get_type());
indent_down();
@@ -854,10 +853,10 @@
indent_down();
f_ << indent() << "oprot writeStructBegin: " <<
- "(TStruct new name: '" + capitalize(function->get_name()) + "_args')." << endl;
+ "(TStruct new name: '" + capitalize(camelcase(funname)) + "_args')." << endl;
for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
- string fname = (*fld_iter)->get_name();
+ string fname = camelcase((*fld_iter)->get_name());
f_ << indent() << "oprot writeFieldBegin: (TField new name: '" << fname <<
"'; type: " << type_to_enum((*fld_iter)->get_type()) <<
@@ -875,7 +874,7 @@
// We only support receiving TResult structures (so this won't work on the server side)
void t_st_generator::generate_recv_method(t_function* function) {
- string funname = function->get_name();
+ string funname = camelcase(function->get_name());
string signature = function_signature(function);
t_struct result(program_, "TResult");
@@ -911,7 +910,7 @@
out << "\"";
for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) {
- out << (*f_iter)->get_name() << ": " << type_name((*f_iter)->get_type());
+ out << camelcase((*f_iter)->get_name()) << ": " << type_name((*f_iter)->get_type());
if ((f_iter + 1) != fields.end()) {
out << ", ";
}
@@ -945,7 +944,7 @@
"\tcategory: '" << generated_category() << "'!\n\n";
for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
- string funname = (*f_iter)->get_name();
+ string funname = camelcase((*f_iter)->get_name());
string signature = function_signature(*f_iter);
st_method(f_, client_class_name(), signature);
@@ -965,26 +964,6 @@
}
}
-string t_st_generator::sanitize(string s) {
- std::ostringstream out;
- bool underscore = false;
-
- for (unsigned int i = 0; i < s.size(); i++) {
- if (s[i] == '_') {
- underscore = true;
- continue;
- }
- if (underscore) {
- out << (char) toupper(s[i]);
- underscore = false;
- continue;
- }
- out << s[i];
- }
-
- return out.str();
-}
-
/**
* Renders a function signature of the form 'type name(args)'
*
@@ -992,7 +971,7 @@
* @return String of rendered function definition
*/
string t_st_generator::function_signature(t_function* tfunction) {
- return tfunction->get_name() + capitalize(argument_list(tfunction->get_arglist()));
+ return camelcase(tfunction->get_name()) + capitalize(argument_list(tfunction->get_arglist()));
}
/**
@@ -1010,7 +989,8 @@
} else {
result += " ";
}
- result += (*f_iter)->get_name() + ": " + (*f_iter)->get_name();
+ string name = camelcase((*f_iter)->get_name());
+ result += name + ": " + name;
}
return result;
}
diff --git a/lib/st/thrift.st b/lib/st/thrift.st
index 8675e01..fdb66df 100644
--- a/lib/st/thrift.st
+++ b/lib/st/thrift.st
@@ -294,7 +294,6 @@
!TBinaryProtocol methodsFor: 'reading' stamp: 'pc 02/07/2009 19:00'!
readString
-readString
| sz |
sz := self readI32.
^ sz > 0 ifTrue: [(transport read: sz) asString] ifFalse: ['']! !