Bug 573332 - Allow annotation of enums as bitfields
authorAndreas Rottmann <a.rottmann@gmx.at>
Wed, 4 Mar 2009 14:59:28 +0000 (15:59 +0100)
committerAndreas Rottmann <a.rottmann@gmx.at>
Wed, 4 Mar 2009 14:59:28 +0000 (15:59 +0100)
Add support for a `(type bitfield)' annotation for enums.

Signed-off-by: Andreas Rottmann <a.rottmann@gmx.at>
gir/glib-2.0.c
giscanner/annotationparser.py
tests/scanner/utility-1.0-expected.gir
tests/scanner/utility-1.0-expected.tgir
tests/scanner/utility.c
tests/scanner/utility.h

index ec98c4d..0fb1c68 100644 (file)
@@ -19,4 +19,6 @@
  * @context: (allow-none):
  */
 
+/**
+ * GIOCondition: (type bitfield)
+ **/
index b831f93..35300b0 100644 (file)
@@ -59,6 +59,9 @@ OPT_SCOPE = 'scope'
 OPT_TRANSFER = 'transfer'
 OPT_TYPE = 'type'
 
+# Specific option values
+OPT_VAL_BITFIELD = 'bitfield'
+
 # Array options - array specific annotations
 OPT_ARRAY_FIXED_SIZE = 'fixed-size'
 OPT_ARRAY_LENGTH = 'length'
@@ -344,6 +347,10 @@ class AnnotationApplier(object):
         self._parse_node_common(enum, block)
         if block:
             enum.doc = block.comment
+            type_opt = block.options.get(OPT_TYPE)
+            if type_opt and type_opt.one() == OPT_VAL_BITFIELD:
+                # This is hack, but hey, it works :-)
+                enum.__class__ = Bitfield
 
     def _parse_bitfield(self, bitfield):
         block = self._blocks.get(bitfield.symbol)
index 7ff6ca5..0ca72cb 100644 (file)
@@ -42,11 +42,11 @@ and/or use gtk-doc annotations.  -->
         </parameter>
       </parameters>
     </callback>
-    <enumeration name="FlagType" c:type="UtilityFlagType">
-      <member name="a" value="0" c:identifier="UTILITY_FLAG_A"/>
-      <member name="b" value="1" c:identifier="UTILITY_FLAG_B"/>
-      <member name="c" value="2" c:identifier="UTILITY_FLAG_C"/>
-    </enumeration>
+    <bitfield name="FlagType" c:type="UtilityFlagType">
+      <member name="a" value="1" c:identifier="UTILITY_FLAG_A"/>
+      <member name="b" value="2" c:identifier="UTILITY_FLAG_B"/>
+      <member name="c" value="4" c:identifier="UTILITY_FLAG_C"/>
+    </bitfield>
     <class name="Object"
            c:type="UtilityObject"
            parent="GObject.Object"
index 46ba292..2653584 100644 (file)
         </parameter>
       </parameters>
     </callback>
-    <enumeration name="FlagType">
-      <member name="a" value="0"/>
-      <member name="b" value="1"/>
-      <member name="c" value="2"/>
-    </enumeration>
+    <bitfield name="FlagType">
+      <member name="a" value="1"/>
+      <member name="b" value="2"/>
+      <member name="c" value="4"/>
+    </bitfield>
     <class name="Object" parent="GObject.Object" glib:type-struct="ObjectClass" glib:type-name="UtilityObject" glib:get-type="utility_object_get_type">
       <field name="parent_instance">
         <type name="GObject.Object"/>
index 756de17..a54afad 100644 (file)
@@ -2,6 +2,10 @@
 
 G_DEFINE_TYPE (UtilityObject, utility_object, G_TYPE_OBJECT);
 
+/**
+ * UtilityFlagType: (type bitfield)
+ **/
+
 static void
 utility_object_class_init (UtilityObjectClass *klass)
 {
index b493a67..cad93ff 100644 (file)
@@ -62,9 +62,9 @@ typedef enum
 
 typedef enum
 {
-  UTILITY_FLAG_A,
-  UTILITY_FLAG_B,
-  UTILITY_FLAG_C
+  UTILITY_FLAG_A = 1,
+  UTILITY_FLAG_B = 2,
+  UTILITY_FLAG_C = 4
 } UtilityFlagType;
 
 typedef struct