@@ -40,19 +40,18 @@ var RangeList = function() {
4040( function ( ) {
4141 this . comparePoints = comparePoints ;
4242
43- this . pointIndex = function ( pos , startIndex ) {
43+ this . pointIndex = function ( pos , excludeEdges , startIndex ) {
4444 var list = this . ranges ;
4545
4646 for ( var i = startIndex || 0 ; i < list . length ; i ++ ) {
4747 var range = list [ i ] ;
48- var cmp = comparePoints ( pos , range . end ) ;
49-
50- if ( cmp > 0 )
48+ var cmpEnd = comparePoints ( pos , range . end ) ;
49+ if ( cmpEnd > 0 )
5150 continue ;
52- if ( cmp == 0 )
53- return i ;
54- cmp = comparePoints ( pos , range . start ) ;
55- if ( cmp >= 0 )
51+ var cmpStart = comparePoints ( pos , range . start ) ;
52+ if ( cmpEnd === 0 )
53+ return excludeEdges && cmpStart !== 0 ? - i - 2 : i ;
54+ if ( cmpStart > 0 || ( cmpStart === 0 && ! excludeEdges ) )
5655 return i ;
5756
5857 return - i - 1 ;
@@ -61,17 +60,17 @@ var RangeList = function() {
6160 } ;
6261
6362 this . add = function ( range ) {
64- var startIndex = this . pointIndex ( range . start ) ;
63+ var excludeEdges = ! range . isEmpty ( ) ;
64+ var startIndex = this . pointIndex ( range . start , excludeEdges ) ;
6565 if ( startIndex < 0 )
6666 startIndex = - startIndex - 1 ;
6767
68- var endIndex = this . pointIndex ( range . end , startIndex ) ;
68+ var endIndex = this . pointIndex ( range . end , excludeEdges , startIndex ) ;
6969
7070 if ( endIndex < 0 )
7171 endIndex = - endIndex - 1 ;
7272 else
7373 endIndex ++ ;
74-
7574 return this . ranges . splice ( startIndex , endIndex - startIndex , range ) ;
7675 } ;
7776
@@ -102,7 +101,7 @@ var RangeList = function() {
102101 if ( cmp < 0 )
103102 continue ;
104103
105- if ( cmp == 0 && ! ( range . isEmpty ( ) || next . isEmpty ( ) ) )
104+ if ( cmp == 0 && ! range . isEmpty ( ) && ! next . isEmpty ( ) )
106105 continue ;
107106
108107 if ( comparePoints ( range . end , next . end ) < 0 ) {
@@ -198,10 +197,16 @@ var RangeList = function() {
198197 break ;
199198
200199 if ( r . start . row == startRow && r . start . column >= start . column ) {
200+
201201 r . start . column += colDiff ;
202202 r . start . row += lineDif ;
203203 }
204- if ( r . end . row == startRow && r . end . column >= start . column ) {
204+ if ( r . end . row == startRow && r . end . column >= start . column ) {
205+ // special handling for the case when two ranges share an edge
206+ if ( r . end . column == start . column && colDiff > 0 && i < n - 1 ) {
207+ if ( r . end . column > r . start . column && r . end . column == ranges [ i + 1 ] . start . column )
208+ r . end . column -= colDiff ;
209+ }
205210 r . end . column += colDiff ;
206211 r . end . row += lineDif ;
207212 }
0 commit comments