summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohan Dahlin <johan@gnome.org>2010-09-14 19:31:46 -0300
committerJohan Dahlin <johan@gnome.org>2010-09-14 19:37:52 -0300
commitc31120dd00d2ea1513399832461ed4437c6940de (patch)
tree3a62e8ceb6509b80d34cf0cb8a33d519c6779130
parent839afcc48c492690e4d25ab763b081ce37cd1858 (diff)
Add a parameter mismatch warning
https://bugzilla.gnome.org/show_bug.cgi?id=629708
-rw-r--r--giscanner/annotationparser.py3
-rw-r--r--giscanner/ast.py1
-rw-r--r--giscanner/maintransformer.py25
-rw-r--r--tests/warn/Makefile.am1
-rw-r--r--tests/warn/unknown-parameter.h28
-rw-r--r--tests/warn/warningtester.py2
6 files changed, 59 insertions, 1 deletions
diff --git a/giscanner/annotationparser.py b/giscanner/annotationparser.py
index fedefcd..2aa198e 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 53ddad2..8ff61e1 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 a7f2b61..550023f 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 9e585bd..deece2f 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 0000000..5b43c75
--- /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 f30e3e0..a3de1e8 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" % (