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
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# This cop checks for places where `attr_reader` and `attr_writer`
|
|
7
|
+
# for the same method can be combined into single `attr_accessor`.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# # bad
|
|
11
|
+
# class Foo
|
|
12
|
+
# attr_reader :bar
|
|
13
|
+
# attr_writer :bar
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # good
|
|
17
|
+
# class Foo
|
|
18
|
+
# attr_accessor :bar
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
class BisectedAttrAccessor < Base
|
|
22
|
+
include VisibilityHelp
|
|
23
|
+
extend AutoCorrector
|
|
24
|
+
|
|
25
|
+
MSG = 'Combine both accessors into `attr_accessor %<name>s`.'
|
|
26
|
+
|
|
27
|
+
def on_class(class_node)
|
|
28
|
+
VISIBILITY_SCOPES.each do |visibility|
|
|
29
|
+
reader_names, writer_names = accessor_names(class_node, visibility)
|
|
30
|
+
next unless reader_names && writer_names
|
|
31
|
+
|
|
32
|
+
accessor_macroses(class_node, visibility).each do |macro|
|
|
33
|
+
check(macro, reader_names, writer_names)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
alias on_sclass on_class
|
|
38
|
+
alias on_module on_class
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
def accessor_names(class_node, visibility)
|
|
43
|
+
reader_names = nil
|
|
44
|
+
writer_names = nil
|
|
45
|
+
|
|
46
|
+
accessor_macroses(class_node, visibility).each do |macro|
|
|
47
|
+
names = macro.arguments.map(&:source)
|
|
48
|
+
|
|
49
|
+
names.each do |name|
|
|
50
|
+
if attr_reader?(macro)
|
|
51
|
+
(reader_names ||= Set.new).add(name)
|
|
52
|
+
else
|
|
53
|
+
(writer_names ||= Set.new).add(name)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
[reader_names, writer_names]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def accessor_macroses(class_node, visibility)
|
|
62
|
+
class_def = class_node.body
|
|
63
|
+
return [] if !class_def || class_def.def_type?
|
|
64
|
+
|
|
65
|
+
send_nodes =
|
|
66
|
+
if class_def.send_type?
|
|
67
|
+
[class_def]
|
|
68
|
+
else
|
|
69
|
+
class_def.each_child_node(:send)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
send_nodes.select { |node| attr_within_visibility_scope?(node, visibility) }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def attr_within_visibility_scope?(node, visibility)
|
|
76
|
+
node.macro? &&
|
|
77
|
+
(attr_reader?(node) || attr_writer?(node)) &&
|
|
78
|
+
node_visibility(node) == visibility
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def attr_reader?(send_node)
|
|
82
|
+
send_node.method?(:attr_reader) || send_node.method?(:attr)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def attr_writer?(send_node)
|
|
86
|
+
send_node.method?(:attr_writer)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def check(macro, reader_names, writer_names)
|
|
90
|
+
macro.arguments.each do |arg_node|
|
|
91
|
+
name = arg_node.source
|
|
92
|
+
|
|
93
|
+
next unless (attr_reader?(macro) && writer_names.include?(name)) ||
|
|
94
|
+
(attr_writer?(macro) && reader_names.include?(name))
|
|
95
|
+
|
|
96
|
+
add_offense(arg_node, message: format(MSG, name: name)) do |corrector|
|
|
97
|
+
macro = arg_node.parent
|
|
98
|
+
|
|
99
|
+
corrector.replace(macro, replacement(macro, arg_node))
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def replacement(macro, node)
|
|
105
|
+
class_node = macro.each_ancestor(:class, :sclass, :module).first
|
|
106
|
+
reader_names, writer_names = accessor_names(class_node, node_visibility(macro))
|
|
107
|
+
|
|
108
|
+
rest_args = rest_args(macro.arguments, reader_names, writer_names)
|
|
109
|
+
|
|
110
|
+
if attr_reader?(macro)
|
|
111
|
+
attr_reader_replacement(macro, node, rest_args)
|
|
112
|
+
elsif rest_args.empty?
|
|
113
|
+
''
|
|
114
|
+
else
|
|
115
|
+
"#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def rest_args(args, reader_names, writer_names)
|
|
120
|
+
args.reject do |arg|
|
|
121
|
+
name = arg.source
|
|
122
|
+
reader_names.include?(name) && writer_names.include?(name)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def attr_reader_replacement(macro, node, rest_args)
|
|
127
|
+
if rest_args.empty?
|
|
128
|
+
"attr_accessor #{node.source}"
|
|
129
|
+
else
|
|
130
|
+
"attr_accessor #{node.source}\n"\
|
|
131
|
+
"#{indent(macro)}#{macro.method_name} #{rest_args.map(&:source).join(', ')}"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def indent(node)
|
|
136
|
+
' ' * node.loc.column
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -16,34 +16,30 @@ module RuboCop
|
|
|
16
16
|
# # Multiple lines
|
|
17
17
|
# # of comments...
|
|
18
18
|
#
|
|
19
|
-
class BlockComments <
|
|
19
|
+
class BlockComments < Base
|
|
20
20
|
include RangeHelp
|
|
21
|
+
extend AutoCorrector
|
|
21
22
|
|
|
22
23
|
MSG = 'Do not use block comments.'
|
|
23
24
|
BEGIN_LENGTH = "=begin\n".length
|
|
24
25
|
END_LENGTH = "\n=end".length
|
|
25
26
|
|
|
26
|
-
def
|
|
27
|
-
processed_source.
|
|
27
|
+
def on_new_investigation
|
|
28
|
+
processed_source.comments.each do |comment|
|
|
28
29
|
next unless comment.document?
|
|
29
30
|
|
|
30
|
-
add_offense(comment)
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def autocorrect(comment)
|
|
35
|
-
eq_begin, eq_end, contents = parts(comment)
|
|
31
|
+
add_offense(comment) do |corrector|
|
|
32
|
+
eq_begin, eq_end, contents = parts(comment)
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
34
|
+
corrector.remove(eq_begin)
|
|
35
|
+
unless contents.length.zero?
|
|
36
|
+
corrector.replace(
|
|
37
|
+
contents,
|
|
38
|
+
contents.source.gsub(/\A/, '# ').gsub(/\n\n/, "\n#\n").gsub(/\n(?=[^#])/, "\n# ")
|
|
39
|
+
)
|
|
40
|
+
end
|
|
41
|
+
corrector.remove(eq_end)
|
|
45
42
|
end
|
|
46
|
-
corrector.remove(eq_end)
|
|
47
43
|
end
|
|
48
44
|
end
|
|
49
45
|
|
|
@@ -132,14 +132,14 @@ module RuboCop
|
|
|
132
132
|
# puts foo
|
|
133
133
|
# end
|
|
134
134
|
#
|
|
135
|
-
class BlockDelimiters <
|
|
135
|
+
class BlockDelimiters < Base
|
|
136
136
|
include ConfigurableEnforcedStyle
|
|
137
137
|
include IgnoredMethods
|
|
138
|
+
extend AutoCorrector
|
|
138
139
|
|
|
139
140
|
ALWAYS_BRACES_MESSAGE = 'Prefer `{...}` over `do...end` for blocks.'
|
|
140
141
|
|
|
141
|
-
BRACES_REQUIRED_MESSAGE =
|
|
142
|
-
"'%<method_name>s' method."
|
|
142
|
+
BRACES_REQUIRED_MESSAGE = "Brace delimiters `{...}` required for '%<method_name>s' method."
|
|
143
143
|
|
|
144
144
|
def on_send(node)
|
|
145
145
|
return unless node.arguments?
|
|
@@ -158,22 +158,26 @@ module RuboCop
|
|
|
158
158
|
|
|
159
159
|
def on_block(node)
|
|
160
160
|
return if ignored_node?(node)
|
|
161
|
+
return if proper_block_style?(node)
|
|
161
162
|
|
|
162
|
-
|
|
163
|
+
message = message(node)
|
|
164
|
+
add_offense(node.loc.begin, message: message) do |corrector|
|
|
165
|
+
autocorrect(corrector, node)
|
|
166
|
+
end
|
|
163
167
|
end
|
|
164
168
|
|
|
165
|
-
|
|
169
|
+
private
|
|
170
|
+
|
|
171
|
+
def autocorrect(corrector, node)
|
|
166
172
|
return if correction_would_break_code?(node)
|
|
167
173
|
|
|
168
174
|
if node.braces?
|
|
169
|
-
replace_braces_with_do_end(node.loc)
|
|
175
|
+
replace_braces_with_do_end(corrector, node.loc)
|
|
170
176
|
else
|
|
171
|
-
replace_do_end_with_braces(node.loc)
|
|
177
|
+
replace_do_end_with_braces(corrector, node.loc)
|
|
172
178
|
end
|
|
173
179
|
end
|
|
174
180
|
|
|
175
|
-
private
|
|
176
|
-
|
|
177
181
|
def line_count_based_message(node)
|
|
178
182
|
if node.multiline?
|
|
179
183
|
'Avoid using `{...}` for multi-line blocks.'
|
|
@@ -219,40 +223,35 @@ module RuboCop
|
|
|
219
223
|
end
|
|
220
224
|
end
|
|
221
225
|
|
|
222
|
-
def replace_braces_with_do_end(loc)
|
|
226
|
+
def replace_braces_with_do_end(corrector, loc)
|
|
223
227
|
b = loc.begin
|
|
224
228
|
e = loc.end
|
|
225
229
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
corrector.replace(e, 'end')
|
|
232
|
-
end
|
|
230
|
+
corrector.insert_before(b, ' ') unless whitespace_before?(b)
|
|
231
|
+
corrector.insert_before(e, ' ') unless whitespace_before?(e)
|
|
232
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b)
|
|
233
|
+
corrector.replace(b, 'do')
|
|
234
|
+
corrector.replace(e, 'end')
|
|
233
235
|
end
|
|
234
236
|
|
|
235
|
-
def replace_do_end_with_braces(loc)
|
|
237
|
+
def replace_do_end_with_braces(corrector, loc)
|
|
236
238
|
b = loc.begin
|
|
237
239
|
e = loc.end
|
|
238
240
|
|
|
239
|
-
|
|
240
|
-
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
|
241
|
+
corrector.insert_after(b, ' ') unless whitespace_after?(b, 2)
|
|
241
242
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
end
|
|
243
|
+
corrector.replace(b, '{')
|
|
244
|
+
corrector.replace(e, '}')
|
|
245
245
|
end
|
|
246
246
|
|
|
247
247
|
def whitespace_before?(range)
|
|
248
|
-
range.source_buffer.source[range.begin_pos - 1, 1]
|
|
248
|
+
/\s/.match?(range.source_buffer.source[range.begin_pos - 1, 1])
|
|
249
249
|
end
|
|
250
250
|
|
|
251
251
|
def whitespace_after?(range, length = 1)
|
|
252
|
-
range.source_buffer.source[range.begin_pos + length, 1]
|
|
252
|
+
/\s/.match?(range.source_buffer.source[range.begin_pos + length, 1])
|
|
253
253
|
end
|
|
254
254
|
|
|
255
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
|
256
255
|
def get_blocks(node, &block)
|
|
257
256
|
case node.type
|
|
258
257
|
when :block
|
|
@@ -270,7 +269,6 @@ module RuboCop
|
|
|
270
269
|
node.each_child_node { |child| get_blocks(child, &block) }
|
|
271
270
|
end
|
|
272
271
|
end
|
|
273
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
|
274
272
|
|
|
275
273
|
def proper_block_style?(node)
|
|
276
274
|
return special_method_proper_block_style?(node) if special_method?(node.method_name)
|
|
@@ -29,13 +29,20 @@ module RuboCop
|
|
|
29
29
|
# (1..100).include?(7)
|
|
30
30
|
# some_string =~ /something/
|
|
31
31
|
#
|
|
32
|
-
class CaseEquality <
|
|
32
|
+
class CaseEquality < Base
|
|
33
|
+
extend AutoCorrector
|
|
34
|
+
|
|
33
35
|
MSG = 'Avoid the use of the case equality operator `===`.'
|
|
34
36
|
|
|
35
|
-
def_node_matcher :case_equality?, '(send
|
|
37
|
+
def_node_matcher :case_equality?, '(send $#const? :=== $_)'
|
|
36
38
|
|
|
37
39
|
def on_send(node)
|
|
38
|
-
case_equality?(node)
|
|
40
|
+
case_equality?(node) do |lhs, rhs|
|
|
41
|
+
add_offense(node.loc.selector) do |corrector|
|
|
42
|
+
replacement = replacement(lhs, rhs)
|
|
43
|
+
corrector.replace(node, replacement) if replacement
|
|
44
|
+
end
|
|
45
|
+
end
|
|
39
46
|
end
|
|
40
47
|
|
|
41
48
|
private
|
|
@@ -47,6 +54,18 @@ module RuboCop
|
|
|
47
54
|
true
|
|
48
55
|
end
|
|
49
56
|
end
|
|
57
|
+
|
|
58
|
+
def replacement(lhs, rhs)
|
|
59
|
+
case lhs.type
|
|
60
|
+
when :regexp
|
|
61
|
+
"#{rhs.source} =~ #{lhs.source}"
|
|
62
|
+
when :begin
|
|
63
|
+
child = lhs.children.first
|
|
64
|
+
"#{lhs.source}.include?(#{rhs.source})" if child&.range_type?
|
|
65
|
+
when :const
|
|
66
|
+
"#{rhs.source}.is_a?(#{lhs.source})"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
50
69
|
end
|
|
51
70
|
end
|
|
52
71
|
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Style
|
|
6
|
+
# This cop identifies places where `if-elsif` constructions
|
|
7
|
+
# can be replaced with `case-when`.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# # bad
|
|
11
|
+
# if status == :active
|
|
12
|
+
# perform_action
|
|
13
|
+
# elsif status == :inactive || status == :hibernating
|
|
14
|
+
# check_timeout
|
|
15
|
+
# else
|
|
16
|
+
# final_action
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# # good
|
|
20
|
+
# case status
|
|
21
|
+
# when :active
|
|
22
|
+
# perform_action
|
|
23
|
+
# when :inactive, :hibernating
|
|
24
|
+
# check_timeout
|
|
25
|
+
# else
|
|
26
|
+
# final_action
|
|
27
|
+
# end
|
|
28
|
+
#
|
|
29
|
+
class CaseLikeIf < Base
|
|
30
|
+
include RangeHelp
|
|
31
|
+
extend AutoCorrector
|
|
32
|
+
|
|
33
|
+
MSG = 'Convert `if-elsif` to `case-when`.'
|
|
34
|
+
|
|
35
|
+
def on_if(node)
|
|
36
|
+
return unless should_check?(node)
|
|
37
|
+
|
|
38
|
+
target = find_target(node.condition)
|
|
39
|
+
return unless target
|
|
40
|
+
|
|
41
|
+
conditions = []
|
|
42
|
+
convertible = true
|
|
43
|
+
|
|
44
|
+
branch_conditions(node).each do |branch_condition|
|
|
45
|
+
conditions << []
|
|
46
|
+
convertible = collect_conditions(branch_condition, target, conditions.last)
|
|
47
|
+
break unless convertible
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
return unless convertible
|
|
51
|
+
|
|
52
|
+
add_offense(node) do |corrector|
|
|
53
|
+
autocorrect(corrector, node)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def autocorrect(corrector, node)
|
|
60
|
+
target = find_target(node.condition)
|
|
61
|
+
|
|
62
|
+
corrector.insert_before(node, "case #{target.source}\n#{indent(node)}")
|
|
63
|
+
|
|
64
|
+
branch_conditions(node).each do |branch_condition|
|
|
65
|
+
conditions = []
|
|
66
|
+
collect_conditions(branch_condition, target, conditions)
|
|
67
|
+
|
|
68
|
+
range = correction_range(branch_condition)
|
|
69
|
+
branch_replacement = "when #{conditions.map(&:source).join(', ')}"
|
|
70
|
+
corrector.replace(range, branch_replacement)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def should_check?(node)
|
|
75
|
+
!node.unless? && !node.elsif? && !node.modifier_form? && !node.ternary? &&
|
|
76
|
+
node.elsif_conditional?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# rubocop:disable Metrics/MethodLength
|
|
80
|
+
def find_target(node)
|
|
81
|
+
case node.type
|
|
82
|
+
when :begin
|
|
83
|
+
find_target(node.children.first)
|
|
84
|
+
when :or
|
|
85
|
+
find_target(node.lhs)
|
|
86
|
+
when :match_with_lvasgn
|
|
87
|
+
lhs, rhs = *node
|
|
88
|
+
if lhs.regexp_type?
|
|
89
|
+
rhs
|
|
90
|
+
elsif rhs.regexp_type?
|
|
91
|
+
lhs
|
|
92
|
+
end
|
|
93
|
+
when :send
|
|
94
|
+
find_target_in_send_node(node)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
# rubocop:enable Metrics/MethodLength
|
|
98
|
+
|
|
99
|
+
def find_target_in_send_node(node)
|
|
100
|
+
case node.method_name
|
|
101
|
+
when :is_a?
|
|
102
|
+
node.receiver
|
|
103
|
+
when :==, :eql?, :equal?
|
|
104
|
+
find_target_in_equality_node(node)
|
|
105
|
+
when :===
|
|
106
|
+
node.arguments.first
|
|
107
|
+
when :include?, :cover?
|
|
108
|
+
receiver = deparenthesize(node.receiver)
|
|
109
|
+
node.arguments.first if receiver.range_type?
|
|
110
|
+
when :match, :match?
|
|
111
|
+
find_target_in_match_node(node)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def find_target_in_equality_node(node)
|
|
116
|
+
argument = node.arguments.first
|
|
117
|
+
receiver = node.receiver
|
|
118
|
+
return unless receiver
|
|
119
|
+
|
|
120
|
+
if argument.literal? || const_reference?(argument)
|
|
121
|
+
receiver
|
|
122
|
+
elsif receiver.literal? || const_reference?(receiver)
|
|
123
|
+
argument
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def find_target_in_match_node(node)
|
|
128
|
+
argument = node.arguments.first
|
|
129
|
+
receiver = node.receiver
|
|
130
|
+
return unless receiver
|
|
131
|
+
|
|
132
|
+
if receiver.regexp_type?
|
|
133
|
+
argument
|
|
134
|
+
elsif argument.regexp_type?
|
|
135
|
+
receiver
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def collect_conditions(node, target, conditions)
|
|
140
|
+
condition =
|
|
141
|
+
case node.type
|
|
142
|
+
when :begin
|
|
143
|
+
return collect_conditions(node.children.first, target, conditions)
|
|
144
|
+
when :or
|
|
145
|
+
return collect_conditions(node.lhs, target, conditions) &&
|
|
146
|
+
collect_conditions(node.rhs, target, conditions)
|
|
147
|
+
when :match_with_lvasgn
|
|
148
|
+
lhs, rhs = *node
|
|
149
|
+
condition_from_binary_op(lhs, rhs, target)
|
|
150
|
+
when :send
|
|
151
|
+
condition_from_send_node(node, target)
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
conditions << condition if condition
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
|
158
|
+
def condition_from_send_node(node, target)
|
|
159
|
+
case node.method_name
|
|
160
|
+
when :is_a?
|
|
161
|
+
node.arguments.first if node.receiver == target
|
|
162
|
+
when :==, :eql?, :equal?, :=~, :match, :match?
|
|
163
|
+
lhs, _method, rhs = *node
|
|
164
|
+
condition_from_binary_op(lhs, rhs, target)
|
|
165
|
+
when :===
|
|
166
|
+
lhs, _method, rhs = *node
|
|
167
|
+
lhs if rhs == target
|
|
168
|
+
when :include?, :cover?
|
|
169
|
+
receiver = deparenthesize(node.receiver)
|
|
170
|
+
receiver if receiver.range_type? && node.arguments.first == target
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
|
174
|
+
|
|
175
|
+
def condition_from_binary_op(lhs, rhs, target)
|
|
176
|
+
lhs = deparenthesize(lhs)
|
|
177
|
+
rhs = deparenthesize(rhs)
|
|
178
|
+
|
|
179
|
+
if lhs == target
|
|
180
|
+
rhs
|
|
181
|
+
elsif rhs == target
|
|
182
|
+
lhs
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def branch_conditions(node)
|
|
187
|
+
conditions = []
|
|
188
|
+
while node&.if_type?
|
|
189
|
+
conditions << node.condition
|
|
190
|
+
node = node.else_branch
|
|
191
|
+
end
|
|
192
|
+
conditions
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def const_reference?(node)
|
|
196
|
+
return false unless node.const_type?
|
|
197
|
+
|
|
198
|
+
name = node.children[1].to_s
|
|
199
|
+
|
|
200
|
+
# We can no be sure if, e.g. `C`, represents a constant or a class reference
|
|
201
|
+
name.length > 1 &&
|
|
202
|
+
name == name.upcase
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
def deparenthesize(node)
|
|
206
|
+
node = node.children.last while node.begin_type?
|
|
207
|
+
node
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def correction_range(node)
|
|
211
|
+
range_between(node.parent.loc.keyword.begin_pos, node.loc.expression.end_pos)
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def indent(node)
|
|
215
|
+
' ' * node.loc.column
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
@@ -21,9 +21,10 @@ module RuboCop
|
|
|
21
21
|
# end
|
|
22
22
|
#
|
|
23
23
|
# The compact style is only forced for classes/modules with one child.
|
|
24
|
-
class ClassAndModuleChildren <
|
|
24
|
+
class ClassAndModuleChildren < Base
|
|
25
25
|
include ConfigurableEnforcedStyle
|
|
26
26
|
include RangeHelp
|
|
27
|
+
extend AutoCorrector
|
|
27
28
|
|
|
28
29
|
NESTED_MSG = 'Use nested module/class definitions instead of ' \
|
|
29
30
|
'compact style.'
|
|
@@ -40,14 +41,6 @@ module RuboCop
|
|
|
40
41
|
check_style(node, node.body)
|
|
41
42
|
end
|
|
42
43
|
|
|
43
|
-
def autocorrect(node)
|
|
44
|
-
lambda do |corrector|
|
|
45
|
-
return if node.class_type? && node.parent_class && style != :nested
|
|
46
|
-
|
|
47
|
-
nest_or_compact(corrector, node)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
44
|
private
|
|
52
45
|
|
|
53
46
|
def nest_or_compact(corrector, node)
|
|
@@ -129,13 +122,23 @@ module RuboCop
|
|
|
129
122
|
def check_nested_style(node)
|
|
130
123
|
return unless compact_node_name?(node)
|
|
131
124
|
|
|
132
|
-
add_offense(node
|
|
125
|
+
add_offense(node.loc.name, message: NESTED_MSG) do |corrector|
|
|
126
|
+
autocorrect(corrector, node)
|
|
127
|
+
end
|
|
133
128
|
end
|
|
134
129
|
|
|
135
130
|
def check_compact_style(node, body)
|
|
136
131
|
return unless one_child?(body) && !compact_node_name?(node)
|
|
137
132
|
|
|
138
|
-
add_offense(node
|
|
133
|
+
add_offense(node.loc.name, message: COMPACT_MSG) do |corrector|
|
|
134
|
+
autocorrect(corrector, node)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def autocorrect(corrector, node)
|
|
139
|
+
return if node.class_type? && node.parent_class && style != :nested
|
|
140
|
+
|
|
141
|
+
nest_or_compact(corrector, node)
|
|
139
142
|
end
|
|
140
143
|
|
|
141
144
|
def one_child?(body)
|
|
@@ -143,7 +146,7 @@ module RuboCop
|
|
|
143
146
|
end
|
|
144
147
|
|
|
145
148
|
def compact_node_name?(node)
|
|
146
|
-
node.loc.name.source
|
|
149
|
+
/::/.match?(node.loc.name.source)
|
|
147
150
|
end
|
|
148
151
|
end
|
|
149
152
|
end
|
|
@@ -23,8 +23,9 @@ module RuboCop
|
|
|
23
23
|
# var.kind_of?(Time)
|
|
24
24
|
# var.kind_of?(String)
|
|
25
25
|
#
|
|
26
|
-
class ClassCheck <
|
|
26
|
+
class ClassCheck < Base
|
|
27
27
|
include ConfigurableEnforcedStyle
|
|
28
|
+
extend AutoCorrector
|
|
28
29
|
|
|
29
30
|
MSG = 'Prefer `Object#%<prefer>s` over `Object#%<current>s`.'
|
|
30
31
|
|
|
@@ -34,15 +35,12 @@ module RuboCop
|
|
|
34
35
|
class_check?(node) do |method_name|
|
|
35
36
|
return if style == method_name
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
def autocorrect(node)
|
|
42
|
-
lambda do |corrector|
|
|
43
|
-
replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
|
|
38
|
+
message = message(node)
|
|
39
|
+
add_offense(node.loc.selector, message: message) do |corrector|
|
|
40
|
+
replacement = node.method?(:is_a?) ? 'kind_of?' : 'is_a?'
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
corrector.replace(node.loc.selector, replacement)
|
|
43
|
+
end
|
|
46
44
|
end
|
|
47
45
|
end
|
|
48
46
|
|
|
@@ -20,7 +20,9 @@ module RuboCop
|
|
|
20
20
|
# # ...
|
|
21
21
|
# end
|
|
22
22
|
# end
|
|
23
|
-
class ClassMethods <
|
|
23
|
+
class ClassMethods < Base
|
|
24
|
+
extend AutoCorrector
|
|
25
|
+
|
|
24
26
|
MSG = 'Use `self.%<method>s` instead of `%<class>s.%<method>s`.'
|
|
25
27
|
|
|
26
28
|
def on_class(node)
|
|
@@ -36,23 +38,17 @@ module RuboCop
|
|
|
36
38
|
end
|
|
37
39
|
alias on_module on_class
|
|
38
40
|
|
|
39
|
-
def autocorrect(node)
|
|
40
|
-
->(corrector) { corrector.replace(node.loc.name, 'self') }
|
|
41
|
-
end
|
|
42
|
-
|
|
43
41
|
private
|
|
44
42
|
|
|
45
43
|
def check_defs(name, node)
|
|
46
44
|
# check if the class/module name matches the definee for the defs node
|
|
47
45
|
return unless name == node.receiver
|
|
48
46
|
|
|
49
|
-
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def message(node)
|
|
53
|
-
_, class_name = *node
|
|
47
|
+
message = format(MSG, method: node.method_name, class: name.source)
|
|
54
48
|
|
|
55
|
-
|
|
49
|
+
add_offense(node.receiver.loc.name, message: message) do |corrector|
|
|
50
|
+
corrector.replace(node.receiver, 'self')
|
|
51
|
+
end
|
|
56
52
|
end
|
|
57
53
|
end
|
|
58
54
|
end
|