intersphinx: Avoid passing the full `BuildEnvironment` object

This commit is contained in:
Adam Turner 2025-01-16 21:09:10 +00:00
parent d19eedf51d
commit 4a1efef211

View File

@ -18,7 +18,7 @@ from sphinx.util.docutils import CustomReSTDispatcher, SphinxRole
from sphinx.util.osutil import _relative_path from sphinx.util.osutil import _relative_path
if TYPE_CHECKING: if TYPE_CHECKING:
from collections.abc import Iterable from collections.abc import Iterable, Set
from types import ModuleType from types import ModuleType
from typing import Any from typing import Any
@ -27,6 +27,7 @@ if TYPE_CHECKING:
from sphinx.application import Sphinx from sphinx.application import Sphinx
from sphinx.domains import Domain from sphinx.domains import Domain
from sphinx.domains._domains_container import _DomainsContainer
from sphinx.environment import BuildEnvironment from sphinx.environment import BuildEnvironment
from sphinx.ext.intersphinx._shared import InventoryName from sphinx.ext.intersphinx._shared import InventoryName
from sphinx.util.typing import Inventory, InventoryItem, RoleFunction from sphinx.util.typing import Inventory, InventoryItem, RoleFunction
@ -134,10 +135,10 @@ def _resolve_reference_in_domain_by_target(
def _resolve_reference_in_domain( def _resolve_reference_in_domain(
env: BuildEnvironment,
inv_name: InventoryName | None, inv_name: InventoryName | None,
inventory: Inventory, inventory: Inventory,
honor_disabled_refs: bool, honor_disabled_refs: bool,
disabled_reftypes: Set[str],
domain: Domain, domain: Domain,
objtypes: Iterable[str], objtypes: Iterable[str],
node: pending_xref, node: pending_xref,
@ -159,9 +160,10 @@ def _resolve_reference_in_domain(
# now that the objtypes list is complete we can remove the disabled ones # now that the objtypes list is complete we can remove the disabled ones
if honor_disabled_refs: if honor_disabled_refs:
disabled = set(env.config.intersphinx_disabled_reftypes)
obj_types = { obj_types = {
obj_type: None for obj_type in obj_types if obj_type not in disabled obj_type: None
for obj_type in obj_types
if obj_type not in disabled_reftypes
} }
objtypes = [*obj_types.keys()] objtypes = [*obj_types.keys()]
@ -183,34 +185,31 @@ def _resolve_reference_in_domain(
def _resolve_reference( def _resolve_reference(
env: BuildEnvironment,
inv_name: InventoryName | None, inv_name: InventoryName | None,
domains: _DomainsContainer,
inventory: Inventory, inventory: Inventory,
honor_disabled_refs: bool, honor_disabled_refs: bool,
disabled_reftypes: Set[str],
node: pending_xref, node: pending_xref,
contnode: TextElement, contnode: TextElement,
) -> nodes.reference | None: ) -> nodes.reference | None:
# disabling should only be done if no inventory is given # disabling should only be done if no inventory is given
honor_disabled_refs = honor_disabled_refs and inv_name is None honor_disabled_refs = honor_disabled_refs and inv_name is None
intersphinx_disabled_reftypes = env.config.intersphinx_disabled_reftypes
if honor_disabled_refs and '*' in intersphinx_disabled_reftypes: if honor_disabled_refs and '*' in disabled_reftypes:
return None return None
typ = node['reftype'] typ = node['reftype']
if typ == 'any': if typ == 'any':
for domain in env.domains.sorted(): for domain in domains.sorted():
if ( if honor_disabled_refs and f'{domain.name}:*' in disabled_reftypes:
honor_disabled_refs
and f'{domain.name}:*' in intersphinx_disabled_reftypes
):
continue continue
objtypes: Iterable[str] = domain.object_types.keys() objtypes: Iterable[str] = domain.object_types.keys()
res = _resolve_reference_in_domain( res = _resolve_reference_in_domain(
env,
inv_name, inv_name,
inventory, inventory,
honor_disabled_refs, honor_disabled_refs,
disabled_reftypes,
domain, domain,
objtypes, objtypes,
node, node,
@ -224,17 +223,22 @@ def _resolve_reference(
if not domain_name: if not domain_name:
# only objects in domains are in the inventory # only objects in domains are in the inventory
return None return None
if honor_disabled_refs and f'{domain_name}:*' in intersphinx_disabled_reftypes: if honor_disabled_refs and f'{domain_name}:*' in disabled_reftypes:
return None return None
domain = env.get_domain(domain_name) try:
domain = domains[domain_name]
except KeyError as exc:
msg = __('Domain %r is not registered') % domain_name
raise ExtensionError(msg) from exc
objtypes = domain.objtypes_for_role(typ) or () objtypes = domain.objtypes_for_role(typ) or ()
if not objtypes: if not objtypes:
return None return None
return _resolve_reference_in_domain( return _resolve_reference_in_domain(
env,
inv_name, inv_name,
inventory, inventory,
honor_disabled_refs, honor_disabled_refs,
disabled_reftypes,
domain, domain,
objtypes, objtypes,
node, node,
@ -260,10 +264,11 @@ def resolve_reference_in_inventory(
""" """
assert inventory_exists(env, inv_name) assert inventory_exists(env, inv_name)
return _resolve_reference( return _resolve_reference(
env,
inv_name, inv_name,
env.domains,
InventoryAdapter(env).named_inventory[inv_name], InventoryAdapter(env).named_inventory[inv_name],
False, False,
frozenset(env.config.intersphinx_disabled_reftypes),
node, node,
contnode, contnode,
) )
@ -280,10 +285,11 @@ def resolve_reference_any_inventory(
Resolution is tried with the target as is in any inventory. Resolution is tried with the target as is in any inventory.
""" """
return _resolve_reference( return _resolve_reference(
env,
None, None,
env.domains,
InventoryAdapter(env).main_inventory, InventoryAdapter(env).main_inventory,
honor_disabled_refs, honor_disabled_refs,
frozenset(env.config.intersphinx_disabled_reftypes),
node, node,
contnode, contnode,
) )