@@ -1251,12 +1251,22 @@ impl<'db> Bindings<'db> {
12511251 ] = overload. parameter_types ( )
12521252 {
12531253 if let Some ( setter) = property. setter ( db) {
1254- if let Err ( _call_error ) = setter
1254+ if let Ok ( return_ty ) = setter
12551255 . try_call ( db, & CallArguments :: positional ( [ * instance, * value] ) )
1256+ . map ( |binding| binding. return_type ( db) )
12561257 {
1258+ // `property.__set__` returns `None` for ordinary setters, but
1259+ // preserving `Never` keeps non-returning setters divergent.
1260+ overload. set_return_type ( if return_ty. is_never ( ) {
1261+ return_ty
1262+ } else {
1263+ Type :: none ( db)
1264+ } ) ;
1265+ } else {
12571266 overload. errors . push ( BindingError :: InternalCallError (
12581267 "calling the setter failed" ,
12591268 ) ) ;
1269+ overload. set_return_type ( Type :: unknown ( ) ) ;
12601270 }
12611271 } else {
12621272 overload
@@ -1271,12 +1281,22 @@ impl<'db> Bindings<'db> {
12711281 overload. parameter_types ( )
12721282 {
12731283 if let Some ( deleter) = property. deleter ( db) {
1274- if let Err ( _call_error) =
1275- deleter. try_call ( db, & CallArguments :: positional ( [ * instance] ) )
1284+ if let Ok ( return_ty) = deleter
1285+ . try_call ( db, & CallArguments :: positional ( [ * instance] ) )
1286+ . map ( |binding| binding. return_type ( db) )
12761287 {
1288+ // `property.__delete__` returns `None` for ordinary deleters,
1289+ // but preserving `Never` keeps non-returning deleters divergent.
1290+ overload. set_return_type ( if return_ty. is_never ( ) {
1291+ return_ty
1292+ } else {
1293+ Type :: none ( db)
1294+ } ) ;
1295+ } else {
12771296 overload. errors . push ( BindingError :: InternalCallError (
12781297 "calling the deleter failed" ,
12791298 ) ) ;
1299+ overload. set_return_type ( Type :: unknown ( ) ) ;
12801300 }
12811301 } else {
12821302 overload
@@ -1289,12 +1309,22 @@ impl<'db> Bindings<'db> {
12891309 Type :: KnownBoundMethod ( KnownBoundMethodType :: PropertyDunderSet ( property) ) => {
12901310 if let [ Some ( instance) , Some ( value) , ..] = overload. parameter_types ( ) {
12911311 if let Some ( setter) = property. setter ( db) {
1292- if let Err ( _call_error ) = setter
1312+ if let Ok ( return_ty ) = setter
12931313 . try_call ( db, & CallArguments :: positional ( [ * instance, * value] ) )
1314+ . map ( |binding| binding. return_type ( db) )
12941315 {
1316+ // `property.__set__` returns `None` for ordinary setters, but
1317+ // preserving `Never` keeps non-returning setters divergent.
1318+ overload. set_return_type ( if return_ty. is_never ( ) {
1319+ return_ty
1320+ } else {
1321+ Type :: none ( db)
1322+ } ) ;
1323+ } else {
12951324 overload. errors . push ( BindingError :: InternalCallError (
12961325 "calling the setter failed" ,
12971326 ) ) ;
1327+ overload. set_return_type ( Type :: unknown ( ) ) ;
12981328 }
12991329 } else {
13001330 overload
@@ -1309,12 +1339,22 @@ impl<'db> Bindings<'db> {
13091339 ) ) => {
13101340 if let [ Some ( instance) , ..] = overload. parameter_types ( ) {
13111341 if let Some ( deleter) = property. deleter ( db) {
1312- if let Err ( _call_error) =
1313- deleter. try_call ( db, & CallArguments :: positional ( [ * instance] ) )
1342+ if let Ok ( return_ty) = deleter
1343+ . try_call ( db, & CallArguments :: positional ( [ * instance] ) )
1344+ . map ( |binding| binding. return_type ( db) )
13141345 {
1346+ // `property.__delete__` returns `None` for ordinary deleters,
1347+ // but preserving `Never` keeps non-returning deleters divergent.
1348+ overload. set_return_type ( if return_ty. is_never ( ) {
1349+ return_ty
1350+ } else {
1351+ Type :: none ( db)
1352+ } ) ;
1353+ } else {
13151354 overload. errors . push ( BindingError :: InternalCallError (
13161355 "calling the deleter failed" ,
13171356 ) ) ;
1357+ overload. set_return_type ( Type :: unknown ( ) ) ;
13181358 }
13191359 } else {
13201360 overload
0 commit comments