rubocop 1.46.0 → 1.52.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/config/default.yml +83 -11
- data/lib/rubocop/cli/command/auto_generate_config.rb +7 -0
- data/lib/rubocop/cli/command/execute_runner.rb +7 -2
- data/lib/rubocop/cli.rb +6 -6
- data/lib/rubocop/comment_config.rb +2 -0
- data/lib/rubocop/config.rb +7 -3
- data/lib/rubocop/config_loader.rb +8 -8
- data/lib/rubocop/config_obsoletion.rb +2 -2
- data/lib/rubocop/cop/autocorrect_logic.rb +29 -13
- data/lib/rubocop/cop/base.rb +6 -2
- data/lib/rubocop/cop/bundler/gem_comment.rb +1 -1
- data/lib/rubocop/cop/cop.rb +2 -2
- data/lib/rubocop/cop/corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/each_to_for_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/for_to_each_corrector.rb +3 -3
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/ordered_gem_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +1 -1
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +2 -2
- data/lib/rubocop/cop/gemspec/dependency_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/deprecated_attribute_assignment.rb +1 -1
- data/lib/rubocop/cop/gemspec/development_dependencies.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/cop_description.rb +37 -13
- data/lib/rubocop/cop/internal_affairs/example_heredoc_delimiter.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/inherit_deprecated_cop_class.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/location_expression.rb +37 -0
- data/lib/rubocop/cop/internal_affairs/node_matcher_directive.rb +3 -3
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/processed_source_buffer_name.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_source_range.rb +66 -0
- data/lib/rubocop/cop/internal_affairs.rb +2 -0
- data/lib/rubocop/cop/layout/block_end_newline.rb +7 -21
- data/lib/rubocop/cop/layout/class_structure.rb +6 -3
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +1 -2
- data/lib/rubocop/cop/layout/empty_comment.rb +3 -3
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines.rb +1 -1
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +2 -0
- data/lib/rubocop/cop/layout/end_alignment.rb +5 -1
- data/lib/rubocop/cop/layout/extra_spacing.rb +6 -1
- data/lib/rubocop/cop/layout/first_argument_indentation.rb +7 -2
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +25 -34
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +7 -19
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +42 -52
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +38 -55
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +4 -4
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +2 -2
- data/lib/rubocop/cop/layout/initial_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/layout/line_continuation_leading_space.rb +1 -3
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +8 -27
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +7 -26
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +4 -21
- data/lib/rubocop/cop/layout/multiline_method_parameter_line_breaks.rb +6 -30
- data/lib/rubocop/cop/layout/redundant_line_break.rb +6 -7
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +2 -2
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +1 -1
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +3 -1
- data/lib/rubocop/cop/layout/space_inside_parens.rb +2 -2
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +13 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/deprecated_class_methods.rb +4 -4
- data/lib/rubocop/cop/lint/deprecated_open_ssl_constant.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_match_pattern.rb +122 -0
- data/lib/rubocop/cop/lint/duplicate_methods.rb +2 -2
- data/lib/rubocop/cop/lint/duplicate_regexp_character_class_element.rb +1 -3
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_block.rb +1 -1
- data/lib/rubocop/cop/lint/empty_conditional_body.rb +4 -2
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +3 -4
- data/lib/rubocop/cop/lint/identity_comparison.rb +0 -1
- data/lib/rubocop/cop/lint/incompatible_io_select_with_fiber_scheduler.rb +5 -3
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +9 -0
- data/lib/rubocop/cop/lint/lambda_without_literal_block.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +46 -4
- data/lib/rubocop/cop/lint/missing_super.rb +34 -2
- data/lib/rubocop/cop/lint/nested_method_definition.rb +2 -2
- data/lib/rubocop/cop/lint/numbered_parameter_assignment.rb +2 -2
- data/lib/rubocop/cop/lint/or_assignment_to_constant.rb +2 -0
- data/lib/rubocop/cop/lint/ordered_magic_comments.rb +0 -1
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +2 -2
- data/lib/rubocop/cop/lint/percent_string_array.rb +1 -1
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_cop_disable_directive.rb +4 -4
- data/lib/rubocop/cop/lint/redundant_cop_enable_directive.rb +5 -5
- data/lib/rubocop/cop/lint/redundant_require_statement.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_string_coercion.rb +35 -15
- data/lib/rubocop/cop/lint/redundant_with_index.rb +1 -1
- data/lib/rubocop/cop/lint/redundant_with_object.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +3 -3
- data/lib/rubocop/cop/lint/safe_navigation_consistency.rb +1 -1
- data/lib/rubocop/cop/lint/script_permission.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +1 -2
- data/lib/rubocop/cop/lint/shadowed_exception.rb +6 -12
- data/lib/rubocop/cop/lint/syntax.rb +4 -0
- data/lib/rubocop/cop/lint/to_enum_arguments.rb +7 -1
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +23 -9
- data/lib/rubocop/cop/lint/unreachable_loop.rb +3 -3
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +9 -1
- data/lib/rubocop/cop/lint/useless_assignment.rb +59 -1
- data/lib/rubocop/cop/lint/useless_method_definition.rb +10 -2
- data/lib/rubocop/cop/lint/useless_rescue.rb +4 -1
- data/lib/rubocop/cop/lint/useless_times.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +69 -9
- data/lib/rubocop/cop/metrics/block_nesting.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -0
- data/lib/rubocop/cop/metrics/collection_literal_length.rb +76 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +1 -2
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +3 -3
- data/lib/rubocop/cop/migration/department_name.rb +1 -1
- data/lib/rubocop/cop/mixin/allowed_receivers.rb +34 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/code_length.rb +1 -1
- data/lib/rubocop/cop/mixin/comments_help.rb +9 -5
- data/lib/rubocop/cop/mixin/documentation_comment.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_alignment_styles.rb +1 -1
- data/lib/rubocop/cop/mixin/hash_shorthand_syntax.rb +4 -2
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +3 -3
- data/lib/rubocop/cop/mixin/min_branches_count.rb +40 -0
- data/lib/rubocop/cop/mixin/ordered_gem_node.rb +1 -1
- data/lib/rubocop/cop/mixin/range_help.rb +1 -6
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +1 -1
- data/lib/rubocop/cop/mixin/statement_modifier.rb +3 -3
- data/lib/rubocop/cop/mixin/trailing_comma.rb +1 -1
- data/lib/rubocop/cop/naming/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +1 -1
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +1 -1
- data/lib/rubocop/cop/naming/inclusive_language.rb +23 -4
- data/lib/rubocop/cop/naming/memoized_instance_variable_name.rb +22 -7
- data/lib/rubocop/cop/naming/method_name.rb +3 -3
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/naming/rescued_exceptions_variable_name.rb +12 -4
- data/lib/rubocop/cop/naming/variable_name.rb +6 -1
- data/lib/rubocop/cop/registry.rb +3 -1
- data/lib/rubocop/cop/style/accessor_grouping.rb +32 -7
- data/lib/rubocop/cop/style/arguments_forwarding.rb +3 -3
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +11 -1
- data/lib/rubocop/cop/style/begin_block.rb +1 -2
- data/lib/rubocop/cop/style/bisected_attr_accessor.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +11 -2
- data/lib/rubocop/cop/style/case_like_if.rb +20 -3
- data/lib/rubocop/cop/style/class_and_module_children.rb +2 -2
- data/lib/rubocop/cop/style/class_equality_comparison.rb +51 -40
- data/lib/rubocop/cop/style/collection_compact.rb +20 -7
- data/lib/rubocop/cop/style/colon_method_call.rb +2 -2
- data/lib/rubocop/cop/style/combinable_loops.rb +26 -6
- data/lib/rubocop/cop/style/comment_annotation.rb +1 -1
- data/lib/rubocop/cop/style/commented_keyword.rb +2 -2
- data/lib/rubocop/cop/style/concat_array_literals.rb +10 -2
- data/lib/rubocop/cop/style/conditional_assignment.rb +8 -8
- data/lib/rubocop/cop/style/copyright.rb +6 -3
- data/lib/rubocop/cop/style/data_inheritance.rb +75 -0
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/dir_empty.rb +54 -0
- data/lib/rubocop/cop/style/disable_cops_within_source_code_directive.rb +2 -2
- data/lib/rubocop/cop/style/document_dynamic_eval_definition.rb +2 -2
- data/lib/rubocop/cop/style/documentation.rb +11 -5
- data/lib/rubocop/cop/style/double_negation.rb +2 -2
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/empty_block_parameter.rb +1 -1
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +1 -1
- data/lib/rubocop/cop/style/eval_with_location.rb +8 -8
- data/lib/rubocop/cop/style/exact_regexp_match.rb +68 -0
- data/lib/rubocop/cop/style/explicit_block_argument.rb +1 -1
- data/lib/rubocop/cop/style/file_empty.rb +71 -0
- data/lib/rubocop/cop/style/file_read.rb +3 -3
- data/lib/rubocop/cop/style/file_write.rb +1 -1
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +3 -1
- data/lib/rubocop/cop/style/hash_each_methods.rb +1 -22
- data/lib/rubocop/cop/style/hash_except.rb +23 -12
- data/lib/rubocop/cop/style/hash_like_case.rb +3 -9
- data/lib/rubocop/cop/style/hash_syntax.rb +5 -2
- data/lib/rubocop/cop/style/hash_transform_keys.rb +2 -2
- data/lib/rubocop/cop/style/hash_transform_values.rb +2 -2
- data/lib/rubocop/cop/style/if_inside_else.rb +6 -0
- data/lib/rubocop/cop/style/if_unless_modifier.rb +111 -15
- data/lib/rubocop/cop/style/if_with_boolean_literal_branches.rb +2 -0
- data/lib/rubocop/cop/style/inverse_methods.rb +5 -5
- data/lib/rubocop/cop/style/invertible_unless_condition.rb +9 -5
- data/lib/rubocop/cop/style/map_compact_with_conditional_block.rb +2 -2
- data/lib/rubocop/cop/style/map_to_hash.rb +4 -1
- data/lib/rubocop/cop/style/map_to_set.rb +4 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses/omit_parentheses.rb +4 -9
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +44 -37
- data/lib/rubocop/cop/style/min_max.rb +3 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +4 -4
- data/lib/rubocop/cop/style/multiline_method_signature.rb +7 -4
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +14 -0
- data/lib/rubocop/cop/style/negated_if_else_condition.rb +12 -7
- data/lib/rubocop/cop/style/nil_lambda.rb +2 -2
- data/lib/rubocop/cop/style/numeric_literals.rb +1 -1
- data/lib/rubocop/cop/style/parallel_assignment.rb +26 -18
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +2 -3
- data/lib/rubocop/cop/style/percent_q_literals.rb +1 -1
- data/lib/rubocop/cop/style/redundant_array_constructor.rb +77 -0
- data/lib/rubocop/cop/style/redundant_condition.rb +2 -2
- data/lib/rubocop/cop/style/redundant_double_splat_hash_braces.rb +2 -2
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +6 -4
- data/lib/rubocop/cop/style/redundant_filter_chain.rb +101 -0
- data/lib/rubocop/cop/style/redundant_interpolation.rb +2 -2
- data/lib/rubocop/cop/style/redundant_line_continuation.rb +183 -0
- data/lib/rubocop/cop/style/redundant_parentheses.rb +1 -1
- data/lib/rubocop/cop/style/redundant_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +2 -2
- data/lib/rubocop/cop/style/redundant_regexp_constructor.rb +46 -0
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +11 -4
- data/lib/rubocop/cop/style/redundant_sort.rb +3 -3
- data/lib/rubocop/cop/style/redundant_string_escape.rb +3 -4
- data/lib/rubocop/cop/style/regexp_literal.rb +11 -2
- data/lib/rubocop/cop/style/require_order.rb +12 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -3
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/safe_navigation.rb +2 -2
- data/lib/rubocop/cop/style/select_by_regexp.rb +15 -5
- data/lib/rubocop/cop/style/semicolon.rb +12 -1
- data/lib/rubocop/cop/style/single_line_methods.rb +1 -1
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +6 -4
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -4
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +1 -0
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +1 -1
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unless_logical_operators.rb +1 -0
- data/lib/rubocop/cop/style/unpack_first.rb +3 -3
- data/lib/rubocop/cop/style/yoda_condition.rb +1 -1
- data/lib/rubocop/cop/style/zero_length_predicate.rb +9 -5
- data/lib/rubocop/cop/team.rb +2 -2
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/variable_force/assignment.rb +33 -1
- data/lib/rubocop/cop/variable_force/variable.rb +5 -3
- data/lib/rubocop/cop/variable_force/variable_table.rb +2 -2
- data/lib/rubocop/cop/variable_force.rb +1 -0
- data/lib/rubocop/cops_documentation_generator.rb +10 -3
- data/lib/rubocop/directive_comment.rb +3 -3
- data/lib/rubocop/ext/comment.rb +18 -0
- data/lib/rubocop/ext/regexp_node.rb +1 -1
- data/lib/rubocop/ext/regexp_parser.rb +1 -1
- data/lib/rubocop/formatter/junit_formatter.rb +4 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/options.rb +4 -1
- data/lib/rubocop/result_cache.rb +2 -2
- data/lib/rubocop/rspec/cop_helper.rb +1 -1
- data/lib/rubocop/rspec/support.rb +1 -0
- data/lib/rubocop/server/cache.rb +1 -1
- data/lib/rubocop/server/client_command/exec.rb +2 -1
- data/lib/rubocop/server/core.rb +1 -1
- data/lib/rubocop/server/helper.rb +1 -1
- data/lib/rubocop/server/server_command/exec.rb +1 -1
- data/lib/rubocop/target_ruby.rb +3 -2
- data/lib/rubocop/version.rb +10 -6
- data/lib/rubocop.rb +13 -0
- metadata +23 -8
@@ -35,7 +35,7 @@ module RuboCop
|
|
35
35
|
def move_comment(eol_comment:, node:, corrector:)
|
36
36
|
return unless eol_comment
|
37
37
|
|
38
|
-
text = eol_comment.
|
38
|
+
text = eol_comment.source
|
39
39
|
corrector.insert_before(node, "#{text}\n#{' ' * node.loc.keyword.column}")
|
40
40
|
corrector.remove(eol_comment)
|
41
41
|
end
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
return unless (parent = node.parent)
|
53
53
|
return unless use_heredoc_argument_method_chain?(parent)
|
54
54
|
|
55
|
-
chained_method = range_between(parent.loc.dot.begin_pos, parent.
|
55
|
+
chained_method = range_between(parent.loc.dot.begin_pos, parent.source_range.end_pos)
|
56
56
|
|
57
57
|
corrector.remove(chained_method)
|
58
58
|
corrector.insert_after(end_range, chained_method.source)
|
@@ -80,7 +80,7 @@ module RuboCop
|
|
80
80
|
def select_content_to_be_inserted_after_last_element(corrector, node)
|
81
81
|
range = range_between(
|
82
82
|
node.loc.end.begin_pos,
|
83
|
-
range_by_whole_lines(node.
|
83
|
+
range_by_whole_lines(node.source_range).end.end_pos
|
84
84
|
)
|
85
85
|
|
86
86
|
remove_trailing_content_of_comment(corrector, range)
|
@@ -26,7 +26,7 @@ module RuboCop
|
|
26
26
|
def declaration_with_comment(node)
|
27
27
|
buffer = processed_source.buffer
|
28
28
|
begin_pos = range_by_whole_lines(get_source_range(node, comments_as_separators)).begin_pos
|
29
|
-
end_line = buffer.line_for_position(node.
|
29
|
+
end_line = buffer.line_for_position(node.source_range.end_pos)
|
30
30
|
end_pos = range_by_whole_lines(buffer.line_range(end_line),
|
31
31
|
include_final_newline: true).end_pos
|
32
32
|
|
@@ -66,10 +66,10 @@ module RuboCop
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
-
def line_breaks(node, source, previous_line_num, base_line_num,
|
69
|
+
def line_breaks(node, source, previous_line_num, base_line_num, node_index)
|
70
70
|
source_in_lines = source.split("\n")
|
71
71
|
if first_line?(node, previous_line_num)
|
72
|
-
|
72
|
+
node_index.zero? && node.first_line == base_line_num ? '' : ' '
|
73
73
|
else
|
74
74
|
process_lines(node, previous_line_num, base_line_num, source_in_lines)
|
75
75
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Gemspec
|
6
|
-
# Checks that deprecated
|
6
|
+
# Checks that deprecated attributes are not set in a gemspec file.
|
7
7
|
# Removing deprecated attributes allows the user to receive smaller packed gems.
|
8
8
|
#
|
9
9
|
# @example
|
@@ -75,7 +75,7 @@ module RuboCop
|
|
75
75
|
|
76
76
|
# @!method add_development_dependency?(node)
|
77
77
|
def_node_matcher :add_development_dependency?, <<~PATTERN
|
78
|
-
(send _ :add_development_dependency (str #forbidden_gem? ...))
|
78
|
+
(send _ :add_development_dependency (str #forbidden_gem? ...) _? _?)
|
79
79
|
PATTERN
|
80
80
|
|
81
81
|
# @!method gem?(node)
|
@@ -12,6 +12,13 @@ module RuboCop
|
|
12
12
|
# ....
|
13
13
|
# end
|
14
14
|
#
|
15
|
+
# # bad
|
16
|
+
# #
|
17
|
+
# # Checks ...
|
18
|
+
# class SomeCop < Base
|
19
|
+
# ...
|
20
|
+
# end
|
21
|
+
#
|
15
22
|
# # good
|
16
23
|
# # Checks ...
|
17
24
|
# class SomeCop < Base
|
@@ -21,27 +28,47 @@ module RuboCop
|
|
21
28
|
class CopDescription < Base
|
22
29
|
extend AutoCorrector
|
23
30
|
|
24
|
-
|
31
|
+
MSG_STARTS_WITH_WRONG_WORD =
|
32
|
+
'Description should be started with %<suggestion>s instead of `This cop ...`.'
|
33
|
+
MSG_STARTS_WITH_EMPTY_COMMENT_LINE =
|
34
|
+
'Description should not start with an empty comment line.'
|
25
35
|
|
26
36
|
SPECIAL_WORDS = %w[is can could should will would must may].freeze
|
27
|
-
COP_DESC_OFFENSE_REGEX =
|
37
|
+
COP_DESC_OFFENSE_REGEX =
|
28
38
|
/^\s+# This cop (?<special>#{SPECIAL_WORDS.join('|')})?\s*(?<word>.+?) .*/.freeze
|
29
39
|
REPLACEMENT_REGEX = /^\s+# This cop (#{SPECIAL_WORDS.join('|')})?\s*(.+?) /.freeze
|
40
|
+
EMPTY_COMMENT_LINE_REGEX = /\A\s*#\s*\n\z/.freeze
|
30
41
|
|
31
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
32
42
|
def on_class(node)
|
33
43
|
return unless (module_node = node.parent) && node.parent_class
|
34
44
|
|
35
45
|
description_beginning = first_comment_line(module_node)
|
36
46
|
return unless description_beginning
|
37
47
|
|
38
|
-
|
39
|
-
|
48
|
+
if description_beginning.match?(EMPTY_COMMENT_LINE_REGEX)
|
49
|
+
register_offense_for_empty_comment_line(module_node, description_beginning)
|
50
|
+
else
|
51
|
+
start_with_subject = description_beginning.match(COP_DESC_OFFENSE_REGEX)
|
52
|
+
return unless start_with_subject
|
53
|
+
|
54
|
+
register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
40
59
|
|
60
|
+
def register_offense_for_empty_comment_line(module_node, description_beginning)
|
61
|
+
range = range(module_node, description_beginning)
|
62
|
+
add_offense(range, message: MSG_STARTS_WITH_EMPTY_COMMENT_LINE) do |corrector|
|
63
|
+
corrector.remove(range)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def register_offense_for_wrong_word(module_node, description_beginning, start_with_subject)
|
41
68
|
suggestion = start_with_subject['word']&.capitalize
|
42
69
|
range = range(module_node, description_beginning)
|
43
70
|
suggestion_for_message = suggestion_for_message(suggestion, start_with_subject)
|
44
|
-
message = format(
|
71
|
+
message = format(MSG_STARTS_WITH_WRONG_WORD, suggestion: suggestion_for_message)
|
45
72
|
|
46
73
|
add_offense(range, message: message) do |corrector|
|
47
74
|
if suggestion && !start_with_subject['special']
|
@@ -49,9 +76,6 @@ module RuboCop
|
|
49
76
|
end
|
50
77
|
end
|
51
78
|
end
|
52
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
53
|
-
|
54
|
-
private
|
55
79
|
|
56
80
|
def replace_with_suggestion(corrector, range, suggestion, description_beginning)
|
57
81
|
replacement = description_beginning.gsub(REPLACEMENT_REGEX, "#{suggestion} ")
|
@@ -59,9 +83,9 @@ module RuboCop
|
|
59
83
|
end
|
60
84
|
|
61
85
|
def range(node, comment_line)
|
62
|
-
source_buffer = node.
|
86
|
+
source_buffer = node.source_range.source_buffer
|
63
87
|
|
64
|
-
begin_pos = node.
|
88
|
+
begin_pos = node.source_range.begin_pos
|
65
89
|
begin_pos += comment_index(node, comment_line)
|
66
90
|
end_pos = begin_pos + comment_body(comment_line).length
|
67
91
|
|
@@ -77,7 +101,7 @@ module RuboCop
|
|
77
101
|
end
|
78
102
|
|
79
103
|
def first_comment_line(node)
|
80
|
-
node.
|
104
|
+
node.source.lines.find { |line| comment_line?(line) }
|
81
105
|
end
|
82
106
|
|
83
107
|
def comment_body(comment_line)
|
@@ -86,7 +110,7 @@ module RuboCop
|
|
86
110
|
|
87
111
|
def comment_index(node, comment_line)
|
88
112
|
body = comment_body(comment_line)
|
89
|
-
node.
|
113
|
+
node.source.index(body)
|
90
114
|
end
|
91
115
|
|
92
116
|
def relevant_file?(file)
|
@@ -52,7 +52,7 @@ module RuboCop
|
|
52
52
|
# @return [void]
|
53
53
|
def autocorrect(corrector, node)
|
54
54
|
[
|
55
|
-
|
55
|
+
heredoc_opening_delimiter_range_from(node),
|
56
56
|
heredoc_closing_delimiter_range_from(node)
|
57
57
|
].each do |range|
|
58
58
|
corrector.replace(range, EXPECTED_HEREDOC_DELIMITER)
|
@@ -90,9 +90,9 @@ module RuboCop
|
|
90
90
|
|
91
91
|
# @param node [RuboCop::AST::StrNode]
|
92
92
|
# @return [Parser::Source::Range]
|
93
|
-
def
|
93
|
+
def heredoc_opening_delimiter_range_from(node)
|
94
94
|
match_data = node.source.match(Heredoc::OPENING_DELIMITER)
|
95
|
-
node.
|
95
|
+
node.source_range.begin.adjust(
|
96
96
|
begin_pos: match_data.begin(2),
|
97
97
|
end_pos: match_data.end(2)
|
98
98
|
)
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module InternalAffairs
|
6
|
-
# `RuboCop::Cop::Cop` is deprecated and will be removed in
|
6
|
+
# `RuboCop::Cop::Cop` is deprecated and will be removed in RuboCop 2.0.
|
7
7
|
# Your custom cop class should inherit from `RuboCop::Cop::Base` instead of
|
8
8
|
# `RuboCop::Cop::Cop`.
|
9
9
|
#
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Enforces the use of `node.source_range` instead of `node.location.expression`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# node.location.expression
|
12
|
+
# node.loc.expression
|
13
|
+
#
|
14
|
+
# # good
|
15
|
+
# node.source_range
|
16
|
+
#
|
17
|
+
class LocationExpression < Base
|
18
|
+
extend AutoCorrector
|
19
|
+
|
20
|
+
MSG = 'Use `source_range` instead.'
|
21
|
+
RESTRICT_ON_SEND = %i[loc location].freeze
|
22
|
+
|
23
|
+
def on_send(node)
|
24
|
+
return unless (parent = node.parent)
|
25
|
+
return unless parent.send_type? && parent.method?(:expression)
|
26
|
+
return unless parent.receiver.receiver
|
27
|
+
|
28
|
+
offense = node.loc.selector.join(parent.source_range.end)
|
29
|
+
|
30
|
+
add_offense(offense) do |corrector|
|
31
|
+
corrector.replace(offense, 'source_range')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -59,12 +59,12 @@ module RuboCop
|
|
59
59
|
def method_directives(node)
|
60
60
|
comments = processed_source.ast_with_comments[node]
|
61
61
|
|
62
|
-
comments.
|
62
|
+
comments.filter_map do |comment|
|
63
63
|
match = comment.text.match(REGEXP)
|
64
64
|
next unless match
|
65
65
|
|
66
66
|
{ node: comment, method_name: match[:method_name], args: match[:args] }
|
67
|
-
end
|
67
|
+
end
|
68
68
|
end
|
69
69
|
|
70
70
|
def too_many_directives(node)
|
@@ -99,7 +99,7 @@ module RuboCop
|
|
99
99
|
# If the pattern matcher uses arguments (`%1`, `%2`, etc.), include them in the directive
|
100
100
|
arguments = pattern_arguments(node.arguments[1].source)
|
101
101
|
|
102
|
-
range = range_with_surrounding_space(node.
|
102
|
+
range = range_with_surrounding_space(node.source_range, side: :left, newlines: false)
|
103
103
|
indentation = range.source.match(/^\s*/)[0]
|
104
104
|
directive = "#{indentation}# @!method #{actual_name}(#{arguments.join(', ')})\n"
|
105
105
|
directive = "\n#{directive}" if add_newline?(node)
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
|
31
31
|
message = format(MSG, type: node_type)
|
32
32
|
add_offense(node, message: message) do |corrector|
|
33
|
-
range = node.
|
33
|
+
range = node.source_range.with(begin_pos: receiver.source_range.end_pos + 1)
|
34
34
|
corrector.replace(range, "#{node_type}_type?")
|
35
35
|
end
|
36
36
|
end
|
@@ -30,7 +30,7 @@ module RuboCop
|
|
30
30
|
def on_send(node)
|
31
31
|
return unless processed_source_buffer_name?(node)
|
32
32
|
|
33
|
-
offense_range = node.children.first.loc.selector.begin.join(node.
|
33
|
+
offense_range = node.children.first.loc.selector.begin.join(node.source_range.end)
|
34
34
|
|
35
35
|
add_offense(offense_range) do |corrector|
|
36
36
|
corrector.replace(offense_range, 'file_path')
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module InternalAffairs
|
6
|
+
# Checks for redundant `source_range`.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
#
|
10
|
+
# # bad
|
11
|
+
# node.source_range.source
|
12
|
+
#
|
13
|
+
# # good
|
14
|
+
# node.source
|
15
|
+
#
|
16
|
+
# # bad
|
17
|
+
# add_offense(node) { |corrector| corrector.replace(node.source_range, prefer) }
|
18
|
+
# add_offense(node) { |corrector| corrector.insert_before(node.source_range, prefer) }
|
19
|
+
# add_offense(node) { |corrector| corrector.insert_before_multi(node.source_range, prefer) }
|
20
|
+
# add_offense(node) { |corrector| corrector.insert_after(node.source_range, prefer) }
|
21
|
+
# add_offense(node) { |corrector| corrector.insert_after_multi(node.source_range, prefer) }
|
22
|
+
# add_offense(node) { |corrector| corrector.swap(node.source_range, before, after) }
|
23
|
+
#
|
24
|
+
# # good
|
25
|
+
# add_offense(node) { |corrector| corrector.replace(node, prefer) }
|
26
|
+
# add_offense(node) { |corrector| corrector.insert_before(node, prefer) }
|
27
|
+
# add_offense(node) { |corrector| corrector.insert_before_multi(node, prefer) }
|
28
|
+
# add_offense(node) { |corrector| corrector.insert_after(node, prefer) }
|
29
|
+
# add_offense(node) { |corrector| corrector.insert_after_multi(node, prefer) }
|
30
|
+
# add_offense(node) { |corrector| corrector.swap(node, before, after) }
|
31
|
+
#
|
32
|
+
class RedundantSourceRange < Base
|
33
|
+
extend AutoCorrector
|
34
|
+
|
35
|
+
MSG = 'Remove the redundant `source_range`.'
|
36
|
+
RESTRICT_ON_SEND = %i[
|
37
|
+
source
|
38
|
+
replace remove insert_before insert_before_multi insert_after insert_after_multi swap
|
39
|
+
].freeze
|
40
|
+
|
41
|
+
# @!method redundant_source_range(node)
|
42
|
+
def_node_matcher :redundant_source_range, <<~PATTERN
|
43
|
+
{
|
44
|
+
(send $(send _ :source_range) :source)
|
45
|
+
(send _ {
|
46
|
+
:replace :insert_before :insert_before_multi :insert_after :insert_after_multi
|
47
|
+
} $(send _ :source_range) _)
|
48
|
+
(send _ :remove $(send _ :source_range))
|
49
|
+
(send _ :swap $(send _ :source_range) _ _)
|
50
|
+
}
|
51
|
+
PATTERN
|
52
|
+
|
53
|
+
def on_send(node)
|
54
|
+
return unless (source_range = redundant_source_range(node))
|
55
|
+
return if source_range.receiver.send_type? && source_range.receiver.method?(:buffer)
|
56
|
+
|
57
|
+
selector = source_range.loc.selector
|
58
|
+
|
59
|
+
add_offense(selector) do |corrector|
|
60
|
+
corrector.remove(source_range.loc.dot.join(selector))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -7,6 +7,7 @@ require_relative 'internal_affairs/example_description'
|
|
7
7
|
require_relative 'internal_affairs/example_heredoc_delimiter'
|
8
8
|
require_relative 'internal_affairs/inherit_deprecated_cop_class'
|
9
9
|
require_relative 'internal_affairs/lambda_or_proc'
|
10
|
+
require_relative 'internal_affairs/location_expression'
|
10
11
|
require_relative 'internal_affairs/location_line_equality_comparison'
|
11
12
|
require_relative 'internal_affairs/method_name_end_with'
|
12
13
|
require_relative 'internal_affairs/method_name_equal'
|
@@ -22,6 +23,7 @@ require_relative 'internal_affairs/redundant_let_rubocop_config_new'
|
|
22
23
|
require_relative 'internal_affairs/redundant_location_argument'
|
23
24
|
require_relative 'internal_affairs/redundant_message_argument'
|
24
25
|
require_relative 'internal_affairs/redundant_method_dispatch_node'
|
26
|
+
require_relative 'internal_affairs/redundant_source_range'
|
25
27
|
require_relative 'internal_affairs/single_line_comparison'
|
26
28
|
require_relative 'internal_affairs/style_detected_api_use'
|
27
29
|
require_relative 'internal_affairs/undefined_config'
|
@@ -36,17 +36,19 @@ module RuboCop
|
|
36
36
|
# If the end is on its own line, there is no offense
|
37
37
|
return if begins_its_line?(node.loc.end)
|
38
38
|
|
39
|
-
|
39
|
+
offense_range = offense_range(node)
|
40
|
+
return if offense_range.source.lstrip.start_with?(';')
|
41
|
+
|
42
|
+
register_offense(node, offense_range)
|
40
43
|
end
|
41
44
|
|
42
45
|
alias on_numblock on_block
|
43
46
|
|
44
47
|
private
|
45
48
|
|
46
|
-
def register_offense(node)
|
49
|
+
def register_offense(node, offense_range)
|
47
50
|
add_offense(node.loc.end, message: message(node)) do |corrector|
|
48
|
-
|
49
|
-
replacement = replacement(node)
|
51
|
+
replacement = "\n#{offense_range.source.lstrip}"
|
50
52
|
|
51
53
|
if (heredoc = last_heredoc_argument(node.body))
|
52
54
|
corrector.remove(offense_range)
|
@@ -72,23 +74,7 @@ module RuboCop
|
|
72
74
|
end
|
73
75
|
|
74
76
|
def offense_range(node)
|
75
|
-
|
76
|
-
node.loc.expression.source_buffer,
|
77
|
-
node.children.compact.last.loc.expression.end_pos,
|
78
|
-
end_of_method_chain(node).loc.expression.end_pos
|
79
|
-
)
|
80
|
-
end
|
81
|
-
|
82
|
-
def replacement(node)
|
83
|
-
end_with_method_chain = node.loc.end.join(end_of_method_chain(node).loc.expression.end)
|
84
|
-
|
85
|
-
"\n#{end_with_method_chain.source.strip}"
|
86
|
-
end
|
87
|
-
|
88
|
-
def end_of_method_chain(node)
|
89
|
-
return node unless node.parent&.call_type?
|
90
|
-
|
91
|
-
end_of_method_chain(node.parent)
|
77
|
+
node.children.compact.last.source_range.end.join(node.loc.end)
|
92
78
|
end
|
93
79
|
end
|
94
80
|
end
|
@@ -159,6 +159,7 @@ module RuboCop
|
|
159
159
|
previous = index
|
160
160
|
end
|
161
161
|
end
|
162
|
+
alias on_sclass on_class
|
162
163
|
|
163
164
|
private
|
164
165
|
|
@@ -285,10 +286,12 @@ module RuboCop
|
|
285
286
|
end
|
286
287
|
|
287
288
|
def end_position_for(node)
|
288
|
-
|
289
|
-
|
289
|
+
if node.casgn_type?
|
290
|
+
heredoc = find_heredoc(node)
|
291
|
+
return heredoc.location.heredoc_end.end_pos + 1 if heredoc
|
292
|
+
end
|
290
293
|
|
291
|
-
end_line = buffer.line_for_position(node.
|
294
|
+
end_line = buffer.line_for_position(node.source_range.end_pos)
|
292
295
|
buffer.line_range(end_line).end_pos
|
293
296
|
end
|
294
297
|
|
@@ -3,7 +3,6 @@
|
|
3
3
|
module RuboCop
|
4
4
|
module Cop
|
5
5
|
module Layout
|
6
|
-
#
|
7
6
|
# Checks the indentation of here document closings.
|
8
7
|
#
|
9
8
|
# @example
|
@@ -85,7 +84,7 @@ module RuboCop
|
|
85
84
|
end
|
86
85
|
|
87
86
|
def heredoc_opening(node)
|
88
|
-
node.
|
87
|
+
node.source_range.source_line
|
89
88
|
end
|
90
89
|
|
91
90
|
def heredoc_closing(node)
|
@@ -97,9 +97,9 @@ module RuboCop
|
|
97
97
|
def autocorrect(corrector, node)
|
98
98
|
previous_token = previous_token(node)
|
99
99
|
range = if previous_token && same_line?(node, previous_token)
|
100
|
-
range_with_surrounding_space(node.
|
100
|
+
range_with_surrounding_space(node.source_range, newlines: false)
|
101
101
|
else
|
102
|
-
range_by_whole_lines(node.
|
102
|
+
range_by_whole_lines(node.source_range, include_final_newline: true)
|
103
103
|
end
|
104
104
|
|
105
105
|
corrector.remove(range)
|
@@ -137,7 +137,7 @@ module RuboCop
|
|
137
137
|
end
|
138
138
|
|
139
139
|
def current_token(comment)
|
140
|
-
processed_source.
|
140
|
+
processed_source.tokens.find { |token| token.pos == comment.source_range }
|
141
141
|
end
|
142
142
|
|
143
143
|
def previous_token(node)
|
@@ -31,7 +31,7 @@ module RuboCop
|
|
31
31
|
return unless processed_source.raw_source.include?("\n\n\n")
|
32
32
|
|
33
33
|
lines = Set.new
|
34
|
-
processed_source.
|
34
|
+
processed_source.tokens.each { |token| lines << token.line }
|
35
35
|
|
36
36
|
each_extra_empty_line(lines.sort) do |range|
|
37
37
|
add_offense(range) do |corrector|
|
@@ -51,6 +51,8 @@ module RuboCop
|
|
51
51
|
MSG_BEFORE_FOR_ONLY_BEFORE = 'Keep a blank line before `%<modifier>s`.'
|
52
52
|
MSG_AFTER_FOR_ONLY_BEFORE = 'Remove a blank line after `%<modifier>s`.'
|
53
53
|
|
54
|
+
RESTRICT_ON_SEND = %i[public protected private module_function].freeze
|
55
|
+
|
54
56
|
def initialize(config = nil, options = nil)
|
55
57
|
super
|
56
58
|
|
@@ -109,6 +109,7 @@ module RuboCop
|
|
109
109
|
check_other_alignment(node)
|
110
110
|
end
|
111
111
|
end
|
112
|
+
alias on_case_match on_case
|
112
113
|
|
113
114
|
private
|
114
115
|
|
@@ -169,7 +170,10 @@ module RuboCop
|
|
169
170
|
end
|
170
171
|
|
171
172
|
def alignment_node_for_variable_style(node)
|
172
|
-
|
173
|
+
if (node.case_type? || node.case_match_type?) && node.argument? &&
|
174
|
+
same_line?(node, node.parent)
|
175
|
+
return node.parent
|
176
|
+
end
|
173
177
|
|
174
178
|
assignment = assignment_or_operator_method(node)
|
175
179
|
|
@@ -49,7 +49,7 @@ module RuboCop
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
-
def aligned_locations(locs)
|
52
|
+
def aligned_locations(locs) # rubocop:disable Metrics/AbcSize
|
53
53
|
return [] if locs.empty?
|
54
54
|
|
55
55
|
aligned = Set[locs.first.line, locs.last.line]
|
@@ -57,6 +57,11 @@ module RuboCop
|
|
57
57
|
col = loc.column
|
58
58
|
aligned << loc.line if col == before.column || col == after.column
|
59
59
|
end
|
60
|
+
|
61
|
+
# if locs.size > 2 and the size of variable `aligned`
|
62
|
+
# has not increased from its initial value, there are not aligned lines.
|
63
|
+
return [] if locs.size > 2 && aligned.size == 2
|
64
|
+
|
60
65
|
aligned
|
61
66
|
end
|
62
67
|
|
@@ -153,9 +153,10 @@ module RuboCop
|
|
153
153
|
MSG = 'Indent the first argument one step more than %<base>s.'
|
154
154
|
|
155
155
|
def on_send(node)
|
156
|
+
return unless should_check?(node)
|
157
|
+
return if same_line?(node, node.first_argument)
|
156
158
|
return if style != :consistent && enforce_first_argument_with_fixed_indentation? &&
|
157
159
|
!enable_layout_first_method_argument_line_break?
|
158
|
-
return if !node.arguments? || bare_operator?(node) || node.setter_method?
|
159
160
|
|
160
161
|
indent = base_indentation(node) + configured_indentation_width
|
161
162
|
|
@@ -166,6 +167,10 @@ module RuboCop
|
|
166
167
|
|
167
168
|
private
|
168
169
|
|
170
|
+
def should_check?(node)
|
171
|
+
node.arguments? && !bare_operator?(node) && !node.setter_method?
|
172
|
+
end
|
173
|
+
|
169
174
|
def autocorrect(corrector, node)
|
170
175
|
AlignmentCorrector.correct(corrector, processed_source, node, column_delta)
|
171
176
|
end
|
@@ -255,7 +260,7 @@ module RuboCop
|
|
255
260
|
@comment_lines ||=
|
256
261
|
processed_source
|
257
262
|
.comments
|
258
|
-
.select { |c| begins_its_line?(c.
|
263
|
+
.select { |c| begins_its_line?(c.source_range) }
|
259
264
|
.map { |c| c.loc.line }
|
260
265
|
end
|
261
266
|
|