summaryrefslogtreecommitdiff
path: root/sphinx/domains/python.py
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2010-06-12 10:41:56 +0200
committerGeorg Brandl <georg@python.org>2010-06-12 10:41:56 +0200
commitbeb99aa6a7d85ddb1f1e2b4eb22a6fbc9b94364d (patch)
tree5baba4e915566dec491fe87b580b6a0b4a2fe298 /sphinx/domains/python.py
parent80c67e0de093f0aa680d4c18d24e1aa597afb2aa (diff)
downloadsphinx-beb99aa6a7d85ddb1f1e2b4eb22a6fbc9b94364d.tar.gz
In the Python domain, references like ``:func:`.name``` now look for
matching names with any prefix if no direct match is found.
Diffstat (limited to 'sphinx/domains/python.py')
-rw-r--r--sphinx/domains/python.py38
1 files changed, 25 insertions, 13 deletions
diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py
index b97b9b42..fc808699 100644
--- a/sphinx/domains/python.py
+++ b/sphinx/domains/python.py
@@ -547,7 +547,7 @@ class PythonDomain(Domain):
def find_obj(self, env, modname, classname, name, type, searchorder=0):
"""
Find a Python object for "name", perhaps using the given module and/or
- classname.
+ classname. Returns a list of (name, object entry) tuples.
"""
# skip parens
if name[-2:] == '()':
@@ -557,6 +557,7 @@ class PythonDomain(Domain):
return None, None
objects = self.data['objects']
+ matches = []
newname = None
if searchorder == 1:
@@ -567,6 +568,11 @@ class PythonDomain(Domain):
newname = modname + '.' + name
elif name in objects:
newname = name
+ else:
+ # "fuzzy" searching mode
+ searchname = '.' + name
+ matches = [(name, objects[name]) for name in objects
+ if name.endswith(searchname)]
else:
if name in objects:
newname = name
@@ -585,14 +591,14 @@ class PythonDomain(Domain):
elif type in ('func', 'meth') and '.' not in name and \
'object.' + name in objects:
newname = 'object.' + name
- if newname is None:
- return None, None
- return newname, objects[newname]
+ if newname is not None:
+ matches.append((newname, objects[newname]))
+ return matches
def resolve_xref(self, env, fromdocname, builder,
- typ, target, node, contnode):
- if (typ == 'mod' or
- typ == 'obj' and target in self.data['modules']):
+ type, target, node, contnode):
+ if (type == 'mod' or
+ type == 'obj' and target in self.data['modules']):
docname, synopsis, platform, deprecated = \
self.data['modules'].get(target, ('','','', ''))
if not docname:
@@ -607,13 +613,19 @@ class PythonDomain(Domain):
modname = node.get('py:module')
clsname = node.get('py:class')
searchorder = node.hasattr('refspecific') and 1 or 0
- name, obj = self.find_obj(env, modname, clsname,
- target, typ, searchorder)
- if not obj:
+ matches = self.find_obj(env, modname, clsname, target,
+ type, searchorder)
+ if not matches:
return None
- else:
- return make_refnode(builder, fromdocname, obj[0], name,
- contnode, name)
+ elif len(matches) > 1:
+ env.warn(fromdocname,
+ 'more than one target found for cross-reference '
+ '%r: %s' % (target,
+ ', '.join(match[0] for match in matches)),
+ node.line)
+ name, obj = matches[0]
+ return make_refnode(builder, fromdocname, obj[0], name,
+ contnode, name)
def get_objects(self):
for modname, info in self.data['modules'].iteritems():