diff options
author | Daniel Kolesa <daniel@octaforge.org> | 2019-03-08 08:17:01 -0500 |
---|---|---|
committer | Mike Blumenkrantz <zmike@samsung.com> | 2019-03-08 08:17:01 -0500 |
commit | 1a17aff85ffca1cae6d71aa6273e6a8214154276 (patch) | |
tree | 00ab2bc42a75136d4778a8c0c57500072550742e /src/lib/eolian/eo_parser.c | |
parent | 23d0076346e64456280bd9b9c2d1d2659d065fd2 (diff) | |
download | efl-1a17aff85ffca1cae6d71aa6273e6a8214154276.tar.gz |
eolian: add support for marking type declarations beta
Summary:
This also simplifies the beta checking API by unifying it under
objects (makes much more sense that way) and reworks the validator
to have betaness support within its context state, allowing checks
to be done easily in any place.
The betaness checks are disabled for types for the time being,
because otherwise there are too many errors (types are assumed
to be stable as they are not tagged beta, but they reference beta
classes all over the place). Set EOLIAN_TYPEDECL_BETA_WARN to 1
in your environment to force enable the checks.
Reviewers: zmike, bu5hm4n, stefan_schmidt, lauromoura, cedric
Reviewed By: zmike
Subscribers: #reviewers, #committers
Tags: #efl, #eolian
Differential Revision: https://phab.enlightenment.org/D8102
Diffstat (limited to 'src/lib/eolian/eo_parser.c')
-rw-r--r-- | src/lib/eolian/eo_parser.c | 78 |
1 files changed, 61 insertions, 17 deletions
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c index 626e75b2ab..6de91efc15 100644 --- a/src/lib/eolian/eo_parser.c +++ b/src/lib/eolian/eo_parser.c @@ -433,11 +433,12 @@ _struct_field_free(Eolian_Struct_Type_Field *def) static Eolian_Typedecl * parse_struct(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, - int line, int column, const char *freefunc) + Eina_Bool is_beta, int line, int column, const char *freefunc) { int bline = ls->line_number, bcolumn = ls->column; Eolian_Typedecl *def = eo_lexer_typedecl_new(ls); def->is_extern = is_extern; + def->base.is_beta = is_beta; def->base.name = name; def->type = EOLIAN_TYPEDECL_STRUCT; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_struct_field_free)); @@ -491,11 +492,12 @@ _enum_field_free(Eolian_Enum_Type_Field *def) static Eolian_Typedecl * parse_enum(Eo_Lexer *ls, const char *name, Eina_Bool is_extern, - int line, int column) + Eina_Bool is_beta, int line, int column) { int bline = ls->line_number, bcolumn = ls->column; Eolian_Typedecl *def = eo_lexer_typedecl_new(ls); def->is_extern = is_extern; + def->base.is_beta = is_beta; def->base.name = name; def->type = EOLIAN_TYPEDECL_ENUM; def->fields = eina_hash_string_small_new(EINA_FREE_CB(_enum_field_free)); @@ -747,11 +749,23 @@ parse_typedef(Eo_Lexer *ls) Eolian_Typedecl *def = eo_lexer_typedecl_new(ls); Eina_Strbuf *buf; eo_lexer_get(ls); - if (ls->t.kw == KW_at_extern) + Eina_Bool has_extern = EINA_FALSE, has_beta = EINA_FALSE; + for (;;) switch (ls->t.kw) { + case KW_at_extern: + CASE_LOCK(ls, extern, "extern qualifier"); def->is_extern = EINA_TRUE; eo_lexer_get(ls); + break; + case KW_at_beta: + CASE_LOCK(ls, beta, "beta qualifier"); + def->base.is_beta = EINA_TRUE; + eo_lexer_get(ls); + break; + default: + goto tags_done; } +tags_done: def->type = EOLIAN_TYPEDECL_ALIAS; buf = eina_strbuf_new(); eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), buf); @@ -780,11 +794,23 @@ parse_variable(Eo_Lexer *ls, Eina_Bool global) Eolian_Variable *def = eo_lexer_variable_new(ls); Eina_Strbuf *buf; eo_lexer_get(ls); - if (ls->t.kw == KW_at_extern) + Eina_Bool has_extern = EINA_FALSE, has_beta = EINA_FALSE; + for (;;) switch (ls->t.kw) { + case KW_at_extern: + CASE_LOCK(ls, extern, "extern qualifier"); def->is_extern = EINA_TRUE; eo_lexer_get(ls); + break; + case KW_at_beta: + CASE_LOCK(ls, beta, "beta qualifier"); + def->base.is_beta = EINA_TRUE; + eo_lexer_get(ls); + break; + default: + goto tags_done; } +tags_done: def->type = global ? EOLIAN_VAR_GLOBAL : EOLIAN_VAR_CONSTANT; buf = eina_strbuf_new(); eo_lexer_dtor_push(ls, EINA_FREE_CB(eina_strbuf_free), buf); @@ -1189,7 +1215,7 @@ parse_property(Eo_Lexer *ls) break; case KW_at_beta: CASE_LOCK(ls, beta, "beta qualifier"); - prop->is_beta = EINA_TRUE; + prop->base.is_beta = EINA_TRUE; eo_lexer_get(ls); break; case KW_at_pure_virtual: @@ -1255,10 +1281,23 @@ parse_function_pointer(Eo_Lexer *ls) eo_lexer_get(ls); def->type = EOLIAN_TYPEDECL_FUNCTION_POINTER; - def->is_extern = (ls->t.kw == KW_at_extern); - if (def->is_extern) - eo_lexer_get(ls); - + Eina_Bool has_extern = EINA_FALSE, has_beta = EINA_FALSE; + for (;;) switch (ls->t.kw) + { + case KW_at_extern: + CASE_LOCK(ls, extern, "extern qualifier"); + def->is_extern = EINA_TRUE; + eo_lexer_get(ls); + break; + case KW_at_beta: + CASE_LOCK(ls, beta, "beta qualifier"); + def->base.is_beta = EINA_TRUE; + eo_lexer_get(ls); + break; + default: + goto tags_done; + } +tags_done: parse_name(ls, buf); def->base.name = eina_stringshare_add(eina_strbuf_string_get(buf)); eo_lexer_dtor_pop(ls); @@ -1272,8 +1311,8 @@ parse_function_pointer(Eo_Lexer *ls) def->function_pointer = meth; eolian_object_ref(&meth->base); - meth->is_beta = (ls->t.kw == KW_at_beta); - if (meth->is_beta) + meth->base.is_beta = (ls->t.kw == KW_at_beta); + if (meth->base.is_beta) eo_lexer_get(ls); bline = ls->line_number; @@ -1359,7 +1398,7 @@ parse_method(Eo_Lexer *ls) break; case KW_at_beta: CASE_LOCK(ls, beta, "beta qualifier"); - meth->is_beta = EINA_TRUE; + meth->base.is_beta = EINA_TRUE; eo_lexer_get(ls); break; case KW_at_pure_virtual: @@ -1718,7 +1757,7 @@ parse_event(Eo_Lexer *ls) break; case KW_at_beta: CASE_LOCK(ls, beta, "beta qualifier") - ev->is_beta = EINA_TRUE; + ev->base.is_beta = EINA_TRUE; eo_lexer_get(ls); break; case KW_at_hot: @@ -2060,7 +2099,7 @@ parse_class(Eo_Lexer *ls, Eolian_Class_Type type) eo_lexer_context_push(ls); if (ls->t.kw == KW_at_beta) { - ls->klass->is_beta = EINA_TRUE; + ls->klass->base.is_beta = EINA_TRUE; eo_lexer_get(ls); } parse_name(ls, buf); @@ -2212,13 +2251,17 @@ parse_unit(Eo_Lexer *ls, Eina_Bool eot) const char *freefunc = NULL; Eina_Strbuf *buf; eo_lexer_get(ls); - Eina_Bool has_extern = EINA_FALSE, has_free = EINA_FALSE; + Eina_Bool has_extern = EINA_FALSE, has_free = EINA_FALSE, has_beta = EINA_FALSE; for (;;) switch (ls->t.kw) { case KW_at_extern: CASE_LOCK(ls, extern, "@extern qualifier") eo_lexer_get(ls); break; + case KW_at_beta: + CASE_LOCK(ls, beta, "@beta qualifier") + eo_lexer_get(ls); + break; case KW_at_free: { if (is_enum) @@ -2264,6 +2307,7 @@ postparams: { Eolian_Typedecl *def = eo_lexer_typedecl_new(ls); def->is_extern = has_extern; + def->base.is_beta = has_beta; def->type = EOLIAN_TYPEDECL_STRUCT_OPAQUE; if (freefunc) { @@ -2278,9 +2322,9 @@ postparams: break; } if (is_enum) - parse_enum(ls, name, has_extern, line, col); + parse_enum(ls, name, has_extern, has_beta, line, col); else - parse_struct(ls, name, has_extern, line, col, freefunc); + parse_struct(ls, name, has_extern, has_beta, line, col, freefunc); break; } def: |