q66 pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=7e94eb22b43c5b61fbdb40f109e8177cdc4eb1fc

commit 7e94eb22b43c5b61fbdb40f109e8177cdc4eb1fc
Author: Daniel Kolesa <d.kol...@osg.samsung.com>
Date:   Thu May 12 15:41:56 2016 +0100

    eolian: mark pure virtual funcs outside of implements
    
    This is a better syntax and should've been like this in the first place.
---
 src/lib/ecore_audio/ecore_audio.eo                 |  11 +-
 src/lib/ecore_audio/ecore_audio_in.eo              |  10 +-
 src/lib/ecore_con/efl_network.eo                   |  28 ++---
 src/lib/ector/cairo/ector_renderer_cairo.eo        |   3 +-
 src/lib/ector/ector_buffer.eo                      |  17 +--
 src/lib/ector/ector_renderer.eo                    |   9 +-
 src/lib/ector/ector_surface.eo                     |   8 +-
 src/lib/ector/gl/ector_renderer_gl.eo              |   3 +-
 src/lib/ector/software/ector_renderer_software.eo  |   5 +-
 src/lib/elementary/elm_interface_atspi_action.eo   |  19 +---
 src/lib/elementary/elm_interface_atspi_image.eo    |   5 +-
 .../elm_interface_atspi_widget_action.eo           |   3 +-
 src/lib/elementary/elm_web.eo                      | 117 +++++++--------------
 src/lib/elementary/elm_widget.eo                   |   9 +-
 src/lib/eolian/database_fill.c                     |  57 ++++++----
 src/lib/eolian/eo_lexer.h                          |   2 +-
 src/lib/eolian/eo_parser.c                         |  38 ++++---
 src/lib/evas/canvas/efl_canvas_surface.eo          |   3 +-
 src/lib/evas/canvas/efl_vg.eo                      |   3 +-
 src/lib/evas/canvas/evas_canvas3d_object.eo        |  12 +--
 src/lib/evas/canvas/evas_filter.eo                 |   9 +-
 src/tests/eolian/data/base.eo                      |   5 +-
 src/tests/eolian/data/nmsp1_nmsp11_class2.eo       |   5 +-
 src/tests/eolian/data/object_impl.eo               |   6 +-
 src/tests/eolian/data/override.eo                  |   6 +-
 src/tests/eolian/data/override_ref.c               |  10 +-
 src/tests/eolian/eolian_parsing.c                  |  27 -----
 27 files changed, 154 insertions(+), 276 deletions(-)

diff --git a/src/lib/ecore_audio/ecore_audio.eo 
b/src/lib/ecore_audio/ecore_audio.eo
index 0c8fdfa..bafea5c 100644
--- a/src/lib/ecore_audio/ecore_audio.eo
+++ b/src/lib/ecore_audio/ecore_audio.eo
@@ -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;
    }
 }
diff --git a/src/lib/ecore_audio/ecore_audio_in.eo 
b/src/lib/ecore_audio/ecore_audio_in.eo
index fd4da49..6ab3c8f 100644
--- a/src/lib/ecore_audio/ecore_audio_in.eo
+++ b/src/lib/ecore_audio/ecore_audio_in.eo
@@ -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.]]
diff --git a/src/lib/ecore_con/efl_network.eo b/src/lib/ecore_con/efl_network.eo
index f99bc3c..de62158 100644
--- a/src/lib/ecore_con/efl_network.eo
+++ b/src/lib/ecore_con/efl_network.eo
@@ -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;
diff --git a/src/lib/ector/cairo/ector_renderer_cairo.eo 
b/src/lib/ector/cairo/ector_renderer_cairo.eo
index 56e3632..fe90d47 100644
--- a/src/lib/ector/cairo/ector_renderer_cairo.eo
+++ b/src/lib/ector/cairo/ector_renderer_cairo.eo
@@ -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;
diff --git a/src/lib/ector/ector_buffer.eo b/src/lib/ector/ector_buffer.eo
index 13b14bd..1537bd2 100644
--- a/src/lib/ector/ector_buffer.eo
+++ b/src/lib/ector/ector_buffer.eo
@@ -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;
-   }
 }
