rubocop 0.74.0 → 0.78.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.
- checksums.yaml +4 -4
 - data/README.md +3 -2
 - data/config/default.yml +366 -318
 - data/lib/rubocop.rb +48 -32
 - data/lib/rubocop/ast/builder.rb +1 -0
 - data/lib/rubocop/ast/node.rb +5 -1
 - data/lib/rubocop/ast/node/block_node.rb +2 -0
 - data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +1 -12
 - data/lib/rubocop/ast/node/return_node.rb +24 -0
 - data/lib/rubocop/cli.rb +11 -227
 - data/lib/rubocop/cli/command.rb +21 -0
 - data/lib/rubocop/cli/command/auto_genenerate_config.rb +105 -0
 - data/lib/rubocop/cli/command/base.rb +33 -0
 - data/lib/rubocop/cli/command/execute_runner.rb +76 -0
 - data/lib/rubocop/cli/command/init_dotfile.rb +45 -0
 - data/lib/rubocop/cli/command/show_cops.rb +73 -0
 - data/lib/rubocop/cli/command/version.rb +17 -0
 - data/lib/rubocop/cli/environment.rb +21 -0
 - data/lib/rubocop/comment_config.rb +5 -4
 - data/lib/rubocop/config.rb +12 -1
 - data/lib/rubocop/config_loader.rb +21 -3
 - data/lib/rubocop/config_loader_resolver.rb +4 -3
 - data/lib/rubocop/config_obsoletion.rb +85 -11
 - data/lib/rubocop/config_validator.rb +28 -19
 - data/lib/rubocop/cop/autocorrect_logic.rb +3 -3
 - data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
 - data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +2 -2
 - data/lib/rubocop/cop/commissioner.rb +15 -7
 - data/lib/rubocop/cop/cop.rb +35 -9
 - data/lib/rubocop/cop/corrector.rb +8 -7
 - data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
 - data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
 - data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
 - data/lib/rubocop/cop/correctors/space_corrector.rb +1 -2
 - data/lib/rubocop/cop/generator.rb +3 -3
 - data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
 - data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
 - data/lib/rubocop/cop/internal_affairs.rb +1 -0
 - data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +59 -0
 - data/lib/rubocop/cop/layout/{align_arguments.rb → argument_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/{align_array.rb → array_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/{indent_assignment.rb → assignment_indentation.rb} +11 -2
 - data/lib/rubocop/cop/layout/block_alignment.rb +2 -2
 - data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
 - data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
 - data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
 - data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
 - data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
 - data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
 - data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
 - data/lib/rubocop/cop/layout/extra_spacing.rb +1 -7
 - data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +14 -12
 - data/lib/rubocop/cop/layout/{indent_first_array_element.rb → first_array_element_indentation.rb} +4 -4
 - data/lib/rubocop/cop/layout/{indent_first_hash_element.rb → first_hash_element_indentation.rb} +4 -4
 - data/lib/rubocop/cop/layout/{indent_first_parameter.rb → first_parameter_indentation.rb} +3 -3
 - data/lib/rubocop/cop/layout/{align_hash.rb → hash_alignment.rb} +8 -4
 - data/lib/rubocop/cop/layout/{indent_heredoc.rb → heredoc_indentation.rb} +6 -6
 - data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
 - data/lib/rubocop/cop/{metrics → layout}/line_length.rb +41 -114
 - data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
 - data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
 - data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
 - data/lib/rubocop/cop/layout/{align_parameters.rb → parameter_alignment.rb} +1 -1
 - data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -0
 - data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
 - data/lib/rubocop/cop/layout/space_around_keyword.rb +12 -0
 - data/lib/rubocop/cop/layout/space_around_operators.rb +32 -7
 - data/lib/rubocop/cop/layout/space_before_block_braces.rb +17 -0
 - data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
 - data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
 - data/lib/rubocop/cop/layout/space_inside_block_braces.rb +7 -0
 - data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
 - data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +2 -0
 - data/lib/rubocop/cop/layout/{trailing_blank_lines.rb → trailing_empty_lines.rb} +1 -1
 - data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
 - data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
 - data/lib/rubocop/cop/lint/debugger.rb +1 -1
 - data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +1 -1
 - data/lib/rubocop/cop/lint/{duplicated_key.rb → duplicate_hash_key.rb} +1 -1
 - data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
 - data/lib/rubocop/cop/lint/erb_new_arguments.rb +9 -8
 - data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +10 -36
 - data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
 - data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
 - data/lib/rubocop/cop/lint/{multiple_compare.rb → multiple_comparison.rb} +1 -1
 - data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +89 -0
 - data/lib/rubocop/cop/lint/number_conversion.rb +1 -1
 - data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +26 -26
 - data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +10 -12
 - data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +1 -1
 - data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +6 -6
 - data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +1 -1
 - data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -2
 - data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -2
 - data/lib/rubocop/cop/lint/safe_navigation_chain.rb +5 -6
 - data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
 - data/lib/rubocop/cop/lint/{handle_exceptions.rb → suppressed_exception.rb} +1 -1
 - data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
 - data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
 - data/lib/rubocop/cop/lint/useless_access_modifier.rb +57 -23
 - data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
 - data/lib/rubocop/cop/lint/void.rb +7 -26
 - data/lib/rubocop/cop/message_annotator.rb +16 -7
 - data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
 - data/lib/rubocop/cop/metrics/method_length.rb +1 -1
 - data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
 - data/lib/rubocop/cop/migration/department_name.rb +44 -0
 - data/lib/rubocop/cop/mixin/alignment.rb +2 -2
 - data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
 - data/lib/rubocop/cop/mixin/{hash_alignment.rb → hash_alignment_styles.rb} +1 -1
 - data/lib/rubocop/cop/mixin/line_length_help.rb +88 -0
 - data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
 - data/lib/rubocop/cop/mixin/nil_methods.rb +4 -4
 - data/lib/rubocop/cop/mixin/rational_literal.rb +18 -0
 - data/lib/rubocop/cop/mixin/statement_modifier.rb +7 -4
 - data/lib/rubocop/cop/mixin/trailing_comma.rb +14 -9
 - data/lib/rubocop/cop/naming/{uncommunicative_block_param_name.rb → block_parameter_name.rb} +3 -3
 - data/lib/rubocop/cop/naming/file_name.rb +12 -5
 - data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +5 -5
 - data/lib/rubocop/cop/naming/method_name.rb +12 -1
 - data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb} +3 -3
 - data/lib/rubocop/cop/naming/predicate_name.rb +6 -6
 - data/lib/rubocop/cop/naming/variable_name.rb +1 -0
 - data/lib/rubocop/cop/offense.rb +29 -7
 - data/lib/rubocop/cop/registry.rb +22 -1
 - data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
 - data/lib/rubocop/cop/style/alias.rb +1 -1
 - data/lib/rubocop/cop/style/array_join.rb +1 -1
 - data/lib/rubocop/cop/style/attr.rb +10 -2
 - data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
 - data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
 - data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
 - data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
 - data/lib/rubocop/cop/style/commented_keyword.rb +8 -2
 - data/lib/rubocop/cop/style/conditional_assignment.rb +6 -6
 - data/lib/rubocop/cop/style/copyright.rb +11 -7
 - data/lib/rubocop/cop/style/documentation_method.rb +44 -0
 - data/lib/rubocop/cop/style/double_cop_disable_directive.rb +10 -4
 - data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
 - data/lib/rubocop/cop/style/empty_literal.rb +2 -2
 - data/lib/rubocop/cop/style/empty_method.rb +5 -5
 - data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
 - data/lib/rubocop/cop/style/even_odd.rb +1 -1
 - data/lib/rubocop/cop/style/expand_path_arguments.rb +1 -1
 - data/lib/rubocop/cop/style/format_string.rb +10 -7
 - data/lib/rubocop/cop/style/format_string_token.rb +19 -68
 - data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
 - data/lib/rubocop/cop/style/guard_clause.rb +3 -2
 - data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
 - data/lib/rubocop/cop/style/if_unless_modifier.rb +93 -15
 - data/lib/rubocop/cop/style/infinite_loop.rb +6 -5
 - data/lib/rubocop/cop/style/inverse_methods.rb +19 -13
 - data/lib/rubocop/cop/style/ip_addresses.rb +4 -4
 - data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
 - data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
 - data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
 - data/lib/rubocop/cop/style/mixin_grouping.rb +1 -1
 - data/lib/rubocop/cop/style/mixin_usage.rb +11 -1
 - data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
 - data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -1
 - data/lib/rubocop/cop/style/multiline_when_then.rb +1 -1
 - data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
 - data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -5
 - data/lib/rubocop/cop/style/next.rb +5 -5
 - data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
 - data/lib/rubocop/cop/style/numeric_literals.rb +7 -3
 - data/lib/rubocop/cop/style/option_hash.rb +3 -3
 - data/lib/rubocop/cop/style/or_assignment.rb +6 -1
 - data/lib/rubocop/cop/style/parentheses_around_condition.rb +14 -0
 - data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
 - data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
 - data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
 - data/lib/rubocop/cop/style/redundant_parentheses.rb +16 -7
 - data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
 - data/lib/rubocop/cop/style/redundant_return.rb +39 -29
 - data/lib/rubocop/cop/style/redundant_self.rb +18 -1
 - data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +5 -5
 - data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
 - data/lib/rubocop/cop/style/safe_navigation.rb +23 -3
 - data/lib/rubocop/cop/style/semicolon.rb +13 -2
 - data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
 - data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
 - data/lib/rubocop/cop/style/ternary_parentheses.rb +19 -0
 - data/lib/rubocop/cop/style/trailing_underscore_variable.rb +7 -1
 - data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
 - data/lib/rubocop/cop/style/while_until_modifier.rb +1 -1
 - data/lib/rubocop/cop/team.rb +5 -0
 - data/lib/rubocop/cop/util.rb +1 -1
 - data/lib/rubocop/cop/utils/format_string.rb +120 -0
 - data/lib/rubocop/cop/variable_force.rb +7 -5
 - data/lib/rubocop/cop/variable_force/variable.rb +15 -2
 - data/lib/rubocop/core_ext/string.rb +0 -24
 - data/lib/rubocop/formatter/base_formatter.rb +2 -2
 - data/lib/rubocop/formatter/clang_style_formatter.rb +9 -6
 - data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
 - data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
 - data/lib/rubocop/formatter/formatter_set.rb +16 -15
 - data/lib/rubocop/formatter/json_formatter.rb +6 -5
 - data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
 - data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
 - data/lib/rubocop/formatter/tap_formatter.rb +18 -7
 - data/lib/rubocop/magic_comment.rb +4 -0
 - data/lib/rubocop/node_pattern.rb +4 -2
 - data/lib/rubocop/options.rb +21 -26
 - data/lib/rubocop/processed_source.rb +1 -1
 - data/lib/rubocop/rake_task.rb +1 -0
 - data/lib/rubocop/result_cache.rb +24 -8
 - data/lib/rubocop/runner.rb +60 -33
 - data/lib/rubocop/target_finder.rb +12 -6
 - data/lib/rubocop/version.rb +1 -1
 - metadata +48 -33
 - data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
 - data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
 
| 
         @@ -41,17 +41,20 @@ module RuboCop 
     | 
|
| 
       41 
41 
     | 
    
         
             
                  end
         
     | 
| 
       42 
42 
     | 
    
         | 
| 
       43 
43 
     | 
    
         
             
                  def length_in_modifier_form(node, cond, body_length)
         
     | 
| 
       44 
     | 
    
         
            -
                     
     | 
| 
       45 
     | 
    
         
            -
             
     | 
| 
      
 44 
     | 
    
         
            +
                    keyword = node.loc.keyword
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    indentation = keyword.column * indentation_multiplier
         
     | 
| 
      
 47 
     | 
    
         
            +
                    kw_length = keyword.size
         
     | 
| 
       46 
48 
     | 
    
         
             
                    cond_length = cond.source_range.size
         
     | 
| 
       47 
49 
     | 
    
         
             
                    space = 1
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
       48 
51 
     | 
    
         
             
                    indentation + body_length + space + kw_length + space + cond_length
         
     | 
| 
       49 
52 
     | 
    
         
             
                  end
         
     | 
| 
       50 
53 
     | 
    
         | 
| 
       51 
54 
     | 
    
         
             
                  def max_line_length
         
     | 
| 
       52 
     | 
    
         
            -
                    return unless config.for_cop(' 
     | 
| 
      
 55 
     | 
    
         
            +
                    return unless config.for_cop('Layout/LineLength')['Enabled']
         
     | 
| 
       53 
56 
     | 
    
         | 
| 
       54 
     | 
    
         
            -
                    config.for_cop(' 
     | 
| 
      
 57 
     | 
    
         
            +
                    config.for_cop('Layout/LineLength')['Max']
         
     | 
| 
       55 
58 
     | 
    
         
             
                  end
         
     | 
| 
       56 
59 
     | 
    
         | 
| 
       57 
60 
     | 
    
         
             
                  def indentation_multiplier
         
     | 
| 
         @@ -18,12 +18,7 @@ module RuboCop 
     | 
|
| 
       18 
18 
     | 
    
         | 
| 
       19 
19 
     | 
    
         
             
                  def check(node, items, kind, begin_pos, end_pos)
         
     | 
| 
       20 
20 
     | 
    
         
             
                    after_last_item = range_between(begin_pos, end_pos)
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
       22 
     | 
    
         
            -
                    # If there is any heredoc in items, then match the comma succeeding
         
     | 
| 
       23 
     | 
    
         
            -
                    # any whitespace (except newlines), otherwise allow for newlines
         
     | 
| 
       24 
     | 
    
         
            -
                    comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
         
     | 
| 
       25 
     | 
    
         
            -
                    comma_offset = after_last_item.source =~ comma_regex &&
         
     | 
| 
       26 
     | 
    
         
            -
                                   after_last_item.source.index(',')
         
     | 
| 
      
 21 
     | 
    
         
            +
                    comma_offset = comma_offset(items, after_last_item)
         
     | 
| 
       27 
22 
     | 
    
         | 
| 
       28 
23 
     | 
    
         
             
                    if comma_offset && !inside_comment?(after_last_item, comma_offset)
         
     | 
| 
       29 
24 
     | 
    
         
             
                      check_comma(node, kind, after_last_item.begin_pos + comma_offset)
         
     | 
| 
         @@ -32,6 +27,13 @@ module RuboCop 
     | 
|
| 
       32 
27 
     | 
    
         
             
                    end
         
     | 
| 
       33 
28 
     | 
    
         
             
                  end
         
     | 
| 
       34 
29 
     | 
    
         | 
| 
      
 30 
     | 
    
         
            +
                  def comma_offset(items, range)
         
     | 
| 
      
 31 
     | 
    
         
            +
                    # If there is any heredoc in items, then match the comma succeeding
         
     | 
| 
      
 32 
     | 
    
         
            +
                    # any whitespace (except newlines), otherwise allow for newlines
         
     | 
| 
      
 33 
     | 
    
         
            +
                    comma_regex = any_heredoc?(items) ? /\A[^\S\n]*,/ : /\A\s*,/
         
     | 
| 
      
 34 
     | 
    
         
            +
                    range.source =~ comma_regex && range.source.index(',')
         
     | 
| 
      
 35 
     | 
    
         
            +
                  end
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
       35 
37 
     | 
    
         
             
                  def check_comma(node, kind, comma_pos)
         
     | 
| 
       36 
38 
     | 
    
         
             
                    return if should_have_comma?(style, node)
         
     | 
| 
       37 
39 
     | 
    
         | 
| 
         @@ -91,9 +93,12 @@ module RuboCop 
     | 
|
| 
       91 
93 
     | 
    
         
             
                  end
         
     | 
| 
       92 
94 
     | 
    
         | 
| 
       93 
95 
     | 
    
         
             
                  def method_name_and_arguments_on_same_line?(node)
         
     | 
| 
       94 
     | 
    
         
            -
                     
     | 
| 
       95 
     | 
    
         
            -
             
     | 
| 
       96 
     | 
    
         
            -
             
     | 
| 
      
 96 
     | 
    
         
            +
                    return false unless node.call_type?
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
                    line = node.loc.selector.nil? ? node.loc.line : node.loc.selector.line
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
                    line == node.last_argument.last_line &&
         
     | 
| 
      
 101 
     | 
    
         
            +
                      node.last_line == node.last_argument.last_line
         
     | 
| 
       97 
102 
     | 
    
         
             
                  end
         
     | 
| 
       98 
103 
     | 
    
         | 
| 
       99 
104 
     | 
    
         
             
                  # A single argument with the closing bracket on the same line as the end
         
     | 
| 
         @@ -11,9 +11,9 @@ module RuboCop 
     | 
|
| 
       11 
11 
     | 
    
         
             
                  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
         
     | 
| 
       12 
12 
     | 
    
         
             
                  # set to false, this cop will register offenses for names ending with
         
     | 
| 
       13 
13 
     | 
    
         
             
                  # numbers. Its default is false. The `AllowedNames` config option
         
     | 
| 
       14 
     | 
    
         
            -
                  # takes an array of  
     | 
| 
      
 14 
     | 
    
         
            +
                  # takes an array of permitted names that will never register an
         
     | 
| 
       15 
15 
     | 
    
         
             
                  # offense. The `ForbiddenNames` config option takes an array of
         
     | 
| 
       16 
     | 
    
         
            -
                  #  
     | 
| 
      
 16 
     | 
    
         
            +
                  # restricted names that will always register an offense.
         
     | 
| 
       17 
17 
     | 
    
         
             
                  #
         
     | 
| 
       18 
18 
     | 
    
         
             
                  # @example
         
     | 
| 
       19 
19 
     | 
    
         
             
                  #   # bad
         
     | 
| 
         @@ -35,7 +35,7 @@ module RuboCop 
     | 
|
| 
       35 
35 
     | 
    
         
             
                  #   foo { |speed, distance| speed * distance }
         
     | 
| 
       36 
36 
     | 
    
         
             
                  #
         
     | 
| 
       37 
37 
     | 
    
         
             
                  #   baz { |age, height, gender| do_stuff(age, height, gender) }
         
     | 
| 
       38 
     | 
    
         
            -
                  class  
     | 
| 
      
 38 
     | 
    
         
            +
                  class BlockParameterName < Cop
         
     | 
| 
       39 
39 
     | 
    
         
             
                    include UncommunicativeName
         
     | 
| 
       40 
40 
     | 
    
         | 
| 
       41 
41 
     | 
    
         
             
                    def on_block(node)
         
     | 
| 
         @@ -50,14 +50,11 @@ module RuboCop 
     | 
|
| 
       50 
50 
     | 
    
         
             
                    def for_bad_filename(file_path)
         
     | 
| 
       51 
51 
     | 
    
         
             
                      basename = File.basename(file_path)
         
     | 
| 
       52 
52 
     | 
    
         
             
                      msg = if filename_good?(basename)
         
     | 
| 
       53 
     | 
    
         
            -
                              return  
     | 
| 
       54 
     | 
    
         
            -
                              return if find_class_or_module(processed_source.ast,
         
     | 
| 
       55 
     | 
    
         
            -
                                                             to_namespace(file_path))
         
     | 
| 
      
 53 
     | 
    
         
            +
                              return if matching_definition?(file_path)
         
     | 
| 
       56 
54 
     | 
    
         | 
| 
       57 
55 
     | 
    
         
             
                              no_definition_message(basename, file_path)
         
     | 
| 
       58 
56 
     | 
    
         
             
                            else
         
     | 
| 
       59 
     | 
    
         
            -
                              return if  
     | 
| 
       60 
     | 
    
         
            -
                                        processed_source.start_with?('#!')
         
     | 
| 
      
 57 
     | 
    
         
            +
                              return if bad_filename_allowed?
         
     | 
| 
       61 
58 
     | 
    
         | 
| 
       62 
59 
     | 
    
         
             
                              other_message(basename)
         
     | 
| 
       63 
60 
     | 
    
         
             
                            end
         
     | 
| 
         @@ -65,6 +62,16 @@ module RuboCop 
     | 
|
| 
       65 
62 
     | 
    
         
             
                      yield source_range(processed_source.buffer, 1, 0), msg
         
     | 
| 
       66 
63 
     | 
    
         
             
                    end
         
     | 
| 
       67 
64 
     | 
    
         | 
| 
      
 65 
     | 
    
         
            +
                    def matching_definition?(file_path)
         
     | 
| 
      
 66 
     | 
    
         
            +
                      return true unless expect_matching_definition?
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                      find_class_or_module(processed_source.ast, to_namespace(file_path))
         
     | 
| 
      
 69 
     | 
    
         
            +
                    end
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                    def bad_filename_allowed?
         
     | 
| 
      
 72 
     | 
    
         
            +
                      ignore_executable_scripts? && processed_source.start_with?('#!')
         
     | 
| 
      
 73 
     | 
    
         
            +
                    end
         
     | 
| 
      
 74 
     | 
    
         
            +
             
     | 
| 
       68 
75 
     | 
    
         
             
                    def no_definition_message(basename, file_path)
         
     | 
| 
       69 
76 
     | 
    
         
             
                      format(MSG_NO_DEFINITION,
         
     | 
| 
       70 
77 
     | 
    
         
             
                             basename: basename,
         
     | 
| 
         @@ -5,7 +5,7 @@ module RuboCop 
     | 
|
| 
       5 
5 
     | 
    
         
             
                module Naming
         
     | 
| 
       6 
6 
     | 
    
         
             
                  # This cop checks that your heredocs are using meaningful delimiters.
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # By default it disallows `END` and `EO*`, and can be configured through
         
     | 
| 
       8 
     | 
    
         
            -
                  #  
     | 
| 
      
 8 
     | 
    
         
            +
                  # forbidden listing additional delimiters.
         
     | 
| 
       9 
9 
     | 
    
         
             
                  #
         
     | 
| 
       10 
10 
     | 
    
         
             
                  # @example
         
     | 
| 
       11 
11 
     | 
    
         
             
                  #
         
     | 
| 
         @@ -41,13 +41,13 @@ module RuboCop 
     | 
|
| 
       41 
41 
     | 
    
         | 
| 
       42 
42 
     | 
    
         
             
                      return false unless delimiters =~ /\w/
         
     | 
| 
       43 
43 
     | 
    
         | 
| 
       44 
     | 
    
         
            -
                       
     | 
| 
       45 
     | 
    
         
            -
                        delimiters =~ Regexp.new( 
     | 
| 
      
 44 
     | 
    
         
            +
                      forbidden_delimiters.none? do |forbidden_delimiter|
         
     | 
| 
      
 45 
     | 
    
         
            +
                        delimiters =~ Regexp.new(forbidden_delimiter)
         
     | 
| 
       46 
46 
     | 
    
         
             
                      end
         
     | 
| 
       47 
47 
     | 
    
         
             
                    end
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
     | 
    
         
            -
                    def  
     | 
| 
       50 
     | 
    
         
            -
                      cop_config[' 
     | 
| 
      
 49 
     | 
    
         
            +
                    def forbidden_delimiters
         
     | 
| 
      
 50 
     | 
    
         
            +
                      cop_config['ForbiddenDelimiters'] || []
         
     | 
| 
       51 
51 
     | 
    
         
             
                    end
         
     | 
| 
       52 
52 
     | 
    
         
             
                  end
         
     | 
| 
       53 
53 
     | 
    
         
             
                end
         
     | 
| 
         @@ -6,6 +6,15 @@ module RuboCop 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  # This cop makes sure that all methods use the configured style,
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # snake_case or camelCase, for their names.
         
     | 
| 
       8 
8 
     | 
    
         
             
                  #
         
     | 
| 
      
 9 
     | 
    
         
            +
                  # This cop has `IgnoredPatterns` configuration option.
         
     | 
| 
      
 10 
     | 
    
         
            +
                  #
         
     | 
| 
      
 11 
     | 
    
         
            +
                  #   Naming/MethodName:
         
     | 
| 
      
 12 
     | 
    
         
            +
                  #     IgnoredPatterns:
         
     | 
| 
      
 13 
     | 
    
         
            +
                  #       - '\A\s*onSelectionBulkChange\s*'
         
     | 
| 
      
 14 
     | 
    
         
            +
                  #       - '\A\s*onSelectionCleared\s*'
         
     | 
| 
      
 15 
     | 
    
         
            +
                  #
         
     | 
| 
      
 16 
     | 
    
         
            +
                  # Method names matching patterns are always allowed.
         
     | 
| 
      
 17 
     | 
    
         
            +
                  #
         
     | 
| 
       9 
18 
     | 
    
         
             
                  # @example EnforcedStyle: snake_case (default)
         
     | 
| 
       10 
19 
     | 
    
         
             
                  #   # bad
         
     | 
| 
       11 
20 
     | 
    
         
             
                  #   def fooBar; end
         
     | 
| 
         @@ -21,11 +30,13 @@ module RuboCop 
     | 
|
| 
       21 
30 
     | 
    
         
             
                  #   def fooBar; end
         
     | 
| 
       22 
31 
     | 
    
         
             
                  class MethodName < Cop
         
     | 
| 
       23 
32 
     | 
    
         
             
                    include ConfigurableNaming
         
     | 
| 
      
 33 
     | 
    
         
            +
                    include IgnoredPattern
         
     | 
| 
       24 
34 
     | 
    
         | 
| 
       25 
35 
     | 
    
         
             
                    MSG = 'Use %<style>s for method names.'
         
     | 
| 
       26 
36 
     | 
    
         | 
| 
       27 
37 
     | 
    
         
             
                    def on_def(node)
         
     | 
| 
       28 
     | 
    
         
            -
                      return if node.operator_method?
         
     | 
| 
      
 38 
     | 
    
         
            +
                      return if node.operator_method? ||
         
     | 
| 
      
 39 
     | 
    
         
            +
                                matches_ignored_pattern?(node.method_name)
         
     | 
| 
       29 
40 
     | 
    
         | 
| 
       30 
41 
     | 
    
         
             
                      check_name(node, node.method_name, node.loc.name)
         
     | 
| 
       31 
42 
     | 
    
         
             
                    end
         
     | 
    
        data/lib/rubocop/cop/naming/{uncommunicative_method_param_name.rb → method_parameter_name.rb}
    RENAMED
    
    | 
         @@ -11,9 +11,9 @@ module RuboCop 
     | 
|
| 
       11 
11 
     | 
    
         
             
                  # The `AllowNamesEndingInNumbers` config option takes a boolean. When
         
     | 
| 
       12 
12 
     | 
    
         
             
                  # set to false, this cop will register offenses for names ending with
         
     | 
| 
       13 
13 
     | 
    
         
             
                  # numbers. Its default is false. The `AllowedNames` config option
         
     | 
| 
       14 
     | 
    
         
            -
                  # takes an array of  
     | 
| 
      
 14 
     | 
    
         
            +
                  # takes an array of permitted names that will never register an
         
     | 
| 
       15 
15 
     | 
    
         
             
                  # offense. The `ForbiddenNames` config option takes an array of
         
     | 
| 
       16 
     | 
    
         
            -
                  #  
     | 
| 
      
 16 
     | 
    
         
            +
                  # restricted names that will always register an offense.
         
     | 
| 
       17 
17 
     | 
    
         
             
                  #
         
     | 
| 
       18 
18 
     | 
    
         
             
                  # @example
         
     | 
| 
       19 
19 
     | 
    
         
             
                  #   # bad
         
     | 
| 
         @@ -43,7 +43,7 @@ module RuboCop 
     | 
|
| 
       43 
43 
     | 
    
         
             
                  #   def baz(age_a, height_b, gender_c)
         
     | 
| 
       44 
44 
     | 
    
         
             
                  #     do_stuff(age_a, height_b, gender_c)
         
     | 
| 
       45 
45 
     | 
    
         
             
                  #   end
         
     | 
| 
       46 
     | 
    
         
            -
                  class  
     | 
| 
      
 46 
     | 
    
         
            +
                  class MethodParameterName < Cop
         
     | 
| 
       47 
47 
     | 
    
         
             
                    include UncommunicativeName
         
     | 
| 
       48 
48 
     | 
    
         | 
| 
       49 
49 
     | 
    
         
             
                    def on_def(node)
         
     | 
| 
         @@ -70,11 +70,11 @@ module RuboCop 
     | 
|
| 
       70 
70 
     | 
    
         
             
                      !method_name.match(/^#{prefix}[^0-9]/) ||
         
     | 
| 
       71 
71 
     | 
    
         
             
                        method_name == expected_name(method_name, prefix) ||
         
     | 
| 
       72 
72 
     | 
    
         
             
                        method_name.end_with?('=') ||
         
     | 
| 
       73 
     | 
    
         
            -
                         
     | 
| 
      
 73 
     | 
    
         
            +
                        allowed_methods.include?(method_name)
         
     | 
| 
       74 
74 
     | 
    
         
             
                    end
         
     | 
| 
       75 
75 
     | 
    
         | 
| 
       76 
76 
     | 
    
         
             
                    def expected_name(method_name, prefix)
         
     | 
| 
       77 
     | 
    
         
            -
                      new_name = if  
     | 
| 
      
 77 
     | 
    
         
            +
                      new_name = if forbidden_prefixes.include?(prefix)
         
     | 
| 
       78 
78 
     | 
    
         
             
                                   method_name.sub(prefix, '')
         
     | 
| 
       79 
79 
     | 
    
         
             
                                 else
         
     | 
| 
       80 
80 
     | 
    
         
             
                                   method_name.dup
         
     | 
| 
         @@ -87,16 +87,16 @@ module RuboCop 
     | 
|
| 
       87 
87 
     | 
    
         
             
                      "Rename `#{method_name}` to `#{new_name}`."
         
     | 
| 
       88 
88 
     | 
    
         
             
                    end
         
     | 
| 
       89 
89 
     | 
    
         | 
| 
       90 
     | 
    
         
            -
                    def  
     | 
| 
       91 
     | 
    
         
            -
                      cop_config[' 
     | 
| 
      
 90 
     | 
    
         
            +
                    def forbidden_prefixes
         
     | 
| 
      
 91 
     | 
    
         
            +
                      cop_config['ForbiddenPrefixes']
         
     | 
| 
       92 
92 
     | 
    
         
             
                    end
         
     | 
| 
       93 
93 
     | 
    
         | 
| 
       94 
94 
     | 
    
         
             
                    def predicate_prefixes
         
     | 
| 
       95 
95 
     | 
    
         
             
                      cop_config['NamePrefix']
         
     | 
| 
       96 
96 
     | 
    
         
             
                    end
         
     | 
| 
       97 
97 
     | 
    
         | 
| 
       98 
     | 
    
         
            -
                    def  
     | 
| 
       99 
     | 
    
         
            -
                      cop_config[' 
     | 
| 
      
 98 
     | 
    
         
            +
                    def allowed_methods
         
     | 
| 
      
 99 
     | 
    
         
            +
                      cop_config['AllowedMethods']
         
     | 
| 
       100 
100 
     | 
    
         
             
                    end
         
     | 
| 
       101 
101 
     | 
    
         | 
| 
       102 
102 
     | 
    
         
             
                    def method_definition_macros(macro_name)
         
     | 
    
        data/lib/rubocop/cop/offense.rb
    CHANGED
    
    | 
         @@ -67,23 +67,45 @@ module RuboCop 
     | 
|
| 
       67 
67 
     | 
    
         | 
| 
       68 
68 
     | 
    
         
             
                  # @api public
         
     | 
| 
       69 
69 
     | 
    
         
             
                  #
         
     | 
| 
       70 
     | 
    
         
            -
                  # @!attribute [r]  
     | 
| 
      
 70 
     | 
    
         
            +
                  # @!attribute [r] correctable?
         
     | 
| 
       71 
71 
     | 
    
         
             
                  #
         
     | 
| 
       72 
72 
     | 
    
         
             
                  # @return [Boolean]
         
     | 
| 
       73 
     | 
    
         
            -
                  #   whether this offense  
     | 
| 
       74 
     | 
    
         
            -
                   
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
      
 73 
     | 
    
         
            +
                  #   whether this offense can be automatically corrected via
         
     | 
| 
      
 74 
     | 
    
         
            +
                  #   autocorrect or a todo.
         
     | 
| 
      
 75 
     | 
    
         
            +
                  def correctable?
         
     | 
| 
      
 76 
     | 
    
         
            +
                    @status != :unsupported
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  # @api public
         
     | 
| 
      
 80 
     | 
    
         
            +
                  #
         
     | 
| 
      
 81 
     | 
    
         
            +
                  # @!attribute [r] corrected?
         
     | 
| 
      
 82 
     | 
    
         
            +
                  #
         
     | 
| 
      
 83 
     | 
    
         
            +
                  # @return [Boolean]
         
     | 
| 
      
 84 
     | 
    
         
            +
                  #   whether this offense is automatically corrected via
         
     | 
| 
      
 85 
     | 
    
         
            +
                  #   autocorrect or a todo.
         
     | 
| 
      
 86 
     | 
    
         
            +
                  def corrected?
         
     | 
| 
      
 87 
     | 
    
         
            +
                    @status == :corrected || @status == :corrected_with_todo
         
     | 
| 
      
 88 
     | 
    
         
            +
                  end
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                  # @api public
         
     | 
| 
      
 91 
     | 
    
         
            +
                  #
         
     | 
| 
      
 92 
     | 
    
         
            +
                  # @!attribute [r] corrected_with_todo?
         
     | 
| 
      
 93 
     | 
    
         
            +
                  #
         
     | 
| 
      
 94 
     | 
    
         
            +
                  # @return [Boolean]
         
     | 
| 
      
 95 
     | 
    
         
            +
                  #   whether this offense is automatically disabled via a todo.
         
     | 
| 
      
 96 
     | 
    
         
            +
                  def corrected_with_todo?
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @status == :corrected_with_todo
         
     | 
| 
       76 
98 
     | 
    
         
             
                  end
         
     | 
| 
       77 
     | 
    
         
            -
                  alias corrected? corrected
         
     | 
| 
       78 
99 
     | 
    
         | 
| 
       79 
100 
     | 
    
         
             
                  # @api public
         
     | 
| 
       80 
101 
     | 
    
         
             
                  #
         
     | 
| 
       81 
102 
     | 
    
         
             
                  # @!attribute [r] disabled?
         
     | 
| 
       82 
103 
     | 
    
         
             
                  #
         
     | 
| 
       83 
104 
     | 
    
         
             
                  # @return [Boolean]
         
     | 
| 
       84 
     | 
    
         
            -
                  #   whether this offense was locally disabled  
     | 
| 
      
 105 
     | 
    
         
            +
                  #   whether this offense was locally disabled with a
         
     | 
| 
      
 106 
     | 
    
         
            +
                  #   disable or todo where it occurred.
         
     | 
| 
       85 
107 
     | 
    
         
             
                  def disabled?
         
     | 
| 
       86 
     | 
    
         
            -
                    @status == :disabled
         
     | 
| 
      
 108 
     | 
    
         
            +
                    @status == :disabled || @status == :todo
         
     | 
| 
       87 
109 
     | 
    
         
             
                  end
         
     | 
| 
       88 
110 
     | 
    
         | 
| 
       89 
111 
     | 
    
         
             
                  # @api public
         
     | 
    
        data/lib/rubocop/cop/registry.rb
    CHANGED
    
    | 
         @@ -91,8 +91,11 @@ module RuboCop 
     | 
|
| 
       91 
91 
     | 
    
         
             
                  # @note Emits a warning if the provided name has an incorrect namespace
         
     | 
| 
       92 
92 
     | 
    
         
             
                  #
         
     | 
| 
       93 
93 
     | 
    
         
             
                  # @return [String] Qualified cop name
         
     | 
| 
       94 
     | 
    
         
            -
                  def qualified_cop_name(name, path)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  def qualified_cop_name(name, path, shall_warn = true)
         
     | 
| 
       95 
95 
     | 
    
         
             
                    badge = Badge.parse(name)
         
     | 
| 
      
 96 
     | 
    
         
            +
                    if shall_warn && department_missing?(badge, name)
         
     | 
| 
      
 97 
     | 
    
         
            +
                      print_warning(name, path)
         
     | 
| 
      
 98 
     | 
    
         
            +
                    end
         
     | 
| 
       96 
99 
     | 
    
         
             
                    return name if registered?(badge)
         
     | 
| 
       97 
100 
     | 
    
         | 
| 
       98 
101 
     | 
    
         
             
                    potential_badges = qualify_badge(badge)
         
     | 
| 
         @@ -104,6 +107,24 @@ module RuboCop 
     | 
|
| 
       104 
107 
     | 
    
         
             
                    end
         
     | 
| 
       105 
108 
     | 
    
         
             
                  end
         
     | 
| 
       106 
109 
     | 
    
         | 
| 
      
 110 
     | 
    
         
            +
                  def department_missing?(badge, name)
         
     | 
| 
      
 111 
     | 
    
         
            +
                    !badge.qualified? && unqualified_cop_names.include?(name)
         
     | 
| 
      
 112 
     | 
    
         
            +
                  end
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                  def print_warning(name, path)
         
     | 
| 
      
 115 
     | 
    
         
            +
                    message = "#{path}: Warning: no department given for #{name}."
         
     | 
| 
      
 116 
     | 
    
         
            +
                    if path.end_with?('.rb')
         
     | 
| 
      
 117 
     | 
    
         
            +
                      message += ' Run `rubocop -a --only Migration/DepartmentName` to fix.'
         
     | 
| 
      
 118 
     | 
    
         
            +
                    end
         
     | 
| 
      
 119 
     | 
    
         
            +
                    warn message
         
     | 
| 
      
 120 
     | 
    
         
            +
                  end
         
     | 
| 
      
 121 
     | 
    
         
            +
             
     | 
| 
      
 122 
     | 
    
         
            +
                  def unqualified_cop_names
         
     | 
| 
      
 123 
     | 
    
         
            +
                    @unqualified_cop_names ||=
         
     | 
| 
      
 124 
     | 
    
         
            +
                      Set.new(@cops_by_cop_name.keys.map { |qn| File.basename(qn) }) <<
         
     | 
| 
      
 125 
     | 
    
         
            +
                      'RedundantCopDisableDirective'
         
     | 
| 
      
 126 
     | 
    
         
            +
                  end
         
     | 
| 
      
 127 
     | 
    
         
            +
             
     | 
| 
       107 
128 
     | 
    
         
             
                  # @return [Hash{String => Array<Class>}]
         
     | 
| 
       108 
129 
     | 
    
         
             
                  def to_h
         
     | 
| 
       109 
130 
     | 
    
         
             
                    @cops_by_cop_name
         
     | 
| 
         @@ -3,7 +3,7 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            module RuboCop
         
     | 
| 
       4 
4 
     | 
    
         
             
              module Cop
         
     | 
| 
       5 
5 
     | 
    
         
             
                module Style
         
     | 
| 
       6 
     | 
    
         
            -
                  # This cop checks for uses of " 
     | 
| 
      
 6 
     | 
    
         
            +
                  # This cop checks for uses of "\*" as a substitute for *join*.
         
     | 
| 
       7 
7 
     | 
    
         
             
                  #
         
     | 
| 
       8 
8 
     | 
    
         
             
                  # Not all cases can reliably checked, due to Ruby's dynamic
         
     | 
| 
       9 
9 
     | 
    
         
             
                  # types, so we consider only cases when the first argument is an
         
     | 
| 
         @@ -21,6 +21,10 @@ module RuboCop 
     | 
|
| 
       21 
21 
     | 
    
         | 
| 
       22 
22 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
       23 
23 
     | 
    
         
             
                      return unless node.command?(:attr) && node.arguments?
         
     | 
| 
      
 24 
     | 
    
         
            +
                      # check only for method definitions in class/module body
         
     | 
| 
      
 25 
     | 
    
         
            +
                      return if node.parent &&
         
     | 
| 
      
 26 
     | 
    
         
            +
                                !node.parent.class_type? &&
         
     | 
| 
      
 27 
     | 
    
         
            +
                                !class_eval?(node.parent)
         
     | 
| 
       24 
28 
     | 
    
         | 
| 
       25 
29 
     | 
    
         
             
                      add_offense(node, location: :selector)
         
     | 
| 
       26 
30 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -31,7 +35,7 @@ module RuboCop 
     | 
|
| 
       31 
35 
     | 
    
         
             
                      node_expr = node.source_range
         
     | 
| 
       32 
36 
     | 
    
         
             
                      attr_expr = attr_name.source_range
         
     | 
| 
       33 
37 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
                      if setter 
     | 
| 
      
 38 
     | 
    
         
            +
                      if setter&.boolean_type?
         
     | 
| 
       35 
39 
     | 
    
         
             
                        remove = range_between(attr_expr.end_pos, node_expr.end_pos)
         
     | 
| 
       36 
40 
     | 
    
         
             
                      end
         
     | 
| 
       37 
41 
     | 
    
         | 
| 
         @@ -50,12 +54,16 @@ module RuboCop 
     | 
|
| 
       50 
54 
     | 
    
         
             
                    def replacement_method(node)
         
     | 
| 
       51 
55 
     | 
    
         
             
                      setter = node.last_argument
         
     | 
| 
       52 
56 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
                      if setter 
     | 
| 
      
 57 
     | 
    
         
            +
                      if setter&.boolean_type?
         
     | 
| 
       54 
58 
     | 
    
         
             
                        setter.true_type? ? 'attr_accessor' : 'attr_reader'
         
     | 
| 
       55 
59 
     | 
    
         
             
                      else
         
     | 
| 
       56 
60 
     | 
    
         
             
                        'attr_reader'
         
     | 
| 
       57 
61 
     | 
    
         
             
                      end
         
     | 
| 
       58 
62 
     | 
    
         
             
                    end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                    def_node_matcher :class_eval?, <<~PATTERN
         
     | 
| 
      
 65 
     | 
    
         
            +
                      (block (send _ {:class_eval :module_eval}) ...)
         
     | 
| 
      
 66 
     | 
    
         
            +
                    PATTERN
         
     | 
| 
       59 
67 
     | 
    
         
             
                  end
         
     | 
| 
       60 
68 
     | 
    
         
             
                end
         
     | 
| 
       61 
69 
     | 
    
         
             
              end
         
     | 
| 
         @@ -114,7 +114,8 @@ module RuboCop 
     | 
|
| 
       114 
114 
     | 
    
         | 
| 
       115 
115 
     | 
    
         
             
                    def on_send(node)
         
     | 
| 
       116 
116 
     | 
    
         
             
                      return unless node.arguments?
         
     | 
| 
       117 
     | 
    
         
            -
                      return if node.parenthesized? 
     | 
| 
      
 117 
     | 
    
         
            +
                      return if node.parenthesized?
         
     | 
| 
      
 118 
     | 
    
         
            +
                      return if node.operator_method? || node.assignment_method?
         
     | 
| 
       118 
119 
     | 
    
         | 
| 
       119 
120 
     | 
    
         
             
                      node.arguments.each do |arg|
         
     | 
| 
       120 
121 
     | 
    
         
             
                        get_blocks(arg) do |block|
         
     | 
| 
         @@ -55,10 +55,6 @@ module RuboCop 
     | 
|
| 
       55 
55 
     | 
    
         
             
                    end
         
     | 
| 
       56 
56 
     | 
    
         
             
                    alias on_csend on_send
         
     | 
| 
       57 
57 
     | 
    
         | 
| 
       58 
     | 
    
         
            -
                    # We let AutocorrectUnlessChangingAST#autocorrect work with the send
         
     | 
| 
       59 
     | 
    
         
            -
                    # node, because that context is needed. When parsing the code to see if
         
     | 
| 
       60 
     | 
    
         
            -
                    # the AST has changed, a braceless hash would not be parsed as a hash
         
     | 
| 
       61 
     | 
    
         
            -
                    # otherwise.
         
     | 
| 
       62 
58 
     | 
    
         
             
                    def autocorrect(send_node)
         
     | 
| 
       63 
59 
     | 
    
         
             
                      hash_node = send_node.last_argument
         
     | 
| 
       64 
60 
     | 
    
         | 
| 
         @@ -76,20 +72,32 @@ module RuboCop 
     | 
|
| 
       76 
72 
     | 
    
         
             
                    private
         
     | 
| 
       77 
73 
     | 
    
         | 
| 
       78 
74 
     | 
    
         
             
                    def check(arg, args)
         
     | 
| 
       79 
     | 
    
         
            -
                       
     | 
| 
       80 
     | 
    
         
            -
             
     | 
| 
       81 
     | 
    
         
            -
             
     | 
| 
       82 
     | 
    
         
            -
             
     | 
| 
       83 
     | 
    
         
            -
             
     | 
| 
      
 75 
     | 
    
         
            +
                      case style
         
     | 
| 
      
 76 
     | 
    
         
            +
                      when :braces
         
     | 
| 
      
 77 
     | 
    
         
            +
                        check_braces(arg)
         
     | 
| 
      
 78 
     | 
    
         
            +
                      when :no_braces
         
     | 
| 
      
 79 
     | 
    
         
            +
                        check_no_braces(arg)
         
     | 
| 
      
 80 
     | 
    
         
            +
                      when :context_dependent
         
     | 
| 
       84 
81 
     | 
    
         
             
                        check_context_dependent(arg, args)
         
     | 
| 
       85 
82 
     | 
    
         
             
                      end
         
     | 
| 
       86 
83 
     | 
    
         
             
                    end
         
     | 
| 
       87 
84 
     | 
    
         | 
| 
      
 85 
     | 
    
         
            +
                    def check_braces(arg)
         
     | 
| 
      
 86 
     | 
    
         
            +
                      add_arg_offense(arg, :missing) unless arg.braces?
         
     | 
| 
      
 87 
     | 
    
         
            +
                    end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                    def check_no_braces(arg)
         
     | 
| 
      
 90 
     | 
    
         
            +
                      return unless arg.braces? && !braces_needed_for_semantics?(arg)
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                      add_arg_offense(arg, :redundant)
         
     | 
| 
      
 93 
     | 
    
         
            +
                    end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
       88 
95 
     | 
    
         
             
                    def check_context_dependent(arg, args)
         
     | 
| 
       89 
96 
     | 
    
         
             
                      braces_around_second_from_end = args.size > 1 && args[-2].hash_type?
         
     | 
| 
       90 
97 
     | 
    
         | 
| 
       91 
98 
     | 
    
         
             
                      if arg.braces?
         
     | 
| 
       92 
     | 
    
         
            -
                        unless braces_around_second_from_end
         
     | 
| 
      
 99 
     | 
    
         
            +
                        unless braces_around_second_from_end ||
         
     | 
| 
      
 100 
     | 
    
         
            +
                               braces_needed_for_semantics?(arg)
         
     | 
| 
       93 
101 
     | 
    
         
             
                          add_arg_offense(arg, :redundant)
         
     | 
| 
       94 
102 
     | 
    
         
             
                        end
         
     | 
| 
       95 
103 
     | 
    
         
             
                      elsif braces_around_second_from_end
         
     | 
| 
         @@ -97,6 +105,17 @@ module RuboCop 
     | 
|
| 
       97 
105 
     | 
    
         
             
                      end
         
     | 
| 
       98 
106 
     | 
    
         
             
                    end
         
     | 
| 
       99 
107 
     | 
    
         | 
| 
      
 108 
     | 
    
         
            +
                    # Returns true if there's block inside the braces of the given hash arg
         
     | 
| 
      
 109 
     | 
    
         
            +
                    # and that block uses do..end. The reason for wanting to check this is
         
     | 
| 
      
 110 
     | 
    
         
            +
                    # that the do..end could bind to a different method invocation if the
         
     | 
| 
      
 111 
     | 
    
         
            +
                    # hash braces were removed.
         
     | 
| 
      
 112 
     | 
    
         
            +
                    def braces_needed_for_semantics?(arg)
         
     | 
| 
      
 113 
     | 
    
         
            +
                      arg.each_pair do |_key, value|
         
     | 
| 
      
 114 
     | 
    
         
            +
                        return true if value.block_type? && !value.braces?
         
     | 
| 
      
 115 
     | 
    
         
            +
                      end
         
     | 
| 
      
 116 
     | 
    
         
            +
                      false
         
     | 
| 
      
 117 
     | 
    
         
            +
                    end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
       100 
119 
     | 
    
         
             
                    def add_arg_offense(arg, type)
         
     | 
| 
       101 
120 
     | 
    
         
             
                      add_offense(arg.parent, location: arg.source_range,
         
     | 
| 
       102 
121 
     | 
    
         
             
                                              message: format(MSG,
         
     | 
| 
         @@ -128,16 +147,16 @@ module RuboCop 
     | 
|
| 
       128 
147 
     | 
    
         
             
                    end
         
     | 
| 
       129 
148 
     | 
    
         | 
| 
       130 
149 
     | 
    
         
             
                    def remove_braces_with_whitespace(corrector, node, space)
         
     | 
| 
      
 150 
     | 
    
         
            +
                      loc = node.loc
         
     | 
| 
      
 151 
     | 
    
         
            +
             
     | 
| 
       131 
152 
     | 
    
         
             
                      if node.multiline?
         
     | 
| 
       132 
153 
     | 
    
         
             
                        remove_braces_with_range(corrector,
         
     | 
| 
       133 
     | 
    
         
            -
                                                 left_whole_line_range( 
     | 
| 
       134 
     | 
    
         
            -
                                                 right_whole_line_range( 
     | 
| 
      
 154 
     | 
    
         
            +
                                                 left_whole_line_range(loc.begin),
         
     | 
| 
      
 155 
     | 
    
         
            +
                                                 right_whole_line_range(loc.end))
         
     | 
| 
       135 
156 
     | 
    
         
             
                      else
         
     | 
| 
       136 
     | 
    
         
            -
                        right_brace_and_space = right_brace_and_space(node.loc.end, space)
         
     | 
| 
       137 
     | 
    
         
            -
                        left_brace_and_space = left_brace_and_space(node.loc.begin, space)
         
     | 
| 
       138 
157 
     | 
    
         
             
                        remove_braces_with_range(corrector,
         
     | 
| 
       139 
     | 
    
         
            -
                                                 left_brace_and_space,
         
     | 
| 
       140 
     | 
    
         
            -
                                                 right_brace_and_space)
         
     | 
| 
      
 158 
     | 
    
         
            +
                                                 left_brace_and_space(loc.begin, space),
         
     | 
| 
      
 159 
     | 
    
         
            +
                                                 right_brace_and_space(loc.end, space))
         
     | 
| 
       141 
160 
     | 
    
         
             
                      end
         
     | 
| 
       142 
161 
     | 
    
         
             
                    end
         
     | 
| 
       143 
162 
     | 
    
         |