From 0cf75bdb116f2bb1dc5d7498555b830fc7412e2b Mon Sep 17 00:00:00 2001 From: Fabio Utzig Date: Fri, 13 Nov 2020 13:01:11 -0300 Subject: [PATCH] domain: c: fix warning for intersphinx targets Referencing a symbol using , which is a valid syntax that can be resolved by intersphinx, results in the C-domain parser printing a warning "Unparseable C cross-reference". The resolution still works correctly because it is postponed to intersphinx. This commit adds a small check for intersphinx target format validity before printing the warning. Signed-off-by: Fabio Utzig --- sphinx/domains/c.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sphinx/domains/c.py b/sphinx/domains/c.py index 5896f4a80cb..b04d91631f5 100644 --- a/sphinx/domains/c.py +++ b/sphinx/domains/c.py @@ -3754,6 +3754,15 @@ def merge_domaindata(self, docnames: List[str], otherdata: Dict) -> None: ourObjects[fullname] = (fn, id_, objtype) # no need to warn on duplicates, the symbol merge already does that + def _has_intersphinx_prefix(self, env: BuildEnvironment, target: str) -> bool: + if 'intersphinx_mapping' not in env.config: + return False + parts = target.split(':') + if len(parts) != 2 or parts[1].startswith(':') or \ + parts[0] not in env.config.intersphinx_mapping: + return False + return True + def _resolve_xref_inner(self, env: BuildEnvironment, fromdocname: str, builder: Builder, typ: str, target: str, node: pending_xref, contnode: Element) -> Tuple[Element, str]: @@ -3761,8 +3770,9 @@ def _resolve_xref_inner(self, env: BuildEnvironment, fromdocname: str, builder: try: name = parser.parse_xref_object() except DefinitionError as e: - logger.warning('Unparseable C cross-reference: %r\n%s', target, e, - location=node) + if not self._has_intersphinx_prefix(env, target): + logger.warning('Unparseable C cross-reference: %r\n%s', target, e, + location=node) return None, None parentKey = node.get("c:parent_key", None) # type: LookupKey rootSymbol = self.data['root_symbol']