From 19fcd6e60fdb702ea0db4a9884c4822e624ecde4 Mon Sep 17 00:00:00 2001 From: Xavi Artigas Date: Wed, 13 Feb 2019 18:12:59 +0100 Subject: [PATCH] eolian: allow tagging complete classes as BETA Summary: This allows using the @beta tag in classes, like this: class @beta Efl.Foo extends Efl.Bar { ... } This will surround the class definition in the .eo.h file with an EFL_BETA_API_SUPPORT #define, equivalent to tag every method and event with @beta. Test Plan: Nothing changes since no class uses this tag yet Reviewers: q66, bu5hm4n, zmike Reviewed By: q66 Subscribers: cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D7933 --- src/bin/eolian/headers.c | 8 ++++++++ src/lib/eolian/Eolian.h | 10 ++++++++++ src/lib/eolian/database_class_api.c | 7 +++++++ src/lib/eolian/eo_parser.c | 5 +++++ src/lib/eolian/eolian_database.h | 1 + 5 files changed, 31 insertions(+) diff --git a/src/bin/eolian/headers.c b/src/bin/eolian/headers.c index 472043b649..7fbd576082 100644 --- a/src/bin/eolian/headers.c +++ b/src/bin/eolian/headers.c @@ -192,6 +192,10 @@ eo_gen_header_gen(const Eolian_State *state, const Eolian_Class *cl, /* class definition */ + if (!legacy && eolian_class_is_beta(cl)) + { + eina_strbuf_append(buf, "#ifdef EFL_BETA_API_SUPPORT\n"); + } if (!legacy) { const Eolian_Documentation *doc = eolian_class_documentation_get(cl); @@ -298,6 +302,10 @@ events: } eina_iterator_free(itr); } + if (!legacy && eolian_class_is_beta(cl)) + { + eina_strbuf_append(buf, "#endif /* EFL_BETA_API_SUPPORT */\n"); + } free(cname); free(cnameu); diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h index fc28058c6b..0320da2010 100644 --- a/src/lib/eolian/Eolian.h +++ b/src/lib/eolian/Eolian.h @@ -2298,6 +2298,16 @@ EAPI Eina_Stringshare *eolian_class_c_name_get(const Eolian_Class *klass); */ EAPI Eina_Stringshare *eolian_class_c_data_type_get(const Eolian_Class *klass); +/* + * @brief Get whether a class is beta. + * + * @param[in] klass the class + * @return EINA_TRUE if the class has been marked as BETA + * + * @ingroup Eolian + */ +EAPI Eina_Bool eolian_class_is_beta(const Eolian_Class *klass); + /* * @brief Get the type of a type declaration. * diff --git a/src/lib/eolian/database_class_api.c b/src/lib/eolian/database_class_api.c index f79cdb800b..73d013672b 100644 --- a/src/lib/eolian/database_class_api.c +++ b/src/lib/eolian/database_class_api.c @@ -228,3 +228,10 @@ eolian_class_c_data_type_get(const Eolian_Class *cl) *p = '_'; return eina_stringshare_add(buf); } + +EAPI Eina_Bool +eolian_class_is_beta(const Eolian_Class *cl) +{ + EINA_SAFETY_ON_NULL_RETURN_VAL(cl, EINA_FALSE); + return cl->is_beta; +} diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index fe5d153962..4346b3432d 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -2093,6 +2093,11 @@ parse_class(Eo_Lexer *ls, Eolian_Class_Type type) eo_lexer_get(ls); ls->klass->type = type; eo_lexer_context_push(ls); + if (ls->t.kw == KW_at_beta) + { + ls->klass->is_beta = EINA_TRUE; + eo_lexer_get(ls); + } parse_name(ls, buf); bnm = eina_stringshare_ref(ls->filename); fnm = database_class_to_filename(eina_strbuf_string_get(buf)); diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h index d0d7873fdd..b70f2b4f1e 100644 --- a/src/lib/eolian/eolian_database.h +++ b/src/lib/eolian/eolian_database.h @@ -196,6 +196,7 @@ struct _Eolian_Class Eina_List *callables; /* internal for now */ Eina_Bool class_ctor_enable:1; Eina_Bool class_dtor_enable:1; + Eina_Bool is_beta :1; }; struct _Eolian_Function