diff options
author | Ashley Whetter <asw@dneg.com> | 2018-04-05 15:40:09 -0700 |
---|---|---|
committer | Ashley Whetter <asw@dneg.com> | 2018-04-24 14:45:16 -0700 |
commit | 44da51a5641caad93200a1cec6b276d0211f4e1f (patch) | |
tree | 74197077fea744a2cbbcd39fe77a990b2be5627e /sphinx/ext/viewcode.py | |
parent | 0a0803fd450ec618f24a03cf9ef4309b9db1d36b (diff) | |
download | sphinx-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.py | 32 |
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, |