rubocop 0.42.0 → 0.43.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of rubocop might be problematic. Click here for more details.
- checksums.yaml +4 -4
 - data/README.md +1 -1
 - data/assets/output.html.erb +21 -10
 - data/config/default.yml +32 -2
 - data/config/disabled.yml +8 -1
 - data/config/enabled.yml +40 -12
 - data/lib/rubocop.rb +14 -2
 - data/lib/rubocop/ast_node.rb +2 -0
 - data/lib/rubocop/cached_data.rb +13 -11
 - data/lib/rubocop/cli.rb +5 -5
 - data/lib/rubocop/config.rb +68 -24
 - data/lib/rubocop/config_loader.rb +13 -11
 - data/lib/rubocop/config_loader_resolver.rb +4 -2
 - data/lib/rubocop/cop/cop.rb +16 -5
 - data/lib/rubocop/cop/lint/assignment_in_condition.rb +21 -20
 - data/lib/rubocop/cop/lint/block_alignment.rb +3 -4
 - data/lib/rubocop/cop/lint/def_end_alignment.rb +2 -3
 - data/lib/rubocop/cop/lint/duplicate_methods.rb +16 -6
 - data/lib/rubocop/cop/lint/else_layout.rb +1 -1
 - data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
 - data/lib/rubocop/cop/lint/end_alignment.rb +4 -6
 - data/lib/rubocop/cop/lint/eval.rb +1 -1
 - data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +1 -1
 - data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
 - data/lib/rubocop/cop/lint/inherit_exception.rb +22 -7
 - data/lib/rubocop/cop/lint/literal_in_condition.rb +5 -5
 - data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -5
 - data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
 - data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +9 -8
 - data/lib/rubocop/cop/lint/percent_string_array.rb +17 -6
 - data/lib/rubocop/cop/lint/percent_symbol_array.rb +4 -4
 - data/lib/rubocop/cop/lint/rand_one.rb +3 -3
 - data/lib/rubocop/cop/lint/require_parentheses.rb +1 -3
 - data/lib/rubocop/cop/lint/shadowed_exception.rb +39 -44
 - data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +2 -2
 - data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -2
 - data/lib/rubocop/cop/lint/unified_integer.rb +38 -0
 - data/lib/rubocop/cop/lint/unneeded_disable.rb +51 -38
 - data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +114 -0
 - data/lib/rubocop/cop/lint/useless_assignment.rb +25 -12
 - data/lib/rubocop/cop/lint/useless_setter_call.rb +27 -28
 - data/lib/rubocop/cop/lint/void.rb +2 -4
 - data/lib/rubocop/cop/mixin/access_modifier_node.rb +5 -5
 - data/lib/rubocop/cop/mixin/array_hash_indentation.rb +19 -17
 - data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +3 -5
 - data/lib/rubocop/cop/mixin/configurable_naming.rb +4 -5
 - data/lib/rubocop/cop/mixin/configurable_numbering.rb +52 -0
 - data/lib/rubocop/cop/mixin/def_node.rb +28 -0
 - data/lib/rubocop/cop/mixin/documentation_comment.rb +41 -0
 - data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +18 -13
 - data/lib/rubocop/cop/mixin/if_node.rb +6 -0
 - data/lib/rubocop/cop/mixin/match_range.rb +2 -5
 - data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +2 -2
 - data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +40 -28
 - data/lib/rubocop/cop/mixin/negative_conditional.rb +6 -6
 - data/lib/rubocop/cop/mixin/percent_literal.rb +1 -5
 - data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +14 -4
 - data/lib/rubocop/cop/mixin/safe_mode.rb +23 -0
 - data/lib/rubocop/cop/mixin/space_before_punctuation.rb +2 -4
 - data/lib/rubocop/cop/mixin/space_inside.rb +1 -3
 - data/lib/rubocop/cop/mixin/statement_modifier.rb +30 -20
 - data/lib/rubocop/cop/mixin/trailing_comma.rb +19 -17
 - data/lib/rubocop/cop/performance/case_when_splat.rb +16 -41
 - data/lib/rubocop/cop/performance/casecmp.rb +28 -16
 - data/lib/rubocop/cop/performance/count.rb +58 -34
 - data/lib/rubocop/cop/performance/detect.rb +3 -7
 - data/lib/rubocop/cop/performance/double_start_end_with.rb +17 -13
 - data/lib/rubocop/cop/performance/fixed_size.rb +19 -14
 - data/lib/rubocop/cop/performance/flat_map.rb +16 -9
 - data/lib/rubocop/cop/performance/hash_each.rb +2 -3
 - data/lib/rubocop/cop/performance/lstrip_rstrip.rb +4 -6
 - data/lib/rubocop/cop/performance/redundant_match.rb +4 -1
 - data/lib/rubocop/cop/performance/redundant_merge.rb +63 -32
 - data/lib/rubocop/cop/performance/redundant_sort_by.rb +8 -7
 - data/lib/rubocop/cop/performance/reverse_each.rb +1 -4
 - data/lib/rubocop/cop/performance/size.rb +21 -8
 - data/lib/rubocop/cop/performance/sort_with_block.rb +54 -0
 - data/lib/rubocop/cop/performance/string_replacement.rb +3 -7
 - data/lib/rubocop/cop/rails/delegate.rb +2 -3
 - data/lib/rubocop/cop/rails/find_by.rb +4 -8
 - data/lib/rubocop/cop/rails/not_null_column.rb +45 -0
 - data/lib/rubocop/cop/rails/request_referer.rb +3 -3
 - data/lib/rubocop/cop/rails/safe_navigation.rb +89 -0
 - data/lib/rubocop/cop/rails/save_bang.rb +78 -9
 - data/lib/rubocop/cop/rails/scope_args.rb +3 -1
 - data/lib/rubocop/cop/rails/uniq_before_pluck.rb +2 -3
 - data/lib/rubocop/cop/rails/validation.rb +1 -1
 - data/lib/rubocop/cop/security/json_load.rb +36 -0
 - data/lib/rubocop/cop/style/alias.rb +1 -1
 - data/lib/rubocop/cop/style/align_hash.rb +25 -14
 - data/lib/rubocop/cop/style/and_or.rb +13 -3
 - data/lib/rubocop/cop/style/array_join.rb +3 -3
 - data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
 - data/lib/rubocop/cop/style/ascii_identifiers.rb +1 -2
 - data/lib/rubocop/cop/style/attr.rb +1 -3
 - data/lib/rubocop/cop/style/block_comments.rb +2 -6
 - data/lib/rubocop/cop/style/block_delimiters.rb +35 -21
 - data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +4 -4
 - data/lib/rubocop/cop/style/case_indentation.rb +1 -3
 - data/lib/rubocop/cop/style/class_methods.rb +3 -4
 - data/lib/rubocop/cop/style/collection_methods.rb +1 -1
 - data/lib/rubocop/cop/style/command_literal.rb +15 -8
 - data/lib/rubocop/cop/style/comment_annotation.rb +1 -2
 - data/lib/rubocop/cop/style/conditional_assignment.rb +68 -36
 - data/lib/rubocop/cop/style/copyright.rb +1 -5
 - data/lib/rubocop/cop/style/def_with_parentheses.rb +3 -5
 - data/lib/rubocop/cop/style/documentation.rb +28 -56
 - data/lib/rubocop/cop/style/documentation_method.rb +80 -0
 - data/lib/rubocop/cop/style/each_for_simple_loop.rb +6 -5
 - data/lib/rubocop/cop/style/each_with_object.rb +2 -2
 - data/lib/rubocop/cop/style/else_alignment.rb +10 -9
 - data/lib/rubocop/cop/style/empty_case_condition.rb +2 -4
 - data/lib/rubocop/cop/style/empty_else.rb +1 -4
 - data/lib/rubocop/cop/style/empty_line_between_defs.rb +1 -3
 - data/lib/rubocop/cop/style/empty_lines_around_access_modifier.rb +2 -5
 - data/lib/rubocop/cop/style/encoding.rb +28 -14
 - data/lib/rubocop/cop/style/even_odd.rb +28 -17
 - data/lib/rubocop/cop/style/extra_spacing.rb +36 -25
 - data/lib/rubocop/cop/style/file_name.rb +19 -10
 - data/lib/rubocop/cop/style/first_parameter_indentation.rb +2 -3
 - data/lib/rubocop/cop/style/for.rb +12 -8
 - data/lib/rubocop/cop/style/format_string.rb +1 -1
 - data/lib/rubocop/cop/style/guard_clause.rb +22 -56
 - data/lib/rubocop/cop/style/hash_syntax.rb +72 -7
 - data/lib/rubocop/cop/style/if_unless_modifier.rb +23 -19
 - data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +3 -3
 - data/lib/rubocop/cop/style/indentation_width.rb +30 -16
 - data/lib/rubocop/cop/style/infinite_loop.rb +16 -13
 - data/lib/rubocop/cop/style/initial_indentation.rb +23 -18
 - data/lib/rubocop/cop/style/inline_comment.rb +16 -3
 - data/lib/rubocop/cop/style/lambda.rb +22 -10
 - data/lib/rubocop/cop/style/leading_comment_space.rb +12 -1
 - data/lib/rubocop/cop/style/line_end_concatenation.rb +24 -6
 - data/lib/rubocop/cop/style/method_call_parentheses.rb +18 -9
 - data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
 - data/lib/rubocop/cop/style/method_def_parentheses.rb +3 -4
 - data/lib/rubocop/cop/style/method_missing.rb +10 -2
 - data/lib/rubocop/cop/style/module_function.rb +14 -6
 - data/lib/rubocop/cop/style/multiline_assignment_layout.rb +2 -5
 - data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -5
 - data/lib/rubocop/cop/style/multiline_block_layout.rb +22 -15
 - data/lib/rubocop/cop/style/multiline_method_call_brace_layout.rb +9 -0
 - data/lib/rubocop/cop/style/multiline_method_call_indentation.rb +41 -20
 - data/lib/rubocop/cop/style/multiline_operation_indentation.rb +6 -6
 - data/lib/rubocop/cop/style/multiline_ternary_operator.rb +3 -5
 - data/lib/rubocop/cop/style/mutable_constant.rb +21 -13
 - data/lib/rubocop/cop/style/negated_if.rb +1 -1
 - data/lib/rubocop/cop/style/negated_while.rb +3 -3
 - data/lib/rubocop/cop/style/nested_modifier.rb +2 -4
 - data/lib/rubocop/cop/style/next.rb +4 -4
 - data/lib/rubocop/cop/style/non_nil_check.rb +18 -10
 - data/lib/rubocop/cop/style/numeric_literal_prefix.rb +8 -0
 - data/lib/rubocop/cop/style/numeric_predicate.rb +9 -9
 - data/lib/rubocop/cop/style/one_line_conditional.rb +11 -1
 - data/lib/rubocop/cop/style/op_method.rb +1 -1
 - data/lib/rubocop/cop/style/option_hash.rb +8 -8
 - data/lib/rubocop/cop/style/optional_arguments.rb +21 -8
 - data/lib/rubocop/cop/style/parallel_assignment.rb +51 -35
 - data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
 - data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
 - data/lib/rubocop/cop/style/raise_args.rb +2 -2
 - data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
 - data/lib/rubocop/cop/style/redundant_parentheses.rb +26 -15
 - data/lib/rubocop/cop/style/redundant_return.rb +5 -5
 - data/lib/rubocop/cop/style/redundant_self.rb +20 -11
 - data/lib/rubocop/cop/style/regexp_literal.rb +16 -10
 - data/lib/rubocop/cop/style/rescue_ensure_alignment.rb +8 -6
 - data/lib/rubocop/cop/style/safe_navigation.rb +125 -0
 - data/lib/rubocop/cop/style/self_assignment.rb +2 -2
 - data/lib/rubocop/cop/style/semicolon.rb +9 -10
 - data/lib/rubocop/cop/style/signal_exception.rb +2 -4
 - data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
 - data/lib/rubocop/cop/style/single_line_methods.rb +18 -11
 - data/lib/rubocop/cop/style/space_after_method_name.rb +2 -3
 - data/lib/rubocop/cop/style/space_after_not.rb +4 -6
 - data/lib/rubocop/cop/style/space_around_block_parameters.rb +1 -2
 - data/lib/rubocop/cop/style/space_around_equals_in_parameter_default.rb +1 -3
 - data/lib/rubocop/cop/style/space_around_operators.rb +21 -16
 - data/lib/rubocop/cop/style/space_before_block_braces.rb +2 -12
 - data/lib/rubocop/cop/style/space_before_first_arg.rb +1 -3
 - data/lib/rubocop/cop/style/space_inside_array_percent_literal.rb +1 -1
 - data/lib/rubocop/cop/style/space_inside_block_braces.rb +33 -40
 - data/lib/rubocop/cop/style/space_inside_hash_literal_braces.rb +38 -23
 - data/lib/rubocop/cop/style/space_inside_percent_literal_delimiters.rb +1 -1
 - data/lib/rubocop/cop/style/space_inside_string_interpolation.rb +26 -12
 - data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +2 -4
 - data/lib/rubocop/cop/style/symbol_array.rb +10 -10
 - data/lib/rubocop/cop/style/symbol_proc.rb +28 -13
 - data/lib/rubocop/cop/style/ternary_parentheses.rb +35 -5
 - data/lib/rubocop/cop/style/trailing_blank_lines.rb +2 -4
 - data/lib/rubocop/cop/style/trailing_underscore_variable.rb +29 -17
 - data/lib/rubocop/cop/style/trivial_accessors.rb +6 -6
 - data/lib/rubocop/cop/style/unless_else.rb +2 -6
 - data/lib/rubocop/cop/style/unneeded_capital_w.rb +8 -4
 - data/lib/rubocop/cop/style/unneeded_interpolation.rb +4 -5
 - data/lib/rubocop/cop/style/unneeded_percent_q.rb +13 -7
 - data/lib/rubocop/cop/style/variable_number.rb +79 -0
 - data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
 - data/lib/rubocop/cop/style/word_array.rb +25 -15
 - data/lib/rubocop/cop/style/zero_length_predicate.rb +2 -0
 - data/lib/rubocop/cop/util.rb +23 -4
 - data/lib/rubocop/cop/variable_force.rb +59 -25
 - data/lib/rubocop/cop/variable_force/locatable.rb +8 -6
 - data/lib/rubocop/cop/variable_force/variable.rb +2 -2
 - data/lib/rubocop/cop/variable_force/variable_table.rb +3 -3
 - data/lib/rubocop/formatter/disabled_config_formatter.rb +16 -11
 - data/lib/rubocop/formatter/formatter_set.rb +12 -10
 - data/lib/rubocop/formatter/worst_offenders_formatter.rb +4 -4
 - data/lib/rubocop/node_pattern.rb +79 -35
 - data/lib/rubocop/options.rb +4 -4
 - data/lib/rubocop/processed_source.rb +9 -5
 - data/lib/rubocop/remote_config.rb +14 -10
 - data/lib/rubocop/result_cache.rb +14 -6
 - data/lib/rubocop/runner.rb +55 -34
 - data/lib/rubocop/string_util.rb +9 -5
 - data/lib/rubocop/target_finder.rb +1 -1
 - data/lib/rubocop/token.rb +1 -1
 - data/lib/rubocop/version.rb +1 -1
 - metadata +15 -4
 - data/lib/rubocop/cop/lint/useless_array_splat.rb +0 -56
 - data/lib/rubocop/cop/performance/push_splat.rb +0 -47
 
