Rename parse_signature() to handle_signature(); allows more to happen. Record module and class name in Python object descriptions.

This commit is contained in:
Georg Brandl
2010-01-13 20:58:44 +01:00
parent 54a31c5a6f
commit 65b426b22b
4 changed files with 36 additions and 23 deletions

View File

@@ -190,7 +190,7 @@ class ObjectDescription(Directive):
return [strip_backslash_re.sub('', sig.strip())
for sig in self.arguments[0].split('\n')]
def parse_signature(self, sig, signode):
def handle_signature(self, sig, signode):
"""
Parse the signature *sig* into individual nodes and append them to
*signode*. If ValueError is raised, parsing is aborted and the whole
@@ -242,8 +242,10 @@ class ObjectDescription(Directive):
signode['first'] = False
node.append(signode)
try:
# name can also be a tuple, e.g. (classname, objname)
name = self.parse_signature(sig, signode)
# name can also be a tuple, e.g. (classname, objname);
# this is strictly domain-specific (i.e. no assumptions may
# be made in this base class)
name = self.handle_signature(sig, signode)
except ValueError, err:
# signature parsing failed
signode.clear()

View File

@@ -66,7 +66,7 @@ class CObject(ObjectDescription):
else:
node += tnode
def parse_signature(self, sig, signode):
def handle_signature(self, sig, signode):
"""Transform a C (or C++) signature into RST nodes."""
# first try the function pointer signature regex, it's more specific
m = c_funcptr_sig_re.match(sig)

View File

@@ -53,7 +53,7 @@ class PyObject(ObjectDescription):
"""
return False
def parse_signature(self, sig, signode):
def handle_signature(self, sig, signode):
"""
Transform a Python signature into RST nodes.
Returns (fully qualified name of the thing, classname if any).
@@ -65,32 +65,43 @@ class PyObject(ObjectDescription):
m = py_sig_re.match(sig)
if m is None:
raise ValueError
classname, name, arglist, retann = m.groups()
name_prefix, name, arglist, retann = m.groups()
currclass = self.env.doc_read_data.get('py:class')
if currclass:
# determine module and class name (if applicable), as well as full name
modname = self.options.get(
'module', self.env.doc_read_data.get('py:module'))
classname = self.env.doc_read_data.get('py:class')
if classname:
add_module = False
if classname and classname.startswith(currclass):
fullname = classname + name
if name_prefix and name_prefix.startswith(classname):
fullname = name_prefix + name
# class name is given again in the signature
classname = classname[len(currclass):].lstrip('.')
elif classname:
name_prefix = name_prefix[len(classname):].lstrip('.')
elif name_prefix:
# class name is given in the signature, but different
# (shouldn't happen)
fullname = currclass + '.' + classname + name
fullname = classname + '.' + name_prefix + name
else:
# class name is not given in the signature
fullname = currclass + '.' + name
fullname = classname + '.' + name
else:
add_module = True
fullname = classname and classname + name or name
if name_prefix:
classname = name_prefix.rstrip('.')
fullname = name_prefix + name
else:
classname = ''
fullname = name
prefix = self.get_signature_prefix(sig)
if prefix:
signode += addnodes.desc_annotation(prefix, prefix)
signode['module'] = modname
signode['class'] = classname
if classname:
signode += addnodes.desc_addname(classname, classname)
sig_prefix = self.get_signature_prefix(sig)
if sig_prefix:
signode += addnodes.desc_annotation(sig_prefix, sig_prefix)
if name_prefix:
signode += addnodes.desc_addname(name_prefix, name_prefix)
# exceptions are a special case, since they are documented in the
# 'exceptions' module.
elif add_module and self.env.config.add_module_names:
@@ -107,7 +118,7 @@ class PyObject(ObjectDescription):
signode += addnodes.desc_parameterlist()
if retann:
signode += addnodes.desc_returns(retann, retann)
return fullname, classname
return fullname, name_prefix
signode += addnodes.desc_parameterlist()
stack = [signode[-1]]
@@ -130,7 +141,7 @@ class PyObject(ObjectDescription):
raise ValueError
if retann:
signode += addnodes.desc_returns(retann, retann)
return fullname, classname
return fullname, name_prefix
def get_index_text(self, modname, name):
"""

View File

@@ -35,7 +35,7 @@ class GenericObject(ObjectDescription):
indextemplate = ''
parse_node = None
def parse_signature(self, sig, signode):
def handle_signature(self, sig, signode):
if self.parse_node:
name = self.parse_node(self.env, sig, signode)
else: