@@ -210,7 +210,7 @@ impl<'db> NarrowingConstraintsBuilder<'db> {
210210 is_positive : bool ,
211211 ) -> Option < NarrowingConstraints < ' db > > {
212212 match expression_node {
213- ast:: Expr :: Name ( name) => Some ( self . evaluate_expr_name ( name, is_positive) ) ,
213+ ast:: Expr :: Name ( name) => Some ( self . evaluate_expr_name ( name, expression , is_positive) ) ,
214214 ast:: Expr :: Compare ( expr_compare) => {
215215 self . evaluate_expr_compare ( expr_compare, expression, is_positive)
216216 }
@@ -257,16 +257,50 @@ impl<'db> NarrowingConstraintsBuilder<'db> {
257257 fn evaluate_expr_name (
258258 & mut self ,
259259 expr_name : & ast:: ExprName ,
260+ expression : Expression < ' db > ,
260261 is_positive : bool ,
261262 ) -> NarrowingConstraints < ' db > {
262263 let ast:: ExprName { id, .. } = expr_name;
264+ let inference = infer_expression_types ( self . db , expression) ;
263265
264266 let symbol = self
265267 . symbols ( )
266268 . symbol_id_by_name ( id)
267269 . expect ( "Should always have a symbol for every Name node" ) ;
270+ let ty = inference. expression_type ( expr_name. scoped_expression_id ( self . db , self . scope ( ) ) ) ;
271+
268272 let mut constraints = NarrowingConstraints :: default ( ) ;
269273
274+ // TODO: Handle unions and intersections
275+ let mut narrow_by_typeguards = || match ty {
276+ Type :: TypeGuard ( type_guard) => {
277+ let ( _, guarded_symbol, _) = type_guard. symbol_info ( self . db ) ?;
278+
279+ if !is_positive {
280+ return None ;
281+ }
282+
283+ constraints. insert (
284+ guarded_symbol,
285+ type_guard. ty ( self . db ) . negate_if ( self . db , !is_positive) ,
286+ ) ;
287+
288+ Some ( ( ) )
289+ }
290+ Type :: TypeIs ( type_is) => {
291+ let ( _, guarded_symbol, _) = type_is. symbol_info ( self . db ) ?;
292+
293+ constraints. insert (
294+ guarded_symbol,
295+ type_is. ty ( self . db ) . negate_if ( self . db , !is_positive) ,
296+ ) ;
297+
298+ Some ( ( ) )
299+ }
300+ _ => None ,
301+ } ;
302+ narrow_by_typeguards ( ) ;
303+
270304 constraints. insert (
271305 symbol,
272306 if is_positive {
0 commit comments