diff options
author | Daniel Kolesa <d.kolesa@samsung.com> | 2014-06-20 21:11:21 +0100 |
---|---|---|
committer | Daniel Kolesa <d.kolesa@samsung.com> | 2014-06-20 21:11:21 +0100 |
commit | cc3809d295707ede041f36f92e19042f9c644f55 (patch) | |
tree | 340b32c9cdacf904529e3b957d3baac903bf6684 | |
parent | 43e23492033614096dda88aedc482d0d7c2d0546 (diff) | |
download | efl-cc3809d295707ede041f36f92e19042f9c644f55.tar.gz |
eolian_cxx: support API deduplication like the main generator
-rw-r--r-- | src/bin/eolian_cxx/convert.cc | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/bin/eolian_cxx/convert.cc b/src/bin/eolian_cxx/convert.cc index 0b37ba011f..c33953a658 100644 --- a/src/bin/eolian_cxx/convert.cc +++ b/src/bin/eolian_cxx/convert.cc @@ -15,6 +15,35 @@ #include "comments.hh" static std::string +_dedup_func_name(const std::string &classn, const std::string &funcn) +{ + size_t last_p = classn.rfind('_'); + size_t func_p = funcn.find('_'); + std::string ret; + size_t len; + + if (last_p == std::string::npos) last_p = 0; + else last_p++; + if (func_p == std::string::npos) len = funcn.size(); + else len = func_p; + + if ((classn.size() - last_p) != len + || classn.compare(last_p, len, funcn, 0, len)) + { + ret += classn; + ret += '_'; + ret += funcn; + return ret; + } + + if (last_p) + ret += classn.substr(0, last_p); + + ret += funcn; + return ret; +} + +static std::string _resolve_param_type(Eolian_Function_Parameter id, bool is_get) { Eolian_Parameter_Dir dir; @@ -81,7 +110,7 @@ _get_properties(const Eolian_Class klass) efl::eolian::eo_function getter; getter.type = efl::eolian::eo_function::regular_; getter.name = name + "_get"; - getter.impl = (prefix != "" ? prefix : cxx_classname) + "_" + getter.name; + getter.impl = _dedup_func_name((prefix != "" ? prefix : cxx_classname), getter.name); std::string ret = safe_str (eolian_function_return_type_get(property, EOLIAN_PROP_GET)); if (ret == "") ret = "void"; @@ -126,7 +155,7 @@ _get_properties(const Eolian_Class klass) efl::eolian::eo_function setter; setter.type = efl::eolian::eo_function::regular_; setter.name = name + "_set"; - setter.impl = (prefix != "" ? prefix : cxx_classname) + "_" + setter.name; + setter.impl = _dedup_func_name((prefix != "" ? prefix : cxx_classname), setter.name); setter.params = params; setter.ret = safe_str(eolian_function_return_type_get (property, EOLIAN_PROP_SET)); @@ -214,8 +243,8 @@ convert_eolian_constructors(efl::eolian::eo_class& cls, const Eolian_Class klass { Eolian_Function eolian_constructor = static_cast<Eolian_Function>(curr); efl::eolian::eo_constructor constructor; - constructor.name = (prefix != "" ? prefix : cls.name) + "_" + safe_str - (eolian_function_name_get(eolian_constructor)); + constructor.name = _dedup_func_name((prefix != "" ? prefix : cls.name), + safe_str(eolian_function_name_get(eolian_constructor))); constructor.params = _get_params (eolian_parameters_list_get(eolian_constructor)); constructor.comment = detail::eolian_constructor_comment @@ -240,7 +269,7 @@ convert_eolian_functions(efl::eolian::eo_class& cls, const Eolian_Class klass) // XXX Eolian only provides regular methods so far function.type = efl::eolian::eo_function::regular_; function.name = safe_str(eolian_function_name_get(eolian_function)); - function.impl = ( prefix != "" ? prefix : cls.name ) + "_" + function.name; + function.impl = _dedup_func_name((prefix != "" ? prefix : cls.name), function.name); function.ret = safe_str(eolian_function_return_type_get (eolian_function, EOLIAN_METHOD)); if(function.ret == "") function.ret = "void"; |