rubocop 0.73.0 → 0.77.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/bin/console +1 -0
 - data/config/default.yml +332 -295
 - data/lib/rubocop.rb +46 -30
 - data/lib/rubocop/ast/builder.rb +1 -0
 - data/lib/rubocop/ast/node.rb +6 -8
 - 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 +28 -537
 - data/lib/rubocop/config_loader.rb +21 -3
 - data/lib/rubocop/config_loader_resolver.rb +4 -3
 - data/lib/rubocop/config_obsoletion.rb +275 -0
 - data/lib/rubocop/config_validator.rb +246 -0
 - data/lib/rubocop/cop/autocorrect_logic.rb +2 -2
 - data/lib/rubocop/cop/bundler/gem_comment.rb +4 -4
 - data/lib/rubocop/cop/commissioner.rb +15 -7
 - data/lib/rubocop/cop/cop.rb +33 -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 +15 -60
 - data/lib/rubocop/cop/layout/{indent_first_argument.rb → first_argument_indentation.rb} +12 -10
 - 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} +2 -2
 - data/lib/rubocop/cop/layout/indentation_width.rb +19 -5
 - data/lib/rubocop/cop/layout/{leading_blank_lines.rb → leading_empty_lines.rb} +1 -1
 - 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 +43 -24
 - 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 +24 -40
 - 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 -3
 - 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/empty_interpolation.rb +4 -4
 - data/lib/rubocop/cop/lint/erb_new_arguments.rb +61 -4
 - 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/literal_in_interpolation.rb +7 -8
 - 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/number_conversion.rb +1 -1
 - data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +24 -24
 - data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
 - 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} +12 -7
 - data/lib/rubocop/cop/lint/{string_conversion_in_interpolation.rb → redundant_string_coercion.rb} +7 -7
 - 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/line_length.rb +48 -42
 - 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 +1 -1
 - data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -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/interpolation.rb +27 -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/preceding_following_alignment.rb +87 -0
 - data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
 - data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
 - data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
 - 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 +18 -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 +2 -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 +16 -30
 - data/lib/rubocop/cop/style/conditional_assignment.rb +5 -7
 - data/lib/rubocop/cop/style/constant_visibility.rb +13 -2
 - 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 +39 -10
 - data/lib/rubocop/cop/style/hash_syntax.rb +2 -2
 - data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -15
 - data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
 - 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/lambda.rb +0 -2
 - 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_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_method_end_statement.rb +4 -6
 - data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
 - data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
 - 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/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/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 +3 -1
 - data/lib/rubocop/options.rb +17 -22
 - data/lib/rubocop/path_util.rb +1 -1
 - data/lib/rubocop/processed_source.rb +5 -1
 - data/lib/rubocop/rake_task.rb +1 -0
 - data/lib/rubocop/result_cache.rb +22 -8
 - data/lib/rubocop/rspec/expect_offense.rb +4 -1
 - data/lib/rubocop/runner.rb +55 -32
 - data/lib/rubocop/target_finder.rb +12 -6
 - data/lib/rubocop/version.rb +1 -1
 - metadata +47 -32
 - data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
 - data/lib/rubocop/cop/mixin/safe_mode.rb +0 -22
 
| 
         @@ -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,34 @@ module RuboCop 
     | 
|
| 
       67 
67 
     | 
    
         | 
| 
       68 
68 
     | 
    
         
             
                  # @api public
         
     | 
| 
       69 
69 
     | 
    
         
             
                  #
         
     | 
| 
       70 
     | 
    
         
            -
                  # @!attribute [r] corrected
         
     | 
| 
      
 70 
     | 
    
         
            +
                  # @!attribute [r] corrected?
         
     | 
| 
       71 
71 
     | 
    
         
             
                  #
         
     | 
| 
       72 
72 
     | 
    
         
             
                  # @return [Boolean]
         
     | 
| 
       73 
     | 
    
         
            -
                  #   whether this offense is automatically corrected 
     | 
| 
       74 
     | 
    
         
            -
                   
     | 
| 
       75 
     | 
    
         
            -
             
     | 
| 
      
 73 
     | 
    
         
            +
                  #   whether this offense is automatically corrected via
         
     | 
| 
      
 74 
     | 
    
         
            +
                  #   autocorrect or a todo.
         
     | 
| 
      
 75 
     | 
    
         
            +
                  def corrected?
         
     | 
| 
      
 76 
     | 
    
         
            +
                    @status == :corrected || @status == :corrected_with_todo
         
     | 
| 
      
 77 
     | 
    
         
            +
                  end
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
                  # @api public
         
     | 
| 
      
 80 
     | 
    
         
            +
                  #
         
     | 
