This was already in the DTD but not supported by the scanner.

The request/event parsing have an additional check that "since" cannot be <
interface version. This is missing here. For requests/events we can rely on
the xml containing the required "since" attributes already. enums don't have
those, so our default version of 1 for an enum introduced in interface version
> 1 would trigger warnings about version running backwards.

This doesn't matter for the output, it's just warnings, hence why they're
skipped here.

Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
---
Changes to v1:
- sync test-scanner data files with the new output

 src/scanner.c               | 28 ++++++++++++++++++++++++----
 tests/data/example-client.h |  9 +++++++++
 tests/data/example-server.h |  9 +++++++++
 tests/data/example.xml      |  2 ++
 4 files changed, 44 insertions(+), 4 deletions(-)

diff --git a/src/scanner.c b/src/scanner.c
index 5d66fa4..9c92316 100644
--- a/src/scanner.c
+++ b/src/scanner.c
@@ -220,6 +220,7 @@ struct entry {
        char *uppercase_name;
        char *value;
        char *summary;
+       int since;
        struct wl_list link;
 };
 
@@ -797,6 +798,8 @@ start_element(void *data, const char *element_name, const 
char **atts)
                        fail(&ctx->loc, "no entry name given");
 
                entry = create_entry(name, value);
+               version = version_from_since(ctx, since);
+               entry->since = version;
 
                if (summary)
                        entry->summary = xstrdup(summary);
@@ -1278,16 +1281,33 @@ emit_enumerations(struct interface *interface)
                }
                printf("enum %s_%s {\n", interface->name, e->name);
                wl_list_for_each(entry, &e->entry_list, link) {
-                       if (entry->summary)
-                               printf("\t/**\n"
-                                      "\t * %s\n"
-                                      "\t */\n", entry->summary);
+                       if (entry->summary || entry->since > 1) {
+                               printf("\t/**\n");
+                               if (entry->summary)
+                                       printf("\t * %s\n", entry->summary);
+                               if (entry->since > 1)
+                                       printf("\t * @since %d\n", 
entry->since);
+                               printf("\t */\n");
+                       }
                        printf("\t%s_%s_%s = %s,\n",
                               interface->uppercase_name,
                               e->uppercase_name,
                               entry->uppercase_name, entry->value);
                }
                printf("};\n");
+
+               wl_list_for_each(entry, &e->entry_list, link) {
+                       if (entry->since == 1)
+                            continue;
+
+                        printf("/**\n * @ingroup iface_%s\n */\n", 
interface->name);
+                        printf("#define %s_%s_%s_SINCE_VERSION %d\n",
+                               interface->uppercase_name,
+                               e->uppercase_name, entry->uppercase_name,
+                               entry->since);
+
+               }
+
                printf("#endif /* %s_%s_ENUM */\n\n",
                       interface->uppercase_name, e->uppercase_name);
        }
diff --git a/tests/data/example-client.h b/tests/data/example-client.h
index 857aacf..b1d23f9 100644
--- a/tests/data/example-client.h
+++ b/tests/data/example-client.h
@@ -1778,7 +1778,16 @@ enum wl_data_offer_error {
         * offer doesn't accept this request
         */
        WL_DATA_OFFER_ERROR_INVALID_OFFER = 3,
+       /**
+        * test 'since' attribute parsing
+        * @since 3
+        */
+       WL_DATA_OFFER_ERROR_TEST_SINCE = 4,
 };
+/**
+ * @ingroup iface_wl_data_offer
+ */
+#define WL_DATA_OFFER_ERROR_TEST_SINCE_SINCE_VERSION 3
 #endif /* WL_DATA_OFFER_ERROR_ENUM */
 
 /**
diff --git a/tests/data/example-server.h b/tests/data/example-server.h
index f22f70f..f7190fd 100644
--- a/tests/data/example-server.h
+++ b/tests/data/example-server.h
@@ -1469,7 +1469,16 @@ enum wl_data_offer_error {
         * offer doesn't accept this request
         */
        WL_DATA_OFFER_ERROR_INVALID_OFFER = 3,
+       /**
+        * test 'since' attribute parsing
+        * @since 3
+        */
+       WL_DATA_OFFER_ERROR_TEST_SINCE = 4,
 };
+/**
+ * @ingroup iface_wl_data_offer
+ */
+#define WL_DATA_OFFER_ERROR_TEST_SINCE_SINCE_VERSION 3
 #endif /* WL_DATA_OFFER_ERROR_ENUM */
 
 /**
diff --git a/tests/data/example.xml b/tests/data/example.xml
index 22dcffd..0ad2577 100644
--- a/tests/data/example.xml
+++ b/tests/data/example.xml
@@ -427,6 +427,8 @@
             summary="action argument has an invalid value"/>
       <entry name="invalid_offer" value="3"
             summary="offer doesn't accept this request"/>
+      <entry name="test_since" value="4"
+            summary="test 'since' attribute parsing" since="3"/>
     </enum>
 
     <request name="accept">
-- 
2.9.3

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to