diff --git a/sphinx/ext/intersphinx/_resolve.py b/sphinx/ext/intersphinx/_resolve.py index e52a5389879..102c5d3ab07 100644 --- a/sphinx/ext/intersphinx/_resolve.py +++ b/sphinx/ext/intersphinx/_resolve.py @@ -308,6 +308,8 @@ def resolve_reference_detect_inventory( to form ``inv_name:new_target``. If ``inv_name`` is a named inventory, then resolution is tried in that inventory with the new target. """ + resolve_self = env.config.intersphinx_resolve_self + # ordinary direct lookup, use data as is res = resolve_reference_any_inventory(env, True, node, contnode) if res is not None: @@ -318,6 +320,14 @@ def resolve_reference_detect_inventory( if ':' not in target: return None inv_name, _, new_target = target.partition(':') + + # check if the target is self-referential + self_referential = bool(resolve_self) and resolve_self == inv_name + if self_referential: + node['reftarget'] = new_target + node['intersphinx_self_referential'] = True + return None + if not inventory_exists(env, inv_name): return None node['reftarget'] = new_target diff --git a/sphinx/transforms/post_transforms/__init__.py b/sphinx/transforms/post_transforms/__init__.py index fa108bf3431..52a4ec46b30 100644 --- a/sphinx/transforms/post_transforms/__init__.py +++ b/sphinx/transforms/post_transforms/__init__.py @@ -137,6 +137,23 @@ def _resolve_pending_xref( if new_node is not None: return new_node + # Is this a self-referential intersphinx reference? + if 'intersphinx_self_referential' in node: + del node.attributes['intersphinx_self_referential'] + try: + new_node = self._resolve_pending_xref_in_domain( + domain=domain, + node=node, + contnode=contnode, + ref_doc=ref_doc, + typ=typ, + target=node['reftarget'], + ) + except NoUri: + return None + if new_node is not None: + return new_node + # Still not found? Emit a warning if we are in nitpicky mode # or if the node wishes to be warned about. self.warn_missing_reference(ref_doc, typ, target, node, domain) diff --git a/tests/test_extensions/test_ext_intersphinx.py b/tests/test_extensions/test_ext_intersphinx.py index b5d9d62fb2a..0eafda85660 100644 --- a/tests/test_extensions/test_ext_intersphinx.py +++ b/tests/test_extensions/test_ext_intersphinx.py @@ -70,6 +70,7 @@ def set_config(app, mapping): app.config.intersphinx_mapping = mapping.copy() app.config.intersphinx_cache_limit = 0 app.config.intersphinx_disabled_reftypes = [] + app.config.intersphinx_resolve_self = '' app.config.intersphinx_timeout = None