@@ -702,6 +702,7 @@ object CheckUnused:
702
702
else
703
703
// If the rest of the line is blank, include it in the final edit position. (Delete trailing whitespace.)
704
704
// If for deletion, and the prefix of the line is also blank, then include that, too. (Del blank line.)
705
+ // If deleting a blank line and surrounded by blank lines, remove an adjoining blank line.
705
706
def editPosAt (srcPos : SrcPos , forDeletion : Boolean ): SrcPos =
706
707
val start = srcPos.span.start
707
708
val end = srcPos.span.end
@@ -714,7 +715,21 @@ object CheckUnused:
714
715
val bump = if (deleteLine) 1 else 0 // todo improve to include offset of next line, endline + 1
715
716
val p0 = srcPos.span
716
717
val p1 = if (next >= 0 && emptyRight) p0.withEnd(next + bump) else p0
717
- val p2 = if (deleteLine) p1.withStart(prev + 1 ) else p1
718
+ val p2 =
719
+ if deleteLine then
720
+ var newStart = prev + 1
721
+ if srcPos.line > 1 then
722
+ val source = srcPos.sourcePos.source
723
+ import source .{lineToOffset , lineToOffsetOpt , offsetToLine }
724
+ val startLine = offsetToLine(start)
725
+ val endLine = offsetToLine(end)
726
+ val preceding = lineToOffset(startLine - 1 )
727
+ lineToOffsetOpt(endLine + 2 ) match
728
+ case Some (succeeding) if lineToOffset(startLine) - preceding == 1 && succeeding - end == 2 =>
729
+ newStart = preceding
730
+ case _ =>
731
+ p1.withStart(newStart)
732
+ else p1
718
733
srcPos.sourcePos.withSpan(p2)
719
734
def actionsOf (actions : (SrcPos , String )* ): List [CodeAction ] =
720
735
val patches = actions.map((srcPos, replacement) => ActionPatch (srcPos.sourcePos, replacement)).toList
0 commit comments