| 
         @@ -26,7 +26,7 @@ module RuboCop 
     | 
|
| 
       26 
26 
     | 
    
         | 
| 
       27 
27 
     | 
    
         
             
                    def on_alias(node)
         
     | 
| 
       28 
28 
     | 
    
         
             
                      # alias_method can't be used with global variables
         
     | 
| 
       29 
     | 
    
         
            -
                      return if node. 
     | 
| 
      
 29 
     | 
    
         
            +
                      return if node.each_child_node(:gvar).any?
         
     | 
| 
       30 
30 
     | 
    
         
             
                      # alias_method can't be used in instance_eval blocks
         
     | 
| 
       31 
31 
     | 
    
         
             
                      scope_type = scope_type(node)
         
     | 
| 
       32 
32 
     | 
    
         
             
                      return if scope_type == :instance_eval
         
     | 
| 
         @@ -189,7 +189,7 @@ module RuboCop 
     | 
|
| 
       189 
189 
     | 
    
         
             
                    end
         
     | 
| 
       190 
190 
     | 
    
         | 
| 
       191 
191 
     | 
    
         
             
                    def hash?(node)
         
     | 
| 
       192 
     | 
    
         
            -
                      node.respond_to?(:type) && node. 
     | 
| 
      
 192 
     | 
    
         
            +
                      node.respond_to?(:type) && node.hash_type?
         
     | 
