rubocop 0.85.1 → 0.89.1
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 +16 -4
- data/bin/rubocop-profile +32 -0
- data/config/default.yml +227 -26
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +42 -7
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -1
- data/lib/rubocop/cli/command/show_cops.rb +3 -3
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +2 -4
- data/lib/rubocop/comment_config.rb +5 -7
- data/lib/rubocop/config.rb +21 -4
- data/lib/rubocop/config_loader.rb +41 -69
- data/lib/rubocop/config_loader_resolver.rb +4 -4
- data/lib/rubocop/config_obsoletion.rb +6 -2
- data/lib/rubocop/config_store.rb +4 -0
- data/lib/rubocop/config_validator.rb +2 -4
- data/lib/rubocop/cop/autocorrect_logic.rb +14 -24
- data/lib/rubocop/cop/badge.rb +1 -1
- data/lib/rubocop/cop/base.rb +407 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +10 -20
- data/lib/rubocop/cop/commissioner.rb +47 -50
- data/lib/rubocop/cop/cop.rb +85 -236
- data/lib/rubocop/cop/corrector.rb +38 -115
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +26 -0
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/unused_arg_corrector.rb +15 -18
- data/lib/rubocop/cop/force.rb +1 -0
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +39 -13
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator/configuration_injector.rb +3 -3
- data/lib/rubocop/cop/generator.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +4 -12
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +11 -14
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +10 -7
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +7 -8
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/case_indentation.rb +18 -19
- data/lib/rubocop/cop/layout/class_structure.rb +5 -44
- data/lib/rubocop/cop/layout/comment_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/empty_comment.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +0 -2
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +22 -36
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +5 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/hash_alignment.rb +2 -3
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/indentation_style.rb +0 -2
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +17 -7
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +0 -2
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +22 -27
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +33 -66
- data/lib/rubocop/cop/layout/space_around_operators.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +14 -0
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +4 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +2 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +49 -0
- data/lib/rubocop/cop/legacy/corrector.rb +29 -0
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +7 -4
- data/lib/rubocop/cop/lint/ambiguous_operator.rb +15 -10
- data/lib/rubocop/cop/lint/ambiguous_regexp_literal.rb +11 -13
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/big_decimal_new.rb +10 -10
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +50 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +16 -11
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +89 -0
- data/lib/rubocop/cop/lint/debugger.rb +7 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +9 -10
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +21 -17
- data/lib/rubocop/cop/lint/disjunctive_assignment_in_constructor.rb +8 -2
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_elsif_condition.rb +39 -0
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +9 -6
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +60 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +67 -0
- data/lib/rubocop/cop/lint/empty_ensure.rb +5 -5
- data/lib/rubocop/cop/lint/empty_expression.rb +2 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +5 -6
- data/lib/rubocop/cop/lint/empty_when.rb +2 -2
- data/lib/rubocop/cop/lint/ensure_return.rb +27 -29
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +11 -10
- data/lib/rubocop/cop/lint/flip_flop.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +93 -0
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -5
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +13 -14
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +5 -4
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +8 -8
- data/lib/rubocop/cop/lint/inherit_exception.rb +12 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +21 -5
- data/lib/rubocop/cop/lint/literal_as_condition.rb +14 -2
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -7
- data/lib/rubocop/cop/lint/loop.rb +23 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +6 -5
- data/lib/rubocop/cop/lint/missing_super.rb +99 -0
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_comparison.rb +6 -9
- data/lib/rubocop/cop/lint/nested_method_definition.rb +15 -21
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -1
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +84 -13
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +2 -2
- data/lib/rubocop/cop/lint/number_conversion.rb +6 -9
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +11 -13
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +90 -0
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +12 -13
- data/lib/rubocop/cop/lint/percent_string_array.rb +14 -13
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +14 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +15 -5
- data/lib/rubocop/cop/lint/rand_one.rb +3 -3
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +43 -40
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +7 -11
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -7
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +15 -11
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +6 -13
- data/lib/rubocop/cop/lint/redundant_with_index.rb +11 -14
- data/lib/rubocop/cop/lint/redundant_with_object.rb +11 -14
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +6 -2
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -2
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +8 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +2 -4
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +3 -6
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +14 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +10 -2
- data/lib/rubocop/cop/lint/script_permission.rb +10 -7
- data/lib/rubocop/cop/lint/self_assignment.rb +78 -0
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_argument.rb +3 -3
- data/lib/rubocop/cop/lint/shadowed_exception.rb +2 -2
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +3 -3
- data/lib/rubocop/cop/lint/struct_new_override.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception.rb +4 -7
- data/lib/rubocop/cop/lint/syntax.rb +11 -26
- data/lib/rubocop/cop/lint/to_json.rb +4 -6
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +34 -0
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +4 -4
- data/lib/rubocop/cop/lint/unified_integer.rb +4 -6
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_loop.rb +174 -0
- data/lib/rubocop/cop/lint/unused_block_argument.rb +8 -3
- data/lib/rubocop/cop/lint/unused_method_argument.rb +9 -4
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +11 -47
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +26 -16
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -4
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +6 -15
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -6
- data/lib/rubocop/cop/lint/void.rb +3 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +24 -2
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -2
- data/lib/rubocop/cop/metrics/class_length.rb +26 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +37 -4
- data/lib/rubocop/cop/metrics/method_length.rb +25 -2
- data/lib/rubocop/cop/metrics/module_length.rb +26 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +2 -6
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +7 -8
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +47 -4
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +157 -0
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +61 -0
- data/lib/rubocop/cop/metrics/utils/repeated_csend_discount.rb +37 -0
- data/lib/rubocop/cop/migration/department_name.rb +14 -16
- data/lib/rubocop/cop/mixin/alignment.rb +2 -1
- data/lib/rubocop/cop/mixin/allowed_methods.rb +19 -0
- data/lib/rubocop/cop/mixin/array_min_size.rb +1 -1
- data/lib/rubocop/cop/mixin/auto_corrector.rb +12 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/code_length.rb +26 -5
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_naming.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +2 -2
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +5 -11
- data/lib/rubocop/cop/mixin/line_length_help.rb +1 -3
- data/lib/rubocop/cop/mixin/method_complexity.rb +10 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- data/lib/rubocop/cop/mixin/nil_methods.rb +3 -5
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +6 -1
- data/lib/rubocop/cop/mixin/parentheses.rb +1 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +2 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +19 -5
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +27 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +39 -10
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -27
- data/lib/rubocop/cop/mixin/trailing_comma.rb +3 -5
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +12 -17
- data/lib/rubocop/cop/mixin/unused_argument.rb +4 -6
- data/lib/rubocop/cop/mixin/visibility_help.rb +50 -0
- data/lib/rubocop/cop/naming/accessor_method_name.rb +4 -2
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +29 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +4 -4
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/class_and_module_camel_case.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +4 -6
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +2 -2
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +3 -3
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +2 -2
- data/lib/rubocop/cop/naming/method_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +6 -10
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -11
- data/lib/rubocop/cop/naming/variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_number.rb +1 -1
- data/lib/rubocop/cop/offense.rb +16 -2
- data/lib/rubocop/cop/registry.rb +3 -3
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +6 -8
- data/lib/rubocop/cop/security/marshal_load.rb +2 -4
- data/lib/rubocop/cop/security/open.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +6 -6
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +16 -9
- data/lib/rubocop/cop/style/accessor_grouping.rb +149 -0
- data/lib/rubocop/cop/style/alias.rb +41 -36
- data/lib/rubocop/cop/style/and_or.rb +9 -11
- data/lib/rubocop/cop/style/array_coercion.rb +63 -0
- data/lib/rubocop/cop/style/array_join.rb +6 -8
- data/lib/rubocop/cop/style/ascii_comments.rb +4 -4
- data/lib/rubocop/cop/style/attr.rb +11 -9
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +5 -7
- data/lib/rubocop/cop/style/bare_percent_literals.rb +11 -13
- data/lib/rubocop/cop/style/begin_block.rb +2 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +141 -0
- data/lib/rubocop/cop/style/block_comments.rb +14 -18
- data/lib/rubocop/cop/style/block_delimiters.rb +25 -27
- data/lib/rubocop/cop/style/case_equality.rb +22 -3
- data/lib/rubocop/cop/style/case_like_if.rb +220 -0
- data/lib/rubocop/cop/style/class_and_module_children.rb +15 -12
- data/lib/rubocop/cop/style/class_check.rb +7 -9
- data/lib/rubocop/cop/style/class_methods.rb +7 -11
- data/lib/rubocop/cop/style/class_vars.rb +24 -7
- data/lib/rubocop/cop/style/collection_methods.rb +11 -17
- data/lib/rubocop/cop/style/colon_method_call.rb +8 -9
- data/lib/rubocop/cop/style/colon_method_definition.rb +6 -6
- data/lib/rubocop/cop/style/command_literal.rb +24 -25
- data/lib/rubocop/cop/style/comment_annotation.rb +15 -15
- data/lib/rubocop/cop/style/commented_keyword.rb +6 -3
- data/lib/rubocop/cop/style/conditional_assignment.rb +12 -3
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -2
- data/lib/rubocop/cop/style/copyright.rb +15 -15
- data/lib/rubocop/cop/style/date_time.rb +2 -2
- data/lib/rubocop/cop/style/def_with_parentheses.rb +8 -10
- data/lib/rubocop/cop/style/dir.rb +9 -12
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +8 -10
- data/lib/rubocop/cop/style/documentation.rb +8 -10
- data/lib/rubocop/cop/style/documentation_method.rb +1 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +12 -15
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +5 -8
- data/lib/rubocop/cop/style/each_with_object.rb +16 -19
- data/lib/rubocop/cop/style/empty_case_condition.rb +27 -26
- data/lib/rubocop/cop/style/empty_else.rb +17 -19
- data/lib/rubocop/cop/style/empty_literal.rb +20 -21
- data/lib/rubocop/cop/style/empty_method.rb +10 -13
- data/lib/rubocop/cop/style/encoding.rb +6 -10
- data/lib/rubocop/cop/style/end_block.rb +4 -6
- data/lib/rubocop/cop/style/eval_with_location.rb +9 -7
- data/lib/rubocop/cop/style/even_odd.rb +7 -11
- data/lib/rubocop/cop/style/expand_path_arguments.rb +23 -22
- data/lib/rubocop/cop/style/explicit_block_argument.rb +102 -0
- data/lib/rubocop/cop/style/exponential_notation.rb +9 -11
- data/lib/rubocop/cop/style/float_division.rb +8 -11
- data/lib/rubocop/cop/style/for.rb +11 -15
- data/lib/rubocop/cop/style/format_string.rb +21 -19
- data/lib/rubocop/cop/style/format_string_token.rb +10 -12
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +20 -42
- data/lib/rubocop/cop/style/global_std_stream.rb +65 -0
- data/lib/rubocop/cop/style/global_vars.rb +2 -2
- data/lib/rubocop/cop/style/guard_clause.rb +5 -6
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +69 -0
- data/lib/rubocop/cop/style/hash_each_methods.rb +5 -8
- data/lib/rubocop/cop/style/hash_like_case.rb +76 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +3 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -1
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +2 -2
- data/lib/rubocop/cop/style/if_unless_modifier.rb +18 -40
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +11 -3
- data/lib/rubocop/cop/style/if_with_semicolon.rb +3 -6
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -1
- data/lib/rubocop/cop/style/infinite_loop.rb +24 -24
- data/lib/rubocop/cop/style/inline_comment.rb +3 -3
- data/lib/rubocop/cop/style/inverse_methods.rb +23 -33
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -1
- data/lib/rubocop/cop/style/lambda.rb +7 -12
- data/lib/rubocop/cop/style/lambda_call.rb +14 -13
- data/lib/rubocop/cop/style/line_end_concatenation.rb +19 -16
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +16 -11
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -1
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -7
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -2
- data/lib/rubocop/cop/style/method_def_parentheses.rb +11 -16
- data/lib/rubocop/cop/style/min_max.rb +8 -12
- data/lib/rubocop/cop/style/missing_else.rb +11 -21
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +10 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +24 -27
- data/lib/rubocop/cop/style/mixin_usage.rb +1 -1
- data/lib/rubocop/cop/style/module_function.rb +10 -13
- data/lib/rubocop/cop/style/multiline_block_chain.rb +10 -1
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +3 -10
- data/lib/rubocop/cop/style/multiline_if_then.rb +5 -11
- data/lib/rubocop/cop/style/multiline_memoization.rb +14 -12
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -2
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +17 -8
- data/lib/rubocop/cop/style/multiline_when_then.rb +7 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +27 -24
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +5 -6
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +27 -0
- data/lib/rubocop/cop/style/next.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +7 -4
- data/lib/rubocop/cop/style/optional_boolean_parameter.rb +42 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +5 -5
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -2
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +5 -10
- data/lib/rubocop/cop/style/redundant_assignment.rb +117 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +15 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +18 -10
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +122 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +50 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +8 -2
- data/lib/rubocop/cop/style/redundant_percent_q.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +4 -3
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +23 -32
- data/lib/rubocop/cop/style/redundant_self.rb +6 -9
- data/lib/rubocop/cop/style/redundant_sort.rb +26 -12
- data/lib/rubocop/cop/style/rescue_standard_error.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +4 -4
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- data/lib/rubocop/cop/style/signal_exception.rb +3 -1
- data/lib/rubocop/cop/style/single_argument_dig.rb +54 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +3 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +92 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +23 -2
- data/lib/rubocop/cop/style/symbol_array.rb +6 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +2 -2
- data/lib/rubocop/cop/style/ternary_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +9 -32
- data/lib/rubocop/cop/style/trivial_accessors.rb +8 -7
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +18 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +12 -8
- data/lib/rubocop/cop/team.rb +98 -82
- data/lib/rubocop/cop/tokens_util.rb +84 -0
- data/lib/rubocop/cop/util.rb +5 -15
- data/lib/rubocop/cop/utils/format_string.rb +2 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -0
- data/lib/rubocop/cop/variable_force/variable.rb +7 -5
- data/lib/rubocop/cop/variable_force.rb +0 -2
- data/lib/rubocop/cops_documentation_generator.rb +282 -0
- data/lib/rubocop/error.rb +1 -0
- data/lib/rubocop/file_finder.rb +12 -12
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -3
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/name_similarity.rb +7 -3
- data/lib/rubocop/options.rb +18 -11
- data/lib/rubocop/path_util.rb +19 -19
- data/lib/rubocop/platform.rb +1 -1
- data/lib/rubocop/rake_task.rb +7 -9
- data/lib/rubocop/result_cache.rb +12 -8
- data/lib/rubocop/rspec/cop_helper.rb +4 -4
- data/lib/rubocop/rspec/expect_offense.rb +63 -22
- data/lib/rubocop/rspec/shared_contexts.rb +16 -17
- data/lib/rubocop/runner.rb +35 -34
- data/lib/rubocop/target_finder.rb +14 -11
- data/lib/rubocop/target_ruby.rb +2 -2
- data/lib/rubocop/version.rb +2 -2
- data/lib/rubocop.rb +33 -5
- metadata +49 -11
- data/lib/rubocop/cop/lint/useless_comparison.rb +0 -28
- data/lib/rubocop/cop/mixin/classish_length.rb +0 -37
- data/lib/rubocop/cop/mixin/parser_diagnostic.rb +0 -37
- data/lib/rubocop/cop/mixin/too_many_lines.rb +0 -35
- data/lib/rubocop/cop/style/method_missing_super.rb +0 -34
|
@@ -27,13 +27,14 @@ module RuboCop
|
|
|
27
27
|
# # frozen_string_literal: true
|
|
28
28
|
# p [''.frozen?, ''.encoding] #=> [true, #<Encoding:US-ASCII>]
|
|
29
29
|
#
|
|
30
|
-
class OrderedMagicComments <
|
|
30
|
+
class OrderedMagicComments < Base
|
|
31
31
|
include FrozenStringLiteral
|
|
32
|
+
extend AutoCorrector
|
|
32
33
|
|
|
33
34
|
MSG = 'The encoding magic comment should precede all other ' \
|
|
34
35
|
'magic comments.'
|
|
35
36
|
|
|
36
|
-
def
|
|
37
|
+
def on_new_investigation
|
|
37
38
|
return if processed_source.buffer.source.empty?
|
|
38
39
|
|
|
39
40
|
encoding_line, frozen_string_literal_line = magic_comment_lines
|
|
@@ -43,24 +44,21 @@ module RuboCop
|
|
|
43
44
|
|
|
44
45
|
range = processed_source.buffer.line_range(encoding_line + 1)
|
|
45
46
|
|
|
46
|
-
add_offense(range
|
|
47
|
+
add_offense(range) do |corrector|
|
|
48
|
+
autocorrect(corrector, encoding_line, frozen_string_literal_line)
|
|
49
|
+
end
|
|
47
50
|
end
|
|
48
51
|
|
|
49
|
-
|
|
50
|
-
encoding_line, frozen_string_literal_line = magic_comment_lines
|
|
52
|
+
private
|
|
51
53
|
|
|
54
|
+
def autocorrect(corrector, encoding_line, frozen_string_literal_line)
|
|
52
55
|
range1 = processed_source.buffer.line_range(encoding_line + 1)
|
|
53
|
-
range2 =
|
|
54
|
-
processed_source.buffer.line_range(frozen_string_literal_line + 1)
|
|
56
|
+
range2 = processed_source.buffer.line_range(frozen_string_literal_line + 1)
|
|
55
57
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
corrector.replace(range2, range1.source)
|
|
59
|
-
end
|
|
58
|
+
corrector.replace(range1, range2.source)
|
|
59
|
+
corrector.replace(range2, range1.source)
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
-
private
|
|
63
|
-
|
|
64
62
|
def magic_comment_lines
|
|
65
63
|
lines = [nil, nil]
|
|
66
64
|
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Lint
|
|
6
|
+
# This cops looks for references of Regexp captures that are out of range
|
|
7
|
+
# and thus always returns nil.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
#
|
|
11
|
+
# /(foo)bar/ =~ 'foobar'
|
|
12
|
+
#
|
|
13
|
+
# # bad - always returns nil
|
|
14
|
+
#
|
|
15
|
+
# puts $2 # => nil
|
|
16
|
+
#
|
|
17
|
+
# # good
|
|
18
|
+
#
|
|
19
|
+
# puts $1 # => foo
|
|
20
|
+
#
|
|
21
|
+
class OutOfRangeRegexpRef < Base
|
|
22
|
+
MSG = 'Do not use out of range reference for the Regexp.'
|
|
23
|
+
|
|
24
|
+
REGEXP_RECEIVER_METHODS = %i[=~ === match].to_set.freeze
|
|
25
|
+
REGEXP_ARGUMENT_METHODS = %i[=~ match grep gsub gsub! sub sub! [] slice slice! index rindex
|
|
26
|
+
scan partition rpartition start_with? end_with?].to_set.freeze
|
|
27
|
+
REGEXP_CAPTURE_METHODS = (REGEXP_RECEIVER_METHODS + REGEXP_ARGUMENT_METHODS).freeze
|
|
28
|
+
|
|
29
|
+
def on_new_investigation
|
|
30
|
+
@valid_ref = 0
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def on_match_with_lvasgn(node)
|
|
34
|
+
check_regexp(node.children.first)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def on_send(node)
|
|
38
|
+
return unless REGEXP_CAPTURE_METHODS.include?(node.method_name)
|
|
39
|
+
|
|
40
|
+
@valid_ref = nil
|
|
41
|
+
|
|
42
|
+
if node.receiver&.regexp_type?
|
|
43
|
+
check_regexp(node.receiver)
|
|
44
|
+
elsif node.first_argument&.regexp_type? \
|
|
45
|
+
&& REGEXP_ARGUMENT_METHODS.include?(node.method_name)
|
|
46
|
+
check_regexp(node.first_argument)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def on_when(node)
|
|
51
|
+
regexp_conditions = node.conditions.select(&:regexp_type?)
|
|
52
|
+
|
|
53
|
+
@valid_ref = regexp_conditions.map do |condition|
|
|
54
|
+
check_regexp(condition)
|
|
55
|
+
end.compact.max
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def on_nth_ref(node)
|
|
59
|
+
backref, = *node
|
|
60
|
+
return if @valid_ref.nil?
|
|
61
|
+
|
|
62
|
+
add_offense(node) if backref > @valid_ref
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
private
|
|
66
|
+
|
|
67
|
+
def check_regexp(regexp)
|
|
68
|
+
return if contain_non_literal?(regexp)
|
|
69
|
+
|
|
70
|
+
tree = Regexp::Parser.parse(regexp.content)
|
|
71
|
+
@valid_ref = regexp_captures(tree)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def contain_non_literal?(node)
|
|
75
|
+
node.children.size != 2 || !node.children.first.str_type?
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def regexp_captures(tree)
|
|
79
|
+
named_capture = numbered_capture = 0
|
|
80
|
+
tree.each_expression do |e|
|
|
81
|
+
if e.type?(:group)
|
|
82
|
+
e.respond_to?(:name) ? named_capture += 1 : numbered_capture += 1
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
named_capture.positive? ? named_capture : numbered_capture
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -15,8 +15,9 @@ module RuboCop
|
|
|
15
15
|
# do_something(foo)
|
|
16
16
|
# do_something (2 + 3) * 4
|
|
17
17
|
# do_something (foo * bar).baz
|
|
18
|
-
class ParenthesesAsGroupedExpression <
|
|
18
|
+
class ParenthesesAsGroupedExpression < Base
|
|
19
19
|
include RangeHelp
|
|
20
|
+
extend AutoCorrector
|
|
20
21
|
|
|
21
22
|
MSG = '`(...)` interpreted as grouped expression.'
|
|
22
23
|
|
|
@@ -28,18 +29,11 @@ module RuboCop
|
|
|
28
29
|
|
|
29
30
|
range = space_range(node.first_argument.source_range, space_length)
|
|
30
31
|
|
|
31
|
-
add_offense(
|
|
32
|
-
end
|
|
33
|
-
alias on_csend on_send
|
|
34
|
-
|
|
35
|
-
def autocorrect(node)
|
|
36
|
-
space_length = spaces_before_left_parenthesis(node)
|
|
37
|
-
range = space_range(node.first_argument.source_range, space_length)
|
|
38
|
-
|
|
39
|
-
lambda do |corrector|
|
|
32
|
+
add_offense(range) do |corrector|
|
|
40
33
|
corrector.remove(range)
|
|
41
34
|
end
|
|
42
35
|
end
|
|
36
|
+
alias on_csend on_send
|
|
43
37
|
|
|
44
38
|
private
|
|
45
39
|
|
|
@@ -48,17 +42,22 @@ module RuboCop
|
|
|
48
42
|
return true
|
|
49
43
|
end
|
|
50
44
|
|
|
51
|
-
node.operator_method? || node.setter_method? ||
|
|
45
|
+
node.operator_method? || node.setter_method? || chained_calls?(node) ||
|
|
46
|
+
operator_keyword?(node)
|
|
52
47
|
end
|
|
53
48
|
|
|
54
49
|
def first_argument_starts_with_left_parenthesis?(node)
|
|
55
50
|
node.first_argument.source.start_with?('(')
|
|
56
51
|
end
|
|
57
52
|
|
|
58
|
-
def
|
|
53
|
+
def chained_calls?(node)
|
|
59
54
|
first_argument = node.first_argument
|
|
55
|
+
first_argument.send_type? && (node.children.last&.children&.count || 0) > 1
|
|
56
|
+
end
|
|
60
57
|
|
|
61
|
-
|
|
58
|
+
def operator_keyword?(node)
|
|
59
|
+
first_argument = node.first_argument
|
|
60
|
+
first_argument.operator_keyword?
|
|
62
61
|
end
|
|
63
62
|
|
|
64
63
|
def spaces_before_left_parenthesis(node)
|
|
@@ -20,8 +20,9 @@ module RuboCop
|
|
|
20
20
|
# # good
|
|
21
21
|
#
|
|
22
22
|
# %w(foo bar)
|
|
23
|
-
class PercentStringArray <
|
|
23
|
+
class PercentStringArray < Base
|
|
24
24
|
include PercentLiteral
|
|
25
|
+
extend AutoCorrector
|
|
25
26
|
|
|
26
27
|
QUOTES_AND_COMMAS = [/,$/, /^'.*'$/, /^".*"$/].freeze
|
|
27
28
|
LEADING_QUOTE = /^['"]/.freeze
|
|
@@ -37,24 +38,24 @@ module RuboCop
|
|
|
37
38
|
def on_percent_literal(node)
|
|
38
39
|
return unless contains_quotes_or_commas?(node)
|
|
39
40
|
|
|
40
|
-
add_offense(node)
|
|
41
|
+
add_offense(node) do |corrector|
|
|
42
|
+
autocorrect(corrector, node)
|
|
43
|
+
end
|
|
41
44
|
end
|
|
42
45
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
def autocorrect(corrector, node)
|
|
49
|
+
node.each_value do |value|
|
|
50
|
+
range = value.loc.expression
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
match = range.source.match(TRAILING_QUOTE)
|
|
53
|
+
corrector.remove_trailing(range, match[0].length) if match
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
end
|
|
55
|
+
corrector.remove_leading(range, 1) if LEADING_QUOTE.match?(range.source)
|
|
53
56
|
end
|
|
54
57
|
end
|
|
55
58
|
|
|
56
|
-
private
|
|
57
|
-
|
|
58
59
|
def contains_quotes_or_commas?(node)
|
|
59
60
|
node.values.any? do |value|
|
|
60
61
|
literal = value.children.first.to_s.scrub
|
|
@@ -62,7 +63,7 @@ module RuboCop
|
|
|
62
63
|
# To avoid likely false positives (e.g. a single ' or ")
|
|
63
64
|
next if literal.gsub(/[^[[:alnum:]]]/, '').empty?
|
|
64
65
|
|
|
65
|
-
QUOTES_AND_COMMAS.any? { |pat| literal
|
|
66
|
+
QUOTES_AND_COMMAS.any? { |pat| literal.match?(pat) }
|
|
66
67
|
end
|
|
67
68
|
end
|
|
68
69
|
end
|
|
@@ -20,8 +20,9 @@ module RuboCop
|
|
|
20
20
|
# # good
|
|
21
21
|
#
|
|
22
22
|
# %i(foo bar)
|
|
23
|
-
class PercentSymbolArray <
|
|
23
|
+
class PercentSymbolArray < Base
|
|
24
24
|
include PercentLiteral
|
|
25
|
+
extend AutoCorrector
|
|
25
26
|
|
|
26
27
|
MSG = "Within `%i`/`%I`, ':' and ',' are unnecessary and may be " \
|
|
27
28
|
'unwanted in the resulting symbols.'
|
|
@@ -33,23 +34,23 @@ module RuboCop
|
|
|
33
34
|
def on_percent_literal(node)
|
|
34
35
|
return unless contains_colons_or_commas?(node)
|
|
35
36
|
|
|
36
|
-
add_offense(node)
|
|
37
|
+
add_offense(node) do |corrector|
|
|
38
|
+
autocorrect(corrector, node)
|
|
39
|
+
end
|
|
37
40
|
end
|
|
38
41
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def autocorrect(corrector, node)
|
|
45
|
+
node.children.each do |child|
|
|
46
|
+
range = child.loc.expression
|
|
43
47
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
end
|
|
48
|
+
corrector.remove_trailing(range, 1) if range.source.end_with?(',')
|
|
49
|
+
corrector.remove_leading(range, 1) if
|
|
50
|
+
range.source.start_with?(':')
|
|
48
51
|
end
|
|
49
52
|
end
|
|
50
53
|
|
|
51
|
-
private
|
|
52
|
-
|
|
53
54
|
def contains_colons_or_commas?(node)
|
|
54
55
|
node.children.any? do |child|
|
|
55
56
|
literal = child.children.first.to_s
|
|
@@ -61,7 +62,7 @@ module RuboCop
|
|
|
61
62
|
end
|
|
62
63
|
|
|
63
64
|
def non_alphanumeric_literal?(literal)
|
|
64
|
-
|
|
65
|
+
!/[[:alnum:]]/.match?(literal)
|
|
65
66
|
end
|
|
66
67
|
end
|
|
67
68
|
end
|
|
@@ -27,16 +27,18 @@ module RuboCop
|
|
|
27
27
|
# raise Exception # This exception means `Gem::Exception`.
|
|
28
28
|
# end
|
|
29
29
|
# end
|
|
30
|
-
class RaiseException <
|
|
30
|
+
class RaiseException < Base
|
|
31
|
+
extend AutoCorrector
|
|
32
|
+
|
|
31
33
|
MSG = 'Use `StandardError` over `Exception`.'
|
|
32
34
|
|
|
33
35
|
def_node_matcher :exception?, <<~PATTERN
|
|
34
|
-
(send nil? {:raise :fail} (const ${cbase nil?} :Exception) ... )
|
|
36
|
+
(send nil? {:raise :fail} $(const ${cbase nil?} :Exception) ... )
|
|
35
37
|
PATTERN
|
|
36
38
|
|
|
37
39
|
def_node_matcher :exception_new_with_message?, <<~PATTERN
|
|
38
40
|
(send nil? {:raise :fail}
|
|
39
|
-
(send (const ${cbase nil?} :Exception) :new ... ))
|
|
41
|
+
(send $(const ${cbase nil?} :Exception) :new ... ))
|
|
40
42
|
PATTERN
|
|
41
43
|
|
|
42
44
|
def on_send(node)
|
|
@@ -47,10 +49,18 @@ module RuboCop
|
|
|
47
49
|
private
|
|
48
50
|
|
|
49
51
|
def check(node)
|
|
50
|
-
lambda do |cbase|
|
|
52
|
+
lambda do |exception_class, cbase|
|
|
51
53
|
return if cbase.nil? && implicit_namespace?(node)
|
|
52
54
|
|
|
53
|
-
add_offense(
|
|
55
|
+
add_offense(exception_class) do |corrector|
|
|
56
|
+
prefer_exception = if exception_class.children.first&.cbase_type?
|
|
57
|
+
'::StandardError'
|
|
58
|
+
else
|
|
59
|
+
'StandardError'
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
corrector.replace(exception_class, prefer_exception)
|
|
63
|
+
end
|
|
54
64
|
end
|
|
55
65
|
end
|
|
56
66
|
|
|
@@ -20,16 +20,16 @@ module RuboCop
|
|
|
20
20
|
# # good
|
|
21
21
|
#
|
|
22
22
|
# 0 # just use 0 instead
|
|
23
|
-
class RandOne <
|
|
23
|
+
class RandOne < Base
|
|
24
24
|
MSG = '`%<method>s` always returns `0`. ' \
|
|
25
25
|
'Perhaps you meant `rand(2)` or `rand`?'
|
|
26
26
|
|
|
27
27
|
def_node_matcher :rand_one?, <<~PATTERN
|
|
28
|
-
(send {(const nil? :Kernel) nil?} :rand {(int {-1 1}) (float {-1.0 1.0})})
|
|
28
|
+
(send {(const {nil? cbase} :Kernel) nil?} :rand {(int {-1 1}) (float {-1.0 1.0})})
|
|
29
29
|
PATTERN
|
|
30
30
|
|
|
31
31
|
def on_send(node)
|
|
32
|
-
return unless rand_one?(node)
|
|
32
|
+
return unless node.method?(:rand) && rand_one?(node)
|
|
33
33
|
|
|
34
34
|
add_offense(node)
|
|
35
35
|
end
|
|
@@ -25,34 +25,33 @@ module RuboCop
|
|
|
25
25
|
#
|
|
26
26
|
# # good
|
|
27
27
|
# x += 1
|
|
28
|
-
class RedundantCopDisableDirective <
|
|
28
|
+
class RedundantCopDisableDirective < Base
|
|
29
29
|
include RangeHelp
|
|
30
|
+
extend AutoCorrector
|
|
30
31
|
|
|
31
32
|
COP_NAME = 'Lint/RedundantCopDisableDirective'
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
attr_accessor :offenses_to_check
|
|
35
|
+
|
|
36
|
+
def initialize(config = nil, options = nil, offenses = nil)
|
|
37
|
+
@offenses_to_check = offenses
|
|
38
|
+
super(config, options)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def on_new_investigation
|
|
42
|
+
return unless offenses_to_check
|
|
43
|
+
|
|
44
|
+
cop_disabled_line_ranges = processed_source.disabled_line_ranges
|
|
45
|
+
|
|
34
46
|
redundant_cops = Hash.new { |h, k| h[k] = Set.new }
|
|
35
47
|
|
|
36
48
|
each_redundant_disable(cop_disabled_line_ranges,
|
|
37
|
-
|
|
49
|
+
offenses_to_check) do |comment, redundant_cop|
|
|
38
50
|
redundant_cops[comment].add(redundant_cop)
|
|
39
51
|
end
|
|
40
52
|
|
|
41
53
|
add_offenses(redundant_cops)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
def autocorrect(args)
|
|
45
|
-
lambda do |corrector|
|
|
46
|
-
ranges, range = *args # Ranges are sorted by position.
|
|
47
|
-
|
|
48
|
-
range = if range.source.start_with?('#')
|
|
49
|
-
comment_range_with_surrounding_space(range)
|
|
50
|
-
else
|
|
51
|
-
directive_range_in_list(range, ranges)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
corrector.remove(range)
|
|
55
|
-
end
|
|
54
|
+
super
|
|
56
55
|
end
|
|
57
56
|
|
|
58
57
|
private
|
|
@@ -88,25 +87,25 @@ module RuboCop
|
|
|
88
87
|
newlines: false)
|
|
89
88
|
end
|
|
90
89
|
|
|
91
|
-
def each_redundant_disable(cop_disabled_line_ranges, offenses,
|
|
90
|
+
def each_redundant_disable(cop_disabled_line_ranges, offenses,
|
|
92
91
|
&block)
|
|
93
92
|
disabled_ranges = cop_disabled_line_ranges[COP_NAME] || [0..0]
|
|
94
93
|
|
|
95
94
|
cop_disabled_line_ranges.each do |cop, line_ranges|
|
|
96
95
|
each_already_disabled(line_ranges,
|
|
97
|
-
disabled_ranges
|
|
96
|
+
disabled_ranges) do |comment|
|
|
98
97
|
yield comment, cop
|
|
99
98
|
end
|
|
100
99
|
|
|
101
|
-
each_line_range(line_ranges, disabled_ranges, offenses,
|
|
100
|
+
each_line_range(line_ranges, disabled_ranges, offenses,
|
|
102
101
|
cop, &block)
|
|
103
102
|
end
|
|
104
103
|
end
|
|
105
104
|
|
|
106
|
-
def each_line_range(line_ranges, disabled_ranges, offenses,
|
|
105
|
+
def each_line_range(line_ranges, disabled_ranges, offenses,
|
|
107
106
|
cop)
|
|
108
107
|
line_ranges.each_with_index do |line_range, ix|
|
|
109
|
-
comment =
|
|
108
|
+
comment = processed_source.comment_at_line(line_range.begin)
|
|
110
109
|
next if ignore_offense?(disabled_ranges, line_range)
|
|
111
110
|
|
|
112
111
|
redundant_cop = find_redundant(comment, offenses, cop, line_range,
|
|
@@ -115,7 +114,7 @@ module RuboCop
|
|
|
115
114
|
end
|
|
116
115
|
end
|
|
117
116
|
|
|
118
|
-
def each_already_disabled(line_ranges, disabled_ranges
|
|
117
|
+
def each_already_disabled(line_ranges, disabled_ranges)
|
|
119
118
|
line_ranges.each_cons(2) do |previous_range, range|
|
|
120
119
|
next if ignore_offense?(disabled_ranges, range)
|
|
121
120
|
next if previous_range.end != range.begin
|
|
@@ -124,17 +123,16 @@ module RuboCop
|
|
|
124
123
|
# the end of the previous range, it means that the cop was
|
|
125
124
|
# already disabled by an earlier comment. So it's redundant
|
|
126
125
|
# whether there are offenses or not.
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
end
|
|
134
|
-
yield redundant_comment if redundant_comment
|
|
126
|
+
comment = processed_source.comment_at_line(range.begin)
|
|
127
|
+
|
|
128
|
+
# Comments disabling all cops don't count since it's reasonable
|
|
129
|
+
# to disable a few select cops first and then all cops further
|
|
130
|
+
# down in the code.
|
|
131
|
+
yield comment if comment && !all_disabled?(comment)
|
|
135
132
|
end
|
|
136
133
|
end
|
|
137
134
|
|
|
135
|
+
# rubocop:todo Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
138
136
|
def find_redundant(comment, offenses, cop, line_range, next_line_range)
|
|
139
137
|
if all_disabled?(comment)
|
|
140
138
|
# If there's a disable all comment followed by a comment
|
|
@@ -152,9 +150,10 @@ module RuboCop
|
|
|
152
150
|
cop if cop_offenses.none? { |o| line_range.cover?(o.line) }
|
|
153
151
|
end
|
|
154
152
|
end
|
|
153
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
155
154
|
|
|
156
155
|
def all_disabled?(comment)
|
|
157
|
-
|
|
156
|
+
/rubocop\s*:\s*(?:disable|todo)\s+all\b/.match?(comment.text)
|
|
158
157
|
end
|
|
159
158
|
|
|
160
159
|
def ignore_offense?(disabled_ranges, line_range)
|
|
@@ -185,10 +184,12 @@ module RuboCop
|
|
|
185
184
|
cop_list = cops.sort.map { |c| describe(c) }
|
|
186
185
|
|
|
187
186
|
add_offense(
|
|
188
|
-
|
|
189
|
-
location: location,
|
|
187
|
+
location,
|
|
190
188
|
message: "Unnecessary disabling of #{cop_list.join(', ')}."
|
|
191
|
-
)
|
|
189
|
+
) do |corrector|
|
|
190
|
+
range = comment_range_with_surrounding_space(location)
|
|
191
|
+
corrector.remove(range)
|
|
192
|
+
end
|
|
192
193
|
end
|
|
193
194
|
|
|
194
195
|
def add_offense_for_some_cops(comment, cops)
|
|
@@ -198,10 +199,12 @@ module RuboCop
|
|
|
198
199
|
|
|
199
200
|
cop_ranges.each do |cop, range|
|
|
200
201
|
add_offense(
|
|
201
|
-
|
|
202
|
-
location: range,
|
|
202
|
+
range,
|
|
203
203
|
message: "Unnecessary disabling of #{describe(cop)}."
|
|
204
|
-
)
|
|
204
|
+
) do |corrector|
|
|
205
|
+
range = directive_range_in_list(range, ranges)
|
|
206
|
+
corrector.remove(range)
|
|
207
|
+
end
|
|
205
208
|
end
|
|
206
209
|
end
|
|
207
210
|
|
|
@@ -225,7 +228,7 @@ module RuboCop
|
|
|
225
228
|
.drop_while { |r| !r.equal?(range) }
|
|
226
229
|
.each_cons(2)
|
|
227
230
|
.map { |range1, range2| range1.end.join(range2.begin).source }
|
|
228
|
-
.all? { |intervening|
|
|
231
|
+
.all? { |intervening| /\A\s*,\s*\Z/.match?(intervening) }
|
|
229
232
|
end
|
|
230
233
|
|
|
231
234
|
def describe(cop)
|
|
@@ -244,7 +247,7 @@ module RuboCop
|
|
|
244
247
|
end
|
|
245
248
|
|
|
246
249
|
def all_cop_names
|
|
247
|
-
@all_cop_names ||=
|
|
250
|
+
@all_cop_names ||= Registry.global.names
|
|
248
251
|
end
|
|
249
252
|
|
|
250
253
|
def ends_its_line?(range)
|
|
@@ -34,28 +34,24 @@ module RuboCop
|
|
|
34
34
|
# foo = "1"
|
|
35
35
|
# # rubocop:enable all
|
|
36
36
|
# baz
|
|
37
|
-
class RedundantCopEnableDirective <
|
|
37
|
+
class RedundantCopEnableDirective < Base
|
|
38
38
|
include RangeHelp
|
|
39
39
|
include SurroundingSpace
|
|
40
|
+
extend AutoCorrector
|
|
40
41
|
|
|
41
42
|
MSG = 'Unnecessary enabling of %<cop>s.'
|
|
42
43
|
|
|
43
|
-
def
|
|
44
|
+
def on_new_investigation
|
|
44
45
|
return if processed_source.blank?
|
|
45
46
|
|
|
46
47
|
offenses = processed_source.comment_config.extra_enabled_comments
|
|
47
48
|
offenses.each do |comment, name|
|
|
48
49
|
add_offense(
|
|
49
|
-
|
|
50
|
-
location: range_of_offense(comment, name),
|
|
50
|
+
range_of_offense(comment, name),
|
|
51
51
|
message: format(MSG, cop: all_or_name(name))
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def autocorrect(comment_and_name)
|
|
57
|
-
lambda do |corrector|
|
|
58
|
-
corrector.remove(range_with_comma(*comment_and_name))
|
|
52
|
+
) do |corrector|
|
|
53
|
+
corrector.remove(range_with_comma(comment, name))
|
|
54
|
+
end
|
|
59
55
|
end
|
|
60
56
|
end
|
|
61
57
|
|
|
@@ -21,8 +21,9 @@ module RuboCop
|
|
|
21
21
|
#
|
|
22
22
|
# # good
|
|
23
23
|
# require 'unloaded_feature'
|
|
24
|
-
class RedundantRequireStatement <
|
|
24
|
+
class RedundantRequireStatement < Base
|
|
25
25
|
include RangeHelp
|
|
26
|
+
extend AutoCorrector
|
|
26
27
|
|
|
27
28
|
MSG = 'Remove unnecessary `require` statement.'
|
|
28
29
|
|
|
@@ -34,13 +35,9 @@ module RuboCop
|
|
|
34
35
|
def on_send(node)
|
|
35
36
|
return unless unnecessary_require_statement?(node)
|
|
36
37
|
|
|
37
|
-
add_offense(node)
|
|
38
|
-
|
|
38
|
+
add_offense(node) do |corrector|
|
|
39
|
+
range = range_with_surrounding_space(range: node.loc.expression, side: :right)
|
|
39
40
|
|
|
40
|
-
def autocorrect(node)
|
|
41
|
-
lambda do |corrector|
|
|
42
|
-
range = range_with_surrounding_space(range: node.loc.expression,
|
|
43
|
-
side: :right)
|
|
44
41
|
corrector.remove(range)
|
|
45
42
|
end
|
|
46
43
|
end
|
|
@@ -49,7 +49,9 @@ module RuboCop
|
|
|
49
49
|
# else
|
|
50
50
|
# baz
|
|
51
51
|
# end
|
|
52
|
-
class RedundantSplatExpansion <
|
|
52
|
+
class RedundantSplatExpansion < Base
|
|
53
|
+
extend AutoCorrector
|
|
54
|
+
|
|
53
55
|
MSG = 'Replace splat expansion with comma separated values.'
|
|
54
56
|
ARRAY_PARAM_MSG = 'Pass array contents as separate arguments.'
|
|
55
57
|
PERCENT_W = '%w'
|
|
@@ -60,8 +62,8 @@ module RuboCop
|
|
|
60
62
|
|
|
61
63
|
def_node_matcher :array_new?, <<~PATTERN
|
|
62
64
|
{
|
|
63
|
-
$(send (const nil? :Array) :new ...)
|
|
64
|
-
$(block (send (const nil? :Array) :new ...) ...)
|
|
65
|
+
$(send (const {nil? cbase} :Array) :new ...)
|
|
66
|
+
$(block (send (const {nil? cbase} :Array) :new ...) ...)
|
|
65
67
|
}
|
|
66
68
|
PATTERN
|
|
67
69
|
|
|
@@ -73,23 +75,25 @@ module RuboCop
|
|
|
73
75
|
redundant_splat_expansion(node) do
|
|
74
76
|
if array_splat?(node) &&
|
|
75
77
|
(method_argument?(node) || part_of_an_array?(node))
|
|
76
|
-
add_offense(node, message: ARRAY_PARAM_MSG)
|
|
78
|
+
add_offense(node, message: ARRAY_PARAM_MSG) do |corrector|
|
|
79
|
+
autocorrect(corrector, node)
|
|
80
|
+
end
|
|
77
81
|
else
|
|
78
|
-
add_offense(node)
|
|
82
|
+
add_offense(node) do |corrector|
|
|
83
|
+
autocorrect(corrector, node)
|
|
84
|
+
end
|
|
79
85
|
end
|
|
80
86
|
end
|
|
81
87
|
end
|
|
82
88
|
|
|
83
|
-
|
|
89
|
+
private
|
|
90
|
+
|
|
91
|
+
def autocorrect(corrector, node)
|
|
84
92
|
range, content = replacement_range_and_content(node)
|
|
85
93
|
|
|
86
|
-
|
|
87
|
-
corrector.replace(range, content)
|
|
88
|
-
end
|
|
94
|
+
corrector.replace(range, content)
|
|
89
95
|
end
|
|
90
96
|
|
|
91
|
-
private
|
|
92
|
-
|
|
93
97
|
def redundant_splat_expansion(node)
|
|
94
98
|
literal_expansion(node) do |expanded_item|
|
|
95
99
|
if expanded_item.send_type?
|