diff --git a/src/lib/ector/ector_renderer.eo b/src/lib/ector/ector_renderer.eo
index 9287e43..ff0c84c 100644
--- a/src/lib/ector/ector_renderer.eo
+++ b/src/lib/ector/ector_renderer.eo
@@ -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;
    }
 }
diff --git a/src/lib/ector/ector_surface.eo b/src/lib/ector/ector_surface.eo
index aea7357..9243b17 100644
--- a/src/lib/ector/ector_surface.eo
+++ b/src/lib/ector/ector_surface.eo
@@ -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;
-   }
 }
diff --git a/src/lib/ector/gl/ector_renderer_gl.eo 
b/src/lib/ector/gl/ector_renderer_gl.eo
index f3ba232..5ee47d8 100644
--- a/src/lib/ector/gl/ector_renderer_gl.eo
+++ b/src/lib/ector/gl/ector_renderer_gl.eo
@@ -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;
diff --git a/src/lib/ector/software/ector_renderer_software.eo 
b/src/lib/ector/software/ector_renderer_software.eo
index aa9e46e..a875e3d 100644
--- a/src/lib/ector/software/ector_renderer_software.eo
+++ b/src/lib/ector/software/ector_renderer_software.eo
@@ -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;
-   }
 }
diff --git a/src/lib/elementary/elm_interface_atspi_action.eo 
b/src/lib/elementary/elm_interface_atspi_action.eo
index 558b4a1..1fea7bf 100644
--- a/src/lib/elementary/elm_interface_atspi_action.eo
+++ b/src/lib/elementary/elm_interface_atspi_action.eo
@@ -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;
-   }
 }
diff --git a/src/lib/elementary/elm_interface_atspi_image.eo 
b/src/lib/elementary/elm_interface_atspi_image.eo
index ed7ce9b..0ab631d 100644
--- a/src/lib/elementary/elm_interface_atspi_image.eo
+++ b/src/lib/elementary/elm_interface_atspi_image.eo
@@ -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;
-   }
 }
diff --git a/src/lib/elementary/elm_interface_atspi_widget_action.eo 
b/src/lib/elementary/elm_interface_atspi_widget_action.eo
index e93a422..e374b06 100644
--- a/src/lib/elementary/elm_interface_atspi_widget_action.eo
+++ b/src/lib/elementary/elm_interface_atspi_widget_action.eo
@@ -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;
    }
 }
diff --git a/src/lib/elementary/elm_web.eo b/src/lib/elementary/elm_web.eo
index 5c7205e..b52ed06 100644
--- a/src/lib/elementary/elm_web.eo
+++ b/src/lib/elementary/elm_web.eo
@@ -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;
diff --git a/src/lib/elementary/elm_widget.eo b/src/lib/elementary/elm_widget.eo
index 2b8e727..9406faf 100644
--- a/src/lib/elementary/elm_widget.eo
+++ b/src/lib/elementary/elm_widget.eo
@@ -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;
diff --git a/src/lib/eolian/database_fill.c b/src/lib/eolian/database_fill.c
index 0371991..c75f517 100644
--- a/src/lib/eolian/database_fill.c
+++ b/src/lib/eolian/database_fill.c
@@ -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);
 }
diff --git a/src/lib/eolian/eo_lexer.h b/src/lib/eolian/eo_lexer.h
index c00f7f3..e84b3c1 100644
--- a/src/lib/eolian/eo_lexer.h
+++ b/src/lib/eolian/eo_lexer.h
@@ -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), \
diff --git a/src/lib/eolian/eo_parser.c b/src/lib/eolian/eo_parser.c
index 07b0864..aac1ce4 100644
--- a/src/lib/eolian/eo_parser.c
+++ b/src/lib/eolian/eo_parser.c
@@ -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 == '.')
           {
diff --git a/src/lib/evas/canvas/efl_canvas_surface.eo 
b/src/lib/evas/canvas/efl_canvas_surface.eo
index 3a78d2b..e83c4ed 100644
--- a/src/lib/evas/canvas/efl_canvas_surface.eo
+++ b/src/lib/evas/canvas/efl_canvas_surface.eo
@@ -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;
    }
 }
