rubocop 1.79.2 → 1.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +2 -2
- data/config/default.yml +259 -90
- data/config/obsoletion.yml +30 -1
- data/exe/rubocop +1 -8
- data/lib/rubocop/cache_config.rb +29 -0
- data/lib/rubocop/cli/command/auto_generate_config.rb +36 -4
- data/lib/rubocop/cli/command/list_enabled_cops_for.rb +40 -0
- data/lib/rubocop/cli/command/lsp.rb +1 -1
- data/lib/rubocop/cli/command/mcp.rb +19 -0
- data/lib/rubocop/cli/command/show_cops.rb +2 -2
- data/lib/rubocop/cli/command/show_docs_url.rb +4 -8
- data/lib/rubocop/cli/command/suggest_extensions.rb +1 -1
- data/lib/rubocop/cli.rb +35 -9
- data/lib/rubocop/comment_config.rb +59 -17
- data/lib/rubocop/config.rb +14 -10
- data/lib/rubocop/config_finder.rb +1 -1
- data/lib/rubocop/config_loader.rb +37 -23
- data/lib/rubocop/config_loader_resolver.rb +20 -10
- data/lib/rubocop/config_obsoletion/extracted_cop.rb +4 -2
- data/lib/rubocop/config_store.rb +7 -2
- data/lib/rubocop/config_validator.rb +1 -1
- data/lib/rubocop/cop/autocorrect_logic.rb +10 -5
- data/lib/rubocop/cop/base.rb +25 -4
- data/lib/rubocop/cop/bundler/gem_comment.rb +2 -2
- data/lib/rubocop/cop/bundler/gem_version.rb +28 -28
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -2
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +26 -7
- data/lib/rubocop/cop/correctors/condition_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +7 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +1 -5
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +33 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors.rb +28 -0
- data/lib/rubocop/cop/documentation.rb +2 -3
- data/lib/rubocop/cop/exclude_limit.rb +31 -5
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -2
- data/lib/rubocop/cop/gemspec/require_mfa.rb +5 -5
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +12 -7
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +8 -8
- data/lib/rubocop/cop/internal_affairs/itblock_handler.rb +69 -0
- data/lib/rubocop/cop/internal_affairs/location_exists.rb +28 -2
- data/lib/rubocop/cop/internal_affairs/location_line_equality_comparison.rb +1 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +9 -9
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups/ast_processor.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_pattern_groups.rb +3 -1
- data/lib/rubocop/cop/internal_affairs/on_send_without_on_csend.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_let_rubocop_config_new.rb +5 -3
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +4 -4
- data/lib/rubocop/cop/internal_affairs.rb +1 -0
- data/lib/rubocop/cop/layout/argument_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/array_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/begin_end_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/block_alignment.rb +41 -4
- data/lib/rubocop/cop/layout/case_indentation.rb +3 -1
- data/lib/rubocop/cop/layout/class_structure.rb +14 -7
- data/lib/rubocop/cop/layout/dot_position.rb +2 -2
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +26 -7
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +31 -13
- data/lib/rubocop/cop/layout/empty_lines_after_module_inclusion.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +1 -0
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +12 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +16 -2
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +16 -2
- data/lib/rubocop/cop/layout/end_alignment.rb +10 -3
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +34 -1
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +26 -0
- data/lib/rubocop/cop/layout/first_hash_element_indentation.rb +7 -1
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +25 -25
- data/lib/rubocop/cop/layout/hash_alignment.rb +3 -6
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -2
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +33 -3
- data/lib/rubocop/cop/layout/indentation_style.rb +1 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +123 -7
- data/lib/rubocop/cop/layout/line_continuation_spacing.rb +1 -1
- data/lib/rubocop/cop/layout/line_length.rb +26 -9
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +57 -57
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +9 -2
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +2 -0
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +56 -56
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +229 -39
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +8 -4
- data/lib/rubocop/cop/layout/parameter_alignment.rb +1 -1
- data/lib/rubocop/cop/layout/redundant_line_break.rb +3 -1
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +13 -3
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -10
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +4 -2
- data/lib/rubocop/cop/layout/space_before_brackets.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -8
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_assignment.rb +1 -11
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_operator_precedence.rb +1 -10
- data/lib/rubocop/cop/lint/circular_argument_reference.rb +45 -3
- data/lib/rubocop/cop/lint/constant_overwritten_in_rescue.rb +4 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +93 -11
- data/lib/rubocop/cop/lint/constant_resolution.rb +6 -6
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +14 -8
- data/lib/rubocop/cop/lint/data_define_override.rb +63 -0
- data/lib/rubocop/cop/lint/debugger.rb +0 -3
- data/lib/rubocop/cop/lint/deprecated_constants.rb +2 -8
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +4 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_methods.rb +111 -12
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +5 -42
- data/lib/rubocop/cop/lint/else_layout.rb +19 -0
- data/lib/rubocop/cop/lint/empty_block.rb +4 -4
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +6 -1
- data/lib/rubocop/cop/lint/empty_in_pattern.rb +8 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +11 -0
- data/lib/rubocop/cop/lint/empty_when.rb +8 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +19 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +4 -2
- data/lib/rubocop/cop/lint/float_comparison.rb +2 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -1
- data/lib/rubocop/cop/lint/interpolation_check.rb +25 -5
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_as_condition.rb +5 -1
- data/lib/rubocop/cop/lint/literal_assignment_in_condition.rb +11 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +9 -12
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +19 -10
- data/lib/rubocop/cop/lint/multiple_comparison.rb +2 -2
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +2 -0
- data/lib/rubocop/cop/lint/no_return_in_begin_end_blocks.rb +20 -0
- data/lib/rubocop/cop/lint/non_deterministic_require_order.rb +4 -2
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +19 -10
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/numeric_operation_with_constant_result.rb +3 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +7 -7
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +3 -13
- data/lib/rubocop/cop/lint/raise_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +27 -10
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +6 -12
- data/lib/rubocop/cop/lint/redundant_dir_glob_sort.rb +15 -4
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +4 -2
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +36 -12
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +12 -2
- data/lib/rubocop/cop/lint/redundant_type_conversion.rb +10 -3
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +5 -0
- data/lib/rubocop/cop/lint/refinement_import_methods.rb +8 -1
- data/lib/rubocop/cop/lint/regexp_as_condition.rb +9 -1
- data/lib/rubocop/cop/lint/require_parentheses.rb +13 -4
- data/lib/rubocop/cop/lint/require_range_parentheses.rb +2 -1
- data/lib/rubocop/cop/lint/require_relative_self_path.rb +7 -5
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -4
- data/lib/rubocop/cop/lint/rescue_type.rb +1 -1
- data/lib/rubocop/cop/lint/safe_navigation_chain.rb +18 -0
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +7 -1
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +5 -1
- data/lib/rubocop/cop/lint/self_assignment.rb +39 -7
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -1
- 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 +14 -0
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +3 -1
- data/lib/rubocop/cop/lint/struct_new_override.rb +17 -1
- data/lib/rubocop/cop/lint/suppressed_exception_in_number_conversion.rb +12 -0
- data/lib/rubocop/cop/lint/symbol_conversion.rb +21 -4
- data/lib/rubocop/cop/lint/syntax.rb +25 -1
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +28 -1
- data/lib/rubocop/cop/lint/to_json.rb +12 -16
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +5 -1
- data/lib/rubocop/cop/lint/unescaped_bracket_in_regexp.rb +4 -2
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +7 -5
- data/lib/rubocop/cop/lint/unreachable_pattern_branch.rb +113 -0
- data/lib/rubocop/cop/lint/unused_method_argument.rb +10 -0
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +2 -0
- data/lib/rubocop/cop/lint/useless_assignment.rb +53 -25
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +4 -4
- data/lib/rubocop/cop/lint/useless_default_value_argument.rb +2 -0
- data/lib/rubocop/cop/lint/useless_or.rb +15 -2
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +8 -4
- data/lib/rubocop/cop/lint/useless_setter_call.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +22 -1
- data/lib/rubocop/cop/lint/utils/nil_receiver_checker.rb +37 -11
- data/lib/rubocop/cop/lint/void.rb +39 -12
- data/lib/rubocop/cop/message_annotator.rb +1 -1
- data/lib/rubocop/cop/metrics/block_length.rb +1 -1
- data/lib/rubocop/cop/metrics/block_nesting.rb +23 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +1 -1
- data/lib/rubocop/cop/metrics/method_length.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +4 -3
- data/lib/rubocop/cop/metrics/utils/iterating_block.rb +1 -1
- data/lib/rubocop/cop/migration/department_name.rb +12 -1
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +2 -2
- data/lib/rubocop/cop/mixin/check_single_line_suitability.rb +4 -6
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/configurable_max.rb +6 -5
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +1 -7
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +5 -5
- data/lib/rubocop/cop/mixin/hash_transform_method/autocorrection.rb +63 -0
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +10 -60
- data/lib/rubocop/cop/mixin/line_length_help.rb +21 -2
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +1 -1
- data/lib/rubocop/cop/mixin/project_index_help.rb +48 -0
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +5 -4
- data/lib/rubocop/cop/mixin/statement_modifier.rb +0 -6
- data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -5
- data/lib/rubocop/cop/mixin.rb +86 -0
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/block_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +1 -1
- data/lib/rubocop/cop/naming/method_name.rb +5 -3
- data/lib/rubocop/cop/naming/predicate_method.rb +32 -8
- data/lib/rubocop/cop/naming/predicate_prefix.rb +12 -12
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +1 -1
- data/lib/rubocop/cop/offense.rb +17 -1
- data/lib/rubocop/cop/registry.rb +62 -38
- data/lib/rubocop/cop/security/eval.rb +15 -2
- data/lib/rubocop/cop/security/io_methods.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +33 -11
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +15 -4
- data/lib/rubocop/cop/style/accessor_grouping.rb +4 -2
- data/lib/rubocop/cop/style/alias.rb +15 -3
- data/lib/rubocop/cop/style/and_or.rb +2 -1
- data/lib/rubocop/cop/style/arguments_forwarding.rb +25 -7
- data/lib/rubocop/cop/style/array_first_last.rb +12 -1
- data/lib/rubocop/cop/style/array_intersect.rb +50 -12
- data/lib/rubocop/cop/style/array_intersect_with_single_element.rb +50 -0
- data/lib/rubocop/cop/style/array_join.rb +4 -2
- data/lib/rubocop/cop/style/ascii_comments.rb +6 -3
- data/lib/rubocop/cop/style/attr.rb +5 -2
- data/lib/rubocop/cop/style/bare_percent_literals.rb +4 -3
- data/lib/rubocop/cop/style/begin_block.rb +3 -1
- data/lib/rubocop/cop/style/bitwise_predicate.rb +8 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +39 -32
- data/lib/rubocop/cop/style/case_equality.rb +29 -15
- data/lib/rubocop/cop/style/character_literal.rb +2 -2
- data/lib/rubocop/cop/style/class_and_module_children.rb +19 -2
- data/lib/rubocop/cop/style/class_equality_comparison.rb +21 -13
- data/lib/rubocop/cop/style/class_methods_definitions.rb +11 -5
- data/lib/rubocop/cop/style/collection_compact.rb +36 -16
- data/lib/rubocop/cop/style/colon_method_call.rb +16 -7
- data/lib/rubocop/cop/style/combinable_loops.rb +5 -0
- data/lib/rubocop/cop/style/comparable_clamp.rb +12 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +7 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +14 -19
- data/lib/rubocop/cop/style/constant_visibility.rb +20 -12
- data/lib/rubocop/cop/style/copyright.rb +22 -11
- data/lib/rubocop/cop/style/date_time.rb +4 -4
- data/lib/rubocop/cop/style/dig_chain.rb +5 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +1 -1
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +6 -1
- data/lib/rubocop/cop/style/documentation.rb +6 -6
- data/lib/rubocop/cop/style/documentation_method.rb +8 -8
- data/lib/rubocop/cop/style/double_negation.rb +1 -1
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +2 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_class_definition.rb +119 -0
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +0 -6
- data/lib/rubocop/cop/style/encoding.rb +7 -1
- data/lib/rubocop/cop/style/end_block.rb +3 -1
- data/lib/rubocop/cop/style/endless_method.rb +23 -5
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +1 -1
- data/lib/rubocop/cop/style/file_open.rb +84 -0
- data/lib/rubocop/cop/style/file_write.rb +21 -16
- data/lib/rubocop/cop/style/float_division.rb +15 -1
- data/lib/rubocop/cop/style/for.rb +3 -0
- data/lib/rubocop/cop/style/format_string.rb +4 -3
- data/lib/rubocop/cop/style/format_string_token.rb +49 -5
- data/lib/rubocop/cop/style/global_vars.rb +5 -2
- data/lib/rubocop/cop/style/guard_clause.rb +27 -22
- data/lib/rubocop/cop/style/hash_as_last_array_item.rb +27 -9
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -1
- data/lib/rubocop/cop/style/hash_lookup_method.rb +106 -0
- data/lib/rubocop/cop/style/hash_slice.rb +16 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +1 -1
- data/lib/rubocop/cop/style/hash_transform_keys.rb +17 -7
- data/lib/rubocop/cop/style/hash_transform_values.rb +17 -7
- data/lib/rubocop/cop/style/if_inside_else.rb +16 -7
- data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -18
- data/lib/rubocop/cop/style/if_unless_modifier_of_if_unless.rb +12 -12
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +4 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +7 -5
- data/lib/rubocop/cop/style/infinite_loop.rb +1 -1
- data/lib/rubocop/cop/style/inline_comment.rb +4 -1
- data/lib/rubocop/cop/style/ip_addresses.rb +1 -2
- data/lib/rubocop/cop/style/lambda_call.rb +8 -8
- data/lib/rubocop/cop/style/magic_comment_format.rb +3 -3
- data/lib/rubocop/cop/style/map_join.rb +123 -0
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/require_parentheses.rb +15 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +17 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +2 -4
- data/lib/rubocop/cop/style/min_max_comparison.rb +1 -1
- data/lib/rubocop/cop/style/module_member_existence_check.rb +110 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +4 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +2 -4
- data/lib/rubocop/cop/style/mutable_constant.rb +106 -12
- data/lib/rubocop/cop/style/negative_array_index.rb +220 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -10
- data/lib/rubocop/cop/style/nil_lambda.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +5 -11
- data/lib/rubocop/cop/style/not.rb +2 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +3 -2
- data/lib/rubocop/cop/style/one_class_per_file.rb +115 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +21 -12
- data/lib/rubocop/cop/style/operator_method_call.rb +11 -2
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -3
- data/lib/rubocop/cop/style/partition_instead_of_double_select.rb +270 -0
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -0
- data/lib/rubocop/cop/style/predicate_with_kind.rb +84 -0
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +12 -12
- data/lib/rubocop/cop/style/proc.rb +3 -2
- data/lib/rubocop/cop/style/raise_args.rb +1 -1
- data/lib/rubocop/cop/style/reduce_to_hash.rb +200 -0
- data/lib/rubocop/cop/style/redundant_argument.rb +2 -0
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_begin.rb +37 -3
- data/lib/rubocop/cop/style/redundant_condition.rb +6 -3
- data/lib/rubocop/cop/style/redundant_constant_base.rb +5 -5
- data/lib/rubocop/cop/style/redundant_each.rb +3 -3
- data/lib/rubocop/cop/style/redundant_exception.rb +1 -1
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +1 -1
- data/lib/rubocop/cop/style/redundant_format.rb +27 -5
- data/lib/rubocop/cop/style/redundant_interpolation.rb +11 -2
- data/lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb +26 -10
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +16 -0
- data/lib/rubocop/cop/style/redundant_min_max_by.rb +93 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -30
- data/lib/rubocop/cop/style/redundant_percent_q.rb +5 -3
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +9 -0
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +8 -0
- data/lib/rubocop/cop/style/redundant_return.rb +3 -1
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment_branch.rb +0 -5
- data/lib/rubocop/cop/style/redundant_sort.rb +7 -7
- data/lib/rubocop/cop/style/redundant_struct_keyword_init.rb +114 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +31 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +3 -3
- data/lib/rubocop/cop/style/reverse_find.rb +51 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +25 -8
- data/lib/rubocop/cop/style/select_by_kind.rb +158 -0
- data/lib/rubocop/cop/style/select_by_range.rb +197 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +51 -21
- data/lib/rubocop/cop/style/self_assignment.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +41 -8
- data/lib/rubocop/cop/style/single_line_block_params.rb +2 -2
- data/lib/rubocop/cop/style/single_line_do_end_block.rb +1 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +3 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +12 -3
- data/lib/rubocop/cop/style/special_global_vars.rb +6 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +17 -13
- data/lib/rubocop/cop/style/struct_inheritance.rb +13 -0
- data/lib/rubocop/cop/style/super_arguments.rb +2 -2
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +7 -6
- data/lib/rubocop/cop/style/tally_method.rb +181 -0
- data/lib/rubocop/cop/style/top_level_method_definition.rb +2 -2
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +45 -0
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +1 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +11 -11
- data/lib/rubocop/cop/style/unless_else.rb +10 -9
- data/lib/rubocop/cop/style/unless_logical_operators.rb +3 -3
- data/lib/rubocop/cop/style/while_until_do.rb +7 -0
- data/lib/rubocop/cop/style/while_until_modifier.rb +16 -0
- data/lib/rubocop/cop/style/word_array.rb +1 -0
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/yoda_expression.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +6 -3
- data/lib/rubocop/cop/team.rb +87 -36
- data/lib/rubocop/cop/util.rb +2 -3
- data/lib/rubocop/cop/utils/format_string.rb +10 -0
- data/lib/rubocop/cop/variable_force/branch.rb +30 -6
- data/lib/rubocop/cop/variable_force/variable.rb +1 -1
- data/lib/rubocop/cop/variable_force.rb +9 -7
- data/lib/rubocop/cops_documentation_generator.rb +4 -4
- data/lib/rubocop/directive_comment.rb +48 -4
- data/lib/rubocop/file_patterns.rb +9 -1
- data/lib/rubocop/formatter/clang_style_formatter.rb +5 -2
- data/lib/rubocop/formatter/disabled_config_formatter.rb +38 -14
- data/lib/rubocop/formatter/formatter_set.rb +2 -2
- data/lib/rubocop/formatter/junit_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +0 -2
- data/lib/rubocop/formatter/tap_formatter.rb +5 -2
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +1 -1
- data/lib/rubocop/formatter.rb +22 -21
- data/lib/rubocop/lsp/diagnostic.rb +18 -33
- data/lib/rubocop/lsp/disable_comment_edits.rb +135 -0
- data/lib/rubocop/lsp/routes.rb +43 -7
- data/lib/rubocop/lsp/runtime.rb +13 -4
- data/lib/rubocop/lsp/stdin_runner.rb +8 -17
- data/lib/rubocop/magic_comment.rb +20 -0
- data/lib/rubocop/mcp/server.rb +200 -0
- data/lib/rubocop/options.rb +35 -4
- data/lib/rubocop/path_util.rb +14 -2
- data/lib/rubocop/plugin/loader.rb +1 -1
- data/lib/rubocop/project_index_loader.rb +66 -0
- data/lib/rubocop/rake_task.rb +1 -1
- data/lib/rubocop/remote_config.rb +10 -8
- data/lib/rubocop/result_cache.rb +61 -38
- data/lib/rubocop/rspec/cop_helper.rb +8 -0
- data/lib/rubocop/rspec/shared_contexts.rb +39 -5
- data/lib/rubocop/rspec/support.rb +2 -1
- data/lib/rubocop/runner.rb +134 -57
- data/lib/rubocop/server/cache.rb +6 -29
- data/lib/rubocop/server/core.rb +8 -0
- data/lib/rubocop/target_finder.rb +17 -10
- data/lib/rubocop/target_ruby.rb +31 -14
- data/lib/rubocop/version.rb +21 -3
- data/lib/rubocop.rb +28 -96
- data/lib/ruby_lsp/rubocop/addon.rb +23 -8
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +49 -15
- metadata +38 -9
|
@@ -21,6 +21,23 @@ module RuboCop
|
|
|
21
21
|
# something
|
|
22
22
|
# RUBY
|
|
23
23
|
#
|
|
24
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: false (default)
|
|
25
|
+
# # good
|
|
26
|
+
# <<-RUBY.squish
|
|
27
|
+
# something
|
|
28
|
+
# RUBY
|
|
29
|
+
#
|
|
30
|
+
# @example AllCops:ActiveSupportExtensionsEnabled: true
|
|
31
|
+
# # bad
|
|
32
|
+
# <<-RUBY.squish
|
|
33
|
+
# something
|
|
34
|
+
# RUBY
|
|
35
|
+
#
|
|
36
|
+
# # good
|
|
37
|
+
# <<~RUBY.squish
|
|
38
|
+
# something
|
|
39
|
+
# RUBY
|
|
40
|
+
#
|
|
24
41
|
class HeredocIndentation < Base
|
|
25
42
|
include Alignment
|
|
26
43
|
include Heredoc
|
|
@@ -33,6 +50,11 @@ module RuboCop
|
|
|
33
50
|
'heredoc by using `<<~` instead of `%<current_indent_type>s`.'
|
|
34
51
|
WIDTH_MSG = 'Use %<indentation_width>d spaces for indentation in a heredoc.'
|
|
35
52
|
|
|
53
|
+
# @!method squish_method?(node)
|
|
54
|
+
def_node_matcher :squish_method?, <<~PATTERN
|
|
55
|
+
(send _ {:squish :squish!})
|
|
56
|
+
PATTERN
|
|
57
|
+
|
|
36
58
|
def on_heredoc(node)
|
|
37
59
|
body = heredoc_body(node)
|
|
38
60
|
return if body.strip.empty?
|
|
@@ -44,7 +66,7 @@ module RuboCop
|
|
|
44
66
|
expected_indent_level = base_indent_level(node) + configured_indentation_width
|
|
45
67
|
return if expected_indent_level == body_indent_level
|
|
46
68
|
else
|
|
47
|
-
return unless body_indent_level.zero?
|
|
69
|
+
return unless body_indent_level.zero? || heredoc_squish?(node)
|
|
48
70
|
end
|
|
49
71
|
|
|
50
72
|
return if line_too_long?(node)
|
|
@@ -60,6 +82,8 @@ module RuboCop
|
|
|
60
82
|
add_offense(node.loc.heredoc_body, message: message) do |corrector|
|
|
61
83
|
if heredoc_indent_type == '~'
|
|
62
84
|
adjust_squiggly(corrector, node)
|
|
85
|
+
elsif heredoc_squish?(node)
|
|
86
|
+
adjust_heredoc_squish(corrector, node)
|
|
63
87
|
else
|
|
64
88
|
adjust_minus(corrector, node)
|
|
65
89
|
end
|
|
@@ -89,6 +113,7 @@ module RuboCop
|
|
|
89
113
|
end
|
|
90
114
|
|
|
91
115
|
def line_too_long?(node)
|
|
116
|
+
return false unless max_line_length
|
|
92
117
|
return false if unlimited_heredoc_length?
|
|
93
118
|
|
|
94
119
|
body = heredoc_body(node)
|
|
@@ -108,8 +133,9 @@ module RuboCop
|
|
|
108
133
|
config.for_cop('Layout/LineLength')['AllowHeredoc']
|
|
109
134
|
end
|
|
110
135
|
|
|
111
|
-
def
|
|
112
|
-
|
|
136
|
+
def adjust_heredoc_squish(corrector, node)
|
|
137
|
+
adjust_squiggly(corrector, node)
|
|
138
|
+
adjust_minus(corrector, node)
|
|
113
139
|
end
|
|
114
140
|
|
|
115
141
|
def adjust_squiggly(corrector, node)
|
|
@@ -159,6 +185,10 @@ module RuboCop
|
|
|
159
185
|
def heredoc_end(node)
|
|
160
186
|
node.loc.heredoc_end.source
|
|
161
187
|
end
|
|
188
|
+
|
|
189
|
+
def heredoc_squish?(node)
|
|
190
|
+
active_support_extensions_enabled? && squish_method?(node.parent)
|
|
191
|
+
end
|
|
162
192
|
end
|
|
163
193
|
end
|
|
164
194
|
end
|
|
@@ -5,6 +5,8 @@ module RuboCop
|
|
|
5
5
|
module Layout
|
|
6
6
|
# Checks for indentation that doesn't use the specified number of spaces.
|
|
7
7
|
# The indentation width can be configured using the `Width` setting. The default width is 2.
|
|
8
|
+
# The block body indentation for method chain blocks can be configured using the
|
|
9
|
+
# `EnforcedStyleAlignWith` setting.
|
|
8
10
|
#
|
|
9
11
|
# See also the `Layout/IndentationConsistency` cop which is the companion to this one.
|
|
10
12
|
#
|
|
@@ -41,7 +43,22 @@ module RuboCop
|
|
|
41
43
|
# end
|
|
42
44
|
# end
|
|
43
45
|
# end
|
|
46
|
+
#
|
|
47
|
+
# @example EnforcedStyleAlignWith: start_of_line (default)
|
|
48
|
+
# # good
|
|
49
|
+
# records.uniq { |el| el[:profile_id] }
|
|
50
|
+
# .map do |message|
|
|
51
|
+
# SomeJob.perform_later(message[:id])
|
|
52
|
+
# end
|
|
53
|
+
#
|
|
54
|
+
# @example EnforcedStyleAlignWith: relative_to_receiver
|
|
55
|
+
# # good
|
|
56
|
+
# records.uniq { |el| el[:profile_id] }
|
|
57
|
+
# .map do |message|
|
|
58
|
+
# SomeJob.perform_later(message[:id])
|
|
59
|
+
# end
|
|
44
60
|
class IndentationWidth < Base # rubocop:disable Metrics/ClassLength
|
|
61
|
+
include ConfigurableEnforcedStyle
|
|
45
62
|
include EndKeywordAlignment
|
|
46
63
|
include Alignment
|
|
47
64
|
include CheckAssignment
|
|
@@ -50,7 +67,7 @@ module RuboCop
|
|
|
50
67
|
extend AutoCorrector
|
|
51
68
|
|
|
52
69
|
MSG = 'Use %<configured_indentation_width>d (not %<indentation>d) ' \
|
|
53
|
-
'
|
|
70
|
+
'%<indentation_type>s for%<name>s indentation.'
|
|
54
71
|
|
|
55
72
|
# @!method access_modifier?(node)
|
|
56
73
|
def_node_matcher :access_modifier?, <<~PATTERN
|
|
@@ -83,9 +100,11 @@ module RuboCop
|
|
|
83
100
|
|
|
84
101
|
return unless begins_its_line?(end_loc)
|
|
85
102
|
|
|
86
|
-
|
|
103
|
+
base_loc = block_body_indentation_base(node, end_loc)
|
|
104
|
+
check_indentation(base_loc, node.body)
|
|
87
105
|
|
|
88
106
|
return unless indented_internal_methods_style?
|
|
107
|
+
return unless contains_access_modifier?(node.body)
|
|
89
108
|
|
|
90
109
|
check_members(end_loc, [node.body])
|
|
91
110
|
end
|
|
@@ -145,7 +164,7 @@ module RuboCop
|
|
|
145
164
|
end
|
|
146
165
|
|
|
147
166
|
def on_case_match(case_match)
|
|
148
|
-
case_match.
|
|
167
|
+
case_match.in_pattern_branches.each do |in_pattern_node|
|
|
149
168
|
check_indentation(in_pattern_node.loc.keyword, in_pattern_node.body)
|
|
150
169
|
end
|
|
151
170
|
|
|
@@ -164,6 +183,8 @@ module RuboCop
|
|
|
164
183
|
private
|
|
165
184
|
|
|
166
185
|
def autocorrect(corrector, node)
|
|
186
|
+
return unless node
|
|
187
|
+
|
|
167
188
|
AlignmentCorrector.correct(corrector, processed_source, node, @column_delta)
|
|
168
189
|
end
|
|
169
190
|
|
|
@@ -172,7 +193,7 @@ module RuboCop
|
|
|
172
193
|
|
|
173
194
|
return unless members.any? && members.first.begin_type?
|
|
174
195
|
|
|
175
|
-
if
|
|
196
|
+
if indented_internal_methods_style?
|
|
176
197
|
check_members_for_indented_internal_methods_style(members)
|
|
177
198
|
else
|
|
178
199
|
check_members_for_normal_style(base, members)
|
|
@@ -301,10 +322,32 @@ module RuboCop
|
|
|
301
322
|
end
|
|
302
323
|
|
|
303
324
|
def message(configured_indentation_width, indentation, name)
|
|
325
|
+
if using_tabs?
|
|
326
|
+
message_for_tabs(configured_indentation_width, indentation, name)
|
|
327
|
+
else
|
|
328
|
+
message_for_spaces(configured_indentation_width, indentation, name)
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
|
|
332
|
+
def message_for_tabs(configured_indentation_width, indentation, name)
|
|
333
|
+
configured_tabs = 1
|
|
334
|
+
actual_tabs = indentation / configured_indentation_width
|
|
335
|
+
|
|
336
|
+
format(
|
|
337
|
+
MSG,
|
|
338
|
+
configured_indentation_width: configured_tabs,
|
|
339
|
+
indentation: actual_tabs,
|
|
340
|
+
indentation_type: 'tabs',
|
|
341
|
+
name: name
|
|
342
|
+
)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def message_for_spaces(configured_indentation_width, indentation, name)
|
|
304
346
|
format(
|
|
305
347
|
MSG,
|
|
306
348
|
configured_indentation_width: configured_indentation_width,
|
|
307
349
|
indentation: indentation,
|
|
350
|
+
indentation_type: 'spaces',
|
|
308
351
|
name: name
|
|
309
352
|
)
|
|
310
353
|
end
|
|
@@ -360,7 +403,13 @@ module RuboCop
|
|
|
360
403
|
def offending_range(body_node, indentation)
|
|
361
404
|
expr = body_node.source_range
|
|
362
405
|
begin_pos = expr.begin_pos
|
|
363
|
-
|
|
406
|
+
|
|
407
|
+
ind = if using_tabs?
|
|
408
|
+
begin_pos - line_indentation(expr).length
|
|
409
|
+
else
|
|
410
|
+
begin_pos - indentation
|
|
411
|
+
end
|
|
412
|
+
|
|
364
413
|
pos = indentation >= 0 ? ind..begin_pos : begin_pos..ind
|
|
365
414
|
range_between(pos.begin, pos.end)
|
|
366
415
|
end
|
|
@@ -374,8 +423,47 @@ module RuboCop
|
|
|
374
423
|
starting_node.send_type? && starting_node.bare_access_modifier?
|
|
375
424
|
end
|
|
376
425
|
|
|
377
|
-
def
|
|
378
|
-
|
|
426
|
+
def contains_access_modifier?(body_node)
|
|
427
|
+
return false unless body_node&.begin_type?
|
|
428
|
+
|
|
429
|
+
body_node.children.any? { |child| child.send_type? && child.bare_access_modifier? }
|
|
430
|
+
end
|
|
431
|
+
|
|
432
|
+
def indentation_style
|
|
433
|
+
config.for_cop('Layout/IndentationStyle')['EnforcedStyle'] || 'spaces'
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
def using_tabs?
|
|
437
|
+
indentation_style == 'tabs'
|
|
438
|
+
end
|
|
439
|
+
|
|
440
|
+
def column_offset_between(base_range, range)
|
|
441
|
+
return super unless using_tabs?
|
|
442
|
+
|
|
443
|
+
base_uses_tabs = line_uses_tabs?(base_range)
|
|
444
|
+
range_uses_tabs = line_uses_tabs?(range)
|
|
445
|
+
|
|
446
|
+
return super unless base_uses_tabs || range_uses_tabs
|
|
447
|
+
|
|
448
|
+
visual_column(base_range) - visual_column(range)
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def line_indentation(range)
|
|
452
|
+
line = processed_source.lines[range.line - 1]
|
|
453
|
+
line[0...range.column]
|
|
454
|
+
end
|
|
455
|
+
|
|
456
|
+
def line_uses_tabs?(range)
|
|
457
|
+
line_indentation(range).include?("\t")
|
|
458
|
+
end
|
|
459
|
+
|
|
460
|
+
def visual_column(range)
|
|
461
|
+
indentation = line_indentation(range)
|
|
462
|
+
|
|
463
|
+
tab_count = indentation.count("\t")
|
|
464
|
+
space_count = indentation.count(' ')
|
|
465
|
+
|
|
466
|
+
(tab_count * configured_indentation_width) + space_count
|
|
379
467
|
end
|
|
380
468
|
|
|
381
469
|
def leftmost_modifier_of(node)
|
|
@@ -383,6 +471,34 @@ module RuboCop
|
|
|
383
471
|
|
|
384
472
|
leftmost_modifier_of(node.parent)
|
|
385
473
|
end
|
|
474
|
+
|
|
475
|
+
def block_body_indentation_base(node, end_loc)
|
|
476
|
+
return end_loc unless style == :relative_to_receiver
|
|
477
|
+
|
|
478
|
+
if dot_on_new_line?(node)
|
|
479
|
+
node.send_node.loc.dot
|
|
480
|
+
elsif selector_on_new_line?(node)
|
|
481
|
+
node.send_node.loc.selector
|
|
482
|
+
else
|
|
483
|
+
end_loc
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
def dot_on_new_line?(node)
|
|
488
|
+
send_node = node.send_node
|
|
489
|
+
return false unless send_node.loc?(:dot)
|
|
490
|
+
|
|
491
|
+
receiver = send_node.receiver
|
|
492
|
+
receiver && receiver.last_line < send_node.loc.dot.line
|
|
493
|
+
end
|
|
494
|
+
|
|
495
|
+
def selector_on_new_line?(node)
|
|
496
|
+
send_node = node.send_node
|
|
497
|
+
return false unless send_node.loc?(:dot) && send_node.loc?(:selector)
|
|
498
|
+
|
|
499
|
+
receiver = send_node.receiver
|
|
500
|
+
receiver && receiver.last_line < send_node.loc.selector.line
|
|
501
|
+
end
|
|
386
502
|
end
|
|
387
503
|
end
|
|
388
504
|
end
|
|
@@ -101,7 +101,7 @@ module RuboCop
|
|
|
101
101
|
ranges << loc.expression
|
|
102
102
|
elsif literal.heredoc?
|
|
103
103
|
ranges << loc.heredoc_body
|
|
104
|
-
elsif
|
|
104
|
+
elsif literal.loc?(:begin) || ignored_parent?(literal)
|
|
105
105
|
ranges << loc.expression
|
|
106
106
|
end
|
|
107
107
|
end
|
|
@@ -134,6 +134,7 @@ module RuboCop
|
|
|
134
134
|
|
|
135
135
|
def check_for_breakable_block(block_node)
|
|
136
136
|
return unless block_node.single_line?
|
|
137
|
+
return if receiver_contains_heredoc?(block_node)
|
|
137
138
|
|
|
138
139
|
line_index = block_node.loc.line - 1
|
|
139
140
|
range = breakable_block_range(block_node)
|
|
@@ -251,17 +252,22 @@ module RuboCop
|
|
|
251
252
|
[max - indentation_difference(line), 0].max
|
|
252
253
|
end
|
|
253
254
|
|
|
255
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
254
256
|
def check_line(line, line_index)
|
|
255
257
|
return if line_length(line) <= max
|
|
256
258
|
return if allowed_line?(line, line_index)
|
|
259
|
+
if allow_rbs_inline_annotation? && rbs_inline_annotation_on_source_line?(line_index)
|
|
260
|
+
return
|
|
261
|
+
end
|
|
257
262
|
|
|
258
|
-
if
|
|
263
|
+
if allow_cop_directives? && directive_on_source_line?(line_index)
|
|
259
264
|
return check_directive_line(line, line_index)
|
|
260
265
|
end
|
|
261
266
|
return check_line_for_exemptions(line, line_index) if allow_uri? || allow_qualified_name?
|
|
262
267
|
|
|
263
268
|
register_offense(excess_range(nil, line, line_index), line, line_index)
|
|
264
269
|
end
|
|
270
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
265
271
|
|
|
266
272
|
def allowed_line?(line, line_index)
|
|
267
273
|
matches_allowed_pattern?(line) ||
|
|
@@ -305,6 +311,7 @@ module RuboCop
|
|
|
305
311
|
def max
|
|
306
312
|
cop_config['Max']
|
|
307
313
|
end
|
|
314
|
+
alias max_line_length max
|
|
308
315
|
|
|
309
316
|
def allow_heredoc?
|
|
310
317
|
allowed_heredoc
|
|
@@ -321,7 +328,7 @@ module RuboCop
|
|
|
321
328
|
def extract_heredocs(ast)
|
|
322
329
|
return [] unless ast
|
|
323
330
|
|
|
324
|
-
ast.each_node(:
|
|
331
|
+
ast.each_node(:any_str).select(&:heredoc?).map do |node|
|
|
325
332
|
body = node.location.heredoc_body
|
|
326
333
|
delimiter = node.location.heredoc_end.source.strip
|
|
327
334
|
[body.first_line...body.last_line, delimiter]
|
|
@@ -341,6 +348,13 @@ module RuboCop
|
|
|
341
348
|
heredocs.any? { |range, _delimiter| range.cover?(line_number) }
|
|
342
349
|
end
|
|
343
350
|
|
|
351
|
+
def receiver_contains_heredoc?(node)
|
|
352
|
+
return false unless (receiver = node.receiver)
|
|
353
|
+
return true if receiver.any_str_type? && receiver.heredoc?
|
|
354
|
+
|
|
355
|
+
receiver.each_descendant(:any_str).any?(&:heredoc?)
|
|
356
|
+
end
|
|
357
|
+
|
|
344
358
|
def check_directive_line(line, line_index)
|
|
345
359
|
length_without_directive = line_length_without_directive(line)
|
|
346
360
|
return if length_without_directive <= max
|
|
@@ -392,11 +406,11 @@ module RuboCop
|
|
|
392
406
|
end
|
|
393
407
|
|
|
394
408
|
def string_delimiter(node)
|
|
395
|
-
delimiter = node.loc
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
409
|
+
delimiter = if node.loc?(:begin)
|
|
410
|
+
node.loc.begin
|
|
411
|
+
elsif node.parent&.dstr_type? && node.parent.loc?(:begin)
|
|
412
|
+
node.parent.loc.begin
|
|
413
|
+
end&.source
|
|
400
414
|
|
|
401
415
|
delimiter if %w[' "].include?(delimiter)
|
|
402
416
|
end
|
|
@@ -406,8 +420,11 @@ module RuboCop
|
|
|
406
420
|
# The maximum allowed length of a string value is:
|
|
407
421
|
# `Max` - end delimiter (quote) - continuation characters (space and slash)
|
|
408
422
|
max_length = max - 3
|
|
409
|
-
# If the string
|
|
410
|
-
|
|
423
|
+
# If the string is on the same line as its parent, offset by the column difference
|
|
424
|
+
# (Only apply when on same line to avoid negative offsets for multi-line dstr)
|
|
425
|
+
if same_line?(node, node.parent)
|
|
426
|
+
max_length -= column_offset_between(node.loc, node.parent.loc)
|
|
427
|
+
end
|
|
411
428
|
node.source[0...(max_length)]
|
|
412
429
|
end
|
|
413
430
|
end
|
|
@@ -27,67 +27,67 @@ module RuboCop
|
|
|
27
27
|
# line as the last element of the array.
|
|
28
28
|
#
|
|
29
29
|
# @example EnforcedStyle: symmetrical (default)
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
#
|
|
37
|
-
#
|
|
38
|
-
#
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
#
|
|
43
|
-
#
|
|
44
|
-
#
|
|
45
|
-
#
|
|
46
|
-
#
|
|
47
|
-
#
|
|
48
|
-
#
|
|
30
|
+
# # bad
|
|
31
|
+
# [ :a,
|
|
32
|
+
# :b
|
|
33
|
+
# ]
|
|
34
|
+
#
|
|
35
|
+
# # bad
|
|
36
|
+
# [
|
|
37
|
+
# :a,
|
|
38
|
+
# :b ]
|
|
39
|
+
#
|
|
40
|
+
# # good
|
|
41
|
+
# [ :a,
|
|
42
|
+
# :b ]
|
|
43
|
+
#
|
|
44
|
+
# # good
|
|
45
|
+
# [
|
|
46
|
+
# :a,
|
|
47
|
+
# :b
|
|
48
|
+
# ]
|
|
49
49
|
#
|
|
50
50
|
# @example EnforcedStyle: new_line
|
|
51
|
-
#
|
|
52
|
-
#
|
|
53
|
-
#
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
#
|
|
57
|
-
#
|
|
58
|
-
#
|
|
59
|
-
#
|
|
60
|
-
#
|
|
61
|
-
#
|
|
62
|
-
#
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
#
|
|
69
|
-
#
|
|
51
|
+
# # bad
|
|
52
|
+
# [
|
|
53
|
+
# :a,
|
|
54
|
+
# :b ]
|
|
55
|
+
#
|
|
56
|
+
# # bad
|
|
57
|
+
# [ :a,
|
|
58
|
+
# :b ]
|
|
59
|
+
#
|
|
60
|
+
# # good
|
|
61
|
+
# [ :a,
|
|
62
|
+
# :b
|
|
63
|
+
# ]
|
|
64
|
+
#
|
|
65
|
+
# # good
|
|
66
|
+
# [
|
|
67
|
+
# :a,
|
|
68
|
+
# :b
|
|
69
|
+
# ]
|
|
70
70
|
#
|
|
71
71
|
# @example EnforcedStyle: same_line
|
|
72
|
-
#
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
#
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
#
|
|
79
|
-
#
|
|
80
|
-
#
|
|
81
|
-
#
|
|
82
|
-
#
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
#
|
|
87
|
-
#
|
|
88
|
-
#
|
|
89
|
-
#
|
|
90
|
-
#
|
|
72
|
+
# # bad
|
|
73
|
+
# [ :a,
|
|
74
|
+
# :b
|
|
75
|
+
# ]
|
|
76
|
+
#
|
|
77
|
+
# # bad
|
|
78
|
+
# [
|
|
79
|
+
# :a,
|
|
80
|
+
# :b
|
|
81
|
+
# ]
|
|
82
|
+
#
|
|
83
|
+
# # good
|
|
84
|
+
# [
|
|
85
|
+
# :a,
|
|
86
|
+
# :b ]
|
|
87
|
+
#
|
|
88
|
+
# # good
|
|
89
|
+
# [ :a,
|
|
90
|
+
# :b ]
|
|
91
91
|
class MultilineArrayBraceLayout < Base
|
|
92
92
|
include MultilineLiteralBraceLayout
|
|
93
93
|
extend AutoCorrector
|
|
@@ -69,14 +69,18 @@ module RuboCop
|
|
|
69
69
|
SAME_LINE_OFFENSE = 'Right hand side of multi-line assignment is not ' \
|
|
70
70
|
'on the same line as the assignment operator `=`.'
|
|
71
71
|
|
|
72
|
+
BLOCK_TYPES = %i[block numblock itblock].freeze
|
|
73
|
+
|
|
74
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
72
75
|
def check_assignment(node, rhs)
|
|
73
76
|
return if node.send_type? && node.loc.operator&.source != '='
|
|
74
77
|
return unless rhs
|
|
75
78
|
return unless supported_types.include?(rhs.type)
|
|
76
|
-
return if rhs.single_line?
|
|
79
|
+
return if rhs.single_line? && (!rhs.block_type? || same_line?(node, rhs.loc.begin))
|
|
77
80
|
|
|
78
81
|
check_by_enforced_style(node, rhs)
|
|
79
82
|
end
|
|
83
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
|
80
84
|
|
|
81
85
|
def check_by_enforced_style(node, rhs)
|
|
82
86
|
case style
|
|
@@ -109,7 +113,10 @@ module RuboCop
|
|
|
109
113
|
private
|
|
110
114
|
|
|
111
115
|
def supported_types
|
|
112
|
-
@supported_types ||= cop_config['SupportedTypes'].
|
|
116
|
+
@supported_types ||= cop_config['SupportedTypes'].flat_map do |type|
|
|
117
|
+
sym = type.to_sym
|
|
118
|
+
sym == :block ? BLOCK_TYPES : sym
|
|
119
|
+
end
|
|
113
120
|
end
|
|
114
121
|
end
|
|
115
122
|
end
|