| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  | # typed: true | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module RuboCop | 
					
						
							|  |  |  |   module Cop | 
					
						
							|  |  |  |     module Homebrew | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # Checks for code that can be simplified using `Object#present?`. | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # ### Example | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # ```ruby | 
					
						
							|  |  |  |       # # bad | 
					
						
							|  |  |  |       # !foo.nil? && !foo.empty? | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # # bad | 
					
						
							|  |  |  |       # foo != nil && !foo.empty? | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |       # | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |       # # good | 
					
						
							|  |  |  |       # foo.present? | 
					
						
							|  |  |  |       # ``` | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |       class Present < Base | 
					
						
							|  |  |  |         extend AutoCorrector | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |         MSG = "Use `%<prefer>s` instead of `%<current>s`." | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         def_node_matcher :exists_and_not_empty?, <<~PATTERN | 
					
						
							|  |  |  |           (and | 
					
						
							|  |  |  |               { | 
					
						
							|  |  |  |                 (send (send $_ :nil?) :!) | 
					
						
							|  |  |  |                 (send (send $_ :!) :!) | 
					
						
							|  |  |  |                 (send $_ :!= nil) | 
					
						
							|  |  |  |                 $_ | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |               { | 
					
						
							|  |  |  |                 (send (send $_ :empty?) :!) | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |           ) | 
					
						
							|  |  |  |         PATTERN | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def on_and(node) | 
					
						
							|  |  |  |           exists_and_not_empty?(node) do |var1, var2| | 
					
						
							|  |  |  |             return if var1 != var2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |             message = format(MSG, prefer: replacement(var1), current: node.source) | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 16:20:20 +00:00
										 |  |  |             add_offense(node, message:) do |corrector| | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |               autocorrect(corrector, node) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def on_or(node) | 
					
						
							|  |  |  |           exists_and_not_empty?(node) do |var1, var2| | 
					
						
							|  |  |  |             return if var1 != var2 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-26 20:55:51 +02:00
										 |  |  |             add_offense(node, message: MSG) do |corrector| | 
					
						
							| 
									
										
										
										
											2024-01-19 13:54:52 -08:00
										 |  |  |               autocorrect(corrector, node) | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def autocorrect(corrector, node) | 
					
						
							|  |  |  |           variable1, _variable2 = exists_and_not_empty?(node) | 
					
						
							|  |  |  |           range = node.source_range | 
					
						
							|  |  |  |           corrector.replace(range, replacement(variable1)) | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def replacement(node) | 
					
						
							|  |  |  |           node.respond_to?(:source) ? "#{node.source}.present?" : "present?" | 
					
						
							|  |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |