@@ -119,6 +119,10 @@ def f(
119119 alpha : some | obj ,
120120 beta : + some ,
121121 gamma : some < obj ,
122+ delta : some | {obj : module },
123+ epsilon : some | {obj , module },
124+ zeta : some | [obj ],
125+ eta : some | (),
122126 ):
123127 pass
124128
@@ -147,6 +151,69 @@ def f(
147151 self .assertIsInstance (gamma_anno , ForwardRef )
148152 self .assertEqual (gamma_anno , support .EqualToForwardRef ("some < obj" , owner = f ))
149153
154+ delta_anno = anno ["delta" ]
155+ self .assertIsInstance (delta_anno , ForwardRef )
156+ self .assertEqual (delta_anno , support .EqualToForwardRef ("some | {obj: module}" , owner = f ))
157+
158+ epsilon_anno = anno ["epsilon" ]
159+ self .assertIsInstance (epsilon_anno , ForwardRef )
160+ self .assertEqual (epsilon_anno , support .EqualToForwardRef ("some | {obj, module}" , owner = f ))
161+
162+ zeta_anno = anno ["zeta" ]
163+ self .assertIsInstance (zeta_anno , ForwardRef )
164+ self .assertEqual (zeta_anno , support .EqualToForwardRef ("some | [obj]" , owner = f ))
165+
166+ eta_anno = anno ["eta" ]
167+ self .assertIsInstance (eta_anno , ForwardRef )
168+ self .assertEqual (eta_anno , support .EqualToForwardRef ("some | ()" , owner = f ))
169+
170+ def test_partially_nonexistent (self ):
171+ # These annotations start with a non-existent variable and then use
172+ # global types with defined values. This partially evaluates by putting
173+ # those globals into `fwdref.__extra_names__`.
174+ def f (
175+ x : obj | int ,
176+ y : container [int :obj , int ],
177+ z : dict_val | {str : int },
178+ alpha : set_val | {str , int },
179+ beta : obj | bool | int ,
180+ gamma : obj | call_func (int , kwd = bool ),
181+ ):
182+ pass
183+
184+ def func (* args , ** kwargs ):
185+ return Union [* args , * (kwargs .values ())]
186+
187+ anno = get_annotations (f , format = Format .FORWARDREF )
188+ globals_ = {
189+ "obj" : str , "container" : list , "dict_val" : {1 : 2 }, "set_val" : {1 , 2 },
190+ "call_func" : func
191+ }
192+
193+ x_anno = anno ["x" ]
194+ self .assertIsInstance (x_anno , ForwardRef )
195+ self .assertEqual (x_anno .evaluate (globals = globals_ ), str | int )
196+
197+ y_anno = anno ["y" ]
198+ self .assertIsInstance (y_anno , ForwardRef )
199+ self .assertEqual (y_anno .evaluate (globals = globals_ ), list [int :str , int ])
200+
201+ z_anno = anno ["z" ]
202+ self .assertIsInstance (z_anno , ForwardRef )
203+ self .assertEqual (z_anno .evaluate (globals = globals_ ), {1 : 2 } | {str : int })
204+
205+ alpha_anno = anno ["alpha" ]
206+ self .assertIsInstance (alpha_anno , ForwardRef )
207+ self .assertEqual (alpha_anno .evaluate (globals = globals_ ), {1 , 2 } | {str , int })
208+
209+ beta_anno = anno ["beta" ]
210+ self .assertIsInstance (beta_anno , ForwardRef )
211+ self .assertEqual (beta_anno .evaluate (globals = globals_ ), str | bool | int )
212+
213+ gamma_anno = anno ["gamma" ]
214+ self .assertIsInstance (gamma_anno , ForwardRef )
215+ self .assertEqual (gamma_anno .evaluate (globals = globals_ ), str | func (int , kwd = bool ))
216+
150217 def test_partially_nonexistent_union (self ):
151218 # Test unions with '|' syntax equal unions with typing.Union[] with some forwardrefs
152219 class UnionForwardrefs :
0 commit comments