rubocop 1.67.0 → 1.81.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +23 -19
- data/config/default.yml +384 -72
- data/config/internal_affairs.yml +20 -0
- data/config/obsoletion.yml +8 -3
- data/exe/rubocop +1 -8
- data/lib/rubocop/cached_data.rb +12 -4
- data/lib/rubocop/cli/command/auto_generate_config.rb +2 -2
- data/lib/rubocop/cli/command/execute_runner.rb +4 -4
- data/lib/rubocop/cli/command/show_cops.rb +24 -2
- data/lib/rubocop/cli/command/suggest_extensions.rb +7 -1
- data/lib/rubocop/cli/command/version.rb +2 -2
- data/lib/rubocop/cli.rb +19 -4
- data/lib/rubocop/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +52 -10
- data/lib/rubocop/config_loader.rb +56 -48
- data/lib/rubocop/config_loader_resolver.rb +36 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -3
- data/lib/rubocop/config_obsoletion/renamed_cop.rb +18 -3
- data/lib/rubocop/config_obsoletion.rb +46 -2
- data/lib/rubocop/config_store.rb +5 -0
- data/lib/rubocop/config_validator.rb +25 -14
- data/lib/rubocop/cop/autocorrect_logic.rb +53 -28
- data/lib/rubocop/cop/base.rb +7 -1
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/bundler/gem_filename.rb +0 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +0 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +8 -16
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/attribute_assignment.rb +91 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +37 -15
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/require_mfa.rb +15 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +0 -2
- data/lib/rubocop/cop/generator.rb +6 -0
- data/lib/rubocop/cop/internal_affairs/cop_enabled.rb +85 -0
- data/lib/rubocop/cop/internal_affairs/example_description.rb +9 -5
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +116 -0
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +2 -1
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +3 -4
- data/lib/rubocop/cop/internal_affairs/node_first_or_last_argument.rb +3 -2
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +5 -5
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +63 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_walker.rb +131 -0
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +233 -0
- data/lib/rubocop/cop/internal_affairs/node_type_group.rb +92 -0
- data/lib/rubocop/cop/internal_affairs/node_type_multiple_predicates.rb +126 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +4 -3
- data/lib/rubocop/cop/internal_affairs/numblock_handler.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +90 -0
- data/lib/rubocop/cop/internal_affairs/operator_keyword.rb +48 -0
- data/lib/rubocop/cop/internal_affairs/plugin.rb +33 -0
- data/lib/rubocop/cop/internal_affairs/redundant_described_class_as_subject.rb +6 -5
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/single_line_comparison.rb +5 -4
- data/lib/rubocop/cop/internal_affairs/style_detected_api_use.rb +0 -2
- data/lib/rubocop/cop/internal_affairs/undefined_config.rb +13 -2
- data/lib/rubocop/cop/internal_affairs/useless_restrict_on_send.rb +1 -1
- data/lib/rubocop/cop/internal_affairs.rb +7 -16
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -9
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +0 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -2
- data/lib/rubocop/cop/layout/block_end_newline.rb +1 -0
- data/lib/rubocop/cop/layout/class_structure.rb +45 -10
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/def_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +1 -1
- data/lib/rubocop/cop/layout/else_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +34 -20
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +101 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +37 -7
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +8 -29
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +4 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +23 -1
- data/lib/rubocop/cop/layout/end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +4 -9
- data/lib/rubocop/cop/layout/first_array_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +2 -7
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +1 -1
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/hash_alignment.rb +8 -11
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +8 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +57 -2
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +11 -2
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +7 -1
- data/lib/rubocop/cop/layout/line_end_string_concatenation_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/line_length.rb +158 -10
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +25 -0
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +4 -4
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +1 -0
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +11 -8
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +19 -46
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +14 -7
- data/lib/rubocop/cop/layout/single_line_block_chain.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_colon.rb +2 -2
- data/lib/rubocop/cop/layout/space_after_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +11 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +8 -2
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +31 -21
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +1 -0
- data/lib/rubocop/cop/layout/space_before_brackets.rb +7 -40
- data/lib/rubocop/cop/layout/space_before_comma.rb +1 -1
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +18 -3
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +5 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +6 -4
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_range.rb +5 -0
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +118 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +1 -3
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +10 -12
- data/lib/rubocop/cop/lint/boolean_symbol.rb +1 -1
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +4 -1
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +3 -2
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +90 -0
- data/lib/rubocop/cop/lint/debugger.rb +3 -3
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +7 -3
- data/lib/rubocop/cop/lint/duplicate_branch.rb +39 -4
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -23
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +6 -43
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +14 -64
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +0 -2
- data/lib/rubocop/cop/lint/empty_file.rb +0 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +14 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +0 -6
- data/lib/rubocop/cop/lint/float_comparison.rb +51 -18
- data/lib/rubocop/cop/lint/float_out_of_range.rb +2 -4
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +2 -2
- data/lib/rubocop/cop/lint/hash_new_with_keyword_arguments_as_default.rb +55 -0
- data/lib/rubocop/cop/lint/identity_comparison.rb +19 -15
- data/lib/rubocop/cop/lint/implicit_string_concatenation.rb +1 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +9 -0
- data/lib/rubocop/cop/lint/it_without_arguments_in_block.rb +3 -0
- data/lib/rubocop/cop/lint/literal_as_condition.rb +125 -10
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +24 -6
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +1 -2
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +5 -8
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +10 -6
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +2 -2
- data/lib/rubocop/cop/lint/non_atomic_file_operation.rb +12 -3
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +3 -3
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +3 -3
- data/lib/rubocop/cop/lint/number_conversion.rb +0 -1
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -2
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +94 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -3
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +3 -2
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -5
- data/lib/rubocop/cop/lint/raise_exception.rb +29 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +113 -9
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +8 -7
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +2 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +261 -0
- data/lib/rubocop/cop/lint/redundant_with_index.rb +3 -0
- data/lib/rubocop/cop/lint/redundant_with_object.rb +3 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +1 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +0 -1
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +2 -5
- data/lib/rubocop/cop/lint/rescue_type.rb +4 -8
- data/lib/rubocop/cop/lint/return_in_void_context.rb +9 -11
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +17 -1
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -15
- data/lib/rubocop/cop/lint/shadowed_argument.rb +7 -7
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +13 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +76 -0
- data/lib/rubocop/cop/lint/suppressed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +111 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +1 -1
- data/lib/rubocop/cop/lint/syntax.rb +4 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +1 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +3 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +52 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +6 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +34 -8
- data/lib/rubocop/cop/lint/useless_assignment.rb +3 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +71 -0
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +90 -0
- data/lib/rubocop/cop/lint/useless_defined.rb +55 -0
- data/lib/rubocop/cop/lint/useless_else_without_rescue.rb +4 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +1 -1
- data/lib/rubocop/cop/lint/useless_numeric_operation.rb +3 -1
- data/lib/rubocop/cop/lint/useless_or.rb +98 -0
- data/lib/rubocop/cop/lint/useless_rescue.rb +2 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +5 -5
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +121 -0
- data/lib/rubocop/cop/lint/void.rb +23 -12
- data/lib/rubocop/cop/message_annotator.rb +7 -3
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -0
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +9 -9
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +7 -0
- data/lib/rubocop/cop/metrics/cyclomatic_complexity.rb +5 -2
- data/lib/rubocop/cop/metrics/method_length.rb +9 -1
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/perceived_complexity.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -4
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +3 -3
- data/lib/rubocop/cop/mixin/allowed_pattern.rb +4 -4
- data/lib/rubocop/cop/mixin/check_assignment.rb +4 -12
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +22 -12
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +49 -0
- data/lib/rubocop/cop/mixin/comments_help.rb +8 -3
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +1 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/forbidden_identifiers.rb +20 -0
- data/lib/rubocop/cop/mixin/forbidden_pattern.rb +16 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -3
- data/lib/rubocop/cop/mixin/gemspec_help.rb +22 -0
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +15 -14
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +22 -22
- data/lib/rubocop/cop/mixin/hash_subset.rb +203 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +74 -74
- data/lib/rubocop/cop/mixin/line_length_help.rb +27 -10
- data/lib/rubocop/cop/mixin/method_complexity.rb +2 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +7 -9
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +68 -30
- data/lib/rubocop/cop/mixin/range_help.rb +15 -4
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +8 -3
- data/lib/rubocop/cop/mixin/string_help.rb +2 -2
- data/lib/rubocop/cop/mixin/string_literals_help.rb +1 -1
- data/lib/rubocop/cop/mixin/target_ruby_version.rb +17 -1
- data/lib/rubocop/cop/mixin/trailing_comma.rb +21 -5
- data/lib/rubocop/cop/naming/accessor_method_name.rb +6 -6
- data/lib/rubocop/cop/naming/block_forwarding.rb +20 -16
- data/lib/rubocop/cop/naming/constant_name.rb +6 -7
- data/lib/rubocop/cop/naming/file_name.rb +2 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +12 -13
- data/lib/rubocop/cop/naming/method_name.rb +185 -15
- data/lib/rubocop/cop/naming/predicate_method.rb +319 -0
- data/lib/rubocop/cop/naming/{predicate_name.rb → predicate_prefix.rb} +48 -4
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +50 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- data/lib/rubocop/cop/registry.rb +9 -6
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/eval.rb +2 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/security/open.rb +1 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +114 -34
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -6
- data/lib/rubocop/cop/style/ambiguous_endless_method_definition.rb +79 -0
- data/lib/rubocop/cop/style/and_or.rb +1 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +57 -44
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +115 -39
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +47 -0
- data/lib/rubocop/cop/style/bitwise_predicate.rb +107 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +44 -26
- data/lib/rubocop/cop/style/case_like_if.rb +9 -12
- data/lib/rubocop/cop/style/class_and_module_children.rb +52 -11
- data/lib/rubocop/cop/style/class_equality_comparison.rb +1 -1
- data/lib/rubocop/cop/style/collection_methods.rb +2 -1
- data/lib/rubocop/cop/style/collection_querying.rb +167 -0
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +3 -2
- data/lib/rubocop/cop/style/command_literal.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +20 -3
- data/lib/rubocop/cop/style/comparable_between.rb +78 -0
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +49 -31
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- data/lib/rubocop/cop/style/data_inheritance.rb +7 -0
- data/lib/rubocop/cop/style/def_with_parentheses.rb +18 -5
- data/lib/rubocop/cop/style/dig_chain.rb +89 -0
- data/lib/rubocop/cop/style/documentation.rb +1 -1
- data/lib/rubocop/cop/style/double_negation.rb +5 -5
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +4 -7
- data/lib/rubocop/cop/style/each_with_object.rb +2 -3
- data/lib/rubocop/cop/style/empty_else.rb +4 -2
- data/lib/rubocop/cop/style/empty_literal.rb +5 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/empty_string_inside_interpolation.rb +100 -0
- data/lib/rubocop/cop/style/endless_method.rb +163 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +4 -4
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/expand_path_arguments.rb +2 -7
- data/lib/rubocop/cop/style/explicit_block_argument.rb +17 -4
- data/lib/rubocop/cop/style/exponential_notation.rb +6 -5
- data/lib/rubocop/cop/style/fetch_env_var.rb +34 -7
- data/lib/rubocop/cop/style/file_null.rb +89 -0
- data/lib/rubocop/cop/style/file_touch.rb +75 -0
- data/lib/rubocop/cop/style/float_division.rb +8 -4
- data/lib/rubocop/cop/style/for.rb +1 -1
- data/lib/rubocop/cop/style/format_string_token.rb +38 -11
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +3 -2
- data/lib/rubocop/cop/style/global_std_stream.rb +3 -0
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +17 -3
- data/lib/rubocop/cop/style/hash_conversion.rb +16 -9
- data/lib/rubocop/cop/style/hash_each_methods.rb +6 -8
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_fetch_chain.rb +104 -0
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +9 -3
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +25 -6
- data/lib/rubocop/cop/style/if_inside_else.rb +10 -14
- data/lib/rubocop/cop/style/if_unless_modifier.rb +36 -9
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +4 -7
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +3 -4
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -9
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +16 -13
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +2 -2
- data/lib/rubocop/cop/style/ip_addresses.rb +2 -2
- data/lib/rubocop/cop/style/it_assignment.rb +93 -0
- data/lib/rubocop/cop/style/it_block_parameter.rb +121 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +14 -8
- data/lib/rubocop/cop/style/lambda.rb +1 -0
- data/lib/rubocop/cop/style/lambda_call.rb +10 -4
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +11 -3
- data/lib/rubocop/cop/style/map_to_hash.rb +13 -4
- data/lib/rubocop/cop/style/map_to_set.rb +4 -5
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +28 -20
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +18 -0
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +8 -11
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +3 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/min_max_comparison.rb +13 -5
- data/lib/rubocop/cop/style/missing_else.rb +2 -0
- data/lib/rubocop/cop/style/missing_respond_to_missing.rb +33 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +3 -2
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +2 -0
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_method_signature.rb +1 -9
- data/lib/rubocop/cop/style/multiple_comparison.rb +52 -51
- data/lib/rubocop/cop/style/mutable_constant.rb +7 -8
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +7 -5
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +1 -1
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +5 -4
- data/lib/rubocop/cop/style/next.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +9 -7
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +15 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +42 -13
- data/lib/rubocop/cop/style/open_struct_use.rb +5 -5
- data/lib/rubocop/cop/style/operator_method_call.rb +5 -6
- data/lib/rubocop/cop/style/or_assignment.rb +3 -6
- data/lib/rubocop/cop/style/parallel_assignment.rb +41 -38
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +2 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +15 -13
- data/lib/rubocop/cop/style/random_with_offset.rb +3 -3
- data/lib/rubocop/cop/style/redundant_argument.rb +3 -1
- data/lib/rubocop/cop/style/redundant_array_flatten.rb +50 -0
- data/lib/rubocop/cop/style/redundant_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +36 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +95 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +16 -5
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +6 -10
- data/lib/rubocop/cop/style/redundant_each.rb +1 -1
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -9
- data/lib/rubocop/cop/style/redundant_format.rb +283 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +4 -4
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_interpolation.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +55 -19
- data/lib/rubocop/cop/style/redundant_parentheses.rb +105 -36
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +8 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +9 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +15 -18
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +20 -32
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +4 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_sort_by.rb +17 -1
- data/lib/rubocop/cop/style/redundant_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +5 -3
- data/lib/rubocop/cop/style/return_nil.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +75 -16
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +5 -2
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +21 -6
- data/lib/rubocop/cop/style/send_with_literal_method_name.rb +2 -1
- data/lib/rubocop/cop/style/signal_exception.rb +2 -3
- data/lib/rubocop/cop/style/single_argument_dig.rb +9 -5
- data/lib/rubocop/cop/style/single_line_block_params.rb +1 -1
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +15 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +13 -11
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +68 -102
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +21 -17
- data/lib/rubocop/cop/style/string_literals.rb +1 -1
- data/lib/rubocop/cop/style/string_methods.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +8 -1
- data/lib/rubocop/cop/style/super_arguments.rb +66 -19
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +56 -2
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +48 -6
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +4 -4
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -2
- data/lib/rubocop/cop/style/while_until_modifier.rb +0 -1
- data/lib/rubocop/cop/style/yoda_condition.rb +8 -4
- data/lib/rubocop/cop/style/yoda_expression.rb +2 -1
- data/lib/rubocop/cop/team.rb +1 -1
- data/lib/rubocop/cop/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +20 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +24 -5
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/scope.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +14 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +30 -19
- data/lib/rubocop/cops_documentation_generator.rb +54 -28
- data/lib/rubocop/directive_comment.rb +45 -11
- data/lib/rubocop/ext/regexp_node.rb +0 -1
- data/lib/rubocop/formatter/disabled_config_formatter.rb +20 -6
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/formatter/fuubar_style_formatter.rb +1 -1
- data/lib/rubocop/formatter/html_formatter.rb +1 -1
- data/lib/rubocop/formatter/markdown_formatter.rb +1 -0
- data/lib/rubocop/formatter/offense_count_formatter.rb +1 -1
- data/lib/rubocop/formatter/pacman_formatter.rb +2 -1
- data/lib/rubocop/lsp/diagnostic.rb +190 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +66 -26
- data/lib/rubocop/lsp/runtime.rb +18 -50
- data/lib/rubocop/lsp/server.rb +2 -4
- data/lib/rubocop/lsp/stdin_runner.rb +69 -0
- data/lib/rubocop/magic_comment.rb +11 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- data/lib/rubocop/pending_cops_reporter.rb +56 -0
- data/lib/rubocop/plugin/configuration_integrator.rb +143 -0
- data/lib/rubocop/plugin/load_error.rb +26 -0
- data/lib/rubocop/plugin/loader.rb +100 -0
- data/lib/rubocop/plugin/not_supported_error.rb +29 -0
- data/lib/rubocop/plugin.rb +46 -0
- data/lib/rubocop/rake_task.rb +4 -1
- data/lib/rubocop/result_cache.rb +27 -25
- data/lib/rubocop/rspec/cop_helper.rb +13 -1
- data/lib/rubocop/rspec/expect_offense.rb +15 -5
- data/lib/rubocop/rspec/shared_contexts.rb +38 -1
- data/lib/rubocop/rspec/support.rb +4 -2
- data/lib/rubocop/runner.rb +31 -18
- data/lib/rubocop/server/cache.rb +51 -13
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/server/client_command/base.rb +10 -0
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/client_command/start.rb +11 -1
- data/lib/rubocop/target_finder.rb +14 -9
- data/lib/rubocop/target_ruby.rb +27 -3
- data/lib/rubocop/version.rb +53 -12
- data/lib/rubocop.rb +44 -2
- data/lib/ruby_lsp/rubocop/addon.rb +90 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +99 -0
- metadata +91 -21
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
|
@@ -22,8 +22,6 @@ module RuboCop
|
|
|
22
22
|
# def b
|
|
23
23
|
# end
|
|
24
24
|
#
|
|
25
|
-
# @example
|
|
26
|
-
#
|
|
27
25
|
# # good
|
|
28
26
|
# def a
|
|
29
27
|
# end
|
|
@@ -42,8 +40,6 @@ module RuboCop
|
|
|
42
40
|
# def b
|
|
43
41
|
# end
|
|
44
42
|
#
|
|
45
|
-
# @example
|
|
46
|
-
#
|
|
47
43
|
# # good
|
|
48
44
|
# class A
|
|
49
45
|
# end
|
|
@@ -65,8 +61,6 @@ module RuboCop
|
|
|
65
61
|
# def b
|
|
66
62
|
# end
|
|
67
63
|
#
|
|
68
|
-
# @example
|
|
69
|
-
#
|
|
70
64
|
# # good
|
|
71
65
|
# module A
|
|
72
66
|
# end
|
|
@@ -82,28 +76,40 @@ module RuboCop
|
|
|
82
76
|
# # good
|
|
83
77
|
# class ErrorA < BaseError; end
|
|
84
78
|
# class ErrorB < BaseError; end
|
|
85
|
-
# class ErrorC < BaseError; end
|
|
86
79
|
#
|
|
87
80
|
# # good
|
|
88
81
|
# class ErrorA < BaseError; end
|
|
89
82
|
#
|
|
90
83
|
# class ErrorB < BaseError; end
|
|
91
84
|
#
|
|
92
|
-
#
|
|
85
|
+
# # good - DefLikeMacros: [memoize]
|
|
86
|
+
# memoize :attribute_a
|
|
87
|
+
# memoize :attribute_b
|
|
88
|
+
#
|
|
89
|
+
# # good
|
|
90
|
+
# memoize :attribute_a
|
|
91
|
+
#
|
|
92
|
+
# memoize :attribute_b
|
|
93
93
|
#
|
|
94
94
|
# @example AllowAdjacentOneLineDefs: false
|
|
95
95
|
#
|
|
96
96
|
# # bad
|
|
97
97
|
# class ErrorA < BaseError; end
|
|
98
98
|
# class ErrorB < BaseError; end
|
|
99
|
-
# class ErrorC < BaseError; end
|
|
100
99
|
#
|
|
101
100
|
# # good
|
|
102
101
|
# class ErrorA < BaseError; end
|
|
103
102
|
#
|
|
104
103
|
# class ErrorB < BaseError; end
|
|
105
104
|
#
|
|
106
|
-
#
|
|
105
|
+
# # bad - DefLikeMacros: [memoize]
|
|
106
|
+
# memoize :attribute_a
|
|
107
|
+
# memoize :attribute_b
|
|
108
|
+
#
|
|
109
|
+
# # good
|
|
110
|
+
# memoize :attribute_a
|
|
111
|
+
#
|
|
112
|
+
# memoize :attribute_b
|
|
107
113
|
#
|
|
108
114
|
class EmptyLineBetweenDefs < Base
|
|
109
115
|
include RangeHelp
|
|
@@ -162,8 +168,10 @@ module RuboCop
|
|
|
162
168
|
private
|
|
163
169
|
|
|
164
170
|
def def_location(correction_node)
|
|
165
|
-
if correction_node.
|
|
171
|
+
if correction_node.any_block_type?
|
|
166
172
|
correction_node.source_range.join(correction_node.children.first.source_range)
|
|
173
|
+
elsif correction_node.send_type?
|
|
174
|
+
correction_node.source_range
|
|
167
175
|
else
|
|
168
176
|
correction_node.loc.keyword.join(correction_node.loc.name)
|
|
169
177
|
end
|
|
@@ -181,12 +189,18 @@ module RuboCop
|
|
|
181
189
|
end
|
|
182
190
|
|
|
183
191
|
def macro_candidate?(node)
|
|
184
|
-
|
|
185
|
-
|
|
192
|
+
macro_candidate = if node.any_block_type?
|
|
193
|
+
node.send_node
|
|
194
|
+
elsif node.send_type?
|
|
195
|
+
node
|
|
196
|
+
end
|
|
197
|
+
return false unless macro_candidate
|
|
198
|
+
|
|
199
|
+
macro_candidate.macro? && empty_line_between_macros.include?(macro_candidate.method_name)
|
|
186
200
|
end
|
|
187
201
|
|
|
188
202
|
def method_candidate?(node)
|
|
189
|
-
cop_config['EmptyLineBetweenMethodDefs'] &&
|
|
203
|
+
cop_config['EmptyLineBetweenMethodDefs'] && node.any_def_type?
|
|
190
204
|
end
|
|
191
205
|
|
|
192
206
|
def class_candidate?(node)
|
|
@@ -246,7 +260,9 @@ module RuboCop
|
|
|
246
260
|
end
|
|
247
261
|
|
|
248
262
|
def def_start(node)
|
|
249
|
-
|
|
263
|
+
node = node.send_node if node.any_block_type?
|
|
264
|
+
|
|
265
|
+
if node.send_type?
|
|
250
266
|
node.source_range.line
|
|
251
267
|
else
|
|
252
268
|
node.loc.keyword.line
|
|
@@ -258,11 +274,7 @@ module RuboCop
|
|
|
258
274
|
end
|
|
259
275
|
|
|
260
276
|
def end_loc(node)
|
|
261
|
-
|
|
262
|
-
node.source_range.end
|
|
263
|
-
else
|
|
264
|
-
node.loc.end
|
|
265
|
-
end
|
|
277
|
+
node.source_range.end
|
|
266
278
|
end
|
|
267
279
|
|
|
268
280
|
def autocorrect_remove_lines(corrector, newline_pos, count)
|
|
@@ -283,6 +295,8 @@ module RuboCop
|
|
|
283
295
|
case node.type
|
|
284
296
|
when :def, :defs
|
|
285
297
|
:method
|
|
298
|
+
when :numblock, :itblock
|
|
299
|
+
:block
|
|
286
300
|
else
|
|
287
301
|
node.type
|
|
288
302
|
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module RuboCop
|
|
4
|
+
module Cop
|
|
5
|
+
module Layout
|
|
6
|
+
# Checks for an empty line after a module inclusion method (`extend`,
|
|
7
|
+
# `include` and `prepend`), or a group of them.
|
|
8
|
+
#
|
|
9
|
+
# @example
|
|
10
|
+
# # bad
|
|
11
|
+
# class Foo
|
|
12
|
+
# include Bar
|
|
13
|
+
# attr_reader :baz
|
|
14
|
+
# end
|
|
15
|
+
#
|
|
16
|
+
# # good
|
|
17
|
+
# class Foo
|
|
18
|
+
# include Bar
|
|
19
|
+
#
|
|
20
|
+
# attr_reader :baz
|
|
21
|
+
# end
|
|
22
|
+
#
|
|
23
|
+
# # also good - multiple module inclusions grouped together
|
|
24
|
+
# class Foo
|
|
25
|
+
# extend Bar
|
|
26
|
+
# include Baz
|
|
27
|
+
# prepend Qux
|
|
28
|
+
# end
|
|
29
|
+
#
|
|
30
|
+
class EmptyLinesAfterModuleInclusion < Base
|
|
31
|
+
include RangeHelp
|
|
32
|
+
extend AutoCorrector
|
|
33
|
+
|
|
34
|
+
MSG = 'Add an empty line after module inclusion.'
|
|
35
|
+
|
|
36
|
+
MODULE_INCLUSION_METHODS = %i[include extend prepend].freeze
|
|
37
|
+
|
|
38
|
+
RESTRICT_ON_SEND = MODULE_INCLUSION_METHODS
|
|
39
|
+
|
|
40
|
+
def on_send(node)
|
|
41
|
+
return if node.receiver || node.arguments.empty?
|
|
42
|
+
return if node.parent&.type?(:send, :any_block)
|
|
43
|
+
|
|
44
|
+
return if next_line_empty_or_enable_directive_comment?(node.last_line)
|
|
45
|
+
|
|
46
|
+
next_line_node = next_line_node(node)
|
|
47
|
+
return unless require_empty_line?(next_line_node)
|
|
48
|
+
|
|
49
|
+
add_offense(node) { |corrector| autocorrect(corrector, node) }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def autocorrect(corrector, node)
|
|
55
|
+
node_range = range_by_whole_lines(node.source_range)
|
|
56
|
+
|
|
57
|
+
next_line = node_range.last_line + 1
|
|
58
|
+
if enable_directive_comment?(next_line)
|
|
59
|
+
node_range = processed_source.comment_at_line(next_line)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
corrector.insert_after(node_range, "\n")
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def next_line_empty_or_enable_directive_comment?(line)
|
|
66
|
+
line_empty?(line) || (enable_directive_comment?(line + 1) && line_empty?(line + 1))
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def enable_directive_comment?(line)
|
|
70
|
+
return false unless (comment = processed_source.comment_at_line(line))
|
|
71
|
+
|
|
72
|
+
DirectiveComment.new(comment).enabled?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def line_empty?(line)
|
|
76
|
+
processed_source[line].nil? || processed_source[line].blank?
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def require_empty_line?(node)
|
|
80
|
+
return false unless node
|
|
81
|
+
|
|
82
|
+
!allowed_method?(node)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def allowed_method?(node)
|
|
86
|
+
node = node.body if node.respond_to?(:modifier_form?) && node.modifier_form?
|
|
87
|
+
|
|
88
|
+
return false unless node.send_type?
|
|
89
|
+
|
|
90
|
+
MODULE_INCLUSION_METHODS.include?(node.method_name)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def next_line_node(node)
|
|
94
|
+
return if node.parent.if_type?
|
|
95
|
+
|
|
96
|
+
node.right_sibling
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
@@ -83,17 +83,18 @@ module RuboCop
|
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
alias on_numblock on_block
|
|
86
|
+
alias on_itblock on_block
|
|
86
87
|
|
|
87
|
-
def on_send(node)
|
|
88
|
-
return unless node.bare_access_modifier? &&
|
|
89
|
-
|
|
88
|
+
def on_send(node)
|
|
89
|
+
return unless node.bare_access_modifier? && !node.block_literal?
|
|
90
|
+
return if same_line?(node, node.right_sibling)
|
|
90
91
|
return if expected_empty_lines?(node)
|
|
91
92
|
|
|
92
93
|
message = message(node)
|
|
93
94
|
add_offense(node, message: message) do |corrector|
|
|
94
95
|
line = range_by_whole_lines(node.source_range)
|
|
95
96
|
|
|
96
|
-
corrector.insert_before(line, "\n")
|
|
97
|
+
corrector.insert_before(line, "\n") if should_insert_line_before?(node)
|
|
97
98
|
|
|
98
99
|
correct_next_line_if_denied_style(corrector, node, line)
|
|
99
100
|
end
|
|
@@ -115,18 +116,20 @@ module RuboCop
|
|
|
115
116
|
def allowed_only_before_style?(node)
|
|
116
117
|
if node.special_modifier?
|
|
117
118
|
return true if processed_source[node.last_line] == 'end'
|
|
118
|
-
return false if
|
|
119
|
+
return false if next_line_empty_and_exists?(node.last_line)
|
|
119
120
|
end
|
|
120
121
|
|
|
121
122
|
previous_line_empty?(node.first_line)
|
|
122
123
|
end
|
|
123
124
|
|
|
124
125
|
def correct_next_line_if_denied_style(corrector, node, line)
|
|
126
|
+
return unless should_insert_line_after?(node)
|
|
127
|
+
|
|
125
128
|
case style
|
|
126
129
|
when :around
|
|
127
130
|
corrector.insert_after(line, "\n") unless next_line_empty?(node.last_line)
|
|
128
131
|
when :only_before
|
|
129
|
-
if
|
|
132
|
+
if next_line_empty_and_exists?(node.last_line)
|
|
130
133
|
range = next_empty_line_range(node)
|
|
131
134
|
|
|
132
135
|
corrector.remove(range)
|
|
@@ -135,7 +138,7 @@ module RuboCop
|
|
|
135
138
|
end
|
|
136
139
|
|
|
137
140
|
def previous_line_ignoring_comments(processed_source, send_line)
|
|
138
|
-
processed_source[0..send_line - 2].reverse.find { |line| !comment_line?(line) }
|
|
141
|
+
processed_source[0..(send_line - 2)].reverse.find { |line| !comment_line?(line) }
|
|
139
142
|
end
|
|
140
143
|
|
|
141
144
|
def previous_line_empty?(send_line)
|
|
@@ -151,6 +154,10 @@ module RuboCop
|
|
|
151
154
|
body_end?(last_send_line) || next_line.blank?
|
|
152
155
|
end
|
|
153
156
|
|
|
157
|
+
def next_line_empty_and_exists?(last_send_line)
|
|
158
|
+
next_line_empty?(last_send_line) && last_send_line.next != processed_source.lines.size
|
|
159
|
+
end
|
|
160
|
+
|
|
154
161
|
def empty_lines_around?(node)
|
|
155
162
|
previous_line_empty?(node.first_line) && next_line_empty?(node.last_line)
|
|
156
163
|
end
|
|
@@ -205,6 +212,29 @@ module RuboCop
|
|
|
205
212
|
format(MSG_BEFORE_FOR_ONLY_BEFORE, modifier: modifier)
|
|
206
213
|
end
|
|
207
214
|
end
|
|
215
|
+
|
|
216
|
+
def should_insert_line_before?(node)
|
|
217
|
+
return false if previous_line_empty?(node.first_line)
|
|
218
|
+
return true unless inside_block?(node) && no_empty_lines_around_block_body?
|
|
219
|
+
return true unless node.parent.begin_type?
|
|
220
|
+
|
|
221
|
+
node.parent.children.first != node
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
def should_insert_line_after?(node)
|
|
225
|
+
return true unless inside_block?(node) && no_empty_lines_around_block_body?
|
|
226
|
+
|
|
227
|
+
node.parent.children.last != node
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def inside_block?(node)
|
|
231
|
+
node.parent.block_type? || (node.parent.begin_type? && node.parent.parent&.block_type?)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def no_empty_lines_around_block_body?
|
|
235
|
+
config.for_enabled_cop('Layout/EmptyLinesAroundBlockBody')['EnforcedStyle'] ==
|
|
236
|
+
'no_empty_lines'
|
|
237
|
+
end
|
|
208
238
|
end
|
|
209
239
|
end
|
|
210
240
|
end
|
|
@@ -62,40 +62,19 @@ module RuboCop
|
|
|
62
62
|
node.receiver && node.receiver.loc.last_line != node.loc.selector&.line
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
def
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
lines.map { |_, line| line }
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
def extra_lines(node)
|
|
72
|
-
empty_lines(node).each do |line|
|
|
73
|
-
range = source_range(processed_source.buffer, line, 0)
|
|
74
|
-
yield(range)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def processed_lines(node)
|
|
79
|
-
line_numbers(node).each_with_object([]) do |num, array|
|
|
80
|
-
array << [processed_source.lines[num - 1], num]
|
|
65
|
+
def extra_lines(node, &block)
|
|
66
|
+
node.arguments.each do |arg|
|
|
67
|
+
empty_range_for_starting_point(arg.source_range.begin, &block)
|
|
81
68
|
end
|
|
82
|
-
end
|
|
83
69
|
|
|
84
|
-
|
|
85
|
-
inner_lines = []
|
|
86
|
-
line_nums = node.arguments.each_with_object([]) do |arg_node, lines|
|
|
87
|
-
lines << outer_lines(arg_node)
|
|
88
|
-
inner_lines << inner_lines(arg_node) if arg_node.multiline?
|
|
89
|
-
end
|
|
90
|
-
line_nums.flatten.uniq - inner_lines.flatten - outer_lines(node)
|
|
70
|
+
empty_range_for_starting_point(node.loc.end.begin, &block) if node.loc.end
|
|
91
71
|
end
|
|
92
72
|
|
|
93
|
-
def
|
|
94
|
-
|
|
95
|
-
|
|
73
|
+
def empty_range_for_starting_point(start)
|
|
74
|
+
range = range_with_surrounding_space(start, whitespace: true, side: :left)
|
|
75
|
+
return unless range.last_line - range.first_line > 1
|
|
96
76
|
|
|
97
|
-
|
|
98
|
-
[node.first_line - 1, node.last_line + 1]
|
|
77
|
+
yield range.source_buffer.line_range(range.last_line - 1).adjust(end_pos: 1)
|
|
99
78
|
end
|
|
100
79
|
end
|
|
101
80
|
end
|
|
@@ -8,19 +8,18 @@ module RuboCop
|
|
|
8
8
|
#
|
|
9
9
|
# @example
|
|
10
10
|
#
|
|
11
|
-
# #
|
|
12
|
-
#
|
|
11
|
+
# # bad
|
|
13
12
|
# begin
|
|
13
|
+
#
|
|
14
14
|
# # ...
|
|
15
|
-
# end
|
|
16
15
|
#
|
|
17
|
-
#
|
|
16
|
+
# end
|
|
18
17
|
#
|
|
18
|
+
# # good
|
|
19
19
|
# begin
|
|
20
|
-
#
|
|
21
20
|
# # ...
|
|
22
|
-
#
|
|
23
21
|
# end
|
|
22
|
+
#
|
|
24
23
|
class EmptyLinesAroundBeginBody < Base
|
|
25
24
|
include EmptyLinesAroundBody
|
|
26
25
|
extend AutoCorrector
|
|
@@ -6,7 +6,7 @@ module RuboCop
|
|
|
6
6
|
# Checks if empty lines exist around the bodies of `begin`
|
|
7
7
|
# sections. This cop doesn't check empty lines at `begin` body
|
|
8
8
|
# beginning/end and around method definition body.
|
|
9
|
-
# `
|
|
9
|
+
# `Layout/EmptyLinesAroundBeginBody` or `Layout/EmptyLinesAroundMethodBody`
|
|
10
10
|
# can be used for this purpose.
|
|
11
11
|
#
|
|
12
12
|
# @example
|
|
@@ -72,8 +72,7 @@ module RuboCop
|
|
|
72
72
|
alias on_numblock on_def
|
|
73
73
|
|
|
74
74
|
def on_kwbegin(node)
|
|
75
|
-
|
|
76
|
-
check_body(body, node.loc.line)
|
|
75
|
+
check_body(node.children.first, node.loc.line)
|
|
77
76
|
end
|
|
78
77
|
|
|
79
78
|
private
|
|
@@ -128,10 +127,10 @@ module RuboCop
|
|
|
128
127
|
end
|
|
129
128
|
|
|
130
129
|
def keyword_locations_in_ensure(node)
|
|
131
|
-
|
|
130
|
+
rescue_body_without_ensure = node.children.first
|
|
132
131
|
[
|
|
133
132
|
node.loc.keyword,
|
|
134
|
-
*keyword_locations(
|
|
133
|
+
*keyword_locations(rescue_body_without_ensure)
|
|
135
134
|
]
|
|
136
135
|
end
|
|
137
136
|
end
|
|
@@ -27,7 +27,14 @@ module RuboCop
|
|
|
27
27
|
KIND = 'method'
|
|
28
28
|
|
|
29
29
|
def on_def(node)
|
|
30
|
-
|
|
30
|
+
if node.endless?
|
|
31
|
+
return unless offending_endless_method?(node)
|
|
32
|
+
|
|
33
|
+
register_offense_for_endless_method(node)
|
|
34
|
+
else
|
|
35
|
+
first_line = node.arguments.source_range&.last_line
|
|
36
|
+
check(node, node.body, adjusted_first_line: first_line)
|
|
37
|
+
end
|
|
31
38
|
end
|
|
32
39
|
alias on_defs on_def
|
|
33
40
|
|
|
@@ -36,6 +43,21 @@ module RuboCop
|
|
|
36
43
|
def style
|
|
37
44
|
:no_empty_lines
|
|
38
45
|
end
|
|
46
|
+
|
|
47
|
+
def offending_endless_method?(node)
|
|
48
|
+
node.body.first_line > node.loc.assignment.line + 1 &&
|
|
49
|
+
processed_source.lines[node.loc.assignment.line].empty?
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def register_offense_for_endless_method(node)
|
|
53
|
+
range = processed_source.buffer.line_range(node.loc.assignment.line + 1).resize(1)
|
|
54
|
+
|
|
55
|
+
msg = message(MSG_EXTRA, 'beginning')
|
|
56
|
+
|
|
57
|
+
add_offense(range, message: msg) do |corrector|
|
|
58
|
+
corrector.remove(range)
|
|
59
|
+
end
|
|
60
|
+
end
|
|
39
61
|
end
|
|
40
62
|
end
|
|
41
63
|
end
|
|
@@ -182,7 +182,7 @@ module RuboCop
|
|
|
182
182
|
end
|
|
183
183
|
|
|
184
184
|
def alignment_node_for_variable_style(node)
|
|
185
|
-
if
|
|
185
|
+
if node.type?(:case, :case_match) && node.argument? &&
|
|
186
186
|
same_line?(node, node.parent)
|
|
187
187
|
return node.parent
|
|
188
188
|
end
|
|
@@ -70,7 +70,7 @@ module RuboCop
|
|
|
70
70
|
end
|
|
71
71
|
|
|
72
72
|
def check_assignment(token)
|
|
73
|
-
return unless
|
|
73
|
+
return unless aligned_with_preceding_equals_operator(token) == :no
|
|
74
74
|
|
|
75
75
|
message = format(MSG_UNALIGNED_ASGN, location: 'preceding')
|
|
76
76
|
add_offense(token.pos, message: message) do |corrector|
|
|
@@ -155,7 +155,7 @@ module RuboCop
|
|
|
155
155
|
def on_send(node)
|
|
156
156
|
return unless should_check?(node)
|
|
157
157
|
return if same_line?(node, node.first_argument)
|
|
158
|
-
return if
|
|
158
|
+
return if enforce_first_argument_with_fixed_indentation? &&
|
|
159
159
|
!enable_layout_first_method_argument_line_break?
|
|
160
160
|
|
|
161
161
|
indent = base_indentation(node) + configured_indentation_width
|
|
@@ -225,7 +225,7 @@ module RuboCop
|
|
|
225
225
|
|
|
226
226
|
def base_range(send_node, arg_node)
|
|
227
227
|
parent = send_node.parent
|
|
228
|
-
start_node = if parent
|
|
228
|
+
start_node = if parent&.type?(:splat, :kwsplat)
|
|
229
229
|
send_node.parent
|
|
230
230
|
else
|
|
231
231
|
send_node
|
|
@@ -269,17 +269,12 @@ module RuboCop
|
|
|
269
269
|
end
|
|
270
270
|
|
|
271
271
|
def enforce_first_argument_with_fixed_indentation?
|
|
272
|
-
|
|
273
|
-
|
|
272
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
|
|
274
273
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
|
275
274
|
end
|
|
276
275
|
|
|
277
276
|
def enable_layout_first_method_argument_line_break?
|
|
278
|
-
config.
|
|
279
|
-
end
|
|
280
|
-
|
|
281
|
-
def argument_alignment_config
|
|
282
|
-
config.for_cop('Layout/ArgumentAlignment')
|
|
277
|
+
config.cop_enabled?('Layout/FirstMethodArgumentLineBreak')
|
|
283
278
|
end
|
|
284
279
|
end
|
|
285
280
|
end
|
|
@@ -180,13 +180,8 @@ module RuboCop
|
|
|
180
180
|
end
|
|
181
181
|
|
|
182
182
|
def enforce_first_argument_with_fixed_indentation?
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
array_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def array_alignment_config
|
|
189
|
-
config.for_cop('Layout/ArrayAlignment')
|
|
183
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArrayAlignment')
|
|
184
|
+
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
|
190
185
|
end
|
|
191
186
|
end
|
|
192
187
|
end
|
|
@@ -7,7 +7,7 @@ module RuboCop
|
|
|
7
7
|
# where the opening brace and the first key are on separate lines. The
|
|
8
8
|
# other keys' indentations are handled by the HashAlignment cop.
|
|
9
9
|
#
|
|
10
|
-
# By default, Hash literals that are arguments in a method call with
|
|
10
|
+
# By default, `Hash` literals that are arguments in a method call with
|
|
11
11
|
# parentheses, and where the opening curly brace of the hash is on the
|
|
12
12
|
# same line as the opening parenthesis of the method call, shall have
|
|
13
13
|
# their first key indented one step (two spaces) more than the position
|
|
@@ -225,14 +225,9 @@ module RuboCop
|
|
|
225
225
|
end
|
|
226
226
|
|
|
227
227
|
def enforce_first_argument_with_fixed_indentation?
|
|
228
|
-
|
|
229
|
-
|
|
228
|
+
argument_alignment_config = config.for_enabled_cop('Layout/ArgumentAlignment')
|
|
230
229
|
argument_alignment_config['EnforcedStyle'] == 'with_fixed_indentation'
|
|
231
230
|
end
|
|
232
|
-
|
|
233
|
-
def argument_alignment_config
|
|
234
|
-
config.for_cop('Layout/ArgumentAlignment')
|
|
235
|
-
end
|
|
236
231
|
end
|
|
237
232
|
end
|
|
238
233
|
end
|
|
@@ -51,7 +51,7 @@ module RuboCop
|
|
|
51
51
|
|
|
52
52
|
def on_hash(node)
|
|
53
53
|
# node.loc.begin tells us whether the hash opens with a {
|
|
54
|
-
# If it doesn't,
|
|
54
|
+
# If it doesn't, Layout/FirstMethodArgumentLineBreak will handle it
|
|
55
55
|
return unless node.loc.begin
|
|
56
56
|
|
|
57
57
|
check_children_line_break(node, node.children, ignore_last: ignore_last_element?)
|
|
@@ -5,10 +5,10 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks the indentation of the first parameter in a method
|
|
7
7
|
# definition. Parameters after the first one are checked by
|
|
8
|
-
# Layout/ParameterAlignment
|
|
8
|
+
# `Layout/ParameterAlignment`, not by this cop.
|
|
9
9
|
#
|
|
10
10
|
# For indenting the first argument of method _calls_, check out
|
|
11
|
-
# Layout/FirstArgumentIndentation
|
|
11
|
+
# `Layout/FirstArgumentIndentation`, which supports options related to
|
|
12
12
|
# nesting that are irrelevant for method _definitions_.
|
|
13
13
|
#
|
|
14
14
|
# @example
|