summaryrefslogtreecommitdiff
path: root/sphinx/ext/viewcode.py
diff options
context:
space:
mode:
authorAshley Whetter <asw@dneg.com>2018-04-05 15:40:09 -0700
committerAshley Whetter <asw@dneg.com>2018-04-24 14:45:16 -0700
commit44da51a5641caad93200a1cec6b276d0211f4e1f (patch)
tree74197077fea744a2cbbcd39fe77a990b2be5627e /sphinx/ext/viewcode.py
parent0a0803fd450ec618f24a03cf9ef4309b9db1d36b (diff)
downloadsphinx-git-44da51a5641caad93200a1cec6b276d0211f4e1f.tar.gz
Plugins can find source code for viewcode
Fixes #4035
Diffstat (limited to 'sphinx/ext/viewcode.py')
-rw-r--r--sphinx/ext/viewcode.py32
1 files changed, 21 insertions, 11 deletions
diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py
index d20ad78d5..f1ae4bf57 100644
--- a/sphinx/ext/viewcode.py
+++ b/sphinx/ext/viewcode.py
@@ -61,20 +61,29 @@ def doctree_read(app, doctree):
def has_tag(modname, fullname, docname, refname):
entry = env._viewcode_modules.get(modname, None) # type: ignore
- try:
- analyzer = ModuleAnalyzer.for_module(modname)
- except Exception:
- env._viewcode_modules[modname] = False # type: ignore
- return
- if not isinstance(analyzer.code, text_type):
- code = analyzer.code.decode(analyzer.encoding)
- else:
- code = analyzer.code
if entry is False:
return
- elif entry is None or entry[0] != code:
+
+ code_tags = app.emit_firstresult('viewcode-find-source', modname)
+ if code_tags is None:
+ try:
+ analyzer = ModuleAnalyzer.for_module(modname)
+ except Exception:
+ env._viewcode_modules[modname] = False # type: ignore
+ return
+
+ if not isinstance(analyzer.code, text_type):
+ code = analyzer.code.decode(analyzer.encoding)
+ else:
+ code = analyzer.code
+
analyzer.find_tags()
- entry = code, analyzer.tags, {}, refname
+ tags = analyzer.tags
+ else:
+ code, tags = code_tags
+
+ if entry is None or entry[0] != code:
+ entry = code, tags, {}, refname
env._viewcode_modules[modname] = entry # type: ignore
_, tags, used, _ = entry
if fullname in tags:
@@ -240,6 +249,7 @@ def setup(app):
app.connect('missing-reference', missing_reference)
# app.add_config_value('viewcode_include_modules', [], 'env')
# app.add_config_value('viewcode_exclude_modules', [], 'env')
+ app.add_event('viewcode-find-source')
return {
'version': sphinx.__display_version__,
'env_version': 1,