eolian: validate betaness

Summary:
if there is a none beta class, then this class should not depend on beta
classes in parameters / event types / return types, parent inherits.
This adds this validation, so we can start to slowly to unbeta more and
more classes.

Reviewers: q66, zmike, cedric, segfaultxavi

Reviewed By: q66

Subscribers: #reviewers, #committers

Tags: #efl

Differential Revision: https://phab.enlightenment.org/D7999
This commit is contained in:
Marcel Hollerbach 2019-02-25 13:59:51 +01:00 committed by Daniel Kolesa
parent 8d2d5ae3b8
commit d0709d6110
3 changed files with 32 additions and 6 deletions

View File

@ -1,4 +1,4 @@
class Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Layout
class @beta Efl.Ui.Relative_Layout extends Efl.Ui.Widget implements Efl.Pack_Layout
{
[[The relative layout class.

View File

@ -72,6 +72,27 @@ _validate_docstr(Eina_Stringshare *str, const Eolian_Object *info, Eina_List **r
return ret;
}
static Eina_Bool
_class_is_legacy(Eolian_Class *klass)
{
return !!strncmp(klass->base.name, "Efl.", strlen("Efl."));
}
static Eina_Bool
_validate_beta_usage(Eolian_Class *klass, Eolian_Type *type)
{
if (!klass) return EINA_TRUE;
if (_class_is_legacy(klass)) return EINA_TRUE;
if (klass->is_beta) return EINA_TRUE;
if (type->type == EOLIAN_TYPE_CLASS && type->klass->is_beta)
{
_eo_parser_log(&type->base, "beta class used in public API");
return EINA_FALSE;
}
return EINA_TRUE;
}
static Eina_Bool
_validate_doc(Eolian_Documentation *doc)
{
@ -378,10 +399,10 @@ _validate_function(Validate_State *vals, Eolian_Function *func, Eina_Hash *nhash
return EINA_TRUE;
}
if (func->get_ret_type && !_validate_type(vals, func->get_ret_type))
if (func->get_ret_type && (!_validate_type(vals, func->get_ret_type) || !_validate_beta_usage(func->klass, func->get_ret_type)))
return EINA_FALSE;
if (func->set_ret_type && !_validate_type(vals, func->set_ret_type))
if (func->set_ret_type && (!_validate_type(vals, func->set_ret_type) || !_validate_beta_usage(func->klass, func->set_ret_type)))
return EINA_FALSE;
if (func->get_ret_val && !_validate_expr(func->get_ret_val,
@ -394,7 +415,7 @@ _validate_function(Validate_State *vals, Eolian_Function *func, Eina_Hash *nhash
#define EOLIAN_PARAMS_VALIDATE(params) \
EINA_LIST_FOREACH(params, l, param) \
if (!_validate_param(vals, param)) \
if (!_validate_param(vals, param) || !_validate_beta_usage(func->klass, param->type)) \
return EINA_FALSE;
EOLIAN_PARAMS_VALIDATE(func->prop_values);
@ -482,7 +503,7 @@ _validate_event(Validate_State *vals, Eolian_Event *event, Eina_Hash *nhash)
return EINA_TRUE;
}
if (!_validate_type(vals, event->type))
if (!_validate_type(vals, event->type) || !_validate_beta_usage(event->klass, event->type))
return EINA_FALSE;
if (!_validate_doc(event->doc))
@ -1159,6 +1180,11 @@ _validate_class(Validate_State *vals, Eolian_Class *cl,
default:
break;
}
if (!_class_is_legacy(cl) && !cl->is_beta && cl->parent->is_beta)
{
_eo_parser_log(&cl->base, "non-beta class cannot have beta parent");
return EINA_FALSE;
}
if (!_validate_class(vals, cl->parent, nhash, ehash, chash))
return EINA_FALSE;
}

View File

@ -1,4 +1,4 @@
class Efl.App.Test.CML extends Efl.Object implements Efl.Core.Command_Line
class @beta Efl.App.Test.CML extends Efl.Object implements Efl.Core.Command_Line
{
}