|
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,
|
@@ -1505,17 +1507,22 @@ def visit_Bytes(self, n: Bytes) -> Type:
|
1505 | 1507 |
|
1506 | 1508 | # Subscript(expr value, slice slice, expr_context ctx)
|
1507 | 1509 | 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) |
| 1510 | + if sys.version_info >= (3, 9): # Really 3.9a5 or later |
| 1511 | + sliceval = n.slice # type: Any |
| 1512 | + else: |
| 1513 | + # Python 3.8 or earlier use a different AST structure for subscripts |
| 1514 | + if not isinstance(n.slice, Index): |
| 1515 | + self.fail(TYPE_COMMENT_SYNTAX_ERROR, self.line, getattr(n, 'col_offset', -1)) |
| 1516 | + return AnyType(TypeOfAny.from_error) |
| 1517 | + sliceval = n.slice.value |
1511 | 1518 |
|
1512 | 1519 | 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: |
| 1520 | + if isinstance(sliceval, ast3.Tuple): |
| 1521 | + params = self.translate_expr_list(sliceval.elts) |
| 1522 | + if len(sliceval.elts) == 0: |
1516 | 1523 | empty_tuple_index = True
|
1517 | 1524 | else:
|
1518 |
| - params = [self.visit(n.slice.value)] |
| 1525 | + params = [self.visit(sliceval)] |
1519 | 1526 |
|
1520 | 1527 | value = self.visit(n.value)
|
1521 | 1528 | if isinstance(value, UnboundType) and not value.args:
|
|
0 commit comments