@@ -29,14 +29,6 @@ class ExpandedDateRange < Base
29
29
30
30
minimum_target_rails_version 5.1
31
31
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
-
40
32
PREFERRED_METHODS = {
41
33
beginning_of_day : 'all_day' ,
42
34
beginning_of_week : 'all_week' ,
@@ -54,31 +46,55 @@ class ExpandedDateRange < Base
54
46
} . freeze
55
47
56
48
def on_irange ( node )
57
- return unless expanded_date_range ( node )
58
-
59
49
begin_node = node . begin
60
50
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 )
66
52
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 )
68
56
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
71
60
end
61
+
62
+ register_offense ( node , preferred_method )
72
63
end
73
64
74
65
private
75
66
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
78
78
end
79
79
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
82
98
end
83
99
end
84
100
end
0 commit comments