[gobject-introspection] Apply `(type bitfield)' annotations for enums



commit d15e386c8e10dd6b645a444e29cc053100089a07
Author: Andreas Rottmann <a rottmann gmx at>
Date:   Tue Oct 5 23:49:33 2010 +0200

    Apply `(type bitfield)' annotations for enums
    
    Previously, such annotations would be ignored.

 giscanner/maintransformer.py              |   11 +++++++++--
 tests/scanner/Annotation-1.0-expected.gir |    4 ++++
 tests/scanner/annotation.h                |    9 +++++++++
 3 files changed, 22 insertions(+), 2 deletions(-)
---
diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py
index 89f7ff6..9053abf 100644
--- a/giscanner/maintransformer.py
+++ b/giscanner/maintransformer.py
@@ -219,8 +219,9 @@ usage is void (*_gtk_reserved1)(void);"""
             self._apply_annotations_function(node, chain)
         if isinstance(node, ast.Callback):
             self._apply_annotations_callable(node, chain, block = self._get_block(node))
-        if isinstance(node, (ast.Class, ast.Interface, ast.Union, ast.Enum,
-                             ast.Bitfield, ast.Callback)):
+        if isinstance(node, (ast.Enum, ast.Bitfield)):
+            self._apply_annotations_enum(node, self._get_block(node))
+        if isinstance(node, (ast.Class, ast.Interface, ast.Union, ast.Callback)):
             self._apply_annotations_annotated(node, self._get_block(node))
         if isinstance(node, (ast.Class, ast.Interface, ast.Record, ast.Union)):
             block = self._get_block(node)
@@ -409,6 +410,12 @@ usage is void (*_gtk_reserved1)(void);"""
             message.warn_node(parent,
                 "Unknown container %r for element-type annotation" % (node.type, ))
 
+    def _apply_annotations_enum(self, node, block):
+        enum_type = block.options.get(OPT_TYPE)
+        if enum_type and enum_type.one() == 'bitfield':
+            node.__class__ = ast.Bitfield
+        self._apply_annotations_annotated(node, block)
+
     def _get_transfer_default_param(self, parent, node):
         if node.direction in [ast.PARAM_DIRECTION_INOUT,
                               ast.PARAM_DIRECTION_OUT]:
diff --git a/tests/scanner/Annotation-1.0-expected.gir b/tests/scanner/Annotation-1.0-expected.gir
index 050d888..92d4ff2 100644
--- a/tests/scanner/Annotation-1.0-expected.gir
+++ b/tests/scanner/Annotation-1.0-expected.gir
@@ -15,6 +15,10 @@ and/or use gtk-doc annotations.  -->
              shared-library="libannotation.so"
              c:identifier-prefixes="Annotation"
              c:symbol-prefixes="annotation">
+    <bitfield name="Bitfield" c:type="AnnotationBitfield">
+      <member name="foo" value="1" c:identifier="ANNOTATION_FLAG_FOO"/>
+      <member name="bar" value="2" c:identifier="ANNOTATION_FLAG_BAR"/>
+    </bitfield>
     <callback name="Callback" c:type="AnnotationCallback">
       <doc xml:whitespace="preserve">This is a callback.</doc>
       <return-value transfer-ownership="none">
diff --git a/tests/scanner/annotation.h b/tests/scanner/annotation.h
index ef05ddb..9559e40 100644
--- a/tests/scanner/annotation.h
+++ b/tests/scanner/annotation.h
@@ -4,6 +4,15 @@
 #include <glib-object.h>
 
 /**
+ * AnnotationBitfield: (type bitfield)
+ **/
+typedef enum
+{
+  ANNOTATION_FLAG_FOO = 1,
+  ANNOTATION_FLAG_BAR = 2
+} AnnotationBitfield;
+
+/**
  * AnnotationCallback:
  * @in: (in) (transfer none): array of ints
  *



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]