@@ -29,14 +29,6 @@ class ExpandedDateRange < Base
2929
3030 minimum_target_rails_version 5.1
3131
32- def_node_matcher :expanded_date_range , <<~PATTERN
33- (irange
34- (send
35- $_ {:beginning_of_day :beginning_of_week :beginning_of_month :beginning_of_quarter :beginning_of_year})
36- (send
37- $_ {:end_of_day :end_of_week :end_of_month :end_of_quarter :end_of_year}))
38- PATTERN
39-
4032 PREFERRED_METHODS = {
4133 beginning_of_day : 'all_day' ,
4234 beginning_of_week : 'all_week' ,
@@ -54,31 +46,55 @@ class ExpandedDateRange < Base
5446 } . freeze
5547
5648 def on_irange ( node )
57- return unless expanded_date_range ( node )
58-
5949 begin_node = node . begin
6050 end_node = node . end
61- return unless same_receiver? ( begin_node , end_node )
62-
63- beginning_method = begin_node . method_name
64- end_method = end_node . method_name
65- return unless use_mapped_methods? ( beginning_method , end_method )
51+ return if allow? ( begin_node , end_node )
6652
67- preferred_method = "#{ begin_node . receiver . source } .#{ PREFERRED_METHODS [ beginning_method ] } "
53+ preferred_method = preferred_method ( begin_node )
54+ if begin_node . method? ( :beginning_of_week ) && begin_node . arguments . one?
55+ return unless same_argument? ( begin_node , end_node )
6856
69- add_offense ( node , message : format ( MSG , preferred_method : preferred_method ) ) do |corrector |
70- corrector . replace ( node , preferred_method )
57+ preferred_method << "(#{ begin_node . first_argument . source } )"
58+ elsif any_arguments? ( begin_node , end_node )
59+ return
7160 end
61+
62+ register_offense ( node , preferred_method )
7263 end
7364
7465 private
7566
76- def same_receiver? ( begin_node , end_node )
77- begin_node . receiver . source == end_node . receiver . source
67+ def allow? ( begin_node , end_node )
68+ return true unless ( begin_source = receiver_source ( begin_node ) )
69+ return true unless ( end_source = receiver_source ( end_node ) )
70+
71+ begin_source != end_source || MAPPED_DATE_RANGE_METHODS [ begin_node . method_name ] != end_node . method_name
72+ end
73+
74+ def receiver_source ( node )
75+ return if !node &.send_type? || node . receiver . nil?
76+
77+ node . receiver . source
7878 end
7979
80- def use_mapped_methods? ( beginning_method , end_method )
81- MAPPED_DATE_RANGE_METHODS [ beginning_method ] == end_method
80+ def same_argument? ( begin_node , end_node )
81+ begin_node . first_argument . source == end_node . first_argument . source
82+ end
83+
84+ def preferred_method ( begin_node )
85+ +"#{ begin_node . receiver . source } .#{ PREFERRED_METHODS [ begin_node . method_name ] } "
86+ end
87+
88+ def any_arguments? ( begin_node , end_node )
89+ begin_node . arguments . any? || end_node . arguments . any?
90+ end
91+
92+ def register_offense ( node , preferred_method )
93+ message = format ( MSG , preferred_method : preferred_method )
94+
95+ add_offense ( node , message : message ) do |corrector |
96+ corrector . replace ( node , preferred_method )
97+ end
8298 end
8399 end
84100 end
0 commit comments