[gobject-introspection] giscanner: write nullable and optional attributes



commit 89d51bce0feb115a1b73f32b023bfabaeec9fde1
Author: Ryan Lortie <desrt desrt ca>
Date:   Wed Apr 16 11:22:32 2014 -0400

    giscanner: write nullable and optional attributes
    
    Record our internal 'nullable' and 'optional' attributes into the
    written .gir file.  It is now theoretically possible to express the
    concept of an out parameter with a nullable type (although presently
    there is no way to do this).
    
    Modify our own internal parser (in the scanner) to understand the
    newly-written attributes.
    
    Update the expected output of the 'Regress-1.0.gir' test to account for
    the new attributes.
    
    Nothing else understands 'nullable' yet, but the girparser in the
    typelib compiler already understands 'optional' and records a bit for it
    in the typelib.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=660879

 giscanner/ast.py                       |    7 ++-
 giscanner/girparser.py                 |    2 +
 giscanner/girwriter.py                 |    2 +
 tests/scanner/Regress-1.0-expected.gir |   80 ++++++++++++++++++++++++-------
 4 files changed, 70 insertions(+), 21 deletions(-)
---
diff --git a/giscanner/ast.py b/giscanner/ast.py
index 35a764a..12304eb 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -775,13 +775,14 @@ class Parameter(TypeContainer):
     """An argument to a function."""
 
     def __init__(self, argname, typenode, direction=None,
-                 transfer=None, allow_none=False, scope=None,
+                 transfer=None, nullable=False, optional=False,
+                 allow_none=False, scope=None,
                  caller_allocates=False):
         TypeContainer.__init__(self, typenode, transfer)
         self.argname = argname
         self.direction = direction
-        self.nullable = False
-        self.optional = False
+        self.nullable = nullable
+        self.optional = optional
 
         if allow_none:
             if self.direction == PARAM_DIRECTION_OUT:
diff --git a/giscanner/girparser.py b/giscanner/girparser.py
index cac166d..b158399 100644
--- a/giscanner/girparser.py
+++ b/giscanner/girparser.py
@@ -280,6 +280,8 @@ class GIRParser(object):
                               typeval,
                               node.attrib.get('direction') or ast.PARAM_DIRECTION_IN,
                               node.attrib.get('transfer-ownership'),
+                              node.attrib.get('nullable') == '1',
+                              node.attrib.get('optional') == '1',
                               node.attrib.get('allow-none') == '1',
                               node.attrib.get('scope'),
                               node.attrib.get('caller-allocates') == '1')
diff --git a/giscanner/girwriter.py b/giscanner/girwriter.py
index 49d24bc..49545e6 100644
--- a/giscanner/girwriter.py
+++ b/giscanner/girwriter.py
@@ -240,9 +240,11 @@ class GIRWriter(XMLWriter):
             attrs.append(('transfer-ownership',
                           parameter.transfer))
         if parameter.nullable:
+            attrs.append(('nullable', '1'))
             if parameter.direction != ast.PARAM_DIRECTION_OUT:
                 attrs.append(('allow-none', '1'))
         if parameter.optional:
+            attrs.append(('optional', '1'))
             if parameter.direction == ast.PARAM_DIRECTION_OUT:
                 attrs.append(('allow-none', '1'))
         if parameter.scope:
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 82c11d3..b119c33 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -192,7 +192,10 @@ and/or use gtk-doc annotations.  -->
             <doc xml:space="preserve">a #GObject</doc>
             <type name="AnnotationObject" c:type="RegressAnnotationObject*"/>
           </instance-parameter>
-          <parameter name="somearg" transfer-ownership="none" allow-none="1">
+          <parameter name="somearg"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
             <type name="utf8" c:type="const gchar*"/>
           </parameter>
         </parameters>
@@ -516,6 +519,7 @@ each string needs to be freed.</doc>
                      direction="inout"
                      caller-allocates="0"
                      transfer-ownership="full"
+                     nullable="1"
                      allow-none="1">
             <doc xml:space="preserve">This is an argument test</doc>
             <type name="gint" c:type="int*"/>
@@ -2870,6 +2874,7 @@ use it should be.</doc>
                      direction="out"
                      caller-allocates="0"
                      transfer-ownership="full"
