|
49 | 49 | import ast as ast3
|
50 | 50 | assert 'kind' in ast3.Constant._fields, \
|
51 | 51 | "This 3.8.0 alpha (%s) is too old; 3.8.0a3 required" % sys.version.split()[0]
|
| 52 | + # TODO: Num, Str, Bytes, NameConstant, Ellipsis are deprecated in 3.8. |
| 53 | + # TODO: Index, ExtSlice are deprecated in 3.9. |
52 | 54 | from ast import (
|
53 | 55 | AST,
|
54 | 56 | Call,
|
@@ -1503,19 +1505,30 @@ def visit_Bytes(self, n: Bytes) -> Type:
|
1503 | 1505 | contents = bytes_to_human_readable_repr(n.s)
|
1504 | 1506 | return RawExpressionType(contents, 'builtins.bytes', self.line, column=n.col_offset)
|
1505 | 1507 |
|
1506 |
| - # Subscript(expr value, slice slice, expr_context ctx) |
| 1508 | + # Subscript(expr value, slice slice, expr_context ctx) # Python 3.8 and before |
| 1509 | + # Subscript(expr value, expr slice, expr_context ctx) # Python 3.9 and later |
1507 | 1510 | def visit_Subscript(self, n: ast3.Subscript) -> Type:
|
1508 |
| - if not isinstance(n.slice, Index): |
1509 |
| - self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
1510 |
| - return AnyType(TypeOfAny.from_error) |
| 1511 | + if sys.version_info >= (3, 9): # Really 3.9a5 or later |
| 1512 | + sliceval = n.slice # type: Any |
| 1513 | + if (isinstance(sliceval, ast3.Slice) or |
| 1514 | + (isinstance(sliceval, ast3.Tuple) and |
| 1515 | + any(isinstance(x, ast3.Slice) for x in sliceval.elts))): |
| 1516 | + self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
| 1517 | + return AnyType(TypeOfAny.from_error) |
| 1518 | + else: |
| 1519 | + # Python 3.8 or earlier use a different AST structure for subscripts |
| 1520 | + if not isinstance(n.slice, Index): |
| 1521 | + self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
| 1522 | + return AnyType(TypeOfAny.from_error) |
| 1523 | + sliceval = n.slice.value |
1511 | 1524 |
|
1512 | 1525 | empty_tuple_index = False
|
1513 |
| - if isinstance(n.slice.value, ast3.Tuple): |
1514 |
| - params = self.translate_expr_list(n.slice.value.elts) |
1515 |
| - if len(n.slice.value.elts) == 0: |
| 1526 | + if isinstance(sliceval, ast3.Tuple): |
| 1527 | + params = self.translate_expr_list(sliceval.elts) |
| 1528 | + if len(sliceval.elts) == 0: |
1516 | 1529 | empty_tuple_index = True
|
1517 | 1530 | else:
|
1518 |
| - params = [self.visit(n.slice.value)] |
| 1531 | + params = [self.visit(sliceval)] |
1519 | 1532 |
|
1520 | 1533 | value = self.visit(n.value)
|
1521 | 1534 | if isinstance(value, UnboundType) and not value.args:
|
|
0 commit comments