summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Kolesa <d.kolesa@osg.samsung.com>2017-01-16 15:51:11 +0100
committerDaniel Kolesa <d.kolesa@osg.samsung.com>2017-01-16 15:55:06 +0100
commit35c5e892695ad4e2169003c0dd2a00db8c1679a4 (patch)
tree0fec985aa08f720b30fa0fbab5181fef6cdb156c /src
parentfbad285eca8bde68de0158395b346bdac25dc3ec (diff)
eolian: remove/add APIs and clean up implements system
As there is no need to have separate is_auto, is_empty and is_pure_virtual for functions and implements (each function has its own base implement by default) I removed the function ones. Instead, I added a way to retrieve a function's base implement so that you can instead do the checks on the implement even when you only have the function. I also moved base implement build directly into the parser instead of the database filler. That allows for significant cleanup. I also removed distinction of implement pointers in Eolian_Function for get and set as implements now always contain an entire thing so the pointer was always the same anyway. Things should still behave more or less the same, but ordering of generated functions has changed because ordering of implements has changed.
Diffstat (limited to 'src')
-rw-r--r--src/bin/eolian/sources.c18
-rw-r--r--src/bindings/luajit/eolian.lua18
-rw-r--r--src/lib/eolian/Eolian.h35
-rw-r--r--src/lib/eolian/database_fill.c124
-rw-r--r--src/lib/eolian/database_function_api.c76
-rw-r--r--src/lib/eolian/eo_parser.c71
-rw-r--r--src/lib/eolian/eolian_database.h9
-rw-r--r--src/scripts/elua/apps/docgen/doctree.lua6
-rw-r--r--src/tests/eolian/data/docs_ref.h26
-rw-r--r--src/tests/eolian/data/docs_ref_legacy.h26
-rw-r--r--src/tests/eolian/data/object_impl_add_ref.c26
-rw-r--r--src/tests/eolian/data/object_impl_ref.c26
-rw-r--r--src/tests/eolian/data/override_ref.c62
-rw-r--r--src/tests/eolian/eolian_parsing.c51
14 files changed, 188 insertions, 386 deletions
diff --git a/src/bin/eolian/sources.c b/src/bin/eolian/sources.c
index aff1f4b432..f264f531a2 100644
--- a/src/bin/eolian/sources.c
+++ b/src/bin/eolian/sources.c
@@ -272,7 +272,7 @@ _gen_func(const Eolian_Class *cl, const Eolian_Function *fid,
272 272
273 Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl); 273 Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl);
274 Eina_Bool impl_need = EINA_TRUE; 274 Eina_Bool impl_need = EINA_TRUE;
275 if (impl_same_class && eolian_function_is_pure_virtual(fid, ftype)) 275 if (impl_same_class && eolian_implement_is_pure_virtual(impl, ftype))
276 impl_need = EINA_FALSE; 276 impl_need = EINA_FALSE;
277 277
278 Eina_Stringshare *rtpn = rtp ? eolian_type_c_type_get(rtp) 278 Eina_Stringshare *rtpn = rtp ? eolian_type_c_type_get(rtp)
@@ -495,14 +495,14 @@ _gen_func(const Eolian_Class *cl, const Eolian_Function *fid,
495 495
496static void 496static void
497_gen_opfunc(const Eolian_Function *fid, Eolian_Function_Type ftype, 497_gen_opfunc(const Eolian_Function *fid, Eolian_Function_Type ftype,
498 Eina_Strbuf *buf, Eina_Bool pinit, 498 Eina_Strbuf *buf, const Eolian_Implement *impl, Eina_Bool pinit,
499 const char *cnamel, const char *ocnamel) 499 const char *cnamel, const char *ocnamel)
500{ 500{
501 Eina_Stringshare *fnm = eolian_function_full_c_name_get(fid, ftype, EINA_FALSE); 501 Eina_Stringshare *fnm = eolian_function_full_c_name_get(fid, ftype, EINA_FALSE);
502 eina_strbuf_append(buf, " EFL_OBJECT_OP_FUNC("); 502 eina_strbuf_append(buf, " EFL_OBJECT_OP_FUNC(");
503 eina_strbuf_append(buf, fnm); 503 eina_strbuf_append(buf, fnm);
504 eina_strbuf_append(buf, ", "); 504 eina_strbuf_append(buf, ", ");
505 if (!ocnamel && eolian_function_is_pure_virtual(fid, ftype)) 505 if (!ocnamel && eolian_implement_is_pure_virtual(impl, ftype))
506 eina_strbuf_append(buf, "NULL),\n"); 506 eina_strbuf_append(buf, "NULL),\n");
507 else 507 else
508 { 508 {
@@ -566,17 +566,17 @@ _gen_initializer(const Eolian_Class *cl, Eina_Strbuf *buf)
566 switch (ftype) 566 switch (ftype)
567 { 567 {
568 case EOLIAN_PROP_GET: 568 case EOLIAN_PROP_GET:
569 _gen_opfunc(fid, EOLIAN_PROP_GET, obuf, found_get, cnamel, ocnamel); 569 _gen_opfunc(fid, EOLIAN_PROP_GET, obuf, imp, found_get, cnamel, ocnamel);
570 break; 570 break;
571 case EOLIAN_PROP_SET: 571 case EOLIAN_PROP_SET:
572 _gen_opfunc(fid, EOLIAN_PROP_SET, obuf, found_set, cnamel, ocnamel); 572 _gen_opfunc(fid, EOLIAN_PROP_SET, obuf, imp, found_set, cnamel, ocnamel);
573 break; 573 break;
574 case EOLIAN_PROPERTY: 574 case EOLIAN_PROPERTY:
575 _gen_opfunc(fid, EOLIAN_PROP_SET, obuf, found_set, cnamel, ocnamel); 575 _gen_opfunc(fid, EOLIAN_PROP_SET, obuf, imp, found_set, cnamel, ocnamel);
576 _gen_opfunc(fid, EOLIAN_PROP_GET, obuf, found_get, cnamel, ocnamel); 576 _gen_opfunc(fid, EOLIAN_PROP_GET, obuf, imp, found_get, cnamel, ocnamel);
577 break; 577 break;
578 default: 578 default:
579 _gen_opfunc(fid, EOLIAN_METHOD, obuf, found_get, cnamel, ocnamel); 579 _gen_opfunc(fid, EOLIAN_METHOD, obuf, imp, found_get, cnamel, ocnamel);
580 break; 580 break;
581 } 581 }
582 582
@@ -840,7 +840,7 @@ _gen_proto(const Eolian_Class *cl, const Eolian_Function *fid,
840 const char *cnamel) 840 const char *cnamel)
841{ 841{
842 Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl); 842 Eina_Bool impl_same_class = (eolian_implement_class_get(impl) == cl);
843 if (impl_same_class && eolian_function_is_pure_virtual(fid, ftype)) 843 if (impl_same_class && eolian_implement_is_pure_virtual(impl, ftype))
844 return; 844 return;
845 845
846 char *ocnamel = NULL; 846 char *ocnamel = NULL;
diff --git a/src/bindings/luajit/eolian.lua b/src/bindings/luajit/eolian.lua
index fb8be5720a..d96b7e690a 100644
--- a/src/bindings/luajit/eolian.lua
+++ b/src/bindings/luajit/eolian.lua
@@ -250,9 +250,7 @@ ffi.cdef [[
250 const Eolian_Function *eolian_class_function_get_by_name(const Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type); 250 const Eolian_Function *eolian_class_function_get_by_name(const Eolian_Class *klass, const char *func_name, Eolian_Function_Type f_type);
251 const char *eolian_function_legacy_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); 251 const char *eolian_function_legacy_get(const Eolian_Function *function_id, Eolian_Function_Type f_type);
252 const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); 252 const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type);
253 Eina_Bool eolian_function_is_pure_virtual(const Eolian_Function *function_id, Eolian_Function_Type f_type); 253 const Eolian_Implement *eolian_function_implement_get(const Eolian_Function *function_id);
254 Eina_Bool eolian_function_is_auto(const Eolian_Function *function_id, Eolian_Function_Type f_type);
255 Eina_Bool eolian_function_is_empty(const Eolian_Function *function_id, Eolian_Function_Type f_type);
256 Eina_Bool eolian_function_is_legacy_only(const Eolian_Function *function_id, Eolian_Function_Type ftype); 254 Eina_Bool eolian_function_is_legacy_only(const Eolian_Function *function_id, Eolian_Function_Type ftype);
257 Eina_Bool eolian_function_is_class(const Eolian_Function *function_id); 255 Eina_Bool eolian_function_is_class(const Eolian_Function *function_id);
258 Eina_Bool eolian_function_is_c_only(const Eolian_Function *function_id); 256 Eina_Bool eolian_function_is_c_only(const Eolian_Function *function_id);
@@ -783,16 +781,10 @@ M.Function = ffi.metatype("Eolian_Function", {
783 return v 781 return v
784 end, 782 end,
785 783
786 is_pure_virtual = function(self, ftype) 784 implement_get = function(self)
787 return eolian.eolian_function_is_pure_virtual(self, ftype) ~= 0 785 local v = eolian.eolian_function_implement_get(self)
788 end, 786 if v == nil then return nil end
789 787 return v
790 is_auto = function(self, ftype)
791 return eolian.eolian_function_is_auto(self, ftype) ~= 0
792 end,
793
794 is_empty = function(self, ftype)
795 return eolian.eolian_function_is_empty(self, ftype) ~= 0
796 end, 788 end,
797 789
798 is_legacy_only = function(self, ftype) 790 is_legacy_only = function(self, ftype)
diff --git a/src/lib/eolian/Eolian.h b/src/lib/eolian/Eolian.h
index b06efeee06..97b28cf177 100644
--- a/src/lib/eolian/Eolian.h
+++ b/src/lib/eolian/Eolian.h
@@ -761,43 +761,14 @@ EAPI Eina_Stringshare *eolian_function_legacy_get(const Eolian_Function *functio
761EAPI const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type); 761EAPI const Eolian_Documentation *eolian_function_documentation_get(const Eolian_Function *function_id, Eolian_Function_Type f_type);
762 762
763/* 763/*
764 * @brief Indicates if a function is pure virtual. 764 * @brief Returns the implement for a function.
765 * 765 *
766 * @param[in] function_id Id of the function 766 * @param[in] function_id Id of the function
767 * @param[in] f_type The function type, for property get/set distinction. 767 * @return the implement or NULL.
768 * @return EINA_TRUE if pure virtual, EINA_FALSE othrewise.
769 *
770 * Acceptable input types are METHOD, PROP_GET and PROP_SET.
771 *
772 * @ingroup Eolian
773 */
774EAPI Eina_Bool eolian_function_is_pure_virtual(const Eolian_Function *function_id, Eolian_Function_Type f_type);
775
776/*
777 * @brief Indicates if a function is auto.
778 *
779 * @param[in] function_id Id of the function
780 * @param[in] f_type The function type, for property get/set distinction.
781 * @return EINA_TRUE if auto, EINA_FALSE othrewise.
782 *
783 * Acceptable input types are METHOD, PROP_GET and PROP_SET.
784 *
785 * @ingroup Eolian
786 */
787EAPI Eina_Bool eolian_function_is_auto(const Eolian_Function *function_id, Eolian_Function_Type f_type);
788
789/*
790 * @brief Indicates if a function is empty.
791 *
792 * @param[in] function_id Id of the function
793 * @param[in] f_type The function type, for property get/set distinction.
794 * @return EINA_TRUE if empty, EINA_FALSE othrewise.
795 *
796 * Acceptable input types are METHOD, PROP_GET and PROP_SET.
797 * 768 *
798 * @ingroup Eolian 769 * @ingroup Eolian
799 */ 770 */
800EAPI Eina_Bool eolian_function_is_empty(const Eolian_Function *function_id, Eolian_Function_Type f_type); 771EAPI const Eolian_Implement *eolian_function_implement_get(const Eolian_Function *function_id);
801 772
802/* 773/*
803 * @brief Indicates if a function is legacy only. 774 * @brief Indicates if a function is legacy only.
diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c
index 11d083e1f7..fb4d1bc0db 100644
--- a/src/lib/eolian/database_fill.c
+++ b/src/lib/eolian/database_fill.c
@@ -30,8 +30,7 @@ _print_linecol(const Eolian_Object *base)
30} 30}
31 31
32static Eina_Bool 32static Eina_Bool
33_get_impl_func(Eolian_Class *cl, Eolian_Implement *impl, 33_get_impl_func(Eolian_Class *cl, Eolian_Implement *impl, Eolian_Function_Type ftype)
34 Eolian_Function_Type ftype, Eolian_Function **foo_id)
35{ 34{
36 size_t imlen = strlen(impl->full_name); 35 size_t imlen = strlen(impl->full_name);
37 char *clbuf = alloca(imlen + 1); 36 char *clbuf = alloca(imlen + 1);
@@ -118,7 +117,6 @@ _get_impl_func(Eolian_Class *cl, Eolian_Implement *impl,
118 return EINA_FALSE; 117 return EINA_FALSE;
119 } 118 }
120 119
121 *foo_id = (Eolian_Function *)fid;
122 impl->foo_id = fid; 120 impl->foo_id = fid;
123 121
124 return EINA_TRUE; 122 return EINA_TRUE;
@@ -128,7 +126,6 @@ _get_impl_func(Eolian_Class *cl, Eolian_Implement *impl,
128static Eina_Bool 126static Eina_Bool
129_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl) 127_db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
130{ 128{
131 Eolian_Function *foo_id;
132 Eolian_Function_Type ftype = EOLIAN_METHOD; 129 Eolian_Function_Type ftype = EOLIAN_METHOD;
133 130
134 if (impl->is_prop_get && impl->is_prop_set) 131 if (impl->is_prop_get && impl->is_prop_set)
@@ -138,135 +135,32 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
138 else if (impl->is_prop_set) 135 else if (impl->is_prop_set)
139 ftype = EOLIAN_PROP_SET; 136 ftype = EOLIAN_PROP_SET;
140 137
141 if (!_get_impl_func(cl, impl, ftype, &foo_id)) 138 return _get_impl_func(cl, impl, ftype);
142 return EINA_FALSE;
143
144 foo_id->get_auto = impl->get_auto;
145 foo_id->set_auto = impl->set_auto;
146 foo_id->get_empty = impl->get_empty;
147 foo_id->set_empty = impl->set_empty;
148 if (foo_id->get_auto || foo_id->get_empty)
149 {
150 if (ftype == EOLIAN_METHOD)
151 foo_id->set_impl = impl;
152 foo_id->get_impl = impl;
153 }
154 if (foo_id->set_auto || foo_id->set_empty)
155 foo_id->set_impl = impl;
156
157 return EINA_TRUE;
158}
159
160static void
161_db_build_implement(Eolian_Class *cl, Eolian_Function *foo_id)
162{
163 if (foo_id->type == EOLIAN_PROP_SET)
164 {
165 if (foo_id->set_impl) return;
166 }
167 else if (foo_id->type == EOLIAN_PROP_GET)
168 {
169 if (foo_id->get_impl) return;
170 }
171 else if (foo_id->get_impl && foo_id->set_impl) return;
172
173 Eolian_Implement *impl = calloc(1, sizeof(Eolian_Implement));
174
175 if (foo_id->type == EOLIAN_PROP_SET)
176 impl->base = foo_id->set_base;
177 else
178 impl->base = foo_id->base;
179 eina_stringshare_ref(impl->base.file);
180
181 impl->klass = cl;
182 impl->foo_id = foo_id;
183 impl->full_name = eina_stringshare_printf("%s.%s", cl->full_name,
184 foo_id->name);
185
186 if (foo_id->type == EOLIAN_PROPERTY)
187 {
188 if (foo_id->get_pure_virtual && !foo_id->get_impl)
189 {
190 impl->get_pure_virtual = EINA_TRUE;
191 impl->is_prop_get = EINA_TRUE;
192 foo_id->get_impl = impl;
193 cl->implements = eina_list_append(cl->implements, impl);
194 /* repeat for set */
195 _db_build_implement(cl, foo_id);
196 return;
197 }
198 else if (foo_id->set_pure_virtual && !foo_id->set_impl)
199 {
200 impl->set_pure_virtual = EINA_TRUE;
201 impl->is_prop_set = EINA_TRUE;
202 foo_id->set_impl = impl;
203 cl->implements = eina_list_append(cl->implements, impl);
204 /* repeat for get */
205 _db_build_implement(cl, foo_id);
206 return;
207 }
208 if (foo_id->get_impl)
209 {
210 impl->is_prop_set = EINA_TRUE;
211 impl->set_pure_virtual = foo_id->set_pure_virtual;
212 foo_id->set_impl = impl;
213 }
214 else if (foo_id->set_impl)
215 {
216 impl->is_prop_get = EINA_TRUE;
217 foo_id->get_impl = impl;
218 }
219 else
220 foo_id->get_impl = foo_id->set_impl = impl;
221 }
222 else if (foo_id->type == EOLIAN_PROP_SET)
223 {
224 impl->is_prop_set = EINA_TRUE;
225 impl->get_pure_virtual = foo_id->get_pure_virtual;
226 foo_id->set_impl = impl;
227 }
228 else if (foo_id->type == EOLIAN_PROP_GET)
229 {
230 impl->is_prop_get = EINA_TRUE;
231 impl->get_pure_virtual = foo_id->set_pure_virtual;
232 foo_id->get_impl = impl;
233 }
234 else
235 {
236 impl->get_pure_virtual = foo_id->get_pure_virtual;
237 foo_id->get_impl = foo_id->set_impl = impl;
238 }
239
240 cl->implements = eina_list_append(cl->implements, impl);
241} 139}
242 140
243static Eina_Bool 141static Eina_Bool
244_db_fill_implements(Eolian_Class *cl) 142_db_fill_implements(Eolian_Class *cl)
245{ 143{
246 Eolian_Implement *impl; 144 Eolian_Implement *impl;
247 Eolian_Function *foo_id;
248 Eina_List *l; 145 Eina_List *l;
249 146
250 Eina_Hash *th = eina_hash_string_small_new(NULL); 147 Eina_Hash *th = eina_hash_string_small_new(NULL),
148 *pth = eina_hash_string_small_new(NULL);
251 EINA_LIST_FOREACH(cl->implements, l, impl) 149 EINA_LIST_FOREACH(cl->implements, l, impl)
252 { 150 {
253 if (eina_hash_find(th, impl->full_name)) 151 Eina_Bool prop = (impl->is_prop_get || impl->is_prop_set);
152 if (eina_hash_find(prop ? pth : th, impl->full_name))
254 { 153 {
255 _print_linecol(&impl->base); 154 _print_linecol(&impl->base);
256 fprintf(stderr, "duplicate implement '%s'\n", impl->full_name); 155 fprintf(stderr, "duplicate implement '%s'\n", impl->full_name);
257 return EINA_FALSE; 156 return EINA_FALSE;
258 } 157 }
259 if (!_db_fill_implement(cl, impl)) 158 if ((impl->klass != cl) && !_db_fill_implement(cl, impl))
260 return EINA_FALSE; 159 return EINA_FALSE;
261 eina_hash_add(th, impl->full_name, impl->full_name); 160 eina_hash_add(prop ? pth : th, impl->full_name, impl->full_name);
262 } 161 }
263 eina_hash_free(th); 162 eina_hash_free(th);
264 163 eina_hash_free(pth);
265 EINA_LIST_FOREACH(cl->properties, l, foo_id)
266 _db_build_implement(cl, foo_id);
267
268 EINA_LIST_FOREACH(cl->methods, l, foo_id)
269 _db_build_implement(cl, foo_id);
270 164
271 return EINA_TRUE; 165 return EINA_TRUE;
272} 166}
diff --git a/src/lib/eolian/database_function_api.c b/src/lib/eolian/database_function_api.c
index 479141af35..1ad2a3ab91 100644
--- a/src/lib/eolian/database_function_api.c
+++ b/src/lib/eolian/database_function_api.c
@@ -196,79 +196,11 @@ eolian_function_documentation_get(const Eolian_Function *fid, Eolian_Function_Ty
196 } 196 }
197} 197}
198 198
199EAPI Eina_Bool 199EAPI const Eolian_Implement *
200eolian_function_is_pure_virtual(const Eolian_Function *fid, Eolian_Function_Type ftype) 200eolian_function_implement_get(const Eolian_Function *fid)
201{ 201{
202 EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE); 202 EINA_SAFETY_ON_NULL_RETURN_VAL(fid, NULL);
203 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_FALSE); 203 return fid->impl;
204 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_FALSE);
205 switch (ftype)
206 {
207 case EOLIAN_METHOD:
208 if (fid->type != EOLIAN_METHOD)
209 return EINA_FALSE;
210 return fid->get_pure_virtual;
211 case EOLIAN_PROP_GET:
212 if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
213 return EINA_FALSE;
214 return fid->get_pure_virtual;
215 case EOLIAN_PROP_SET:
216 if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
217 return EINA_FALSE;
218 return fid->set_pure_virtual;
219 default:
220 return EINA_FALSE;
221 }
222}
223
224EAPI Eina_Bool
225eolian_function_is_auto(const Eolian_Function *fid, Eolian_Function_Type ftype)
226{
227 EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
228 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_FALSE);
229 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_FALSE);
230 switch (ftype)
231 {
232 case EOLIAN_METHOD:
233 if (fid->type != EOLIAN_METHOD)
234 return EINA_FALSE;
235 return fid->get_auto;
236 case EOLIAN_PROP_GET:
237 if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
238 return EINA_FALSE;
239 return fid->get_auto;
240 case EOLIAN_PROP_SET:
241 if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
242 return EINA_FALSE;
243 return fid->set_auto;
244 default:
245 return EINA_FALSE;
246 }
247}
248
249EAPI Eina_Bool
250eolian_function_is_empty(const Eolian_Function *fid, Eolian_Function_Type ftype)
251{
252 EINA_SAFETY_ON_NULL_RETURN_VAL(fid, EINA_FALSE);
253 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_UNRESOLVED, EINA_FALSE);
254 EINA_SAFETY_ON_FALSE_RETURN_VAL(ftype != EOLIAN_PROPERTY, EINA_FALSE);
255 switch (ftype)
256 {
257 case EOLIAN_METHOD:
258 if (fid->type != EOLIAN_METHOD)
259 return EINA_FALSE;
260 return fid->get_empty;
261 case EOLIAN_PROP_GET:
262 if ((fid->type != EOLIAN_PROP_GET) && (fid->type != EOLIAN_PROPERTY))
263 return EINA_FALSE;
264 return fid->get_empty;
265 case EOLIAN_PROP_SET:
266 if ((fid->type != EOLIAN_PROP_SET) && (fid->type != EOLIAN_PROPERTY))
267 return EINA_FALSE;
268 return fid->set_empty;
269 default:
270 return EINA_FALSE;
271 }
272} 204}
273 205
274EAPI Eina_Bool 206EAPI Eina_Bool
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index eaa28b7359..5dd8376cc8 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -1191,8 +1191,8 @@ parse_accessor(Eo_Lexer *ls, Eolian_Function *prop)
1191 { 1191 {
1192 case KW_at_pure_virtual: 1192 case KW_at_pure_virtual:
1193 CASE_LOCK(ls, virtp, "pure_virtual qualifier"); 1193 CASE_LOCK(ls, virtp, "pure_virtual qualifier");
1194 if (is_get) prop->get_pure_virtual = EINA_TRUE; 1194 if (is_get) prop->impl->get_pure_virtual = EINA_TRUE;
1195 else prop->set_pure_virtual = EINA_TRUE; 1195 else prop->impl->set_pure_virtual = EINA_TRUE;
1196 eo_lexer_get(ls); 1196 eo_lexer_get(ls);
1197 break; 1197 break;
1198 case KW_at_protected: 1198 case KW_at_protected:
@@ -1297,11 +1297,11 @@ _func_pure_virtual_set(Eo_Lexer *ls, Eolian_Function *foo_id, Eina_Bool virt)
1297 return; 1297 return;
1298 1298
1299 if (foo_id->type == EOLIAN_PROP_GET || foo_id->type == EOLIAN_METHOD) 1299 if (foo_id->type == EOLIAN_PROP_GET || foo_id->type == EOLIAN_METHOD)
1300 foo_id->get_pure_virtual = EINA_TRUE; 1300 foo_id->impl->get_pure_virtual = EINA_TRUE;
1301 else if (foo_id->type == EOLIAN_PROP_SET) 1301 else if (foo_id->type == EOLIAN_PROP_SET)
1302 foo_id->set_pure_virtual = EINA_TRUE; 1302 foo_id->impl->set_pure_virtual = EINA_TRUE;
1303 else if (foo_id->type == EOLIAN_PROPERTY) 1303 else if (foo_id->type == EOLIAN_PROPERTY)
1304 foo_id->get_pure_virtual = foo_id->set_pure_virtual = EINA_TRUE; 1304 foo_id->impl->get_pure_virtual = foo_id->impl->set_pure_virtual = EINA_TRUE;
1305} 1305}
1306 1306
1307static void 1307static void
@@ -1309,6 +1309,7 @@ parse_property(Eo_Lexer *ls)
1309{ 1309{
1310 int line, col; 1310 int line, col;
1311 Eolian_Function *prop = NULL; 1311 Eolian_Function *prop = NULL;
1312 Eolian_Implement *impl = NULL;
1312 Eina_Bool has_get = EINA_FALSE, has_set = EINA_FALSE, 1313 Eina_Bool has_get = EINA_FALSE, has_set = EINA_FALSE,
1313 has_keys = EINA_FALSE, has_values = EINA_FALSE, 1314 has_keys = EINA_FALSE, has_values = EINA_FALSE,
1314 has_protected = EINA_FALSE, has_class = EINA_FALSE, 1315 has_protected = EINA_FALSE, has_class = EINA_FALSE,
@@ -1319,7 +1320,13 @@ parse_property(Eo_Lexer *ls)
1319 prop->type = EOLIAN_UNRESOLVED; 1320 prop->type = EOLIAN_UNRESOLVED;
1320 prop->get_scope = prop->set_scope = EOLIAN_SCOPE_PUBLIC; 1321 prop->get_scope = prop->set_scope = EOLIAN_SCOPE_PUBLIC;
1321 FILL_BASE(prop->base, ls, ls->line_number, ls->column); 1322 FILL_BASE(prop->base, ls, ls->line_number, ls->column);
1323 impl = calloc(1, sizeof(Eolian_Implement));
1324 impl->klass = ls->tmp.kls;
1325 impl->foo_id = prop;
1326 FILL_BASE(impl->base, ls, ls->line_number, ls->column);
1327 prop->impl = impl;
1322 ls->tmp.kls->properties = eina_list_append(ls->tmp.kls->properties, prop); 1328 ls->tmp.kls->properties = eina_list_append(ls->tmp.kls->properties, prop);
1329 ls->tmp.kls->implements = eina_list_append(ls->tmp.kls->implements, impl);
1323 check(ls, TOK_VALUE); 1330 check(ls, TOK_VALUE);
1324 if (ls->t.kw == KW_get || ls->t.kw == KW_set) 1331 if (ls->t.kw == KW_get || ls->t.kw == KW_set)
1325 { 1332 {
@@ -1327,6 +1334,7 @@ parse_property(Eo_Lexer *ls)
1327 return; 1334 return;
1328 } 1335 }
1329 prop->name = eina_stringshare_ref(ls->t.value.s); 1336 prop->name = eina_stringshare_ref(ls->t.value.s);
1337 impl->full_name = eina_stringshare_printf("%s.%s", ls->tmp.kls->full_name, prop->name);
1330 eo_lexer_get(ls); 1338 eo_lexer_get(ls);
1331 for (;;) switch (ls->t.kw) 1339 for (;;) switch (ls->t.kw)
1332 { 1340 {
@@ -1366,10 +1374,12 @@ body:
1366 { 1374 {
1367 case KW_get: 1375 case KW_get:
1368 CASE_LOCK(ls, get, "get definition") 1376 CASE_LOCK(ls, get, "get definition")
1377 impl->is_prop_get = EINA_TRUE;
1369 parse_accessor(ls, prop); 1378 parse_accessor(ls, prop);
1370 break; 1379 break;
1371 case KW_set: 1380 case KW_set:
1372 CASE_LOCK(ls, set, "set definition") 1381 CASE_LOCK(ls, set, "set definition")
1382 impl->is_prop_set = EINA_TRUE;
1373 parse_accessor(ls, prop); 1383 parse_accessor(ls, prop);
1374 break; 1384 break;
1375 case KW_keys: 1385 case KW_keys:
@@ -1386,7 +1396,10 @@ body:
1386end: 1396end:
1387 check_match(ls, '}', '{', line, col); 1397 check_match(ls, '}', '{', line, col);
1388 if (!has_get && !has_set) 1398 if (!has_get && !has_set)
1389 prop->type = EOLIAN_PROPERTY; 1399 {
1400 prop->type = EOLIAN_PROPERTY;
1401 impl->is_prop_get = impl->is_prop_set = EINA_TRUE;
1402 }
1390 _func_pure_virtual_set(ls, prop, has_virtp); 1403 _func_pure_virtual_set(ls, prop, has_virtp);
1391} 1404}
1392 1405
@@ -1395,6 +1408,7 @@ parse_method(Eo_Lexer *ls)
1395{ 1408{
1396 int line, col; 1409 int line, col;
1397 Eolian_Function *meth = NULL; 1410 Eolian_Function *meth = NULL;
1411 Eolian_Implement *impl = NULL;
1398 Eina_Bool has_const = EINA_FALSE, has_params = EINA_FALSE, 1412 Eina_Bool has_const = EINA_FALSE, has_params = EINA_FALSE,
1399 has_return = EINA_FALSE, has_legacy = EINA_FALSE, 1413 has_return = EINA_FALSE, has_legacy = EINA_FALSE,
1400 has_protected = EINA_FALSE, has_class = EINA_FALSE, 1414 has_protected = EINA_FALSE, has_class = EINA_FALSE,
@@ -1405,7 +1419,13 @@ parse_method(Eo_Lexer *ls)
1405 meth->type = EOLIAN_METHOD; 1419 meth->type = EOLIAN_METHOD;
1406 meth->get_scope = meth->set_scope = EOLIAN_SCOPE_PUBLIC; 1420 meth->get_scope = meth->set_scope = EOLIAN_SCOPE_PUBLIC;
1407 FILL_BASE(meth->base, ls, ls->line_number, ls->column); 1421 FILL_BASE(meth->base, ls, ls->line_number, ls->column);
1422 impl = calloc(1, sizeof(Eolian_Implement));
1423 impl->klass = ls->tmp.kls;
1424 impl->foo_id = meth;
1425 FILL_BASE(impl->base, ls, ls->line_number, ls->column);
1426 meth->impl = impl;
1408 ls->tmp.kls->methods = eina_list_append(ls->tmp.kls->methods, meth); 1427 ls->tmp.kls->methods = eina_list_append(ls->tmp.kls->methods, meth);
1428 ls->tmp.kls->implements = eina_list_append(ls->tmp.kls->implements, impl);
1409 check(ls, TOK_VALUE); 1429 check(ls, TOK_VALUE);
1410 if (ls->t.kw == KW_get || ls->t.kw == KW_set) 1430 if (ls->t.kw == KW_get || ls->t.kw == KW_set)
1411 { 1431 {
@@ -1413,6 +1433,7 @@ parse_method(Eo_Lexer *ls)
1413 return; 1433 return;
1414 } 1434 }
1415 meth->name = eina_stringshare_ref(ls->t.value.s); 1435 meth->name = eina_stringshare_ref(ls->t.value.s);
1436 impl->full_name = eina_stringshare_printf("%s.%s", ls->tmp.kls->full_name, meth->name);
1416 eo_lexer_get(ls); 1437 eo_lexer_get(ls);
1417 for (;;) switch (ls->t.kw) 1438 for (;;) switch (ls->t.kw)
1418 { 1439 {
@@ -1515,9 +1536,6 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
1515 check_next(ls, ';'); 1536 check_next(ls, ';');
1516 return; 1537 return;
1517 } 1538 }
1518 impl = calloc(1, sizeof(Eolian_Implement));
1519 FILL_BASE(impl->base, ls, iline, icol);
1520 ls->tmp.kls->implements = eina_list_append(ls->tmp.kls->implements, impl);
1521 Eina_Bool glob_auto = EINA_FALSE, glob_empty = EINA_FALSE; 1539 Eina_Bool glob_auto = EINA_FALSE, glob_empty = EINA_FALSE;
1522 switch (ls->t.kw) 1540 switch (ls->t.kw)
1523 { 1541 {
@@ -1537,12 +1555,29 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
1537 eo_lexer_get(ls); 1555 eo_lexer_get(ls);
1538 if (ls->t.token != TOK_VALUE) 1556 if (ls->t.token != TOK_VALUE)
1539 eo_lexer_syntax_error(ls, "name expected"); 1557 eo_lexer_syntax_error(ls, "name expected");
1540 impl->full_name = eina_stringshare_printf("%s.%s", 1558 Eina_Stringshare *iname = eina_stringshare_printf("%s.%s",
1541 ls->tmp.kls->full_name, 1559 ls->tmp.kls->full_name,
1542 ls->t.value.s); 1560 ls->t.value.s);
1561 Eina_List *l;
1562 Eolian_Implement *fimp;
1563 EINA_LIST_FOREACH(ls->tmp.kls->implements, l, fimp)
1564 if (iname == fimp->full_name)
1565 {
1566 impl = fimp;
1567 break;
1568 }
1569 eina_stringshare_del(iname);
1570 if (!impl)
1571 eo_lexer_syntax_error(ls, "implement of non-existent function");
1543 eo_lexer_get(ls); 1572 eo_lexer_get(ls);
1544 goto propbeg; 1573 goto propbeg;
1545 } 1574 }
1575 else
1576 {
1577 impl = calloc(1, sizeof(Eolian_Implement));
1578 FILL_BASE(impl->base, ls, iline, icol);
1579 ls->tmp.kls->implements = eina_list_append(ls->tmp.kls->implements, impl);
1580 }
1546 if (ls->t.token != TOK_VALUE) 1581 if (ls->t.token != TOK_VALUE)
1547 eo_lexer_syntax_error(ls, "class name expected"); 1582 eo_lexer_syntax_error(ls, "class name expected");
1548 buf = push_strbuf(ls); 1583 buf = push_strbuf(ls);
@@ -1620,13 +1655,11 @@ propend:
1620 check_next(ls, '}'); 1655 check_next(ls, '}');
1621 } 1656 }
1622 else 1657 else
1623 { 1658 check_next(ls, ';');
1624 if (glob_auto) 1659 if (glob_auto)
1625 impl->get_auto = impl->set_auto = EINA_TRUE; 1660 impl->get_auto = impl->set_auto = EINA_TRUE;
1626 if (glob_empty) 1661 if (glob_empty)
1627 impl->get_empty = impl->set_empty = EINA_TRUE; 1662 impl->get_empty = impl->set_empty = EINA_TRUE;
1628 check_next(ls, ';');
1629 }
1630end: 1663end:
1631 if (buf) 1664 if (buf)
1632 { 1665 {
diff --git a/src/lib/eolian/eolian_database.h b/src/lib/eolian/eolian_database.h
index eeace389d6..9040262113 100644
--- a/src/lib/eolian/eolian_database.h
+++ b/src/lib/eolian/eolian_database.h
@@ -123,8 +123,7 @@ struct _Eolian_Function
123 Eolian_Type *set_ret_type; 123 Eolian_Type *set_ret_type;
124 Eolian_Expression *get_ret_val; 124 Eolian_Expression *get_ret_val;
125 Eolian_Expression *set_ret_val; 125 Eolian_Expression *set_ret_val;
126 Eolian_Implement *get_impl; 126 Eolian_Implement *impl;
127 Eolian_Implement *set_impl;
128 Eina_Stringshare *get_legacy; 127 Eina_Stringshare *get_legacy;
129 Eina_Stringshare *set_legacy; 128 Eina_Stringshare *set_legacy;
130 Eolian_Documentation *common_doc; 129 Eolian_Documentation *common_doc;
@@ -133,12 +132,6 @@ struct _Eolian_Function
133 Eolian_Documentation *get_return_doc; 132 Eolian_Documentation *get_return_doc;
134 Eolian_Documentation *set_return_doc; 133 Eolian_Documentation *set_return_doc;
135 Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful for a few methods. */ 134 Eina_Bool obj_is_const :1; /* True if the object has to be const. Useful for a few methods. */
136 Eina_Bool get_pure_virtual :1;
137 Eina_Bool set_pure_virtual :1;
138 Eina_Bool get_auto :1;
139 Eina_Bool set_auto :1;
140 Eina_Bool get_empty :1;
141 Eina_Bool set_empty :1;
142 Eina_Bool get_return_warn_unused :1; /* also used for methods */ 135 Eina_Bool get_return_warn_unused :1; /* also used for methods */
143 Eina_Bool set_return_warn_unused :1; 136 Eina_Bool set_return_warn_unused :1;
144 Eina_Bool get_only_legacy: 1; 137 Eina_Bool get_only_legacy: 1;
diff --git a/src/scripts/elua/apps/docgen/doctree.lua b/src/scripts/elua/apps/docgen/doctree.lua
index 0bb9c75a06..b5d81ee579 100644
--- a/src/scripts/elua/apps/docgen/doctree.lua
+++ b/src/scripts/elua/apps/docgen/doctree.lua
@@ -322,15 +322,15 @@ M.Function = Node:clone {
322 end, 322 end,
323 323
324 is_pure_virtual = function(self, ft) 324 is_pure_virtual = function(self, ft)
325 return self.func:is_pure_virtual(ft) 325 return self.func:implement_get():is_pure_virtual(ft)
326 end, 326 end,
327 327
328 is_auto = function(self, ft) 328 is_auto = function(self, ft)
329 return self.func:is_auto(ft) 329 return self.func:implement_get():is_auto(ft)
330 end, 330 end,
331 331
332 is_empty = function(self, ft) 332 is_empty = function(self, ft)
333 return self.func:is_empty(ft) 333 return self.func:implement_get():is_empty(ft)
334 end, 334 end,
335 335
336 is_legacy_only = function(self, ft) 336 is_legacy_only = function(self, ft)
diff --git a/src/tests/eolian/data/docs_ref.h b/src/tests/eolian/data/docs_ref.h
index 8f25fd72ed..bd9224efbd 100644
--- a/src/tests/eolian/data/docs_ref.h
+++ b/src/tests/eolian/data/docs_ref.h
@@ -86,45 +86,45 @@ typedef struct _Opaque Opaque;
86EWAPI const Efl_Class *docs_class_get(void); 86EWAPI const Efl_Class *docs_class_get(void);
87 87
88/** 88/**
89 * @brief Property common documentation. 89 * @brief Method documentation.
90 * 90 *
91 * Set documentation. 91 * @param[in] a Param documentation.
92 * @param[out] b
93 * @param[out] c Another param documentation.
92 * 94 *
93 * @param[in] val Value documentation. 95 * @return Return documentation.
94 * 96 *
95 * @since 1.18 97 * @since 1.18
96 * 98 *
97 * @ingroup Docs 99 * @ingroup Docs
98 */ 100 */
99EOAPI void docs_prop_set(Eo *obj, int val); 101EOAPI int docs_meth(Eo *obj, int a, float *b, long *c);
100 102
101/** 103/**
102 * @brief Property common documentation. 104 * @brief Property common documentation.
103 * 105 *
104 * Get documentation. 106 * Set documentation.
105 * 107 *
106 * @return Value documentation. 108 * @param[in] val Value documentation.
107 * 109 *
108 * @since 1.18 110 * @since 1.18
109 * 111 *
110 * @ingroup Docs 112 * @ingroup Docs
111 */ 113 */
112EOAPI int docs_prop_get(const Eo *obj); 114EOAPI void docs_prop_set(Eo *obj, int val);
113 115
114/** 116/**
115 * @brief Method documentation. 117 * @brief Property common documentation.
116 * 118 *
117 * @param[in] a Param documentation. 119 * Get documentation.
118 * @param[out] b
119 * @param[out] c Another param documentation.
120 * 120 *
121 * @return Return documentation. 121 * @return Value documentation.
122 * 122 *
123 * @since 1.18 123 * @since 1.18
124 * 124 *
125 * @ingroup Docs 125 * @ingroup Docs
126 */ 126 */
127EOAPI int docs_meth(Eo *obj, int a, float *b, long *c); 127EOAPI int docs_prop_get(const Eo *obj);
128 128
129EWAPI extern const Efl_Event_Description _DOCS_EVENT_CLICKED; 129EWAPI extern const Efl_Event_Description _DOCS_EVENT_CLICKED;
130 130
diff --git a/src/tests/eolian/data/docs_ref_legacy.h b/src/tests/eolian/data/docs_ref_legacy.h
index 529326c5d7..5d3849ac36 100644
--- a/src/tests/eolian/data/docs_ref_legacy.h
+++ b/src/tests/eolian/data/docs_ref_legacy.h
@@ -72,44 +72,44 @@ typedef struct _Opaque Opaque;
72#endif 72#endif
73 73
74/** 74/**
75 * @brief Property common documentation. 75 * @brief Method documentation.
76 * 76 *
77 * Set documentation. 77 * @param[in] a Param documentation.
78 * @param[out] b
79 * @param[out] c Another param documentation.
78 * 80 *
79 * @param[in] val Value documentation. 81 * @return Return documentation.
80 * 82 *
81 * @since 1.18 83 * @since 1.18
82 * 84 *
83 * @ingroup Docs 85 * @ingroup Docs
84 */ 86 */
85EAPI void docs_prop_set(Docs *obj, int val); 87EAPI int docs_meth(Docs *obj, int a, float *b, long *c);
86 88
87/** 89/**
88 * @brief Property common documentation. 90 * @brief Property common documentation.
89 * 91 *
90 * Get documentation. 92 * Set documentation.
91 * 93 *
92 * @return Value documentation. 94 * @param[in] val Value documentation.
93 * 95 *
94 * @since 1.18 96 * @since 1.18
95 * 97 *
96 * @ingroup Docs 98 * @ingroup Docs
97 */ 99 */
98EAPI int docs_prop_get(const Docs *obj); 100EAPI void docs_prop_set(Docs *obj, int val);
99 101
100/** 102/**
101 * @brief Method documentation. 103 * @brief Property common documentation.
102 * 104 *
103 * @param[in] a Param documentation. 105 * Get documentation.
104 * @param[out] b
105 * @param[out] c Another param documentation.
106 * 106 *
107 * @return Return documentation. 107 * @return Value documentation.
108 * 108 *
109 * @since 1.18 109 * @since 1.18
110 * 110 *
111 * @ingroup Docs 111 * @ingroup Docs
112 */ 112 */
113EAPI int docs_meth(Docs *obj, int a, float *b, long *c); 113EAPI int docs_prop_get(const Docs *obj);
114 114
115#endif 115#endif
diff --git a/src/tests/eolian/data/object_impl_add_ref.c b/src/tests/eolian/data/object_impl_add_ref.c
index 1e2aa21431..f97248aa27 100644
--- a/src/tests/eolian/data/object_impl_add_ref.c
+++ b/src/tests/eolian/data/object_impl_add_ref.c
@@ -7,19 +7,6 @@ typedef struct
7 7
8} Object_Impl_Data; 8} Object_Impl_Data;
9 9
10EOLIAN static void
11_object_impl_base_constructor(Eo *obj, Object_Impl_Data *pd)
12{
13
14}
15
16EOLIAN static void
17_object_impl_base_destructor(Eo *obj, Object_Impl_Data *pd)
18{
19 base_destructor(efl_super(obj, OBJECT_IMPL_CLASS));
20
21}
22
23EOLIAN static Eina_Bool 10EOLIAN static Eina_Bool
24_object_impl_a_set(Eo *obj, Object_Impl_Data *pd, const char *part, const Eina_List *value) 11_object_impl_a_set(Eo *obj, Object_Impl_Data *pd, const char *part, const Eina_List *value)
25{ 12{
@@ -63,6 +50,19 @@ _object_impl_foo2(const Eo *obj, Object_Impl_Data *pd, int a, const char *b)
63} 50}
64 51
65EOLIAN static void 52EOLIAN static void
53_object_impl_base_constructor(Eo *obj, Object_Impl_Data *pd)
54{
55
56}
57
58EOLIAN static void
59_object_impl_base_destructor(Eo *obj, Object_Impl_Data *pd)
60{
61 base_destructor(efl_super(obj, OBJECT_IMPL_CLASS));
62
63}
64
65EOLIAN static void
66_object_impl_class_constructor(Efl_Class *klass) 66_object_impl_class_constructor(Efl_Class *klass)
67{ 67{
68 68
diff --git a/src/tests/eolian/data/object_impl_ref.c b/src/tests/eolian/data/object_impl_ref.c
index 454903c6ab..335613af01 100644
--- a/src/tests/eolian/data/object_impl_ref.c
+++ b/src/tests/eolian/data/object_impl_ref.c
@@ -7,19 +7,6 @@ typedef struct
7 7
8} Object_Impl_Data; 8} Object_Impl_Data;
9 9
10EOLIAN static void
11_object_impl_base_constructor(Eo *obj, Object_Impl_Data *pd)
12{
13
14}
15
16EOLIAN static void
17_object_impl_base_destructor(Eo *obj, Object_Impl_Data *pd)
18{
19 base_destructor(efl_super(obj, OBJECT_IMPL_CLASS));
20
21}
22
23EOLIAN static Eina_Bool 10EOLIAN static Eina_Bool
24_object_impl_a_set(Eo *obj, Object_Impl_Data *pd, const char *part, const Eina_List *value) 11_object_impl_a_set(Eo *obj, Object_Impl_Data *pd, const char *part, const Eina_List *value)
25{ 12{
@@ -63,6 +50,19 @@ _object_impl_foo2(const Eo *obj, Object_Impl_Data *pd, int a, const char *b)
63} 50}
64 51
65EOLIAN static void 52EOLIAN static void
53_object_impl_base_constructor(Eo *obj, Object_Impl_Data *pd)
54{
55
56}
57
58EOLIAN static void
59_object_impl_base_destructor(Eo *obj, Object_Impl_Data *pd)
60{
61 base_destructor(efl_super(obj, OBJECT_IMPL_CLASS));
62
63}
64
65EOLIAN static void
66_object_impl_class_constructor(Efl_Class *klass) 66_object_impl_class_constructor(Efl_Class *klass)
67{ 67{
68 68
diff --git a/src/tests/eolian/data/override_ref.c b/src/tests/eolian/data/override_ref.c
index 9d6fd8cade..76b9f4095c 100644
--- a/src/tests/eolian/data/override_ref.c
+++ b/src/tests/eolian/data/override_ref.c
@@ -1,6 +1,8 @@
1EOAPI EFL_VOID_FUNC_BODY(override_a_set);
1 2
2void _override_base_constructor(Eo *obj, Override_Data *pd); 3void _override_a_get(Eo *obj, Override_Data *pd);
3 4
5EOAPI EFL_VOID_FUNC_BODY_CONST(override_a_get);
4 6
5static void __eolian_override_b_set(Eo *obj EINA_UNUSED, Override_Data *pd, int idx EINA_UNUSED, float a, char b, int c) 7static void __eolian_override_b_set(Eo *obj EINA_UNUSED, Override_Data *pd, int idx EINA_UNUSED, float a, char b, int c)
6{ 8{
@@ -11,13 +13,21 @@ static void __eolian_override_b_set(Eo *obj EINA_UNUSED, Override_Data *pd, int
11 13
12EOAPI EFL_VOID_FUNC_BODYV(override_b_set, EFL_FUNC_CALL(idx, a, b, c), int idx, float a, char b, int c); 14EOAPI EFL_VOID_FUNC_BODYV(override_b_set, EFL_FUNC_CALL(idx, a, b, c), int idx, float a, char b, int c);
13 15
14static void __eolian_override_bar(Eo *obj EINA_UNUSED, Override_Data *pd EINA_UNUSED, int idx EINA_UNUSED, int *a, char **str) 16static void __eolian_override_b_get(Eo *obj EINA_UNUSED, Override_Data *pd, int idx EINA_UNUSED, float *a, char *b, int *c)
15{ 17{
16 if (a) *a = 250; 18 if (a) *a = pd->a;
17 if (str) *str = NULL; 19 if (b) *b = pd->b;
20 if (c) *c = pd->c;
18} 21}
19 22
20EOAPI EFL_VOID_FUNC_BODYV(override_bar, EFL_FUNC_CALL(idx, a, str), int idx, int *a, char **str); 23EOAPI EFL_VOID_FUNC_BODYV_CONST(override_b_get, EFL_FUNC_CALL(idx, a, b, c), int idx, float *a, char *b, int *c);
24
25static void __eolian_override_c_set(Eo *obj EINA_UNUSED, Override_Data *pd, int idx EINA_UNUSED, int c)
26{
27 c = pd->c;
28}
29
30EOAPI EFL_VOID_FUNC_BODYV(override_c_set, EFL_FUNC_CALL(idx, c), int idx, int c);
21 31
22static int __eolian_override_c_get(Eo *obj EINA_UNUSED, Override_Data *pd EINA_UNUSED, int idx EINA_UNUSED) 32static int __eolian_override_c_get(Eo *obj EINA_UNUSED, Override_Data *pd EINA_UNUSED, int idx EINA_UNUSED)
23{ 33{
@@ -25,6 +35,18 @@ static int __eolian_override_c_get(Eo *obj EINA_UNUSED, Override_Data *pd EINA_U
25} 35}
26 36
27EOAPI EFL_FUNC_BODYV_CONST(override_c_get, int, 50, EFL_FUNC_CALL(idx), int idx); 37EOAPI EFL_FUNC_BODYV_CONST(override_c_get, int, 50, EFL_FUNC_CALL(idx), int idx);
38EOAPI EFL_VOID_FUNC_BODY(override_foo);
39
40static void __eolian_override_bar(Eo *obj EINA_UNUSED, Override_Data *pd EINA_UNUSED, int idx EINA_UNUSED, int *a, char **str)
41{
42 if (a) *a = 250;
43 if (str) *str = NULL;
44}
45
46EOAPI EFL_VOID_FUNC_BODYV(override_bar, EFL_FUNC_CALL(idx, a, str), int idx, int *a, char **str);
47
48void _override_base_constructor(Eo *obj, Override_Data *pd);
49
28 50
29static void __eolian_override_base_z_set(Eo *obj EINA_UNUSED, Override_Data *pd, int a, char b, float c) 51static void __eolian_override_base_z_set(Eo *obj EINA_UNUSED, Override_Data *pd, int a, char b, float c)
30{ 52{
@@ -41,36 +63,22 @@ static void __eolian_override_base_z_get(Eo *obj EINA_UNUSED, Override_Data *pd,
41 if (c) *c = pd->c; 63 if (c) *c = pd->c;
42} 64}
43 65
44EOAPI EFL_VOID_FUNC_BODY(override_a_set);
45
46void _override_a_get(Eo *obj, Override_Data *pd);
47
48EOAPI EFL_VOID_FUNC_BODY_CONST(override_a_get);
49
50void _override_b_get(Eo *obj, Override_Data *pd, int idx, float *a, char *b, int *c);
51
52EOAPI EFL_VOID_FUNC_BODYV_CONST(override_b_get, EFL_FUNC_CALL(idx, a, b, c), int idx, float *a, char *b, int *c);
53
54void _override_c_set(Eo *obj, Override_Data *pd, int idx, int c);
55
56EOAPI EFL_VOID_FUNC_BODYV(override_c_set, EFL_FUNC_CALL(idx, c), int idx, int c);
57EOAPI EFL_VOID_FUNC_BODY(override_foo);
58 66
59static Eina_Bool 67static Eina_Bool
60_override_class_initializer(Efl_Class *klass) 68_override_class_initializer(Efl_Class *klass)
61{ 69{
62 EFL_OPS_DEFINE(ops, 70 EFL_OPS_DEFINE(ops,
63 EFL_OBJECT_OP_FUNC(base_constructor, _override_base_constructor), 71 EFL_OBJECT_OP_FUNC(override_a_set, NULL),
72 EFL_OBJECT_OP_FUNC(override_a_get, _override_a_get),
64 EFL_OBJECT_OP_FUNC(override_b_set, __eolian_override_b_set), 73 EFL_OBJECT_OP_FUNC(override_b_set, __eolian_override_b_set),
65 EFL_OBJECT_OP_FUNC(override_bar, __eolian_override_bar), 74 EFL_OBJECT_OP_FUNC(override_b_get, __eolian_override_b_get),
75 EFL_OBJECT_OP_FUNC(override_c_set, __eolian_override_c_set),
66 EFL_OBJECT_OP_FUNC(override_c_get, __eolian_override_c_get), 76 EFL_OBJECT_OP_FUNC(override_c_get, __eolian_override_c_get),
77 EFL_OBJECT_OP_FUNC(override_foo, NULL),
78 EFL_OBJECT_OP_FUNC(override_bar, __eolian_override_bar),
79 EFL_OBJECT_OP_FUNC(base_constructor, _override_base_constructor),
67 EFL_OBJECT_OP_FUNC(base_z_set, __eolian_override_base_z_set), 80 EFL_OBJECT_OP_FUNC(base_z_set, __eolian_override_base_z_set),
68 EFL_OBJECT_OP_FUNC(base_z_get, __eolian_override_base_z_get), 81 EFL_OBJECT_OP_FUNC(base_z_get, __eolian_override_base_z_get)
69 EFL_OBJECT_OP_FUNC(override_a_set, NULL),
70 EFL_OBJECT_OP_FUNC(override_a_get, _override_a_get),
71 EFL_OBJECT_OP_FUNC(override_b_get, _override_b_get),
72 EFL_OBJECT_OP_FUNC(override_c_set, _override_c_set),
73 EFL_OBJECT_OP_FUNC(override_foo, NULL)
74 ); 82 );
75 return efl_class_functions_set(klass, &ops, NULL); 83 return efl_class_functions_set(klass, &ops, NULL);
76} 84}
diff --git a/src/tests/eolian/eolian_parsing.c b/src/tests/eolian/eolian_parsing.c
index 889d5c9f52..15b032ad49 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -87,10 +87,6 @@ START_TEST(eolian_namespaces)
87 fail_if(eina_iterator_next(iter, &dummy)); 87 fail_if(eina_iterator_next(iter, &dummy));
88 eina_iterator_free(iter); 88 eina_iterator_free(iter);
89 89
90 /* Virtual regression */
91 fail_if(!(fid = eolian_class_function_get_by_name(class112, "a", EOLIAN_UNRESOLVED)));
92 fail_if(!eolian_function_is_pure_virtual(fid, EOLIAN_PROP_SET));
93
94 eolian_shutdown(); 90 eolian_shutdown();
95} 91}
96END_TEST 92END_TEST
@@ -170,7 +166,6 @@ END_TEST
170START_TEST(eolian_override) 166START_TEST(eolian_override)
171{ 167{
172 Eina_Iterator *iter; 168 Eina_Iterator *iter;
173 const Eolian_Function *fid = NULL;
174 const Eolian_Class *impl_class = NULL; 169 const Eolian_Class *impl_class = NULL;
175 const Eolian_Function *impl_func = NULL; 170 const Eolian_Function *impl_func = NULL;
176 const Eolian_Class *class, *base; 171 const Eolian_Class *class, *base;
@@ -185,30 +180,9 @@ START_TEST(eolian_override)
185 fail_if(!(class = eolian_class_get_by_name("Override"))); 180 fail_if(!(class = eolian_class_get_by_name("Override")));
186 fail_if(!(base = eolian_class_get_by_name("Base"))); 181 fail_if(!(base = eolian_class_get_by_name("Base")));
187 182
188 /* Base ctor */
189 fail_if(!(fid = eolian_class_function_get_by_name(base, "constructor", EOLIAN_METHOD)));
190 fail_if(!eolian_function_is_pure_virtual(fid, EOLIAN_METHOD));
191
192 /* Property */
193 fail_if(!(fid = eolian_class_function_get_by_name(class, "a", EOLIAN_PROPERTY)));
194 fail_if(!eolian_function_is_pure_virtual(fid, EOLIAN_PROP_SET));
195 fail_if(eolian_function_is_pure_virtual(fid, EOLIAN_PROP_GET));
196
197 /* Method */
198 fail_if(!(fid = eolian_class_function_get_by_name(class, "foo", EOLIAN_METHOD)));
199 fail_if(!eolian_function_is_pure_virtual(fid, EOLIAN_METHOD));
200
201 /* Implements */ 183 /* Implements */
202 fail_if(!(iter = eolian_class_implements_get(class))); 184 fail_if(!(iter = eolian_class_implements_get(class)));
203 185 fail_if(!(eina_iterator_next(iter, (void**)&impl))); /* skip a */
204 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
205 fail_if(eolian_implement_is_auto(impl, EOLIAN_METHOD));
206 fail_if(eolian_implement_is_empty(impl, EOLIAN_METHOD));
207 fail_if(eolian_implement_is_pure_virtual(impl, EOLIAN_METHOD));
208 fail_if(!(impl_class = eolian_implement_class_get(impl)));
209 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
210 fail_if(impl_class != base);
211 fail_if(strcmp(eolian_function_name_get(impl_func), "constructor"));
212 186
213 fail_if(!(eina_iterator_next(iter, (void**)&impl))); 187 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
214 fail_if(!eolian_implement_is_auto(impl, EOLIAN_PROP_SET)); 188 fail_if(!eolian_implement_is_auto(impl, EOLIAN_PROP_SET));
@@ -218,12 +192,9 @@ START_TEST(eolian_override)
218 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL))); 192 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
219 fail_if(impl_class != class); 193 fail_if(impl_class != class);
220 fail_if(strcmp(eolian_function_name_get(impl_func), "b")); 194 fail_if(strcmp(eolian_function_name_get(impl_func), "b"));
221 fail_if(!eolian_function_is_auto(impl_func, EOLIAN_PROP_SET)); 195
222 fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_GET)); 196 fail_if(!(eina_iterator_next(iter, (void**)&impl))); /* skip c */
223 fail_if(eolian_function_is_empty(impl_func, EOLIAN_PROP_SET)); 197 fail_if(!(eina_iterator_next(iter, (void**)&impl))); /* skip foo */
224 fail_if(eolian_function_is_empty(impl_func, EOLIAN_PROP_GET));
225 fail_if(eolian_function_is_pure_virtual(impl_func, EOLIAN_PROP_SET));
226 fail_if(eolian_function_is_pure_virtual(impl_func, EOLIAN_PROP_GET));
227 198
228 fail_if(!(eina_iterator_next(iter, (void**)&impl))); 199 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
229 fail_if(eolian_implement_is_auto(impl, EOLIAN_METHOD)); 200 fail_if(eolian_implement_is_auto(impl, EOLIAN_METHOD));
@@ -233,9 +204,15 @@ START_TEST(eolian_override)
233 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL))); 204 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
234 fail_if(impl_class != class); 205 fail_if(impl_class != class);
235 fail_if(strcmp(eolian_function_name_get(impl_func), "bar")); 206 fail_if(strcmp(eolian_function_name_get(impl_func), "bar"));
236 fail_if(eolian_function_is_auto(impl_func, EOLIAN_METHOD)); 207
237 fail_if(!eolian_function_is_empty(impl_func, EOLIAN_METHOD)); 208 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
238 fail_if(eolian_function_is_pure_virtual(impl_func, EOLIAN_METHOD)); 209 fail_if(eolian_implement_is_auto(impl, EOLIAN_METHOD));
210 fail_if(eolian_implement_is_empty(impl, EOLIAN_METHOD));
211 fail_if(eolian_implement_is_pure_virtual(impl, EOLIAN_METHOD));
212 fail_if(!(impl_class = eolian_implement_class_get(impl)));
213 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
214 fail_if(impl_class != base);
215 fail_if(strcmp(eolian_function_name_get(impl_func), "constructor"));
239 216
240 eina_iterator_free(iter); 217 eina_iterator_free(iter);
241 218
@@ -285,6 +262,8 @@ START_TEST(eolian_ctor_dtor)
285 /* Base ctor/dtor */ 262 /* Base ctor/dtor */
286 fail_if(!(iter = eolian_class_implements_get(class))); 263 fail_if(!(iter = eolian_class_implements_get(class)));
287 fail_if(!(eina_iterator_next(iter, (void**)&impl))); 264 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
265 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
266 fail_if(!(eina_iterator_next(iter, (void**)&impl)));
288 fail_if(!(impl_class = eolian_implement_class_get(impl))); 267 fail_if(!(impl_class = eolian_implement_class_get(impl)));
289 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL))); 268 fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
290 fail_if(impl_class != base); 269 fail_if(impl_class != base);