diff --git a/CHANGES b/CHANGES index e1773b6a6..f0da26db9 100644 --- a/CHANGES +++ b/CHANGES @@ -19,10 +19,15 @@ Bugs fixed * #4924: html search: Upper characters problem in any other languages * #4932: apidoc: some subpackage is ignored if sibling subpackage contains a module starting with underscore -* #4938, #4939: i18n doesn't handle node.title correctly tat used for contents, - topic, admonition, table and section. +* #4863, #4938, #4939: i18n doesn't handle node.title correctly tat used for + contents, topic, admonition, table and section. * #4913: i18n: literal blocks in bullet list are not translated -* #4962: cpp domain: raises TypeError on duplicate declaration +* #4962: C++, raised TypeError on duplicate declaration. +* #4825: C++, properly parse expr roles and give better error messages when + (escaped) line breaks are present. +* C++, properly use ``desc_addname`` nodes for prefixes of names. +* #4915, #4916: links on search page are broken when using dirhtml builder +* #4969: autodoc: constructor method should not have return annotation * latex: deeply nested enumerated list which is beginning with non-1 causes LaTeX engine crashed diff --git a/sphinx/builders/epub3.py b/sphinx/builders/epub3.py index 008942a6a..8c32231bd 100644 --- a/sphinx/builders/epub3.py +++ b/sphinx/builders/epub3.py @@ -185,7 +185,7 @@ class Epub3Builder(_epub_base.EpubBuilder): navstack[-1].children.append(navpoint) navstack.append(navpoint) else: - raise + raise RuntimeError('Should never reach here. It might be a bug.') return navstack[0].children diff --git a/sphinx/domains/cpp.py b/sphinx/domains/cpp.py index fe339b153..5475b8d4a 100644 --- a/sphinx/domains/cpp.py +++ b/sphinx/domains/cpp.py @@ -12,7 +12,7 @@ import re from copy import deepcopy -from docutils import nodes +from docutils import nodes, utils from docutils.parsers.rst import Directive, directives from six import iteritems, text_type @@ -1965,26 +1965,34 @@ class ASTNestedName(ASTBase): prefix = '' # type: unicode first = True names = self.names[:-1] if mode == 'lastIsName' else self.names + # If lastIsName, then wrap all of the prefix in a desc_addname, + # else append directly to signode. + # NOTE: Breathe relies on the prefix being in the desc_addname node, + # so it can remove it in inner declarations. + dest = signode + if mode == 'lastIsName': + dest = addnodes.desc_addname() for i in range(len(names)): name = names[i] template = self.templates[i] if not first: - signode += nodes.Text('::') + dest += nodes.Text('::') prefix += '::' if template: - signode += nodes.Text("template ") + dest += nodes.Text("template ") first = False if name != '': if (name.templateArgs and # type: ignore iTemplateParams < len(templateParams)): templateParamsPrefix += text_type(templateParams[iTemplateParams]) iTemplateParams += 1 - name.describe_signature(signode, 'markType', # type: ignore + name.describe_signature(dest, 'markType', # type: ignore env, templateParamsPrefix + prefix, symbol) prefix += text_type(name) if mode == 'lastIsName': if len(self.names) > 1: - signode += addnodes.desc_addname('::', '::') + dest += addnodes.desc_addname('::', '::') + signode += dest if self.templates[-1]: signode += nodes.Text("template ") self.names[-1].describe_signature(signode, mode, env, '', symbol) @@ -5962,7 +5970,7 @@ class CPPExprRole(object): class Warner(object): def warn(self, msg): inliner.reporter.warning(msg, line=lineno) - + text = utils.unescape(text).replace('\n', ' ') env = inliner.document.settings.env parser = DefinitionParser(text, Warner(), env.config) try: diff --git a/sphinx/ext/autodoc/__init__.py b/sphinx/ext/autodoc/__init__.py index d516146bf..eabe487e3 100644 --- a/sphinx/ext/autodoc/__init__.py +++ b/sphinx/ext/autodoc/__init__.py @@ -1035,9 +1035,11 @@ class FunctionDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # typ # typing) we try to use the constructor signature as function # signature without the first argument. try: - args = Signature(self.object.__new__, bound_method=True).format_args() + sig = Signature(self.object.__new__, bound_method=True, has_retval=False) + args = sig.format_args() except TypeError: - args = Signature(self.object.__init__, bound_method=True).format_args() + sig = Signature(self.object.__init__, bound_method=True, has_retval=False) + args = sig.format_args() # escape backslashes for reST args = args.replace('\\', '\\\\') @@ -1090,7 +1092,7 @@ class ClassDocumenter(DocstringSignatureMixin, ModuleLevelDocumenter): # type: not(inspect.ismethod(initmeth) or inspect.isfunction(initmeth)): return None try: - return Signature(initmeth, bound_method=True).format_args() + return Signature(initmeth, bound_method=True, has_retval=False).format_args() except TypeError: # still not possible: happens e.g. for old-style classes # with __init__ in C diff --git a/sphinx/themes/basic/layout.html b/sphinx/themes/basic/layout.html index 68c7d9e51..4e672c722 100644 --- a/sphinx/themes/basic/layout.html +++ b/sphinx/themes/basic/layout.html @@ -87,7 +87,7 @@ {%- endmacro %} {%- macro script() %} - + {%- for scriptfile in script_files %} {%- endfor %} diff --git a/sphinx/themes/basic/static/documentation_options.js_t b/sphinx/themes/basic/static/documentation_options.js_t index e76f55a4e..9da9801a1 100644 --- a/sphinx/themes/basic/static/documentation_options.js_t +++ b/sphinx/themes/basic/static/documentation_options.js_t @@ -1,5 +1,5 @@ var DOCUMENTATION_OPTIONS = { - URL_ROOT: '{{ url_root }}', + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), VERSION: '{{ release|e }}', LANGUAGE: '{{ language }}', COLLAPSE_INDEX: false, diff --git a/sphinx/util/inspect.py b/sphinx/util/inspect.py index 492db8700..72c3065bc 100644 --- a/sphinx/util/inspect.py +++ b/sphinx/util/inspect.py @@ -298,8 +298,8 @@ class Signature(object): its return annotation. """ - def __init__(self, subject, bound_method=False): - # type: (Callable, bool) -> None + def __init__(self, subject, bound_method=False, has_retval=True): + # type: (Callable, bool, bool) -> None # check subject is not a built-in class (ex. int, str) if (isinstance(subject, type) and is_builtin_class_method(subject, "__new__") and @@ -307,6 +307,7 @@ class Signature(object): raise TypeError("can't compute signature for built-in type {}".format(subject)) self.subject = subject + self.has_retval = has_retval self.partialmethod_with_noargs = False if PY3: @@ -375,7 +376,10 @@ class Signature(object): def return_annotation(self): # type: () -> Any if PY3 and self.signature: - return self.signature.return_annotation + if self.has_retval: + return self.signature.return_annotation + else: + return inspect.Parameter.empty else: return None diff --git a/tests/test_util_inspect.py b/tests/test_util_inspect.py index 6a3e25b6e..76f21a5e1 100644 --- a/tests/test_util_inspect.py +++ b/tests/test_util_inspect.py @@ -280,6 +280,10 @@ def test_Signature_annotations(): sig = inspect.Signature(f11).format_args() assert sig == '(x: CustomAnnotation, y: 123) -> None' + # has_retval=False + sig = inspect.Signature(f11, has_retval=False).format_args() + assert sig == '(x: CustomAnnotation, y: 123)' + def test_safe_getattr_with_default(): class Foo(object):