forked from Shopify/erb-lint
/
offset_corrector.rb
72 lines (59 loc) · 1.85 KB
/
offset_corrector.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# frozen_string_literal: true
module ERBLint
module Utils
class OffsetCorrector
def initialize(processed_source, corrector, offset, bound_range)
@processed_source = processed_source
@corrector = corrector
@offset = offset
@bound_range = bound_range
end
def remove(range)
@corrector.remove(range_with_offset(range))
end
def insert_before(range, content)
@corrector.insert_before(range_with_offset(range), content)
end
def insert_after(range, content)
@corrector.insert_after(range_with_offset(range), content)
end
def replace(range, content)
@corrector.replace(range_with_offset(range), content)
end
def remove_preceding(range, size)
@corrector.remove_preceding(range_with_offset(range), size)
end
def remove_leading(range, size)
@corrector.remove_leading(range_with_offset(range), size)
end
def remove_trailing(range, size)
@corrector.remove_trailing(range_with_offset(range), size)
end
def range_with_offset(node_or_range)
range = to_range(node_or_range)
@processed_source.to_source_range(
bound(@offset + range.begin_pos)..bound(@offset + (range.end_pos - 1))
)
end
def bound(pos)
[
[pos, @bound_range.min].max,
@bound_range.max,
].min
end
private
def to_range(node_or_range)
case node_or_range
when ::RuboCop::AST::Node, ::Parser::Source::Comment
node_or_range.loc.expression
when ::Parser::Source::Range
node_or_range
else
raise TypeError,
'Expected a Parser::Source::Range, Comment or ' \
"Rubocop::AST::Node, got #{node_or_range.class}"
end
end
end
end
end