diff --git a/sphinx/directives/__init__.py b/sphinx/directives/__init__.py index 5ffce16bd..80f622023 100644 --- a/sphinx/directives/__init__.py +++ b/sphinx/directives/__init__.py @@ -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() diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index 7a29ff68f..fc5644091 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -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) diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index cec571880..e11ddee20 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -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): """ diff --git a/sphinx/domains/std.py b/sphinx/domains/std.py index 16de4277f..2a21f39af 100644 --- a/sphinx/domains/std.py +++ b/sphinx/domains/std.py @@ -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: