eolian: mark pure virtual funcs outside of implements

This is a better syntax and should've been like this in the first place.
This commit is contained in:
Daniel Kolesa 2016-05-12 15:41:56 +01:00
parent 6cacef2503
commit 7e94eb22b4
27 changed files with 154 additions and 276 deletions

View File

@ -58,7 +58,7 @@ class Ecore.Audio (Eo.Base)
volume: double; [[The volume]]
}
}
@property source {
@property source @virtual_pure {
[[Source of the object
What sources are supported depends on the actual object.
@ -78,7 +78,7 @@ class Ecore.Audio (Eo.Base)
source: const(char)*; [[the source to set to (i.e. file, URL, device)]]
}
}
@property format {
@property format @virtual_pure {
[[Format of the object.]]
set {
[[Set the format of the object
@ -103,7 +103,7 @@ class Ecore.Audio (Eo.Base)
format: Ecore.Audio.Format; [[the format of the object]]
}
}
vio_set {
vio_set @virtual_pure {
[[Set the virtual IO functions
@since 1.8
@ -123,10 +123,5 @@ class Ecore.Audio (Eo.Base)
}
implements {
Eo.Base.constructor;
@virtual .source.get;
@virtual .source.set;
@virtual .format.get;
@virtual .format.set;
@virtual .vio_set;
}
}

View File

@ -44,7 +44,7 @@ class Ecore.Audio.In (Ecore.Audio)
channels: int; [[The number of channels]]
}
}
@property preloaded {
@property preloaded @virtual_pure {
[[Preloaded state of the input
@since 1.8
@ -82,7 +82,7 @@ class Ecore.Audio.In (Ecore.Audio)
@since 1.8
]]
set {
set @virtual_pure {
}
get {
}
@ -134,7 +134,7 @@ class Ecore.Audio.In (Ecore.Audio)
@in len: size; [[The amount of samples to read]]
}
}
seek {
seek @virtual_pure {
[[Seek within the input
@since 1.8
@ -153,10 +153,6 @@ class Ecore.Audio.In (Ecore.Audio)
Eo.Base.constructor;
Eo.Base.destructor;
Ecore.Audio.vio_set;
@virtual .preloaded.get;
@virtual .preloaded.set;
@virtual .seek;
@virtual .length.set;
}
events {
in,looped; [[Called when an input has looped.]]

View File

@ -45,7 +45,7 @@ abstract Efl.Network (Eo.Base) {
valid after deletion for the svr object. If no IP is known
null is returned.
]]
get {
get @virtual_pure {
legacy: null;
}
values {
@ -58,14 +58,14 @@ abstract Efl.Network (Eo.Base) {
This function is used to find out how long a client has been
connected.
]]
get {
get @virtual_pure {
legacy: null;
}
values {
uptime: double; [[The total time, in seconds, that the object has been connected.]]
}
}
@property port {
@property port @virtual_pure {
[[The port that the obj is connected to]]
set {
legacy: null;
@ -91,7 +91,7 @@ abstract Efl.Network (Eo.Base) {
@since 1.1
]]
get {
get @virtual_pure {
legacy: null;
}
values {
@ -100,14 +100,14 @@ abstract Efl.Network (Eo.Base) {
}
@property connected {
[[Returns whether the client is still connected]]
get {
get @virtual_pure {
legacy: null;
}
values {
connected: bool; [[Returns true if connected, false otherwise.]]
}
}
@property timeout {
@property timeout @virtual_pure {
[[Control the default time after which an inactive client will be
disconnected.
@ -131,14 +131,14 @@ abstract Efl.Network (Eo.Base) {
timeout: double; [[The timeout, in seconds, to disconnect after.]]
}
}
flush {
flush @virtual_pure {
[[Flushes all pending data to the given server.
This function will block until all data is sent to the server.
]]
legacy: null;
}
send {
send @virtual_pure {
[[Sends the given data to the given server.
This function will send the given data to the server as soon as the
@ -175,18 +175,6 @@ abstract Efl.Network (Eo.Base) {
return: bool; [[true if the request did not fail to be set up, false otherwise.]]
}
}
implements {
@virtual .ip.get;
@virtual .uptime.get;
@virtual .port.set;
@virtual .port.get;
@virtual .fd.get;
@virtual .connected.get;
@virtual .timeout.set;
@virtual .timeout.get;
@virtual .flush;
@virtual .send;
}
events {
data,received: Ecore.Con.Event_Data.Received; [[Data received on connection]]
connection,upgraded;

View File

@ -2,7 +2,7 @@ abstract Ector.Renderer.Cairo (Ector.Renderer)
{
legacy_prefix: null;
methods {
fill {
fill @virtual_pure {
return: bool;
params {
@in mul_col: uint;
@ -10,7 +10,6 @@ abstract Ector.Renderer.Cairo (Ector.Renderer)
}
}
implements {
@virtual .fill;
Ector.Renderer.prepare;
Ector.Renderer.draw;
Ector.Renderer.color.set;

View File

@ -44,7 +44,7 @@ mixin Ector.Buffer
cspace: Efl.Gfx.Colorspace; [[Colorspace]]
}
}
map {
map @virtual_pure {
[[Map a region of this buffer for read or write access by the CPU,
fetch data from the GPU if needed. This operation may be slow if
cpu_readable_fast or cpu_writeable_fast are not true, or if the
@ -64,14 +64,14 @@ mixin Ector.Buffer
}
return: void* @warn_unused; [[Pointer to the top-left pixel data. Returns $null in case of failure]]
}
unmap {
unmap @virtual_pure {
[[Unmap a region of this buffer, and upload data to the GPU (if needed).]]
params {
@in data: void*; [[Data pointer returned by a previous call to map]]
@in length: uint; [[Must be the same as returned by map.]]
}
}
pixels_set {
pixels_set @virtual_pure {
[[Set the source pixels for this buffer, or allocate a new memory region]]
params {
@in pixels: void*; [[If $null, allocates an empty buffer]]
@ -87,7 +87,7 @@ mixin Ector.Buffer
}
return: bool; [[True if pixels_set was successful]]
}
span_get {
span_get @virtual_pure {
[[Get a single horizontal span of length w starting from (x,y)
Call span_free() to release it. This function will try not to
@ -103,7 +103,7 @@ mixin Ector.Buffer
}
return: uint8*; [[A temporary memory buffer containing the pixels requested.]]
}
span_free {
span_free @virtual_pure {
[[Must be called as soon as possible after span_get]]
params {
data: uint8*; [[Data to be freed]]
@ -130,11 +130,4 @@ mixin Ector.Buffer
events {
detached; [[Emitted whenever the previously attached pixels are detached during pixels_set]]
}
implements {
@virtual .pixels_set;
@virtual .span_get;
@virtual .span_free;
@virtual .map;
@virtual .unmap;
}
}

View File

@ -105,13 +105,13 @@ abstract Ector.Renderer (Eo.Base)
return: uint; [[CRC value]]
}
}
bounds_get {
bounds_get @virtual_pure {
[[Retrieve the bounds of the renderer]]
params {
@out r: Eina.Rectangle; [[Bounds as @Eina.Rectangle]]
}
}
draw {
draw @virtual_pure {
return: bool @warn_unused;
params {
@in op: Efl.Gfx.Render_Op;
@ -124,15 +124,12 @@ abstract Ector.Renderer (Eo.Base)
params {
}
}
done {
done @virtual_pure {
return: bool @warn_unused;
}
}
implements {
Eo.Base.destructor;
Eo.Base.finalize;
@virtual .draw;
@virtual .bounds_get;
@virtual .done;
}
}

View File

@ -8,14 +8,14 @@ mixin Ector.Surface (Ector.Buffer)
methods {
@property reference_point {
[[This define where is (0,0) in pixels coordinate inside the surface]]
set {
set @virtual_pure {
}
values {
x: int; [[X coordinate for reference point]]
y: int; [[Y coordinate for reference point]]
}
}
renderer_factory_new {
renderer_factory_new @virtual_pure {
[[Create a new renderer factory for the given type]]
return: Eo.Base *; /* FIXME: Should be a more restricted type, only here for cyclic. */
params {
@ -23,8 +23,4 @@ mixin Ector.Surface (Ector.Buffer)
}
}
}
implements {
@virtual .renderer_factory_new;
@virtual .reference_point.set;
}
}

View File

@ -4,7 +4,7 @@ abstract Ector.Renderer.GL (Ector.Renderer)
{
legacy_prefix: null;
methods {
fill {
fill @virtual_pure {
return: bool;
params {
@in flags: uint64;
@ -15,7 +15,6 @@ abstract Ector.Renderer.GL (Ector.Renderer)
}
}
implements {
@virtual .fill;
Ector.Renderer.prepare;
Ector.Renderer.draw;
Eo.Base.constructor;

View File

@ -3,11 +3,8 @@ class Ector.Renderer.Software (Ector.Renderer)
legacy_prefix: null;
data: null;
methods {
fill {
fill @virtual_pure {
return: bool;
}
}
implements {
@virtual .fill;
}
}

View File

@ -4,7 +4,7 @@ mixin Elm.Interface.Atspi_Action ()
eo_prefix: elm_interface_atspi_action;
data: null;
methods {
@property name @protected {
@property name @protected @virtual_pure {
get {
[[Gets action name for given id]]
}
@ -26,7 +26,7 @@ mixin Elm.Interface.Atspi_Action ()
id: int;
}
}
@property description @protected {
@property description @protected @virtual_pure {
get {
[[Gets action description for given id]]
}
@ -42,21 +42,21 @@ mixin Elm.Interface.Atspi_Action ()
}
}
@property actions @protected {
get {
get @virtual_pure {
[[Get list of available widget actions]]
}
values {
actions: list<Elm_Atspi_Action> *; [[contains statically allocated strings]]
}
}
action_do @protected {
action_do @protected @virtual_pure {
[[Performs action on given widget.]]
params {
@in id: int;
}
return: bool;
}
keybinding_get @protected {
keybinding_get @protected @virtual_pure {
[[Gets configured keybinding for specific action and widget.]]
params {
@in id: int;
@ -64,13 +64,4 @@ mixin Elm.Interface.Atspi_Action ()
return: own(char *) @warn_unused; [[Should be freed by the user.]]
}
}
implements {
@virtual .action_do;
@virtual .keybinding_get;
@virtual .name.get;
@virtual .name.set;
@virtual .description.get;
@virtual .description.set;
@virtual .actions.get;
}
}

View File

@ -5,7 +5,7 @@ mixin Elm.Interface.Atspi_Image ()
data: null;
methods {
@property extents @protected {
get {
get @virtual_pure {
[[Gets an image extents.]]
}
keys {
@ -37,7 +37,4 @@ mixin Elm.Interface.Atspi_Image ()
}
}
}
implements {
@virtual .extents.get;
}
}

View File

@ -7,7 +7,7 @@ mixin Elm.Interface.Atspi_Widget_Action (Elm.Interface.Atspi_Action)
data: null;
methods {
@property elm_actions @protected {
get {
get @virtual_pure {
}
values {
actions: const(Elm_Atspi_Action)*; [[NULL-terminated array of Elm_Atspi_Action]]
@ -21,6 +21,5 @@ mixin Elm.Interface.Atspi_Widget_Action (Elm.Interface.Atspi_Action)
Elm.Interface.Atspi_Action.description.set;
Elm.Interface.Atspi_Action.description.get;
Elm.Interface.Atspi_Action.actions.get;
@virtual .elm_actions.get;
}
}

View File

@ -18,7 +18,7 @@ class Elm.Web (Elm.Widget)
{
eo_prefix: elm_obj_web;
methods {
@property text_matches_highlight {
@property text_matches_highlight @virtual_pure {
set {
[[Sets whether to highlight the matched marks.
@ -34,7 +34,7 @@ class Elm.Web (Elm.Widget)
highlight: bool; [[Whether to highlight the marks or not.]]
}
}
@property useragent {
@property useragent @virtual_pure {
set {
[[Change useragent of a elm_web object.]]
}
@ -45,7 +45,7 @@ class Elm.Web (Elm.Widget)
user_agent: const(char)*; [[String for useragent.]]
}
}
@property url {
@property url @virtual_pure {
set {
[[Sets the URL for the web object.
@ -65,7 +65,7 @@ class Elm.Web (Elm.Widget)
url: const(char)*; [[The URL to set.]]
}
}
@property bg_color {
@property bg_color @virtual_pure {
set {
[[Sets the background color to be used by the web object.
@ -89,7 +89,7 @@ class Elm.Web (Elm.Widget)
a: int; [[Alpha component.]]
}
}
@property inwin_mode {
@property inwin_mode @virtual_pure {
set {
[[Sets the default dialogs to use an Inwin instead of a
normal window.
@ -106,7 +106,7 @@ class Elm.Web (Elm.Widget)
value: bool;
}
}
@property tab_propagate {
@property tab_propagate @virtual_pure {
set {
[[Sets whether to use tab propagation.
@ -124,7 +124,7 @@ class Elm.Web (Elm.Widget)
propagate: bool; [[Whether to propagate Tab keys to Elementary or not.]]
}
}
@property history_enabled {
@property history_enabled @virtual_pure {
set {
[[Enables or disables the browsing history.]]
}
@ -135,7 +135,7 @@ class Elm.Web (Elm.Widget)
enable: bool; [[Whether to enable or disable the browsing history.]]
}
}
@property zoom_mode {
@property zoom_mode @virtual_pure {
set {
[[Sets the zoom mode to use.
@ -162,7 +162,7 @@ class Elm.Web (Elm.Widget)
mode: Elm.Web.Zoom_Mode; [[The mode to set.]]
}
}
@property zoom {
@property zoom @virtual_pure {
set {
[[Sets the zoom level of the web object.
@ -188,7 +188,7 @@ class Elm.Web (Elm.Widget)
}
}
@property console_message_hook {
set {
set @virtual_pure {
[[Sets the function to call when a console message is emitted
from JS.
@ -203,7 +203,7 @@ class Elm.Web (Elm.Widget)
}
}
@property window_create_hook {
set {
set @virtual_pure {
[[Sets the function to call when a new window is requested.
This hook will be called when a request to create a new
@ -219,7 +219,7 @@ class Elm.Web (Elm.Widget)
}
}
@property dialog_file_selector_hook {
set {
set @virtual_pure {
[[Sets the function to call when an file selector dialog.
This hook will be called when a JavaScript file selector
@ -234,7 +234,7 @@ class Elm.Web (Elm.Widget)
}
}
@property dialog_confirm_hook {
set {
set @virtual_pure {
[[Sets the function to call when an confirm dialog.
This hook will be called when a JavaScript confirm dialog is
@ -248,7 +248,7 @@ class Elm.Web (Elm.Widget)
}
}
@property popup_selected {
set {
set @virtual_pure {
[[Tells the web object which index in the currently open popup
was selected.
@ -263,7 +263,7 @@ class Elm.Web (Elm.Widget)
}
}
@property dialog_prompt_hook {
set {
set @virtual_pure {
[[Sets the function to call when an prompt dialog.
This hook will be called when a JavaScript prompt dialog is
@ -277,7 +277,7 @@ class Elm.Web (Elm.Widget)
}
}
@property dialog_alert_hook {
set {
set @virtual_pure {
[[Sets the function to call when an alert dialog.
This hook will be called when a JavaScript alert dialog is
@ -291,13 +291,13 @@ class Elm.Web (Elm.Widget)
}
}
@property forward_possible {
get {
get @virtual_pure {
[[Queries whether it's possible to go forward in history.]]
return: bool;
}
}
@property webkit_view {
get {
get @virtual_pure {
[[Get internal ewk_view object from web object.
Elementary may not provide some low level features of EWebKit,
@ -312,13 +312,13 @@ class Elm.Web (Elm.Widget)
}
}
@property back_possible {
get {
get @virtual_pure {
[[Queries whether it's possible to go back in history.]]
return: bool;
}
}
@property load_progress {
get {
get @virtual_pure {
[[Get the overall loading progress of the page.
Returns the estimated loading progress of the page, with a
@ -330,7 +330,7 @@ class Elm.Web (Elm.Widget)
}
}
@property selection {
get {
get @virtual_pure {
[[Get a copy of the currently selected text.
The string returned must be freed by the user when it's done
@ -342,7 +342,7 @@ class Elm.Web (Elm.Widget)
}
}
@property title {
get {
get @virtual_pure {
[[Get the current title.
The returned string must not be freed and is guaranteed to be
@ -354,7 +354,7 @@ class Elm.Web (Elm.Widget)
]]
}
}
navigate {
navigate @virtual_pure {
[[Jumps the given number of steps in the browsing history.
The $steps value can be a negative integer to back in history,
@ -366,14 +366,14 @@ class Elm.Web (Elm.Widget)
@in steps: int; [[The number of steps to jump.]]
}
}
back {
back @virtual_pure {
[[Goes back one step in the browsing history.
This is equivalent to calling elm_web_object_navigate(obj, -1);
]]
return: bool;
}
html_string_load {
html_string_load @virtual_pure {
[[Loads the specified $html string as the content of the web
object.
@ -393,7 +393,7 @@ class Elm.Web (Elm.Widget)
@in unreachable_url: const(char)* @optional; [[URL that could not be reached (optional).]]
}
}
text_search @const {
text_search @const @virtual_pure {
[[Searches the given string in a document.]]
return: bool; [[$true if the given string was found, $false if not
or failure.]]
@ -404,7 +404,7 @@ class Elm.Web (Elm.Widget)
@in wrap: bool; [[If search should wrap at the end.]]
}
}
popup_destroy {
popup_destroy @virtual_pure {
[[Dismisses an open dropdown popup
When the popup from a dropdown widget is to be dismissed, either
@ -416,7 +416,7 @@ class Elm.Web (Elm.Widget)
return: bool; [[$true if the menu was successfully destroyed, or
$false if there was no menu to destroy.]]
}
region_show {
region_show @virtual_pure {
[[Shows the given region in the web object.]]
params {
@in x: int; [[The x coordinate of the region to show.]]
@ -425,7 +425,7 @@ class Elm.Web (Elm.Widget)
@in h: int; [[The height of the region to show.]]
}
}
forward {
forward @virtual_pure {
[[Goes forward one step in the browsing history.
This is equivalent to calling elm_web_object_navigate(obj, 1);
@ -435,7 +435,7 @@ class Elm.Web (Elm.Widget)
]]
return: bool; [[$true on success, $false otherwise.]]
}
text_matches_mark {
text_matches_mark @virtual_pure {
[[Marks matches of the given string in a document.]]
return: uint; [[Number of matched $string.]]
params {
@ -445,7 +445,7 @@ class Elm.Web (Elm.Widget)
@in limit: uint; [[Maximum amount of matches, or zero to unlimited.]]
}
}
region_bring_in {
region_bring_in @virtual_pure {
[[Brings in the region to the visible area.
Like @.region_show, but it animates the scrolling of the object
@ -458,7 +458,7 @@ class Elm.Web (Elm.Widget)
@in h: int; [[The height of the region to show.]]
}
}
stop {
stop @virtual_pure {
[[Stops loading the current page.
Cancels the loading of the current page in the web object. This
@ -467,7 +467,7 @@ class Elm.Web (Elm.Widget)
]]
return: bool; [[$true if the cancel was successful, $false otherwise.]]
}
navigate_possible_get {
navigate_possible_get @virtual_pure {
[[Queries whether it's possible to jump the given number of steps.
The $steps value can be a negative integer to back in history,
@ -479,17 +479,17 @@ class Elm.Web (Elm.Widget)
@in steps: int; [[The number of steps to check for.]]
}
}
reload_full {
reload_full @virtual_pure {
[[Requests a reload of the current document, avoiding any
existing caches.
]]
return: bool; [[$true on success, $false otherwise.]]
}
text_matches_unmark_all {
text_matches_unmark_all @virtual_pure {
[[Clears all marked matches in the document.]]
return: bool; [[$true on success, $false otherwise.]]
}
reload {
reload @virtual_pure {
[[Requests a reload of the current document in the object.]]
return: bool; [[$true on success, $false otherwise.]]
}
@ -497,51 +497,6 @@ class Elm.Web (Elm.Widget)
implements {
class.constructor;
Eo.Base.constructor;
@virtual .tab_propagate.get;
@virtual .tab_propagate.set;
@virtual .webkit_view.get;
@virtual .window_create_hook.set;
@virtual .dialog_alert_hook.set;
@virtual .dialog_confirm_hook.set;
@virtual .dialog_prompt_hook.set;
@virtual .dialog_file_selector_hook.set;
@virtual .console_message_hook.set;
@virtual .useragent.set;
@virtual .useragent.get;
@virtual .url.set;
@virtual .url.get;
@virtual .html_string_load;
@virtual .title.get;
@virtual .bg_color.set;
@virtual .bg_color.get;
@virtual .selection.get;
@virtual .popup_selected.set;
@virtual .popup_destroy;
@virtual .text_search;
@virtual .text_matches_mark;
@virtual .text_matches_unmark_all;
@virtual .text_matches_highlight.set;
@virtual .text_matches_highlight.get;
@virtual .load_progress.get;
@virtual .stop;
@virtual .reload;
@virtual .reload_full;
@virtual .back;
@virtual .forward;
@virtual .navigate;
@virtual .back_possible.get;
@virtual .forward_possible.get;
@virtual .navigate_possible_get;
@virtual .history_enabled.get;
@virtual .history_enabled.set;
@virtual .zoom.set;
@virtual .zoom.get;
@virtual .zoom_mode.set;
@virtual .zoom_mode.get;
@virtual .region_show;
@virtual .region_bring_in;
@virtual .inwin_mode.set;
@virtual .inwin_mode.get;
}
events {
uri,changed;

View File

@ -417,7 +417,7 @@ abstract Elm.Widget (Evas.Object.Smart, Elm.Interface.Atspi_Accessible, Elm.Inte
}
}
@property parent_widget {
get {
get @virtual_pure {
return: Evas.Object *;
legacy: null;
}
@ -612,7 +612,7 @@ abstract Elm.Widget (Evas.Object.Smart, Elm.Interface.Atspi_Accessible, Elm.Inte
@in dir: Elm.Focus_Direction; [[Direction to move the focus.]]
}
}
focus_direction {
focus_direction @virtual_pure {
[['Virtual' function handling passing focus to sub-objects given a direction, in degrees.]]
params {
@in base: const(Evas.Object)*;
@ -736,7 +736,7 @@ abstract Elm.Widget (Evas.Object.Smart, Elm.Interface.Atspi_Accessible, Elm.Inte
}
focus_hide_handle {
}
focus_next {
focus_next @virtual_pure {
[['Virtual' function handling passing focus to sub-objects.]]
params {
@in dir: Elm.Focus_Direction;
@ -860,9 +860,6 @@ abstract Elm.Widget (Evas.Object.Smart, Elm.Interface.Atspi_Accessible, Elm.Inte
Evas.Object.Smart.member_add;
Evas.Object.Smart.resize;
Evas.Object.Smart.smart_no_render.set;
@virtual .focus_direction;
@virtual .focus_next;
@virtual .parent_widget.get;
Elm.Interface.Atspi_Accessible.name.get;
Elm.Interface.Atspi_Accessible.state_set.get;
Elm.Interface.Atspi_Accessible.children.get;

View File

@ -62,25 +62,7 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
else if (impl->is_prop_set)
ftype = EOLIAN_PROP_SET;
if (impl->is_virtual)
{
foo_id = (Eolian_Function*)eolian_class_function_get_by_name(cl,
impl_name, ftype);
if (!foo_id)
return _func_error(cl, impl);
if (impl->is_prop_set)
foo_id->set_virtual_pure = EINA_TRUE;
else
foo_id->get_virtual_pure = EINA_TRUE;
impl->full_name = eina_stringshare_printf("%s.%s", cl->full_name,
impl_name);
eina_stringshare_del(impl_name);
impl_name = impl->full_name;
_write_impl(foo_id, impl);
}
else if (impl->is_auto)
if (impl->is_auto)
{
if (!_get_impl_func(cl, impl, ftype, &foo_id))
return _func_error(cl, impl);
@ -109,6 +91,14 @@ _db_fill_implement(Eolian_Class *cl, Eolian_Implement *impl)
else if (!_get_impl_func(cl, impl, ftype, &foo_id))
return _func_error(cl, impl);
if (foo_id && foo_id->klass == cl && eolian_function_is_virtual_pure(foo_id, ftype))
{
fprintf(stderr, "eolian:%s:%d:%d: impl of pure virtual '%s%s'\n",
impl->base.file, impl->base.line, impl->base.column, impl->full_name,
(impl->is_prop_get ? ".get" : (impl->is_prop_set ? ".set" : "")));
return EINA_FALSE;
}
pasttags:
if (impl_name[0] == '.')
{
@ -148,9 +138,31 @@ _db_build_implement(Eolian_Class *cl, Eolian_Function *foo_id)
if (foo_id->type == EOLIAN_PROPERTY)
{
/* FIXME fugly hack, ideally rework the whole implements api altogether */
if (foo_id->get_virtual_pure && !foo_id->get_impl)
{
impl->is_virtual = EINA_TRUE;
impl->is_prop_get = EINA_TRUE;
foo_id->get_impl = impl;
cl->implements = eina_list_append(cl->implements, impl);
/* repeat for set */
_db_build_implement(cl, foo_id);
return;
}
else if (foo_id->set_virtual_pure && !foo_id->set_impl)
{
impl->is_virtual = EINA_TRUE;
impl->is_prop_set = EINA_TRUE;
foo_id->set_impl = impl;
cl->implements = eina_list_append(cl->implements, impl);
/* repeat for get */
_db_build_implement(cl, foo_id);
return;
}
if (foo_id->get_impl)
{
impl->is_prop_set = EINA_TRUE;
impl->is_virtual = foo_id->set_virtual_pure;
foo_id->set_impl = impl;
}
else if (foo_id->set_impl)
@ -164,15 +176,20 @@ _db_build_implement(Eolian_Class *cl, Eolian_Function *foo_id)
else if (foo_id->type == EOLIAN_PROP_SET)
{
impl->is_prop_set = EINA_TRUE;
impl->is_virtual = foo_id->get_virtual_pure;
foo_id->set_impl = impl;
}
else if (foo_id->type == EOLIAN_PROP_GET)
{
impl->is_prop_get = EINA_TRUE;
impl->is_virtual = foo_id->set_virtual_pure;
foo_id->get_impl = impl;
}
else
foo_id->get_impl = foo_id->set_impl = impl;
{
impl->is_virtual = foo_id->get_virtual_pure;
foo_id->get_impl = foo_id->set_impl = impl;
}
cl->implements = eina_list_append(cl->implements, impl);
}

View File

@ -32,7 +32,7 @@ enum Tokens
KWAT(c_only), KWAT(class), KWAT(const), KWAT(empty), KWAT(extern), \
KWAT(free), KWAT(hot), KWAT(restart), KWAT(in), KWAT(inout), KWAT(nonull), KWAT(nullable), \
KWAT(optional), KWAT(out), KWAT(private), KWAT(property), \
KWAT(protected), KWAT(virtual), KWAT(warn_unused), \
KWAT(protected), KWAT(virtual_pure), KWAT(warn_unused), \
\
KW(byte), KW(ubyte), KW(char), KW(short), KW(ushort), KW(int), KW(uint), \
KW(long), KW(ulong), KW(llong), KW(ullong), \

View File

@ -1105,6 +1105,12 @@ 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)
{
if (is_get) prop->get_virtual_pure = EINA_TRUE;
else prop->set_virtual_pure = EINA_TRUE;
eo_lexer_get(ls);
}
line = ls->line_number;
col = ls->column;
check_next(ls, '{');
@ -1181,9 +1187,9 @@ end:
}
static void
_interface_virtual_set(Eo_Lexer *ls, Eolian_Function *foo_id)
_func_virtual_set(Eo_Lexer *ls, Eolian_Function *foo_id, Eina_Bool virt)
{
if (ls->tmp.kls->type != EOLIAN_CLASS_INTERFACE)
if (ls->tmp.kls->type != EOLIAN_CLASS_INTERFACE && !virt)
return;
if (foo_id->type == EOLIAN_PROP_GET || foo_id->type == EOLIAN_METHOD)
@ -1202,7 +1208,8 @@ parse_property(Eo_Lexer *ls)
Eina_Bool has_get = EINA_FALSE, has_set = EINA_FALSE,
has_keys = EINA_FALSE, has_values = EINA_FALSE,
has_protected = EINA_FALSE, has_class = EINA_FALSE,
has_c_only = EINA_FALSE, has_beta = EINA_FALSE;
has_c_only = EINA_FALSE, has_beta = EINA_FALSE,
has_virtp = EINA_FALSE;
prop = calloc(1, sizeof(Eolian_Function));
prop->klass = ls->tmp.kls;
prop->type = EOLIAN_UNRESOLVED;
@ -1233,6 +1240,10 @@ parse_property(Eo_Lexer *ls)
prop->is_beta = EINA_TRUE;
eo_lexer_get(ls);
break;
case KW_at_virtual_pure:
CASE_LOCK(ls, virtp, "virtual_pure qualifier");
eo_lexer_get(ls);
break;
default:
goto body;
}
@ -1266,7 +1277,7 @@ end:
check_match(ls, '}', '{', line, col);
if (!has_get && !has_set)
prop->type = EOLIAN_PROPERTY;
_interface_virtual_set(ls, prop);
_func_virtual_set(ls, prop, has_virtp);
}
static void
@ -1278,7 +1289,7 @@ parse_method(Eo_Lexer *ls)
has_return = EINA_FALSE, has_legacy = EINA_FALSE,
has_protected = EINA_FALSE, has_class = EINA_FALSE,
has_eo = EINA_FALSE, has_c_only = EINA_FALSE,
has_beta = EINA_FALSE;
has_beta = EINA_FALSE, has_virtp = EINA_FALSE;
meth = calloc(1, sizeof(Eolian_Function));
meth->klass = ls->tmp.kls;
meth->type = EOLIAN_METHOD;
@ -1314,6 +1325,10 @@ parse_method(Eo_Lexer *ls)
meth->is_beta = EINA_TRUE;
eo_lexer_get(ls);
break;
case KW_at_virtual_pure:
CASE_LOCK(ls, virtp, "virtual_pure qualifier");
eo_lexer_get(ls);
break;
default:
goto body;
}
@ -1356,7 +1371,7 @@ body:
}
end:
check_match(ls, '}', '{', line, col);
_interface_virtual_set(ls, meth);
_func_virtual_set(ls, meth, has_virtp);
}
static void
@ -1389,10 +1404,6 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
ls->tmp.kls->implements = eina_list_append(ls->tmp.kls->implements, impl);
switch (ls->t.kw)
{
case KW_at_virtual:
impl->is_virtual = EINA_TRUE;
eo_lexer_get(ls);
break;
case KW_at_auto:
impl->is_auto = EINA_TRUE;
eo_lexer_get(ls);
@ -1406,15 +1417,12 @@ parse_implement(Eo_Lexer *ls, Eina_Bool iface)
}
if (ls->t.token == '.')
{
if (!impl->is_virtual && !impl->is_auto && !impl->is_empty)
if (!impl->is_auto && !impl->is_empty)
goto fullclass;
check_next(ls, '.');
if ((ls->t.token != TOK_VALUE) || (ls->t.kw == KW_get || ls->t.kw == KW_set))
eo_lexer_syntax_error(ls, "name expected");
if (impl->is_virtual)
impl->full_name = eina_stringshare_ref(ls->t.value.s);
else
impl->full_name = eina_stringshare_printf(".%s", ls->t.value.s);
impl->full_name = eina_stringshare_printf(".%s", ls->t.value.s);
eo_lexer_get(ls);
if (ls->t.token == '.')
{

View File

@ -16,7 +16,7 @@ mixin Efl.Canvas.Surface (Evas.Image)
Set to $null to detach this surface from the external buffer.
]]
get {}
set {
set @virtual_pure {
[[Set the buffer. If this fails, this function returns $false,
and the surface is left without any attached buffer.
]]
@ -29,6 +29,5 @@ mixin Efl.Canvas.Surface (Evas.Image)
}
implements {
Eo.Base.constructor;
@virtual .native_buffer.set;
}
}

View File

@ -80,7 +80,7 @@ abstract Efl.VG (Eo.Base, Efl.Gfx, Efl.Gfx.Stack)
Evas_VG_Quality q;
}
} */
bounds_get {
bounds_get @virtual_pure {
[[Give the bounding box in screen coordinate as being drawn.
It will start as the control box until it is refined once the shape
@ -124,6 +124,5 @@ abstract Efl.VG (Eo.Base, Efl.Gfx, Efl.Gfx.Stack)
Efl.Gfx.Stack.stack_above;
Efl.Gfx.Stack.raise;
Efl.Gfx.Stack.lower;
@virtual .bounds_get;
}
}

View File

@ -35,13 +35,13 @@ class Evas.Canvas3D.Object (Eo.Base, Evas.Common_Interface)
update {
[[Update request for the object.]]
}
update_notify {
update_notify @virtual_pure {
[[Pure virtual update_notify function.
Update request for the object.]]
}
change_notify {
change_notify @virtual_pure {
[[Pure virtual change_notify function.
Update request for the object.]]
@ -50,14 +50,14 @@ class Evas.Canvas3D.Object (Eo.Base, Evas.Common_Interface)
@in ref: Evas.Canvas3D.Object *; [[The Object that caused the change.]]
}
}
callback_register {
callback_register @virtual_pure {
[[Pure virtual register samrt callback function.]]
params {
@in event: const(char)*; [[Event type.]]
@in data: const(void)*; [[User data.]]
}
}
callback_unregister {
callback_unregister @virtual_pure {
[[Pure virtual unregister smart callback function.]]
params {
@in event: const(char)*; [[Event type.]]
@ -70,10 +70,6 @@ class Evas.Canvas3D.Object (Eo.Base, Evas.Common_Interface)
Eo.Base.event_callback_priority_add;
Eo.Base.event_callback_del;
Evas.Common_Interface.evas.get;
@virtual .update_notify;
@virtual .change_notify;
@virtual .callback_register;
@virtual .callback_unregister;
}
events {
clicked; [[Clicked Event.]]

View File

@ -22,11 +22,11 @@ mixin Evas.Filter (Efl.Gfx.Filter, Eo.Base)
val: bool;
}
}
filter_input_alpha @protected {
filter_input_alpha @protected @virtual_pure {
[[Called by Evas.Filter to determine whether the input is alpha or rgba.]]
return: bool;
}
filter_input_render @protected {
filter_input_render @protected @virtual_pure {
[[Called by Evas.Filter when the parent class must render the input.
;
]]
@ -41,7 +41,7 @@ mixin Evas.Filter (Efl.Gfx.Filter, Eo.Base)
do_async: bool;
}
}
filter_dirty @protected {
filter_dirty @protected @virtual_pure {
[[Called when the filter changes must trigger a redraw of the object.
Virtual, to be implemented in the parent class.
@ -71,8 +71,5 @@ mixin Evas.Filter (Efl.Gfx.Filter, Eo.Base)
Efl.Gfx.Filter.filter_source.get;
Efl.Gfx.Filter.filter_data.get;
Efl.Gfx.Filter.filter_data.set;
@virtual .filter_input_alpha;
@virtual .filter_input_render;
@virtual .filter_dirty;
}
}

View File

@ -7,14 +7,11 @@ class Base {
c: float;
}
}
constructor {
constructor @virtual_pure {
}
destructor {
}
}
implements {
@virtual .constructor;
}
constructors {
.constructor;
}

View File

@ -2,11 +2,8 @@ class nmsp1.nmsp11.class2
{
methods {
@property a {
set {
set @virtual_pure {
}
}
}
implements {
@virtual .a.set;
}
}

View File

@ -19,7 +19,7 @@ class Object_Impl (Base) {
@property b {
set {
}
get {
get @virtual_pure {
/* set as virtual pure - no implementation expected */
}
values {
@ -50,7 +50,7 @@ class Object_Impl (Base) {
@in b: const(char)*;
}
}
pure_foo3 {
pure_foo3 @virtual_pure {
/* set as virtual pure - no implementation expected */
}
}
@ -59,8 +59,6 @@ class Object_Impl (Base) {
class.destructor;
Base.constructor;
Base.destructor;
@virtual .pure_foo3;
@virtual .b.get;
}
constructors {
.constructor_1;

View File

@ -1,7 +1,7 @@
class Override (Base) {
methods {
@property a {
set {
set @virtual_pure {
}
get {
}
@ -32,7 +32,7 @@ class Override (Base) {
c: int(50);
}
}
foo {
foo @virtual_pure {
}
bar {
params {
@ -44,8 +44,6 @@ class Override (Base) {
}
implements {
Base.constructor;
@virtual .a.set;
@virtual .foo;
@auto .b.set;
@empty .bar;
@auto .c.get;

View File

@ -1,5 +1,3 @@
EOAPI EO_VOID_FUNC_BODY(override_a_set);
EOAPI EO_VOID_FUNC_BODY(override_foo);
static void __eolian_override_b_set(Eo *obj EINA_UNUSED, Override_Data *pd, int idx EINA_UNUSED, float a, char b, int c)
{
@ -24,6 +22,7 @@ static int __eolian_override_c_get(Eo *obj EINA_UNUSED, Override_Data *pd EINA_U
}
EOAPI EO_FUNC_BODYV_CONST(override_c_get, int, 50, EO_FUNC_CALL(idx), int idx);
EOAPI EO_VOID_FUNC_BODY(override_a_set);
void _override_a_get(Eo *obj, Override_Data *pd);
@ -36,6 +35,7 @@ EOAPI EO_VOID_FUNC_BODYV_CONST(override_b_get, EO_FUNC_CALL(idx, a, b, c), int i
void _override_c_set(Eo *obj, Override_Data *pd, int idx, int c);
EOAPI EO_VOID_FUNC_BODYV(override_c_set, EO_FUNC_CALL(idx, c), int idx, int c);
EOAPI EO_VOID_FUNC_BODY(override_foo);
void _override_base_constructor(Eo *obj, Override_Data *pd);
@ -57,14 +57,14 @@ static const Eo_Op_Description _override_op_desc[] = {
EO_OP_FUNC_OVERRIDE(base_constructor, _override_base_constructor),
EO_OP_FUNC_OVERRIDE(base_z_get, __eolian_override_base_z_get),
EO_OP_FUNC_OVERRIDE(base_z_set, __eolian_override_base_z_set),
EO_OP_FUNC(override_a_set, NULL),
EO_OP_FUNC(override_foo, NULL),
EO_OP_FUNC(override_b_set, __eolian_override_b_set),
EO_OP_FUNC(override_bar, __eolian_override_bar),
EO_OP_FUNC(override_c_get, __eolian_override_c_get),
EO_OP_FUNC(override_a_set, NULL),
EO_OP_FUNC(override_a_get, _override_a_get),
EO_OP_FUNC(override_b_get, _override_b_get),
EO_OP_FUNC(override_c_set, _override_c_set),
EO_OP_FUNC(override_foo, NULL),
};
static const Eo_Class_Description _override_class_desc = {
@ -78,4 +78,4 @@ static const Eo_Class_Description _override_class_desc = {
NULL
};
EO_DEFINE_CLASS(override_class_get, &_override_class_desc, BASE_CLASS, NULL);
EO_DEFINE_CLASS(override_class_get, &_override_class_desc, BASE_CLASS, NULL);

View File

@ -221,33 +221,6 @@ START_TEST(eolian_override)
fail_if(impl_class != base);
fail_if(strcmp(eolian_function_name_get(impl_func), "constructor"));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(!eolian_implement_is_virtual(impl));
fail_if(!(impl_class = eolian_implement_class_get(impl)));
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
fail_if(impl_class != class);
fail_if(strcmp(eolian_function_name_get(impl_func), "a"));
fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_SET));
fail_if(eolian_function_is_auto(impl_func, EOLIAN_PROP_GET));
fail_if(eolian_function_is_empty(impl_func, EOLIAN_PROP_SET));
fail_if(eolian_function_is_empty(impl_func, EOLIAN_PROP_GET));
fail_if(!eolian_function_is_virtual_pure(impl_func, EOLIAN_PROP_SET));
fail_if(eolian_function_is_virtual_pure(impl_func, EOLIAN_PROP_GET));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));
fail_if(!eolian_implement_is_virtual(impl));
fail_if(!(impl_class = eolian_implement_class_get(impl)));
fail_if(!(impl_func = eolian_implement_function_get(impl, NULL)));
fail_if(impl_class != class);
fail_if(strcmp(eolian_function_name_get(impl_func), "foo"));
fail_if(eolian_function_is_auto(impl_func, EOLIAN_METHOD));
fail_if(eolian_function_is_empty(impl_func, EOLIAN_METHOD));
fail_if(!eolian_function_is_virtual_pure(impl_func, EOLIAN_METHOD));
fail_if(!(eina_iterator_next(iter, (void**)&impl)));
fail_if(!eolian_implement_is_auto(impl));
fail_if(eolian_implement_is_empty(impl));