diff --git a/mypy/fastparse.py b/mypy/fastparse.py index 4b963c74f223..2aac8412f657 100644 --- a/mypy/fastparse.py +++ b/mypy/fastparse.py @@ -1205,8 +1205,14 @@ def visit_Attribute(self, n: Attribute) -> Union[MemberExpr, SuperExpr]: def visit_Subscript(self, n: ast3.Subscript) -> IndexExpr: e = IndexExpr(self.visit(n.value), self.visit(n.slice)) self.set_line(e, n) - if isinstance(e.index, SliceExpr): - # Slice has no line/column in the raw ast. + if ( + isinstance(n.slice, ast3.Slice) or + (sys.version_info < (3, 9) and isinstance(n.slice, ast3.ExtSlice)) + ): + # Before Python 3.9, Slice has no line/column in the raw ast. To avoid incompatibility + # visit_Slice doesn't set_line, even in Python 3.9 on. + # ExtSlice also has no line/column info. In Python 3.9 on, line/column is set for + # e.index when visiting n.slice. e.index.line = e.line e.index.column = e.column return e @@ -1233,7 +1239,7 @@ def visit_List(self, n: ast3.List) -> Union[ListExpr, TupleExpr]: # Tuple(expr* elts, expr_context ctx) def visit_Tuple(self, n: ast3.Tuple) -> TupleExpr: - e = TupleExpr([self.visit(e) for e in n.elts]) + e = TupleExpr(self.translate_expr_list(n.elts)) return self.set_line(e, n) # --- slice --- diff --git a/test-data/unit/parse.test b/test-data/unit/parse.test index 8940d211e219..3b1d1198c269 100644 --- a/test-data/unit/parse.test +++ b/test-data/unit/parse.test @@ -3151,7 +3151,7 @@ MypyFile:1( ExpressionStmt:1( IndexExpr:1( NameExpr(a) - TupleExpr:-1( + TupleExpr:1( SliceExpr:-1( ) @@ -3166,7 +3166,7 @@ MypyFile:1( ExpressionStmt:1( IndexExpr:1( NameExpr(a) - TupleExpr:-1( + TupleExpr:1( SliceExpr:-1( IntExpr(1) IntExpr(2)) @@ -3181,7 +3181,7 @@ MypyFile:1( ExpressionStmt:1( IndexExpr:1( NameExpr(a) - TupleExpr:-1( + TupleExpr:1( SliceExpr:-1( IntExpr(1) IntExpr(2) @@ -3426,25 +3426,25 @@ y = 30 f'Hello {x!s:<{y+y}}' [out] MypyFile:1( - AssignmentStmt:1( - NameExpr(x) - StrExpr(mypy)) - AssignmentStmt:2( - NameExpr(y) - IntExpr(30)) - ExpressionStmt:3( - CallExpr:3( - MemberExpr:3( - StrExpr() - join) - Args( - ListExpr:3( - StrExpr(Hello ) - CallExpr:3( - MemberExpr:3( - StrExpr({!s:{}}) - format) - Args( + AssignmentStmt:1( + NameExpr(x) + StrExpr(mypy)) + AssignmentStmt:2( + NameExpr(y) + IntExpr(30)) + ExpressionStmt:3( + CallExpr:3( + MemberExpr:3( + StrExpr() + join) + Args( + ListExpr:3( + StrExpr(Hello ) + CallExpr:3( + MemberExpr:3( + StrExpr({!s:{}}) + format) + Args( NameExpr(x) CallExpr:3( MemberExpr:3(