From 89a6d41ed02b69aa9c927185210efa6afba28073 Mon Sep 17 00:00:00 2001 From: Jakob Lykke Andersen Date: Sat, 30 Mar 2019 13:42:55 +0100 Subject: [PATCH] C++, fix parsing of full xrefs. Fixes sphinx-doc/sphinx#6208 --- CHANGES | 2 ++ sphinx/domains/cpp.py | 4 ++-- tests/test_domain_cpp.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index e97623ea661..08b302a1fd4 100644 --- a/CHANGES +++ b/CHANGES @@ -22,6 +22,8 @@ Bugs fixed - sphinx.application.CONFIG_FILENAME - :confval:`viewcode_import` +* #6208: C++, properly parse full xrefs that happen to have a short xref as prefix. + Testing -------- diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index d17e67f82c4..03e91bcee07 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -6391,6 +6391,7 @@ def parse_xref_object(self): # if there are '()' left, just skip them self.skip_ws() self.skip_string('()') + self.assert_end() templatePrefix = self._check_template_consistency(name, templatePrefix, fullSpecShorthand=True) res1 = ASTNamespace(name, templatePrefix) @@ -6403,6 +6404,7 @@ def parse_xref_object(self): # if there are '()' left, just skip them self.skip_ws() self.skip_string('()') + self.assert_end() return res2, False except DefinitionError as e2: errs = [] @@ -7145,7 +7147,6 @@ def warn(self, msg): parser = DefinitionParser(target, warner, env.config) try: ast, isShorthand = parser.parse_xref_object() - parser.assert_end() except DefinitionError as e: def findWarning(e): # as arg to stop flake8 from complaining if typ != 'any' and typ != 'func': @@ -7154,7 +7155,6 @@ def findWarning(e): # as arg to stop flake8 from complaining parser2 = DefinitionParser(target[:-2], warner, env.config) try: parser2.parse_xref_object() - parser2.assert_end() except DefinitionError as e2: return target[:-2], e2 # strange, that we don't get the error now, use the original diff --git a/tests/test_domain_cpp.py b/tests/test_domain_cpp.py index 46019b4a94f..d6470dc7c28 100644 --- a/tests/test_domain_cpp.py +++ b/tests/test_domain_cpp.py @@ -755,6 +755,20 @@ def test_attributes(): check('member', 'int *[[attr]] *i', {1: 'i__iPP', 2: '1i'}) +def test_xref_parsing(): + def check(target): + class Config: + cpp_id_attributes = ["id_attr"] + cpp_paren_attributes = ["paren_attr"] + parser = DefinitionParser(target, None, Config()) + ast, isShorthand = parser.parse_xref_object() + parser.assert_end() + check('f') + check('f()') + check('void f()') + check('T f()') + + # def test_print(): # # used for getting all the ids out for checking # for a in ids: