@@ -24,45 +24,69 @@ class EnvLocal < Base
2424
2525 minimum_target_rails_version 7.1
2626
27- # @!method rails_env_local_or?(node)
28- def_node_matcher :rails_env_local_or? , <<~PATTERN
29- (or
30- (send (send (const {cbase nil? } :Rails) :env) $%LOCAL_ENVIRONMENTS)
31- (send (send (const {cbase nil? } :Rails) :env) $%LOCAL_ENVIRONMENTS)
32- )
27+ # @!method rails_env_local?(node)
28+ def_node_matcher :rails_env_local? , <<~PATTERN
29+ (send (send (const {cbase nil? } :Rails) :env) $%LOCAL_ENVIRONMENTS)
3330 PATTERN
3431
35- # @!method rails_env_local_and?(node)
36- def_node_matcher :rails_env_local_and? , <<~PATTERN
37- (and
38- (send
39- (send (send (const {cbase nil? } :Rails) :env) $%LOCAL_ENVIRONMENTS)
40- :!)
41- (send
42- (send (send (const {cbase nil? } :Rails) :env) $%LOCAL_ENVIRONMENTS)
43- :!)
44- )
32+ # @!method not_rails_env_local?(node)
33+ def_node_matcher :not_rails_env_local? , <<~PATTERN
34+ (send #rails_env_local? :!)
4535 PATTERN
4636
4737 def on_or ( node )
48- rails_env_local_or? ( node ) do |* environments |
49- next unless environments . to_set == LOCAL_ENVIRONMENTS
38+ lhs , rhs = * node . children
39+ return unless rails_env_local? ( rhs )
5040
51- add_offense ( node ) do |corrector |
52- corrector . replace ( node , 'Rails.env.local?' )
53- end
41+ nodes = [ rhs ]
42+
43+ if rails_env_local? ( lhs )
44+ nodes << lhs
45+ elsif lhs . or_type? && rails_env_local? ( lhs . rhs )
46+ nodes << lhs . rhs
47+ end
48+
49+ return unless environments ( nodes ) . to_set == LOCAL_ENVIRONMENTS
50+
51+ range = offense_range ( nodes )
52+ add_offense ( range ) do |corrector |
53+ corrector . replace ( range , 'Rails.env.local?' )
5454 end
5555 end
5656
5757 def on_and ( node )
58- rails_env_local_and? ( node ) do |*environments |
59- next unless environments . to_set == LOCAL_ENVIRONMENTS
58+ lhs , rhs = *node . children
59+ return unless not_rails_env_local? ( rhs )
60+
61+ nodes = [ rhs ]
62+
63+ if not_rails_env_local? ( lhs )
64+ nodes << lhs
65+ elsif lhs . operator_keyword? && not_rails_env_local? ( lhs . rhs )
66+ nodes << lhs . rhs
67+ end
6068
61- add_offense ( node , message : MSG_NEGATED ) do |corrector |
62- corrector . replace ( node , '!Rails.env.local?' )
63- end
69+ return unless environments ( nodes ) . to_set == LOCAL_ENVIRONMENTS
70+
71+ range = offense_range ( nodes )
72+ add_offense ( range , message : MSG_NEGATED ) do |corrector |
73+ corrector . replace ( range , '!Rails.env.local?' )
6474 end
6575 end
76+
77+ private
78+
79+ def environments ( nodes )
80+ if nodes [ 0 ] . method? ( :! )
81+ nodes . map { |node | node . receiver . method_name }
82+ else
83+ nodes . map ( &:method_name )
84+ end
85+ end
86+
87+ def offense_range ( nodes )
88+ nodes [ 1 ] . source_range . begin . join ( nodes [ 0 ] . source_range . end )
89+ end
6690 end
6791 end
6892 end
0 commit comments