eolian: add parsing and generation of hot events

Unfreezable events can now be marked @hot.

@feature
This commit is contained in:
Daniel Kolesa 2016-02-02 17:55:01 +00:00
parent 6eb17b7d3e
commit c95350016d
9 changed files with 63 additions and 13 deletions

View File

@ -621,8 +621,9 @@ eo_source_beginning_generate(const Eolian_Class *class, Eina_Strbuf *buf)
Eina_Stringshare *evname = eolian_event_c_name_get(event);
eina_strbuf_append_printf(tmpbuf,
"EOAPI const Eo_Event_Description _%s =\n EO_EVENT_DESCRIPTION(\"%s\");\n",
evname, eolian_event_name_get(event));
"EOAPI const Eo_Event_Description _%s =\n EO_EVENT_DESCRIPTION%s(\"%s\");\n",
evname, eolian_event_is_hot(event) ? "_HOT" : "",
eolian_event_name_get(event));
eina_stringshare_del(evname);
}
eina_iterator_free(itr);

View File

@ -252,6 +252,8 @@ ffi.cdef [[
const Eolian_Type *eolian_event_type_get(const Eolian_Event *event);
const Eolian_Documentation *eolian_event_documentation_get(const Eolian_Event *event);
Eolian_Object_Scope eolian_event_scope_get(const Eolian_Event *event);
Eina_Bool eolian_event_is_beta(const Eolian_Event *event);
Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
const char *eolian_event_c_name_get(const Eolian_Event *event);
Eina_Bool eolian_class_ctor_enable_get(const Eolian_Class *klass);
Eina_Bool eolian_class_dtor_enable_get(const Eolian_Class *klass);
@ -858,6 +860,14 @@ ffi.metatype("Eolian_Event", {
local v = eolian.eolian_event_c_name_get(self)
if v == nil then return nil end
return ffi_stringshare(v)
end,
is_beta = function(self)
return eolian_event_is_beta(self) ~= 0
end,
is_hot = function(self)
return eolian_event_is_hot(self) ~= 0
end
}
})

View File

@ -1184,6 +1184,16 @@ EAPI Eolian_Object_Scope eolian_event_scope_get(const Eolian_Event *event);
*/
EAPI Eina_Bool eolian_event_is_beta(const Eolian_Event *event);
/*
* @brief Get whether an event is hot (unfreezable).
*
* @param[in] event the event handle
* @return EINA_TRUE and EINA_FALSE respectively
*
* @ingroup Eolian
*/
EAPI Eina_Bool eolian_event_is_hot(const Eolian_Event *event);
/*
* @brief Returns the C name of an event
*

View File

@ -40,6 +40,13 @@ eolian_event_is_beta(const Eolian_Event *event)
return event->is_beta;
}
EAPI Eina_Bool
eolian_event_is_hot(const Eolian_Event *event)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(event, EINA_FALSE);
return event->is_hot;
}
EAPI Eina_Stringshare *
eolian_event_c_name_get(const Eolian_Event *event)
{

View File

@ -30,7 +30,7 @@ enum Tokens
KW(legacy_prefix), KW(methods), KW(mixin), KW(own), KW(params), \
KW(set), KW(type), KW(values), KW(var), KWAT(auto), KWAT(beta), \
KWAT(c_only), KWAT(class), KWAT(const), KWAT(empty), KWAT(extern), \
KWAT(free), KWAT(in), KWAT(inout), KWAT(nonull), KWAT(nullable), \
KWAT(free), KWAT(hot), KWAT(in), KWAT(inout), KWAT(nonull), KWAT(nullable), \
KWAT(optional), KWAT(out), KWAT(private), KWAT(property), \
KWAT(protected), KWAT(virtual), KWAT(warn_unused), \
\

View File

@ -1532,21 +1532,32 @@ parse_event(Eo_Lexer *ls)
}
ev->name = eina_stringshare_add(eina_strbuf_string_get(buf));
pop_strbuf(ls);
if (ls->t.kw == KW_at_private)
Eina_Bool has_scope = EINA_FALSE, has_beta = EINA_FALSE,
has_hot = EINA_FALSE;
for (;;) switch (ls->t.kw)
{
ev->scope = EOLIAN_SCOPE_PRIVATE;
case KW_at_private:
case KW_at_protected:
CASE_LOCK(ls, scope, "scope qualifier")
ev->scope = (ls->t.kw == KW_at_private)
? EOLIAN_SCOPE_PRIVATE
: EOLIAN_SCOPE_PROTECTED;
eo_lexer_get(ls);
}
else if (ls->t.kw == KW_at_protected)
{
ev->scope = EOLIAN_SCOPE_PROTECTED;
eo_lexer_get(ls);
}
if (ls->t.kw == KW_at_beta)
{
break;
case KW_at_beta:
CASE_LOCK(ls, beta, "beta qualifier")
ev->is_beta = EINA_TRUE;
eo_lexer_get(ls);
break;
case KW_at_hot:
CASE_LOCK(ls, hot, "hot qualifier");
ev->is_hot = EINA_TRUE;
eo_lexer_get(ls);
break;
default:
goto end;
}
end:
if (ls->t.token == ':')
{
eo_lexer_get(ls);

View File

@ -210,6 +210,7 @@ struct _Eolian_Event
Eolian_Class *klass;
int scope;
Eina_Bool is_beta :1;
Eina_Bool is_hot :1;
};
struct _Eolian_Struct_Type_Field

View File

@ -2,5 +2,6 @@ class Events {
events {
clicked @beta; [[Comment for clicked]]
clicked,double: Evas_Event_Clicked_Double_Info; /* No comment */
hot @hot;
}
}

View File

@ -118,6 +118,7 @@ START_TEST(eolian_events)
fail_if(eolian_event_type_get(ev));
fail_if(strcmp(name, "clicked"));
fail_if(!eolian_event_is_beta(ev));
fail_if(eolian_event_is_hot(ev));
/* Clicked,double */
fail_if(!(eina_iterator_next(iter, (void**)&ev)));
fail_if(!(name = eolian_event_name_get(ev)));
@ -126,6 +127,14 @@ START_TEST(eolian_events)
type_name = eolian_type_name_get(type);
fail_if(strcmp(type_name, "Evas_Event_Clicked_Double_Info"));
fail_if(eolian_event_is_beta(ev));
fail_if(eolian_event_is_hot(ev));
/* Hot */
fail_if(!(eina_iterator_next(iter, (void**)&ev)));
fail_if(!(name = eolian_event_name_get(ev)));
fail_if(eolian_event_type_get(ev));
fail_if(strcmp(name, "hot"));
fail_if(eolian_event_is_beta(ev));
fail_if(!eolian_event_is_hot(ev));
fail_if(eina_iterator_next(iter, &dummy));
eina_iterator_free(iter);
/* Check eolian_class_event_get_by_name */