From d51ef27d545bd81fdac3c288a00b166269d30981 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?fn=20=E2=8C=83=20=E2=8C=A5?= <70830482+FnControlOption@users.noreply.github.com> Date: Tue, 26 Oct 2021 22:21:51 -0700 Subject: [PATCH] Add `remove_preceding`, `remove_leading`, `remove_trailing` --- src/ameba/source/corrector.cr | 38 +++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/ameba/source/corrector.cr b/src/ameba/source/corrector.cr index ab6823ef..43b3d348 100644 --- a/src/ameba/source/corrector.cr +++ b/src/ameba/source/corrector.cr @@ -46,6 +46,25 @@ class Ameba::Source @rewriter.insert_after(loc_to_pos(location) + 1, content) end + # Removes *size* characters prior to the source range. + def remove_preceding(location, end_location, size) + @rewriter.remove(loc_to_pos(location) - size, loc_to_pos(location)) + end + + # Removes *size* characters from the beginning of the given range. + # If *size* is greater than the size of the range, the removed region can + # overrun the end of the range. + def remove_leading(location, end_location, size) + remove(loc_to_pos(location), loc_to_pos(location) + size) + end + + # Removes *size* characters from the end of the given range. + # If *size* is greater than the size of the range, the removed region can + # overrun the beginning of the range. + def remove_trailing(location, end_location, size) + remove(loc_to_pos(end_location) + 1 - size, loc_to_pos(end_location) + 1) + end + private def loc_to_pos(location : Crystal::Location | {Int32, Int32}) if location.is_a?(Crystal::Location) line, column = location.line_number, location.column_number @@ -80,6 +99,25 @@ class Ameba::Source insert_after(end_location(node), content) end + # Removes *size* characters prior to the given node. + def remove_preceding(node : Crystal::ASTNode, size) + remove_preceding(location(node), end_location(node), size) + end + + # Removes *size* characters from the beginning of the given node. + # If *size* is greater than the size of the node, the removed region can + # overrun the end of the node. + def remove_leading(node : Crystal::ASTNode, size) + remove_leading(location(node), end_location(node), size) + end + + # Removes *size* characters from the end of the given node. + # If *size* is greater than the size of the node, the removed region can + # overrun the beginning of the node. + def remove_trailing(node : Crystal::ASTNode, size) + remove_trailing(location(node), end_location(node), size) + end + private def location(node : Crystal::ASTNode) node.location || raise "Missing location" end