| 
									
										
										
										
											2025-01-05 23:45:23 +00:00
										 |  |  | # typed: strict | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module RuboCop | 
					
						
							|  |  |  |   module Cop | 
					
						
							|  |  |  |     module Homebrew | 
					
						
							| 
									
										
										
										
											2024-07-14 22:34:34 -04:00
										 |  |  |       # This cop checks for the use of `FileUtils.rm_f`, `FileUtils.rm_rf`, or `{FileUtils,instance}.rmtree` | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  |       # and recommends the safer versions. | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  |       class NoFileutilsRmrf < Base | 
					
						
							|  |  |  |         extend AutoCorrector | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-14 12:09:59 -04:00
										 |  |  |         MSG = "Use `rm` or `rm_r` instead of `rm_rf`, `rm_f`, or `rmtree`." | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |         def_node_matcher :any_receiver_rm_r_f?, <<~PATTERN | 
					
						
							|  |  |  |           (send | 
					
						
							|  |  |  |             {(const {nil? cbase} :FileUtils) (self)} | 
					
						
							|  |  |  |             {:rm_rf :rm_f} | 
					
						
							|  |  |  |             ...) | 
					
						
							| 
									
										
										
										
											2024-07-14 14:13:37 -04:00
										 |  |  |         PATTERN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |         def_node_matcher :no_receiver_rm_r_f?, <<~PATTERN | 
					
						
							|  |  |  |           (send nil? {:rm_rf :rm_f} ...) | 
					
						
							| 
									
										
										
										
											2024-07-14 14:13:37 -04:00
										 |  |  |         PATTERN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |         def_node_matcher :no_receiver_rmtree?, <<~PATTERN | 
					
						
							|  |  |  |           (send nil? :rmtree ...) | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  |         PATTERN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |         def_node_matcher :any_receiver_rmtree?, <<~PATTERN | 
					
						
							|  |  |  |           (send !nil? :rmtree ...) | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  |         PATTERN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-05 23:45:23 +00:00
										 |  |  |         sig { params(node: RuboCop::AST::SendNode).void } | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  |         def on_send(node) | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  |           return if neither_rm_rf_nor_rmtree?(node) | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |           add_offense(node) do |corrector| | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |             class_name = "FileUtils." if any_receiver_rm_r_f?(node) || any_receiver_rmtree?(node) | 
					
						
							| 
									
										
										
										
											2024-07-13 16:12:30 -04:00
										 |  |  |             new_method = if node.method?(:rm_rf) || node.method?(:rmtree) | 
					
						
							|  |  |  |               "rm_r" | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |               "rm" | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |             args = if any_receiver_rmtree?(node) | 
					
						
							|  |  |  |               node.receiver&.source || node.arguments.first&.source | 
					
						
							| 
									
										
										
										
											2024-07-14 22:34:34 -04:00
										 |  |  |             else | 
					
						
							|  |  |  |               node.arguments.first.source | 
					
						
							|  |  |  |             end | 
					
						
							| 
									
										
										
										
											2024-07-15 15:09:55 -04:00
										 |  |  |             args = "(#{args})" unless args.start_with?("(") | 
					
						
							|  |  |  |             corrector.replace(node.loc.expression, "#{class_name}#{new_method}#{args}") | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  |           end | 
					
						
							|  |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-05 23:45:23 +00:00
										 |  |  |         sig { params(node: RuboCop::AST::SendNode).returns(T::Boolean) } | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  |         def neither_rm_rf_nor_rmtree?(node) | 
					
						
							| 
									
										
										
										
											2024-07-15 14:05:36 -04:00
										 |  |  |           !any_receiver_rm_r_f?(node) && !no_receiver_rm_r_f?(node) && | 
					
						
							|  |  |  |             !any_receiver_rmtree?(node) && !no_receiver_rmtree?(node) | 
					
						
							| 
									
										
										
										
											2024-07-13 22:13:03 -04:00
										 |  |  |         end | 
					
						
							| 
									
										
										
										
											2024-07-13 15:35:06 -04:00
										 |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |