diff options
author | Marc Mueller <30130371+cdce8p@users.noreply.github.com> | 2022-03-09 14:46:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-03-09 14:46:30 +0100 |
commit | 128e50f357e73c166a7b4eee40d0d8cf6eb5780f (patch) | |
tree | 25a961f3d41a7013c43588c4f2d84f2f89d56b40 /astroid/rebuilder.py | |
parent | 29dcc35ac14ac21fe97502ac890a1faac936054e (diff) | |
download | astroid-git-128e50f357e73c166a7b4eee40d0d8cf6eb5780f.tar.gz |
Fix end_lineno on PyPy 3.8 (#1454)
* Fix end_lineno on PyPy 3.8
* Add CI job for PyPy 3.8
Diffstat (limited to 'astroid/rebuilder.py')
-rw-r--r-- | astroid/rebuilder.py | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/astroid/rebuilder.py b/astroid/rebuilder.py index 89c1835a..ad594344 100644 --- a/astroid/rebuilder.py +++ b/astroid/rebuilder.py @@ -54,7 +54,7 @@ from typing import ( from astroid import nodes from astroid._ast import ParserModule, get_parser_module, parse_function_type_comment -from astroid.const import IMPLEMENTATION_PYPY, PY36, PY38, PY38_PLUS, Context +from astroid.const import IMPLEMENTATION_PYPY, PY36, PY38, PY38_PLUS, PY39_PLUS, Context from astroid.manager import AstroidManager from astroid.nodes import NodeNG from astroid.nodes.utils import Position @@ -224,7 +224,7 @@ class TreeRebuilder: lineno = node.lineno or 1 # lineno of modules is 0 end_range: Optional[int] = node.doc_node.lineno - if IMPLEMENTATION_PYPY: + if IMPLEMENTATION_PYPY and not PY39_PLUS: end_range = None # pylint: disable-next=unsubscriptable-object data = "\n".join(self._data[lineno - 1 : end_range]) @@ -271,6 +271,26 @@ class TreeRebuilder: node.doc_node.end_lineno = lineno + t.end[0] - 1 node.doc_node.end_col_offset = t.end[1] + def _reset_end_lineno(self, newnode: nodes.NodeNG) -> None: + """Reset end_lineno and end_col_offset attributes for PyPy 3.8. + + For some nodes, these are either set to -1 or only partially assigned. + To keep consistency across astroid and pylint, reset all. + + This has been fixed in PyPy 3.9. + For reference, an (incomplete) list of nodes with issues: + - ClassDef - For + - FunctionDef - While + - Call - If + - Decorators - TryExcept + - With - TryFinally + - Assign + """ + newnode.end_lineno = None + newnode.end_col_offset = None + for child_node in newnode.get_children(): + self._reset_end_lineno(child_node) + def visit_module( self, node: "ast.Module", modname: str, modpath: str, package: bool ) -> nodes.Module: @@ -292,6 +312,8 @@ class TreeRebuilder: doc_node=self.visit(doc_ast_node, newnode), ) self._fix_doc_node_position(newnode) + if IMPLEMENTATION_PYPY and PY38: + self._reset_end_lineno(newnode) return newnode if sys.version_info >= (3, 10): |