rubocop 1.67.0 → 1.73.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 +4 -4
- data/config/default.yml +168 -19
- data/config/internal_affairs.yml +16 -0
- data/lib/rubocop/cached_data.rb +12 -4
- 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/comment_config.rb +2 -2
- data/lib/rubocop/config.rb +17 -4
- data/lib/rubocop/config_loader.rb +48 -8
- data/lib/rubocop/config_loader_resolver.rb +35 -10
- data/lib/rubocop/config_validator.rb +19 -9
- data/lib/rubocop/cop/autocorrect_logic.rb +36 -19
- 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/correctors/alignment_corrector.rb +1 -12
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +10 -0
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -2
- 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 +4 -2
- 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 +1 -1
- 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 +229 -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_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 +7 -1
- data/lib/rubocop/cop/internal_affairs.rb +6 -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/class_structure.rb +9 -9
- 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 +2 -2
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +7 -11
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +29 -4
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +5 -6
- 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 +3 -8
- 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 +6 -4
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +2 -1
- data/lib/rubocop/cop/layout/indentation_width.rb +7 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +44 -1
- 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 +119 -4
- 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_operation_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/parameter_alignment.rb +3 -4
- data/lib/rubocop/cop/layout/redundant_line_break.rb +10 -41
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +4 -3
- 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 +1 -1
- data/lib/rubocop/cop/layout/space_around_keyword.rb +2 -1
- data/lib/rubocop/cop/layout/space_around_method_call_operator.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +19 -20
- data/lib/rubocop/cop/layout/space_before_brackets.rb +5 -5
- 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 +6 -0
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +4 -0
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +0 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +5 -3
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +1 -1
- data/lib/rubocop/cop/lint/array_literal_in_regexp.rb +119 -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/circular_argument_reference.rb +6 -0
- data/lib/rubocop/cop/lint/constant_definition_in_block.rb +3 -3
- data/lib/rubocop/cop/lint/constant_reassignment.rb +148 -0
- data/lib/rubocop/cop/lint/cop_directive_syntax.rb +84 -0
- data/lib/rubocop/cop/lint/debugger.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +2 -1
- 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 +0 -14
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_set_element.rb +20 -7
- 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/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_comparison.rb +20 -14
- 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/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 +105 -7
- 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_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_case_range.rb +4 -7
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +9 -5
- 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 +1 -1
- 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 +93 -0
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +1 -2
- 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/redundant_cop_enable_directive.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_regexp_quantifiers.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +0 -21
- data/lib/rubocop/cop/lint/redundant_safe_navigation.rb +12 -7
- 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 +252 -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/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -7
- 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 +8 -10
- data/lib/rubocop/cop/lint/shadowed_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shared_mutable_default.rb +65 -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/unescaped_bracket_in_regexp.rb +88 -0
- data/lib/rubocop/cop/lint/unexpected_block_arity.rb +1 -1
- data/lib/rubocop/cop/lint/unmodified_reduce_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +51 -2
- data/lib/rubocop/cop/lint/unreachable_loop.rb +1 -1
- data/lib/rubocop/cop/lint/unused_method_argument.rb +18 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -4
- data/lib/rubocop/cop/lint/useless_assignment.rb +1 -1
- data/lib/rubocop/cop/lint/useless_constant_scoping.rb +80 -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 +2 -1
- data/lib/rubocop/cop/lint/useless_rescue.rb +1 -1
- data/lib/rubocop/cop/lint/useless_ruby2_keywords.rb +2 -2
- data/lib/rubocop/cop/lint/useless_setter_call.rb +14 -25
- data/lib/rubocop/cop/lint/void.rb +14 -11
- 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 +8 -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 +2 -3
- data/lib/rubocop/cop/metrics/utils/repeated_attribute_discount.rb +7 -7
- data/lib/rubocop/cop/mixin/alignment.rb +2 -2
- 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 +20 -10
- 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/dig_help.rb +27 -0
- data/lib/rubocop/cop/mixin/endless_method_rewriter.rb +24 -0
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +4 -2
- 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 +5 -4
- data/lib/rubocop/cop/mixin/method_complexity.rb +1 -1
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +5 -9
- 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 +3 -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 +15 -3
- 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 +0 -2
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +11 -12
- data/lib/rubocop/cop/naming/predicate_name.rb +44 -0
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +6 -14
- data/lib/rubocop/cop/naming/variable_name.rb +63 -6
- data/lib/rubocop/cop/naming/variable_number.rb +2 -3
- data/lib/rubocop/cop/offense.rb +2 -3
- data/lib/rubocop/cop/security/compound_hash.rb +2 -0
- data/lib/rubocop/cop/security/yaml_load.rb +3 -2
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +86 -28
- data/lib/rubocop/cop/style/accessor_grouping.rb +19 -5
- 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 +39 -23
- data/lib/rubocop/cop/style/array_first_last.rb +18 -2
- data/lib/rubocop/cop/style/array_intersect.rb +5 -4
- data/lib/rubocop/cop/style/bitwise_predicate.rb +100 -0
- data/lib/rubocop/cop/style/block_delimiters.rb +41 -24
- data/lib/rubocop/cop/style/case_like_if.rb +8 -11
- data/lib/rubocop/cop/style/class_and_module_children.rb +6 -3
- data/lib/rubocop/cop/style/collection_methods.rb +1 -1
- data/lib/rubocop/cop/style/combinable_defined.rb +115 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +2 -2
- data/lib/rubocop/cop/style/commented_keyword.rb +11 -1
- data/lib/rubocop/cop/style/concat_array_literals.rb +1 -1
- data/lib/rubocop/cop/style/conditional_assignment.rb +25 -25
- data/lib/rubocop/cop/style/constant_visibility.rb +3 -12
- 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 +3 -3
- 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 +1 -1
- data/lib/rubocop/cop/style/empty_method.rb +1 -1
- data/lib/rubocop/cop/style/endless_method.rb +150 -18
- data/lib/rubocop/cop/style/eval_with_location.rb +1 -1
- data/lib/rubocop/cop/style/exact_regexp_match.rb +2 -3
- data/lib/rubocop/cop/style/explicit_block_argument.rb +15 -2
- data/lib/rubocop/cop/style/exponential_notation.rb +1 -1
- data/lib/rubocop/cop/style/fetch_env_var.rb +2 -1
- 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 +0 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/global_vars.rb +1 -3
- data/lib/rubocop/cop/style/guard_clause.rb +15 -2
- data/lib/rubocop/cop/style/hash_conversion.rb +1 -2
- data/lib/rubocop/cop/style/hash_each_methods.rb +3 -6
- data/lib/rubocop/cop/style/hash_except.rb +35 -147
- data/lib/rubocop/cop/style/hash_slice.rb +80 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -3
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +22 -3
- data/lib/rubocop/cop/style/if_inside_else.rb +0 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +3 -3
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -3
- 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 +6 -7
- data/lib/rubocop/cop/style/it_assignment.rb +36 -0
- data/lib/rubocop/cop/style/keyword_arguments_merging.rb +67 -0
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +1 -1
- data/lib/rubocop/cop/style/lambda_call.rb +3 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +10 -4
- data/lib/rubocop/cop/style/map_into_array.rb +7 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +1 -1
- data/lib/rubocop/cop/style/map_to_set.rb +3 -2
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +20 -13
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +2 -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 +2 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +1 -1
- 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 +1 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- 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/not.rb +1 -1
- data/lib/rubocop/cop/style/object_then.rb +14 -15
- data/lib/rubocop/cop/style/one_line_conditional.rb +25 -4
- 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 +9 -18
- 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/proc.rb +1 -2
- data/lib/rubocop/cop/style/quoted_symbols.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +7 -5
- 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_assignment.rb +1 -1
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_condition.rb +72 -23
- data/lib/rubocop/cop/style/redundant_current_directory_in_path.rb +2 -1
- 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_format.rb +250 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +2 -2
- data/lib/rubocop/cop/style/redundant_initialize.rb +12 -3
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +54 -15
- data/lib/rubocop/cop/style/redundant_parentheses.rb +36 -24
- data/lib/rubocop/cop/style/redundant_regexp_argument.rb +4 -0
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self.rb +8 -15
- 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_string_escape.rb +2 -2
- data/lib/rubocop/cop/style/rescue_modifier.rb +2 -3
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +14 -2
- data/lib/rubocop/cop/style/safe_navigation_chain_length.rb +52 -0
- data/lib/rubocop/cop/style/select_by_regexp.rb +1 -1
- data/lib/rubocop/cop/style/self_assignment.rb +11 -17
- data/lib/rubocop/cop/style/semicolon.rb +1 -1
- 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 +12 -3
- data/lib/rubocop/cop/style/single_line_methods.rb +6 -7
- data/lib/rubocop/cop/style/slicing_with_range.rb +40 -11
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +4 -5
- data/lib/rubocop/cop/style/special_global_vars.rb +1 -1
- data/lib/rubocop/cop/style/string_concatenation.rb +15 -14
- 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/super_arguments.rb +65 -17
- data/lib/rubocop/cop/style/swap_values.rb +4 -15
- data/lib/rubocop/cop/style/ternary_parentheses.rb +25 -4
- data/lib/rubocop/cop/style/top_level_method_definition.rb +1 -1
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +4 -1
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +47 -6
- 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/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/util.rb +12 -5
- data/lib/rubocop/cop/utils/format_string.rb +7 -5
- data/lib/rubocop/cop/variable_force/assignment.rb +18 -3
- data/lib/rubocop/cop/variable_force/branch.rb +1 -1
- data/lib/rubocop/cop/variable_force/variable.rb +18 -2
- data/lib/rubocop/cop/variable_force/variable_table.rb +5 -5
- data/lib/rubocop/cop/variable_force.rb +4 -10
- data/lib/rubocop/cops_documentation_generator.rb +44 -23
- data/lib/rubocop/directive_comment.rb +44 -10
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +1 -1
- data/lib/rubocop/lsp/diagnostic.rb +189 -0
- data/lib/rubocop/lsp/logger.rb +2 -2
- data/lib/rubocop/lsp/routes.rb +7 -23
- data/lib/rubocop/lsp/runtime.rb +17 -49
- data/lib/rubocop/lsp/server.rb +0 -2
- data/lib/rubocop/lsp/stdin_runner.rb +83 -0
- data/lib/rubocop/magic_comment.rb +3 -3
- data/lib/rubocop/options.rb +28 -12
- data/lib/rubocop/path_util.rb +15 -8
- 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 +13 -13
- data/lib/rubocop/rspec/cop_helper.rb +9 -0
- data/lib/rubocop/rspec/expect_offense.rb +6 -2
- data/lib/rubocop/rspec/shared_contexts.rb +19 -1
- data/lib/rubocop/rspec/support.rb +2 -2
- data/lib/rubocop/runner.rb +21 -14
- data/lib/rubocop/server/cache.rb +35 -2
- data/lib/rubocop/server/cli.rb +2 -2
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +16 -1
- data/lib/rubocop/version.rb +41 -7
- data/lib/rubocop.rb +27 -1
- data/lib/ruby_lsp/rubocop/addon.rb +75 -0
- data/lib/ruby_lsp/rubocop/runtime_adapter.rb +47 -0
- metadata +73 -20
- data/lib/rubocop/cop/utils/regexp_ranges.rb +0 -113
- data/lib/rubocop/rspec/host_environment_simulation_helper.rb +0 -28
@@ -38,7 +38,7 @@ module RuboCop
|
|
38
38
|
# * `Layout/MultilineHashKeyLineBreaks`
|
39
39
|
# * `Layout/MultilineMethodArgumentLineBreaks`
|
40
40
|
# * `Layout/MultilineMethodParameterLineBreaks`
|
41
|
-
# * `Layout
|
41
|
+
# * `Layout/ParameterAlignment`
|
42
42
|
# * `Style/BlockDelimiters`
|
43
43
|
#
|
44
44
|
# Together, these cops will pretty print hashes, arrays,
|
@@ -60,7 +60,7 @@ module RuboCop
|
|
60
60
|
# bar: "0000000000",
|
61
61
|
# baz: "0000000000",
|
62
62
|
# }
|
63
|
-
class LineLength < Base
|
63
|
+
class LineLength < Base # rubocop:disable Metrics/ClassLength
|
64
64
|
include CheckLineBreakable
|
65
65
|
include AllowedPattern
|
66
66
|
include RangeHelp
|
@@ -74,15 +74,23 @@ module RuboCop
|
|
74
74
|
def on_block(node)
|
75
75
|
check_for_breakable_block(node)
|
76
76
|
end
|
77
|
-
|
78
77
|
alias on_numblock on_block
|
79
78
|
|
79
|
+
def on_str(node)
|
80
|
+
check_for_breakable_str(node)
|
81
|
+
end
|
82
|
+
|
83
|
+
def on_dstr(node)
|
84
|
+
check_for_breakable_dstr(node)
|
85
|
+
end
|
86
|
+
|
80
87
|
def on_potential_breakable_node(node)
|
81
88
|
check_for_breakable_node(node)
|
82
89
|
end
|
83
90
|
alias on_array on_potential_breakable_node
|
84
91
|
alias on_hash on_potential_breakable_node
|
85
92
|
alias on_send on_potential_breakable_node
|
93
|
+
alias on_csend on_potential_breakable_node
|
86
94
|
alias on_def on_potential_breakable_node
|
87
95
|
|
88
96
|
def on_new_investigation
|
@@ -132,6 +140,42 @@ module RuboCop
|
|
132
140
|
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
133
141
|
end
|
134
142
|
|
143
|
+
def check_for_breakable_str(node)
|
144
|
+
line_index = node.loc.line - 1
|
145
|
+
return if breakable_range_by_line_index[line_index]
|
146
|
+
|
147
|
+
return unless breakable_string?(node)
|
148
|
+
return unless (delimiter = string_delimiter(node))
|
149
|
+
return unless (pos = breakable_string_position(node))
|
150
|
+
|
151
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
152
|
+
breakable_string_delimiters[line_index] = delimiter
|
153
|
+
end
|
154
|
+
|
155
|
+
def check_for_breakable_dstr(node) # rubocop:disable Metrics/AbcSize
|
156
|
+
line_index = node.loc.line - 1
|
157
|
+
return if breakable_range_by_line_index[line_index]
|
158
|
+
|
159
|
+
return unless breakable_dstr?(node)
|
160
|
+
return unless (delimiter = string_delimiter(node))
|
161
|
+
|
162
|
+
node.each_child_node(:begin).detect do |begin_node|
|
163
|
+
next unless (pos = breakable_dstr_begin_position(begin_node))
|
164
|
+
|
165
|
+
breakable_range_by_line_index[line_index] = range_between(pos, pos + 1)
|
166
|
+
breakable_string_delimiters[line_index] = delimiter
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
def breakable_string?(node)
|
171
|
+
allow_string_split? &&
|
172
|
+
node.single_line? &&
|
173
|
+
!node.heredoc? &&
|
174
|
+
# TODO: strings inside hashes, kwargs and arrays are currently ignored,
|
175
|
+
# but could be considered in the future
|
176
|
+
!node.parent&.type?(:pair, :kwoptarg, :array)
|
177
|
+
end
|
178
|
+
|
135
179
|
def breakable_block_range(block_node)
|
136
180
|
if block_node.arguments? && !block_node.lambda?
|
137
181
|
block_node.arguments.loc.end
|
@@ -153,10 +197,47 @@ module RuboCop
|
|
153
197
|
next_range
|
154
198
|
end
|
155
199
|
|
200
|
+
def breakable_string_position(node)
|
201
|
+
source_range = node.source_range
|
202
|
+
return if source_range.last_column < max
|
203
|
+
return unless (pos = breakable_string_range(node))
|
204
|
+
|
205
|
+
pos.end_pos unless pos.end_pos == source_range.begin_pos
|
206
|
+
end
|
207
|
+
|
208
|
+
# Locate where to break a string that is too long, ensuring that escape characters
|
209
|
+
# are not bisected.
|
210
|
+
# If the string contains spaces, use them to determine a place for a clean break;
|
211
|
+
# otherwise, the string will be broken at the line length limit.
|
212
|
+
def breakable_string_range(node)
|
213
|
+
source_range = node.source_range
|
214
|
+
relevant_substr = largest_possible_string(node)
|
215
|
+
|
216
|
+
if (space_pos = relevant_substr.rindex(/\s/))
|
217
|
+
source_range.resize(space_pos + 1)
|
218
|
+
elsif (escape_pos = relevant_substr.rindex(/\\(u[\da-f]{0,4}|x[\da-f]{0,2})?\z/))
|
219
|
+
source_range.resize(escape_pos)
|
220
|
+
else
|
221
|
+
adjustment = max - source_range.last_column - 3
|
222
|
+
return if adjustment.abs > source_range.size
|
223
|
+
|
224
|
+
source_range.adjust(end_pos: adjustment)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
def breakable_dstr_begin_position(node)
|
229
|
+
source_range = node.source_range
|
230
|
+
source_range.begin_pos if source_range.column < max && source_range.last_column >= max
|
231
|
+
end
|
232
|
+
|
156
233
|
def breakable_range_by_line_index
|
157
234
|
@breakable_range_by_line_index ||= {}
|
158
235
|
end
|
159
236
|
|
237
|
+
def breakable_string_delimiters
|
238
|
+
@breakable_string_delimiters ||= {}
|
239
|
+
end
|
240
|
+
|
160
241
|
def heredocs
|
161
242
|
@heredocs ||= extract_heredocs(processed_source.ast)
|
162
243
|
end
|
@@ -197,7 +278,14 @@ module RuboCop
|
|
197
278
|
|
198
279
|
add_offense(loc, message: message) do |corrector|
|
199
280
|
self.max = line_length(line)
|
200
|
-
|
281
|
+
|
282
|
+
insertion = if (delimiter = breakable_string_delimiters[line_index])
|
283
|
+
[delimiter, " \\\n", delimiter].join
|
284
|
+
else
|
285
|
+
"\n"
|
286
|
+
end
|
287
|
+
|
288
|
+
corrector.insert_before(breakable_range, insertion) unless breakable_range.nil?
|
201
289
|
end
|
202
290
|
end
|
203
291
|
|
@@ -224,6 +312,10 @@ module RuboCop
|
|
224
312
|
cop_config['AllowHeredoc']
|
225
313
|
end
|
226
314
|
|
315
|
+
def allow_string_split?
|
316
|
+
cop_config['SplitStrings']
|
317
|
+
end
|
318
|
+
|
227
319
|
def extract_heredocs(ast)
|
228
320
|
return [] unless ast
|
229
321
|
|
@@ -270,6 +362,29 @@ module RuboCop
|
|
270
362
|
|
271
363
|
register_offense(excess_range(uri_range, line, line_index), line, line_index)
|
272
364
|
end
|
365
|
+
|
366
|
+
def breakable_dstr?(node)
|
367
|
+
# If the `dstr` only contains one child, it cannot be broken
|
368
|
+
breakable_string?(node) && !node.child_nodes.one?
|
369
|
+
end
|
370
|
+
|
371
|
+
def string_delimiter(node)
|
372
|
+
delimiter = node.loc.begin
|
373
|
+
delimiter ||= node.parent.loc.begin if node.parent&.dstr_type?
|
374
|
+
delimiter = delimiter&.source
|
375
|
+
|
376
|
+
delimiter if %w[' "].include?(delimiter)
|
377
|
+
end
|
378
|
+
|
379
|
+
# Find the largest possible substring of a string node to retain before a break
|
380
|
+
def largest_possible_string(node)
|
381
|
+
# The maximum allowed length of a string value is:
|
382
|
+
# `Max` - end delimiter (quote) - continuation characters (space and slash)
|
383
|
+
max_length = max - 3
|
384
|
+
# If the string doesn't start at the beginning of the line, the max length is offset
|
385
|
+
max_length -= column_offset_between(node.loc, node.parent.loc) if node.parent
|
386
|
+
node.source[0...(max_length)]
|
387
|
+
end
|
273
388
|
end
|
274
389
|
end
|
275
390
|
end
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
def on_hash(node)
|
53
53
|
# This cop only deals with hashes wrapped by a set of curly
|
54
54
|
# braces like {foo: 1}. That is, not a kwargs hashes.
|
55
|
-
#
|
55
|
+
# Layout/MultilineMethodArgumentLineBreaks handles those.
|
56
56
|
return unless starts_with_curly_brace?(node)
|
57
57
|
return unless node.loc.begin
|
58
58
|
|
@@ -33,6 +33,18 @@ module RuboCop
|
|
33
33
|
#
|
34
34
|
# @example AllowMultilineFinalElement: false (default)
|
35
35
|
#
|
36
|
+
# # bad
|
37
|
+
# foo(a, b,
|
38
|
+
# c
|
39
|
+
# )
|
40
|
+
#
|
41
|
+
# # bad
|
42
|
+
# foo(
|
43
|
+
# a, b, {
|
44
|
+
# foo: "bar",
|
45
|
+
# }
|
46
|
+
# )
|
47
|
+
#
|
36
48
|
# # good
|
37
49
|
# foo(
|
38
50
|
# a,
|
@@ -44,6 +56,18 @@ module RuboCop
|
|
44
56
|
#
|
45
57
|
# @example AllowMultilineFinalElement: true
|
46
58
|
#
|
59
|
+
# # bad
|
60
|
+
# foo(a, b,
|
61
|
+
# c
|
62
|
+
# )
|
63
|
+
#
|
64
|
+
# # good
|
65
|
+
# foo(
|
66
|
+
# a, b, {
|
67
|
+
# foo: "bar",
|
68
|
+
# }
|
69
|
+
# )
|
70
|
+
#
|
47
71
|
# # good
|
48
72
|
# foo(
|
49
73
|
# a,
|
@@ -75,6 +99,7 @@ module RuboCop
|
|
75
99
|
|
76
100
|
check_line_breaks(node, args, ignore_last: ignore_last_element?)
|
77
101
|
end
|
102
|
+
alias on_csend on_send
|
78
103
|
|
79
104
|
private
|
80
105
|
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# argument of the call, then the closing brace should be on the same
|
13
13
|
# line as the last argument of the call.
|
14
14
|
#
|
15
|
-
# If
|
15
|
+
# If a method call's opening brace is on the line above the first
|
16
16
|
# argument of the call, then the closing brace should be on the line
|
17
17
|
# below the last argument of the call.
|
18
18
|
#
|
@@ -109,6 +109,7 @@ module RuboCop
|
|
109
109
|
def on_send(node)
|
110
110
|
check_brace_layout(node)
|
111
111
|
end
|
112
|
+
alias on_csend on_send
|
112
113
|
|
113
114
|
private
|
114
115
|
|
@@ -100,7 +100,7 @@ module RuboCop
|
|
100
100
|
|
101
101
|
def extra_indentation(given_style, parent)
|
102
102
|
if given_style == :indented_relative_to_receiver
|
103
|
-
if parent
|
103
|
+
if parent&.type?(:splat, :kwsplat)
|
104
104
|
configured_indentation_width - parent.loc.operator.length
|
105
105
|
else
|
106
106
|
configured_indentation_width
|
@@ -216,7 +216,7 @@ module RuboCop
|
|
216
216
|
|
217
217
|
def get_dot_right_above(node)
|
218
218
|
node.each_ancestor.find do |a|
|
219
|
-
dot = a.loc.
|
219
|
+
dot = a.loc.dot if a.loc?(:dot)
|
220
220
|
next unless dot
|
221
221
|
|
222
222
|
dot.line == node.loc.dot.line - 1 && dot.column == node.loc.dot.column
|
@@ -224,7 +224,7 @@ module RuboCop
|
|
224
224
|
end
|
225
225
|
|
226
226
|
def find_multiline_block_chain_node(node)
|
227
|
-
return unless (block_node = node.each_descendant(:
|
227
|
+
return unless (block_node = node.each_descendant(:any_block).first)
|
228
228
|
return unless block_node.multiline? && block_node.parent.call_type?
|
229
229
|
|
230
230
|
if node.receiver.call_type?
|
@@ -239,7 +239,7 @@ module RuboCop
|
|
239
239
|
node = node.receiver while node.receiver
|
240
240
|
# ascend to first call which has a dot
|
241
241
|
node = node.parent
|
242
|
-
node = node.parent until node.loc
|
242
|
+
node = node.parent until node.loc?(:dot)
|
243
243
|
|
244
244
|
node
|
245
245
|
end
|
@@ -12,7 +12,7 @@ module RuboCop
|
|
12
12
|
# first parameter of the definition, then the closing brace should be
|
13
13
|
# on the same line as the last parameter of the definition.
|
14
14
|
#
|
15
|
-
# If
|
15
|
+
# If a method definition's opening brace is on the line above the first
|
16
16
|
# parameter of the definition, then the closing brace should be on the
|
17
17
|
# line below the last parameter of the definition.
|
18
18
|
#
|
@@ -76,9 +76,8 @@ module RuboCop
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def check_and_or(node)
|
79
|
-
lhs, rhs
|
80
|
-
range
|
81
|
-
check(range, node, lhs, rhs.source_range)
|
79
|
+
range = offending_range(node, node.lhs, node.rhs.source_range, style)
|
80
|
+
check(range, node, node.lhs, node.rhs.source_range)
|
82
81
|
end
|
83
82
|
|
84
83
|
def offending_range(node, lhs, rhs, given_style)
|
@@ -3,11 +3,10 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
#
|
7
|
-
# definition are aligned.
|
6
|
+
# Check that the parameters on a multi-line method call or definition are aligned.
|
8
7
|
#
|
9
|
-
# To set the alignment of the first argument, use the
|
10
|
-
# FirstParameterIndentation.
|
8
|
+
# To set the alignment of the first argument, use the
|
9
|
+
# `Layout/FirstParameterIndentation` cop.
|
11
10
|
#
|
12
11
|
# @example EnforcedStyle: with_first_parameter (default)
|
13
12
|
# # good
|
@@ -44,6 +44,7 @@ module RuboCop
|
|
44
44
|
#
|
45
45
|
class RedundantLineBreak < Base
|
46
46
|
include CheckAssignment
|
47
|
+
include CheckSingleLineSuitability
|
47
48
|
extend AutoCorrector
|
48
49
|
|
49
50
|
MSG = 'Redundant line break detected.'
|
@@ -84,8 +85,8 @@ module RuboCop
|
|
84
85
|
end
|
85
86
|
|
86
87
|
def offense?(node)
|
87
|
-
return false
|
88
|
-
return require_backslash?(node) if node.
|
88
|
+
return false unless node.multiline? && suitable_as_single_line?(node)
|
89
|
+
return require_backslash?(node) if node.operator_keyword?
|
89
90
|
|
90
91
|
!index_access_call_chained?(node) && !configured_to_not_be_inspected?(node)
|
91
92
|
end
|
@@ -102,58 +103,26 @@ module RuboCop
|
|
102
103
|
|
103
104
|
def configured_to_not_be_inspected?(node)
|
104
105
|
return true if other_cop_takes_precedence?(node)
|
106
|
+
return false if cop_config['InspectBlocks']
|
105
107
|
|
106
|
-
|
107
|
-
any_descendant?(node, :block, &:multiline?))
|
108
|
+
node.any_block_type? || any_descendant?(node, :any_block, &:multiline?)
|
108
109
|
end
|
109
110
|
|
110
111
|
def other_cop_takes_precedence?(node)
|
111
|
-
single_line_block_chain_enabled? && any_descendant?(node, :
|
112
|
+
single_line_block_chain_enabled? && any_descendant?(node, :any_block) do |block_node|
|
112
113
|
block_node.parent.send_type? && block_node.parent.loc.dot && !block_node.multiline?
|
113
114
|
end
|
114
115
|
end
|
115
116
|
|
116
117
|
def single_line_block_chain_enabled?
|
117
|
-
@config.
|
118
|
-
end
|
119
|
-
|
120
|
-
def suitable_as_single_line?(node)
|
121
|
-
!comment_within?(node) &&
|
122
|
-
node.each_descendant(:if, :case, :kwbegin, :def, :defs).none? &&
|
123
|
-
node.each_descendant(:dstr, :str).none? { |n| n.heredoc? || n.value.include?("\n") } &&
|
124
|
-
node.each_descendant(:begin, :sym).none? { |b| !b.single_line? }
|
118
|
+
@config.cop_enabled?('Layout/SingleLineBlockChain')
|
125
119
|
end
|
126
120
|
|
127
121
|
def convertible_block?(node)
|
128
|
-
parent = node.parent
|
129
|
-
parent&.block_type? && node == parent.send_node &&
|
130
|
-
(node.parenthesized? || !node.arguments?)
|
131
|
-
end
|
122
|
+
return false unless (parent = node.parent)
|
132
123
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
comment_line_numbers.any? do |comment_line_number|
|
137
|
-
comment_line_number >= node.first_line && comment_line_number <= node.last_line
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def too_long?(node)
|
142
|
-
lines = processed_source.lines[(node.first_line - 1)...node.last_line]
|
143
|
-
to_single_line(lines.join("\n")).length > max_line_length
|
144
|
-
end
|
145
|
-
|
146
|
-
def to_single_line(source)
|
147
|
-
source
|
148
|
-
.gsub(/" *\\\n\s*'/, %q(" + ')) # Double quote, backslash, and then single quote
|
149
|
-
.gsub(/' *\\\n\s*"/, %q(' + ")) # Single quote, backslash, and then double quote
|
150
|
-
.gsub(/(["']) *\\\n\s*\1/, '') # Double or single quote, backslash, then same quote
|
151
|
-
.gsub(/\n\s*(?=(&)?\.\w)/, '') # Extra space within method chaining which includes `&.`
|
152
|
-
.gsub(/\s*\\?\n\s*/, ' ') # Any other line break, with or without backslash
|
153
|
-
end
|
154
|
-
|
155
|
-
def max_line_length
|
156
|
-
config.for_cop('Layout/LineLength')['Max']
|
124
|
+
parent.any_block_type? && node == parent.send_node &&
|
125
|
+
(node.parenthesized? || !node.arguments?)
|
157
126
|
end
|
158
127
|
end
|
159
128
|
end
|
@@ -29,7 +29,7 @@ module RuboCop
|
|
29
29
|
MSG = '`%<kw_loc>s` at %<kw_loc_line>d, %<kw_loc_column>d is not ' \
|
30
30
|
'aligned with `%<beginning>s` at ' \
|
31
31
|
'%<begin_loc_line>d, %<begin_loc_column>d.'
|
32
|
-
ANCESTOR_TYPES = %i[kwbegin def defs class module
|
32
|
+
ANCESTOR_TYPES = %i[kwbegin def defs class module any_block].freeze
|
33
33
|
ANCESTOR_TYPES_WITH_ACCESS_MODIFIERS = %i[def defs].freeze
|
34
34
|
ALTERNATIVE_ACCESS_MODIFIERS = %i[public_class_method private_class_method].freeze
|
35
35
|
|
@@ -92,6 +92,7 @@ module RuboCop
|
|
92
92
|
)
|
93
93
|
end
|
94
94
|
|
95
|
+
# rubocop:disable Metrics/AbcSize
|
95
96
|
def alignment_source(node, starting_loc)
|
96
97
|
ending_loc =
|
97
98
|
case node.type
|
@@ -101,8 +102,7 @@ module RuboCop
|
|
101
102
|
:lvasgn, :ivasgn, :cvasgn, :gvasgn, :casgn
|
102
103
|
node.loc.name
|
103
104
|
when :masgn
|
104
|
-
|
105
|
-
mlhs_node.source_range
|
105
|
+
node.lhs.source_range
|
106
106
|
else
|
107
107
|
# It is a wrapper with receiver of object attribute or access modifier.
|
108
108
|
node.receiver&.source_range || node.child_nodes.first.loc.name
|
@@ -110,6 +110,7 @@ module RuboCop
|
|
110
110
|
|
111
111
|
range_between(starting_loc.begin_pos, ending_loc.end_pos).source
|
112
112
|
end
|
113
|
+
# rubocop:enable Metrics/AbcSize
|
113
114
|
|
114
115
|
# We will use ancestor or wrapper with access modifier.
|
115
116
|
|
@@ -39,7 +39,7 @@ module RuboCop
|
|
39
39
|
|
40
40
|
def offending_range(node)
|
41
41
|
receiver = node.receiver
|
42
|
-
return unless receiver&.
|
42
|
+
return unless receiver&.any_block_type?
|
43
43
|
|
44
44
|
receiver_location = receiver.loc
|
45
45
|
closing_block_delimiter_line_num = receiver_location.end.line
|
@@ -3,9 +3,9 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
# Checks for colon (
|
6
|
+
# Checks for colon (`:`) not followed by some kind of space.
|
7
7
|
# N.B. this cop does not handle spaces after a ternary operator, which are
|
8
|
-
# instead handled by Layout/SpaceAroundOperators
|
8
|
+
# instead handled by `Layout/SpaceAroundOperators`.
|
9
9
|
#
|
10
10
|
# @example
|
11
11
|
# # bad
|
@@ -36,6 +36,7 @@ module RuboCop
|
|
36
36
|
ACCEPT_LEFT_PAREN = %w[break defined? next not rescue return super yield].freeze
|
37
37
|
ACCEPT_LEFT_SQUARE_BRACKET = %w[super yield].freeze
|
38
38
|
ACCEPT_NAMESPACE_OPERATOR = 'super'
|
39
|
+
RESTRICT_ON_SEND = %i[!].freeze
|
39
40
|
|
40
41
|
def on_and(node)
|
41
42
|
check(node, [:operator].freeze) if node.keyword?
|
@@ -256,7 +257,7 @@ module RuboCop
|
|
256
257
|
# regular dotted method calls bind more tightly than operators
|
257
258
|
# so we need to climb up the AST past them
|
258
259
|
node.each_ancestor do |ancestor|
|
259
|
-
return true if ancestor.
|
260
|
+
return true if ancestor.operator_keyword? || ancestor.range_type?
|
260
261
|
return false unless ancestor.send_type?
|
261
262
|
return true if ancestor.operator_method?
|
262
263
|
end
|
@@ -99,51 +99,50 @@ module RuboCop
|
|
99
99
|
def on_resbody(node)
|
100
100
|
return unless node.loc.assoc
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
check_operator(:resbody, node.loc.assoc, variable)
|
102
|
+
check_operator(:resbody, node.loc.assoc, node.exception_variable)
|
105
103
|
end
|
106
104
|
|
107
105
|
def on_send(node)
|
108
106
|
return if rational_literal?(node)
|
109
107
|
|
110
108
|
if node.setter_method?
|
111
|
-
|
109
|
+
on_setter_method(node)
|
112
110
|
elsif regular_operator?(node)
|
113
111
|
check_operator(:send, node.loc.selector, node.first_argument)
|
114
112
|
end
|
115
113
|
end
|
116
114
|
|
117
115
|
def on_assignment(node)
|
118
|
-
|
116
|
+
rhs = node.rhs
|
119
117
|
|
120
118
|
return unless rhs
|
121
119
|
|
122
|
-
|
120
|
+
type = node.op_asgn_type? ? :special_asgn : :assignment
|
121
|
+
check_operator(type, node.loc.operator, rhs)
|
123
122
|
end
|
124
123
|
|
125
|
-
def
|
126
|
-
|
124
|
+
def on_class(node)
|
125
|
+
rhs = node.parent_class
|
127
126
|
|
128
|
-
return unless
|
127
|
+
return unless rhs
|
129
128
|
|
130
|
-
check_operator(:
|
129
|
+
check_operator(:class, node.loc.operator, rhs)
|
131
130
|
end
|
132
131
|
|
133
132
|
def on_binary(node)
|
134
|
-
|
133
|
+
rhs = node.rhs
|
135
134
|
|
136
135
|
return unless rhs
|
137
136
|
|
138
137
|
check_operator(:binary, node.loc.operator, rhs)
|
139
138
|
end
|
140
139
|
|
141
|
-
def
|
142
|
-
|
140
|
+
def on_setter_method(node)
|
141
|
+
rhs = node.first_argument
|
143
142
|
|
144
|
-
return unless
|
143
|
+
return unless rhs
|
145
144
|
|
146
|
-
check_operator(:special_asgn, node.loc.operator,
|
145
|
+
check_operator(:special_asgn, node.loc.operator, node.first_argument)
|
147
146
|
end
|
148
147
|
|
149
148
|
def on_match_pattern(node)
|
@@ -155,14 +154,14 @@ module RuboCop
|
|
155
154
|
alias on_or on_binary
|
156
155
|
alias on_and on_binary
|
157
156
|
alias on_lvasgn on_assignment
|
157
|
+
alias on_casgn on_assignment
|
158
158
|
alias on_masgn on_assignment
|
159
159
|
alias on_ivasgn on_assignment
|
160
160
|
alias on_cvasgn on_assignment
|
161
161
|
alias on_gvasgn on_assignment
|
162
|
-
alias on_class on_binary
|
163
162
|
alias on_or_asgn on_assignment
|
164
163
|
alias on_and_asgn on_assignment
|
165
|
-
alias on_op_asgn
|
164
|
+
alias on_op_asgn on_assignment
|
166
165
|
|
167
166
|
private
|
168
167
|
|
@@ -243,12 +242,12 @@ module RuboCop
|
|
243
242
|
return !aligned_with_operator?(operator) unless type == :assignment
|
244
243
|
|
245
244
|
token = Token.new(operator, nil, operator.source)
|
246
|
-
align_preceding =
|
245
|
+
align_preceding = aligned_with_preceding_equals_operator(token)
|
247
246
|
|
248
247
|
return false if align_preceding == :yes ||
|
249
|
-
|
248
|
+
aligned_with_subsequent_equals_operator(token) == :none
|
250
249
|
|
251
|
-
|
250
|
+
aligned_with_subsequent_equals_operator(token) != :yes
|
252
251
|
end
|
253
252
|
|
254
253
|
def excess_trailing_space?(right_operand, with_space)
|
@@ -33,12 +33,12 @@ module RuboCop
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def offense_range(node, begin_pos)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
return if dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
36
|
+
receiver_end_pos = node.receiver.source_range.end_pos
|
37
|
+
selector_begin_pos = node.loc.selector.begin_pos
|
38
|
+
return if receiver_end_pos >= selector_begin_pos
|
39
|
+
return if dot_before_brackets?(node, receiver_end_pos, selector_begin_pos)
|
41
40
|
|
41
|
+
if reference_variable_with_brackets?(node)
|
42
42
|
range_between(receiver_end_pos, selector_begin_pos)
|
43
43
|
elsif node.method?(:[]=)
|
44
44
|
offense_range_for_assignment(node, begin_pos)
|