36 lines
1.2 KiB
Crystal
36 lines
1.2 KiB
Crystal
|
# 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
|