@@ -34,7 +34,6 @@ use rustc_span::source_map::{Span, Spanned};
3434use rustc_span:: sym;
3535use std:: cmp:: Ordering ;
3636use std:: collections:: hash_map:: Entry ;
37- use std:: iter;
3837use std:: ops:: Bound ;
3938
4039declare_clippy_lint ! {
@@ -1707,12 +1706,6 @@ where
17071706 }
17081707
17091708 impl < ' a , T : Copy > Kind < ' a , T > {
1710- fn range ( & self ) -> & ' a SpannedRange < T > {
1711- match * self {
1712- Kind :: Start ( _, r) | Kind :: End ( _, r) => r,
1713- }
1714- }
1715-
17161709 fn value ( self ) -> Bound < T > {
17171710 match self {
17181711 Kind :: Start ( t, _) => Bound :: Included ( t) ,
@@ -1730,7 +1723,19 @@ where
17301723 impl < ' a , T : Copy + Ord > Ord for Kind < ' a , T > {
17311724 fn cmp ( & self , other : & Self ) -> Ordering {
17321725 match ( self . value ( ) , other. value ( ) ) {
1733- ( Bound :: Included ( a) , Bound :: Included ( b) ) | ( Bound :: Excluded ( a) , Bound :: Excluded ( b) ) => a. cmp ( & b) ,
1726+ ( Bound :: Included ( a) , Bound :: Included ( b) ) | ( Bound :: Excluded ( a) , Bound :: Excluded ( b) ) => {
1727+ let value_cmp = a. cmp ( & b) ;
1728+ // In the case of ties, starts come before ends
1729+ if value_cmp == Ordering :: Equal {
1730+ match ( self , other) {
1731+ ( Kind :: Start ( ..) , Kind :: End ( ..) ) => Ordering :: Less ,
1732+ ( Kind :: End ( ..) , Kind :: Start ( ..) ) => Ordering :: Greater ,
1733+ _ => Ordering :: Equal ,
1734+ }
1735+ } else {
1736+ value_cmp
1737+ }
1738+ } ,
17341739 // Range patterns cannot be unbounded (yet)
17351740 ( Bound :: Unbounded , _) | ( _, Bound :: Unbounded ) => unimplemented ! ( ) ,
17361741 ( Bound :: Included ( a) , Bound :: Excluded ( b) ) => match a. cmp ( & b) {
@@ -1754,24 +1759,24 @@ where
17541759
17551760 values. sort ( ) ;
17561761
1757- for ( a, b) in iter:: zip ( & values, values. iter ( ) . skip ( 1 ) ) {
1758- match ( a, b) {
1759- ( & Kind :: Start ( _, ra) , & Kind :: End ( _, rb) ) => {
1760- if ra. node != rb. node {
1761- return Some ( ( ra, rb) ) ;
1762- }
1763- } ,
1764- ( & Kind :: End ( a, _) , & Kind :: Start ( b, _) ) if a != Bound :: Included ( b) => ( ) ,
1765- _ => {
1766- // skip if the range `a` is completely included into the range `b`
1767- if let Ordering :: Equal | Ordering :: Less = a. cmp ( b) {
1768- let kind_a = Kind :: End ( a. range ( ) . node . 1 , a. range ( ) ) ;
1769- let kind_b = Kind :: End ( b. range ( ) . node . 1 , b. range ( ) ) ;
1770- if let Ordering :: Equal | Ordering :: Greater = kind_a. cmp ( & kind_b) {
1771- return None ;
1762+ let mut started = vec ! [ ] ;
1763+
1764+ for value in values {
1765+ match value {
1766+ Kind :: Start ( _, r) => started. push ( r) ,
1767+ Kind :: End ( _, er) => {
1768+ let mut overlap = None ;
1769+
1770+ while let Some ( sr) = started. pop ( ) {
1771+ if sr == er {
1772+ break ;
17721773 }
1774+ overlap = Some ( sr) ;
1775+ }
1776+
1777+ if let Some ( sr) = overlap {
1778+ return Some ( ( er, sr) ) ;
17731779 }
1774- return Some ( ( a. range ( ) , b. range ( ) ) ) ;
17751780 } ,
17761781 }
17771782 }
0 commit comments