| 
       193 
193 
     | 
    
         
             
                    end
         
     | 
| 
       194 
194 
     | 
    
         | 
| 
       195 
195 
     | 
    
         
             
                    def explicit_hash?(node)
         
     | 
| 
         @@ -205,25 +205,38 @@ module RuboCop 
     | 
|
| 
       205 
205 
     | 
    
         
             
                    end
         
     | 
| 
       206 
206 
     | 
    
         | 
| 
       207 
207 
     | 
    
         
             
                    def autocorrect(node)
         
     | 
| 
      
 208 
     | 
    
         
            +
                      # We can't use the instance variable inside the lambda. That would
         
     | 
| 
      
 209 
     | 
    
         
            +
                      # just give each lambda the same reference and they would all get the
         
     | 
| 
      
 210 
     | 
    
         
            +
                      # last value of each. A local variable fixes the problem.
         
     | 
| 
      
 211 
     | 
    
         
            +
                      key_delta = @column_deltas[:key] || 0
         
     | 
| 
      
 212 
     | 
    
         
            +
                      key, value = *node
         
     | 
| 
      
 213 
     | 
    
         
            +
             
     | 
| 
      
 214 
     | 
    
         
            +
                      if value.nil?
         
     | 
| 
      
 215 
     | 
    
         
            +
                        correct_no_value(key_delta, node.source_range)
         
     | 
| 
      
 216 
     | 
    
         
            +
                      else
         
     | 
| 
      
 217 
     | 
    
         
            +
                        correct_key_value(key_delta, key.source_range, value.source_range,
         
     | 
| 
      
 218 
     | 
    
         
            +
                                          node.loc.operator)
         
     | 
| 
      
 219 
     | 
    
         
            +
                      end
         
     | 
| 
      
 220 
     | 
    
         
            +
                    end
         
     | 
| 
      
 221 
     | 
    
         
            +
             
     | 
| 
      
 222 
     | 
    
         
            +
                    def correct_no_value(key_delta, key)
         
     | 
| 
      
 223 
     | 
    
         
            +
                      ->(corrector) { adjust(corrector, key_delta, key) }
         
     | 
| 
      
 224 
     | 
    
         
            +
                    end
         
     | 
| 
      
 225 
     | 
    
         
            +
             
     | 
| 
      
 226 
     | 
    
         
            +
                    def correct_key_value(key_delta, key, value, separator)
         
     | 
| 
       208 
227 
     | 
    
         
             
                      # We can't use the instance variable inside the lambda. That would
         
     | 
| 
       209 
228 
     | 
    
         
             
                      # just give each lambda the same reference and they would all get the
         
     | 
| 
       210 
229 
     | 
    
         
             
                      # last value of each. Some local variables fix the problem.
         
     | 
| 
       211 
     | 
    
         
            -
                      key_delta       = @column_deltas[:key] || 0
         
     | 
| 
       212 
230 
     | 
    
         
             
                      separator_delta = @column_deltas[:separator] || 0
         
     | 
| 
       213 
231 
     | 
    
         
             
                      value_delta     = @column_deltas[:value] || 0
         
     | 
| 
       214 
232 
     | 
    
         | 
| 
       215 
     | 
    
         
            -
                       
     | 
| 
       216 
     | 
    
         
            -
                      key_column = key.source_range.column
         
     | 
| 
      
 233 
     | 
    
         
            +
                      key_column = key.column
         
     | 
| 
       217 
234 
     | 
    
         
             
                      key_delta = -key_column if key_delta < -key_column
         
     | 
| 
       218 
235 
     | 
    
         | 
| 
       219 
236 
     | 
    
         
             
                      lambda do |corrector|
         
     | 
| 
       220 
     | 
    
         
            -
                         
     | 
| 
       221 
     | 
    
         
            -
             
     | 
| 
       222 
     | 
    
         
            -
                         
     | 
| 
       223 
     | 
    
         
            -
                          adjust(corrector, key_delta, key.source_range)
         
     | 
| 
       224 
     | 
    
         
            -
                          adjust(corrector, separator_delta, node.loc.operator)
         
     | 
| 
       225 
     | 
    
         
            -
                          adjust(corrector, value_delta, value.source_range)
         
     | 
| 
       226 
     | 
    
         
            -
                        end
         
     | 
| 
      
 237 
     | 
    
         
            +
                        adjust(corrector, key_delta, key)
         
     | 
| 
      
 238 
     | 
    
         
            +
                        adjust(corrector, separator_delta, separator)
         
     | 
| 
      
 239 
     | 
    
         
            +
                        adjust(corrector, value_delta, value)
         
     | 
| 
       227 
240 
     | 
    
         
             
                      end
         
     | 
| 
       228 
241 
     | 
    
         
             
                    end
         
     | 
| 
       229 
242 
     | 
    
         | 
| 
         @@ -240,9 +253,7 @@ module RuboCop 
     | 
|
| 
       240 
253 
     | 
    
         
             
                      if delta > 0
         
     | 
| 
       241 
254 
     | 
    
         
             
                        corrector.insert_before(range, ' ' * delta)
         
     | 
| 
       242 
255 
     | 
    
         
             
                      elsif delta < 0
         
     | 
| 
       243 
     | 
    
         
            -
                        range =  
     | 
| 
       244 
     | 
    
         
            -
                                                          range.begin_pos - delta.abs,
         
     | 
| 
       245 
     | 
    
         
            -
                                                          range.begin_pos)
         
     | 
| 
      
 256 
     | 
    
         
            +
                        range = range_between(range.begin_pos - delta.abs, range.begin_pos)
         
     | 
| 
       246 
257 
     | 
    
         
             
                        corrector.remove(range)
         
     | 
| 
       247 
258 
     | 
    
         
             
                      end
         
     | 
| 
       248 
259 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -60,7 +60,7 @@ module RuboCop 
     | 
|
| 
       60 
60 
     | 
    
         | 
| 
       61 
61 
     | 
    
         
             
                    def autocorrect(node)
         
     | 
| 
       62 
62 
     | 
    
         
             
                      expr1, expr2 = *node
         
     | 
