forked from rubocop/rubocop-rails
-
Notifications
You must be signed in to change notification settings - Fork 0
/
active_support_aliases.rb
61 lines (53 loc) · 1.84 KB
/
active_support_aliases.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
# frozen_string_literal: true
module RuboCop
module Cop
module Rails
# Checks that ActiveSupport aliases to core ruby methods
# are not used.
#
# @example
# # good
# 'some_string'.start_with?('prefix')
# 'some_string'.end_with?('suffix')
# [1, 2, 'a'] << 'b'
# [1, 2, 'a'].unshift('b')
#
# # bad
# 'some_string'.starts_with?('prefix')
# 'some_string'.ends_with?('suffix')
# [1, 2, 'a'].append('b')
# [1, 2, 'a'].prepend('b')
#
class ActiveSupportAliases < Base
extend AutoCorrector
MSG = 'Use `%<prefer>s` instead of `%<current>s`.'
RESTRICT_ON_SEND = %i[starts_with? ends_with? append prepend].freeze
ALIASES = {
starts_with?: {
original: :start_with?, matcher: '(call str :starts_with? _)'
},
ends_with?: {
original: :end_with?, matcher: '(call str :ends_with? _)'
},
append: { original: :<<, matcher: '(call array :append _)' },
prepend: { original: :unshift, matcher: '(call array :prepend _)' }
}.freeze
ALIASES.each do |aliased_method, options|
def_node_matcher aliased_method, options[:matcher]
end
def on_send(node)
ALIASES.each_key do |aliased_method|
next unless public_send(aliased_method, node)
preferred_method = ALIASES[aliased_method][:original]
message = format(MSG, prefer: preferred_method, current: aliased_method)
add_offense(node.loc.selector.join(node.source_range.end), message: message) do |corrector|
next if append(node)
corrector.replace(node.loc.selector, preferred_method)
end
end
end
alias on_csend on_send
end
end
end
end