cython-devel
changeset 1476:31644ed14440
embed __init__ signature in class docstring
| author | Stefan Behnel <scoder@users.berlios.de> |
|---|---|
| date | Thu Dec 11 09:57:31 2008 +0100 (19 months ago) |
| parents | bee2bcfee0a4 |
| children | 4105074b6c2e |
| files | Cython/Compiler/AutoDocTransforms.py tests/run/embedsignatures.pyx |
line diff
1.1 --- a/Cython/Compiler/AutoDocTransforms.py Wed Dec 10 07:48:40 2008 +0100
1.2 +++ b/Cython/Compiler/AutoDocTransforms.py Thu Dec 11 09:57:31 2008 +0100
1.3 @@ -13,6 +13,7 @@
1.4 super(EmbedSignature, self).__init__(context)
1.5 self.denv = None # XXX
1.6 self.class_name = None
1.7 + self.class_node = None
1.8
1.9 def _fmt_arg_defv(self, arg):
1.10 if not arg.default:
1.11 @@ -40,11 +41,13 @@
1.12
1.13 def _fmt_arglist(self, args,
1.14 npargs=0, pargs=None,
1.15 - nkargs=0, kargs=None):
1.16 + nkargs=0, kargs=None,
1.17 + hide_self=False):
1.18 arglist = []
1.19 for arg in args:
1.20 - arg_doc = self._fmt_arg(arg)
1.21 - arglist.append(arg_doc)
1.22 + if not hide_self or not arg.entry.is_self_arg:
1.23 + arg_doc = self._fmt_arg(arg)
1.24 + arglist.append(arg_doc)
1.25 if pargs:
1.26 arglist.insert(npargs, '*%s' % pargs.name)
1.27 elif nkargs:
1.28 @@ -62,10 +65,11 @@
1.29 def _fmt_signature(self, cls_name, func_name, args,
1.30 npargs=0, pargs=None,
1.31 nkargs=0, kargs=None,
1.32 - return_type=None):
1.33 + return_type=None, hide_self=False):
1.34 arglist = self._fmt_arglist(args,
1.35 npargs, pargs,
1.36 - nkargs, kargs)
1.37 + nkargs, kargs,
1.38 + hide_self=hide_self)
1.39 arglist_doc = ', '.join(arglist)
1.40 func_doc = '%s(%s)' % (func_name, arglist_doc)
1.41 if cls_name:
1.42 @@ -91,6 +95,8 @@
1.43
1.44 def visit_ClassDefNode(self, node):
1.45 oldname = self.class_name
1.46 + oldclass = self.class_node
1.47 + self.class_node = node
1.48 try:
1.49 # PyClassDefNode
1.50 self.class_name = node.name
1.51 @@ -99,30 +105,52 @@
1.52 self.class_name = node.class_name
1.53 self.visitchildren(node)
1.54 self.class_name = oldname
1.55 + self.class_node = oldclass
1.56 return node
1.57
1.58 - def visit_FuncDefNode(self, node):
1.59 + def visit_DefNode(self, node):
1.60 if not self.current_directives['embedsignature']:
1.61 return node
1.62
1.63 - signature = None
1.64 - if type(node) is DefNode: # def FOO(...):
1.65 - if not node.entry.is_special:
1.66 - nkargs = getattr(node, 'num_kwonly_args', 0)
1.67 - npargs = len(node.args) - nkargs
1.68 - signature = self._fmt_signature(
1.69 - self.class_name, node.name, node.args,
1.70 - npargs, node.star_arg,
1.71 - nkargs, node.starstar_arg,
1.72 - return_type=None)
1.73 - elif type(node) is CFuncDefNode:
1.74 - if node.overridable: # cpdef FOO(...):
1.75 - signature = self._fmt_signature(
1.76 - self.class_name, node.declarator.base.name,
1.77 - node.declarator.args,
1.78 - return_type=node.return_type)
1.79 - else: # should not fall here ...
1.80 - assert False
1.81 + is_constructor = False
1.82 + hide_self = False
1.83 + if node.entry.is_special:
1.84 + is_constructor = self.class_node and node.name == '__init__'
1.85 + if not is_constructor:
1.86 + return node
1.87 + class_name, func_name = None, self.class_name
1.88 + hide_self = True
1.89 + else:
1.90 + class_name, func_name = self.class_name, node.name
1.91 +
1.92 + nkargs = getattr(node, 'num_kwonly_args', 0)
1.93 + npargs = len(node.args) - nkargs
1.94 + signature = self._fmt_signature(
1.95 + class_name, func_name, node.args,
1.96 + npargs, node.star_arg,
1.97 + nkargs, node.starstar_arg,
1.98 + return_type=None, hide_self=hide_self)
1.99 + if signature:
1.100 + if is_constructor:
1.101 + doc_holder = self.class_node.entry.type.scope
1.102 + else:
1.103 + doc_holder = node.entry
1.104 + new_doc = self._embed_signature(signature, doc_holder.doc)
1.105 + doc_holder.doc = EncodedString(new_doc)
1.106 + if not is_constructor and getattr(node, 'py_func', None) is not None:
1.107 + node.py_func.entry.doc = EncodedString(new_doc)
1.108 + return node
1.109 +
1.110 + def visit_CFuncDefNode(self, node):
1.111 + if not self.current_directives['embedsignature']:
1.112 + return node
1.113 + if not node.overridable: # not cpdef FOO(...):
1.114 + return node
1.115 +
1.116 + signature = self._fmt_signature(
1.117 + self.class_name, node.declarator.base.name,
1.118 + node.declarator.args,
1.119 + return_type=node.return_type)
1.120 if signature:
1.121 new_doc = self._embed_signature(signature, node.entry.doc)
1.122 node.entry.doc = EncodedString(new_doc)
2.1 --- a/tests/run/embedsignatures.pyx Wed Dec 10 07:48:40 2008 +0100
2.2 +++ b/tests/run/embedsignatures.pyx Thu Dec 11 09:57:31 2008 +0100
2.3 @@ -2,6 +2,9 @@
2.4
2.5 # note the r, we use \n below
2.6 __doc__ = ur"""
2.7 + >>> print (Ext.__doc__)
2.8 + Ext(a, b, c=None)
2.9 +
2.10 >>> print (Ext.a.__doc__)
2.11 Ext.a(self)
2.12
2.13 @@ -113,6 +116,9 @@
2.14
2.15 cdef class Ext:
2.16
2.17 + def __init__(self, a, b, c=None):
2.18 + pass
2.19 +
2.20 def a(self):
2.21 pass
2.22
2.23 @@ -147,7 +153,7 @@
2.24 return 0.0
2.25
2.26 cpdef Ext clone(self):
2.27 - return Ext()
2.28 + return Ext(1,2)
2.29
2.30 def foo():
2.31 pass
