2014-09-01 11:08:49 -07:00
|
|
|
#ifndef EOLIAN_KLASS_HH
|
|
|
|
#define EOLIAN_KLASS_HH
|
|
|
|
|
2016-11-29 10:42:37 -08:00
|
|
|
#include <Eo.hh>
|
2014-09-01 11:08:49 -07:00
|
|
|
#include <Eina.hh>
|
|
|
|
|
|
|
|
#include <eolian/js/domain.hh>
|
|
|
|
|
|
|
|
#include <ostream>
|
|
|
|
|
|
|
|
inline std::string name(Eolian_Class const* klass)
|
|
|
|
{
|
2018-03-12 08:03:37 -07:00
|
|
|
return ::eolian_class_short_name_get(klass);
|
2014-09-01 11:08:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
inline std::string full_name(Eolian_Class const* klass)
|
|
|
|
{
|
2018-03-12 08:03:37 -07:00
|
|
|
return ::eolian_class_name_get(klass);
|
2014-09-01 11:08:49 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
inline std::string full_name_transformed(Eolian_Class const* klass)
|
|
|
|
{
|
|
|
|
auto r = full_name(klass);
|
|
|
|
std::replace(r.begin(), r.end(), '.', '_');
|
|
|
|
return r;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::size_t namespace_size(Eolian_Class const* klass)
|
|
|
|
{
|
|
|
|
std::size_t size = 0;
|
|
|
|
for(efl::eina::iterator<const char> first (::eolian_class_namespaces_get(klass))
|
|
|
|
, last; first != last; ++first)
|
|
|
|
++size;
|
|
|
|
return size;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline std::string type_class_name(Eolian_Type const* tp)
|
|
|
|
{
|
|
|
|
if (tp)
|
|
|
|
{
|
|
|
|
Eolian_Type_Type tpt = ::eolian_type_type_get(tp);
|
|
|
|
{
|
2016-03-14 09:14:37 -07:00
|
|
|
tp = ::eolian_type_aliased_base_get(tp);
|
|
|
|
tpt = ::eolian_type_type_get(tp);
|
|
|
|
if (tpt == EOLIAN_TYPE_CLASS)
|
2014-09-01 11:08:49 -07:00
|
|
|
{
|
2018-01-12 08:33:28 -08:00
|
|
|
Eolian_Class const* klass = ::eolian_type_class_get(tp);
|
2016-03-14 09:14:37 -07:00
|
|
|
if (klass)
|
|
|
|
{
|
2018-03-12 08:03:37 -07:00
|
|
|
Eina_Stringshare* klass_name = ::eolian_class_name_get(klass);
|
2016-03-14 09:14:37 -07:00
|
|
|
if (!klass_name)
|
|
|
|
throw std::runtime_error("Could not get Eo class name");
|
2014-09-01 11:08:49 -07:00
|
|
|
|
2016-03-14 09:14:37 -07:00
|
|
|
return klass_name;
|
|
|
|
} // TODO: else should throw std::runtime_error("Could not get Eo class");
|
|
|
|
}
|
|
|
|
else if (tpt == EOLIAN_TYPE_REGULAR)
|
|
|
|
{
|
|
|
|
auto tpd = eolian_type_typedecl_get(tp);
|
|
|
|
if (tpd && eolian_typedecl_type_get(tpd) == EOLIAN_TYPEDECL_STRUCT)
|
|
|
|
{
|
2018-03-12 08:28:28 -07:00
|
|
|
auto struct_type_full_name = ::eolian_type_name_get(tp);
|
2016-03-14 09:14:37 -07:00
|
|
|
if (!struct_type_full_name)
|
|
|
|
throw std::runtime_error("Could not get struct name");
|
|
|
|
return struct_type_full_name;
|
|
|
|
}
|
|
|
|
}
|
2014-09-01 11:08:49 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return "";
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void print_lower_case_namespace(Eolian_Class const* klass, std::ostream& os)
|
|
|
|
{
|
|
|
|
std::vector<std::string> namespace_;
|
|
|
|
for(efl::eina::iterator<const char> first (::eolian_class_namespaces_get(klass))
|
|
|
|
, last; first != last; ++first)
|
|
|
|
namespace_.push_back(&*first);
|
|
|
|
for(auto first = namespace_.begin(), last = namespace_.end()
|
|
|
|
; first != last; ++first)
|
|
|
|
{
|
|
|
|
std::string lower(*first);
|
|
|
|
std::transform(lower.begin(), lower.end(), lower.begin(), tolower);
|
|
|
|
os << lower;
|
|
|
|
if(std::next(first) != last) os << "::";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
inline void print_eo_class(Eolian_Class const* klass, std::ostream& os)
|
|
|
|
{
|
|
|
|
assert(klass != 0);
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "print_eo_class";
|
|
|
|
|
|
|
|
auto toupper = [] (unsigned char c) { return std::toupper(c); };
|
|
|
|
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "print_eo_class";
|
|
|
|
std::vector<std::string> namespace_;
|
|
|
|
for(efl::eina::iterator<const char> first (::eolian_class_namespaces_get(klass))
|
|
|
|
, last; first != last; ++first)
|
|
|
|
namespace_.push_back(&*first);
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "namespace";
|
|
|
|
namespace_.push_back(name(klass));
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "class";
|
|
|
|
switch(eolian_class_type_get(klass))
|
|
|
|
{
|
|
|
|
case EOLIAN_CLASS_REGULAR:
|
|
|
|
case EOLIAN_CLASS_ABSTRACT:
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
namespace_.push_back("CLASS");
|
|
|
|
break;
|
|
|
|
case EOLIAN_CLASS_INTERFACE:
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
namespace_.push_back("INTERFACE");
|
|
|
|
break;
|
|
|
|
case EOLIAN_CLASS_MIXIN:
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
namespace_.push_back("MIXIN");
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "default ?";
|
|
|
|
std::abort();
|
|
|
|
}
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
for(auto first = namespace_.begin(), last = namespace_.end()
|
|
|
|
; first != last; ++first)
|
|
|
|
{
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
std::string upper(*first);
|
|
|
|
std::transform(upper.begin(), upper.end(), upper.begin(), toupper);
|
|
|
|
os << upper;
|
|
|
|
if(std::next(first) != last) os << "_";
|
|
|
|
}
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "";
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool is_evas(Eolian_Class const* klass)
|
|
|
|
{
|
|
|
|
EINA_CXX_DOM_LOG_WARN(eolian::js::domain) << "is_evas";
|
|
|
|
efl::eina::iterator<const char> first (::eolian_class_namespaces_get(klass));
|
|
|
|
return first != efl::eina::iterator<const char>()
|
|
|
|
&& std::strcmp(&*first, "Evas") == 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|