diff options
author | Johan Dahlin <johan@gnome.org> | 2010-09-14 19:31:46 -0300 |
---|---|---|
committer | Johan Dahlin <johan@gnome.org> | 2010-09-14 19:37:52 -0300 |
commit | c31120dd00d2ea1513399832461ed4437c6940de (patch) | |
tree | 3a62e8ceb6509b80d34cf0cb8a33d519c6779130 | |
parent | 839afcc48c492690e4d25ab763b081ce37cd1858 (diff) | |
download | gobject-introspection-c31120dd00d2ea1513399832461ed4437c6940de.tar.gz |
Add a parameter mismatch warning
https://bugzilla.gnome.org/show_bug.cgi?id=629708
-rw-r--r-- | giscanner/annotationparser.py | 3 | ||||
-rw-r--r-- | giscanner/ast.py | 1 | ||||
-rw-r--r-- | giscanner/maintransformer.py | 25 | ||||
-rw-r--r-- | tests/warn/Makefile.am | 1 | ||||
-rw-r--r-- | tests/warn/unknown-parameter.h | 28 | ||||
-rw-r--r-- | tests/warn/warningtester.py | 2 |
6 files changed, 59 insertions, 1 deletions
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py index fedefcd1..2aa198e2 100644 --- a/giscanner/annotationparser.py +++ b/giscanner/annotationparser.py @@ -74,6 +74,7 @@ class DocBlock(object): self.value = None self.tags = odict() self.comment = None + self.params = [] def __repr__(self): return '<DocBlock %r %r>' % (self.name, self.options) @@ -235,6 +236,8 @@ class AnnotationParser(object): tag.comment = line[first_colonspace_index+2:].strip() block.tags[argname] = tag last_param_tag = tag + if is_parameter: + block.params.append(argname) elif (not is_parameter) and parsing_parameters and last_param_tag: # We need to handle continuation lines on parameters. The # conditional above - if a line doesn't start with '@', we're diff --git a/giscanner/ast.py b/giscanner/ast.py index 53ddad26..8ff61e1d 100644 --- a/giscanner/ast.py +++ b/giscanner/ast.py @@ -523,6 +523,7 @@ class Callable(Node): self.retval = retval self.parameters = parameters self.throws = not not throws + self.instance_parameter = None # Parameter def get_parameter_index(self, name): for i, parameter in enumerate(self.parameters): diff --git a/giscanner/maintransformer.py b/giscanner/maintransformer.py index a7f2b61d..550023f4 100644 --- a/giscanner/maintransformer.py +++ b/giscanner/maintransformer.py @@ -560,12 +560,34 @@ usage is void (*_gtk_reserved1)(void);""" self._apply_annotations_param_ret_common(parent, return_, tag) def _apply_annotations_params(self, parent, params, block): + allparams = [] + if parent.instance_parameter: + allparams.append(parent.instance_parameter.argname) for param in params: if block: tag = block.get(param.argname) else: tag = None self._apply_annotations_param(parent, param, tag) + allparams.append(param.argname) + + if not block: + return + docparams = block.params[:] + for doc_name in docparams: + if doc_name in allparams: + continue + if len(allparams) == 0: + text = '' + elif len(allparams) == 1: + text = ', should be %r' % (allparams[0], ) + else: + text = ', should be one of %s' % ( + ', '.join(repr(p) for p in allparams), ) + + message.warn( + '%s: unknown parameter %r in documentation comment%s' % ( + block.name, doc_name, text)) def _apply_annotations_callable(self, node, chain, block): self._apply_annotations_annotated(node, block) @@ -822,7 +844,7 @@ method or constructor of some type.""" uscored = self._uscored_identifier_for_type(first.type) if not subsymbol.startswith(uscored): return False - del func.parameters[0] + func.instance_parameter = func.parameters.pop(0) subsym_idx = func.symbol.find(subsymbol) self._namespace.float(func) func.name = func.symbol[(subsym_idx + len(uscored) + 1):] @@ -954,6 +976,7 @@ method or constructor of some type.""" if matched_signal: continue vfunc = ast.VFunction.from_callback(callback) + vfunc.instance_parameter = callback.parameters[0] vfunc.inherit_file_positions(callback) node.virtual_methods.append(vfunc) diff --git a/tests/warn/Makefile.am b/tests/warn/Makefile.am index 9e585bda..deece2f3 100644 --- a/tests/warn/Makefile.am +++ b/tests/warn/Makefile.am @@ -4,6 +4,7 @@ TESTS = \ callback-invalid-scope.h \ callback-missing-scope.h \ return-gobject.h \ + unknown-parameter.h \ unresolved-type.h EXTRA_DIST = warningtester.py common.h $(TESTS) diff --git a/tests/warn/unknown-parameter.h b/tests/warn/unknown-parameter.h new file mode 100644 index 00000000..5b43c759 --- /dev/null +++ b/tests/warn/unknown-parameter.h @@ -0,0 +1,28 @@ +/* See https://bugzilla.gnome.org/show_bug.cgi?id=629708 */ + +/** + * test_param_mismatch: + * @wrong_name: (out): + * + */ +void test_param_mismatch(int *out); + +// EXPECT:: Warning: Test: test_param_mismatch: unknown parameter 'wrong_name' in documentation comment, should be 'out' + +/** + * test_param_mismatch2: + * @wrong_name2: (out): + * + */ +void test_param_mismatch2(int a, int *out2); + +// EXPECT:: Warning: Test: test_param_mismatch2: unknown parameter 'wrong_name2' in documentation comment, should be one of 'a', 'out2' + +/** + * test_param_missing: + * @missing: (out): + * + */ +void test_param_missing(void); + +// EXPECT:: Warning: Test: test_param_missing: unknown parameter 'missing' in documentation comment diff --git a/tests/warn/warningtester.py b/tests/warn/warningtester.py index f30e3e04..a3de1e8b 100644 --- a/tests/warn/warningtester.py +++ b/tests/warn/warningtester.py @@ -101,6 +101,8 @@ def check(args): failed_tests = 0 expected_warnings = _extract_expected(filename) + if '' in warnings: + warnings.remove('') if len(expected_warnings) != len(warnings): raise SystemExit( "ERROR: expected %d warnings, but got %d: %r\n" % ( |