|
1 | 1 | from mypy.util import unnamed_function
|
| 2 | +import copy |
2 | 3 | import re
|
3 | 4 | import sys
|
4 | 5 | import warnings
|
@@ -1551,22 +1552,38 @@ def visit_Bytes(self, n: Bytes) -> Type:
|
1551 | 1552 | contents = bytes_to_human_readable_repr(n.s)
|
1552 | 1553 | return RawExpressionType(contents, 'builtins.bytes', self.line, column=n.col_offset)
|
1553 | 1554 |
|
| 1555 | + def visit_Index(self, n: ast3.Index) -> Type: |
| 1556 | + # cast for mypyc's benefit on Python 3.9 |
| 1557 | + return self.visit(cast(Any, n).value) |
| 1558 | + |
| 1559 | + def visit_Slice(self, n: ast3.Slice) -> Type: |
| 1560 | + return self.invalid_type( |
| 1561 | + n, note="did you mean to use ',' instead of ':' ?" |
| 1562 | + ) |
| 1563 | + |
1554 | 1564 | # Subscript(expr value, slice slice, expr_context ctx) # Python 3.8 and before
|
1555 | 1565 | # Subscript(expr value, expr slice, expr_context ctx) # Python 3.9 and later
|
1556 | 1566 | def visit_Subscript(self, n: ast3.Subscript) -> Type:
|
1557 | 1567 | if sys.version_info >= (3, 9): # Really 3.9a5 or later
|
1558 | 1568 | sliceval: Any = n.slice
|
1559 |
| - if (isinstance(sliceval, ast3.Slice) or |
1560 |
| - (isinstance(sliceval, ast3.Tuple) and |
1561 |
| - any(isinstance(x, ast3.Slice) for x in sliceval.elts))): |
1562 |
| - self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
1563 |
| - return AnyType(TypeOfAny.from_error) |
| 1569 | + # Python 3.8 or earlier use a different AST structure for subscripts |
| 1570 | + elif isinstance(n.slice, ast3.Index): |
| 1571 | + sliceval: Any = n.slice.value |
| 1572 | + elif isinstance(n.slice, ast3.Slice): |
| 1573 | + sliceval = copy.deepcopy(n.slice) # so we don't mutate passed AST |
| 1574 | + if getattr(sliceval, "col_offset", None) is None: |
| 1575 | + # Fix column information so that we get Python 3.9+ message order |
| 1576 | + sliceval.col_offset = sliceval.lower.col_offset |
1564 | 1577 | else:
|
1565 |
| - # Python 3.8 or earlier use a different AST structure for subscripts |
1566 |
| - if not isinstance(n.slice, Index): |
1567 |
| - self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
1568 |
| - return AnyType(TypeOfAny.from_error) |
1569 |
| - sliceval = n.slice.value |
| 1578 | + assert isinstance(n.slice, ast3.ExtSlice) |
| 1579 | + dims = copy.deepcopy(n.slice.dims) |
| 1580 | + for s in dims: |
| 1581 | + if getattr(s, "col_offset", None) is None: |
| 1582 | + if isinstance(s, ast3.Index): |
| 1583 | + s.col_offset = s.value.col_offset # type: ignore |
| 1584 | + elif isinstance(s, ast3.Slice): |
| 1585 | + s.col_offset = s.lower.col_offset # type: ignore |
| 1586 | + sliceval = ast3.Tuple(dims, n.ctx) |
1570 | 1587 |
|
1571 | 1588 | empty_tuple_index = False
|
1572 | 1589 | if isinstance(sliceval, ast3.Tuple):
|
|
0 commit comments