@@ -229,9 +229,7 @@ impl NoSolutionError {
229229 /// The `[max]` sentinel is used to represent the maximum local version of a package, to
230230 /// implement PEP 440 semantics for local version equality. For example, `1.0.0+foo` needs to
231231 /// satisfy `==1.0.0`.
232- pub ( crate ) fn simplify_local_version_segments (
233- mut derivation_tree : ErrorTree ,
234- ) -> Option < ErrorTree > {
232+ pub ( crate ) fn collapse_local_version_segments ( derivation_tree : ErrorTree ) -> ErrorTree {
235233 /// Remove local versions sentinels (`+[max]`) from the given version ranges.
236234 fn strip_sentinel ( versions : & mut Ranges < Version > ) {
237235 versions. iter_mut ( ) . for_each ( |( lower, upper) | {
@@ -321,58 +319,62 @@ impl NoSolutionError {
321319 } )
322320 }
323321
324- match derivation_tree {
325- DerivationTree :: External ( External :: NotRoot ( _, _) ) => Some ( derivation_tree) ,
326- DerivationTree :: External ( External :: NoVersions ( _, ref mut versions) ) => {
327- if is_sentinel ( versions) {
328- None
329- } else {
322+ fn collapse ( mut derivation_tree : ErrorTree ) -> Option < ErrorTree > {
323+ match derivation_tree {
324+ DerivationTree :: External ( External :: NotRoot ( _, _) ) => Some ( derivation_tree) ,
325+ DerivationTree :: External ( External :: NoVersions ( _, ref mut versions) ) => {
326+ if is_sentinel ( versions) {
327+ return None ;
328+ }
329+
330330 strip_sentinel ( versions) ;
331331 Some ( derivation_tree)
332332 }
333- }
334- DerivationTree :: External ( External :: FromDependencyOf (
335- _ ,
336- ref mut versions1 ,
337- _ ,
338- ref mut versions2 ,
339- ) ) => {
340- strip_sentinel ( versions1 ) ;
341- strip_sentinel ( versions2 ) ;
342- Some ( derivation_tree )
343- }
344- DerivationTree :: External ( External :: Custom ( _ , ref mut versions , _ ) ) => {
345- strip_sentinel ( versions ) ;
346- Some ( derivation_tree )
347- }
348- DerivationTree :: Derived ( mut derived ) => {
349- let cause1 = Self :: simplify_local_version_segments ( ( * derived. cause1 ) . clone ( ) ) ;
350- let cause2 = Self :: simplify_local_version_segments ( ( * derived . cause2 ) . clone ( ) ) ;
351- match ( cause1, cause2) {
352- ( Some ( cause1 ) , Some ( cause2 ) ) => Some ( DerivationTree :: Derived ( Derived {
353- cause1 : Arc :: new ( cause1 ) ,
354- cause2 : Arc :: new ( cause2 ) ,
355- terms : std :: mem :: take ( & mut derived . terms )
356- . into_iter ( )
357- . map ( | ( pkg , mut term) | {
358- match & mut term {
359- Term :: Positive ( versions) => {
360- strip_sentinel ( versions ) ;
361- }
362- Term :: Negative ( versions) => {
363- strip_sentinel ( versions ) ;
333+ DerivationTree :: External ( External :: FromDependencyOf (
334+ _ ,
335+ ref mut versions1 ,
336+ _ ,
337+ ref mut versions2 ,
338+ ) ) => {
339+ strip_sentinel ( versions1 ) ;
340+ strip_sentinel ( versions2 ) ;
341+ Some ( derivation_tree )
342+ }
343+ DerivationTree :: External ( External :: Custom ( _ , ref mut versions , _ ) ) => {
344+ strip_sentinel ( versions ) ;
345+ Some ( derivation_tree )
346+ }
347+ DerivationTree :: Derived ( mut derived ) => {
348+ let cause1 = collapse ( ( * derived . cause1 ) . clone ( ) ) ;
349+ let cause2 = collapse ( ( * derived. cause2 ) . clone ( ) ) ;
350+ match ( cause1 , cause2) {
351+ ( Some ( cause1) , Some ( cause2) ) => Some ( DerivationTree :: Derived ( Derived {
352+ cause1 : Arc :: new ( cause1 ) ,
353+ cause2 : Arc :: new ( cause2 ) ,
354+ terms : std :: mem :: take ( & mut derived . terms )
355+ . into_iter ( )
356+ . map ( | ( pkg , mut term ) | {
357+ match & mut term {
358+ Term :: Positive ( versions ) => {
359+ strip_sentinel ( versions) ;
360+ }
361+ Term :: Negative ( versions ) => {
362+ strip_sentinel ( versions) ;
363+ }
364364 }
365- }
366- ( pkg , term )
367- } )
368- . collect ( ) ,
369- shared_id : derived . shared_id ,
370- } ) ) ,
371- ( Some ( cause ) , None ) | ( None , Some ( cause ) ) => Some ( cause ) ,
372- _ => None ,
365+ ( pkg , term )
366+ } )
367+ . collect ( ) ,
368+ shared_id : derived . shared_id ,
369+ } ) ) ,
370+ ( Some ( cause ) , None ) | ( None , Some ( cause ) ) => Some ( cause ) ,
371+ _ => None ,
372+ }
373373 }
374374 }
375375 }
376+
377+ collapse ( derivation_tree) . expect ( "derivation tree should contain at least one term" )
376378 }
377379
378380 /// Initialize a [`NoSolutionHeader`] for this error.
@@ -403,7 +405,6 @@ impl std::fmt::Display for NoSolutionError {
403405 display_tree ( & tree, "Resolver derivation tree before reduction" ) ;
404406 }
405407
406- // simplify_local_version_segments(&mut tree);
407408 collapse_no_versions_of_workspace_members ( & mut tree, & self . workspace_members ) ;
408409
409410 if self . workspace_members . len ( ) == 1 {
0 commit comments