rubocop 1.31.1 → 1.51.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/LICENSE.txt +1 -1
- data/README.md +5 -5
- data/config/default.yml +342 -52
- data/config/obsoletion.yml +23 -1
- data/exe/rubocop +1 -1
- data/lib/rubocop/arguments_env.rb +17 -0
- data/lib/rubocop/arguments_file.rb +17 -0
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/{auto_genenerate_config.rb → auto_generate_config.rb} +9 -2
- data/lib/rubocop/cli/command/execute_runner.rb +14 -9
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/suggest_extensions.rb +61 -16
- data/lib/rubocop/cli.rb +56 -9
- data/lib/rubocop/comment_config.rb +60 -1
- data/lib/rubocop/config.rb +48 -20
- data/lib/rubocop/config_finder.rb +68 -0
- data/lib/rubocop/config_loader.rb +46 -68
- data/lib/rubocop/config_loader_resolver.rb +11 -12
- data/lib/rubocop/config_obsoletion/changed_parameter.rb +5 -0
- data/lib/rubocop/config_obsoletion/parameter_rule.rb +4 -0
- data/lib/rubocop/config_obsoletion.rb +9 -4
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
- data/lib/rubocop/cop/badge.rb +9 -4
- data/lib/rubocop/cop/base.rb +115 -83
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +19 -6
- data/lib/rubocop/cop/cop.rb +54 -34
- data/lib/rubocop/cop/corrector.rb +31 -11
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +23 -7
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +2 -7
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +58 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +17 -19
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -1
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +107 -0
- data/lib/rubocop/cop/gemspec/require_mfa.rb +1 -1
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -2
- data/lib/rubocop/cop/generator.rb +5 -2
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +8 -6
- data/lib/rubocop/cop/internal_affairs/create_empty_file.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +111 -0
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/lambda_or_proc.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +42 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +11 -3
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +62 -0
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +60 -0
- data/lib/rubocop/cop/internal_affairs.rb +9 -0
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +16 -12
- data/lib/rubocop/cop/layout/block_end_newline.rb +31 -9
- data/lib/rubocop/cop/layout/class_structure.rb +37 -27
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +2 -6
- data/lib/rubocop/cop/layout/comment_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +3 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +7 -2
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +9 -1
- data/lib/rubocop/cop/layout/end_of_line.rb +4 -4
- data/lib/rubocop/cop/layout/extra_spacing.rb +15 -6
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +15 -4
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +35 -8
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +36 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +57 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +52 -19
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +10 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +8 -11
- data/lib/rubocop/cop/layout/indentation_style.rb +7 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +6 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +80 -12
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +18 -8
- data/lib/rubocop/cop/layout/line_length.rb +8 -1
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +31 -1
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +3 -1
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +29 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +39 -2
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +77 -0
- data/lib/rubocop/cop/layout/redundant_line_break.rb +9 -10
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -3
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -0
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +22 -20
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +27 -9
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +30 -3
- data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +34 -0
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +10 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +5 -4
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +12 -5
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +1 -1
- data/lib/rubocop/cop/legacy/corrector.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +39 -8
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +4 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +5 -1
- data/lib/rubocop/cop/lint/debugger.rb +27 -31
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +66 -110
- data/lib/rubocop/cop/lint/deprecated_constants.rb +8 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_branch.rb +0 -2
- data/lib/rubocop/cop/lint/duplicate_magic_comment.rb +73 -0
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +48 -18
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +26 -9
- data/lib/rubocop/cop/lint/duplicate_require.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +3 -7
- data/lib/rubocop/cop/lint/empty_block.rb +3 -7
- data/lib/rubocop/cop/lint/empty_class.rb +3 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +110 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -11
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +14 -7
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +15 -17
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +4 -3
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +48 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +18 -3
- data/lib/rubocop/cop/lint/missing_super.rb +31 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +53 -9
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +25 -6
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +68 -28
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +12 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +28 -6
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +4 -5
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +17 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +5 -0
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +49 -9
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -6
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +7 -0
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +48 -10
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +13 -0
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/redundant_with_index.rb +14 -11
- data/lib/rubocop/cop/lint/redundant_with_object.rb +13 -12
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +2 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +3 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +57 -0
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +41 -8
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -4
- data/lib/rubocop/cop/lint/shadowed_exception.rb +16 -11
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +28 -3
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +13 -3
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +12 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +6 -1
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +17 -12
- data/lib/rubocop/cop/lint/useless_assignment.rb +56 -1
- data/lib/rubocop/cop/lint/useless_method_definition.rb +12 -4
- data/lib/rubocop/cop/lint/useless_rescue.rb +89 -0
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +15 -5
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +92 -21
- data/lib/rubocop/cop/metrics/abc_size.rb +4 -2
- data/lib/rubocop/cop/metrics/block_length.rb +16 -11
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +11 -5
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +17 -11
- data/lib/rubocop/cop/metrics/module_length.rb +10 -5
- data/lib/rubocop/cop/metrics/parameter_lists.rb +27 -0
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +3 -6
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +9 -6
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_identifiers.rb +2 -2
- data/lib/rubocop/cop/mixin/allowed_methods.rb +23 -2
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +17 -1
- data/lib/rubocop/cop/mixin/annotation_comment.rb +14 -7
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +5 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +29 -7
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +21 -9
- data/lib/rubocop/cop/mixin/def_node.rb +2 -7
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +11 -7
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +152 -12
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +13 -9
- data/lib/rubocop/cop/mixin/line_length_help.rb +11 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +13 -16
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +7 -14
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +5 -6
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +58 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +22 -5
- data/lib/rubocop/cop/mixin/require_library.rb +2 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +5 -3
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +18 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +13 -11
- data/lib/rubocop/cop/mixin/trailing_comma.rb +2 -2
- data/lib/rubocop/cop/mixin/visibility_help.rb +40 -5
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/block_forwarding.rb +5 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +3 -1
- data/lib/rubocop/cop/naming/constant_name.rb +3 -3
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +28 -6
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +22 -7
- data/lib/rubocop/cop/naming/method_name.rb +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +31 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
- data/lib/rubocop/cop/registry.rb +73 -45
- data/lib/rubocop/cop/security/compound_hash.rb +2 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +92 -3
- data/lib/rubocop/cop/style/accessor_grouping.rb +46 -20
- data/lib/rubocop/cop/style/alias.rb +9 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +6 -5
- data/lib/rubocop/cop/style/array_intersect.rb +111 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -10
- data/lib/rubocop/cop/style/case_equality.rb +40 -10
- data/lib/rubocop/cop/style/case_like_if.rb +20 -3
- data/lib/rubocop/cop/style/character_literal.rb +1 -1
- data/lib/rubocop/cop/style/class_and_module_children.rb +8 -15
- data/lib/rubocop/cop/style/class_equality_comparison.rb +94 -12
- data/lib/rubocop/cop/style/class_methods_definitions.rb +2 -1
- data/lib/rubocop/cop/style/collection_compact.rb +21 -5
- data/lib/rubocop/cop/style/collection_methods.rb +2 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +29 -7
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/comparable_clamp.rb +125 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +94 -0
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -14
- data/lib/rubocop/cop/style/copyright.rb +6 -3
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/dir_empty.rb +60 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +22 -10
- data/lib/rubocop/cop/style/documentation_method.rb +10 -4
- data/lib/rubocop/cop/style/double_negation.rb +4 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +41 -6
- data/lib/rubocop/cop/style/each_with_object.rb +40 -9
- data/lib/rubocop/cop/style/empty_block_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_else.rb +37 -0
- data/lib/rubocop/cop/style/empty_heredoc.rb +73 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +62 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +5 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +10 -177
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_read.rb +1 -1
- data/lib/rubocop/cop/style/file_write.rb +1 -1
- data/lib/rubocop/cop/style/for.rb +2 -0
- data/lib/rubocop/cop/style/format_string_token.rb +25 -6
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +127 -38
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +1 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +48 -12
- data/lib/rubocop/cop/style/hash_except.rb +27 -16
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +26 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +15 -0
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +112 -16
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +29 -2
- data/lib/rubocop/cop/style/if_with_semicolon.rb +4 -4
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +15 -11
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +118 -0
- data/lib/rubocop/cop/style/line_end_concatenation.rb +4 -1
- data/lib/rubocop/cop/style/magic_comment_format.rb +307 -0
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
- data/lib/rubocop/cop/style/map_to_set.rb +64 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +40 -24
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +5 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +48 -41
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +21 -2
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +4 -1
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -4
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/min_max_comparison.rb +83 -0
- data/lib/rubocop/cop/style/missing_else.rb +13 -1
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
- data/lib/rubocop/cop/style/module_function.rb +30 -8
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +0 -4
- data/lib/rubocop/cop/style/multiline_in_pattern_then.rb +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +2 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +18 -3
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +17 -10
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +9 -0
- data/lib/rubocop/cop/style/next.rb +3 -5
- data/lib/rubocop/cop/style/nil_lambda.rb +4 -4
- data/lib/rubocop/cop/style/numbered_parameters_limit.rb +11 -3
- data/lib/rubocop/cop/style/numeric_literals.rb +16 -1
- data/lib/rubocop/cop/style/numeric_predicate.rb +43 -9
- data/lib/rubocop/cop/style/object_then.rb +5 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +3 -6
- data/lib/rubocop/cop/style/operator_method_call.rb +67 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +29 -19
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/perl_backrefs.rb +22 -1
- data/lib/rubocop/cop/style/proc.rb +4 -1
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -0
- data/lib/rubocop/cop/style/redundant_begin.rb +3 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +41 -8
- data/lib/rubocop/cop/style/redundant_conditional.rb +0 -4
- data/lib/rubocop/cop/style/redundant_constant_base.rb +85 -0
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +45 -0
- data/lib/rubocop/cop/style/redundant_each.rb +116 -0
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +7 -5
- data/lib/rubocop/cop/style/redundant_heredoc_delimiter_quotes.rb +58 -0
- data/lib/rubocop/cop/style/redundant_initialize.rb +3 -1
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +183 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +22 -24
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +9 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +21 -4
- data/lib/rubocop/cop/style/redundant_return.rb +7 -0
- data/lib/rubocop/cop/style/redundant_self.rb +2 -0
- data/lib/rubocop/cop/style/redundant_sort.rb +24 -9
- data/lib/rubocop/cop/style/redundant_sort_by.rb +24 -8
- data/lib/rubocop/cop/style/redundant_string_escape.rb +183 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +138 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +41 -10
- data/lib/rubocop/cop/style/select_by_regexp.rb +13 -5
- data/lib/rubocop/cop/style/self_assignment.rb +2 -2
- data/lib/rubocop/cop/style/semicolon.rb +63 -5
- data/lib/rubocop/cop/style/signal_exception.rb +8 -6
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +17 -8
- data/lib/rubocop/cop/style/special_global_vars.rb +2 -2
- data/lib/rubocop/cop/style/static_class.rb +32 -1
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +4 -1
- data/lib/rubocop/cop/style/string_literals.rb +1 -5
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +6 -5
- data/lib/rubocop/cop/style/symbol_proc.rb +42 -10
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -13
- data/lib/rubocop/cop/style/top_level_method_definition.rb +3 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -4
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +4 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +3 -3
- data/lib/rubocop/cop/style/word_array.rb +59 -5
- data/lib/rubocop/cop/style/yoda_condition.rb +13 -6
- data/lib/rubocop/cop/style/yoda_expression.rb +90 -0
- data/lib/rubocop/cop/style/zero_length_predicate.rb +40 -19
- data/lib/rubocop/cop/team.rb +63 -56
- data/lib/rubocop/cop/util.rb +44 -8
- data/lib/rubocop/cop/variable_force/assignment.rb +5 -1
- data/lib/rubocop/cop/variable_force/scope.rb +3 -3
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +6 -4
- data/lib/rubocop/cop/variable_force.rb +18 -30
- data/lib/rubocop/cops_documentation_generator.rb +45 -15
- data/lib/rubocop/directive_comment.rb +4 -4
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/processed_source.rb +2 -0
- data/lib/rubocop/ext/range.rb +15 -0
- data/lib/rubocop/ext/regexp_node.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +1 -1
- data/lib/rubocop/feature_loader.rb +94 -0
- data/lib/rubocop/file_patterns.rb +43 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +26 -9
- data/lib/rubocop/formatter/html_formatter.rb +4 -4
- data/lib/rubocop/formatter/junit_formatter.rb +4 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +8 -5
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +1 -1
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +6 -3
- data/lib/rubocop/formatter.rb +4 -1
- data/lib/rubocop/options.rb +55 -22
- data/lib/rubocop/path_util.rb +50 -22
- data/lib/rubocop/rake_task.rb +5 -1
- data/lib/rubocop/result_cache.rb +26 -24
- data/lib/rubocop/rspec/cop_helper.rb +26 -3
- data/lib/rubocop/rspec/expect_offense.rb +6 -4
- data/lib/rubocop/rspec/shared_contexts.rb +31 -14
- data/lib/rubocop/rspec/support.rb +17 -2
- data/lib/rubocop/runner.rb +73 -18
- data/lib/rubocop/server/cache.rb +48 -2
- data/lib/rubocop/server/cli.rb +62 -19
- data/lib/rubocop/server/client_command/base.rb +1 -1
- data/lib/rubocop/server/client_command/exec.rb +6 -1
- data/lib/rubocop/server/client_command/start.rb +6 -1
- data/lib/rubocop/server/core.rb +42 -10
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -1
- data/lib/rubocop/server/socket_reader.rb +5 -1
- data/lib/rubocop/server.rb +1 -1
- data/lib/rubocop/target_finder.rb +1 -1
- data/lib/rubocop/target_ruby.rb +5 -5
- data/lib/rubocop/version.rb +10 -4
- data/lib/rubocop.rb +45 -9
- metadata +58 -33
- data/lib/rubocop/cop/mixin/ignored_methods.rb +0 -52
data/lib/rubocop/cop/base.rb
CHANGED
@@ -48,7 +48,7 @@ module RuboCop
|
|
48
48
|
InvestigationReport = Struct.new(:cop, :processed_source, :offenses, :corrector)
|
49
49
|
|
50
50
|
# List of methods names to restrict calls for `on_send` / `on_csend`
|
51
|
-
RESTRICT_ON_SEND = Set[].freeze
|
51
|
+
RESTRICT_ON_SEND = Set[].freeze # rubocop:disable InternalAffairs/UselessRestrictOnSend
|
52
52
|
|
53
53
|
# List of cops that should not try to autocorrect at the same
|
54
54
|
# time as this cop
|
@@ -68,6 +68,64 @@ module RuboCop
|
|
68
68
|
Documentation.url_for(self) if builtin?
|
69
69
|
end
|
70
70
|
|
71
|
+
def self.inherited(subclass)
|
72
|
+
super
|
73
|
+
Registry.global.enlist(subclass)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Call for abstract Cop classes
|
77
|
+
def self.exclude_from_registry
|
78
|
+
Registry.global.dismiss(self)
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns if class supports autocorrect.
|
82
|
+
# It is recommended to extend AutoCorrector instead of overriding
|
83
|
+
def self.support_autocorrect?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
### Naming
|
88
|
+
|
89
|
+
def self.badge
|
90
|
+
@badge ||= Badge.for(name)
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.cop_name
|
94
|
+
badge.to_s
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.department
|
98
|
+
badge.department
|
99
|
+
end
|
100
|
+
|
101
|
+
def self.lint?
|
102
|
+
department == :Lint
|
103
|
+
end
|
104
|
+
|
105
|
+
# Returns true if the cop name or the cop namespace matches any of the
|
106
|
+
# given names.
|
107
|
+
def self.match?(given_names)
|
108
|
+
return false unless given_names
|
109
|
+
|
110
|
+
given_names.include?(cop_name) || given_names.include?(badge.department_name)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Override and return the Force class(es) you need to join
|
114
|
+
def self.joining_forces; end
|
115
|
+
|
116
|
+
### Persistence
|
117
|
+
|
118
|
+
# Override if your cop should be called repeatedly for multiple investigations
|
119
|
+
# Between calls to `on_new_investigation` and `on_investigation_end`,
|
120
|
+
# the result of `processed_source` will remain constant.
|
121
|
+
# You should invalidate any caches that depend on the current `processed_source`
|
122
|
+
# in the `on_new_investigation` callback.
|
123
|
+
# If your cop does autocorrections, be aware that your instance may be called
|
124
|
+
# multiple times with the same `processed_source.path` but different content.
|
125
|
+
def self.support_multiple_source?
|
126
|
+
false
|
127
|
+
end
|
128
|
+
|
71
129
|
def initialize(config = nil, options = nil)
|
72
130
|
@config = config || Config.new
|
73
131
|
@options = options || { debug: false }
|
@@ -92,9 +150,6 @@ module RuboCop
|
|
92
150
|
# Typically do nothing here
|
93
151
|
end
|
94
152
|
|
95
|
-
# Override and return the Force class(es) you need to join
|
96
|
-
def self.joining_forces; end
|
97
|
-
|
98
153
|
# Gets called if no message is specified when calling `add_offense` or
|
99
154
|
# `add_global_offense`
|
100
155
|
# Cops are discouraged to override this; instead pass your message directly
|
@@ -107,8 +162,7 @@ module RuboCop
|
|
107
162
|
def add_global_offense(message = nil, severity: nil)
|
108
163
|
severity = find_severity(nil, severity)
|
109
164
|
message = find_message(nil, message)
|
110
|
-
|
111
|
-
Offense.new(severity, Offense::NO_LOCATION, message, name, :unsupported)
|
165
|
+
current_offenses << Offense.new(severity, Offense::NO_LOCATION, message, name, :unsupported)
|
112
166
|
end
|
113
167
|
|
114
168
|
# Adds an offense on the specified range (or node with an expression)
|
@@ -126,7 +180,11 @@ module RuboCop
|
|
126
180
|
|
127
181
|
status, corrector = enabled_line?(range.line) ? correct(range, &block) : :disabled
|
128
182
|
|
129
|
-
|
183
|
+
# Since this range may be generated from Ruby code embedded in some
|
184
|
+
# template file, we convert it to location info in the original file.
|
185
|
+
range = range_for_original(range)
|
186
|
+
|
187
|
+
current_offenses << Offense.new(severity, range, message, name, status, corrector)
|
130
188
|
end
|
131
189
|
|
132
190
|
# This method should be overridden when a cop's behavior depends
|
@@ -148,48 +206,6 @@ module RuboCop
|
|
148
206
|
nil
|
149
207
|
end
|
150
208
|
|
151
|
-
def self.inherited(subclass)
|
152
|
-
super
|
153
|
-
Registry.global.enlist(subclass)
|
154
|
-
end
|
155
|
-
|
156
|
-
# Call for abstract Cop classes
|
157
|
-
def self.exclude_from_registry
|
158
|
-
Registry.global.dismiss(self)
|
159
|
-
end
|
160
|
-
|
161
|
-
# Returns if class supports autocorrect.
|
162
|
-
# It is recommended to extend AutoCorrector instead of overriding
|
163
|
-
def self.support_autocorrect?
|
164
|
-
false
|
165
|
-
end
|
166
|
-
|
167
|
-
### Naming
|
168
|
-
|
169
|
-
def self.badge
|
170
|
-
@badge ||= Badge.for(name)
|
171
|
-
end
|
172
|
-
|
173
|
-
def self.cop_name
|
174
|
-
badge.to_s
|
175
|
-
end
|
176
|
-
|
177
|
-
def self.department
|
178
|
-
badge.department
|
179
|
-
end
|
180
|
-
|
181
|
-
def self.lint?
|
182
|
-
department == :Lint
|
183
|
-
end
|
184
|
-
|
185
|
-
# Returns true if the cop name or the cop namespace matches any of the
|
186
|
-
# given names.
|
187
|
-
def self.match?(given_names)
|
188
|
-
return false unless given_names
|
189
|
-
|
190
|
-
given_names.include?(cop_name) || given_names.include?(department.to_s)
|
191
|
-
end
|
192
|
-
|
193
209
|
def cop_name
|
194
210
|
@cop_name ||= self.class.cop_name
|
195
211
|
end
|
@@ -225,6 +241,8 @@ module RuboCop
|
|
225
241
|
end
|
226
242
|
|
227
243
|
def relevant_file?(file)
|
244
|
+
return true unless @config.clusivity_config_for_badge?(self.class.badge)
|
245
|
+
|
228
246
|
file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME ||
|
229
247
|
(file_name_matches_any?(file, 'Include', true) &&
|
230
248
|
!file_name_matches_any?(file, 'Exclude', false))
|
@@ -239,19 +257,6 @@ module RuboCop
|
|
239
257
|
ProcessedSource.new(source, target_ruby_version, path)
|
240
258
|
end
|
241
259
|
|
242
|
-
### Persistence
|
243
|
-
|
244
|
-
# Override if your cop should be called repeatedly for multiple investigations
|
245
|
-
# Between calls to `on_new_investigation` and `on_investigation_end`,
|
246
|
-
# the result of `processed_source` will remain constant.
|
247
|
-
# You should invalidate any caches that depend on the current `processed_source`
|
248
|
-
# in the `on_new_investigation` callback.
|
249
|
-
# If your cop does autocorrections, be aware that your instance may be called
|
250
|
-
# multiple times with the same `processed_source.path` but different content.
|
251
|
-
def self.support_multiple_source?
|
252
|
-
false
|
253
|
-
end
|
254
|
-
|
255
260
|
# @api private
|
256
261
|
# Called between investigations
|
257
262
|
def ready
|
@@ -270,6 +275,7 @@ module RuboCop
|
|
270
275
|
|
271
276
|
### Reserved for Commissioner
|
272
277
|
|
278
|
+
# rubocop:disable Layout/ClassStructure
|
273
279
|
# @api private
|
274
280
|
def callbacks_needed
|
275
281
|
self.class.callbacks_needed
|
@@ -282,6 +288,26 @@ module RuboCop
|
|
282
288
|
!Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation'
|
283
289
|
end
|
284
290
|
end
|
291
|
+
# rubocop:enable Layout/ClassStructure
|
292
|
+
|
293
|
+
# Called before any investigation
|
294
|
+
# @api private
|
295
|
+
def begin_investigation(processed_source, offset: 0, original: processed_source)
|
296
|
+
@current_offenses = nil
|
297
|
+
@current_offense_locations = nil
|
298
|
+
@currently_disabled_lines = nil
|
299
|
+
@processed_source = processed_source
|
300
|
+
@current_corrector = nil
|
301
|
+
|
302
|
+
# We need to keep track of the original source and offset,
|
303
|
+
# because `processed_source` here may be an embedded code in it.
|
304
|
+
@current_offset = offset
|
305
|
+
@current_original = original
|
306
|
+
end
|
307
|
+
|
308
|
+
def inspect # :nodoc:
|
309
|
+
"#<#{self.class.name}:#{object_id} @config=#{@config} @options=#{@options}>"
|
310
|
+
end
|
285
311
|
|
286
312
|
private
|
287
313
|
|
@@ -292,7 +318,7 @@ module RuboCop
|
|
292
318
|
end
|
293
319
|
|
294
320
|
def apply_correction(corrector)
|
295
|
-
|
321
|
+
current_corrector&.merge!(corrector) if corrector
|
296
322
|
end
|
297
323
|
|
298
324
|
### Reserved for Commissioner:
|
@@ -305,28 +331,32 @@ module RuboCop
|
|
305
331
|
@currently_disabled_lines ||= Set.new
|
306
332
|
end
|
307
333
|
|
308
|
-
|
309
|
-
@
|
334
|
+
def current_corrector
|
335
|
+
@current_corrector ||= Corrector.new(@processed_source) if @processed_source.valid_syntax?
|
310
336
|
end
|
311
337
|
|
312
|
-
|
313
|
-
|
314
|
-
@current_offenses = []
|
315
|
-
@current_offense_locations = nil
|
316
|
-
@currently_disabled_lines = nil
|
317
|
-
@processed_source = processed_source
|
318
|
-
@current_corrector = Corrector.new(@processed_source) if @processed_source.valid_syntax?
|
338
|
+
def current_offenses
|
339
|
+
@current_offenses ||= []
|
319
340
|
end
|
320
341
|
|
342
|
+
private_class_method def self.restrict_on_send
|
343
|
+
@restrict_on_send ||= self::RESTRICT_ON_SEND.to_a.freeze
|
344
|
+
end
|
345
|
+
|
346
|
+
EMPTY_OFFENSES = [].freeze
|
347
|
+
private_constant :EMPTY_OFFENSES
|
321
348
|
# Called to complete an investigation
|
322
349
|
def complete_investigation
|
323
|
-
InvestigationReport.new(
|
350
|
+
InvestigationReport.new(
|
351
|
+
self, processed_source, @current_offenses || EMPTY_OFFENSES, @current_corrector
|
352
|
+
)
|
324
353
|
ensure
|
325
354
|
reset_investigation
|
326
355
|
end
|
327
356
|
|
328
357
|
### Actually private methods
|
329
358
|
|
359
|
+
# rubocop:disable Layout/ClassStructure
|
330
360
|
def self.builtin?
|
331
361
|
return false unless (m = instance_methods(false).first) # any custom method will do
|
332
362
|
|
@@ -334,6 +364,7 @@ module RuboCop
|
|
334
364
|
path.start_with?(__dir__)
|
335
365
|
end
|
336
366
|
private_class_method :builtin?
|
367
|
+
# rubocop:enable Layout/ClassStructure
|
337
368
|
|
338
369
|
def reset_investigation
|
339
370
|
@currently_disabled_lines = @current_offenses = @processed_source = @current_corrector = nil
|
@@ -389,7 +420,7 @@ module RuboCop
|
|
389
420
|
|
390
421
|
def range_from_node_or_range(node_or_range)
|
391
422
|
if node_or_range.respond_to?(:loc)
|
392
|
-
node_or_range.
|
423
|
+
node_or_range.source_range
|
393
424
|
elsif node_or_range.is_a?(::Parser::Source::Range)
|
394
425
|
node_or_range
|
395
426
|
else
|
@@ -412,15 +443,8 @@ module RuboCop
|
|
412
443
|
patterns = cop_config[parameter]
|
413
444
|
return default_result unless patterns
|
414
445
|
|
415
|
-
|
416
|
-
patterns.
|
417
|
-
# Try to match the absolute path, as Exclude properties are absolute.
|
418
|
-
next true if match_path?(pattern, file)
|
419
|
-
|
420
|
-
# Try with relative path.
|
421
|
-
path ||= config.path_relative_to_config(file)
|
422
|
-
match_path?(pattern, path)
|
423
|
-
end
|
446
|
+
patterns = FilePatterns.from(patterns)
|
447
|
+
patterns.match?(config.path_relative_to_config(file)) || patterns.match?(file)
|
424
448
|
end
|
425
449
|
|
426
450
|
def enabled_line?(line_number)
|
@@ -449,6 +473,14 @@ module RuboCop
|
|
449
473
|
warn(Rainbow(message).red)
|
450
474
|
end
|
451
475
|
end
|
476
|
+
|
477
|
+
def range_for_original(range)
|
478
|
+
::Parser::Source::Range.new(
|
479
|
+
@current_original.buffer,
|
480
|
+
range.begin_pos + @current_offset,
|
481
|
+
range.end_pos + @current_offset
|
482
|
+
)
|
483
|
+
end
|
452
484
|
end
|
453
485
|
end
|
454
486
|
end
|
@@ -124,7 +124,7 @@ module RuboCop
|
|
124
124
|
end
|
125
125
|
|
126
126
|
def preceding_comment?(node1, node2)
|
127
|
-
node1 && node2 && precede?(node2, node1) && comment_line?(node2.
|
127
|
+
node1 && node2 && precede?(node2, node1) && comment_line?(node2.source)
|
128
128
|
end
|
129
129
|
|
130
130
|
def ignored_gem?(node)
|
@@ -76,13 +76,14 @@ module RuboCop
|
|
76
76
|
end
|
77
77
|
|
78
78
|
# @return [InvestigationReport]
|
79
|
-
def investigate(processed_source)
|
79
|
+
def investigate(processed_source, offset: 0, original: processed_source)
|
80
80
|
reset
|
81
81
|
|
82
|
-
|
82
|
+
begin_investigation(processed_source, offset: offset, original: original)
|
83
83
|
if processed_source.valid_syntax?
|
84
84
|
invoke(:on_new_investigation, @cops)
|
85
|
-
|
85
|
+
invoke_with_argument(:investigate, @forces, processed_source)
|
86
|
+
|
86
87
|
walk(processed_source.ast) unless @cops.empty?
|
87
88
|
invoke(:on_investigation_end, @cops)
|
88
89
|
else
|
@@ -94,6 +95,12 @@ module RuboCop
|
|
94
95
|
|
95
96
|
private
|
96
97
|
|
98
|
+
def begin_investigation(processed_source, offset:, original:)
|
99
|
+
@cops.each do |cop|
|
100
|
+
cop.begin_investigation(processed_source, offset: offset, original: original)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
97
104
|
def trigger_responding_cops(callback, node)
|
98
105
|
@callbacks[callback]&.each do |cop|
|
99
106
|
with_cop_error_handling(cop, node) do
|
@@ -149,8 +156,12 @@ module RuboCop
|
|
149
156
|
map
|
150
157
|
end
|
151
158
|
|
152
|
-
def invoke(callback, cops
|
153
|
-
cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback
|
159
|
+
def invoke(callback, cops)
|
160
|
+
cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback) } }
|
161
|
+
end
|
162
|
+
|
163
|
+
def invoke_with_argument(callback, cops, arg)
|
164
|
+
cops.each { |cop| with_cop_error_handling(cop) { cop.send(callback, arg) } }
|
154
165
|
end
|
155
166
|
|
156
167
|
# Allow blind rescues here, since we're absorbing and packaging or
|
@@ -159,9 +170,11 @@ module RuboCop
|
|
159
170
|
def with_cop_error_handling(cop, node = nil)
|
160
171
|
yield
|
161
172
|
rescue StandardError => e
|
162
|
-
raise e if @options[:raise_error]
|
173
|
+
raise e if @options[:raise_error] # For internal testing
|
163
174
|
|
164
175
|
err = ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop)
|
176
|
+
raise err if @options[:raise_cop_error] # From user-input option
|
177
|
+
|
165
178
|
@errors << err
|
166
179
|
end
|
167
180
|
end
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -7,7 +7,7 @@ module RuboCop
|
|
7
7
|
module Cop
|
8
8
|
# @deprecated Use Cop::Base instead
|
9
9
|
# Legacy scaffold for Cops.
|
10
|
-
# See https://docs.rubocop.org/rubocop/
|
10
|
+
# See https://docs.rubocop.org/rubocop/v1_upgrade_notes.html
|
11
11
|
class Cop < Base
|
12
12
|
attr_reader :offenses
|
13
13
|
|
@@ -22,9 +22,42 @@ module RuboCop
|
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.support_autocorrect?
|
26
|
+
method_defined?(:autocorrect)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.joining_forces
|
30
|
+
return unless method_defined?(:join_force?)
|
31
|
+
|
32
|
+
cop = new
|
33
|
+
Force.all.select { |force_class| cop.join_force?(force_class) }
|
34
|
+
end
|
35
|
+
|
36
|
+
### Deprecated registry access
|
37
|
+
|
38
|
+
# @deprecated Use Registry.global
|
39
|
+
def self.registry
|
40
|
+
Registry.global
|
41
|
+
end
|
42
|
+
|
43
|
+
# @deprecated Use Registry.all
|
44
|
+
def self.all
|
45
|
+
Registry.all
|
46
|
+
end
|
47
|
+
|
48
|
+
# @deprecated Use Registry.qualified_cop_name
|
49
|
+
def self.qualified_cop_name(name, origin)
|
50
|
+
Registry.qualified_cop_name(name, origin)
|
51
|
+
end
|
52
|
+
|
25
53
|
def add_offense(node_or_range, location: :expression, message: nil, severity: nil, &block)
|
26
54
|
@v0_argument = node_or_range
|
27
55
|
range = find_location(node_or_range, location)
|
56
|
+
|
57
|
+
# Since this range may be generated from Ruby code embedded in some
|
58
|
+
# template file, we convert it to location info in the original file.
|
59
|
+
range = range_for_original(range)
|
60
|
+
|
28
61
|
if block.nil? && !support_autocorrect?
|
29
62
|
super(range, message: message, severity: severity)
|
30
63
|
else
|
@@ -45,17 +78,6 @@ module RuboCop
|
|
45
78
|
self.class.support_autocorrect?
|
46
79
|
end
|
47
80
|
|
48
|
-
def self.support_autocorrect?
|
49
|
-
method_defined?(:autocorrect)
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.joining_forces
|
53
|
-
return unless method_defined?(:join_force?)
|
54
|
-
|
55
|
-
cop = new
|
56
|
-
Force.all.select { |force_class| cop.join_force?(force_class) }
|
57
|
-
end
|
58
|
-
|
59
81
|
# @deprecated
|
60
82
|
def corrections
|
61
83
|
# warn 'Cop#corrections is deprecated' TODO
|
@@ -76,31 +98,21 @@ module RuboCop
|
|
76
98
|
super
|
77
99
|
end
|
78
100
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# @deprecated Use Registry.all
|
87
|
-
def self.all
|
88
|
-
Registry.all
|
89
|
-
end
|
101
|
+
# Called before any investigation
|
102
|
+
# @api private
|
103
|
+
def begin_investigation(processed_source, offset: 0, original: processed_source)
|
104
|
+
super
|
105
|
+
@offenses = current_offenses
|
106
|
+
@last_corrector = @current_corrector
|
90
107
|
|
91
|
-
|
92
|
-
|
93
|
-
|
108
|
+
# We need to keep track of the original source and offset,
|
109
|
+
# because `processed_source` here may be an embedded code in it.
|
110
|
+
@current_offset = offset
|
111
|
+
@current_original = original
|
94
112
|
end
|
95
113
|
|
96
114
|
private
|
97
115
|
|
98
|
-
def begin_investigation(processed_source)
|
99
|
-
super
|
100
|
-
@offenses = @current_offenses
|
101
|
-
@last_corrector = @current_corrector
|
102
|
-
end
|
103
|
-
|
104
116
|
# Override Base
|
105
117
|
def callback_argument(_range)
|
106
118
|
@v0_argument
|
@@ -126,10 +138,10 @@ module RuboCop
|
|
126
138
|
def correction_lambda
|
127
139
|
return unless support_autocorrect?
|
128
140
|
|
129
|
-
|
141
|
+
dedupe_on_node(@v0_argument) { autocorrect(@v0_argument) }
|
130
142
|
end
|
131
143
|
|
132
|
-
def
|
144
|
+
def dedupe_on_node(node)
|
133
145
|
@corrected_nodes ||= {}.compare_by_identity
|
134
146
|
yield unless @corrected_nodes.key?(node)
|
135
147
|
ensure
|
@@ -141,6 +153,14 @@ module RuboCop
|
|
141
153
|
rescue ::Parser::ClobberingError
|
142
154
|
# ignore Clobbering errors
|
143
155
|
end
|
156
|
+
|
157
|
+
def range_for_original(range)
|
158
|
+
::Parser::Source::Range.new(
|
159
|
+
@current_original.buffer,
|
160
|
+
range.begin_pos + @current_offset,
|
161
|
+
range.end_pos + @current_offset
|
162
|
+
)
|
163
|
+
end
|
144
164
|
end
|
145
165
|
end
|
146
166
|
end
|
@@ -11,6 +11,20 @@ module RuboCop
|
|
11
11
|
class Corrector < ::Parser::Source::TreeRewriter
|
12
12
|
NOOP_CONSUMER = ->(diagnostic) {} # noop
|
13
13
|
|
14
|
+
# Duck typing for get to a ::Parser::Source::Buffer
|
15
|
+
def self.source_buffer(source)
|
16
|
+
source = source.processed_source if source.respond_to?(:processed_source)
|
17
|
+
source = source.buffer if source.respond_to?(:buffer)
|
18
|
+
source = source.source_buffer if source.respond_to?(:source_buffer)
|
19
|
+
|
20
|
+
unless source.is_a? ::Parser::Source::Buffer
|
21
|
+
raise TypeError, 'Expected argument to lead to a Parser::Source::Buffer ' \
|
22
|
+
"but got #{source.inspect}"
|
23
|
+
end
|
24
|
+
|
25
|
+
source
|
26
|
+
end
|
27
|
+
|
14
28
|
# @param source [Parser::Source::Buffer, or anything
|
15
29
|
# leading to one via `(processed_source.)buffer`]
|
16
30
|
#
|
@@ -64,18 +78,24 @@ module RuboCop
|
|
64
78
|
remove(to_remove)
|
65
79
|
end
|
66
80
|
|
67
|
-
#
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
81
|
+
# Swaps sources at the given ranges.
|
82
|
+
#
|
83
|
+
# @param [Parser::Source::Range, RuboCop::AST::Node] node_or_range1
|
84
|
+
# @param [Parser::Source::Range, RuboCop::AST::Node] node_or_range2
|
85
|
+
def swap(node_or_range1, node_or_range2)
|
86
|
+
range1 = to_range(node_or_range1)
|
87
|
+
range2 = to_range(node_or_range2)
|
72
88
|
|
73
|
-
|
74
|
-
|
75
|
-
|
89
|
+
if range1.end_pos == range2.begin_pos
|
90
|
+
insert_before(range1, range2.source)
|
91
|
+
remove(range2)
|
92
|
+
elsif range2.end_pos == range1.begin_pos
|
93
|
+
insert_before(range2, range1.source)
|
94
|
+
remove(range1)
|
95
|
+
else
|
96
|
+
replace(range1, range2.source)
|
97
|
+
replace(range2, range1.source)
|
76
98
|
end
|
77
|
-
|
78
|
-
source
|
79
99
|
end
|
80
100
|
|
81
101
|
private
|
@@ -84,7 +104,7 @@ module RuboCop
|
|
84
104
|
def to_range(node_or_range)
|
85
105
|
range = case node_or_range
|
86
106
|
when ::RuboCop::AST::Node, ::Parser::Source::Comment
|
87
|
-
node_or_range.
|
107
|
+
node_or_range.source_range
|
88
108
|
when ::Parser::Source::Range
|
89
109
|
node_or_range
|
90
110
|
else
|
@@ -16,7 +16,7 @@ module RuboCop
|
|
16
16
|
return unless node
|
17
17
|
|
18
18
|
@processed_source = processed_source
|
19
|
-
expr = node.respond_to?(:loc) ? node.
|
19
|
+
expr = node.respond_to?(:loc) ? node.source_range : node
|
20
20
|
return if block_comment_within?(expr)
|
21
21
|
|
22
22
|
taboo_ranges = inside_string_ranges(node)
|
@@ -54,7 +54,7 @@ module RuboCop
|
|
54
54
|
def inside_string_ranges(node)
|
55
55
|
return [] unless node.is_a?(Parser::AST::Node)
|
56
56
|
|
57
|
-
node.each_node(:str, :dstr, :xstr).
|
57
|
+
node.each_node(:str, :dstr, :xstr).filter_map { |n| inside_string_range(n) }
|
58
58
|
end
|
59
59
|
|
60
60
|
def inside_string_range(node)
|
@@ -80,7 +80,7 @@ module RuboCop
|
|
80
80
|
|
81
81
|
def block_comment_within?(expr)
|
82
82
|
processed_source.comments.select(&:document?).any? do |c|
|
83
|
-
within?(c.
|
83
|
+
within?(c.source_range, expr)
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
@@ -35,15 +35,15 @@ module RuboCop
|
|
35
35
|
|
36
36
|
def offending_range
|
37
37
|
if block_node.arguments?
|
38
|
-
replacement_range(argument_node.
|
38
|
+
replacement_range(argument_node.source_range.end_pos)
|
39
39
|
else
|
40
40
|
replacement_range(block_node.loc.begin.end_pos)
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
def replacement_range(end_pos)
|
45
|
-
Parser::Source::Range.new(block_node.
|
46
|
-
block_node.
|
45
|
+
Parser::Source::Range.new(block_node.source_range.source_buffer,
|
46
|
+
block_node.source_range.begin_pos,
|
47
47
|
end_pos)
|
48
48
|
end
|
49
49
|
end
|
@@ -56,7 +56,7 @@ module RuboCop
|
|
56
56
|
if collection_node.begin_type?
|
57
57
|
collection_node.loc.end
|
58
58
|
else
|
59
|
-
collection_node.
|
59
|
+
collection_node.source_range
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
@@ -65,8 +65,8 @@ module RuboCop
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def replacement_range(end_pos)
|
68
|
-
Parser::Source::Range.new(for_node.
|
69
|
-
for_node.
|
68
|
+
Parser::Source::Range.new(for_node.source_range.source_buffer,
|
69
|
+
for_node.source_range.begin_pos,
|
70
70
|
end_pos)
|
71
71
|
end
|
72
72
|
end
|
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
def move_comment(eol_comment:, node:, corrector:)
|
36
36
|
return unless eol_comment
|
37
37
|
|
38
|
-
text = eol_comment.
|
38
|
+
text = eol_comment.source
|
39
39
|
corrector.insert_before(node, "#{text}\n#{' ' * node.loc.keyword.column}")
|
40
40
|
corrector.remove(eol_comment)
|
41
41
|
end
|