/
class_vars.rb
64 lines (60 loc) · 1.75 KB
/
class_vars.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
# frozen_string_literal: true
module RuboCop
module Cop
module Style
# Checks for uses of class variables. Offenses
# are signaled only on assignment to class variables to
# reduce the number of offenses that would be reported.
#
# You have to be careful when setting a value for a class
# variable; if a class has been inherited, changing the
# value of a class variable also affects the inheriting
# classes. This means that it's almost always better to
# use a class instance variable instead.
#
# @example
# # bad
# class A
# @@test = 10
# end
#
# class A
# def self.test(name, value)
# class_variable_set("@@#{name}", value)
# end
# end
#
# class A; end
# A.class_variable_set(:@@test, 10)
#
# # good
# class A
# @test = 10
# end
#
# class A
# def test
# @@test # you can access class variable without offense
# end
# end
#
# class A
# def self.test(name)
# class_variable_get("@@#{name}") # you can access without offense
# end
# end
#
class ClassVars < Base
MSG = 'Replace class var %<class_var>s with a class instance var.'
RESTRICT_ON_SEND = %i[class_variable_set].freeze
def on_cvasgn(node)
add_offense(node.loc.name, message: format(MSG, class_var: node.children.first))
end
def on_send(node)
return unless (first_argument = node.first_argument)
add_offense(first_argument, message: format(MSG, class_var: first_argument.source))
end
end
end
end
end