| 
       63 
     | 
    
         
            -
                      replacement = (node. 
     | 
| 
      
 63 
     | 
    
         
            +
                      replacement = (node.and_type? ? '&&' : '||')
         
     | 
| 
       64 
64 
     | 
    
         
             
                      lambda do |corrector|
         
     | 
| 
       65 
65 
     | 
    
         
             
                        [expr1, expr2].each do |expr|
         
     | 
| 
       66 
66 
     | 
    
         
             
                          if expr.send_type?
         
     | 
| 
         @@ -78,12 +78,19 @@ module RuboCop 
     | 
|
| 
       78 
78 
     | 
    
         
             
                    def correct_send(node, corrector)
         
     | 
| 
       79 
79 
     | 
    
         
             
                      receiver, method_name, *args = *node
         
     | 
| 
       80 
80 
     | 
    
         
             
                      return correct_not(node, receiver, corrector) if method_name == :!
         
     | 
| 
      
 81 
     | 
    
         
            +
                      return correct_setter(node, corrector) if setter_method?(method_name)
         
     | 
| 
       81 
82 
     | 
    
         
             
                      return unless correctable_send?(node)
         
     | 
| 
       82 
83 
     | 
    
         | 
| 
       83 
84 
     | 
    
         
             
                      corrector.replace(whitespace_before_arg(node), '('.freeze)
         
     | 
| 
       84 
85 
     | 
    
         
             
                      corrector.insert_after(args.last.source_range, ')'.freeze)
         
     | 
| 
       85 
86 
     | 
    
         
             
                    end
         
     | 
| 
       86 
87 
     | 
    
         | 
| 
      
 88 
     | 
    
         
            +
                    def correct_setter(node, corrector)
         
     | 
| 
      
 89 
     | 
    
         
            +
                      receiver, _method_name, *args = *node
         
     | 
| 
      
 90 
     | 
    
         
            +
                      corrector.insert_before(receiver.source_range, '('.freeze)
         
     | 
| 
      
 91 
     | 
    
         
            +
                      corrector.insert_after(args.last.source_range, ')'.freeze)
         
     | 
| 
      
 92 
     | 
    
         
            +
                    end
         
     | 
| 
      
 93 
     | 
    
         
            +
             
     | 
| 
       87 
94 
     | 
    
         
             
                    # ! is a special case:
         
     | 
| 
       88 
95 
     | 
    
         
             
                    # 'x and !obj.method arg' can be auto-corrected if we
         
     | 
| 
       89 
96 
     | 
    
         
             
                    # recurse down a level and add parens to 'obj.method arg'
         
     | 
| 
         @@ -106,6 +113,10 @@ module RuboCop 
     | 
|
| 
       106 
113 
     | 
    
         
             
                      corrector.insert_after(node.source_range, ')')
         
     | 
| 
       107 
114 
     | 
    
         
             
                    end
         
     | 
| 
       108 
115 
     | 
    
         | 
| 
      
 116 
     | 
    
         
            +
                    def setter_method?(method_name)
         
     | 
| 
      
 117 
     | 
    
         
            +
                      method_name.to_s.end_with?('=')
         
     | 
| 
      
 118 
     | 
    
         
            +
                    end
         
     | 
| 
      
 119 
     | 
    
         
            +
             
     | 
| 
       109 
120 
     | 
    
         
             
                    def correctable_send?(node)
         
     | 
| 
       110 
121 
     | 
    
         
             
                      _receiver, method_name, *args = *node
         
     | 
| 
       111 
122 
     | 
    
         
             
                      # don't clobber if we already have a starting paren
         
     | 
| 
         @@ -117,13 +128,12 @@ module RuboCop 
     | 
|
| 
       117 
128 
     | 
    
         
             
                    end
         
     | 
| 
       118 
129 
     | 
    
         | 
| 
       119 
130 
     | 
    
         
             
                    def whitespace_before_arg(node)
         
     | 
| 
       120 
     | 
    
         
            -
                      sb = node.source_range.source_buffer
         
     | 
| 
       121 
131 
     | 
    
         
             
                      begin_paren = node.loc.selector.end_pos
         
     | 
| 
       122 
132 
     | 
    
         
             
                      end_paren = begin_paren
         
     | 
| 
       123 
133 
     | 
    
         
             
                      # Increment position of parenthesis, unless message is a predicate
         
     | 
| 
       124 
134 
     | 
    
         
             
                      # method followed by a non-whitespace char (e.g. is_a?String).
         
     | 
| 
       125 
135 
     | 
    
         
             
                      end_paren += 1 unless node.source =~ /\?[!\S]/
         
     | 
| 
       126 
     | 
    
         
            -
                       
     | 
| 
      
 136 
     | 
    
         
            +
                      range_between(begin_paren, end_paren)
         
     | 
| 
       127 
137 
     | 
    
         
             
                    end
         
     | 
| 
       128 
138 
     | 
    
         
             
                  end
         
     | 
| 
       129 
139 
     | 
    
         
             
                end
         
     | 
| 
         @@ -14,8 +14,8 @@ module RuboCop 
     | 
|
| 
       14 
14 
     | 
    
         | 
| 
       15 
15 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
       16 
16 
     | 
    
         
             
                      receiver_node, method_name, *arg_nodes = *node
         
     | 
| 
       17 
     | 
    
         
            -
                      return unless receiver_node && receiver_node. 
     | 
| 
       18 
     | 
    
         
            -
                                    method_name == :* && arg_nodes 
     | 
| 
      
 17 
     | 
    
         
            +
                      return unless receiver_node && receiver_node.array_type? &&
         
     | 
| 
      
 18 
     | 
    
         
            +
                                    method_name == :* && arg_nodes.first.str_type?
         
     | 
| 
       19 
19 
     | 
    
         | 
| 
       20 
20 
     | 
    
         
             
                      add_offense(node, :selector)
         
     | 
| 
       21 
21 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -23,7 +23,7 @@ module RuboCop 
     | 
|
| 
       23 
23 
     | 
    
         
             
                    def autocorrect(node)
         
     | 
| 
       24 
24 
     | 
    
         
             
                      receiver_node, _method_name, *arg_nodes = *node
         
     | 
| 
       25 
25 
     | 
    
         
             
                      array = receiver_node.source
         
     | 
| 
       26 
     | 
    
         
            -
                      join_arg = arg_nodes 
     | 
| 
      
 26 
     | 
    
         
            +
                      join_arg = arg_nodes.first.source
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
28 
     | 
    
         
             
                      lambda do |corrector|
         
     | 
| 
       29 
29 
     | 
    
         
             
                        corrector.replace(node.source_range, "#{array}.join(#{join_arg})")
         
     | 
| 
         @@ -27,8 +27,7 @@ module RuboCop 
     | 
|
| 
       27 
27 
     | 
    
         
             
                                       comment.text.index(first_offense)
         
     | 
| 
       28 
28 
     | 
    
         
             
                      end_position   = start_position + first_offense.length
         
     | 
| 
       29 
29 
     | 
    
         | 
| 
       30 
     | 
    
         
            -
                       
     | 
| 
       31 
     | 
    
         
            -
                                                start_position, end_position)
         
     | 
| 
      
 30 
     | 
    
         
            +
                      range_between(start_position, end_position)
         
     | 
| 
       32 
31 
     | 
    
         
             
                    end
         
     | 
| 
       33 
32 
     | 
    
         | 
| 
       34 
33 
     | 
    
         
             
                    def first_non_ascii_chars(string)
         
     | 
| 
         @@ -25,8 +25,7 @@ module RuboCop 
     | 
|
| 
       25 
25 
     | 
    
         
             
                                       identifier.text.index(first_offense)
         
     | 
| 
       26 
26 
     | 
    
         
             
                      end_position   = start_position + first_offense.length
         
     | 
| 
       27 
27 
     | 
    
         | 
| 
       28 
     | 
    
         
            -
                       
     | 
| 
       29 
     | 
    
         
            -
                                                start_position, end_position)
         
     | 
| 
      
 28 
     | 
    
         
            +
                      range_between(start_position, end_position)
         
     | 
| 
       30 
29 
     | 
    
         
             
                    end
         
     | 
| 
       31 
30 
     | 
    
         | 
| 
       32 
31 
     | 
    
         
             
                    def first_non_ascii_chars(string)
         
     | 
| 
         @@ -20,9 +20,7 @@ module RuboCop 
     | 
|
| 
       20 
20 
     | 
    
         
             
                      attr_expr = attr_name.source_range
         
     | 
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                      if setter && (setter.true_type? || setter.false_type?)
         
     | 
| 
       23 
     | 
    
         
            -
                        remove =  
     | 
| 
       24 
     | 
    
         
            -
                                                           attr_expr.end_pos,
         
     | 
| 
       25 
     | 
    
         
            -
                                                           node_expr.end_pos)
         
     | 
| 
      
 23 
     | 
    
         
            +
                        remove = range_between(attr_expr.end_pos, node_expr.end_pos)
         
     | 
| 
       26 
