Eina_Bool warned;
Eina_Bool event_redef;
Eina_Bool unimplemented;
- Eina_Bool pure_virtual;
} Validate_State;
static Eina_Bool
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);
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 */
}
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)
{
int line, col;
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;
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;
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;