|
6 | 6 | fromtyping_extensionsimportFinal,Literal |
7 | 7 |
|
8 | 8 | importmypy.plugin# To avoid circular imports. |
| 9 | +frommypy.applytypeimportapply_generic_arguments |
9 | 10 | frommypy.checkerimportTypeChecker |
10 | 11 | frommypy.errorcodesimportLITERAL_REQ |
11 | 12 | frommypy.expandtypeimportexpand_type |
|
24 | 25 | Decorator, |
25 | 26 | Expression, |
26 | 27 | FuncDef, |
| 28 | +IndexExpr, |
27 | 29 | JsonDict, |
28 | 30 | LambdaExpr, |
29 | 31 | ListExpr, |
|
35 | 37 | SymbolTableNode, |
36 | 38 | TempNode, |
37 | 39 | TupleExpr, |
| 40 | +TypeApplication, |
38 | 41 | TypeInfo, |
39 | 42 | TypeVarExpr, |
40 | 43 | Var, |
@@ -664,6 +667,26 @@ def _parse_converter( |
664 | 667 | frommypy.checkmemberimporttype_object_type# To avoid import cycle. |
665 | 668 |
|
666 | 669 | converter_type=type_object_type(converter_expr.node,ctx.api.named_type) |
| 670 | +elif ( |
| 671 | +isinstance(converter_expr,IndexExpr) |
| 672 | +andisinstance(converter_expr.analyzed,TypeApplication) |
| 673 | +andisinstance(converter_expr.base,RefExpr) |
| 674 | +andisinstance(converter_expr.base.node,TypeInfo) |
| 675 | + ): |
| 676 | +# The converter is a generic type. |
| 677 | +frommypy.checkmemberimporttype_object_type# To avoid import cycle. |
| 678 | + |
| 679 | +converter_type=type_object_type(converter_expr.base.node,ctx.api.named_type) |
| 680 | +ifisinstance(converter_type,CallableType): |
| 681 | +converter_type=apply_generic_arguments( |
| 682 | +converter_type, |
| 683 | +converter_expr.analyzed.types, |
| 684 | +ctx.api.msg.incompatible_typevar_value, |
| 685 | +converter_type, |
| 686 | + ) |
| 687 | +else: |
| 688 | +converter_type=None |
| 689 | + |
667 | 690 | ifisinstance(converter_expr,LambdaExpr): |
668 | 691 | # TODO: should we send a fail if converter_expr.min_args > 1? |
669 | 692 | converter_info.init_type=AnyType(TypeOfAny.unannotated) |
|