+                     optional="1"
                      allow-none="1">
             <doc xml:space="preserve">A #RegressTestObj</doc>
             <type name="TestObj" c:type="RegressTestObj**"/>
@@ -2895,6 +2900,7 @@ use it should be.</doc>
         <parameters>
           <parameter name="callback"
                      transfer-ownership="none"
+                     nullable="1"
                      allow-none="1"
                      scope="call">
             <type name="TestCallback" c:type="RegressTestCallback"/>
@@ -2909,7 +2915,10 @@ use it should be.</doc>
           <instance-parameter name="obj" transfer-ownership="none">
             <type name="TestObj" c:type="RegressTestObj*"/>
           </instance-parameter>
-          <parameter name="two" transfer-ownership="none" allow-none="1">
+          <parameter name="two"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
             <doc xml:space="preserve">Another object</doc>
             <type name="TestObj" c:type="RegressTestObj*"/>
           </parameter>
@@ -3041,6 +3050,7 @@ case.</doc>
           </instance-parameter>
           <parameter name="callback"
                      transfer-ownership="none"
+                     nullable="1"
                      allow-none="1"
                      scope="call">
             <type name="TestCallback" c:type="RegressTestCallback"/>
@@ -3055,7 +3065,10 @@ case.</doc>
           <instance-parameter name="obj" transfer-ownership="none">
             <type name="TestObj" c:type="RegressTestObj*"/>
           </instance-parameter>
-          <parameter name="bare" transfer-ownership="none" allow-none="1">
+          <parameter name="bare"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
             <type name="GObject.Object" c:type="GObject*"/>
           </parameter>
         </parameters>
@@ -3483,7 +3496,10 @@ raise an error.</doc>
           <type name="none" c:type="void"/>
         </return-value>
         <parameters>
-          <parameter name="arr" transfer-ownership="none" allow-none="1">
+          <parameter name="arr"
+                     transfer-ownership="none"
+                     nullable="1"
+                     allow-none="1">
             <doc xml:space="preserve">numbers, or %NULL</doc>
             <array length="1" zero-terminated="0" c:type="gpointer">
               <type name="guint"/>
@@ -3653,7 +3669,10 @@ the introspection client langage.</doc>
             <parameter name="obj" transfer-ownership="none">
               <type name="TestObj" c:type="RegressTestObj*"/>
             </parameter>
-            <parameter name="two" transfer-ownership="none" allow-none="1">
+            <parameter name="two"
+                       transfer-ownership="none"
+                       nullable="1"
+                       allow-none="1">
               <doc xml:space="preserve">Another object</doc>
               <type name="TestObj" c:type="RegressTestObj*"/>
             </parameter>
@@ -4368,12 +4387,11 @@ detection, and fixing it via annotations.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="cancellable" transfer-ownership="none" allow-none="1">
+        <parameter name="cancellable" transfer-ownership="none">
           <type name="Gio.Cancellable" c:type="GCancellable*"/>
         </parameter>
         <parameter name="callback"
                    transfer-ownership="none"
-                   allow-none="1"
                    scope="async"
                    closure="2">
           <type name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
@@ -4685,7 +4703,10 @@ exposed to language bindings.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="obj" transfer-ownership="none" allow-none="1">
+        <parameter name="obj"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <doc xml:space="preserve">A #RegressTestObj</doc>
           <type name="TestObj" c:type="RegressTestObj*"/>
         </parameter>
@@ -5023,7 +5044,10 @@ libgnome-keyring.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="arr" transfer-ownership="none" allow-none="1">
+        <parameter name="arr"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <array length="1" zero-terminated="0" c:type="int*">
             <type name="gint" c:type="int"/>
           </array>
@@ -5044,6 +5068,7 @@ libgnome-keyring.</doc>
                    direction="out"
                    caller-allocates="0"
                    transfer-ownership="full"
+                   optional="1"
                    allow-none="1">
           <array length="1" zero-terminated="0" c:type="int**">
             <type name="gint" c:type="int*"/>
