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
@@ -13,6 +13,15 @@ module CopHelper
|
|
13
13
|
let(:parser_engine) { ENV.fetch('PARSER_ENGINE', :parser_whitequark).to_sym }
|
14
14
|
let(:rails_version) { false }
|
15
15
|
|
16
|
+
before(:all) do
|
17
|
+
next if ENV['RUBOCOP_CORE_DEVELOPMENT']
|
18
|
+
|
19
|
+
plugins = Gem.loaded_specs.filter_map do |feature_name, feature_specification|
|
20
|
+
feature_name if feature_specification.metadata['default_lint_roller_plugin']
|
21
|
+
end
|
22
|
+
RuboCop::Plugin.integrate_plugins(RuboCop::Config.new, plugins)
|
23
|
+
end
|
24
|
+
|
16
25
|
def inspect_source(source, file = nil)
|
17
26
|
RuboCop::Formatter::DisabledConfigFormatter.config_to_allow_offenses = {}
|
18
27
|
RuboCop::Formatter::DisabledConfigFormatter.detected_styles = {}
|
@@ -190,7 +190,10 @@ module RuboCop
|
|
190
190
|
def expect_no_offenses(source, file = nil)
|
191
191
|
offenses = inspect_source(source, file)
|
192
192
|
|
193
|
-
|
193
|
+
# Since source given `expect_no_offenses` does not have annotations, we do not need to parse
|
194
|
+
# for them, and can just build an `AnnotatedSource` object from the source lines.
|
195
|
+
# This also prevents treating source lines that begin with a caret as an annotation.
|
196
|
+
expected_annotations = AnnotatedSource.new(source.each_line.to_a, [])
|
194
197
|
actual_annotations = expected_annotations.with_offense_annotations(offenses)
|
195
198
|
expect(actual_annotations.to_s).to eq(source)
|
196
199
|
end
|
@@ -221,7 +224,8 @@ module RuboCop
|
|
221
224
|
|
222
225
|
# Parsed representation of code annotated with the `^^^ Message` style
|
223
226
|
class AnnotatedSource
|
224
|
-
|
227
|
+
# Ignore escaped carets, don't treat as annotations
|
228
|
+
ANNOTATION_PATTERN = /\A\s*((?<!\\)\^+|\^{}) ?/.freeze
|
225
229
|
ABBREV = "[...]\n"
|
226
230
|
|
227
231
|
# @param annotated_source [String] string passed to the matchers
|
@@ -80,6 +80,21 @@ RSpec.shared_context 'maintain registry' do
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
RSpec.shared_context 'maintain default configuration' do
|
84
|
+
around(:each) do |example|
|
85
|
+
# Make a copy of the current configuration that will not change when source hash changes
|
86
|
+
default_configuration = RuboCop::ConfigLoader.default_configuration
|
87
|
+
config = RuboCop::Config.create(
|
88
|
+
default_configuration.to_h.clone,
|
89
|
+
default_configuration.loaded_path
|
90
|
+
)
|
91
|
+
|
92
|
+
example.run
|
93
|
+
|
94
|
+
RuboCop::ConfigLoader.instance_variable_set(:@default_configuration, config)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
83
98
|
# This context assumes nothing and defines `cop`, among others.
|
84
99
|
RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
85
100
|
### Meant to be overridden at will
|
@@ -98,6 +113,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
98
113
|
|
99
114
|
let(:cop_options) { {} }
|
100
115
|
|
116
|
+
let(:gem_versions) { {} }
|
117
|
+
|
101
118
|
### Utilities
|
102
119
|
|
103
120
|
def source_range(range, buffer: source_buffer)
|
@@ -138,7 +155,8 @@ RSpec.shared_context 'config' do # rubocop:disable Metrics/BlockLength
|
|
138
155
|
|
139
156
|
allow(config).to receive(:gem_versions_in_target).and_return(
|
140
157
|
{
|
141
|
-
'railties' => rails_version_in_gemfile
|
158
|
+
'railties' => rails_version_in_gemfile,
|
159
|
+
**gem_versions.transform_values { |value| Gem::Version.new(value) }
|
142
160
|
}
|
143
161
|
)
|
144
162
|
|
@@ -4,18 +4,18 @@
|
|
4
4
|
|
5
5
|
require_relative 'cop_helper'
|
6
6
|
require_relative 'expect_offense'
|
7
|
-
require_relative 'host_environment_simulation_helper'
|
8
7
|
require_relative 'parallel_formatter'
|
9
8
|
require_relative 'shared_contexts'
|
10
9
|
|
11
10
|
RSpec.configure do |config|
|
12
11
|
config.include CopHelper
|
13
|
-
config.include
|
12
|
+
config.include RuboCop::RSpec::ExpectOffense
|
14
13
|
config.include_context 'config', :config
|
15
14
|
config.include_context 'isolated environment', :isolated_environment
|
16
15
|
config.include_context 'isolated bundler', :isolated_bundler
|
17
16
|
config.include_context 'lsp', :lsp
|
18
17
|
config.include_context 'maintain registry', :restore_registry
|
18
|
+
config.include_context 'maintain default configuration', :restore_configuration
|
19
19
|
config.include_context 'ruby 2.0', :ruby20
|
20
20
|
config.include_context 'ruby 2.1', :ruby21
|
21
21
|
config.include_context 'ruby 2.2', :ruby22
|
data/lib/rubocop/runner.rb
CHANGED
@@ -20,11 +20,7 @@ module RuboCop
|
|
20
20
|
message = 'Infinite loop detected'
|
21
21
|
message += " in #{path}" if path
|
22
22
|
message += " and caused by #{root_cause}" if root_cause
|
23
|
-
message
|
24
|
-
hint = 'Hint: Please update to the latest RuboCop version if not already in use, ' \
|
25
|
-
"and report a bug if the issue still occurs on this version.\n" \
|
26
|
-
'Please check the latest version at https://rubygems.org/gems/rubocop.'
|
27
|
-
super(Rainbow(message).red + Rainbow(hint).yellow)
|
23
|
+
super(message)
|
28
24
|
end
|
29
25
|
end
|
30
26
|
|
@@ -139,7 +135,7 @@ module RuboCop
|
|
139
135
|
offenses = process_file(file)
|
140
136
|
yield file
|
141
137
|
|
142
|
-
if offenses.any? { |o| considered_failure?(o) }
|
138
|
+
if offenses.any? { |o| considered_failure?(o) && offense_displayed?(o) }
|
143
139
|
break false if @options[:fail_fast]
|
144
140
|
|
145
141
|
next false
|
@@ -157,8 +153,11 @@ module RuboCop
|
|
157
153
|
file_started(file)
|
158
154
|
offenses = file_offenses(file)
|
159
155
|
rescue InfiniteCorrectionLoop => e
|
156
|
+
raise e if @options[:raise_cop_error]
|
157
|
+
|
158
|
+
errors << e
|
159
|
+
warn Rainbow(e.message).red
|
160
160
|
offenses = e.offenses.compact.sort.freeze
|
161
|
-
raise
|
162
161
|
ensure
|
163
162
|
file_finished(file, offenses || [])
|
164
163
|
end
|
@@ -363,8 +362,12 @@ module RuboCop
|
|
363
362
|
result = ruby_extractor.call(processed_source)
|
364
363
|
break result if result
|
365
364
|
rescue StandardError
|
366
|
-
|
367
|
-
|
365
|
+
location = if ruby_extractor.is_a?(Proc)
|
366
|
+
ruby_extractor.source_location
|
367
|
+
else
|
368
|
+
ruby_extractor.method(:call).source_location
|
369
|
+
end
|
370
|
+
raise Error, "Ruby extractor #{location[0]} failed to process #{processed_source.path}."
|
368
371
|
end
|
369
372
|
end
|
370
373
|
|
@@ -436,18 +439,22 @@ module RuboCop
|
|
436
439
|
!offense.corrected? && offense.severity >= minimum_severity_to_fail
|
437
440
|
end
|
438
441
|
|
439
|
-
def
|
442
|
+
def offense_displayed?(offense)
|
440
443
|
if @options[:display_only_fail_level_offenses]
|
441
|
-
|
444
|
+
considered_failure?(offense)
|
442
445
|
elsif @options[:display_only_safe_correctable]
|
443
|
-
|
446
|
+
supports_safe_autocorrect?(offense)
|
444
447
|
elsif @options[:display_only_correctable]
|
445
|
-
|
448
|
+
offense.correctable?
|
446
449
|
else
|
447
|
-
|
450
|
+
true
|
448
451
|
end
|
449
452
|
end
|
450
453
|
|
454
|
+
def offenses_to_report(offenses)
|
455
|
+
offenses.select { |o| offense_displayed?(o) }
|
456
|
+
end
|
457
|
+
|
451
458
|
def supports_safe_autocorrect?(offense)
|
452
459
|
cop_class = Cop::Registry.global.find_by_cop_name(offense.cop_name)
|
453
460
|
default_cfg = default_config(offense.cop_name)
|
data/lib/rubocop/server/cache.rb
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
require 'digest'
|
4
4
|
require 'pathname'
|
5
|
+
require 'yaml'
|
5
6
|
require_relative '../cache_config'
|
6
7
|
require_relative '../config_finder'
|
8
|
+
require_relative '../path_util'
|
7
9
|
|
8
10
|
#
|
9
11
|
# This code is based on https://github.com/fohte/rubocop-daemon.
|
@@ -50,9 +52,11 @@ module RuboCop
|
|
50
52
|
end.find(&:exist?)
|
51
53
|
version_data = lockfile_path&.read || RuboCop::Version::STRING
|
52
54
|
config_data = Pathname(ConfigFinder.find_config_path(Dir.pwd)).read
|
53
|
-
|
55
|
+
yaml = YAML.safe_load(config_data, permitted_classes: [Regexp, Symbol], aliases: true)
|
56
|
+
inherit_from_data = inherit_from_data(yaml)
|
57
|
+
require_data = require_data(yaml)
|
54
58
|
|
55
|
-
Digest::SHA1.hexdigest(version_data + config_data +
|
59
|
+
Digest::SHA1.hexdigest(version_data + config_data + inherit_from_data + require_data)
|
56
60
|
end
|
57
61
|
# rubocop:enable Metrics/AbcSize
|
58
62
|
|
@@ -164,6 +168,35 @@ module RuboCop
|
|
164
168
|
def write_version_file(version)
|
165
169
|
version_path.write(version)
|
166
170
|
end
|
171
|
+
|
172
|
+
def inherit_from_data(yaml)
|
173
|
+
return '' unless (inherit_from_paths = yaml['inherit_from'])
|
174
|
+
|
175
|
+
Array(inherit_from_paths).map do |path|
|
176
|
+
next if PathUtil.remote_file?(path)
|
177
|
+
|
178
|
+
path = Pathname(path)
|
179
|
+
|
180
|
+
path.exist? ? path.read : ''
|
181
|
+
end.join
|
182
|
+
end
|
183
|
+
|
184
|
+
def require_data(yaml)
|
185
|
+
return '' unless (require_paths = yaml['require'])
|
186
|
+
|
187
|
+
Array(require_paths).map do |path|
|
188
|
+
# NOTE: This targets only relative or absolute path specifications.
|
189
|
+
# For example, specifications like `require: rubocop-performance`,
|
190
|
+
# which can be loaded from `$LOAD_PATH`, are ignored.
|
191
|
+
next unless path.start_with?('.', '/')
|
192
|
+
|
193
|
+
# NOTE: `.so` files are not typically specified, so only `.rb` files are targeted.
|
194
|
+
path = "#{path}.rb" unless path.end_with?('.rb')
|
195
|
+
path = Pathname(path)
|
196
|
+
|
197
|
+
path.exist? ? path.read : ''
|
198
|
+
end.join
|
199
|
+
end
|
167
200
|
end
|
168
201
|
end
|
169
202
|
end
|
data/lib/rubocop/server/cli.rb
CHANGED
@@ -86,7 +86,7 @@ module RuboCop
|
|
86
86
|
end
|
87
87
|
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
|
88
88
|
|
89
|
-
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
89
|
+
# rubocop:disable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
90
90
|
def run_command(server_command, detach:)
|
91
91
|
case server_command
|
92
92
|
when '--server'
|
@@ -107,7 +107,7 @@ module RuboCop
|
|
107
107
|
Server::ClientCommand::Status.new.run
|
108
108
|
end
|
109
109
|
end
|
110
|
-
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
110
|
+
# rubocop:enable Metrics/CyclomaticComplexity, Metrics/MethodLength
|
111
111
|
|
112
112
|
def fetch_cache_root_path_from(arguments)
|
113
113
|
cache_root = arguments.detect { |argument| argument.start_with?('--cache-root') }
|
@@ -127,6 +127,7 @@ module RuboCop
|
|
127
127
|
if mode == :only_recognized_file_types || force_exclusion?
|
128
128
|
files.select! { |file| included_file?(file) }
|
129
129
|
end
|
130
|
+
files.reject! { |file| FileTest.directory?(file) }
|
130
131
|
|
131
132
|
force_exclusion? ? without_excluded(files) : files
|
132
133
|
end
|
data/lib/rubocop/target_ruby.rb
CHANGED
@@ -34,6 +34,20 @@ module RuboCop
|
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
+
# The target ruby version may be configured by setting the
|
38
|
+
# `RUBOCOP_TARGET_RUBY_VERSION` environment variable.
|
39
|
+
class RuboCopEnvVar < Source
|
40
|
+
def name
|
41
|
+
'`RUBOCOP_TARGET_RUBY_VERSION` environment variable'
|
42
|
+
end
|
43
|
+
|
44
|
+
private
|
45
|
+
|
46
|
+
def find_version
|
47
|
+
ENV.fetch('RUBOCOP_TARGET_RUBY_VERSION', nil)&.to_f
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
37
51
|
# The target ruby version may be configured in RuboCop's config.
|
38
52
|
# @api private
|
39
53
|
class RuboCopConfig < Source
|
@@ -246,6 +260,7 @@ module RuboCop
|
|
246
260
|
end
|
247
261
|
|
248
262
|
SOURCES = [
|
263
|
+
RuboCopEnvVar,
|
249
264
|
RuboCopConfig,
|
250
265
|
GemspecFile,
|
251
266
|
RubyVersionFile,
|
@@ -273,7 +288,7 @@ module RuboCop
|
|
273
288
|
|
274
289
|
def rubocop_version_with_support
|
275
290
|
if supported?
|
276
|
-
RuboCop::Version
|
291
|
+
RuboCop::Version::STRING
|
277
292
|
else
|
278
293
|
OBSOLETE_RUBIES[version]
|
279
294
|
end
|
data/lib/rubocop/version.rb
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
# This module holds the RuboCop version information.
|
5
5
|
module Version
|
6
|
-
STRING = '1.
|
6
|
+
STRING = '1.73.0'
|
7
7
|
|
8
8
|
MSG = '%<version>s (using %<parser_version>s, ' \
|
9
9
|
'rubocop-ast %<rubocop_ast_version>s, ' \
|
@@ -18,12 +18,13 @@ module RuboCop
|
|
18
18
|
'rubocop-md' => 'markdown', 'rubocop-factory_bot' => 'factory_bot'
|
19
19
|
}.freeze
|
20
20
|
|
21
|
+
# NOTE: Marked as private but used by gems like standard.
|
21
22
|
# @api private
|
22
23
|
def self.version(debug: false, env: nil)
|
23
24
|
if debug
|
24
25
|
verbose_version = format(MSG, version: STRING, parser_version: parser_version,
|
25
26
|
rubocop_ast_version: RuboCop::AST::Version::STRING,
|
26
|
-
target_ruby_version:
|
27
|
+
target_ruby_version: target_ruby_version(env),
|
27
28
|
ruby_engine: RUBY_ENGINE, ruby_version: RUBY_VERSION,
|
28
29
|
server_mode: server_mode,
|
29
30
|
ruby_platform: RUBY_PLATFORM)
|
@@ -41,6 +42,11 @@ module RuboCop
|
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
45
|
+
# @api private
|
46
|
+
def self.verbose(env: nil)
|
47
|
+
version(debug: true, env: env)
|
48
|
+
end
|
49
|
+
|
44
50
|
# @api private
|
45
51
|
def self.parser_version
|
46
52
|
config_path = ConfigFinder.find_config_path(Dir.pwd)
|
@@ -57,14 +63,21 @@ module RuboCop
|
|
57
63
|
end
|
58
64
|
|
59
65
|
# @api private
|
66
|
+
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
60
67
|
def self.extension_versions(env)
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
68
|
+
plugins = config_for_pwd(env).loaded_plugins
|
69
|
+
plugin_versions = plugins.filter_map do |plugin|
|
70
|
+
next if Plugin::BUILTIN_INTERNAL_PLUGINS.key?(plugin.about.name)
|
71
|
+
next unless (plugin_name = plugin.about.name)
|
72
|
+
|
73
|
+
" - #{plugin_name} #{plugin.about.version}"
|
65
74
|
end
|
66
75
|
|
67
|
-
|
76
|
+
# TODO: It needs to be maintained for a while to ensure compatibility with extensions that
|
77
|
+
# don't support plugins. It should be removed in future once the old style becomes obsolete.
|
78
|
+
features = config_for_pwd(env).loaded_features.sort
|
79
|
+
features -= plugins.map { |plugin| plugin.about.name }
|
80
|
+
feature_versions = features.filter_map do |loaded_feature|
|
68
81
|
next unless (match = loaded_feature.match(/rubocop-(?<feature>.*)/))
|
69
82
|
|
70
83
|
# Get the expected name of the folder containing the extension code.
|
@@ -83,6 +96,27 @@ module RuboCop
|
|
83
96
|
|
84
97
|
" - #{loaded_feature} #{feature_version}"
|
85
98
|
end
|
99
|
+
|
100
|
+
plugin_versions + feature_versions
|
101
|
+
end
|
102
|
+
# rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
|
103
|
+
|
104
|
+
# @api private
|
105
|
+
def self.target_ruby_version(env)
|
106
|
+
if env
|
107
|
+
config_for_pwd(env).target_ruby_version
|
108
|
+
else
|
109
|
+
TargetRuby.new(Config.new).version
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
# @api private
|
114
|
+
def self.config_for_pwd(env)
|
115
|
+
Util.silence_warnings do
|
116
|
+
# Suppress any config issues when loading the config (ie. deprecations,
|
117
|
+
# pending cops, etc.).
|
118
|
+
env.config_store.unvalidated.for_pwd
|
119
|
+
end
|
86
120
|
end
|
87
121
|
|
88
122
|
# Returns feature version in one of two ways:
|
data/lib/rubocop.rb
CHANGED
@@ -11,6 +11,7 @@ require 'rainbow'
|
|
11
11
|
|
12
12
|
require 'regexp_parser'
|
13
13
|
require 'set'
|
14
|
+
require 'stringio'
|
14
15
|
require 'unicode/display_width'
|
15
16
|
|
16
17
|
# we have to require RuboCop's version, before rubocop-ast's
|
@@ -77,12 +78,14 @@ require_relative 'rubocop/cop/mixin/allowed_receivers'
|
|
77
78
|
require_relative 'rubocop/cop/mixin/auto_corrector' # rubocop:todo Naming/InclusiveLanguage
|
78
79
|
require_relative 'rubocop/cop/mixin/check_assignment'
|
79
80
|
require_relative 'rubocop/cop/mixin/check_line_breakable'
|
81
|
+
require_relative 'rubocop/cop/mixin/check_single_line_suitability'
|
80
82
|
require_relative 'rubocop/cop/mixin/configurable_max'
|
81
83
|
require_relative 'rubocop/cop/mixin/code_length' # relies on configurable_max
|
82
84
|
require_relative 'rubocop/cop/mixin/configurable_enforced_style'
|
83
85
|
require_relative 'rubocop/cop/mixin/configurable_formatting'
|
84
86
|
require_relative 'rubocop/cop/mixin/configurable_naming'
|
85
87
|
require_relative 'rubocop/cop/mixin/configurable_numbering'
|
88
|
+
require_relative 'rubocop/cop/mixin/dig_help'
|
86
89
|
require_relative 'rubocop/cop/mixin/documentation_comment'
|
87
90
|
require_relative 'rubocop/cop/mixin/duplication'
|
88
91
|
require_relative 'rubocop/cop/mixin/range_help'
|
@@ -90,12 +93,14 @@ require_relative 'rubocop/cop/mixin/annotation_comment' # relies on range
|
|
90
93
|
require_relative 'rubocop/cop/mixin/empty_lines_around_body' # relies on range
|
91
94
|
require_relative 'rubocop/cop/mixin/empty_parameter'
|
92
95
|
require_relative 'rubocop/cop/mixin/end_keyword_alignment'
|
96
|
+
require_relative 'rubocop/cop/mixin/endless_method_rewriter'
|
93
97
|
require_relative 'rubocop/cop/mixin/enforce_superclass'
|
94
98
|
require_relative 'rubocop/cop/mixin/first_element_line_break'
|
95
99
|
require_relative 'rubocop/cop/mixin/frozen_string_literal'
|
96
100
|
require_relative 'rubocop/cop/mixin/gem_declaration'
|
97
101
|
require_relative 'rubocop/cop/mixin/gemspec_help'
|
98
102
|
require_relative 'rubocop/cop/mixin/hash_alignment_styles'
|
103
|
+
require_relative 'rubocop/cop/mixin/hash_subset'
|
99
104
|
require_relative 'rubocop/cop/mixin/hash_transform_method'
|
100
105
|
require_relative 'rubocop/cop/mixin/integer_node'
|
101
106
|
require_relative 'rubocop/cop/mixin/interpolation'
|
@@ -143,7 +148,6 @@ require_relative 'rubocop/cop/mixin/comments_help' # relies on visibility_help
|
|
143
148
|
require_relative 'rubocop/cop/mixin/def_node' # relies on visibility_help
|
144
149
|
|
145
150
|
require_relative 'rubocop/cop/utils/format_string'
|
146
|
-
require_relative 'rubocop/cop/utils/regexp_ranges'
|
147
151
|
|
148
152
|
require_relative 'rubocop/cop/migration/department_name'
|
149
153
|
|
@@ -289,6 +293,7 @@ require_relative 'rubocop/cop/lint/ambiguous_operator'
|
|
289
293
|
require_relative 'rubocop/cop/lint/ambiguous_operator_precedence'
|
290
294
|
require_relative 'rubocop/cop/lint/ambiguous_range'
|
291
295
|
require_relative 'rubocop/cop/lint/ambiguous_regexp_literal'
|
296
|
+
require_relative 'rubocop/cop/lint/array_literal_in_regexp'
|
292
297
|
require_relative 'rubocop/cop/lint/assignment_in_condition'
|
293
298
|
require_relative 'rubocop/cop/lint/big_decimal_new'
|
294
299
|
require_relative 'rubocop/cop/lint/binary_operator_with_identical_operands'
|
@@ -296,7 +301,9 @@ require_relative 'rubocop/cop/lint/boolean_symbol'
|
|
296
301
|
require_relative 'rubocop/cop/lint/circular_argument_reference'
|
297
302
|
require_relative 'rubocop/cop/lint/constant_definition_in_block'
|
298
303
|
require_relative 'rubocop/cop/lint/constant_overwritten_in_rescue'
|
304
|
+
require_relative 'rubocop/cop/lint/constant_reassignment'
|
299
305
|
require_relative 'rubocop/cop/lint/constant_resolution'
|
306
|
+
require_relative 'rubocop/cop/lint/cop_directive_syntax'
|
300
307
|
require_relative 'rubocop/cop/lint/debugger'
|
301
308
|
require_relative 'rubocop/cop/lint/deprecated_class_methods'
|
302
309
|
require_relative 'rubocop/cop/lint/deprecated_constants'
|
@@ -325,12 +332,14 @@ require_relative 'rubocop/cop/lint/empty_in_pattern'
|
|
325
332
|
require_relative 'rubocop/cop/lint/empty_interpolation'
|
326
333
|
require_relative 'rubocop/cop/lint/empty_when'
|
327
334
|
require_relative 'rubocop/cop/lint/ensure_return'
|
335
|
+
require_relative 'rubocop/cop/lint/shared_mutable_default'
|
328
336
|
require_relative 'rubocop/cop/lint/erb_new_arguments'
|
329
337
|
require_relative 'rubocop/cop/lint/flip_flop'
|
330
338
|
require_relative 'rubocop/cop/lint/float_comparison'
|
331
339
|
require_relative 'rubocop/cop/lint/float_out_of_range'
|
332
340
|
require_relative 'rubocop/cop/lint/format_parameter_mismatch'
|
333
341
|
require_relative 'rubocop/cop/lint/hash_compare_by_identity'
|
342
|
+
require_relative 'rubocop/cop/lint/hash_new_with_keyword_arguments_as_default'
|
334
343
|
require_relative 'rubocop/cop/lint/heredoc_method_call_position'
|
335
344
|
require_relative 'rubocop/cop/lint/identity_comparison'
|
336
345
|
require_relative 'rubocop/cop/lint/implicit_string_concatenation'
|
@@ -358,6 +367,7 @@ require_relative 'rubocop/cop/lint/non_deterministic_require_order'
|
|
358
367
|
require_relative 'rubocop/cop/lint/non_local_exit_from_iterator'
|
359
368
|
require_relative 'rubocop/cop/lint/number_conversion'
|
360
369
|
require_relative 'rubocop/cop/lint/numbered_parameter_assignment'
|
370
|
+
require_relative 'rubocop/cop/lint/numeric_operation_with_constant_result'
|
361
371
|
require_relative 'rubocop/cop/lint/or_assignment_to_constant'
|
362
372
|
require_relative 'rubocop/cop/lint/ordered_magic_comments'
|
363
373
|
require_relative 'rubocop/cop/lint/out_of_range_regexp_ref'
|
@@ -374,6 +384,7 @@ require_relative 'rubocop/cop/lint/redundant_require_statement'
|
|
374
384
|
require_relative 'rubocop/cop/lint/redundant_safe_navigation'
|
375
385
|
require_relative 'rubocop/cop/lint/redundant_splat_expansion'
|
376
386
|
require_relative 'rubocop/cop/lint/redundant_string_coercion'
|
387
|
+
require_relative 'rubocop/cop/lint/redundant_type_conversion'
|
377
388
|
require_relative 'rubocop/cop/lint/redundant_with_index'
|
378
389
|
require_relative 'rubocop/cop/lint/redundant_with_object'
|
379
390
|
require_relative 'rubocop/cop/lint/refinement_import_methods'
|
@@ -395,6 +406,7 @@ require_relative 'rubocop/cop/lint/shadowed_exception'
|
|
395
406
|
require_relative 'rubocop/cop/lint/shadowing_outer_local_variable'
|
396
407
|
require_relative 'rubocop/cop/lint/struct_new_override'
|
397
408
|
require_relative 'rubocop/cop/lint/suppressed_exception'
|
409
|
+
require_relative 'rubocop/cop/lint/suppressed_exception_in_number_conversion'
|
398
410
|
require_relative 'rubocop/cop/lint/symbol_conversion'
|
399
411
|
require_relative 'rubocop/cop/lint/syntax'
|
400
412
|
require_relative 'rubocop/cop/lint/to_enum_arguments'
|
@@ -403,6 +415,7 @@ require_relative 'rubocop/cop/lint/top_level_return_with_argument'
|
|
403
415
|
require_relative 'rubocop/cop/lint/trailing_comma_in_attribute_declaration'
|
404
416
|
require_relative 'rubocop/cop/lint/triple_quotes'
|
405
417
|
require_relative 'rubocop/cop/lint/underscore_prefixed_variable_name'
|
418
|
+
require_relative 'rubocop/cop/lint/unescaped_bracket_in_regexp'
|
406
419
|
require_relative 'rubocop/cop/lint/unexpected_block_arity'
|
407
420
|
require_relative 'rubocop/cop/lint/unified_integer'
|
408
421
|
require_relative 'rubocop/cop/lint/unmodified_reduce_accumulator'
|
@@ -414,6 +427,8 @@ require_relative 'rubocop/cop/lint/uri_escape_unescape'
|
|
414
427
|
require_relative 'rubocop/cop/lint/uri_regexp'
|
415
428
|
require_relative 'rubocop/cop/lint/useless_access_modifier'
|
416
429
|
require_relative 'rubocop/cop/lint/useless_assignment'
|
430
|
+
require_relative 'rubocop/cop/lint/useless_constant_scoping'
|
431
|
+
require_relative 'rubocop/cop/lint/useless_defined'
|
417
432
|
require_relative 'rubocop/cop/lint/useless_else_without_rescue'
|
418
433
|
require_relative 'rubocop/cop/lint/useless_method_definition'
|
419
434
|
require_relative 'rubocop/cop/lint/useless_numeric_operation'
|
@@ -460,6 +475,7 @@ require_relative 'rubocop/cop/naming/variable_number'
|
|
460
475
|
require_relative 'rubocop/cop/style/access_modifier_declarations'
|
461
476
|
require_relative 'rubocop/cop/style/accessor_grouping'
|
462
477
|
require_relative 'rubocop/cop/style/alias'
|
478
|
+
require_relative 'rubocop/cop/style/ambiguous_endless_method_definition'
|
463
479
|
require_relative 'rubocop/cop/style/and_or'
|
464
480
|
require_relative 'rubocop/cop/style/arguments_forwarding'
|
465
481
|
require_relative 'rubocop/cop/style/array_coercion'
|
@@ -472,6 +488,7 @@ require_relative 'rubocop/cop/style/auto_resource_cleanup'
|
|
472
488
|
require_relative 'rubocop/cop/style/bare_percent_literals'
|
473
489
|
require_relative 'rubocop/cop/style/begin_block'
|
474
490
|
require_relative 'rubocop/cop/style/bisected_attr_accessor'
|
491
|
+
require_relative 'rubocop/cop/style/bitwise_predicate'
|
475
492
|
require_relative 'rubocop/cop/style/block_comments'
|
476
493
|
require_relative 'rubocop/cop/style/block_delimiters'
|
477
494
|
require_relative 'rubocop/cop/style/case_equality'
|
@@ -487,6 +504,7 @@ require_relative 'rubocop/cop/style/collection_compact'
|
|
487
504
|
require_relative 'rubocop/cop/style/collection_methods'
|
488
505
|
require_relative 'rubocop/cop/style/colon_method_call'
|
489
506
|
require_relative 'rubocop/cop/style/colon_method_definition'
|
507
|
+
require_relative 'rubocop/cop/style/combinable_defined'
|
490
508
|
require_relative 'rubocop/cop/style/combinable_loops'
|
491
509
|
require_relative 'rubocop/cop/style/command_literal'
|
492
510
|
require_relative 'rubocop/cop/style/comment_annotation'
|
@@ -499,6 +517,7 @@ require_relative 'rubocop/cop/style/copyright'
|
|
499
517
|
require_relative 'rubocop/cop/style/data_inheritance'
|
500
518
|
require_relative 'rubocop/cop/style/date_time'
|
501
519
|
require_relative 'rubocop/cop/style/def_with_parentheses'
|
520
|
+
require_relative 'rubocop/cop/style/dig_chain'
|
502
521
|
require_relative 'rubocop/cop/style/dir'
|
503
522
|
require_relative 'rubocop/cop/style/dir_empty'
|
504
523
|
require_relative 'rubocop/cop/style/disable_cops_within_source_code_directive'
|
@@ -528,7 +547,9 @@ require_relative 'rubocop/cop/style/explicit_block_argument'
|
|
528
547
|
require_relative 'rubocop/cop/style/exponential_notation'
|
529
548
|
require_relative 'rubocop/cop/style/fetch_env_var'
|
530
549
|
require_relative 'rubocop/cop/style/file_empty'
|
550
|
+
require_relative 'rubocop/cop/style/file_null'
|
531
551
|
require_relative 'rubocop/cop/style/file_read'
|
552
|
+
require_relative 'rubocop/cop/style/file_touch'
|
532
553
|
require_relative 'rubocop/cop/style/file_write'
|
533
554
|
require_relative 'rubocop/cop/style/float_division'
|
534
555
|
require_relative 'rubocop/cop/style/for'
|
@@ -543,6 +564,7 @@ require_relative 'rubocop/cop/style/hash_conversion'
|
|
543
564
|
require_relative 'rubocop/cop/style/hash_each_methods'
|
544
565
|
require_relative 'rubocop/cop/style/hash_except'
|
545
566
|
require_relative 'rubocop/cop/style/hash_like_case'
|
567
|
+
require_relative 'rubocop/cop/style/hash_slice'
|
546
568
|
require_relative 'rubocop/cop/style/hash_syntax'
|
547
569
|
require_relative 'rubocop/cop/style/hash_transform_keys'
|
548
570
|
require_relative 'rubocop/cop/style/hash_transform_values'
|
@@ -559,6 +581,8 @@ require_relative 'rubocop/cop/style/inverse_methods'
|
|
559
581
|
require_relative 'rubocop/cop/style/inline_comment'
|
560
582
|
require_relative 'rubocop/cop/style/invertible_unless_condition'
|
561
583
|
require_relative 'rubocop/cop/style/ip_addresses'
|
584
|
+
require_relative 'rubocop/cop/style/it_assignment'
|
585
|
+
require_relative 'rubocop/cop/style/keyword_arguments_merging'
|
562
586
|
require_relative 'rubocop/cop/style/keyword_parameters_order'
|
563
587
|
require_relative 'rubocop/cop/style/lambda'
|
564
588
|
require_relative 'rubocop/cop/style/lambda_call'
|
@@ -583,6 +607,7 @@ require_relative 'rubocop/cop/style/redundant_each'
|
|
583
607
|
require_relative 'rubocop/cop/style/redundant_fetch_block'
|
584
608
|
require_relative 'rubocop/cop/style/redundant_file_extension_in_require'
|
585
609
|
require_relative 'rubocop/cop/style/redundant_filter_chain'
|
610
|
+
require_relative 'rubocop/cop/style/redundant_format'
|
586
611
|
require_relative 'rubocop/cop/style/redundant_heredoc_delimiter_quotes'
|
587
612
|
require_relative 'rubocop/cop/style/redundant_initialize'
|
588
613
|
require_relative 'rubocop/cop/style/redundant_interpolation_unfreeze'
|
@@ -592,6 +617,7 @@ require_relative 'rubocop/cop/style/redundant_regexp_constructor'
|
|
592
617
|
require_relative 'rubocop/cop/style/redundant_self_assignment'
|
593
618
|
require_relative 'rubocop/cop/style/redundant_self_assignment_branch'
|
594
619
|
require_relative 'rubocop/cop/style/require_order'
|
620
|
+
require_relative 'rubocop/cop/style/safe_navigation_chain_length'
|
595
621
|
require_relative 'rubocop/cop/style/single_line_do_end_block'
|
596
622
|
require_relative 'rubocop/cop/style/sole_nested_conditional'
|
597
623
|
require_relative 'rubocop/cop/style/static_class'
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../rubocop'
|
4
|
+
require_relative '../../rubocop/lsp/logger'
|
5
|
+
require_relative 'runtime_adapter'
|
6
|
+
|
7
|
+
module RubyLsp
|
8
|
+
module RuboCop
|
9
|
+
# A Ruby LSP add-on for RuboCop.
|
10
|
+
class Addon < RubyLsp::Addon
|
11
|
+
def initializer
|
12
|
+
@runtime_adapter = nil
|
13
|
+
end
|
14
|
+
|
15
|
+
def name
|
16
|
+
'RuboCop'
|
17
|
+
end
|
18
|
+
|
19
|
+
def activate(global_state, message_queue)
|
20
|
+
::RuboCop::LSP::Logger.log(
|
21
|
+
"Activating RuboCop LSP addon #{::RuboCop::Version::STRING}.", prefix: '[RuboCop]'
|
22
|
+
)
|
23
|
+
|
24
|
+
@runtime_adapter = RuntimeAdapter.new
|
25
|
+
global_state.register_formatter('rubocop', @runtime_adapter)
|
26
|
+
register_additional_file_watchers(global_state, message_queue)
|
27
|
+
|
28
|
+
::RuboCop::LSP::Logger.log(
|
29
|
+
"Initialized RuboCop LSP addon #{::RuboCop::Version::STRING}.", prefix: '[RuboCop]'
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
def deactivate
|
34
|
+
@runtime_adapter = nil
|
35
|
+
end
|
36
|
+
|
37
|
+
# rubocop:disable Layout/LineLength, Metrics/MethodLength
|
38
|
+
def register_additional_file_watchers(global_state, message_queue)
|
39
|
+
return unless global_state.supports_watching_files
|
40
|
+
|
41
|
+
message_queue << Request.new(
|
42
|
+
id: 'rubocop-file-watcher',
|
43
|
+
method: 'client/registerCapability',
|
44
|
+
params: Interface::RegistrationParams.new(
|
45
|
+
registrations: [
|
46
|
+
Interface::Registration.new(
|
47
|
+
id: 'workspace/didChangeWatchedFilesRuboCop',
|
48
|
+
method: 'workspace/didChangeWatchedFiles',
|
49
|
+
register_options: Interface::DidChangeWatchedFilesRegistrationOptions.new(
|
50
|
+
watchers: [
|
51
|
+
Interface::FileSystemWatcher.new(
|
52
|
+
glob_pattern: '**/.rubocop{,_todo}.yml',
|
53
|
+
kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE
|
54
|
+
)
|
55
|
+
]
|
56
|
+
)
|
57
|
+
)
|
58
|
+
]
|
59
|
+
)
|
60
|
+
)
|
61
|
+
end
|
62
|
+
# rubocop:enable Layout/LineLength, Metrics/MethodLength
|
63
|
+
|
64
|
+
def workspace_did_change_watched_files(changes)
|
65
|
+
return unless changes.any? { |change| change[:uri].end_with?('.rubocop.yml') }
|
66
|
+
|
67
|
+
@runtime_adapter = RuntimeAdapter.new
|
68
|
+
|
69
|
+
::RuboCop::LSP::Logger.log(<<~MESSAGE, prefix: '[RuboCop]')
|
70
|
+
Re-initialized RuboCop LSP addon #{::RuboCop::Version::STRING} due to .rubocop.yml file change.
|
71
|
+
MESSAGE
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|