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