@@ -5088,10 +5113,7 @@ libgnome-keyring.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="callback"
-                   transfer-ownership="none"
-                   allow-none="1"
-                   scope="async">
+        <parameter name="callback" transfer-ownership="none" scope="async">
           <type name="Gio.AsyncReadyCallback" c:type="GAsyncReadyCallback"/>
         </parameter>
       </parameters>
@@ -5206,6 +5228,7 @@ libgnome-keyring.</doc>
       <parameters>
         <parameter name="callback"
                    transfer-ownership="none"
+                   nullable="1"
                    allow-none="1"
                    scope="call">
           <type name="TestCallback" c:type="RegressTestCallback"/>
@@ -5345,7 +5368,10 @@ call and can be released on return.</doc>
           <doc xml:space="preserve">GClosure which takes one GVariant and returns a GVariant</doc>
           <type name="GObject.Closure" c:type="GClosure*"/>
         </parameter>
-        <parameter name="arg" transfer-ownership="none" allow-none="1">
+        <parameter name="arg"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <doc xml:space="preserve">a GVariant passed as argument to @closure</doc>
           <type name="GLib.Variant" c:type="GVariant*"/>
         </parameter>
@@ -5560,7 +5586,10 @@ element-type annotation.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="in" transfer-ownership="none" allow-none="1">
+        <parameter name="in"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <type name="GLib.HashTable" c:type="const GHashTable*">
             <type name="utf8"/>
             <type name="utf8"/>
@@ -5578,6 +5607,7 @@ element-type annotation.</doc>
                    direction="out"
                    caller-allocates="0"
                    transfer-ownership="full"
+                   optional="1"
                    allow-none="1">
           <type name="GLib.HashTable" c:type="const GHashTable**">
             <type name="utf8"/>
@@ -5659,7 +5689,10 @@ element-type annotation.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="in" transfer-ownership="none" allow-none="1">
+        <parameter name="in"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <type name="GLib.SList" c:type="GSList*">
             <type name="utf8"/>
           </type>
@@ -5676,6 +5709,7 @@ element-type annotation.</doc>
                    direction="out"
                    caller-allocates="0"
                    transfer-ownership="full"
+                   optional="1"
                    allow-none="1">
           <type name="GLib.SList" c:type="GSList**">
             <type name="utf8"/>
@@ -5747,7 +5781,10 @@ element-type annotation.</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="in" transfer-ownership="none" allow-none="1">
+        <parameter name="in"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <type name="GLib.SList" c:type="GSList*">
             <type name="utf8"/>
           </type>
@@ -5764,6 +5801,7 @@ element-type annotation.</doc>
                    direction="out"
                    caller-allocates="0"
                    transfer-ownership="full"
+                   optional="1"
                    allow-none="1">
           <type name="GLib.SList" c:type="GSList**">
             <type name="utf8"/>
@@ -5927,6 +5965,7 @@ element-type annotation.</doc>
       <parameters>
         <parameter name="callback"
                    transfer-ownership="none"
+                   nullable="1"
                    allow-none="1"
                    scope="call">
           <type name="TestCallback" c:type="RegressTestCallback"/>
@@ -6057,6 +6096,7 @@ What we're testing here is that the scanner ignores the @a nested inside XML.</d
       <parameters>
         <parameter name="callback"
                    transfer-ownership="none"
+                   nullable="1"
                    allow-none="1"
                    scope="call">
           <type name="TestSimpleCallback" c:type="RegressTestSimpleCallback"/>
@@ -6446,7 +6486,10 @@ https://bugzilla.gnome.org/show_bug.cgi?id=685399</doc>
         <type name="none" c:type="void"/>
       </return-value>
       <parameters>
-        <parameter name="in" transfer-ownership="none" allow-none="1">
+        <parameter name="in"
+                   transfer-ownership="none"
+                   nullable="1"
+                   allow-none="1">
           <type name="utf8" c:type="char*"/>
         </parameter>
       </parameters>
@@ -6461,6 +6504,7 @@ https://bugzilla.gnome.org/show_bug.cgi?id=685399</doc>
                    direction="out"
                    caller-allocates="0"
                    transfer-ownership="full"
+                   optional="1"
                    allow-none="1">
           <type name="utf8" c:type="char**"/>
         </parameter>


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