24 
     | 
    
         
             
                      end
         
     | 
| 
       27 
25 
     | 
    
         | 
| 
       28 
26 
     | 
    
         
             
                      lambda do |corrector|
         
     | 
| 
         @@ -37,12 +37,8 @@ module RuboCop 
     | 
|
| 
       37 
37 
     | 
    
         
             
                    def parts(comment)
         
     | 
| 
       38 
38 
     | 
    
         
             
                      expr = comment.loc.expression
         
     | 
| 
       39 
39 
     | 
    
         
             
                      eq_begin = expr.resize(BEGIN_LENGTH)
         
     | 
| 
       40 
     | 
    
         
            -
                      eq_end =  
     | 
| 
       41 
     | 
    
         
            -
             
     | 
| 
       42 
     | 
    
         
            -
                                                         expr.end_pos)
         
     | 
| 
       43 
     | 
    
         
            -
                      contents = Parser::Source::Range.new(expr.source_buffer,
         
     | 
| 
       44 
     | 
    
         
            -
                                                           eq_begin.end_pos,
         
     | 
| 
       45 
     | 
    
         
            -
                                                           eq_end.begin_pos)
         
     | 
| 
      
 40 
     | 
    
         
            +
                      eq_end = range_between(expr.end_pos - END_LENGTH, expr.end_pos)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      contents = range_between(eq_begin.end_pos, eq_end.begin_pos)
         
     | 
| 
       46 
42 
     | 
    
         
             
                      [eq_begin, eq_end, contents]
         
     | 
| 
       47 
43 
     | 
    
         
             
                    end
         
     | 
| 
       48 
44 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -6,7 +6,7 @@ module RuboCop 
     | 
|
| 
       6 
6 
     | 
    
         
             
                module Style
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # Check for uses of braces or do/end around single line or
         
     | 
| 
       8 
8 
     | 
    
         
             
                  # multi-line blocks.
         
     | 
| 
       9 
     | 
    
         
            -
                  class BlockDelimiters < Cop 
     | 
| 
      
 9 
     | 
    
         
            +
                  class BlockDelimiters < Cop
         
     | 
| 
       10 
10 
     | 
    
         
             
                    include ConfigurableEnforcedStyle
         
     | 
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
         @@ -73,20 +73,34 @@ module RuboCop 
     | 
|
| 
       73 
73 
     | 
    
         
             
                    def autocorrect(node)
         
     | 
| 
       74 
74 
     | 
    
         
             
                      return if correction_would_break_code?(node)
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
      
 76 
     | 
    
         
            +
                      if node.loc.begin.is?('{')
         
     | 
| 
      
 77 
     | 
    
         
            +
                        replace_braces_with_do_end(node.loc)
         
     | 
| 
      
 78 
     | 
    
         
            +
                      else
         
     | 
| 
      
 79 
     | 
    
         
            +
                        replace_do_end_with_braces(node.loc)
         
     | 
| 
      
 80 
     | 
    
         
            +
                      end
         
     | 
| 
      
 81 
     | 
    
         
            +
                    end
         
     | 
| 
      
 82 
     | 
    
         
            +
             
     | 
| 
      
 83 
     | 
    
         
            +
                    def replace_braces_with_do_end(loc)
         
     | 
| 
      
 84 
     | 
    
         
            +
                      b = loc.begin
         
     | 
| 
      
 85 
     | 
    
         
            +
                      e = loc.end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
       76 
87 
     | 
    
         
             
                      lambda do |corrector|
         
     | 
| 
       77 
     | 
    
         
            -
                        b  
     | 
| 
       78 
     | 
    
         
            -
                        e  
     | 
| 
       79 
     | 
    
         
            -
                         
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
       84 
     | 
    
         
            -
             
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
             
     | 
| 
       87 
     | 
    
         
            -
             
     | 
| 
       88 
     | 
    
         
            -
             
     | 
| 
       89 
     | 
    
         
            -
             
     | 
| 
      
 88 
     | 
    
         
            +
                        corrector.insert_before(b, ' ') unless whitespace_before?(b)
         
     | 
| 
      
 89 
     | 
    
         
            +
                        corrector.insert_before(e, ' ') unless whitespace_before?(e)
         
     | 
| 
      
 90 
     | 
    
         
            +
                        corrector.insert_after(b, ' ') unless whitespace_after?(b)
         
     | 
| 
      
 91 
     | 
    
         
            +
                        corrector.replace(b, 'do')
         
     | 
| 
      
 92 
     | 
    
         
            +
                        corrector.replace(e, 'end')
         
     | 
| 
      
 93 
     | 
    
         
            +
                      end
         
     | 
| 
      
 94 
     | 
    
         
            +
                    end
         
     | 
| 
      
 95 
     | 
    
         
            +
             
     | 
| 
      
 96 
     | 
    
         
            +
                    def replace_do_end_with_braces(loc)
         
     | 
| 
      
 97 
     | 
    
         
            +
                      b = loc.begin
         
     | 
| 
      
 98 
     | 
    
         
            +
                      e = loc.end
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                      lambda do |corrector|
         
     | 
| 
      
 101 
     | 
    
         
            +
                        corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
         
     | 
| 
      
 102 
     | 
    
         
            +
                        corrector.replace(b, '{')
         
     | 
| 
      
 103 
     | 
    
         
            +
                        corrector.replace(e, '}')
         
     | 
| 
       90 
104 
     | 
    
         
             
                      end
         
     | 
| 
       91 
105 
     | 
    
         
             
                    end
         
     | 
| 
       92 
106 
     | 
    
         | 
| 
         @@ -160,13 +174,13 @@ module RuboCop 
     | 
|
| 
       160 
174 
     | 
    
         
             
                    end
         
     | 
| 
       161 
175 
     | 
    
         | 
| 
       162 
176 
     | 
    
         
             
                    def correction_would_break_code?(node)
         
     | 
| 
       163 
     | 
    
         
            -
                       
     | 
| 
       164 
     | 
    
         
            -
             
     | 
| 
       165 
     | 
    
         
            -
             
     | 
| 
       166 
     | 
    
         
            -
             
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
       168 
     | 
    
         
            -
             
     | 
| 
       169 
     | 
    
         
            -
                       
     | 
| 
      
 177 
     | 
    
         
            +
                      return unless node.loc.begin.is?('do')
         
     | 
| 
      
 178 
     | 
    
         
            +
             
     | 
| 
      
 179 
     | 
    
         
            +
                      # Converting `obj.method arg do |x| end` to use `{}` would cause
         
     | 
| 
      
 180 
     | 
    
         
            +
                      # a syntax error.
         
     | 
| 
      
 181 
     | 
    
         
            +
                      send = node.children.first
         
     | 
| 
      
 182 
     | 
    
         
            +
                      _receiver, _method_name, *args = *send
         
     | 
| 
      
 183 
     | 
    
         
            +
                      !args.empty? && !parentheses?(send)
         
     | 
| 
       170 
184 
     | 
    
         
             
                    end
         
     | 
| 
       171 
185 
     | 
    
         | 
| 
       172 
186 
     | 
    
         
             
                    def ignored_method?(method_name)
         
     | 
| 
         @@ -39,13 +39,13 @@ module RuboCop 
     | 
|
| 
       39 
39 
     | 
    
         
             
                    end
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
                    def check_context_dependent(arg, args)
         
     | 
| 
       42 
     | 
    
         
            -
                       
     | 
| 
      
 42 
     | 
    
         
            +
                      braces_around_second_from_end = args.length > 1 && args[-2].hash_type?
         
     | 
| 
       43 
43 
     | 
    
         
             
                      if braces?(arg)
         
     | 
| 
       44 
     | 
    
         
            -
                        unless  
     | 
| 
      
 44 
     | 
    
         
            +
                        unless braces_around_second_from_end
         
     | 
| 
       45 
45 
     | 
    
         
             
                          add_offense(arg.parent, arg.source_range,
         
     | 
| 
       46 
46 
     | 
    
         
             
                                      format(MSG, 'Redundant'))
         
     | 
