@@ -70,22 +70,30 @@ impl Range {
7070 }
7171 }
7272
73+ /// Return whether this range contains no source bytes.
74+ pub fn is_empty ( self ) -> bool {
75+ self . start_byte == self . end_byte
76+ }
77+
7378 pub ( crate ) fn ignoring_boundary_ranges (
7479 mut self ,
7580 ignored : impl IntoIterator < Item = Self > ,
7681 ) -> Self {
77- let ignored: Vec < _ > = ignored. into_iter ( ) . collect ( ) ;
82+ let ignored: Vec < _ > = ignored
83+ . into_iter ( )
84+ . filter ( |range| !range. is_empty ( ) )
85+ . collect ( ) ;
7886 loop {
7987 let previous = self ;
8088 for range in & ignored {
81- if * range == self {
89+ if * range == self {
8290 return self . empty_at_start ( ) ;
8391 }
84- if range. start_byte == self . start_byte && range . end_byte > range . start_byte {
92+ if range. start_byte == self . start_byte {
8593 self . start_byte = range. end_byte ;
8694 self . start_point = range. end_point ;
8795 }
88- if range. end_byte == self . end_byte && range . end_byte > range . start_byte {
96+ if range. end_byte == self . end_byte {
8997 self . end_byte = range. start_byte ;
9098 self . end_point = range. start_point ;
9199 }
@@ -96,3 +104,27 @@ if *range == self {
96104 }
97105 }
98106}
107+
108+ #[ cfg( test) ]
109+ mod tests {
110+ use super :: { Point , Range } ;
111+
112+ fn range ( start_byte : usize , end_byte : usize ) -> Range {
113+ Range {
114+ start_byte,
115+ end_byte,
116+ start_point : Point :: new ( 0 , start_byte) ,
117+ end_point : Point :: new ( 0 , end_byte) ,
118+ }
119+ }
120+
121+ #[ test]
122+ fn empty_ignored_ranges_do_not_change_boundaries ( ) {
123+ let source = range ( 0 , 5 ) ;
124+
125+ assert_eq ! (
126+ source. ignoring_boundary_ranges( [ range( 0 , 0 ) , range( 5 , 5 ) ] ) ,
127+ source
128+ ) ;
129+ }
130+ }
0 commit comments