diff --git a/sphinx/builders/_epub_base.py b/sphinx/builders/_epub_base.py index 2dfc35ecd31..672ce724252 100644 --- a/sphinx/builders/_epub_base.py +++ b/sphinx/builders/_epub_base.py @@ -323,14 +323,14 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]: # a) place them after the last existing footnote # b) place them after an (empty) Footnotes rubric # c) create an empty Footnotes rubric at the end of the document - fns = tree.traverse(nodes.footnote) + fns = list(tree.traverse(nodes.footnote)) if fns: fn = fns[-1] return fn.parent, fn.parent.index(fn) + 1 for node in tree.traverse(nodes.rubric): if len(node) == 1 and node.astext() == FOOTNOTES_RUBRIC_NAME: return node.parent, node.parent.index(node) + 1 - doc = tree.traverse(nodes.document)[0] + doc = list(tree.traverse(nodes.document))[0] rub = nodes.rubric() rub.append(nodes.Text(FOOTNOTES_RUBRIC_NAME)) doc.append(rub) @@ -339,10 +339,10 @@ def footnote_spot(tree: nodes.document) -> Tuple[Element, int]: if show_urls == 'no': return if show_urls == 'footnote': - doc = tree.traverse(nodes.document)[0] + doc = list(tree.traverse(nodes.document))[0] fn_spot, fn_idx = footnote_spot(tree) nr = 1 - for node in tree.traverse(nodes.reference): + for node in list(tree.traverse(nodes.reference)): uri = node.get('refuri', '') if (uri.startswith('http:') or uri.startswith('https:') or uri.startswith('ftp:')) and uri not in node.astext(): diff --git a/sphinx/builders/latex/transforms.py b/sphinx/builders/latex/transforms.py index a07393690dd..b85a9827c74 100644 --- a/sphinx/builders/latex/transforms.py +++ b/sphinx/builders/latex/transforms.py @@ -45,7 +45,7 @@ class SubstitutionDefinitionsRemover(SphinxPostTransform): formats = ('latex',) def run(self, **kwargs: Any) -> None: - for node in self.document.traverse(nodes.substitution_definition): + for node in list(self.document.traverse(nodes.substitution_definition)): node.parent.remove(node) @@ -81,7 +81,7 @@ def expand_show_urls(self) -> None: if show_urls is False or show_urls == 'no': return - for node in self.document.traverse(nodes.reference): + for node in list(self.document.traverse(nodes.reference)): uri = node.get('refuri', '') if uri.startswith(URI_SCHEMES): if uri.startswith('mailto:'): @@ -501,7 +501,7 @@ class BibliographyTransform(SphinxPostTransform): def run(self, **kwargs: Any) -> None: citations = thebibliography() - for node in self.document.traverse(nodes.citation): + for node in list(self.document.traverse(nodes.citation)): node.parent.remove(node) citations += node @@ -602,9 +602,9 @@ class IndexInSectionTitleTransform(SphinxPostTransform): formats = ('latex',) def run(self, **kwargs: Any) -> None: - for node in self.document.traverse(nodes.title): + for node in list(self.document.traverse(nodes.title)): if isinstance(node.parent, nodes.section): - for i, index in enumerate(node.traverse(addnodes.index)): + for i, index in enumerate(list(node.traverse(addnodes.index))): # move the index node next to the section title node.remove(index) node.parent.insert(i + 1, index) diff --git a/sphinx/domains/index.py b/sphinx/domains/index.py index 9ecfae439cf..975ab7000f7 100644 --- a/sphinx/domains/index.py +++ b/sphinx/domains/index.py @@ -48,7 +48,7 @@ def merge_domaindata(self, docnames: Iterable[str], otherdata: Dict) -> None: def process_doc(self, env: BuildEnvironment, docname: str, document: Node) -> None: """Process a document after it is read by the environment.""" entries = self.entries.setdefault(env.docname, []) - for node in document.traverse(addnodes.index): + for node in list(document.traverse(addnodes.index)): try: for entry in node['entries']: split_index_msg(entry[0], entry[1]) diff --git a/sphinx/domains/python.py b/sphinx/domains/python.py index 1a3bd60c7bb..9bb9a1e7239 100644 --- a/sphinx/domains/python.py +++ b/sphinx/domains/python.py @@ -328,7 +328,7 @@ def make_xref(self, rolename: str, domain: str, target: str, text = target[1:] elif prefix == '~': text = target.split('.')[-1] - for node in result.traverse(nodes.Text): + for node in list(result.traverse(nodes.Text)): node.parent[node.parent.index(node)] = nodes.Text(text) break elif isinstance(result, pending_xref) and env.config.python_use_unqualified_type_names: diff --git a/sphinx/environment/adapters/toctree.py b/sphinx/environment/adapters/toctree.py index a62e951d7ed..53328e8127a 100644 --- a/sphinx/environment/adapters/toctree.py +++ b/sphinx/environment/adapters/toctree.py @@ -193,13 +193,13 @@ def _entries_from_toctree(toctreenode: addnodes.toctree, parents: List[str], for toplevel in children: # nodes with length 1 don't have any children anyway if len(toplevel) > 1: - subtrees = toplevel.traverse(addnodes.toctree) + subtrees = list(toplevel.traverse(addnodes.toctree)) if subtrees: toplevel[1][:] = subtrees # type: ignore else: toplevel.pop(1) # resolve all sub-toctrees - for subtocnode in toc.traverse(addnodes.toctree): + for subtocnode in list(toc.traverse(addnodes.toctree)): if not (subtocnode.get('hidden', False) and not includehidden): i = subtocnode.parent.index(subtocnode) + 1 diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index 8bd3d50cd25..478b5c9f33a 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -583,7 +583,7 @@ def parse(doc: List[str], settings: Any) -> nodes.document: node = parse(doc, document.settings) if summary.endswith(WELL_KNOWN_ABBREVIATIONS): pass - elif not node.traverse(nodes.system_message): + elif not list(node.traverse(nodes.system_message)): # considered as that splitting by period does not break inline markups break diff --git a/sphinx/ext/linkcode.py b/sphinx/ext/linkcode.py index 6aaea0e9e52..e88ba4c9607 100644 --- a/sphinx/ext/linkcode.py +++ b/sphinx/ext/linkcode.py @@ -39,7 +39,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None: 'js': ['object', 'fullname'], } - for objnode in doctree.traverse(addnodes.desc): + for objnode in list(doctree.traverse(addnodes.desc)): domain = objnode.get('domain') uris: Set[str] = set() for signode in objnode: diff --git a/sphinx/ext/todo.py b/sphinx/ext/todo.py index 6b7c1b73b85..beab0976d3f 100644 --- a/sphinx/ext/todo.py +++ b/sphinx/ext/todo.py @@ -131,7 +131,7 @@ def __init__(self, app: Sphinx, doctree: nodes.document, docname: str) -> None: def process(self, doctree: nodes.document, docname: str) -> None: todos: List[todo_node] = sum(self.domain.todos.values(), []) - for node in doctree.traverse(todolist): + for node in list(doctree.traverse(todolist)): if not self.config.todo_include_todos: node.parent.remove(node) continue diff --git a/sphinx/ext/viewcode.py b/sphinx/ext/viewcode.py index 5728f607761..bd1346daabd 100644 --- a/sphinx/ext/viewcode.py +++ b/sphinx/ext/viewcode.py @@ -108,7 +108,7 @@ def has_tag(modname: str, fullname: str, docname: str, refname: str) -> bool: return False - for objnode in doctree.traverse(addnodes.desc): + for objnode in list(doctree.traverse(addnodes.desc)): if objnode.get('domain') != 'py': continue names: Set[str] = set() @@ -191,7 +191,7 @@ def convert_viewcode_anchors(self) -> None: node.replace_self(refnode) def remove_viewcode_anchors(self) -> None: - for node in self.document.traverse(viewcode_anchor): + for node in list(self.document.traverse(viewcode_anchor)): node.parent.remove(node) diff --git a/sphinx/transforms/__init__.py b/sphinx/transforms/__init__.py index ade46363a4b..1347409292b 100644 --- a/sphinx/transforms/__init__.py +++ b/sphinx/transforms/__init__.py @@ -128,7 +128,7 @@ class MoveModuleTargets(SphinxTransform): default_priority = 210 def apply(self, **kwargs: Any) -> None: - for node in self.document.traverse(nodes.target): + for node in list(self.document.traverse(nodes.target)): if not node['ids']: continue if ('ismod' in node and @@ -303,7 +303,7 @@ class FilterSystemMessages(SphinxTransform): def apply(self, **kwargs: Any) -> None: filterlevel = 2 if self.config.keep_warnings else 5 - for node in self.document.traverse(nodes.system_message): + for node in list(self.document.traverse(nodes.system_message)): if node['level'] < filterlevel: logger.debug('%s [filtered system message]', node.astext()) node.parent.remove(node) diff --git a/sphinx/transforms/i18n.py b/sphinx/transforms/i18n.py index d28376becb1..d0bc8af5d57 100644 --- a/sphinx/transforms/i18n.py +++ b/sphinx/transforms/i18n.py @@ -488,7 +488,7 @@ def apply(self, **kwargs: Any) -> None: return matcher = NodeMatcher(nodes.inline, translatable=Any) - for inline in self.document.traverse(matcher): # type: nodes.inline + for inline in list(self.document.traverse(matcher)): # type: nodes.inline inline.parent.remove(inline) inline.parent += inline.children diff --git a/sphinx/transforms/post_transforms/code.py b/sphinx/transforms/post_transforms/code.py index 52bca8e12dd..3c4c0ebab66 100644 --- a/sphinx/transforms/post_transforms/code.py +++ b/sphinx/transforms/post_transforms/code.py @@ -42,7 +42,7 @@ def apply(self, **kwargs: Any) -> None: self.config.highlight_language) self.document.walkabout(visitor) - for node in self.document.traverse(addnodes.highlightlang): + for node in list(self.document.traverse(addnodes.highlightlang)): node.parent.remove(node) diff --git a/sphinx/util/nodes.py b/sphinx/util/nodes.py index 78663e4c707..bc16e44c10e 100644 --- a/sphinx/util/nodes.py +++ b/sphinx/util/nodes.py @@ -343,7 +343,7 @@ def clean_astext(node: Element) -> str: node = node.deepcopy() for img in node.traverse(nodes.image): img['alt'] = '' - for raw in node.traverse(nodes.raw): + for raw in list(node.traverse(nodes.raw)): raw.parent.remove(raw) return node.astext() @@ -408,7 +408,7 @@ def inline_all_toctrees(builder: "Builder", docnameset: Set[str], docname: str, Record all docnames in *docnameset*, and output docnames with *colorfunc*. """ tree = cast(nodes.document, tree.deepcopy()) - for toctreenode in tree.traverse(addnodes.toctree): + for toctreenode in list(tree.traverse(addnodes.toctree)): newnodes = [] includefiles = map(str, toctreenode['includefiles']) for includefile in includefiles: diff --git a/sphinx/writers/latex.py b/sphinx/writers/latex.py index 869759ee510..3f032e6164f 100644 --- a/sphinx/writers/latex.py +++ b/sphinx/writers/latex.py @@ -651,7 +651,7 @@ def visit_title(self, node: Element) -> None: raise nodes.SkipNode else: short = '' - if node.traverse(nodes.image): + if list(node.traverse(nodes.image)): short = ('[%s]' % self.escape(' '.join(clean_astext(node).split()))) try: diff --git a/sphinx/writers/manpage.py b/sphinx/writers/manpage.py index 12fc31281bc..da5f4c24123 100644 --- a/sphinx/writers/manpage.py +++ b/sphinx/writers/manpage.py @@ -56,7 +56,7 @@ def __init__(self, document: nodes.document) -> None: def apply(self, **kwargs: Any) -> None: matcher = NodeMatcher(nodes.literal, nodes.emphasis, nodes.strong) - for node in self.document.traverse(matcher): # type: TextElement + for node in list(self.document.traverse(matcher)): # type: TextElement if any(matcher(subnode) for subnode in node): pos = node.parent.index(node) for subnode in reversed(list(node)): @@ -227,7 +227,7 @@ def depart_versionmodified(self, node: Element) -> None: # overwritten -- don't make whole of term bold if it includes strong node def visit_term(self, node: Element) -> None: - if node.traverse(nodes.strong): + if list(node.traverse(nodes.strong)): self.body.append('\n') else: super().visit_term(node)