q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=375179b47fa62dba2a1168d1e4e6a7ab877f7414

commit 375179b47fa62dba2a1168d1e4e6a7ab877f7414
Author: Daniel Kolesa <[email protected]>
Date:   Thu Jun 9 16:54:43 2016 +0100

    eolian: support @protected for accessors (get/set)
    
    Previously it was only possible to set it for the whole property.
    
    @feature
---
 src/bin/eolian/eo_generator.c          |  2 +-
 src/bindings/luajit/eolian.lua         |  6 +++---
 src/lib/eolian/Eolian.h                |  3 ++-
 src/lib/eolian/database_function_api.c |  9 +++++++--
 src/lib/eolian/eo_parser.c             | 21 +++++++++++++++++----
 src/lib/eolian/eolian_database.h       |  3 ++-
 src/scripts/elua/modules/lualian.lua   | 10 ++++++----
 src/tests/eolian/data/scope.eo         |  2 ++
 src/tests/eolian/eolian_parsing.c      | 21 +++++++++++----------
 9 files changed, 51 insertions(+), 26 deletions(-)

diff --git a/src/bin/eolian/eo_generator.c b/src/bin/eolian/eo_generator.c
index c12975a..cd111dd 100644
--- a/src/bin/eolian/eo_generator.c
+++ b/src/bin/eolian/eo_generator.c
@@ -66,7 +66,7 @@ eo_fundef_generate(const Eolian_Class *class, const 
Eolian_Function *func, Eolia
    Eina_Bool var_as_ret = EINA_FALSE;
    const Eolian_Type *rettypet = NULL;
    const char *rettype = NULL;
-   Eolian_Object_Scope scope = eolian_function_scope_get(func);
+   Eolian_Object_Scope scope = eolian_function_scope_get(func, ftype);
    Eina_Bool is_prop = (ftype == EOLIAN_PROP_GET || ftype == EOLIAN_PROP_SET);
 
    _class_func_env_create(class, eolian_function_name_get(func), ftype, 
&func_env);
diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua
index b31f445..159fc0a 100644
--- a/src/bindings/luajit/eolian.lua
+++ b/src/bindings/luajit/eolian.lua
@@ -210,7 +210,7 @@ ffi.cdef [[
     Eina_Iterator *eolian_class_inherits_get(const Eolian_Class *klass);
     Eina_Iterator *eolian_class_functions_get(const Eolian_Class *klass, 
Eolian_Function_Type func_type);
     Eolian_Function_Type eolian_function_type_get(const Eolian_Function 
*function_id);
-    Eolian_Object_Scope eolian_function_scope_get(const Eolian_Function 
*function_id);
+    Eolian_Object_Scope eolian_function_scope_get(const Eolian_Function 
*function_id, Eolian_Function_Type ftype);
     const char *eolian_function_name_get(const Eolian_Function *function_id);
     const char *eolian_function_full_c_name_get(const Eolian_Function 
*function_id, Eolian_Function_Type ftype, Eina_Bool use_legacy);
     const Eolian_Function *eolian_class_function_get_by_name(const 
Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type);
@@ -706,8 +706,8 @@ M.Function = ffi.metatype("Eolian_Function", {
             return tonumber(eolian.eolian_function_type_get(self))
         end,
 
-        scope_get = function(self)
-            return tonumber(eolian.eolian_function_scope_get(self))
+        scope_get = function(self, ftype)
+            return tonumber(eolian.eolian_function_scope_get(self, ftype))
         end,
 
         name_get = function(self)
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index aa00c7e..1821e46 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -640,11 +640,12 @@ EAPI Eolian_Function_Type eolian_function_type_get(const 
Eolian_Function *functi
  * @brief Returns the scope of a function
  *
  * @param[in] function_id Id of the function
+ * @param[in] ftype The type of function to get the scope for
  * @return the function scope
  *
  * @ingroup Eolian
  */
-EAPI Eolian_Object_Scope eolian_function_scope_get(const Eolian_Function 
*function_id);
+EAPI Eolian_Object_Scope eolian_function_scope_get(const Eolian_Function 
*function_id, Eolian_Function_Type ftype);
 
 /*
  * @brief Returns the name of a function
diff --git a/src/lib/eolian/database_function_api.c 
b/src/lib/eolian/database_function_api.c
index 9cb1177..bf61d44 100644
--- a/src/lib/eolian/database_function_api.c
+++ b/src/lib/eolian/database_function_api.c
@@ -6,10 +6,15 @@
 #include "eolian_database.h"
 
 EAPI Eolian_Object_Scope
-eolian_function_scope_get(const Eolian_Function *fid)
+eolian_function_scope_get(const Eolian_Function *fid, Eolian_Function_Type 
ftype)
 {
    EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EOLIAN_SCOPE_PUBLIC);
-   return fid->scope;
+   switch (ftype)
+     {
+      case EOLIAN_UNRESOLVED: case EOLIAN_METHOD: case EOLIAN_PROPERTY: case 
EOLIAN_PROP_GET: return fid->get_scope; break;
+      case EOLIAN_PROP_SET: return fid->set_scope; break;
+      default: return EOLIAN_SCOPE_PUBLIC;
+     }
 }
 
 EAPI Eolian_Function_Type
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 3176bdb..e6e6f70 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -1123,7 +1123,8 @@ parse_accessor(Eo_Lexer *ls, Eolian_Function *prop)
    int line, col;
    Eina_Bool has_return = EINA_FALSE, has_legacy = EINA_FALSE,
              has_eo     = EINA_FALSE, has_keys   = EINA_FALSE,
-             has_values = EINA_FALSE;
+             has_values = EINA_FALSE, has_protected = EINA_FALSE,
+             has_virtual_pure = EINA_FALSE;
    Eina_Bool is_get = (ls->t.kw == KW_get);
    if (is_get)
      {
@@ -1144,12 +1145,24 @@ parse_accessor(Eo_Lexer *ls, Eolian_Function *prop)
           prop->type = EOLIAN_PROP_SET;
      }
    eo_lexer_get(ls);
-   if (ls->t.kw == KW_at_virtual_pure)
+   for (;;) switch (ls->t.kw)
      {
+      case KW_at_virtual_pure:
+        CASE_LOCK(ls, virtual_pure, "virtual_pure qualifier");
         if (is_get) prop->get_virtual_pure = EINA_TRUE;
         else prop->set_virtual_pure = EINA_TRUE;
         eo_lexer_get(ls);
+        break;
+      case KW_at_protected:
+        CASE_LOCK(ls, protected, "protected qualifier");
+        if (is_get) prop->get_scope = EOLIAN_SCOPE_PROTECTED;
+        else prop->set_scope = EOLIAN_SCOPE_PROTECTED;
+        eo_lexer_get(ls);
+        break;
+      default:
+        goto parse_accessor;
      }
+parse_accessor:
    line = ls->line_number;
    col = ls->column;
    check_next(ls, '{');
@@ -1271,7 +1284,7 @@ parse_property(Eo_Lexer *ls)
      {
       case KW_at_protected:
         CASE_LOCK(ls, protected, "protected qualifier")
-        prop->scope = EOLIAN_SCOPE_PROTECTED;
+        prop->get_scope = prop->set_scope = EOLIAN_SCOPE_PROTECTED;
         eo_lexer_get(ls);
         break;
       case KW_at_class:
@@ -1351,7 +1364,7 @@ parse_method(Eo_Lexer *ls)
      {
       case KW_at_protected:
         CASE_LOCK(ls, protected, "protected qualifier")
-        meth->scope = EOLIAN_SCOPE_PROTECTED;
+        meth->get_scope = meth->set_scope = EOLIAN_SCOPE_PROTECTED;
         eo_lexer_get(ls);
         break;
       case KW_at_const:
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index 8721a56..e461929 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -117,7 +117,8 @@ struct _Eolian_Function
        };
    };
    Eolian_Function_Type type;
-   Eolian_Object_Scope scope;
+   Eolian_Object_Scope get_scope;
+   Eolian_Object_Scope set_scope;
    Eolian_Type *get_ret_type;
    Eolian_Type *set_ret_type;
    Eolian_Expression *get_ret_val;
diff --git a/src/scripts/elua/modules/lualian.lua 
b/src/scripts/elua/modules/lualian.lua
index 8ea6f24..f04779f 100644
--- a/src/scripts/elua/modules/lualian.lua
+++ b/src/scripts/elua/modules/lualian.lua
@@ -626,14 +626,16 @@ local gen_contents = function(klass)
     -- first try properties
     local props = klass:functions_get(func_type.PROPERTY):to_array()
     for i, v in ipairs(props) do
-        if v:scope_get() == obj_scope.PUBLIC and not v:is_c_only() then
+        local gscope = v:scope_get(func_type.PROP_GET)
+        local sscope = v:scope_get(func_type.PROP_SET)
+        if (gscope == obj_scope.PUBLIC or sscope == obj_scope.PUBLIC) and not 
v:is_c_only() then
             local ftype  = v:type_get()
             local fread  = (ftype == func_type.PROPERTY or ftype == 
func_type.PROP_GET)
             local fwrite = (ftype == func_type.PROPERTY or ftype == 
func_type.PROP_SET)
-            if fwrite then
+            if fwrite and sscope == obj_scope.PUBLIC then
                 cnt[#cnt + 1] = Property(v, func_type.PROP_SET)
             end
-            if fread then
+            if fread and gscope == obj_scope.PUBLIC then
                 cnt[#cnt + 1] = Property(v, func_type.PROP_GET)
             end
         end
@@ -641,7 +643,7 @@ local gen_contents = function(klass)
     -- then methods
     local meths = klass:functions_get(func_type.METHOD):to_array()
     for i, v in ipairs(meths) do
-        if v:scope_get() == obj_scope.PUBLIC and not v:is_c_only() then
+        if v:scope_get(func_type.METHOD) == obj_scope.PUBLIC and not 
v:is_c_only() then
             cnt[#cnt + 1] = Method(v)
         end
     end
diff --git a/src/tests/eolian/data/scope.eo b/src/tests/eolian/data/scope.eo
index 726b1bc..def94d1 100644
--- a/src/tests/eolian/data/scope.eo
+++ b/src/tests/eolian/data/scope.eo
@@ -11,6 +11,8 @@ class Scope {
       @property c {
          get {
          }
+         set @protected {
+         }
       }
       foo {
       }
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 9833db3..33befe1 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -516,19 +516,20 @@ START_TEST(eolian_scope)
 
    /* Property scope */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "a", 
EOLIAN_PROPERTY)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_PROPERTY) != 
EOLIAN_SCOPE_PROTECTED);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "b", 
EOLIAN_PROPERTY)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_PROPERTY) != 
EOLIAN_SCOPE_PUBLIC);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "c", 
EOLIAN_PROPERTY)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_PROP_GET) != 
EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_PROP_SET) != 
EOLIAN_SCOPE_PROTECTED);
 
    /* Method scope */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", 
EOLIAN_METHOD)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PUBLIC);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "bar", 
EOLIAN_METHOD)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PROTECTED);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "foobar", 
EOLIAN_METHOD)));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PUBLIC);
 
    eolian_shutdown();
 }
@@ -946,16 +947,16 @@ START_TEST(eolian_class_funcs)
    /* Class methods */
    fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", 
EOLIAN_METHOD)));
    fail_if(!eolian_function_is_class(fid));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PUBLIC);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "bar", 
EOLIAN_METHOD)));
    fail_if(eolian_function_is_class(fid));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PUBLIC);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PUBLIC);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "baz", 
EOLIAN_METHOD)));
    fail_if(!eolian_function_is_class(fid));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PROTECTED);
    fail_if(!(fid = eolian_class_function_get_by_name(class, "bah", 
EOLIAN_METHOD)));
    fail_if(eolian_function_is_class(fid));
-   fail_if(eolian_function_scope_get(fid) != EOLIAN_SCOPE_PROTECTED);
+   fail_if(eolian_function_scope_get(fid, EOLIAN_METHOD) != 
EOLIAN_SCOPE_PROTECTED);
 
    eolian_shutdown();
 }

-- 


Reply via email to