@@ -51,51 +51,28 @@ class UniqBeforePluck < Base
51
51
52
52
MSG = 'Use `distinct` before `pluck`.'
53
53
RESTRICT_ON_SEND = %i[ uniq ] . freeze
54
- NEWLINE = "\n "
55
- PATTERN = '[!^block (send (send %<type>s :pluck ...) :uniq ...)]'
56
54
57
- def_node_matcher :conservative_node_match , format ( PATTERN , type : 'const' )
58
-
59
- def_node_matcher :aggressive_node_match , format ( PATTERN , type : '_' )
55
+ def_node_matcher :uniq_before_pluck , '[!^block $(send $(send _ :pluck ...) :uniq ...)]'
60
56
61
57
def on_send ( node )
62
- uniq = if style == :conservative
63
- conservative_node_match ( node )
64
- else
65
- aggressive_node_match ( node )
66
- end
67
-
68
- return unless uniq
58
+ uniq_before_pluck ( node ) do |uniq_node , pluck_node |
59
+ next if style == :conservative && !pluck_node . receiver &.const_type?
69
60
70
- add_offense ( node . loc . selector ) do |corrector |
71
- autocorrect ( corrector , node )
61
+ add_offense ( uniq_node . loc . selector ) do |corrector |
62
+ autocorrect ( corrector , uniq_node , pluck_node )
63
+ end
72
64
end
73
65
end
74
66
75
67
private
76
68
77
- def autocorrect ( corrector , node )
78
- method = node . method_name
69
+ def autocorrect ( corrector , uniq_node , pluck_node )
70
+ corrector . remove ( range_between ( pluck_node . loc . end . end_pos , uniq_node . loc . selector . end_pos ) )
79
71
80
- corrector . remove ( dot_method_with_whitespace ( method , node ) )
81
- if ( dot = node . receiver . loc . dot )
72
+ if ( dot = pluck_node . loc . dot )
82
73
corrector . insert_before ( dot . begin , '.distinct' )
83
74
else
84
- corrector . insert_before ( node . receiver , 'distinct.' )
85
- end
86
- end
87
-
88
- def dot_method_with_whitespace ( method , node )
89
- range_between ( dot_method_begin_pos ( method , node ) , node . loc . selector . end_pos )
90
- end
91
-
92
- def dot_method_begin_pos ( method , node )
93
- lines = node . source . split ( NEWLINE )
94
-
95
- if lines . last . strip == ".#{ method } "
96
- node . source . rindex ( NEWLINE )
97
- else
98
- node . loc . dot . begin_pos
75
+ corrector . insert_before ( pluck_node , 'distinct.' )
99
76
end
100
77
end
101
78
end
0 commit comments