| 
       47 
47 
     | 
    
         
             
                        end
         
     | 
| 
       48 
     | 
    
         
            -
                      elsif  
     | 
| 
      
 48 
     | 
    
         
            +
                      elsif braces_around_second_from_end
         
     | 
| 
       49 
49 
     | 
    
         
             
                        add_offense(arg.parent, arg.source_range, format(MSG, 'Missing'))
         
     | 
| 
       50 
50 
     | 
    
         
             
                      end
         
     | 
| 
       51 
51 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -102,7 +102,7 @@ module RuboCop 
     | 
|
| 
       102 
102 
     | 
    
         
             
                    end
         
     | 
| 
       103 
103 
     | 
    
         | 
| 
       104 
104 
     | 
    
         
             
                    def non_empty_hash?(arg)
         
     | 
| 
       105 
     | 
    
         
            -
                      arg && arg. 
     | 
| 
      
 105 
     | 
    
         
            +
                      arg && arg.hash_type? && !arg.children.empty?
         
     | 
| 
       106 
106 
     | 
    
         
             
                    end
         
     | 
| 
       107 
107 
     | 
    
         | 
| 
       108 
108 
     | 
    
         
             
                    def braces?(arg)
         
     | 
| 
         @@ -74,9 +74,7 @@ module RuboCop 
     | 
|
| 
       74 
74 
     | 
    
         
             
                      when_column = node.location.keyword.column
         
     | 
| 
       75 
75 
     | 
    
         
             
                      begin_pos = node.loc.keyword.begin_pos
         
     | 
| 
       76 
76 
     | 
    
         | 
| 
       77 
     | 
    
         
            -
                       
     | 
| 
       78 
     | 
    
         
            -
                                                begin_pos - when_column,
         
     | 
| 
       79 
     | 
    
         
            -
                                                begin_pos)
         
     | 
| 
      
 77 
     | 
    
         
            +
                      range_between(begin_pos - when_column, begin_pos)
         
     | 
| 
       80 
78 
     | 
    
         
             
                    end
         
     | 
| 
       81 
79 
     | 
    
         | 
| 
       82 
80 
     | 
    
         
             
                    def replacement(node)
         
     | 
| 
         @@ -39,11 +39,10 @@ module RuboCop 
     | 
|
| 
       39 
39 
     | 
    
         
             
                    def check(name, node)
         
     | 
| 
       40 
40 
     | 
    
         
             
                      return unless node
         
     | 
| 
       41 
41 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
                      if node. 
     | 
| 
      
 42 
     | 
    
         
            +
                      if node.defs_type?
         
     | 
| 
       43 
43 
     | 
    
         
             
                        check_defs(name, node)
         
     | 
| 
       44 
     | 
    
         
            -
                      elsif node. 
     | 
| 
       45 
     | 
    
         
            -
                         
     | 
| 
       46 
     | 
    
         
            -
                        defs_nodes.each { |n| check_defs(name, n) }
         
     | 
| 
      
 44 
     | 
    
         
            +
                      elsif node.begin_type?
         
     | 
| 
      
 45 
     | 
    
         
            +
                        node.each_child_node(:defs) { |n| check_defs(name, n) }
         
     | 
| 
       47 
46 
     | 
    
         
             
                      end
         
     | 
| 
       48 
47 
     | 
    
         
             
                    end
         
     | 
| 
       49 
48 
     | 
    
         | 
| 
         @@ -46,23 +46,30 @@ module RuboCop 
     | 
|
| 
       46 
46 
     | 
    
         
             
                    private
         
     | 
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                    def check_backtick_literal(node)
         
     | 
| 
       49 
     | 
    
         
            -
                      return if  
     | 
| 
       50 
     | 
    
         
            -
                      return if style == :mixed &&
         
     | 
| 
       51 
     | 
    
         
            -
                                node.single_line? &&
         
     | 
| 
       52 
     | 
    
         
            -
                                !contains_disallowed_backtick?(node)
         
     | 
| 
      
 49 
     | 
    
         
            +
                      return if allowed_backtick_literal?(node)
         
     | 
| 
       53 
50 
     | 
    
         | 
| 
       54 
51 
     | 
    
         
             
                      add_offense(node, :expression, MSG_USE_PERCENT_X)
         
     | 
| 
       55 
52 
     | 
    
         
             
                    end
         
     | 
| 
       56 
53 
     | 
    
         | 
| 
       57 
54 
     | 
    
         
             
                    def check_percent_x_literal(node)
         
     | 
| 
       58 
     | 
    
         
            -
                      return if  
     | 
| 
       59 
     | 
    
         
            -
                      return if style == :percent_x
         
     | 
| 
       60 
     | 
    
         
            -
                      return if style == :mixed && node.multiline?
         
     | 
| 
       61 
     | 
    
         
            -
                      return if style == :mixed && contains_disallowed_backtick?(node)
         
     | 
| 
      
 55 
     | 
    
         
            +
                      return if allowed_percent_x_literal?(node)
         
     | 
| 
       62 
56 
     | 
    
         | 
| 
       63 
57 
     | 
    
         
             
                      add_offense(node, :expression, MSG_USE_BACKTICKS)
         
     | 
| 
       64 
58 
     | 
    
         
             
                    end
         
     | 
| 
       65 
59 
     | 
    
         | 
| 
      
 60 
     | 
    
         
            +
                    def allowed_backtick_literal?(node)
         
     | 
| 
      
 61 
     | 
    
         
            +
                      style == :backticks && !contains_disallowed_backtick?(node) ||
         
     | 
| 
      
 62 
     | 
    
         
            +
                        style == :mixed && node.single_line? &&
         
     | 
| 
      
 63 
     | 
    
         
            +
                          !contains_disallowed_backtick?(node)
         
     | 
| 
      
 64 
     | 
    
         
            +
                    end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                    def allowed_percent_x_literal?(node)
         
     | 
| 
      
 67 
     | 
    
         
            +
                      style == :backticks && contains_disallowed_backtick?(node) ||
         
     | 
| 
      
 68 
     | 
    
         
            +
                        style == :percent_x ||
         
     | 
| 
      
 69 
     | 
    
         
            +
                        style == :mixed && node.multiline? ||
         
     | 
| 
      
 70 
     | 
    
         
            +
                        style == :mixed && contains_disallowed_backtick?(node)
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
       66 
73 
     | 
    
         
             
                    def contains_disallowed_backtick?(node)
         
     | 
| 
       67 
74 
     | 
    
         
             
                      !allow_inner_backticks? && contains_backtick?(node)
         
     | 
| 
       68 
75 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -47,8 +47,7 @@ module RuboCop 
     | 
|
| 
       47 
47 
     | 
    
         | 
| 
       48 
48 
     | 
    
         
             
                    def annotation_range(comment, margin, length)
         
     | 
| 
       49 
49 
     | 
    
         
             
                      start = comment.loc.expression.begin_pos + margin.length
         
     | 
| 
       50 
     | 
    
         
            -
                       
     | 
| 
       51 
     | 
    
         
            -
                      Parser::Source::Range.new(source_buffer, start, start + length)
         
     | 
| 
      
 50 
     | 
    
         
            +
                      range_between(start, start + length)
         
     | 
| 
       52 
51 
     | 
    
         
             
                    end
         
     | 
| 
       53 
52 
     | 
    
         | 
| 
       54 
53 
     | 
    
         
             
                    def concat_length(*args)
         
     | 
| 
         @@ -32,7 +32,7 @@ module RuboCop 
     | 
|
| 
       32 
32 
     | 
    
         
             
                      branch.begin_type? ? [*branch].last : branch
         
     | 
| 
       33 
33 
     | 
    
         
             
                    end
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
       35 
     | 
    
         
            -
                    def lhs(node)
         
     | 
| 
      
 35 
     | 
    
         
            +
                    def lhs(node) # rubocop:disable Metrics/MethodLength
         
     | 
| 
       36 
36 
     | 
    
         
             
                      case node.type
         
     | 
| 
       37 
37 
     | 
    
         
             
                      when :send
         
     | 
