jpeg pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=6653b9e2b1196f6d22ad8733bb67bf94b17e0d12
commit 6653b9e2b1196f6d22ad8733bb67bf94b17e0d12 Author: Jean-Philippe Andre <jp.an...@samsung.com> Date: Tue Nov 28 14:17:51 2017 +0900 cxx: Implement support for @class static functions --- src/lib/eolian_cxx/grammar/function_declaration.hpp | 8 ++++++-- src/lib/eolian_cxx/grammar/function_definition.hpp | 20 ++++++++++++++------ src/lib/eolian_cxx/grammar/klass_def.hpp | 6 ++++-- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/lib/eolian_cxx/grammar/function_declaration.hpp b/src/lib/eolian_cxx/grammar/function_declaration.hpp index 04694fa1fb..fe3ad732f1 100644 --- a/src/lib/eolian_cxx/grammar/function_declaration.hpp +++ b/src/lib/eolian_cxx/grammar/function_declaration.hpp @@ -24,7 +24,7 @@ struct function_declaration_generator template <typename OutputIterator, typename Context> bool generate(OutputIterator sink, attributes::function_def const& f, Context const& ctx) const { - std::string suffix; + std::string suffix, static_flag, const_flag; switch(_klass_name.type) { case attributes::class_type::regular: @@ -50,8 +50,12 @@ struct function_declaration_generator .generate(sink, attributes::unused, ctx)) return false; + if (f.is_static) static_flag = "static "; + else const_flag = " const"; + if(!as_generator - (scope_tab << "::efl::eolian::return_traits<" << grammar::type(true) << ">::type " << string << "(" << (parameter % ", ") << ") const;\n") + (scope_tab << static_flag << "::efl::eolian::return_traits<" << grammar::type(true) << ">::type " + << string << "(" << (parameter % ", ") << ")" << const_flag << ";\n") .generate(sink, std::make_tuple(f.return_type, escape_keyword(f.name), f.parameters), ctx)) return false; if(f.is_beta && diff --git a/src/lib/eolian_cxx/grammar/function_definition.hpp b/src/lib/eolian_cxx/grammar/function_definition.hpp index 55f56216fd..1ffbed4bb3 100644 --- a/src/lib/eolian_cxx/grammar/function_definition.hpp +++ b/src/lib/eolian_cxx/grammar/function_definition.hpp @@ -60,9 +60,14 @@ struct function_definition_generator .generate(sink, attributes::unused, ctx)) return false; + std::string const_flag; + if (!f.is_static) const_flag = " const"; + if(!as_generator - ("inline ::efl::eolian::return_traits<" << grammar::type(true) << ">::type " << string << "::" << string << "(" << (parameter % ", ") << ") const\n{\n") - .generate(sink, std::make_tuple(f.return_type, _klass_name.eolian_name, escape_keyword(f.name), f.parameters), ctx)) + ("inline ::efl::eolian::return_traits<" << grammar::type(true) << ">::type " << string << "::" + << string << "(" << (parameter % ", ") << ")" << string << "\n{\n") + .generate(sink, std::make_tuple(f.return_type, _klass_name.eolian_name, + escape_keyword(f.name), f.parameters, const_flag), ctx)) return false; std::vector<std::string> opening_statements(f.opening_statements()); @@ -104,10 +109,13 @@ struct function_definition_generator && !as_generator(attributes::c_type({attributes::parameter_direction::in, f.return_type, ""}) << " __return_value = " ).generate(sink, attributes::unused, ctx)) return false; - + + std::string object_flag; + if (f.is_static) object_flag = "_eo_class()"; + else object_flag = "_eo_ptr()"; + if(!as_generator - (" ::" << string << "(this->_eo_ptr()" - << + (" ::" << string << "(" << string << *( "\n" << scope_tab << scope_tab << ", " << @@ -119,7 +127,7 @@ struct function_definition_generator ) ) << ");\n" - ).generate(sink, std::make_tuple(f.c_name, f.parameters), ctx)) + ).generate(sink, std::make_tuple(f.c_name, object_flag, f.parameters), ctx)) return false; auto out_assignments = diff --git a/src/lib/eolian_cxx/grammar/klass_def.hpp b/src/lib/eolian_cxx/grammar/klass_def.hpp index fc6d62d5b8..b2aae1bbef 100644 --- a/src/lib/eolian_cxx/grammar/klass_def.hpp +++ b/src/lib/eolian_cxx/grammar/klass_def.hpp @@ -439,6 +439,7 @@ struct function_def bool is_beta; bool is_protected; bool is_function_pointer; + bool is_static; friend inline bool operator==(function_def const& lhs, function_def const& rhs) { @@ -449,7 +450,8 @@ struct function_def && lhs.filename == rhs.filename && lhs.is_beta == rhs.is_beta && lhs.is_protected == rhs.is_protected - && lhs.is_function_pointer == rhs.is_function_pointer; + && lhs.is_function_pointer == rhs.is_function_pointer + && lhs.is_static == rhs.is_static; } friend inline bool operator!=(function_def const& lhs, function_def const& rhs) { @@ -531,7 +533,7 @@ struct function_def } is_beta = eolian_function_is_beta(function); is_protected = eolian_function_scope_get(function, type) == EOLIAN_SCOPE_PROTECTED; - is_protected = eolian_function_scope_get(function, type) == EOLIAN_SCOPE_PROTECTED; + is_static = eolian_function_is_class(function); } std::string template_statement() const --