diff --git a/src/lib/evas/canvas/efl_vg.eo b/src/lib/evas/canvas/efl_vg.eo
index 48d0e66..b34f0bc 100644
--- a/src/lib/evas/canvas/efl_vg.eo
+++ b/src/lib/evas/canvas/efl_vg.eo
@@ -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;
    }
 }
diff --git a/src/lib/evas/canvas/evas_canvas3d_object.eo 
b/src/lib/evas/canvas/evas_canvas3d_object.eo
index 5d2b2d5..75dadee 100644
--- a/src/lib/evas/canvas/evas_canvas3d_object.eo
+++ b/src/lib/evas/canvas/evas_canvas3d_object.eo
@@ -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.]]
diff --git a/src/lib/evas/canvas/evas_filter.eo 
b/src/lib/evas/canvas/evas_filter.eo
index 8383567..d9e4d7a 100644
--- a/src/lib/evas/canvas/evas_filter.eo
+++ b/src/lib/evas/canvas/evas_filter.eo
@@ -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;
    }
 }
diff --git a/src/tests/eolian/data/base.eo b/src/tests/eolian/data/base.eo
index 1b4ee4f..7fcd73e 100644
--- a/src/tests/eolian/data/base.eo
+++ b/src/tests/eolian/data/base.eo
@@ -7,14 +7,11 @@ class Base {
                 c: float;
            }
       }
-      constructor {
+      constructor @virtual_pure {
       }
       destructor {
       }
    }
-   implements {
-      @virtual .constructor;
-   }
    constructors {
       .constructor;
    }
diff --git a/src/tests/eolian/data/nmsp1_nmsp11_class2.eo 
b/src/tests/eolian/data/nmsp1_nmsp11_class2.eo
index 78c3414..27dd47c 100644
--- a/src/tests/eolian/data/nmsp1_nmsp11_class2.eo
+++ b/src/tests/eolian/data/nmsp1_nmsp11_class2.eo
@@ -2,11 +2,8 @@ class nmsp1.nmsp11.class2
 {
    methods {
       @property a {
-         set {
+         set @virtual_pure {
          }
       }
    }
-   implements {
-      @virtual .a.set;
-   }
 }
diff --git a/src/tests/eolian/data/object_impl.eo 
b/src/tests/eolian/data/object_impl.eo
index 17643a6..9635261 100644
--- a/src/tests/eolian/data/object_impl.eo
+++ b/src/tests/eolian/data/object_impl.eo
@@ -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;
diff --git a/src/tests/eolian/data/override.eo 
b/src/tests/eolian/data/override.eo
index 121efe9..7ab1f71 100644
--- a/src/tests/eolian/data/override.eo
+++ b/src/tests/eolian/data/override.eo
@@ -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;
diff --git a/src/tests/eolian/data/override_ref.c 
b/src/tests/eolian/data/override_ref.c
index b910f71..bd8ff13 100644
--- a/src/tests/eolian/data/override_ref.c
+++ b/src/tests/eolian/data/override_ref.c
@@ -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);
\ No newline at end of file
diff --git a/src/tests/eolian/eolian_parsing.c 
b/src/tests/eolian/eolian_parsing.c
index 874045d..f50af42 100644
--- a/src/tests/eolian/eolian_parsing.c
+++ b/src/tests/eolian/eolian_parsing.c
@@ -222,33 +222,6 @@ START_TEST(eolian_override)
    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));
    fail_if(eolian_implement_is_virtual(impl));

-- 


Reply via email to