@@ -3745,6 +3745,183 @@ class C(A, B):
3745
3745
[out1]
3746
3746
[out2]
3747
3747
3748
+ [case testAttrsIncrementalConverterInSubmodule]
3749
+ from a.a import A
3750
+ reveal_type(A)
3751
+ [file a/__init__.py]
3752
+ [file a/a.py]
3753
+ from typing import Optional
3754
+ def converter(s:Optional[int]) -> int:
3755
+ ...
3756
+
3757
+ import attr
3758
+ @attr.s
3759
+ class A:
3760
+ x: int = attr.ib(converter=converter)
3761
+
3762
+ [builtins fixtures/list.pyi]
3763
+ [out1]
3764
+ main:2: error: Revealed type is 'def (x: Union[builtins.int, builtins.None]) -> a.a.A'
3765
+ [out2]
3766
+ main:2: error: Revealed type is 'def (x: Union[builtins.int, builtins.None]) -> a.a.A'
3767
+
3768
+ [case testAttrsIncrementalConverterManyStyles]
3769
+ from base import Base
3770
+ reveal_type(Base)
3771
+ from subclass import A, B
3772
+ reveal_type(A)
3773
+ reveal_type(B)
3774
+ from submodule.base import SubBase
3775
+ reveal_type(SubBase)
3776
+ from submodule.subclass import AA, BB
3777
+ reveal_type(AA)
3778
+ reveal_type(BB)
3779
+ from submodule.subsubclass import SubAA, SubBB
3780
+ reveal_type(SubAA)
3781
+ reveal_type(SubBB)
3782
+
3783
+ [file foo.py]
3784
+ from typing import Optional
3785
+ def maybe_int(x: Optional[int]) -> int:
3786
+ ...
3787
+ [file bar.py]
3788
+ from typing import Optional
3789
+ def maybe_bool(x: Optional[bool]) -> bool:
3790
+ ...
3791
+ [file base.py]
3792
+ from typing import Optional
3793
+ import attr
3794
+ import bar
3795
+ from foo import maybe_int
3796
+ def maybe_str(x: Optional[str]) -> str:
3797
+ ...
3798
+ @attr.s
3799
+ class Base:
3800
+ x: int = attr.ib(converter=maybe_int)
3801
+ y: str = attr.ib(converter=maybe_str)
3802
+ z: bool = attr.ib(converter=bar.maybe_bool)
3803
+ [file subclass.py]
3804
+ from typing import Optional
3805
+ import attr
3806
+ from base import Base
3807
+ @attr.s
3808
+ class A(Base): pass
3809
+
3810
+ import bar
3811
+ from foo import maybe_int
3812
+ def maybe_str(x: Optional[str]) -> str:
3813
+ ...
3814
+ @attr.s
3815
+ class B(Base):
3816
+ xx: int = attr.ib(converter=maybe_int)
3817
+ yy: str = attr.ib(converter=maybe_str)
3818
+ zz: bool = attr.ib(converter=bar.maybe_bool)
3819
+
3820
+ [file submodule/__init__.py]
3821
+ [file submodule/base.py]
3822
+ from typing import Optional
3823
+ import attr
3824
+ import bar
3825
+ from foo import maybe_int
3826
+ def maybe_str(x: Optional[str]) -> str:
3827
+ ...
3828
+ @attr.s
3829
+ class SubBase:
3830
+ x: int = attr.ib(converter=maybe_int)
3831
+ y: str = attr.ib(converter=maybe_str)
3832
+ z: bool = attr.ib(converter=bar.maybe_bool)
3833
+
3834
+ [file submodule/subclass.py]
3835
+ from typing import Optional
3836
+ import attr
3837
+ from base import Base
3838
+ @attr.s
3839
+ class AA(Base): pass
3840
+
3841
+ import bar
3842
+ from foo import maybe_int
3843
+ def maybe_str(x: Optional[str]) -> str:
3844
+ ...
3845
+ @attr.s
3846
+ class BB(Base):
3847
+ xx: int = attr.ib(converter=maybe_int)
3848
+ yy: str = attr.ib(converter=maybe_str)
3849
+ zz: bool = attr.ib(converter=bar.maybe_bool)
3850
+
3851
+ [file submodule/subsubclass.py]
3852
+ from typing import Optional
3853
+ import attr
3854
+ from .base import SubBase
3855
+ @attr.s
3856
+ class SubAA(SubBase): pass
3857
+
3858
+ import bar
3859
+ from foo import maybe_int
3860
+ def maybe_str(x: Optional[str]) -> str:
3861
+ ...
3862
+ @attr.s
3863
+ class SubBB(SubBase):
3864
+ xx: int = attr.ib(converter=maybe_int)
3865
+ yy: str = attr.ib(converter=maybe_str)
3866
+ zz: bool = attr.ib(converter=bar.maybe_bool)
3867
+ [builtins fixtures/list.pyi]
3868
+ [out1]
3869
+ main:2: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> base.Base'
3870
+ main:4: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> subclass.A'
3871
+ main:5: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> subclass.B'
3872
+ main:7: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.base.SubBase'
3873
+ main:9: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.subclass.AA'
3874
+ main:10: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> submodule.subclass.BB'
3875
+ main:12: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.subsubclass.SubAA'
3876
+ main:13: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> submodule.subsubclass.SubBB'
3877
+ [out2]
3878
+ main:2: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> base.Base'
3879
+ main:4: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> subclass.A'
3880
+ main:5: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> subclass.B'
3881
+ main:7: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.base.SubBase'
3882
+ main:9: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.subclass.AA'
3883
+ main:10: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> submodule.subclass.BB'
3884
+ main:12: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None]) -> submodule.subsubclass.SubAA'
3885
+ main:13: error: Revealed type is 'def (x: Union[builtins.int, builtins.None], y: Union[builtins.str, builtins.None], z: Union[builtins.bool, builtins.None], xx: Union[builtins.int, builtins.None], yy: Union[builtins.str, builtins.None], zz: Union[builtins.bool, builtins.None]) -> submodule.subsubclass.SubBB'
3886
+
3887
+ [case testAttrsIncrementalConverterInFunction]
3888
+ import attr
3889
+ def foo() -> None:
3890
+ def foo(x: str) -> int:
3891
+ ...
3892
+ @attr.s
3893
+ class A:
3894
+ x: int = attr.ib(converter=foo)
3895
+ reveal_type(A)
3896
+ [builtins fixtures/list.pyi]
3897
+ [out1]
3898
+ main:8: error: Revealed type is 'def (x: str?) -> __main__.A@5'
3899
+ [out2]
3900
+ main:8: error: Revealed type is 'def (x: str?) -> __main__.A@5'
3901
+
3902
+ [case testAttrsIncrementalConverterInSubmoduleForwardRef]
3903
+ from a.a import A
3904
+ reveal_type(A)
3905
+ [file a/__init__.py]
3906
+ [file a/a.py]
3907
+ from typing import List
3908
+ def converter(s:F) -> int:
3909
+ ...
3910
+
3911
+ import attr
3912
+ @attr.s
3913
+ class A:
3914
+ x: int = attr.ib(converter=converter)
3915
+
3916
+ F = List[int]
3917
+
3918
+ [builtins fixtures/list.pyi]
3919
+ [out1]
3920
+ main:2: error: Revealed type is 'def (x: builtins.list[builtins.int]) -> a.a.A'
3921
+ [out2]
3922
+ main:2: error: Revealed type is 'def (x: builtins.list[builtins.int]) -> a.a.A'
3923
+
3924
+
3748
3925
[case testAttrsIncrementalThreeRuns]
3749
3926
from a import A
3750
3927
A(5)
0 commit comments