forked from enlightenment/efl
eolian: disallow pure virtual on non-abstract/mixin classes
This commit is contained in:
parent
203b841eb9
commit
18ab4f2eec
|
@ -13,7 +13,6 @@ typedef struct _Validate_State
|
|||
Eina_Bool warned;
|
||||
Eina_Bool event_redef;
|
||||
Eina_Bool unimplemented;
|
||||
Eina_Bool pure_virtual;
|
||||
} Validate_State;
|
||||
|
||||
static Eina_Bool
|
||||
|
@ -408,48 +407,6 @@ _validate_function(Validate_State *vals, Eolian_Function *func, Eina_Hash *nhash
|
|||
if (!_validate_doc(func->set_return_doc))
|
||||
return EINA_FALSE;
|
||||
|
||||
if (!vals->pure_virtual)
|
||||
goto final;
|
||||
|
||||
Eolian_Implement *impl = func->impl;
|
||||
|
||||
/* pure virtual methods are ok for abstracts/mixins as well as ifaces
|
||||
* in ifaces they are implicit, in regulars and abstracts explicit
|
||||
*/
|
||||
if (!impl || (impl->klass->type != EOLIAN_CLASS_REGULAR))
|
||||
goto final;
|
||||
|
||||
if (func->type == EOLIAN_METHOD && impl->get_pure_virtual)
|
||||
{
|
||||
_eo_parser_log(&func->base,
|
||||
"pure virtual function '%s' in a non-abstract class '%s'",
|
||||
func->base.name, impl->implklass->base.name);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (func->type == EOLIAN_PROPERTY &&
|
||||
impl->get_pure_virtual && impl->set_pure_virtual)
|
||||
{
|
||||
_eo_parser_log(&func->base,
|
||||
"pure virtual property '%s' in a non-abstract class '%s'",
|
||||
func->base.name, impl->implklass->base.name);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (impl->get_pure_virtual)
|
||||
{
|
||||
_eo_parser_log(&func->base,
|
||||
"pure virtual getter '%s' in a non-abstract class '%s'",
|
||||
func->base.name, impl->implklass->base.name);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
else if (impl->set_pure_virtual)
|
||||
{
|
||||
_eo_parser_log(&func->set_base,
|
||||
"pure virtual setter '%s' in a non-abstract class '%s'",
|
||||
func->base.name, impl->implklass->base.name);
|
||||
return EINA_FALSE;
|
||||
}
|
||||
|
||||
final:
|
||||
/* just for now, when dups become errors there will be no need to check */
|
||||
if (!oobj && nhash)
|
||||
eina_hash_add(nhash, &func->base.name, &func->base);
|
||||
|
@ -1262,8 +1219,7 @@ database_validate(const Eolian_Unit *src)
|
|||
Validate_State vals = {
|
||||
EINA_FALSE,
|
||||
!!getenv("EOLIAN_EVENT_REDEF_WARN"),
|
||||
!!getenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN"),
|
||||
!!getenv("EOLIAN_PURE_VIRTUAL_WARN")
|
||||
!!getenv("EOLIAN_CLASS_UNIMPLEMENTED_WARN")
|
||||
};
|
||||
|
||||
/* do an initial pass to refill inherits */
|
||||
|
|
|
@ -1016,6 +1016,13 @@ parse_params(Eo_Lexer *ls, Eina_List **params, Eina_Bool allow_inout,
|
|||
check_match(ls, '}', '{', line, col);
|
||||
}
|
||||
|
||||
static void
|
||||
check_abstract_pure_virtual(Eo_Lexer *ls)
|
||||
{
|
||||
if ((ls->klass->type != EOLIAN_CLASS_ABSTRACT) && (ls->klass->type != EOLIAN_CLASS_MIXIN))
|
||||
eo_lexer_syntax_error(ls, "@pure_virtual only allowed in abstract classes or mixins");
|
||||
}
|
||||
|
||||
static void
|
||||
parse_accessor(Eo_Lexer *ls, Eolian_Function *prop)
|
||||
{
|
||||
|
@ -1047,8 +1054,7 @@ parse_accessor(Eo_Lexer *ls, Eolian_Function *prop)
|
|||
for (;;) switch (ls->t.kw)
|
||||
{
|
||||
case KW_at_pure_virtual:
|
||||
if (ls->klass->type == EOLIAN_CLASS_INTERFACE)
|
||||
eo_lexer_syntax_error(ls, "@pure_virtual is implicit in interfaces");
|
||||
check_abstract_pure_virtual(ls);
|
||||
CASE_LOCK(ls, virtp, "pure_virtual qualifier");
|
||||
if (is_get) prop->impl->get_pure_virtual = EINA_TRUE;
|
||||
else prop->impl->set_pure_virtual = EINA_TRUE;
|
||||
|
@ -1222,8 +1228,7 @@ parse_property(Eo_Lexer *ls)
|
|||
eo_lexer_get(ls);
|
||||
break;
|
||||
case KW_at_pure_virtual:
|
||||
if (ls->klass->type == EOLIAN_CLASS_INTERFACE)
|
||||
eo_lexer_syntax_error(ls, "@pure_virtual is implicit in interfaces");
|
||||
check_abstract_pure_virtual(ls);
|
||||
CASE_LOCK(ls, virtp, "pure_virtual qualifier");
|
||||
eo_lexer_get(ls);
|
||||
break;
|
||||
|
@ -1393,8 +1398,7 @@ parse_method(Eo_Lexer *ls)
|
|||
eo_lexer_get(ls);
|
||||
break;
|
||||
case KW_at_pure_virtual:
|
||||
if (ls->klass->type == EOLIAN_CLASS_INTERFACE)
|
||||
eo_lexer_syntax_error(ls, "@pure_virtual is implicit in interfaces");
|
||||
check_abstract_pure_virtual(ls);
|
||||
CASE_LOCK(ls, virtp, "pure_virtual qualifier");
|
||||
eo_lexer_get(ls);
|
||||
break;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
class Base {
|
||||
abstract Base {
|
||||
methods {
|
||||
@property z {
|
||||
values {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
class nmsp1.nmsp11.class2
|
||||
abstract nmsp1.nmsp11.class2
|
||||
{
|
||||
methods {
|
||||
@property a {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
class Object_Impl extends Base {
|
||||
abstract Object_Impl extends Base {
|
||||
methods {
|
||||
@property a {
|
||||
set {
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
class Override extends Base {
|
||||
abstract Override extends Base {
|
||||
methods {
|
||||
@property a {
|
||||
set @pure_virtual {
|
||||
|
|
|
@ -92,7 +92,7 @@ _override_class_initializer(Efl_Class *klass)
|
|||
static const Efl_Class_Description _override_class_desc = {
|
||||
EO_VERSION,
|
||||
"Override",
|
||||
EFL_CLASS_TYPE_REGULAR,
|
||||
EFL_CLASS_TYPE_REGULAR_NO_INSTANT,
|
||||
sizeof(Override_Data),
|
||||
_override_class_initializer,
|
||||
NULL,
|
||||
|
|
Loading…
Reference in New Issue