blob: 19b1839f86c0dd4cf7b107675f0354ca1dca27b5 [file] [log] [blame] [edit]
-- Test cases for AST merge (used for fine-grained incremental checking)
--
-- Each test case has two versions of the module 'target' (target.py and
-- target.py.next). A test cases type checks both of them, merges the ASTs,
-- and finally dumps certain parts of the ASTs for both versions (==>
-- separates the first and second versions). A test case passes if the
-- dumped output is as expected.
--
-- The dumped output uses <N> to denote identities of objects. Objects
-- suffixed by the same <N> refer to the same object; <N> and <M> (if
-- N != M) refer to different objects. The objective of these test cases
-- is to verify that identities of publicly visible AST nodes is
-- preserved across merge. Other AST nodes may get new identities.
--
-- Each test case dumps one of four kinds of information:
--
-- 1) ASTs (test case has no magic suffix)
-- 2) Symbol tables (_symtable test case name suffix)
-- 3) TypeInfos (_typeinfo suffix)
-- 4) Inferred types (_types suffix)
--
-- If you need to dump multiple different kinds of information, write
-- multiple test cases.
[case testFunction]
import target
[file target.py]
def f() -> int:
pass
[file target.py.next]
def f() -> int:
pass
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
FuncDef:1<2>(
f
def () -> builtins.int<3>
Block:2<4>(
PassStmt:2<5>())))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
FuncDef:1<2>(
f
def () -> builtins.int<3>
Block:2<6>(
PassStmt:2<7>())))
[case testClass]
import target
[file target.py]
class A:
def f(self, x: str) -> int:
pass
[file target.py.next]
class A:
def f(self, x: int) -> str:
pass
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<2>(
A
FuncDef:2<3>(
f
Args(
Var(self)
Var(x))
def (self: target.A<4>, x: builtins.str<5>) -> builtins.int<6>
Block:3<7>(
PassStmt:3<8>()))))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<9>(
A
FuncDef:2<3>(
f
Args(
Var(self)
Var(x))
def (self: target.A<4>, x: builtins.int<6>) -> builtins.str<5>
Block:3<10>(
PassStmt:3<11>()))))
[case testClass_typeinfo]
import target
[file target.py]
class A:
def f(self, x: str) -> int: pass
def g(self, x: str) -> int: pass
[file target.py.next]
class A:
def f(self, x: int) -> str: pass
def h(self, x: int) -> str: pass
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
f<2>
g<3>))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
f<2>
h<4>))
[case testConstructInstance]
import target
[file target.py]
class A:
def f(self) -> B:
return B()
class B: pass
[file target.py.next]
class B: pass
class A:
def f(self) -> B:
1
return B()
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<2>(
A
FuncDef:2<3>(
f
Args(
Var(self))
def (self: target.A<4>) -> target.B<5>
Block:3<6>(
ReturnStmt:3<7>(
CallExpr:3<8>(
NameExpr(B [target.B<5>])
Args())))))
ClassDef:4<9>(
B
PassStmt:4<10>()))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<11>(
B
PassStmt:1<12>())
ClassDef:2<13>(
A
FuncDef:3<3>(
f
Args(
Var(self))
def (self: target.A<4>) -> target.B<5>
Block:4<14>(
ExpressionStmt:4<15>(
IntExpr(1))
ReturnStmt:5<16>(
CallExpr:5<17>(
NameExpr(B [target.B<5>])
Args()))))))
[case testCallMethod]
import target
[file target.py]
class A:
def f(self) -> None:
self.f()
[file target.py.next]
class A:
def f(self) -> None:
self.f()
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<2>(
A
FuncDef:2<3>(
f
Args(
Var(self))
def (self: target.A<4>)
Block:3<5>(
ExpressionStmt:3<6>(
CallExpr:3<7>(
MemberExpr:3<8>(
NameExpr(self [l<9>])
f)
Args()))))))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<10>(
A
FuncDef:2<3>(
f
Args(
Var(self))
def (self: target.A<4>)
Block:3<11>(
ExpressionStmt:3<12>(
CallExpr:3<13>(
MemberExpr:3<14>(
NameExpr(self [l<15>])
f)
Args()))))))
[case testClassAttribute]
import target
[file target.py]
class A:
def f(self) -> None:
self.x = 1
self.x
[file target.py.next]
class A:
def f(self) -> None:
self.x = 1
self.x
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<2>(
A
FuncDef:2<3>(
f
Args(
Var(self))
def (self: target.A<4>)
Block:3<5>(
AssignmentStmt:3<6>(
MemberExpr:3<8>(
NameExpr(self [l<9>])
x*<7>)
IntExpr(1))
ExpressionStmt:4<10>(
MemberExpr:4<11>(
NameExpr(self [l<9>])
x))))))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<12>(
A
FuncDef:2<3>(
f
Args(
Var(self))
def (self: target.A<4>)
Block:3<13>(
AssignmentStmt:3<14>(
MemberExpr:3<15>(
NameExpr(self [l<16>])
x*<7>)
IntExpr(1))
ExpressionStmt:4<17>(
MemberExpr:4<18>(
NameExpr(self [l<16>])
x))))))
[case testClassAttribute_typeinfo]
import target
[file target.py]
class A:
def f(self) -> None:
self.x = 1
self.x
self.y = A()
[file target.py.next]
class A:
def f(self) -> None:
self.x = 1
self.x
self.y = A()
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
f<2>
x<3> (builtins.int<4>)
y<5> (target.A<0>)))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
f<2>
x<3> (builtins.int<4>)
y<5> (target.A<0>)))
[case testFunction_symtable]
import target
[file target.py]
def f() -> int:
pass
[file target.py.next]
def f() -> int:
pass
[out]
__main__:
target: MypyFile<0>
target:
f: FuncDef<1>
==>
__main__:
target: MypyFile<0>
target:
f: FuncDef<1>
[case testClass_symtable]
import target
[file target.py]
class A: pass
class B: pass
[file target.py.next]
class A: pass
class C: pass
[out]
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
B: TypeInfo<2>
==>
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
C: TypeInfo<3>
[case testTopLevelExpression]
import target
[file target.py]
class A: pass
A()
[file target.py.next]
class A: pass
class B: pass
A()
B()
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<2>(
A
PassStmt:1<3>())
ExpressionStmt:2<4>(
CallExpr:2<5>(
NameExpr(A [target.A<6>])
Args())))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ClassDef:1<7>(
A
PassStmt:1<8>())
ClassDef:2<9>(
B
PassStmt:2<10>())
ExpressionStmt:3<11>(
CallExpr:3<12>(
NameExpr(A [target.A<6>])
Args()))
ExpressionStmt:4<13>(
CallExpr:4<14>(
NameExpr(B [target.B<15>])
Args())))
[case testExpression_types]
import target
[file target.py]
class A: pass
def f(a: A) -> None:
1
a
[file target.py.next]
class A: pass
def f(a: A) -> None:
a
1
[out]
## target
IntExpr:3: Literal[1]?<0>
NameExpr:4: target.A<1>
==>
## target
NameExpr:3: target.A<1>
IntExpr:4: Literal[1]?<0>
[case testClassAttribute_types]
import target
[file target.py]
class A:
def f(self) -> None:
self.x = A()
self.x
self.y = 1
self.y
[file target.py.next]
class A:
def f(self) -> None:
self.y = 1
self.y
self.x = A()
self.x
[out]
## target
CallExpr:3: target.A<0>
MemberExpr:3: target.A<0>
NameExpr:3: def () -> target.A<0>
NameExpr:3: target.A<0>
MemberExpr:4: target.A<0>
NameExpr:4: target.A<0>
IntExpr:5: Literal[1]?<1>
MemberExpr:5: builtins.int<1>
NameExpr:5: target.A<0>
MemberExpr:6: builtins.int<1>
NameExpr:6: target.A<0>
==>
## target
IntExpr:3: Literal[1]?<1>
MemberExpr:3: builtins.int<1>
NameExpr:3: target.A<0>
MemberExpr:4: builtins.int<1>
NameExpr:4: target.A<0>
CallExpr:5: target.A<0>
MemberExpr:5: target.A<0>
NameExpr:5: def () -> target.A<0>
NameExpr:5: target.A<0>
MemberExpr:6: target.A<0>
NameExpr:6: target.A<0>
[case testMethod_types]
import target
[file target.py]
class A:
def f(self) -> A:
return self.f()
[file target.py.next]
class A:
# Extra line to change line numbers
def f(self) -> A:
return self.f()
[out]
## target
CallExpr:3: target.A<0>
MemberExpr:3: def () -> target.A<0>
NameExpr:3: target.A<0>
==>
## target
CallExpr:4: target.A<0>
MemberExpr:4: def () -> target.A<0>
NameExpr:4: target.A<0>
[case testRenameFunction]
import target
[file target.py]
def f() -> int: pass
[file target.py.next]
def g() -> int: pass
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
FuncDef:1<2>(
f
def () -> builtins.int<3>
Block:1<4>(
PassStmt:1<5>())))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
FuncDef:1<6>(
g
def () -> builtins.int<3>
Block:1<7>(
PassStmt:1<8>())))
[case testRenameFunction_symtable]
import target
[file target.py]
def f() -> int: pass
[file target.py.next]
def g() -> int: pass
[out]
__main__:
target: MypyFile<0>
target:
f: FuncDef<1>
==>
__main__:
target: MypyFile<0>
target:
g: FuncDef<2>
[case testMergeWithBaseClass_typeinfo]
import target
[file target.py]
class A: pass
class B(A):
def f(self) -> None: pass
[file target.py.next]
class C: pass
class A: pass
class B(A):
def f(self) -> None: pass
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.B)
Bases(target.A<0>)
Mro(target.B<2>, target.A<0>, builtins.object<1>)
Names(
f<3>))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.B)
Bases(target.A<0>)
Mro(target.B<2>, target.A<0>, builtins.object<1>)
Names(
f<3>))
TypeInfo<4>(
Name(target.C)
Bases(builtins.object<1>)
Mro(target.C<4>, builtins.object<1>)
Names())
[case testModuleAttribute]
import target
[file target.py]
x = 1
[file target.py.next]
x = 2
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
AssignmentStmt:1<2>(
NameExpr(x [target.x<3>])
IntExpr(1)
builtins.int<4>))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
AssignmentStmt:1<5>(
NameExpr(x [target.x<3>])
IntExpr(2)
builtins.int<4>))
[case testNestedClassMethod_typeinfo]
import target
[file target.py]
class A:
class B:
def f(self) -> None: pass
[file target.py.next]
class A:
class B:
def f(self) -> None: pass
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
B<2>))
TypeInfo<2>(
Name(target.A.B)
Bases(builtins.object<1>)
Mro(target.A.B<2>, builtins.object<1>)
Names(
f<3>))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names(
B<2>))
TypeInfo<2>(
Name(target.A.B)
Bases(builtins.object<1>)
Mro(target.A.B<2>, builtins.object<1>)
Names(
f<3>))
[case testNamedTuple_typeinfo]
# flags: --python-version 3.10
import target
[file target.py]
from typing import NamedTuple
class A: pass
N = NamedTuple('N', [('x', A)])
[file target.py.next]
from typing import NamedTuple
class A: pass
N = NamedTuple('N', [('x', A), ('y', A)])
[builtins fixtures/tuple.pyi]
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.N)
Bases(builtins.tuple[target.A<0>, ...]<3>)
Mro(target.N<2>, builtins.tuple<3>, typing.Sequence<4>, typing.Iterable<5>, builtins.object<1>)
Names(
_NT<6>
__annotations__<7> (builtins.dict[builtins.str<8>, Any]<9>)
__doc__<10> (builtins.str<8>)
__match_args__<11> (Tuple[Literal['x']])
__new__<12>
_asdict<13>
_field_defaults<14> (builtins.dict[builtins.str<8>, Any]<9>)
_field_types<15> (builtins.dict[builtins.str<8>, Any]<9>)
_fields<16> (Tuple[builtins.str<8>])
_make<17>
_replace<18>
_source<19> (builtins.str<8>)
x<20> (target.A<0>)))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.N)
Bases(builtins.tuple[target.A<0>, ...]<3>)
Mro(target.N<2>, builtins.tuple<3>, typing.Sequence<4>, typing.Iterable<5>, builtins.object<1>)
Names(
_NT<6>
__annotations__<7> (builtins.dict[builtins.str<8>, Any]<9>)
__doc__<10> (builtins.str<8>)
__match_args__<11> (Tuple[Literal['x'], Literal['y']])
__new__<12>
_asdict<13>
_field_defaults<14> (builtins.dict[builtins.str<8>, Any]<9>)
_field_types<15> (builtins.dict[builtins.str<8>, Any]<9>)
_fields<16> (Tuple[builtins.str<8>, builtins.str<8>])
_make<17>
_replace<18>
_source<19> (builtins.str<8>)
x<20> (target.A<0>)
y<21> (target.A<0>)))
[case testNamedTupleOldVersion_typeinfo]
import target
[file target.py]
from typing import NamedTuple
class A: pass
N = NamedTuple('N', [('x', A)])
[file target.py.next]
from typing import NamedTuple
class A: pass
N = NamedTuple('N', [('x', A), ('y', A)])
[builtins fixtures/tuple.pyi]
[out]
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.N)
Bases(builtins.tuple[target.A<0>, ...]<3>)
Mro(target.N<2>, builtins.tuple<3>, typing.Sequence<4>, typing.Iterable<5>, builtins.object<1>)
Names(
_NT<6>
__annotations__<7> (builtins.dict[builtins.str<8>, Any]<9>)
__doc__<10> (builtins.str<8>)
__new__<11>
_asdict<12>
_field_defaults<13> (builtins.dict[builtins.str<8>, Any]<9>)
_field_types<14> (builtins.dict[builtins.str<8>, Any]<9>)
_fields<15> (Tuple[builtins.str<8>])
_make<16>
_replace<17>
_source<18> (builtins.str<8>)
x<19> (target.A<0>)))
==>
TypeInfo<0>(
Name(target.A)
Bases(builtins.object<1>)
Mro(target.A<0>, builtins.object<1>)
Names())
TypeInfo<2>(
Name(target.N)
Bases(builtins.tuple[target.A<0>, ...]<3>)
Mro(target.N<2>, builtins.tuple<3>, typing.Sequence<4>, typing.Iterable<5>, builtins.object<1>)
Names(
_NT<6>
__annotations__<7> (builtins.dict[builtins.str<8>, Any]<9>)
__doc__<10> (builtins.str<8>)
__new__<11>
_asdict<12>
_field_defaults<13> (builtins.dict[builtins.str<8>, Any]<9>)
_field_types<14> (builtins.dict[builtins.str<8>, Any]<9>)
_fields<15> (Tuple[builtins.str<8>, builtins.str<8>])
_make<16>
_replace<17>
_source<18> (builtins.str<8>)
x<19> (target.A<0>)
y<20> (target.A<0>)))
[case testUnionType_types]
import target
[file target.py]
from typing import Union
class A: pass
a: A
[file target.py.next]
from typing import Union
class A: pass
a: Union[A, int]
[out]
## target
NameExpr:3: target.A<0>
==>
## target
NameExpr:3: Union[target.A<0>, builtins.int<1>]
[case testTypeType_types]
import target
[file target.py]
from typing import Type
class A: pass
a: Type[A]
[file target.py.next]
from typing import Type
class A: pass
a: Type[A]
[out]
## target
NameExpr:3: Type[target.A<0>]
==>
## target
NameExpr:3: Type[target.A<0>]
[case testTypeVar_types]
import target
[file target.py]
from typing import TypeVar, Generic
T = TypeVar('T', bound=int)
class A(Generic[T]):
x: T
[file target.py.next]
from typing import TypeVar
T = TypeVar('T', bound='A')
class A(Generic[T]):
x: T
[out]
## target
CallExpr:2: Any
NameExpr:2: Any
TypeVarExpr:2: Any
NameExpr:4: T`1(upper_bound=builtins.int<0>)
==>
## target
CallExpr:2: Any
NameExpr:2: Any
TypeVarExpr:2: Any
NameExpr:4: T`1(upper_bound=target.A[Any]<1>)
[case testUnboundType_types]
import target
[file target.py]
from typing import TypeVar, Generic
class A: pass
foo: int
x: foo[A]
[file target.py.next]
from typing import TypeVar, Generic
class A: pass
foo: int
x: foo[A]
[out]
tmp/target.py:4: error: Variable "target.foo" is not valid as a type
tmp/target.py:4: note: See https://mypy.readthedocs.io/en/stable/common_issues.html#variables-vs-type-aliases
## target
NameExpr:3: builtins.int<0>
NameExpr:4: foo?[target.A<1>]
==>
## target
NameExpr:3: builtins.int<0>
NameExpr:4: foo?[target.A<1>]
[case testOverloaded_types]
import target
[file target.py]
from typing import overload
class A: pass
@overload
def f(x: A) -> A: pass
@overload
def f(x: int) -> int: pass
def f(x): pass
g = f
[file target.py.next]
from typing import overload
class A: pass
@overload
def f(x: A) -> A: pass
@overload
def f(x: str) -> str: pass
def f(x): pass
g = f
[out]
-- TODO: It is unclear why this works correctly...
## target
NameExpr:11: Overload(def (x: target.A<0>) -> target.A<0>, def (x: builtins.int<1>) -> builtins.int<1>)
NameExpr:11: Overload(def (x: target.A<0>) -> target.A<0>, def (x: builtins.int<1>) -> builtins.int<1>)
==>
## target
NameExpr:12: Overload(def (x: target.A<0>) -> target.A<0>, def (x: builtins.str<2>) -> builtins.str<2>)
NameExpr:12: Overload(def (x: target.A<0>) -> target.A<0>, def (x: builtins.str<2>) -> builtins.str<2>)
[case testOverloaded]
import target
[file target.py]
from typing import overload
class A: pass
@overload
def f(x: A) -> A: pass
@overload
def f(x: int) -> int: pass
def f(x): pass
[file target.py.next]
from typing import overload
class A: pass
class B: pass
@overload
def f(x: A) -> B: pass
@overload
def f(x: str) -> str: pass
def f(x): pass
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ImportFrom:1(typing, [overload])
ClassDef:2<2>(
A
PassStmt:2<3>())
OverloadedFuncDef:4<4>(
FuncDef:9<5>(
f
Args(
Var(x))
Block:9<6>(
PassStmt:9<7>()))
Overload(def (x: target.A<8>) -> target.A<8>, def (x: builtins.int<9>) -> builtins.int<9>)
Decorator:4<10>(
Var(f)
NameExpr(overload [typing.overload<11>])
FuncDef:5<12>(
f
Args(
Var(x))
def (x: target.A<8>) -> target.A<8>
Block:5<13>(
PassStmt:5<14>())))
Decorator:6<15>(
Var(f)
NameExpr(overload [typing.overload<11>])
FuncDef:7<16>(
f
Args(
Var(x))
def (x: builtins.int<9>) -> builtins.int<9>
Block:7<17>(
PassStmt:7<18>())))))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ImportFrom:1(typing, [overload])
ClassDef:3<19>(
A
PassStmt:3<20>())
ClassDef:4<21>(
B
PassStmt:4<22>())
OverloadedFuncDef:6<4>(
FuncDef:11<23>(
f
Args(
Var(x))
Block:11<24>(
PassStmt:11<25>()))
Overload(def (x: target.A<8>) -> target.B<26>, def (x: builtins.str<27>) -> builtins.str<27>)
Decorator:6<28>(
Var(f)
NameExpr(overload [typing.overload<11>])
FuncDef:7<29>(
f
Args(
Var(x))
def (x: target.A<8>) -> target.B<26>
Block:7<30>(
PassStmt:7<31>())))
Decorator:8<32>(
Var(f)
NameExpr(overload [typing.overload<11>])
FuncDef:9<33>(
f
Args(
Var(x))
def (x: builtins.str<27>) -> builtins.str<27>
Block:9<34>(
PassStmt:9<35>())))))
[case testTypeVar_symtable]
import target
[file target.py]
from typing import TypeVar
T = TypeVar('T')
[file target.py.next]
from typing import TypeVar
T = TypeVar('T', bound=int)
[out]
__main__:
target: MypyFile<0>
target:
T: TypeVarExpr<1>
TypeVar: Var<2>
==>
__main__:
target: MypyFile<0>
target:
T: TypeVarExpr<1>
TypeVar: Var<2>
[case testTypeAlias_symtable]
import target
[file target.py]
from typing import TypeVar, Generic
T = TypeVar('T')
class A(Generic[T]): pass
X = A[int]
[file target.py.next]
from typing import TypeVar, Generic
T = TypeVar('T')
class A(Generic[T]): pass
X = A[str]
[out]
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
Generic: Var<2>
T: TypeVarExpr<3>
TypeVar: Var<4>
X: TypeAlias<5>
==>
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
Generic: Var<2>
T: TypeVarExpr<3>
TypeVar: Var<4>
X: TypeAlias<5>
[case testGenericFunction_types]
import target
[file target.py]
from typing import TypeVar
class A: pass
T = TypeVar('T', bound=A)
def f(x: T) -> T: pass
f
[file target.py.next]
from typing import TypeVar
class A: pass
T = TypeVar('T', bound=A)
def f(x: T, y: A) -> T: pass
f
[out]
## target
CallExpr:3: Any
NameExpr:3: Any
TypeVarExpr:3: Any
NameExpr:5: def [T <: target.A<0>] (x: T`-1(upper_bound=target.A<0>)) -> T`-1(upper_bound=target.A<0>)
==>
## target
CallExpr:3: Any
NameExpr:3: Any
TypeVarExpr:3: Any
NameExpr:5: def [T <: target.A<0>] (x: T`-1(upper_bound=target.A<0>), y: target.A<0>) -> T`-1(upper_bound=target.A<0>)
[case testMergeOverloaded_types]
import target
[file target.py]
from _x import A
a: A
[file target.py.next]
from _x import A
a: A
[fixture _x.pyi]
from typing import Generic, TypeVar, overload
T = TypeVar('T')
class C(Generic[T]):
@overload
def __init__(self) -> None: pass
@overload
def __init__(self, x: int) -> None: pass
A = C[int]
[out]
## target
NameExpr:2: _x.C[builtins.int<0>]<1>
==>
## target
NameExpr:2: _x.C[builtins.int<0>]<1>
[case testRefreshVar_symtable]
from typing import TypeVar
from target import f
x = 1
y = '' # type: str
[file target.py]
f = 1
[file target.py.next]
[out]
__main__:
TypeVar: Var<0>
f: Var<1>(builtins.int<2>)
x: Var<3>(builtins.int<2>)
y: Var<4>(builtins.str<5>)
target:
f: Var<1>(builtins.int<2>)
==>
__main__:
TypeVar: Var<0>
f: Var<6>(Any)
x: Var<3>(builtins.int<2>)
y: Var<4>(builtins.str<5>)
target:
[case testRefreshTypeVar_symtable]
from typing import TypeVar
from target import f
T = TypeVar('T')
[file target.py]
f = 1
[file target.py.next]
[out]
__main__:
T: TypeVarExpr<0>
TypeVar: Var<1>
f: Var<2>(builtins.int<3>)
target:
f: Var<2>(builtins.int<3>)
==>
__main__:
T: TypeVarExpr<0>
TypeVar: Var<1>
f: Var<4>(Any)
target:
[case testRefreshNamedTuple_symtable]
from typing import NamedTuple
from target import f
N = NamedTuple('N', [('x', int)])
[file target.py]
f = 1
[file target.py.next]
[builtins fixtures/tuple.pyi]
[out]
__main__:
N: TypeInfo<0>
NamedTuple: Var<1>
f: Var<2>(builtins.int<3>)
target:
f: Var<2>(builtins.int<3>)
==>
__main__:
N: TypeInfo<0>
NamedTuple: Var<1>
f: Var<4>(Any)
target:
[case testRefreshAttributeDefinedInClassBody_typeinfo]
from target import f
class A:
a = 1
b = '' # type: str
[file target.py]
f = 1
[file target.py.next]
[out]
TypeInfo<0>(
Name(__main__.A)
Bases(builtins.object<1>)
Mro(__main__.A<0>, builtins.object<1>)
Names(
a<2> (builtins.int<3>)
b<4> (builtins.str<5>)))
==>
TypeInfo<0>(
Name(__main__.A)
Bases(builtins.object<1>)
Mro(__main__.A<0>, builtins.object<1>)
Names(
a<2> (builtins.int<3>)
b<4> (builtins.str<5>)))
[case testDecorator_symtable]
import target
[file target.py]
from contextlib import contextmanager
from typing import Iterator, List, Tuple
@contextmanager
def f(x: List[Tuple[int]]) -> Iterator[None]:
yield
[file target.py.next]
from contextlib import contextmanager
from typing import Iterator, List, Tuple
@contextmanager
def f(x: List[Tuple[int]]) -> Iterator[None]:
yield
[typing fixtures/typing-medium.pyi]
[builtins fixtures/list.pyi]
[out]
__main__:
target: MypyFile<0>
target:
Iterator: TypeInfo<1>
List: TypeAlias<2>
Tuple: Var<3>
contextmanager: FuncDef<4>
f: Decorator<5>
==>
__main__:
target: MypyFile<0>
target:
Iterator: TypeInfo<1>
List: TypeAlias<2>
Tuple: Var<3>
contextmanager: FuncDef<4>
f: Decorator<5>
[case testConditionalFunctionDefinition]
import target
[file target.py]
import sys
class A: pass
class B: pass
if sys.platform == 'nonexistent':
def f(x: A) -> None: pass
else:
def f(x: B) -> None: pass
[file target.py.next]
import sys
class A: pass
class B: pass
if sys.platform == 'nonexistent':
def f(x: A, y: int) -> None: pass
else:
def f(x: B, y: int) -> None: pass
[builtins fixtures/ops.pyi]
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
Import:1(sys)
ClassDef:2<2>(
A
PassStmt:2<3>())
ClassDef:3<4>(
B
PassStmt:3<5>())
IfStmt:4<6>(
If(
ComparisonExpr:4<7>(
==
MemberExpr:4<9>(
NameExpr(sys<10>)
platform [sys.platform<8>])
StrExpr(nonexistent)))
Then(
FuncDef:5<11>(
f
Args(
Var(x))
def (x: A?) -> None?
Block:5<12>(
PassStmt:5<13>())))
Else(
FuncDef:7<14>(
f
Args(
Var(x))
def (x: target.B<15>)
Block:7<16>(
PassStmt:7<17>())))))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
Import:1(sys)
ClassDef:2<18>(
A
PassStmt:2<19>())
ClassDef:3<20>(
B
PassStmt:3<21>())
IfStmt:4<22>(
If(
ComparisonExpr:4<23>(
==
MemberExpr:4<24>(
NameExpr(sys<10>)
platform [sys.platform<8>])
StrExpr(nonexistent)))
Then(
FuncDef:5<25>(
f
Args(
Var(x)
Var(y))
def (x: A?, y: int?) -> None?
Block:5<26>(
PassStmt:5<27>())))
Else(
FuncDef:7<14>(
f
Args(
Var(x)
Var(y))
def (x: target.B<15>, y: builtins.int<28>)
Block:7<29>(
PassStmt:7<30>())))))
[case testMergeTypedDict_symtable]
import target
[file target.py]
from mypy_extensions import TypedDict
class A: pass
D = TypedDict('D', {'a': A})
d: D
[file target.py.next]
from mypy_extensions import TypedDict
class A: pass
D = TypedDict('D', {'a': A, 'b': int})
d: D
[builtins fixtures/dict.pyi]
[out]
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
D: TypeInfo<2>
TypedDict: FuncDef<3>
d: Var<4>(TypedDict('target.D', {'a': target.A<1>}))
==>
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
D: TypeInfo<2>
TypedDict: FuncDef<3>
d: Var<4>(TypedDict('target.D', {'a': target.A<1>, 'b': builtins.int<5>}))
[case testNewType_symtable]
import target
[file target.py]
from typing import NewType
class A: pass
B = NewType('B', A)
C = NewType('C', A)
[file target.py.next]
from typing import NewType
class A: pass
B = NewType('B', A)
C = NewType('C', B)
D = NewType('D', int)
[out]
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
B: TypeInfo<2>
C: TypeInfo<3>
NewType: Var<4>
==>
__main__:
target: MypyFile<0>
target:
A: TypeInfo<1>
B: TypeInfo<2>
C: TypeInfo<3>
D: TypeInfo<5>
NewType: Var<4>
[case testCallable_symtable-skip]
# The TypeInfo is currently not being merged correctly
import target
[file target.py]
def g(o: object) -> None:
if callable(o):
pass
[file target.py.next]
def g(o: object) -> None:
if callable(o):
o()
[builtins fixtures/callable.pyi]
[out]
__main__:
target: MypyFile<0>
target:
<callable subtype of object>: TypeInfo<1>
g: FuncDef<2>
==>
__main__:
target: MypyFile<0>
target:
<callable subtype of object>: TypeInfo<1>
g: FuncDef<2>
[case testMetaclass_typeinfo]
import target
[file target.py]
class M(type): pass
class C(metaclass=M):
pass
[file target.py.next]
class M(type): pass
class C(metaclass=M):
pass # dummy change
[out]
TypeInfo<0>(
Name(target.C)
Bases(builtins.object<1>)
Mro(target.C<0>, builtins.object<1>)
Names()
DeclaredMetaclass(target.M<2>)
MetaclassType(target.M<2>))
TypeInfo<2>(
Name(target.M)
Bases(builtins.type<3>)
Mro(target.M<2>, builtins.type<3>, builtins.object<1>)
Names())
==>
TypeInfo<0>(
Name(target.C)
Bases(builtins.object<1>)
Mro(target.C<0>, builtins.object<1>)
Names()
DeclaredMetaclass(target.M<2>)
MetaclassType(target.M<2>))
TypeInfo<2>(
Name(target.M)
Bases(builtins.type<3>)
Mro(target.M<2>, builtins.type<3>, builtins.object<1>)
Names())
[case testCast_symtable]
import target
[file target.py]
from typing import cast
class Thing:
pass
thing = cast(Thing, Thing())
[file target.py.next]
from typing import cast
class Thing:
pass
thing = cast(Thing, Thing())
[out]
__main__:
target: MypyFile<0>
target:
Thing: TypeInfo<1>
cast: Var<2>
thing: Var<3>(target.Thing<1>)
==>
__main__:
target: MypyFile<0>
target:
Thing: TypeInfo<1>
cast: Var<2>
thing: Var<3>(target.Thing<1>)
[case testClassBasedEnum_typeinfo]
import target
[file target.py]
from enum import Enum
class A(Enum):
X = 0
[file target.py.next]
from enum import Enum
class A(Enum):
X = 0
Y = 1
[out]
TypeInfo<0>(
Name(target.A)
Bases(enum.Enum<1>)
Mro(target.A<0>, enum.Enum<1>, builtins.object<2>)
Names(
X<3> (Literal[0]?<4>))
MetaclassType(enum.EnumMeta<5>))
==>
TypeInfo<0>(
Name(target.A)
Bases(enum.Enum<1>)
Mro(target.A<0>, enum.Enum<1>, builtins.object<2>)
Names(
X<3> (Literal[0]?<4>)
Y<6> (Literal[1]?<4>))
MetaclassType(enum.EnumMeta<5>))
[case testLiteralMerge]
import target
[file target.py]
from typing_extensions import Literal
def foo(x: Literal[3]) -> Literal['a']: pass
bar: Literal[4] = 4
[file target.py.next]
from typing_extensions import Literal
def foo(x: Literal['3']) -> Literal['b']: pass
bar: Literal[5] = 5
[builtins fixtures/tuple.pyi]
[out]
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ImportFrom:1(typing_extensions, [Literal])
FuncDef:2<2>(
foo
Args(
Var(x))
def (x: Literal[3]) -> Literal['a']
Block:2<3>(
PassStmt:2<4>()))
AssignmentStmt:3<5>(
NameExpr(bar [target.bar<6>])
IntExpr(4)
Literal[4]))
==>
MypyFile:1<0>(
tmp/main
Import:1(target))
MypyFile:1<1>(
tmp/target.py
ImportFrom:1(typing_extensions, [Literal])
FuncDef:2<2>(
foo
Args(
Var(x))
def (x: Literal['3']) -> Literal['b']
Block:2<7>(
PassStmt:2<8>()))
AssignmentStmt:3<9>(
NameExpr(bar [target.bar<6>])
IntExpr(5)
Literal[5]))