| 
       38 
38 
     | 
    
         
             
                        lhs_for_send(node)
         
     | 
| 
         @@ -77,17 +77,22 @@ module RuboCop 
     | 
|
| 
       77 
77 
     | 
    
         | 
| 
       78 
78 
     | 
    
         
             
                    def lhs_for_send(node)
         
     | 
| 
       79 
79 
     | 
    
         
             
                      receiver = node.receiver.nil? ? '' : node.receiver.source
         
     | 
| 
      
 80 
     | 
    
         
            +
                      method_name = node.method_name
         
     | 
| 
       80 
81 
     | 
    
         | 
| 
       81 
     | 
    
         
            -
                      if  
     | 
| 
      
 82 
     | 
    
         
            +
                      if method_name == :[]=
         
     | 
| 
       82 
83 
     | 
    
         
             
                        indices = node.children[2...-1].map(&:source).join(', ')
         
     | 
| 
       83 
84 
     | 
    
         
             
                        "#{receiver}[#{indices}] = "
         
     | 
| 
       84 
     | 
    
         
            -
                      elsif  
     | 
| 
       85 
     | 
    
         
            -
             
     | 
| 
       86 
     | 
    
         
            -
                        "#{receiver}.#{node.method_name[0...-1]} = "
         
     | 
| 
      
 85 
     | 
    
         
            +
                      elsif setter_method?(method_name)
         
     | 
| 
      
 86 
     | 
    
         
            +
                        "#{receiver}.#{method_name[0...-1]} = "
         
     | 
| 
       87 
87 
     | 
    
         
             
                      else
         
     | 
| 
       88 
     | 
    
         
            -
                        "#{receiver} #{ 
     | 
| 
      
 88 
     | 
    
         
            +
                        "#{receiver} #{method_name} "
         
     | 
| 
       89 
89 
     | 
    
         
             
                      end
         
     | 
| 
       90 
90 
     | 
    
         
             
                    end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                    def setter_method?(method_name)
         
     | 
| 
      
 93 
     | 
    
         
            +
                      method_name.to_s.end_with?(EQUAL) &&
         
     | 
| 
      
 94 
     | 
    
         
            +
                        ![:!=, :==, :===, :>=, :<=].include?(method_name)
         
     | 
| 
      
 95 
     | 
    
         
            +
                    end
         
     | 
| 
       91 
96 
     | 
    
         
             
                  end
         
     | 
| 
       92 
97 
     | 
    
         | 
| 
       93 
98 
     | 
    
         
             
                  # Check for `if` and `case` statements where each branch is used for
         
     | 
| 
         @@ -277,7 +282,7 @@ module RuboCop 
     | 
|
| 
       277 
282 
     | 
    
         
             
                    def assignment_node(node)
         
     | 
| 
       278 
283 
     | 
    
         
             
                      *_variable, assignment = *node
         
     | 
| 
       279 
284 
     | 
    
         | 
| 
       280 
     | 
    
         
            -
                      if assignment.begin_type? && assignment.children. 
     | 
| 
      
 285 
     | 
    
         
            +
                      if assignment.begin_type? && assignment.children.one?
         
     | 
| 
       281 
286 
     | 
    
         
             
                        assignment, = *assignment
         
     | 
| 
       282 
287 
     | 
    
         
             
                      end
         
     | 
| 
       283 
288 
     | 
    
         | 
| 
         @@ -337,18 +342,22 @@ module RuboCop 
     | 
|
| 
       337 
342 
     | 
    
         
             
                    end
         
     | 
| 
       338 
343 
     | 
    
         | 
| 
       339 
344 
     | 
    
         
             
                    def check_node(node, branches)
         
     | 
| 
       340 
     | 
    
         
            -
                      return unless branches 
     | 
| 
       341 
     | 
    
         
            -
                      last_statements = branches.map { |branch| tail(branch) }
         
     | 
| 
       342 
     | 
    
         
            -
                      return unless lhs_all_match?(last_statements)
         
     | 
| 
       343 
     | 
    
         
            -
                      return if last_statements.any?(&:masgn_type?)
         
     | 
| 
       344 
     | 
    
         
            -
                      return unless assignment_types_match?(*last_statements)
         
     | 
| 
       345 
     | 
    
         
            -
             
     | 
| 
      
 345 
     | 
    
         
            +
                      return unless allowed_statements?(branches)
         
     | 
| 
       346 
346 
     | 
    
         
             
                      return if single_line_conditions_only? && branches.any?(&:begin_type?)
         
     | 
| 
       347 
347 
     | 
    
         
             
                      return if correction_exceeds_line_limit?(node, branches)
         
     | 
| 
       348 
348 
     | 
    
         | 
| 
       349 
349 
     | 
    
         
             
                      add_offense(node, :expression)
         
     | 
| 
       350 
350 
     | 
    
         
             
                    end
         
     | 
| 
       351 
351 
     | 
    
         | 
| 
      
 352 
     | 
    
         
            +
                    def allowed_statements?(branches)
         
     | 
| 
      
 353 
     | 
    
         
            +
                      return false unless branches.all?
         
     | 
| 
      
 354 
     | 
    
         
            +
             
     | 
| 
      
 355 
     | 
    
         
            +
                      statements = branches.map { |branch| tail(branch) }
         
     | 
| 
      
 356 
     | 
    
         
            +
             
     | 
| 
      
 357 
     | 
    
         
            +
                      lhs_all_match?(statements) && !statements.any?(&:masgn_type?) &&
         
     | 
| 
      
 358 
     | 
    
         
            +
                        assignment_types_match?(*statements)
         
     | 
| 
      
 359 
     | 
    
         
            +
                    end
         
     | 
| 
      
 360 
     | 
    
         
            +
             
     | 
| 
       352 
361 
     | 
    
         
             
                    # If `Metrics/LineLength` is enabled, we do not want to introduce an
         
     | 
| 
       353 
362 
     | 
    
         
             
                    # offense by auto-correcting this cop. Find the max configured line
         
     | 
| 
       354 
363 
     | 
    
         
             
                    # length. Find the longest line of condition. Remove the assignment
         
     | 
| 
         @@ -357,16 +366,26 @@ module RuboCop 
     | 
|
| 
       357 
366 
     | 
    
         
             
                    # of the longest line + the length of the corrected assignment is
         
     | 
| 
       358 
367 
     | 
    
         
             
                    # greater than the max configured line length
         
     | 
| 
       359 
368 
     | 
    
         
             
                    def correction_exceeds_line_limit?(node, branches)
         
     | 
| 
       360 
     | 
    
         
            -
                      return false unless  
     | 
| 
      
 369 
     | 
    
         
            +
                      return false unless line_length_cop_enabled?
         
     | 
| 
      
 370 
     | 
    
         
            +
             
     | 
| 
       361 
371 
     | 
    
         
             
                      assignment = lhs(tail(branches[0]))
         
     | 
| 
       362 
     | 
    
         
            -
                      max_line_length = config.for_cop(LINE_LENGTH)[MAX]
         
     | 
| 
       363 
     | 
    
         
            -
                      indentation_width = config.for_cop(INDENTATION_WIDTH)[WIDTH] || 2
         
     | 
| 
       364 
     | 
    
         
            -
                      return true if longest_rhs(branches) + indentation_width +
         
     | 
| 
       365 
     | 
    
         
            -
                                     assignment.length > max_line_length
         
     | 
| 
       366 
372 
     | 
    
         | 
| 
      
 373 
     | 
    
         
            +
                      longest_rhs_exceeds_line_limit?(branches, assignment) ||
         
     | 
| 
      
 374 
     | 
    
         
            +
                        longest_line_exceeds_line_limit?(node, assignment)
         
     | 
| 
      
 375 
     | 
    
         
            +
                    end
         
     | 
| 
      
 376 
     | 
    
         
            +
             
     | 
| 
      
 377 
     | 
    
         
            +
                    def longest_rhs_exceeds_line_limit?(branches, assignment)
         
     | 
