diff options
author | Johan Dahlin <johan@gnome.org> | 2010-09-23 18:36:37 -0300 |
---|---|---|
committer | Johan Dahlin <johan@gnome.org> | 2010-09-23 18:53:55 -0300 |
commit | b57c12a01e48e6b75aab97d409d45ce110978536 (patch) | |
tree | 537d11ff830e7627280c7485491701812e0f89a2 | |
parent | b8bad329f62755984e9e23f1fc50f119acf4625c (diff) | |
download | gobject-introspection-b57c12a01e48e6b75aab97d409d45ce110978536.tar.gz |
Validate transfer annnotations
-rw-r--r-- | giscanner/annotationparser.py | 26 | ||||
-rw-r--r-- | giscanner/maintransformer.py | 2 | ||||
-rw-r--r-- | tests/warn/Makefile.am | 1 | ||||
-rw-r--r-- | tests/warn/invalid-transfer.h | 12 |
4 files changed, 39 insertions, 2 deletions
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py index 376919dd..4febc598 100644 --- a/giscanner/annotationparser.py +++ b/giscanner/annotationparser.py @@ -84,6 +84,12 @@ OPT_SCOPE_ASYNC = 'async' OPT_SCOPE_CALL = 'call' OPT_SCOPE_NOTIFIED = 'notified' +# Transfer options +OPT_TRANSFER_NONE = 'none' +OPT_TRANSFER_CONTAINER = 'container' +OPT_TRANSFER_FULL = 'full' + + class DocBlock(object): def __init__(self, name): @@ -124,7 +130,22 @@ class DocTag(object): if not option in ALL_OPTIONS: message.warn('invalid option: %s' % (option, ), positions=self.position) - + if option == OPT_TRANSFER: + value = self.options[option] + if value is None: + message.warn('transfer needs a value', + self.position) + continue + if value.length() != 1: + message.warn('transfer needs one value, not %d' % ( + value.length()), self.position) + continue + valuestr = value.one() + if valuestr not in [OPT_TRANSFER_NONE, + OPT_TRANSFER_CONTAINER, + OPT_TRANSFER_FULL]: + message.warn('invalid transfer value: %r' % ( + valuestr, ), self.position) class DocOptions(object): def __init__(self): @@ -178,6 +199,9 @@ class DocOption(object): def __repr__(self): return '<DocOption %r>' % (self._array, ) + def length(self): + return len(self._array) + def one(self): assert len(self._array) == 1 return self._array[0] diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index f36e5b75..d41b55f0 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -496,7 +496,7 @@ usage is void (*_gtk_reserved1)(void);""" node.transfer = self._get_transfer_default(parent, node) transfer_tag = options.get(OPT_TRANSFER) - if transfer_tag: + if transfer_tag and transfer_tag.length() == 1: node.transfer = transfer_tag.one() self._adjust_container_type(parent, node, options) diff --git a/tests/warn/Makefile.am b/tests/warn/Makefile.am index 44515d7e..bdcc9707 100644 --- a/tests/warn/Makefile.am +++ b/tests/warn/Makefile.am @@ -5,6 +5,7 @@ TESTS = \ callback-missing-scope.h \ return-gobject.h \ invalid-option.h \ + invalid-transfer.h \ unknown-parameter.h \ unresolved-element-type.h \ unresolved-type.h diff --git a/tests/warn/invalid-transfer.h b/tests/warn/invalid-transfer.h new file mode 100644 index 00000000..3579ad15 --- /dev/null +++ b/tests/warn/invalid-transfer.h @@ -0,0 +1,12 @@ + +/** + * test_transfer_invalid: + * @param: (transfer): + * @param2: (transfer invalid): + * @param3: (transfer full foo): + */ +void test_transfer_invalid(int param, int param2, int param3); + +// EXPECT:4: Warning: Test: transfer annotation needs a value +// EXPECT:5: Warning: Test: invalid transfer annotation value: 'invalid' +// EXPECT:6: Warning: Test: transfer annotation needs one value, not 2 |