rubocop 1.10.0 → 1.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +15 -14
- data/assets/output.html.erb +1 -1
- data/config/default.yml +60 -3
- data/exe/rubocop +1 -3
- data/lib/rubocop.rb +6 -1
- data/lib/rubocop/cached_data.rb +1 -3
- data/lib/rubocop/cli.rb +4 -6
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +9 -19
- data/lib/rubocop/cli/command/execute_runner.rb +1 -1
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -3
- data/lib/rubocop/cli/command/show_cops.rb +1 -4
- data/lib/rubocop/cli/command/suggest_extensions.rb +3 -2
- data/lib/rubocop/comment_config.rb +45 -101
- data/lib/rubocop/config.rb +11 -26
- data/lib/rubocop/config_loader.rb +5 -11
- data/lib/rubocop/config_loader_resolver.rb +22 -14
- data/lib/rubocop/config_obsoletion/cop_rule.rb +1 -2
- data/lib/rubocop/config_store.rb +1 -2
- data/lib/rubocop/config_validator.rb +5 -10
- data/lib/rubocop/cop/autocorrect_logic.rb +3 -8
- data/lib/rubocop/cop/badge.rb +1 -2
- data/lib/rubocop/cop/base.rb +8 -6
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
- data/lib/rubocop/cop/bundler/gem_comment.rb +43 -10
- data/lib/rubocop/cop/bundler/gem_version.rb +99 -0
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +2 -4
- data/lib/rubocop/cop/commissioner.rb +2 -8
- data/lib/rubocop/cop/cop.rb +4 -18
- data/lib/rubocop/cop/corrector.rb +1 -4
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +6 -12
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +2 -4
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -2
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +3 -6
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -3
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -8
- data/lib/rubocop/cop/gemspec/date_assignment.rb +1 -0
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +3 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +2 -4
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +2 -0
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +2 -0
- data/lib/rubocop/cop/generator.rb +3 -6
- data/lib/rubocop/cop/generator/configuration_injector.rb +1 -2
- data/lib/rubocop/cop/generator/require_file_injector.rb +2 -5
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +7 -4
- data/lib/rubocop/cop/internal_affairs/method_name_equal.rb +3 -5
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +151 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +2 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +3 -0
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +5 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +3 -3
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +12 -10
- data/lib/rubocop/cop/layout/argument_alignment.rb +8 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +7 -6
- data/lib/rubocop/cop/layout/assignment_indentation.rb +8 -7
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -4
- data/lib/rubocop/cop/layout/block_alignment.rb +8 -19
- data/lib/rubocop/cop/layout/block_end_newline.rb +4 -8
- data/lib/rubocop/cop/layout/case_indentation.rb +1 -3
- data/lib/rubocop/cop/layout/class_structure.rb +5 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +18 -30
- data/lib/rubocop/cop/layout/comment_indentation.rb +17 -21
- data/lib/rubocop/cop/layout/def_end_alignment.rb +2 -6
- data/lib/rubocop/cop/layout/dot_position.rb +1 -3
- data/lib/rubocop/cop/layout/else_alignment.rb +10 -9
- data/lib/rubocop/cop/layout/empty_comment.rb +5 -12
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -8
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +2 -6
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -3
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +8 -18
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -8
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +5 -9
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +11 -5
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +10 -8
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +24 -20
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +1 -2
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +6 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -9
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -6
- data/lib/rubocop/cop/layout/indentation_consistency.rb +9 -6
- data/lib/rubocop/cop/layout/indentation_style.rb +25 -30
- data/lib/rubocop/cop/layout/indentation_width.rb +21 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -4
- data/lib/rubocop/cop/layout/line_length.rb +4 -15
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +7 -15
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +1 -2
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +22 -15
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +10 -5
- data/lib/rubocop/cop/layout/parameter_alignment.rb +6 -5
- data/lib/rubocop/cop/layout/redundant_line_break.rb +137 -0
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +53 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +1 -3
- data/lib/rubocop/cop/layout/space_after_method_name.rb +2 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +6 -14
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +1 -2
- data/lib/rubocop/cop/layout/space_around_keyword.rb +3 -6
- data/lib/rubocop/cop/layout/space_around_operators.rb +4 -9
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +2 -3
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -3
- data/lib/rubocop/cop/layout/space_before_comment.rb +1 -3
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +5 -11
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -4
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +2 -7
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +6 -11
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +1 -2
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +1 -2
- data/lib/rubocop/cop/legacy/corrections_proxy.rb +2 -8
- data/lib/rubocop/cop/legacy/corrector.rb +1 -3
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -6
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +14 -7
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -0
- data/lib/rubocop/cop/lint/boolean_symbol.rb +2 -2
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +2 -0
- data/lib/rubocop/cop/lint/constant_resolution.rb +2 -2
- data/lib/rubocop/cop/lint/debugger.rb +3 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +79 -41
- data/lib/rubocop/cop/lint/deprecated_constants.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +3 -5
- data/lib/rubocop/cop/lint/duplicate_branch.rb +2 -3
- data/lib/rubocop/cop/lint/duplicate_hash_key.rb +1 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +6 -7
- data/lib/rubocop/cop/lint/duplicate_require.rb +1 -0
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -0
- data/lib/rubocop/cop/lint/else_layout.rb +1 -3
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -3
- data/lib/rubocop/cop/lint/empty_file.rb +1 -3
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -3
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -3
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -7
- data/lib/rubocop/cop/lint/float_out_of_range.rb +1 -2
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +4 -6
- data/lib/rubocop/cop/lint/hash_compare_by_identity.rb +1 -0
- data/lib/rubocop/cop/lint/heredoc_method_call_position.rb +1 -2
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -2
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +4 -7
- data/lib/rubocop/cop/lint/inherit_exception.rb +2 -2
- data/lib/rubocop/cop/lint/interpolation_check.rb +3 -11
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +3 -6
- data/lib/rubocop/cop/lint/loop.rb +1 -2
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +3 -7
- data/lib/rubocop/cop/lint/missing_super.rb +1 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -2
- data/lib/rubocop/cop/lint/multiple_comparison.rb +1 -0
- data/lib/rubocop/cop/lint/nested_method_definition.rb +4 -2
- data/lib/rubocop/cop/lint/nested_percent_literal.rb +1 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +8 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -0
- data/lib/rubocop/cop/lint/number_conversion.rb +13 -5
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +1 -2
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +1 -3
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -3
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -3
- data/lib/rubocop/cop/lint/raise_exception.rb +3 -2
- data/lib/rubocop/cop/lint/rand_one.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +9 -22
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -0
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +2 -3
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +5 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_with_index.rb +2 -4
- data/lib/rubocop/cop/lint/redundant_with_object.rb +2 -4
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +1 -3
- data/lib/rubocop/cop/lint/require_parentheses.rb +2 -4
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -2
- data/lib/rubocop/cop/lint/rescue_type.rb +2 -7
- data/lib/rubocop/cop/lint/return_in_void_context.rb +1 -2
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +2 -2
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +4 -10
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +2 -2
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +3 -7
- data/lib/rubocop/cop/lint/shadowed_argument.rb +5 -11
- data/lib/rubocop/cop/lint/shadowed_exception.rb +7 -8
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +1 -0
- data/lib/rubocop/cop/lint/struct_new_override.rb +2 -2
- data/lib/rubocop/cop/lint/suppressed_exception.rb +44 -1
- data/lib/rubocop/cop/lint/symbol_conversion.rb +91 -6
- data/lib/rubocop/cop/lint/syntax.rb +1 -3
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +3 -0
- data/lib/rubocop/cop/lint/to_json.rb +1 -2
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +1 -3
- data/lib/rubocop/cop/lint/underscore_prefixed_variable_name.rb +1 -3
- data/lib/rubocop/cop/lint/unified_integer.rb +1 -0
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +5 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +3 -5
- data/lib/rubocop/cop/lint/unreachable_loop.rb +15 -7
- data/lib/rubocop/cop/lint/unused_block_argument.rb +9 -7
- data/lib/rubocop/cop/lint/unused_method_argument.rb +2 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +4 -9
- data/lib/rubocop/cop/lint/useless_setter_call.rb +2 -3
- data/lib/rubocop/cop/lint/useless_times.rb +3 -0
- data/lib/rubocop/cop/lint/void.rb +4 -11
- data/lib/rubocop/cop/message_annotator.rb +1 -3
- data/lib/rubocop/cop/metrics/block_nesting.rb +2 -7
- data/lib/rubocop/cop/metrics/class_length.rb +1 -3
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +1 -2
- data/lib/rubocop/cop/metrics/module_length.rb +3 -6
- data/lib/rubocop/cop/metrics/parameter_lists.rb +3 -5
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -7
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +6 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +4 -7
- data/lib/rubocop/cop/migration/department_name.rb +3 -7
- data/lib/rubocop/cop/mixin/alignment.rb +12 -7
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -3
- data/lib/rubocop/cop/mixin/comments_help.rb +5 -1
- data/lib/rubocop/cop/mixin/configurable_enforced_style.rb +2 -2
- data/lib/rubocop/cop/mixin/configurable_formatting.rb +3 -8
- data/lib/rubocop/cop/mixin/def_node.rb +3 -5
- data/lib/rubocop/cop/mixin/documentation_comment.rb +3 -6
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +6 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +2 -3
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -3
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -6
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +1 -3
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +3 -9
- data/lib/rubocop/cop/mixin/gem_declaration.rb +13 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +3 -6
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +8 -22
- data/lib/rubocop/cop/mixin/interpolation.rb +1 -3
- data/lib/rubocop/cop/mixin/line_length_help.rb +13 -10
- data/lib/rubocop/cop/mixin/match_range.rb +2 -5
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -3
- data/lib/rubocop/cop/mixin/method_preference.rb +1 -2
- data/lib/rubocop/cop/mixin/multiline_element_indentation.rb +4 -3
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +1 -3
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +11 -40
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -2
- data/lib/rubocop/cop/mixin/negative_conditional.rb +4 -2
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -4
- data/lib/rubocop/cop/mixin/percent_array.rb +1 -3
- data/lib/rubocop/cop/mixin/percent_literal.rb +0 -6
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +5 -11
- data/lib/rubocop/cop/mixin/preferred_delimiters.rb +4 -7
- data/lib/rubocop/cop/mixin/range_help.rb +10 -13
- data/lib/rubocop/cop/mixin/rational_literal.rb +1 -0
- data/lib/rubocop/cop/mixin/rescue_node.rb +2 -6
- data/lib/rubocop/cop/mixin/safe_assignment.rb +6 -2
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +2 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -2
- data/lib/rubocop/cop/mixin/statement_modifier.rb +1 -3
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/trailing_body.rb +1 -2
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -2
- data/lib/rubocop/cop/mixin/uncommunicative_name.rb +7 -13
- data/lib/rubocop/cop/mixin/unused_argument.rb +1 -3
- data/lib/rubocop/cop/mixin/visibility_help.rb +1 -0
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +2 -4
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +2 -2
- data/lib/rubocop/cop/naming/constant_name.rb +2 -0
- data/lib/rubocop/cop/naming/file_name.rb +7 -16
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +8 -3
- data/lib/rubocop/cop/naming/method_name.rb +4 -2
- data/lib/rubocop/cop/naming/predicate_name.rb +2 -2
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +10 -0
- data/lib/rubocop/cop/offense.rb +3 -8
- data/lib/rubocop/cop/registry.rb +12 -11
- data/lib/rubocop/cop/security/eval.rb +1 -0
- data/lib/rubocop/cop/security/json_load.rb +1 -0
- data/lib/rubocop/cop/security/marshal_load.rb +1 -0
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +1 -0
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +4 -5
- data/lib/rubocop/cop/style/accessor_grouping.rb +1 -3
- data/lib/rubocop/cop/style/alias.rb +6 -12
- data/lib/rubocop/cop/style/and_or.rb +3 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +4 -3
- data/lib/rubocop/cop/style/array_coercion.rb +2 -0
- data/lib/rubocop/cop/style/array_join.rb +1 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -2
- data/lib/rubocop/cop/style/attr.rb +2 -3
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +2 -5
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +59 -71
- data/lib/rubocop/cop/style/bisected_attr_accessor/macro.rb +60 -0
- data/lib/rubocop/cop/style/case_equality.rb +2 -1
- data/lib/rubocop/cop/style/case_like_if.rb +16 -6
- data/lib/rubocop/cop/style/character_literal.rb +2 -4
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -9
- data/lib/rubocop/cop/style/class_equality_comparison.rb +3 -0
- data/lib/rubocop/cop/style/class_methods.rb +1 -3
- data/lib/rubocop/cop/style/collection_compact.rb +3 -3
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -3
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +4 -9
- data/lib/rubocop/cop/style/comment_annotation.rb +3 -6
- data/lib/rubocop/cop/style/commented_keyword.rb +7 -13
- data/lib/rubocop/cop/style/conditional_assignment.rb +12 -24
- data/lib/rubocop/cop/style/constant_visibility.rb +1 -0
- data/lib/rubocop/cop/style/copyright.rb +3 -6
- data/lib/rubocop/cop/style/date_time.rb +5 -5
- data/lib/rubocop/cop/style/def_with_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/dir.rb +1 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +30 -3
- data/lib/rubocop/cop/style/documentation_method.rb +1 -0
- data/lib/rubocop/cop/style/double_negation.rb +1 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +2 -2
- data/lib/rubocop/cop/style/each_with_object.rb +1 -0
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -7
- data/lib/rubocop/cop/style/empty_else.rb +3 -9
- data/lib/rubocop/cop/style/empty_literal.rb +13 -8
- data/lib/rubocop/cop/style/empty_method.rb +3 -7
- data/lib/rubocop/cop/style/end_block.rb +1 -2
- data/lib/rubocop/cop/style/endless_method.rb +2 -3
- data/lib/rubocop/cop/style/eval_with_location.rb +5 -5
- data/lib/rubocop/cop/style/even_odd.rb +1 -0
- data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +2 -4
- data/lib/rubocop/cop/style/float_division.rb +4 -0
- data/lib/rubocop/cop/style/format_string.rb +2 -0
- data/lib/rubocop/cop/style/format_string_token.rb +2 -4
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -11
- data/lib/rubocop/cop/style/global_std_stream.rb +1 -0
- data/lib/rubocop/cop/style/guard_clause.rb +3 -7
- data/lib/rubocop/cop/style/hash_conversion.rb +57 -5
- data/lib/rubocop/cop/style/hash_each_methods.rb +2 -2
- data/lib/rubocop/cop/style/hash_except.rb +1 -0
- data/lib/rubocop/cop/style/hash_like_case.rb +2 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +20 -24
- data/lib/rubocop/cop/style/hash_transform_keys.rb +4 -0
- data/lib/rubocop/cop/style/hash_transform_values.rb +4 -0
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +1 -3
- data/lib/rubocop/cop/style/if_unless_modifier.rb +40 -13
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +1 -0
- data/lib/rubocop/cop/style/infinite_loop.rb +2 -5
- data/lib/rubocop/cop/style/inverse_methods.rb +5 -7
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/lambda.rb +2 -4
- data/lib/rubocop/cop/style/lambda_call.rb +1 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +5 -12
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +47 -3
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +26 -16
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +4 -8
- data/lib/rubocop/cop/style/min_max.rb +2 -2
- data/lib/rubocop/cop/style/missing_else.rb +2 -4
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +1 -2
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -10
- data/lib/rubocop/cop/style/mixin_usage.rb +3 -2
- data/lib/rubocop/cop/style/module_function.rb +8 -6
- data/lib/rubocop/cop/style/multiline_block_chain.rb +1 -2
- data/lib/rubocop/cop/style/multiline_method_signature.rb +11 -6
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -2
- data/lib/rubocop/cop/style/multiple_comparison.rb +22 -5
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -10
- data/lib/rubocop/cop/style/negated_if.rb +1 -2
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +24 -2
- data/lib/rubocop/cop/style/negated_unless.rb +1 -2
- data/lib/rubocop/cop/style/nested_modifier.rb +3 -7
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +2 -3
- data/lib/rubocop/cop/style/next.rb +4 -9
- data/lib/rubocop/cop/style/nil_comparison.rb +3 -0
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -0
- data/lib/rubocop/cop/style/non_nil_check.rb +9 -5
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -11
- data/lib/rubocop/cop/style/numeric_predicate.rb +5 -7
- data/lib/rubocop/cop/style/one_line_conditional.rb +1 -2
- data/lib/rubocop/cop/style/option_hash.rb +2 -3
- data/lib/rubocop/cop/style/optional_arguments.rb +2 -5
- data/lib/rubocop/cop/style/or_assignment.rb +4 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +12 -9
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +1 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +2 -9
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +1 -4
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/raise_args.rb +4 -8
- data/lib/rubocop/cop/style/random_with_offset.rb +8 -8
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -11
- data/lib/rubocop/cop/style/redundant_assignment.rb +2 -3
- data/lib/rubocop/cop/style/redundant_begin.rb +47 -7
- data/lib/rubocop/cop/style/redundant_capital_w.rb +1 -2
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -5
- data/lib/rubocop/cop/style/redundant_conditional.rb +5 -6
- data/lib/rubocop/cop/style/redundant_exception.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +2 -0
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +2 -1
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/redundant_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -4
- data/lib/rubocop/cop/style/redundant_return.rb +6 -4
- data/lib/rubocop/cop/style/redundant_self.rb +9 -9
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +4 -2
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -5
- data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +4 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +21 -14
- data/lib/rubocop/cop/style/rescue_standard_error.rb +5 -7
- data/lib/rubocop/cop/style/return_nil.rb +7 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +12 -21
- data/lib/rubocop/cop/style/sample.rb +1 -0
- data/lib/rubocop/cop/style/send.rb +1 -2
- data/lib/rubocop/cop/style/signal_exception.rb +6 -7
- data/lib/rubocop/cop/style/single_argument_dig.rb +2 -2
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -5
- data/lib/rubocop/cop/style/single_line_methods.rb +21 -4
- data/lib/rubocop/cop/style/slicing_with_range.rb +1 -0
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +31 -7
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -18
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -2
- data/lib/rubocop/cop/style/stderr_puts.rb +3 -6
- data/lib/rubocop/cop/style/string_chars.rb +39 -0
- data/lib/rubocop/cop/style/string_concatenation.rb +9 -10
- data/lib/rubocop/cop/style/string_hash_keys.rb +2 -0
- data/lib/rubocop/cop/style/string_literals.rb +2 -5
- data/lib/rubocop/cop/style/strip.rb +1 -0
- data/lib/rubocop/cop/style/struct_inheritance.rb +11 -0
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +29 -10
- data/lib/rubocop/cop/style/ternary_parentheses.rb +4 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +6 -2
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +2 -6
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +3 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -10
- data/lib/rubocop/cop/style/trivial_accessors.rb +3 -4
- data/lib/rubocop/cop/style/unless_else.rb +1 -2
- data/lib/rubocop/cop/style/unless_logical_operators.rb +105 -0
- data/lib/rubocop/cop/style/unpack_first.rb +1 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/when_then.rb +1 -3
- data/lib/rubocop/cop/style/while_until_modifier.rb +1 -2
- data/lib/rubocop/cop/style/word_array.rb +1 -2
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -11
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -2
- data/lib/rubocop/cop/team.rb +2 -5
- data/lib/rubocop/cop/util.rb +8 -11
- data/lib/rubocop/cop/utils/format_string.rb +1 -3
- data/lib/rubocop/cop/variable_force.rb +6 -15
- data/lib/rubocop/cop/variable_force/assignment.rb +1 -2
- data/lib/rubocop/cop/variable_force/branch.rb +16 -2
- data/lib/rubocop/cop/variable_force/reference.rb +1 -3
- data/lib/rubocop/cop/variable_force/scope.rb +4 -8
- data/lib/rubocop/cop/variable_force/variable.rb +2 -4
- data/lib/rubocop/cops_documentation_generator.rb +7 -21
- data/lib/rubocop/directive_comment.rb +69 -9
- data/lib/rubocop/ext/regexp_parser.rb +3 -6
- data/lib/rubocop/file_finder.rb +1 -3
- data/lib/rubocop/formatter/clang_style_formatter.rb +4 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +3 -8
- data/lib/rubocop/formatter/git_hub_actions_formatter.rb +1 -5
- data/lib/rubocop/formatter/html_formatter.rb +4 -10
- data/lib/rubocop/formatter/json_formatter.rb +1 -5
- data/lib/rubocop/formatter/junit_formatter.rb +3 -9
- data/lib/rubocop/formatter/progress_formatter.rb +1 -3
- data/lib/rubocop/formatter/tap_formatter.rb +4 -2
- data/lib/rubocop/magic_comment.rb +1 -1
- data/lib/rubocop/name_similarity.rb +1 -1
- data/lib/rubocop/options.rb +27 -41
- data/lib/rubocop/path_util.rb +1 -3
- data/lib/rubocop/rake_task.rb +3 -0
- data/lib/rubocop/remote_config.rb +4 -7
- data/lib/rubocop/result_cache.rb +5 -12
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +4 -9
- data/lib/rubocop/rspec/shared_contexts.rb +8 -15
- data/lib/rubocop/runner.rb +7 -14
- data/lib/rubocop/target_finder.rb +19 -16
- data/lib/rubocop/target_ruby.rb +25 -21
- data/lib/rubocop/version.rb +1 -1
- metadata +18 -11
- data/lib/rubocop/core_ext/hash.rb +0 -20
@@ -33,6 +33,7 @@ module RuboCop
|
|
33
33
|
MSG_EACH_WITH_INDEX = 'Use `each` instead of `each_with_index`.'
|
34
34
|
MSG_WITH_INDEX = 'Remove redundant `with_index`.'
|
35
35
|
|
36
|
+
# @!method redundant_with_index?(node)
|
36
37
|
def_node_matcher :redundant_with_index?, <<~PATTERN
|
37
38
|
(block
|
38
39
|
$(send
|
@@ -68,10 +69,7 @@ module RuboCop
|
|
68
69
|
end
|
69
70
|
|
70
71
|
def with_index_range(send)
|
71
|
-
range_between(
|
72
|
-
send.loc.selector.begin_pos,
|
73
|
-
send.loc.expression.end_pos
|
74
|
-
)
|
72
|
+
range_between(send.loc.selector.begin_pos, send.loc.expression.end_pos)
|
75
73
|
end
|
76
74
|
end
|
77
75
|
end
|
@@ -34,6 +34,7 @@ module RuboCop
|
|
34
34
|
|
35
35
|
MSG_WITH_OBJECT = 'Remove redundant `with_object`.'
|
36
36
|
|
37
|
+
# @!method redundant_with_object?(node)
|
37
38
|
def_node_matcher :redundant_with_object?, <<~PATTERN
|
38
39
|
(block
|
39
40
|
$(send _ {:each_with_object :with_object}
|
@@ -69,10 +70,7 @@ module RuboCop
|
|
69
70
|
end
|
70
71
|
|
71
72
|
def with_object_range(send)
|
72
|
-
range_between(
|
73
|
-
send.loc.selector.begin_pos,
|
74
|
-
send.loc.expression.end_pos
|
75
|
-
)
|
73
|
+
range_between(send.loc.selector.begin_pos, send.loc.expression.end_pos)
|
76
74
|
end
|
77
75
|
end
|
78
76
|
end
|
@@ -23,9 +23,7 @@ module RuboCop
|
|
23
23
|
' The regexp literal matches `$_` implicitly.'
|
24
24
|
|
25
25
|
def on_match_current_line(node)
|
26
|
-
add_offense(node)
|
27
|
-
corrector.replace(node, "#{node.source} =~ $_")
|
28
|
-
end
|
26
|
+
add_offense(node) { |corrector| corrector.replace(node, "#{node.source} =~ $_") }
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
@@ -30,8 +30,7 @@ module RuboCop
|
|
30
30
|
class RequireParentheses < Base
|
31
31
|
include RangeHelp
|
32
32
|
|
33
|
-
MSG = 'Use parentheses in the method call to avoid confusion about '
|
34
|
-
'precedence.'
|
33
|
+
MSG = 'Use parentheses in the method call to avoid confusion about precedence.'
|
35
34
|
|
36
35
|
def on_send(node)
|
37
36
|
return if !node.arguments? || node.parenthesized?
|
@@ -49,8 +48,7 @@ module RuboCop
|
|
49
48
|
def check_ternary(ternary, node)
|
50
49
|
return unless ternary.condition.operator_keyword?
|
51
50
|
|
52
|
-
range = range_between(node.source_range.begin_pos,
|
53
|
-
ternary.condition.source_range.end_pos)
|
51
|
+
range = range_between(node.source_range.begin_pos, ternary.condition.source_range.end_pos)
|
54
52
|
|
55
53
|
add_offense(range)
|
56
54
|
end
|
@@ -25,8 +25,7 @@ module RuboCop
|
|
25
25
|
# handle_exception
|
26
26
|
# end
|
27
27
|
class RescueException < Base
|
28
|
-
MSG = 'Avoid rescuing the `Exception` class. '
|
29
|
-
'Perhaps you meant to rescue `StandardError`?'
|
28
|
+
MSG = 'Avoid rescuing the `Exception` class. Perhaps you meant to rescue `StandardError`?'
|
30
29
|
|
31
30
|
def on_resbody(node)
|
32
31
|
return unless node.children.first
|
@@ -51,10 +51,7 @@ module RuboCop
|
|
51
51
|
|
52
52
|
add_offense(
|
53
53
|
node.loc.keyword.join(rescued.loc.expression),
|
54
|
-
message: format(
|
55
|
-
MSG, invalid_exceptions: invalid_exceptions.map(&:source)
|
56
|
-
.join(', ')
|
57
|
-
)
|
54
|
+
message: format(MSG, invalid_exceptions: invalid_exceptions.map(&:source).join(', '))
|
58
55
|
) do |corrector|
|
59
56
|
autocorrect(corrector, node)
|
60
57
|
end
|
@@ -83,9 +80,7 @@ module RuboCop
|
|
83
80
|
end
|
84
81
|
|
85
82
|
def invalid_exceptions(exceptions)
|
86
|
-
exceptions.select
|
87
|
-
INVALID_TYPES.include?(exception.type)
|
88
|
-
end
|
83
|
+
exceptions.select { |exception| INVALID_TYPES.include?(exception.type) }
|
89
84
|
end
|
90
85
|
end
|
91
86
|
end
|
@@ -63,8 +63,7 @@ module RuboCop
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def setter_method?(method_name)
|
66
|
-
method_name.to_s.end_with?('=') &&
|
67
|
-
!AST::Node::COMPARISON_OPERATORS.include?(method_name)
|
66
|
+
method_name.to_s.end_with?('=') && !AST::Node::COMPARISON_OPERATORS.include?(method_name)
|
68
67
|
end
|
69
68
|
end
|
70
69
|
end
|
@@ -26,9 +26,9 @@ module RuboCop
|
|
26
26
|
class SafeNavigationChain < Base
|
27
27
|
include NilMethods
|
28
28
|
|
29
|
-
MSG = 'Do not chain ordinary method call'
|
30
|
-
' after safe navigation operator.'
|
29
|
+
MSG = 'Do not chain ordinary method call after safe navigation operator.'
|
31
30
|
|
31
|
+
# @!method bad_method?(node)
|
32
32
|
def_node_matcher :bad_method?, <<~PATTERN
|
33
33
|
{
|
34
34
|
(send $(csend ...) $_ ...)
|
@@ -31,8 +31,7 @@ module RuboCop
|
|
31
31
|
include NilMethods
|
32
32
|
extend AutoCorrector
|
33
33
|
|
34
|
-
MSG = 'Ensure that safe navigation is used consistently '
|
35
|
-
'inside of `&&` and `||`.'
|
34
|
+
MSG = 'Ensure that safe navigation is used consistently inside of `&&` and `||`.'
|
36
35
|
|
37
36
|
def on_csend(node)
|
38
37
|
return unless node.parent&.operator_keyword?
|
@@ -46,15 +45,12 @@ module RuboCop
|
|
46
45
|
safe_nav_receiver = node.receiver
|
47
46
|
|
48
47
|
method_calls = conditions.select(&:send_type?)
|
49
|
-
unsafe_method_calls =
|
50
|
-
unsafe_method_calls(method_calls, safe_nav_receiver)
|
48
|
+
unsafe_method_calls = unsafe_method_calls(method_calls, safe_nav_receiver)
|
51
49
|
|
52
50
|
unsafe_method_calls.each do |unsafe_method_call|
|
53
51
|
location = location(node, unsafe_method_call)
|
54
52
|
|
55
|
-
add_offense(location)
|
56
|
-
autocorrect(corrector, unsafe_method_call)
|
57
|
-
end
|
53
|
+
add_offense(location) { |corrector| autocorrect(corrector, unsafe_method_call) }
|
58
54
|
|
59
55
|
ignore_node(unsafe_method_call)
|
60
56
|
end
|
@@ -76,9 +72,7 @@ module RuboCop
|
|
76
72
|
parent = node.parent
|
77
73
|
unless parent &&
|
78
74
|
(parent.operator_keyword? ||
|
79
|
-
(parent.begin_type? &&
|
80
|
-
parent.parent &&
|
81
|
-
parent.parent.operator_keyword?))
|
75
|
+
(parent.begin_type? && parent.parent && parent.parent.operator_keyword?))
|
82
76
|
return node
|
83
77
|
end
|
84
78
|
|
@@ -22,9 +22,9 @@ module RuboCop
|
|
22
22
|
class SafeNavigationWithEmpty < Base
|
23
23
|
extend AutoCorrector
|
24
24
|
|
25
|
-
MSG = 'Avoid calling `empty?` with the safe navigation operator '
|
26
|
-
'in conditionals.'
|
25
|
+
MSG = 'Avoid calling `empty?` with the safe navigation operator in conditionals.'
|
27
26
|
|
27
|
+
# @!method safe_navigation_empty_in_conditional?(node)
|
28
28
|
def_node_matcher :safe_navigation_empty_in_conditional?, <<~PATTERN
|
29
29
|
(if (csend (send ...) :empty?) ...)
|
30
30
|
PATTERN
|
@@ -43,6 +43,7 @@ module RuboCop
|
|
43
43
|
SEND_METHODS = %i[send public_send __send__].freeze
|
44
44
|
RESTRICT_ON_SEND = SEND_METHODS
|
45
45
|
|
46
|
+
# @!method send_with_mixin_argument?(node)
|
46
47
|
def_node_matcher :send_with_mixin_argument?, <<~PATTERN
|
47
48
|
(send
|
48
49
|
(const _ _) {:#{SEND_METHODS.join(' :')}}
|
@@ -52,9 +53,7 @@ module RuboCop
|
|
52
53
|
|
53
54
|
def on_send(node)
|
54
55
|
send_with_mixin_argument?(node) do |method, module_name|
|
55
|
-
message = message(
|
56
|
-
method, module_name.source, bad_location(node).source
|
57
|
-
)
|
56
|
+
message = message(method, module_name.source, bad_location(node).source)
|
58
57
|
|
59
58
|
bad_location = bad_location(node)
|
60
59
|
add_offense(bad_location, message: message) do |corrector|
|
@@ -72,10 +71,7 @@ module RuboCop
|
|
72
71
|
end
|
73
72
|
|
74
73
|
def message(method, module_name, bad_method)
|
75
|
-
format(
|
76
|
-
MSG,
|
77
|
-
method: method, module_name: module_name, bad_method: bad_method
|
78
|
-
)
|
74
|
+
format(MSG, method: method, module_name: module_name, bad_method: bad_method)
|
79
75
|
end
|
80
76
|
|
81
77
|
def mixin_method?(node)
|
@@ -64,9 +64,9 @@ module RuboCop
|
|
64
64
|
# end
|
65
65
|
#
|
66
66
|
class ShadowedArgument < Base
|
67
|
-
MSG = 'Argument `%<argument>s` was shadowed by a local variable '
|
68
|
-
'before it was used.'
|
67
|
+
MSG = 'Argument `%<argument>s` was shadowed by a local variable before it was used.'
|
69
68
|
|
69
|
+
# @!method uses_var?(node)
|
70
70
|
def_node_search :uses_var?, '(lvar %)'
|
71
71
|
|
72
72
|
def self.joining_forces
|
@@ -74,9 +74,7 @@ module RuboCop
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def after_leaving_scope(scope, _variable_table)
|
77
|
-
scope.variables.each_value
|
78
|
-
check_argument(variable)
|
79
|
-
end
|
77
|
+
scope.variables.each_value { |variable| check_argument(variable) }
|
80
78
|
end
|
81
79
|
|
82
80
|
private
|
@@ -127,8 +125,7 @@ module RuboCop
|
|
127
125
|
next false if assignment_node.shorthand_asgn?
|
128
126
|
|
129
127
|
node_within_block_or_conditional =
|
130
|
-
node_within_block_or_conditional?(assignment_node.parent,
|
131
|
-
argument.scope.node)
|
128
|
+
node_within_block_or_conditional?(assignment_node.parent, argument.scope.node)
|
132
129
|
|
133
130
|
unless uses_var?(assignment_node, argument.name)
|
134
131
|
# It's impossible to decide whether a branch or block is executed,
|
@@ -161,10 +158,7 @@ module RuboCop
|
|
161
158
|
# Get argument references without assignments' references
|
162
159
|
#
|
163
160
|
def argument_references(argument)
|
164
|
-
assignment_references = argument
|
165
|
-
.assignments
|
166
|
-
.flat_map(&:references)
|
167
|
-
.map(&:source_range)
|
161
|
+
assignment_references = argument.assignments.flat_map(&:references).map(&:source_range)
|
168
162
|
|
169
163
|
argument.references.reject do |ref|
|
170
164
|
next false unless ref.explicit?
|
@@ -59,8 +59,7 @@ module RuboCop
|
|
59
59
|
contains_multiple_levels_of_exceptions?(group)
|
60
60
|
end
|
61
61
|
|
62
|
-
return if !rescue_group_rescues_multiple_levels &&
|
63
|
-
sorted?(rescued_groups)
|
62
|
+
return if !rescue_group_rescues_multiple_levels && sorted?(rescued_groups)
|
64
63
|
|
65
64
|
add_offense(offense_range(rescues))
|
66
65
|
end
|
@@ -74,18 +73,14 @@ module RuboCop
|
|
74
73
|
end
|
75
74
|
|
76
75
|
def rescued_groups_for(rescues)
|
77
|
-
rescues.map
|
78
|
-
evaluate_exceptions(group)
|
79
|
-
end
|
76
|
+
rescues.map { |group| evaluate_exceptions(group) }
|
80
77
|
end
|
81
78
|
|
82
79
|
def contains_multiple_levels_of_exceptions?(group)
|
83
80
|
# Always treat `Exception` as the highest level exception.
|
84
81
|
return true if group.size > 1 && group.include?(Exception)
|
85
82
|
|
86
|
-
group.combination(2).any?
|
87
|
-
compare_exceptions(a, b)
|
88
|
-
end
|
83
|
+
group.combination(2).any? { |a, b| compare_exceptions(a, b) }
|
89
84
|
end
|
90
85
|
|
91
86
|
def compare_exceptions(exception, other_exception)
|
@@ -111,6 +106,9 @@ module RuboCop
|
|
111
106
|
|
112
107
|
if rescued_exceptions.any?
|
113
108
|
rescued_exceptions.each_with_object([]) do |exception, converted|
|
109
|
+
# FIXME: Workaround `rubocop:disable` comment for JRuby.
|
110
|
+
# https://github.com/jruby/jruby/issues/6642
|
111
|
+
# rubocop:disable Style/RedundantBegin
|
114
112
|
begin
|
115
113
|
RuboCop::Util.silence_warnings do
|
116
114
|
# Avoid printing deprecation warnings about constants
|
@@ -119,6 +117,7 @@ module RuboCop
|
|
119
117
|
rescue NameError
|
120
118
|
converted << nil
|
121
119
|
end
|
120
|
+
# rubocop:enable Style/RedundantBegin
|
122
121
|
end
|
123
122
|
else
|
124
123
|
# treat an empty `rescue` as `rescue StandardError`
|
@@ -42,6 +42,7 @@ module RuboCop
|
|
42
42
|
class ShadowingOuterLocalVariable < Base
|
43
43
|
MSG = 'Shadowing outer local variable - `%<variable>s`.'
|
44
44
|
|
45
|
+
# @!method ractor_block?(node)
|
45
46
|
def_node_matcher :ractor_block?, <<~PATTERN
|
46
47
|
(block (send (const nil? :Ractor) :new ...) ...)
|
47
48
|
PATTERN
|
@@ -29,6 +29,7 @@ module RuboCop
|
|
29
29
|
STRUCT_METHOD_NAMES = Struct.instance_methods
|
30
30
|
STRUCT_MEMBER_NAME_TYPES = %i[sym str].freeze
|
31
31
|
|
32
|
+
# @!method struct_new(node)
|
32
33
|
def_node_matcher :struct_new, <<~PATTERN
|
33
34
|
(send
|
34
35
|
(const ${nil? cbase} :Struct) :new ...)
|
@@ -47,8 +48,7 @@ module RuboCop
|
|
47
48
|
|
48
49
|
next unless STRUCT_METHOD_NAMES.include?(member_name.to_sym)
|
49
50
|
|
50
|
-
message = format(MSG, member_name: member_name.inspect,
|
51
|
-
method_name: member_name.to_s)
|
51
|
+
message = format(MSG, member_name: member_name.inspect, method_name: member_name.to_s)
|
52
52
|
add_offense(arg, message: message)
|
53
53
|
end
|
54
54
|
end
|
@@ -64,12 +64,51 @@ module RuboCop
|
|
64
64
|
# rescue
|
65
65
|
# # do nothing
|
66
66
|
# end
|
67
|
+
#
|
68
|
+
# @example AllowNil: true (default)
|
69
|
+
#
|
70
|
+
# # good
|
71
|
+
# def some_method
|
72
|
+
# do_something
|
73
|
+
# rescue
|
74
|
+
# nil
|
75
|
+
# end
|
76
|
+
#
|
77
|
+
# # good
|
78
|
+
# begin
|
79
|
+
# do_something
|
80
|
+
# rescue
|
81
|
+
# # do nothing
|
82
|
+
# end
|
83
|
+
#
|
84
|
+
# # good
|
85
|
+
# do_something rescue nil
|
86
|
+
#
|
87
|
+
# @example AllowNil: false
|
88
|
+
#
|
89
|
+
# # bad
|
90
|
+
# def some_method
|
91
|
+
# do_something
|
92
|
+
# rescue
|
93
|
+
# nil
|
94
|
+
# end
|
95
|
+
#
|
96
|
+
# # bad
|
97
|
+
# begin
|
98
|
+
# do_something
|
99
|
+
# rescue
|
100
|
+
# nil
|
101
|
+
# end
|
102
|
+
#
|
103
|
+
# # bad
|
104
|
+
# do_something rescue nil
|
67
105
|
class SuppressedException < Base
|
68
106
|
MSG = 'Do not suppress exceptions.'
|
69
107
|
|
70
108
|
def on_resbody(node)
|
71
|
-
return if node.body
|
109
|
+
return if node.body && !nil_body?(node)
|
72
110
|
return if cop_config['AllowComments'] && comment_between_rescue_and_end?(node)
|
111
|
+
return if cop_config['AllowNil'] && nil_body?(node)
|
73
112
|
|
74
113
|
add_offense(node)
|
75
114
|
end
|
@@ -83,6 +122,10 @@ module RuboCop
|
|
83
122
|
end_line = ancestor.loc.end.line
|
84
123
|
processed_source[node.first_line...end_line].any? { |line| comment_line?(line) }
|
85
124
|
end
|
125
|
+
|
126
|
+
def nil_body?(node)
|
127
|
+
node.body&.nil_type?
|
128
|
+
end
|
86
129
|
end
|
87
130
|
end
|
88
131
|
end
|
@@ -6,6 +6,12 @@ module RuboCop
|
|
6
6
|
# This cop checks for uses of literal strings converted to
|
7
7
|
# a symbol where a literal symbol could be used instead.
|
8
8
|
#
|
9
|
+
# There are two possible styles for this cop.
|
10
|
+
# `strict` (default) will register an offense for any incorrect usage.
|
11
|
+
# `consistent` additionally requires hashes to use the same style for
|
12
|
+
# every symbol key (ie. if any symbol key needs to be quoted it requires
|
13
|
+
# all keys to be quoted).
|
14
|
+
#
|
9
15
|
# @example
|
10
16
|
# # bad
|
11
17
|
# 'string'.to_sym
|
@@ -21,10 +27,49 @@ module RuboCop
|
|
21
27
|
# :underscored_symbol
|
22
28
|
# :'hyphenated-string'
|
23
29
|
#
|
30
|
+
# @example EnforcedStyle: strict (default)
|
31
|
+
#
|
32
|
+
# # bad
|
33
|
+
# {
|
34
|
+
# 'a': 1,
|
35
|
+
# "b": 2,
|
36
|
+
# 'c-d': 3
|
37
|
+
# }
|
38
|
+
#
|
39
|
+
# # good (don't quote keys that don't require quoting)
|
40
|
+
# {
|
41
|
+
# a: 1,
|
42
|
+
# b: 2,
|
43
|
+
# 'c-d': 3
|
44
|
+
# }
|
45
|
+
#
|
46
|
+
# @example EnforcedStyle: consistent
|
47
|
+
#
|
48
|
+
# # bad
|
49
|
+
# {
|
50
|
+
# a: 1,
|
51
|
+
# 'b-c': 2
|
52
|
+
# }
|
53
|
+
#
|
54
|
+
# # good (quote all keys if any need quoting)
|
55
|
+
# {
|
56
|
+
# 'a': 1,
|
57
|
+
# 'b-c': 2
|
58
|
+
# }
|
59
|
+
#
|
60
|
+
# # good (no quoting required)
|
61
|
+
# {
|
62
|
+
# a: 1,
|
63
|
+
# b: 2
|
64
|
+
# }
|
65
|
+
#
|
24
66
|
class SymbolConversion < Base
|
25
67
|
extend AutoCorrector
|
68
|
+
include ConfigurableEnforcedStyle
|
26
69
|
|
27
70
|
MSG = 'Unnecessary symbol conversion; use `%<correction>s` instead.'
|
71
|
+
MSG_CONSISTENCY = 'Symbol hash key should be quoted for consistency; ' \
|
72
|
+
'use `%<correction>s` instead.'
|
28
73
|
RESTRICT_ON_SEND = %i[to_sym intern].freeze
|
29
74
|
|
30
75
|
def on_send(node)
|
@@ -35,7 +80,7 @@ module RuboCop
|
|
35
80
|
end
|
36
81
|
|
37
82
|
def on_sym(node)
|
38
|
-
return if properly_quoted?(node.source, node.value.inspect)
|
83
|
+
return if ignored_node?(node) || properly_quoted?(node.source, node.value.inspect)
|
39
84
|
|
40
85
|
# `alias` arguments are symbols but since a symbol that requires
|
41
86
|
# being quoted is not a valid method identifier, it can be ignored
|
@@ -51,16 +96,29 @@ module RuboCop
|
|
51
96
|
register_offense(node, correction: node.value.inspect)
|
52
97
|
end
|
53
98
|
|
99
|
+
def on_hash(node)
|
100
|
+
# For `EnforcedStyle: strict`, hash keys are evaluated in `on_sym`
|
101
|
+
return unless style == :consistent
|
102
|
+
|
103
|
+
keys = node.keys.select(&:sym_type?)
|
104
|
+
|
105
|
+
if keys.any? { |key| requires_quotes?(key) }
|
106
|
+
correct_inconsistent_hash_keys(keys)
|
107
|
+
else
|
108
|
+
# If there are no symbol keys requiring quoting,
|
109
|
+
# treat the hash like `EnforcedStyle: strict`.
|
110
|
+
keys.each { |key| correct_hash_key(key) }
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
54
114
|
private
|
55
115
|
|
56
116
|
def register_offense(node, correction:, message: format(MSG, correction: correction))
|
57
|
-
add_offense(node, message: message)
|
58
|
-
corrector.replace(node, correction)
|
59
|
-
end
|
117
|
+
add_offense(node, message: message) { |corrector| corrector.replace(node, correction) }
|
60
118
|
end
|
61
119
|
|
62
120
|
def properly_quoted?(source, value)
|
63
|
-
return true if !source.match?(/['"]/) || value.end_with?('=')
|
121
|
+
return true if style == :strict && (!source.match?(/['"]/) || value.end_with?('='))
|
64
122
|
|
65
123
|
source == value ||
|
66
124
|
# `Symbol#inspect` uses double quotes, but allow single-quoted
|
@@ -68,6 +126,10 @@ module RuboCop
|
|
68
126
|
source.tr("'", '"') == value
|
69
127
|
end
|
70
128
|
|
129
|
+
def requires_quotes?(sym_node)
|
130
|
+
sym_node.value.inspect.match?(/^:".*?"|=$/)
|
131
|
+
end
|
132
|
+
|
71
133
|
def in_alias?(node)
|
72
134
|
node.parent&.alias_type?
|
73
135
|
end
|
@@ -88,7 +150,7 @@ module RuboCop
|
|
88
150
|
# will be ignored.
|
89
151
|
return unless node.value.to_s.match?(/\A[a-z0-9_]/i)
|
90
152
|
|
91
|
-
correction = node.value.inspect.
|
153
|
+
correction = node.value.inspect.delete_prefix(':')
|
92
154
|
return if properly_quoted?(node.source, correction)
|
93
155
|
|
94
156
|
register_offense(
|
@@ -97,6 +159,29 @@ module RuboCop
|
|
97
159
|
message: format(MSG, correction: "#{correction}:")
|
98
160
|
)
|
99
161
|
end
|
162
|
+
|
163
|
+
def correct_inconsistent_hash_keys(keys)
|
164
|
+
keys.each do |key|
|
165
|
+
ignore_node(key)
|
166
|
+
|
167
|
+
next if requires_quotes?(key)
|
168
|
+
next if properly_quoted?(key.source, %("#{key.value}"))
|
169
|
+
|
170
|
+
correction = "#{quote_type}#{key.value}#{quote_type}"
|
171
|
+
register_offense(
|
172
|
+
key,
|
173
|
+
correction: correction,
|
174
|
+
message: format(MSG_CONSISTENCY, correction: "#{correction}:")
|
175
|
+
)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def quote_type
|
180
|
+
# Use the `Style/StringLiterals` configuration for quoting symbols
|
181
|
+
return '"' unless config.for_cop('Style/StringLiterals')['Enabled']
|
182
|
+
|
183
|
+
config.for_cop('Style/StringLiterals')['EnforcedStyle'] == 'single_quotes' ? "'" : '"'
|
184
|
+
end
|
100
185
|
end
|
101
186
|
end
|
102
187
|
end
|