| 
      
 378 
     | 
    
         
            +
                      longest_rhs_full_length(branches, assignment) > max_line_length
         
     | 
| 
      
 379 
     | 
    
         
            +
                    end
         
     | 
| 
      
 380 
     | 
    
         
            +
             
     | 
| 
      
 381 
     | 
    
         
            +
                    def longest_line_exceeds_line_limit?(node, assignment)
         
     | 
| 
       367 
382 
     | 
    
         
             
                      longest_line(node, assignment).length > max_line_length
         
     | 
| 
       368 
383 
     | 
    
         
             
                    end
         
     | 
| 
       369 
384 
     | 
    
         | 
| 
      
 385 
     | 
    
         
            +
                    def longest_rhs_full_length(branches, assignment)
         
     | 
| 
      
 386 
     | 
    
         
            +
                      longest_rhs(branches) + indentation_width + assignment.length
         
     | 
| 
      
 387 
     | 
    
         
            +
                    end
         
     | 
| 
      
 388 
     | 
    
         
            +
             
     | 
| 
       370 
389 
     | 
    
         
             
                    def longest_line(node, assignment)
         
     | 
| 
       371 
390 
     | 
    
         
             
                      assignment_regex = /#{Regexp.escape(assignment).gsub(' ', '\s*')}/
         
     | 
| 
       372 
391 
     | 
    
         
             
                      lines = node.source.lines.map do |line|
         
     | 
| 
         @@ -380,9 +399,16 @@ module RuboCop 
     | 
|
| 
       380 
399 
     | 
    
         
             
                      branches.map { |branch| branch.children.last.source.length }.max
         
     | 
| 
       381 
400 
     | 
    
         
             
                    end
         
     | 
| 
       382 
401 
     | 
    
         | 
| 
       383 
     | 
    
         
            -
                    def  
     | 
| 
       384 
     | 
    
         
            -
                       
     | 
| 
       385 
     | 
    
         
            -
             
     | 
| 
      
 402 
     | 
    
         
            +
                    def line_length_cop_enabled?
         
     | 
| 
      
 403 
     | 
    
         
            +
                      config.for_cop(LINE_LENGTH)[ENABLED]
         
     | 
| 
      
 404 
     | 
    
         
            +
                    end
         
     | 
| 
      
 405 
     | 
    
         
            +
             
     | 
| 
      
 406 
     | 
    
         
            +
                    def max_line_length
         
     | 
| 
      
 407 
     | 
    
         
            +
                      config.for_cop(LINE_LENGTH)[MAX]
         
     | 
| 
      
 408 
     | 
    
         
            +
                    end
         
     | 
| 
      
 409 
     | 
    
         
            +
             
     | 
| 
      
 410 
     | 
    
         
            +
                    def indentation_width
         
     | 
| 
      
 411 
     | 
    
         
            +
                      config.for_cop(INDENTATION_WIDTH)[WIDTH] || 2
         
     | 
| 
       386 
412 
     | 
    
         
             
                    end
         
     | 
| 
       387 
413 
     | 
    
         | 
| 
       388 
414 
     | 
    
         
             
                    def single_line_conditions_only?
         
     | 
| 
         @@ -450,21 +476,8 @@ module RuboCop 
     | 
|
| 
       450 
476 
     | 
    
         
             
                      include ConditionalCorrectorHelper
         
     | 
| 
       451 
477 
     | 
    
         | 
| 
       452 
478 
     | 
    
         
             
                      def correct(node)
         
     | 
| 
       453 
     | 
    
         
            -
                        condition, if_branch, else_branch = *node
         
     | 
| 
       454 
     | 
    
         
            -
                        _variable, *_operator, if_rhs = *if_branch
         
     | 
| 
       455 
     | 
    
         
            -
                        _else_variable, *_operator, else_rhs = *else_branch
         
     | 
| 
       456 
     | 
    
         
            -
                        condition = condition.source
         
     | 
| 
       457 
     | 
    
         
            -
                        if_rhs = if_rhs.source
         
     | 
| 
       458 
     | 
    
         
            -
                        else_rhs = else_rhs.source
         
     | 
| 
       459 
     | 
    
         
            -
             
     | 
| 
       460 
     | 
    
         
            -
                        ternary = "#{condition} ? #{if_rhs} : #{else_rhs}"
         
     | 
| 
       461 
     | 
    
         
            -
                        if if_branch.send_type? && if_branch.method_name != :[]=
         
     | 
| 
       462 
     | 
    
         
            -
                          ternary = "(#{ternary})"
         
     | 
| 
       463 
     | 
    
         
            -
                        end
         
     | 
| 
       464 
     | 
    
         
            -
                        correction = "#{lhs(if_branch)}#{ternary}"
         
     | 
| 
       465 
     | 
    
         
            -
             
     | 
| 
       466 
479 
     | 
    
         
             
                        lambda do |corrector|
         
     | 
| 
       467 
     | 
    
         
            -
                          corrector.replace(node.source_range, correction)
         
     | 
| 
      
 480 
     | 
    
         
            +
                          corrector.replace(node.source_range, correction(node))
         
     | 
| 
       468 
481 
     | 
    
         
             
                        end
         
     | 
| 
       469 
482 
     | 
    
         
             
                      end
         
     | 
| 
       470 
483 
     | 
    
         | 
| 
         @@ -484,9 +497,28 @@ module RuboCop 
     | 
|
| 
       484 
497 
     | 
    
         | 
| 
       485 
498 
     | 
    
         
             
                      private
         
     | 
| 
       486 
499 
     | 
    
         | 
| 
      
 500 
     | 
    
         
            +
                      def correction(node)
         
     | 
| 
      
 501 
     | 
    
         
            +
                        condition, if_branch, else_branch = *node
         
     | 
| 
      
 502 
     | 
    
         
            +
             
     | 
| 
      
 503 
     | 
    
         
            +
                        "#{lhs(if_branch)}#{ternary(condition, if_branch, else_branch)}"
         
     | 
| 
      
 504 
     | 
    
         
            +
                      end
         
     | 
| 
      
 505 
     | 
    
         
            +
             
     | 
| 
      
 506 
     | 
    
         
            +
                      def ternary(condition, if_branch, else_branch)
         
     | 
| 
      
 507 
     | 
    
         
            +
                        _variable, *_operator, if_rhs = *if_branch
         
     | 
| 
      
 508 
     | 
    
         
            +
                        _else_variable, *_operator, else_rhs = *else_branch
         
     | 
| 
      
 509 
     | 
    
         
            +
             
     | 
| 
      
 510 
     | 
    
         
            +
                        expr = "#{condition.source} ? #{if_rhs.source} : #{else_rhs.source}"
         
     | 
| 
      
 511 
     | 
    
         
            +
             
     | 
| 
      
 512 
     | 
    
         
            +
                        element_assignment?(if_branch) ? "(#{expr})" : expr
         
     | 
| 
      
 513 
     | 
    
         
            +
                      end
         
     | 
| 
      
 514 
     | 
    
         
            +
             
     | 
| 
      
 515 
     | 
    
         
            +
                      def element_assignment?(node)
         
     | 
| 
      
 516 
     | 
    
         
            +
                        node.send_type? && node.method_name != :[]=
         
     | 
| 
      
 517 
     | 
    
         
            +
                      end
         
     | 
| 
      
 518 
     | 
    
         
            +
             
     | 
| 
       487 
519 
     | 
    
         
             
                      def extract_branches(node)
         
     | 
| 
       488 
520 
     | 
    
         
             
                        *_var, rhs = *node
         
     | 
| 
       489 
     | 
    
         
            -
                        condition, = *rhs if rhs.begin_type? && rhs.children. 
     | 
| 
      
 521 
     | 
    
         
            +
                        condition, = *rhs if rhs.begin_type? && rhs.children.one?
         
     | 
| 
       490 
522 
     | 
    
         
             
                        _condition, if_branch, else_branch = *(condition || rhs)
         
     | 
| 
       491 
523 
     | 
    
         | 
| 
       492 
524 
     | 
    
         
             
                        [if_branch, else_branch]
         
     |