| -- 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])) |