| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  | # typed: strict | 
					
						
							|  |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module RuboCop | 
					
						
							|  |  |  |   module Cop | 
					
						
							|  |  |  |     module Style | 
					
						
							|  |  |  |       # This cop checks that `unless` is not used with multiple conditions. | 
					
						
							|  |  |  |       # | 
					
						
							|  |  |  |       # @api private | 
					
						
							| 
									
										
										
										
											2021-01-12 18:20:30 +11:00
										 |  |  |       class UnlessMultipleConditions < Base | 
					
						
							| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  |         extend T::Sig | 
					
						
							| 
									
										
										
										
											2021-01-12 18:20:30 +11:00
										 |  |  |         extend AutoCorrector | 
					
						
							| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         MSG = "Avoid using `unless` with multiple conditions." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         sig { params(node: RuboCop::AST::IfNode).void } | 
					
						
							|  |  |  |         def on_if(node) | 
					
						
							| 
									
										
										
										
											2021-01-08 00:17:48 -08:00
										 |  |  |           return if !node.unless? || (!node.condition.and_type? && !node.condition.or_type?) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-12 18:20:30 +11:00
										 |  |  |           add_offense(node.condition.source_range.with(begin_pos: node.loc.keyword.begin_pos)) do |corrector| | 
					
						
							| 
									
										
										
										
											2021-01-08 00:17:48 -08:00
										 |  |  |             corrector.replace(node.loc.keyword, "if") | 
					
						
							|  |  |  |             corrector.replace(node.condition.loc.operator, node.condition.inverse_operator) | 
					
						
							|  |  |  |             [node.condition.lhs, node.condition.rhs].each do |subcondition| | 
					
						
							|  |  |  |               if !subcondition.source.start_with?("(") || !subcondition.source.end_with?(")") | 
					
						
							|  |  |  |                 corrector.insert_before(subcondition, "(") | 
					
						
							|  |  |  |                 corrector.insert_after(subcondition, ")") | 
					
						
							|  |  |  |               end | 
					
						
							|  |  |  |               corrector.insert_before(subcondition, "!") | 
					
						
							|  |  |  |             end | 
					
						
							|  |  |  |           end | 
					
						
							| 
									
										
										
										
											2021-01-07 13:49:05 -08:00
										 |  |  |         end | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end |