@@ -40,7 +40,7 @@ use crate::{
4040 PatId , Statement , UnaryOp ,
4141 } ,
4242 generics:: { GenericParams , HasGenericParams } ,
43- name:: { INTO_ITERATOR , ITEM , ITER , SELF_TYPE , STD } ,
43+ name,
4444 nameres:: { Namespace , PerNs } ,
4545 path:: { GenericArg , GenericArgs , PathKind , PathSegment } ,
4646 resolve:: {
@@ -843,7 +843,7 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
843843 // Parent arguments are unknown, except for the receiver type
844844 if let Some ( parent_generics) = def_generics. and_then ( |p| p. parent_params . clone ( ) ) {
845845 for param in & parent_generics. params {
846- if param. name == SELF_TYPE {
846+ if param. name == name :: SELF_TYPE {
847847 substs. push ( receiver_ty. clone ( ) ) ;
848848 } else {
849849 substs. push ( Ty :: Unknown ) ;
@@ -1140,8 +1140,23 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
11401140 self . insert_type_vars ( ty)
11411141 }
11421142 Expr :: Try { expr } => {
1143- let _inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
1144- Ty :: Unknown
1143+ let inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
1144+ let ty = match self . resolve_ops_try_ok ( ) {
1145+ Some ( ops_try_ok_alias) => {
1146+ let ty = self . new_type_var ( ) ;
1147+ let projection = ProjectionPredicate {
1148+ ty : ty. clone ( ) ,
1149+ projection_ty : ProjectionTy {
1150+ associated_ty : ops_try_ok_alias,
1151+ parameters : vec ! [ inner_ty] . into ( ) ,
1152+ } ,
1153+ } ;
1154+ self . obligations . push ( Obligation :: Projection ( projection) ) ;
1155+ self . resolve_ty_as_possible ( & mut vec ! [ ] , ty)
1156+ }
1157+ None => Ty :: Unknown ,
1158+ } ;
1159+ ty
11451160 }
11461161 Expr :: Cast { expr, type_ref } => {
11471162 let _inner_ty = self . infer_expr ( * expr, & Expectation :: none ( ) ) ;
@@ -1347,15 +1362,33 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
13471362 let into_iter_path = Path {
13481363 kind : PathKind :: Abs ,
13491364 segments : vec ! [
1350- PathSegment { name: STD , args_and_bindings: None } ,
1351- PathSegment { name: ITER , args_and_bindings: None } ,
1352- PathSegment { name: INTO_ITERATOR , args_and_bindings: None } ,
1365+ PathSegment { name: name :: STD , args_and_bindings: None } ,
1366+ PathSegment { name: name :: ITER , args_and_bindings: None } ,
1367+ PathSegment { name: name :: INTO_ITERATOR , args_and_bindings: None } ,
13531368 ] ,
13541369 } ;
13551370
13561371 match self . resolver . resolve_path_segments ( self . db , & into_iter_path) . into_fully_resolved ( ) {
13571372 PerNs { types : Some ( Def ( Trait ( trait_) ) ) , .. } => {
1358- Some ( trait_. associated_type_by_name ( self . db , ITEM ) ?)
1373+ Some ( trait_. associated_type_by_name ( self . db , name:: ITEM ) ?)
1374+ }
1375+ _ => None ,
1376+ }
1377+ }
1378+
1379+ fn resolve_ops_try_ok ( & self ) -> Option < TypeAlias > {
1380+ let ops_try_path = Path {
1381+ kind : PathKind :: Abs ,
1382+ segments : vec ! [
1383+ PathSegment { name: name:: STD , args_and_bindings: None } ,
1384+ PathSegment { name: name:: OPS , args_and_bindings: None } ,
1385+ PathSegment { name: name:: TRY , args_and_bindings: None } ,
1386+ ] ,
1387+ } ;
1388+
1389+ match self . resolver . resolve_path_segments ( self . db , & ops_try_path) . into_fully_resolved ( ) {
1390+ PerNs { types : Some ( Def ( Trait ( trait_) ) ) , .. } => {
1391+ Some ( trait_. associated_type_by_name ( self . db , name:: OK ) ?)
13591392 }
13601393 _ => None ,
13611394 }
0 commit comments