| 
      
 81 
     | 
    
         
            +
                  # @!attribute [r] corrected_with_todo?
         
     | 
| 
      
 82 
     | 
    
         
            +
                  #
         
     | 
| 
      
 83 
     | 
    
         
            +
                  # @return [Boolean]
         
     | 
| 
      
 84 
     | 
    
         
            +
                  #   whether this offense is automatically disabled via a todo.
         
     | 
| 
      
 85 
     | 
    
         
            +
                  def corrected_with_todo?
         
     | 
| 
      
 86 
     | 
    
         
            +
                    @status == :corrected_with_todo
         
     | 
| 
       76 
87 
     | 
    
         
             
                  end
         
     | 
| 
       77 
     | 
    
         
            -
                  alias corrected? corrected
         
     | 
| 
       78 
88 
     | 
    
         | 
| 
       79 
89 
     | 
    
         
             
                  # @api public
         
     | 
| 
       80 
90 
     | 
    
         
             
                  #
         
     | 
| 
       81 
91 
     | 
    
         
             
                  # @!attribute [r] disabled?
         
     | 
| 
       82 
92 
     | 
    
         
             
                  #
         
     | 
| 
       83 
93 
     | 
    
         
             
                  # @return [Boolean]
         
     | 
| 
       84 
     | 
    
         
            -
                  #   whether this offense was locally disabled  
     | 
| 
      
 94 
     | 
    
         
            +
                  #   whether this offense was locally disabled with a
         
     | 
| 
      
 95 
     | 
    
         
            +
                  #   disable or todo where it occurred.
         
     | 
| 
       85 
96 
     | 
    
         
             
                  def disabled?
         
     | 
| 
       86 
     | 
    
         
            -
                    @status == :disabled
         
     | 
| 
      
 97 
     | 
    
         
            +
                    @status == :disabled || @status == :todo
         
     | 
| 
       87 
98 
     | 
    
         
             
                  end
         
     | 
| 
       88 
99 
     | 
    
         | 
| 
       89 
100 
     | 
    
         
             
                  # @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
         
     | 
| 
         @@ -31,7 +31,7 @@ module RuboCop 
     | 
|
| 
       31 
31 
     | 
    
         
             
                      node_expr = node.source_range
         
     | 
| 
       32 
32 
     | 
    
         
             
                      attr_expr = attr_name.source_range
         
     | 
| 
       33 
33 
     | 
    
         | 
| 
       34 
     | 
    
         
            -
                      if setter 
     | 
| 
      
 34 
     | 
    
         
            +
                      if setter&.boolean_type?
         
     | 
| 
       35 
35 
     | 
    
         
             
                        remove = range_between(attr_expr.end_pos, node_expr.end_pos)
         
     | 
| 
       36 
36 
     | 
    
         
             
                      end
         
     | 
| 
       37 
37 
     | 
    
         | 
| 
         @@ -50,7 +50,7 @@ module RuboCop 
     | 
|
| 
       50 
50 
     | 
    
         
             
                    def replacement_method(node)
         
     | 
| 
       51 
51 
     | 
    
         
             
                      setter = node.last_argument
         
     | 
| 
       52 
52 
     | 
    
         | 
| 
       53 
     | 
    
         
            -
                      if setter 
     | 
| 
      
 53 
     | 
    
         
            +
                      if setter&.boolean_type?
         
     | 
| 
       54 
54 
     | 
    
         
             
                        setter.true_type? ? 'attr_accessor' : 'attr_reader'
         
     | 
| 
       55 
55 
     | 
    
         
             
                      else
         
     | 
| 
       56 
56 
     | 
    
         
             
                        'attr_reader'
         
     | 
| 
         @@ -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 
     | 
    
         | 
| 
         @@ -49,10 +49,10 @@ module RuboCop 
     | 
|
| 
       49 
49 
     | 
    
         
             
                        next unless annotation?(comment) &&
         
     | 
| 
       50 
50 
     | 
    
         
             
                                    !correct_annotation?(first_word, colon, space, note)
         
     | 
| 
       51 
51 
     | 
    
         | 
| 
       52 
     | 
    
         
            -
                        length = concat_length(first_word, colon, space)
         
     | 
| 
       53 
