From 7a86ce0986d6726c5b731ff2a276d8af7d2a8574 Mon Sep 17 00:00:00 2001 From: Tom Manderson Date: Fri, 9 Dec 2016 22:43:30 +1000 Subject: [PATCH 1/4] Prevent crash on retrieving TypeVars from classes --- mypy/checkmember.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/mypy/checkmember.py b/mypy/checkmember.py index d1e9ab1cc777..ff51549fcbab 100644 --- a/mypy/checkmember.py +++ b/mypy/checkmember.py @@ -7,7 +7,7 @@ Overloaded, TypeVarType, UnionType, PartialType, DeletedType, NoneTyp, TypeType, function_type ) -from mypy.nodes import TypeInfo, FuncBase, Var, FuncDef, SymbolNode, Context, MypyFile +from mypy.nodes import TypeInfo, FuncBase, Var, FuncDef, SymbolNode, Context, MypyFile, TypeVarExpr from mypy.nodes import ARG_POS, ARG_STAR, ARG_STAR2 from mypy.nodes import Decorator, OverloadedFuncDef from mypy.messages import MessageBuilder @@ -378,6 +378,9 @@ def analyze_class_attribute_access(itype: Instance, not_ready_callback(name, context) return AnyType() + if isinstance(node.node, TypeVarExpr): + return node.node.upper_bound + if isinstance(node.node, TypeInfo): return type_object_type(node.node, builtin_type) From eb300a5ac31802ad88b225ec33b9358dcc805730 Mon Sep 17 00:00:00 2001 From: Tom Manderson Date: Fri, 9 Dec 2016 22:53:59 +1000 Subject: [PATCH 2/4] Add test for accessing TypeVar class members --- test-data/unit/check-typevar-values.test | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test-data/unit/check-typevar-values.test b/test-data/unit/check-typevar-values.test index 605e8c011359..88200d0b25de 100644 --- a/test-data/unit/check-typevar-values.test +++ b/test-data/unit/check-typevar-values.test @@ -509,3 +509,11 @@ def outer(x: T) -> T: return inner1(x) [out] main: note: In function "inner2": + +[case testClassMemberTypeVarInFunctionBody] +from typing import TypeVar +class C: + T = TypeVar('T', int) + def f(self, x: T) -> T: + A = C.T + return x \ No newline at end of file From ae0fdd9e12cbc015e9b5aaecd9ed0f8da0f0662a Mon Sep 17 00:00:00 2001 From: Tom Manderson Date: Tue, 13 Dec 2016 13:43:06 +1000 Subject: [PATCH 3/4] Add trailing newline --- test-data/unit/check-typevar-values.test | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-data/unit/check-typevar-values.test b/test-data/unit/check-typevar-values.test index 97d6a5f71dbc..69feab2059e4 100644 --- a/test-data/unit/check-typevar-values.test +++ b/test-data/unit/check-typevar-values.test @@ -496,4 +496,4 @@ class C: T = TypeVar('T', int) def f(self, x: T) -> T: A = C.T - return x \ No newline at end of file + return x From ed1760c0785a60b876da7a185f9860e1c1f571d4 Mon Sep 17 00:00:00 2001 From: Tom Manderson Date: Wed, 14 Dec 2016 08:56:01 +1000 Subject: [PATCH 4/4] TypeVar class members should have the type TypeVarType --- mypy/checkmember.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mypy/checkmember.py b/mypy/checkmember.py index ff51549fcbab..c68b09669e85 100644 --- a/mypy/checkmember.py +++ b/mypy/checkmember.py @@ -379,7 +379,7 @@ def analyze_class_attribute_access(itype: Instance, return AnyType() if isinstance(node.node, TypeVarExpr): - return node.node.upper_bound + return TypeVarType(node.tvar_def, node.tvar_def.line, node.tvar_def.column) if isinstance(node.node, TypeInfo): return type_object_type(node.node, builtin_type)