shard-ameba/src/ameba/ext/location.cr

36 lines
1.2 KiB
Crystal
Raw Permalink Normal View History

2021-11-16 21:30:33 +00:00
# Extensions to Crystal::Location
module Ameba::Ext::Location
# Returns the same location as this location but with the line and/or column number(s) changed
# to the given value(s).
def with(line_number = @line_number, column_number = @column_number) : self
self.class.new(@filename, line_number, column_number)
end
# Returns the same location as this location but with the line and/or column number(s) adjusted
# by the given amount(s).
def adjust(line_number = 0, column_number = 0) : self
self.class.new(@filename, @line_number + line_number, @column_number + column_number)
end
# Seeks to a given *offset* relative to `self`.
def seek(offset : self) : self
if offset.filename.as?(String).presence && @filename != offset.filename
raise ArgumentError.new <<-MSG
Mismatching filenames:
#{@filename}
#{offset.filename}
MSG
end
if offset.line_number == 1
self.class.new(@filename, @line_number, @column_number + offset.column_number - 1)
else
self.class.new(@filename, @line_number + offset.line_number - 1, offset.column_number)
end
end
end
class Crystal::Location
include Ameba::Ext::Location
end