52 
     | 
    
         
             
                        add_offense(
         
     | 
| 
       54 
53 
     | 
    
         
             
                          comment,
         
     | 
| 
       55 
     | 
    
         
            -
                          location: annotation_range(comment, margin, 
     | 
| 
      
 54 
     | 
    
         
            +
                          location: annotation_range(comment, margin,
         
     | 
| 
      
 55 
     | 
    
         
            +
                                                     first_word, colon, space),
         
     | 
| 
       56 
56 
     | 
    
         
             
                          message: format(note ? MSG : MISSING_NOTE, keyword: first_word)
         
     | 
| 
       57 
57 
     | 
    
         
             
                        )
         
     | 
| 
       58 
58 
     | 
    
         
             
                      end
         
     | 
| 
         @@ -62,8 +62,7 @@ module RuboCop 
     | 
|
| 
       62 
62 
     | 
    
         
             
                      margin, first_word, colon, space, note = split_comment(comment)
         
     | 
| 
       63 
63 
     | 
    
         
             
                      return if note.nil?
         
     | 
| 
       64 
64 
     | 
    
         | 
| 
       65 
     | 
    
         
            -
                       
     | 
| 
       66 
     | 
    
         
            -
                      range = annotation_range(comment, margin, length)
         
     | 
| 
      
 65 
     | 
    
         
            +
                      range = annotation_range(comment, margin, first_word, colon, space)
         
     | 
| 
       67 
66 
     | 
    
         | 
| 
       68 
67 
     | 
    
         
             
                      ->(corrector) { corrector.replace(range, "#{first_word.upcase}: ") }
         
     | 
| 
       69 
68 
     | 
    
         
             
                    end
         
     | 
| 
         @@ -79,8 +78,9 @@ module RuboCop 
     | 
|
| 
       79 
78 
     | 
    
         
             
                      !comment_line?(comment.loc.expression.source_line)
         
     | 
| 
       80 
79 
     | 
    
         
             
                    end
         
     | 
| 
       81 
80 
     | 
    
         | 
| 
       82 
     | 
    
         
            -
                    def annotation_range(comment, margin,  
     | 
| 
      
 81 
     | 
    
         
            +
                    def annotation_range(comment, margin, first_word, colon, space)
         
     | 
| 
       83 
82 
     | 
    
         
             
                      start = comment.loc.expression.begin_pos + margin.length
         
     | 
| 
      
 83 
     | 
    
         
            +
                      length = concat_length(first_word, colon, space)
         
     | 
| 
       84 
84 
     | 
    
         
             
                      range_between(start, start + length)
         
     | 
| 
       85 
85 
     | 
    
         
             
                    end
         
     | 
| 
       86 
86 
     | 
    
         | 
| 
         @@ -6,7 +6,8 @@ module RuboCop 
     | 
|
| 
       6 
6 
     | 
    
         
             
                  # This cop checks for comments put on the same line as some keywords.
         
     | 
| 
       7 
7 
     | 
    
         
             
                  # These keywords are: `begin`, `class`, `def`, `end`, `module`.
         
     | 
| 
       8 
8 
     | 
    
         
             
                  #
         
     | 
| 
       9 
     | 
    
         
            -
                  # Note that some comments 
     | 
| 
      
 9 
     | 
    
         
            +
                  # Note that some comments
         
     | 
| 
      
 10 
     | 
    
         
            +
                  # (`:nodoc:`, `:yields:`, `rubocop:disable` and `rubocop:todo`)
         
     | 
| 
       10 
11 
     | 
    
         
             
                  # are allowed.
         
     | 
| 
       11 
12 
     | 
    
         
             
                  #
         
     | 
| 
       12 
13 
     | 
    
         
             
                  # @example
         
     | 
| 
         @@ -33,53 +34,38 @@ module RuboCop 
     | 
|
| 
       33 
34 
     | 
    
         
             
                  #     y
         
     | 
| 
       34 
35 
     | 
    
         
             
                  #   end
         
     | 
| 
       35 
36 
     | 
    
         
             
                  class CommentedKeyword < Cop
         
     | 
| 
       36 
     | 
    
         
            -
                    include RangeHelp
         
     | 
| 
       37 
     | 
    
         
            -
             
     | 
| 
       38 
37 
     | 
    
         
             
                    MSG = 'Do not place comments on the same line as the ' \
         
     | 
| 
       39 
38 
     | 
    
         
             
                          '`%<keyword>s` keyword.'
         
     | 
| 
       40 
39 
     | 
    
         | 
| 
       41 
40 
     | 
    
         
             
                    def investigate(processed_source)
         
     | 
| 
       42 
     | 
    
         
            -
                      heredoc_lines = extract_heredoc_lines(processed_source.ast)
         
     | 
| 
       43 
     | 
    
         
            -
             
     | 
| 
       44 
41 
     | 
    
         
             
                      processed_source.each_comment do |comment|
         
     | 
| 
       45 
     | 
    
         
            -
                         
     | 
| 
       46 
     | 
    
         
            -
                        line_position = location.line
         
     | 
| 
       47 
     | 
    
         
            -
                        line = processed_source.lines[line_position - 1]
         
     | 
| 
       48 
     | 
    
         
            -
                        next if heredoc_lines.any? { |r| r.include?(line_position) }
         
     | 
| 
       49 
     | 
    
         
            -
                        next unless offensive?(line)
         
     | 
| 
       50 
     | 
    
         
            -
             
     | 
| 
       51 
     | 
    
         
            -
                        range = source_range(processed_source.buffer,
         
     | 
| 
       52 
     | 
    
         
            -
                                             line_position,
         
     | 
| 
       53 
     | 
    
         
            -
                                             (location.column)...(location.last_column))
         
     | 
| 
       54 
     | 
    
         
            -
             
     | 
| 
       55 
     | 
    
         
            -
                        add_offense(range, location: range)
         
     | 
| 
      
 42 
     | 
    
         
            +
                        add_offense(comment) if offensive?(comment)
         
     | 
| 
       56 
43 
     | 
    
         
             
                      end
         
     | 
| 
       57 
44 
     | 
    
         
             
                    end
         
     | 
| 
       58 
45 
     | 
    
         | 
| 
       59 
46 
     | 
    
         
             
                    private
         
     | 
| 
       60 
47 
     | 
    
         | 
| 
       61 
48 
     | 
    
         
             
                    KEYWORDS = %w[begin class def end module].freeze
         
     | 
| 
       62 
     | 
    
         
            -
                    ALLOWED_COMMENTS = %w[ 
     | 
| 
      
 49 
     | 
    
         
            +
                    ALLOWED_COMMENTS = %w[
         
     | 
| 
      
 50 
     | 
    
         
            +
                      :nodoc:
         
     | 
| 
      
 51 
     | 
    
         
            +
                      :yields:
         
     | 
| 
      
 52 
     | 
    
         
            +
                      rubocop:disable
         
     | 
| 
      
 53 
     | 
    
         
            +
                      rubocop:todo
         
     | 
| 
      
 54 
     | 
    
         
            +
                    ].freeze
         
     | 
| 
       63 
55 
     | 
    
         | 
| 
       64 
     | 
    
         
            -
                    def offensive?( 
     | 
| 
       65 
     | 
    
         
            -
                      line = line 
     | 
| 
       66 
     | 
    
         
            -
                      KEYWORDS.any? { |word| line =~  
     | 
| 
      
 56 
     | 
    
         
            +
                    def offensive?(comment)
         
     | 
| 
      
 57 
     | 
    
         
            +
                      line = line(comment)
         
     | 
| 
      
 58 
     | 
    
         
            +
                      KEYWORDS.any? { |word| line =~ /^\s*#{word}\s/ } &&
         
     | 
| 
       67 
59 
     | 
    
         
             
                        ALLOWED_COMMENTS.none? { |c| line =~ /#\s*#{c}/ }
         
     | 
| 
       68 
60 
     | 
    
         
             
                    end
         
     | 
| 
       69 
61 
     | 
    
         | 
| 
       70 
     | 
    
         
            -
                    def message( 
     | 
| 
       71 
     | 
    
         
            -
                       
     | 
| 
       72 
     | 
    
         
            -
                      keyword = /^\s*(\S+).*#/.match(line)[1]
         
     | 
| 
      
 62 
     | 
    
         
            +
                    def message(comment)
         
     | 
| 
      
 63 
     | 
    
         
            +
                      keyword = line(comment).match(/(\S+).*#/)[1]
         
     | 
| 
       73 
64 
     | 
    
         
             
                      format(MSG, keyword: keyword)
         
     | 
| 
       74 
65 
     | 
    
         
             
                    end
         
     | 
| 
       75 
66 
     | 
    
         | 
| 
       76 
     | 
    
         
            -
                    def  
     | 
| 
       77 
     | 
    
         
            -
                       
     | 
| 
       78 
     | 
    
         
            -
             
     | 
| 
       79 
     | 
    
         
            -
                      ast.each_node(:str, :dstr, :xstr).select(&:heredoc?).map do |node|
         
     | 
| 
       80 
     | 
    
         
            -
                        body = node.location.heredoc_body
         
     | 
| 
       81 
     | 
    
         
            -
                        (body.first_line...body.last_line)
         
     | 
| 
       82 
     | 
    
         
            -
                      end
         
     | 
| 
      
 67 
     | 
    
         
            +
                    def line(comment)
         
     | 
| 
      
 68 
     | 
    
         
            +
                      comment.location.expression.source_line
         
     | 
| 
       83 
69 
     | 
    
         
             
                    end
         
     | 
| 
       84 
70 
     | 
    
         
             
                  end
         
     | 
| 
       85 
71 
     | 
    
         
             
                end
         
     |