Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/giscanner
diff options
context:
space:
mode:
Diffstat (limited to 'giscanner')
-rw-r--r--giscanner/annotationparser.py27
-rw-r--r--giscanner/ast.py10
2 files changed, 36 insertions, 1 deletions
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py
index fae839f..30b0eed 100644
--- a/giscanner/annotationparser.py
+++ b/giscanner/annotationparser.py
@@ -60,6 +60,8 @@ OPT_OUT = 'out'
OPT_SCOPE = 'scope'
OPT_TRANSFER = 'transfer'
OPT_TYPE = 'type'
+OPT_CLOSURE = 'closure'
+OPT_DESTROY = 'destroy'
# Specific option values
OPT_VAL_BITFIELD = 'bitfield'
@@ -476,14 +478,37 @@ class AnnotationApplier(object):
self._parse_param_ret_common(parent, return_, tag)
def _parse_param(self, parent, param, tag):
+ options = getattr(tag, 'options', {})
if isinstance(parent, Function):
- options = getattr(tag, 'options', {})
scope = options.get(OPT_SCOPE)
if scope:
param.scope = scope.one()
param.transfer = PARAM_TRANSFER_NONE
+ destroy = options.get(OPT_DESTROY)
+ if destroy:
+ param.destroy_index = parent.get_parameter_index(destroy.one())
+ self._fixup_param_destroy(parent, param)
+ closure = options.get(OPT_CLOSURE)
+ if closure:
+ param.closure_index = parent.get_parameter_index(closure.one())
+ self._fixup_param_closure(parent, param)
+ if isinstance(parent, Callback):
+ if OPT_CLOSURE in options:
+ param.closure_index = parent.get_parameter_index(param.name)
+ self._fixup_param_closure(parent, param)
+
self._parse_param_ret_common(parent, param, tag)
+ def _fixup_param_destroy(self, parent, param):
+ for p in parent.parameters:
+ if p is not param and p.destroy_index == param.destroy_index:
+ p.destroy_index = None
+
+ def _fixup_param_closure(self, parent, param):
+ for p in parent.parameters:
+ if p is not param and p.closure_index == param.closure_index:
+ p.closure_index = None
+
def _parse_param_ret_common(self, parent, node, tag):
options = getattr(tag, 'options', {})
node.direction = self._extract_direction(node, options)
diff --git a/giscanner/ast.py b/giscanner/ast.py
index 0d3f0bb..b0db6e2 100644
--- a/giscanner/ast.py
+++ b/giscanner/ast.py
@@ -521,6 +521,16 @@ class Callback(Node):
self.throws = False
self.doc = None
+ def get_parameter_index(self, name):
+ for i, parameter in enumerate(self.parameters):
+ if parameter.name == name:
+ return i
+
+ def get_parameter(self, name):
+ for parameter in self.parameters:
+ if parameter.name == name:
+ return parameter
+
def __repr__(self):
return 'Callback(%r, %r, %r)' % (
self.name, self.retval, self.parameters)