rubocop 0.72.0 → 0.76.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/README.md +2 -1
- data/bin/console +1 -0
- data/config/default.yml +93 -56
- data/lib/rubocop.rb +21 -10
- data/lib/rubocop/ast/builder.rb +1 -0
- data/lib/rubocop/ast/node.rb +12 -14
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +4 -4
- data/lib/rubocop/ast/node/return_node.rb +24 -0
- data/lib/rubocop/ast/traversal.rb +3 -3
- data/lib/rubocop/cli.rb +7 -4
- data/lib/rubocop/comment_config.rb +5 -4
- data/lib/rubocop/config.rb +28 -537
- data/lib/rubocop/config_loader.rb +21 -3
- data/lib/rubocop/config_loader_resolver.rb +4 -3
- data/lib/rubocop/config_obsoletion.rb +222 -0
- data/lib/rubocop/config_validator.rb +248 -0
- data/lib/rubocop/cop/autocorrect_logic.rb +71 -1
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +1 -1
- data/lib/rubocop/cop/bundler/ordered_gems.rb +1 -1
- data/lib/rubocop/cop/commissioner.rb +18 -16
- data/lib/rubocop/cop/cop.rb +49 -14
- data/lib/rubocop/cop/corrector.rb +10 -10
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +43 -17
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +1 -1
- data/lib/rubocop/cop/gemspec/duplicated_assignment.rb +2 -2
- data/lib/rubocop/cop/gemspec/ordered_dependencies.rb +1 -1
- data/lib/rubocop/cop/gemspec/required_ruby_version.rb +1 -1
- data/lib/rubocop/cop/gemspec/ruby_version_globals_usage.rb +1 -1
- data/lib/rubocop/cop/generator.rb +4 -4
- data/lib/rubocop/cop/generator/configuration_injector.rb +9 -4
- data/lib/rubocop/cop/generator/require_file_injector.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/node_destructuring.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +1 -1
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +2 -2
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +2 -2
- data/lib/rubocop/cop/layout/align_hash.rb +6 -2
- data/lib/rubocop/cop/layout/block_alignment.rb +3 -3
- data/lib/rubocop/cop/layout/class_structure.rb +1 -1
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/comment_indentation.rb +10 -13
- data/lib/rubocop/cop/layout/empty_comment.rb +7 -16
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +22 -7
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +2 -2
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -2
- data/lib/rubocop/cop/layout/end_of_line.rb +8 -3
- data/lib/rubocop/cop/layout/extra_spacing.rb +14 -59
- data/lib/rubocop/cop/layout/indent_assignment.rb +10 -1
- data/lib/rubocop/cop/layout/indent_first_argument.rb +10 -8
- data/lib/rubocop/cop/layout/indent_first_hash_element.rb +1 -1
- data/lib/rubocop/cop/layout/indent_heredoc.rb +4 -3
- data/lib/rubocop/cop/layout/indentation_width.rb +20 -6
- data/lib/rubocop/cop/layout/leading_comment_space.rb +28 -0
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +1 -1
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +24 -2
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +20 -4
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +5 -1
- data/lib/rubocop/cop/layout/space_around_operators.rb +42 -23
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -7
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +8 -5
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +21 -2
- data/lib/rubocop/cop/layout/space_inside_parens.rb +6 -6
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +24 -40
- data/lib/rubocop/cop/layout/tab.rb +10 -22
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +18 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +17 -4
- data/lib/rubocop/cop/lint/big_decimal_new.rb +1 -1
- data/lib/rubocop/cop/lint/debugger.rb +4 -6
- data/lib/rubocop/cop/lint/duplicate_methods.rb +3 -3
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +4 -4
- data/lib/rubocop/cop/lint/erb_new_arguments.rb +62 -5
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +11 -37
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +1 -1
- data/lib/rubocop/cop/lint/inherit_exception.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +7 -8
- data/lib/rubocop/cop/lint/missing_cop_enable_directive.rb +2 -2
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +3 -3
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/non_local_exit_from_iterator.rb +1 -1
- data/lib/rubocop/cop/lint/number_conversion.rb +3 -3
- data/lib/rubocop/cop/lint/rand_one.rb +1 -1
- data/lib/rubocop/cop/lint/{unneeded_cop_disable_directive.rb → redundant_cop_disable_directive.rb} +24 -24
- data/lib/rubocop/cop/lint/{unneeded_cop_enable_directive.rb → redundant_cop_enable_directive.rb} +6 -8
- data/lib/rubocop/cop/lint/{unneeded_require_statement.rb → redundant_require_statement.rb} +2 -2
- data/lib/rubocop/cop/lint/{unneeded_splat_expansion.rb → redundant_splat_expansion.rb} +12 -7
- 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/safe_navigation_chain.rb +10 -11
- data/lib/rubocop/cop/lint/safe_navigation_with_empty.rb +1 -1
- data/lib/rubocop/cop/lint/send_with_mixin_argument.rb +91 -0
- data/lib/rubocop/cop/lint/string_conversion_in_interpolation.rb +6 -6
- data/lib/rubocop/cop/lint/unified_integer.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/unused_block_argument.rb +22 -6
- data/lib/rubocop/cop/lint/unused_method_argument.rb +23 -5
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +1 -1
- data/lib/rubocop/cop/lint/uri_regexp.rb +2 -2
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +6 -6
- data/lib/rubocop/cop/lint/useless_setter_call.rb +1 -1
- data/lib/rubocop/cop/lint/void.rb +7 -26
- data/lib/rubocop/cop/message_annotator.rb +16 -7
- data/lib/rubocop/cop/metrics/abc_size.rb +1 -1
- data/lib/rubocop/cop/metrics/class_length.rb +1 -1
- data/lib/rubocop/cop/metrics/line_length.rb +7 -4
- data/lib/rubocop/cop/metrics/module_length.rb +1 -1
- data/lib/rubocop/cop/metrics/parameter_lists.rb +1 -1
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +23 -6
- data/lib/rubocop/cop/migration/department_name.rb +44 -0
- data/lib/rubocop/cop/mixin/alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/def_node.rb +1 -1
- data/lib/rubocop/cop/mixin/documentation_comment.rb +0 -2
- data/lib/rubocop/cop/mixin/empty_parameter.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +4 -4
- data/lib/rubocop/cop/mixin/frozen_string_literal.rb +1 -1
- data/lib/rubocop/cop/mixin/interpolation.rb +27 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +3 -2
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +3 -3
- data/lib/rubocop/cop/mixin/preceding_following_alignment.rb +87 -0
- data/lib/rubocop/cop/mixin/safe_mode.rb +2 -0
- data/lib/rubocop/cop/mixin/statement_modifier.rb +5 -2
- data/lib/rubocop/cop/mixin/surrounding_space.rb +7 -5
- data/lib/rubocop/cop/mixin/trailing_comma.rb +8 -6
- data/lib/rubocop/cop/naming/binary_operator_parameter_name.rb +1 -1
- data/lib/rubocop/cop/naming/constant_name.rb +2 -2
- data/lib/rubocop/cop/naming/file_name.rb +12 -5
- data/lib/rubocop/cop/naming/method_name.rb +12 -1
- data/lib/rubocop/cop/naming/predicate_name.rb +1 -1
- data/lib/rubocop/cop/naming/variable_name.rb +1 -0
- data/lib/rubocop/cop/offense.rb +18 -7
- data/lib/rubocop/cop/registry.rb +22 -1
- data/lib/rubocop/cop/security/eval.rb +1 -1
- data/lib/rubocop/cop/security/json_load.rb +1 -1
- data/lib/rubocop/cop/security/marshal_load.rb +1 -1
- data/lib/rubocop/cop/security/open.rb +1 -1
- data/lib/rubocop/cop/security/yaml_load.rb +1 -1
- data/lib/rubocop/cop/style/access_modifier_declarations.rb +1 -0
- data/lib/rubocop/cop/style/alias.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +2 -2
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/braces_around_hash_parameters.rb +35 -16
- data/lib/rubocop/cop/style/class_and_module_children.rb +1 -1
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -1
- data/lib/rubocop/cop/style/comment_annotation.rb +5 -5
- data/lib/rubocop/cop/style/commented_keyword.rb +16 -30
- data/lib/rubocop/cop/style/conditional_assignment.rb +6 -8
- data/lib/rubocop/cop/style/constant_visibility.rb +14 -3
- data/lib/rubocop/cop/style/copyright.rb +11 -7
- data/lib/rubocop/cop/style/date_time.rb +3 -3
- data/lib/rubocop/cop/style/dir.rb +1 -1
- data/lib/rubocop/cop/style/documentation_method.rb +45 -1
- data/lib/rubocop/cop/style/double_cop_disable_directive.rb +55 -0
- data/lib/rubocop/cop/style/each_for_simple_loop.rb +1 -1
- data/lib/rubocop/cop/style/each_with_object.rb +1 -1
- data/lib/rubocop/cop/style/empty_case_condition.rb +2 -2
- data/lib/rubocop/cop/style/empty_literal.rb +2 -2
- data/lib/rubocop/cop/style/empty_method.rb +5 -5
- data/lib/rubocop/cop/style/eval_with_location.rb +2 -2
- data/lib/rubocop/cop/style/even_odd.rb +1 -1
- data/lib/rubocop/cop/style/expand_path_arguments.rb +4 -4
- data/lib/rubocop/cop/style/float_division.rb +4 -4
- data/lib/rubocop/cop/style/format_string.rb +17 -14
- data/lib/rubocop/cop/style/format_string_token.rb +19 -68
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +28 -33
- data/lib/rubocop/cop/style/guard_clause.rb +39 -10
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
- data/lib/rubocop/cop/style/if_unless_modifier.rb +58 -15
- data/lib/rubocop/cop/style/infinite_loop.rb +5 -4
- data/lib/rubocop/cop/style/inverse_methods.rb +21 -15
- data/lib/rubocop/cop/style/lambda.rb +0 -2
- data/lib/rubocop/cop/style/line_end_concatenation.rb +14 -10
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +25 -25
- data/lib/rubocop/cop/style/method_def_parentheses.rb +17 -9
- data/lib/rubocop/cop/style/min_max.rb +1 -1
- data/lib/rubocop/cop/style/mixin_usage.rb +12 -2
- data/lib/rubocop/cop/style/multiline_memoization.rb +1 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +55 -0
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +3 -3
- data/lib/rubocop/cop/style/nested_modifier.rb +22 -4
- data/lib/rubocop/cop/style/non_nil_check.rb +21 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +3 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +8 -3
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +15 -1
- data/lib/rubocop/cop/style/random_with_offset.rb +6 -6
- data/lib/rubocop/cop/style/{unneeded_capital_w.rb → redundant_capital_w.rb} +1 -1
- data/lib/rubocop/cop/style/{unneeded_condition.rb → redundant_condition.rb} +3 -3
- data/lib/rubocop/cop/style/redundant_conditional.rb +2 -2
- data/lib/rubocop/cop/style/redundant_exception.rb +2 -2
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/{unneeded_interpolation.rb → redundant_interpolation.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +15 -6
- data/lib/rubocop/cop/style/{unneeded_percent_q.rb → redundant_percent_q.rb} +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +37 -21
- data/lib/rubocop/cop/style/redundant_self.rb +18 -1
- data/lib/rubocop/cop/style/{unneeded_sort.rb → redundant_sort.rb} +4 -4
- data/lib/rubocop/cop/style/redundant_sort_by.rb +1 -1
- data/lib/rubocop/cop/style/rescue_modifier.rb +24 -0
- data/lib/rubocop/cop/style/rescue_standard_error.rb +2 -2
- data/lib/rubocop/cop/style/return_nil.rb +1 -1
- data/lib/rubocop/cop/style/safe_navigation.rb +24 -4
- data/lib/rubocop/cop/style/sample.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +13 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +8 -1
- data/lib/rubocop/cop/style/special_global_vars.rb +5 -7
- data/lib/rubocop/cop/style/stderr_puts.rb +1 -1
- data/lib/rubocop/cop/style/string_hash_keys.rb +2 -2
- data/lib/rubocop/cop/style/strip.rb +1 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -3
- data/lib/rubocop/cop/style/symbol_proc.rb +1 -1
- data/lib/rubocop/cop/style/ternary_parentheses.rb +20 -1
- data/lib/rubocop/cop/style/trailing_method_end_statement.rb +4 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +1 -1
- data/lib/rubocop/cop/style/unpack_first.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +6 -16
- data/lib/rubocop/cop/style/zero_length_predicate.rb +5 -5
- data/lib/rubocop/cop/team.rb +15 -14
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +120 -0
- data/lib/rubocop/cop/variable_force.rb +7 -5
- data/lib/rubocop/cop/variable_force/variable.rb +15 -2
- data/lib/rubocop/core_ext/string.rb +0 -24
- data/lib/rubocop/error.rb +23 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +8 -3
- data/lib/rubocop/formatter/emacs_style_formatter.rb +22 -9
- data/lib/rubocop/formatter/file_list_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +16 -15
- data/lib/rubocop/formatter/pacman_formatter.rb +80 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +16 -4
- data/lib/rubocop/formatter/tap_formatter.rb +17 -4
- data/lib/rubocop/magic_comment.rb +4 -0
- data/lib/rubocop/node_pattern.rb +5 -3
- data/lib/rubocop/options.rb +33 -21
- data/lib/rubocop/path_util.rb +1 -1
- data/lib/rubocop/processed_source.rb +4 -0
- data/lib/rubocop/result_cache.rb +1 -1
- data/lib/rubocop/rspec/expect_offense.rb +4 -1
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +42 -31
- data/lib/rubocop/target_finder.rb +12 -4
- data/lib/rubocop/version.rb +1 -1
- metadata +21 -12
- data/lib/rubocop/cop/mixin/ignored_method_patterns.rb +0 -19
@@ -5,17 +5,25 @@ module RuboCop
|
|
5
5
|
# This module encapsulates the logic for autocorrect behavior for a cop.
|
6
6
|
module AutocorrectLogic
|
7
7
|
def autocorrect?
|
8
|
-
autocorrect_requested? &&
|
8
|
+
autocorrect_requested? && correctable? && autocorrect_enabled?
|
9
9
|
end
|
10
10
|
|
11
11
|
def autocorrect_requested?
|
12
12
|
@options.fetch(:auto_correct, false)
|
13
13
|
end
|
14
14
|
|
15
|
+
def correctable?
|
16
|
+
support_autocorrect? || disable_uncorrectable?
|
17
|
+
end
|
18
|
+
|
15
19
|
def support_autocorrect?
|
16
20
|
respond_to?(:autocorrect)
|
17
21
|
end
|
18
22
|
|
23
|
+
def disable_uncorrectable?
|
24
|
+
@options[:disable_uncorrectable] == true
|
25
|
+
end
|
26
|
+
|
19
27
|
def autocorrect_enabled?
|
20
28
|
# allow turning off autocorrect on a cop by cop basis
|
21
29
|
return true unless cop_config
|
@@ -28,6 +36,68 @@ module RuboCop
|
|
28
36
|
|
29
37
|
true
|
30
38
|
end
|
39
|
+
|
40
|
+
def disable_offense(node)
|
41
|
+
range = node.location.expression
|
42
|
+
eol_comment = " # rubocop:todo #{cop_name}"
|
43
|
+
needed_line_length = range.column +
|
44
|
+
(range.source_line + eol_comment).length
|
45
|
+
if needed_line_length <= max_line_length
|
46
|
+
disable_offense_at_end_of_line(range_of_first_line(range),
|
47
|
+
eol_comment)
|
48
|
+
else
|
49
|
+
disable_offense_before_and_after(range_by_lines(range))
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def range_of_first_line(range)
|
56
|
+
begin_of_first_line = range.begin_pos - range.column
|
57
|
+
end_of_first_line = begin_of_first_line + range.source_line.length
|
58
|
+
|
59
|
+
Parser::Source::Range.new(range.source_buffer,
|
60
|
+
begin_of_first_line,
|
61
|
+
end_of_first_line)
|
62
|
+
end
|
63
|
+
|
64
|
+
# Expand the given range to include all of any lines it covers. Does not
|
65
|
+
# include newline at end of the last line.
|
66
|
+
def range_by_lines(range)
|
67
|
+
begin_of_first_line = range.begin_pos - range.column
|
68
|
+
|
69
|
+
last_line = range.source_buffer.source_line(range.last_line)
|
70
|
+
last_line_offset = last_line.length - range.last_column
|
71
|
+
end_of_last_line = range.end_pos + last_line_offset
|
72
|
+
|
73
|
+
Parser::Source::Range.new(range.source_buffer,
|
74
|
+
begin_of_first_line,
|
75
|
+
end_of_last_line)
|
76
|
+
end
|
77
|
+
|
78
|
+
def max_line_length
|
79
|
+
config.for_cop('Metrics/LineLength')['Max'] || 80
|
80
|
+
end
|
81
|
+
|
82
|
+
def disable_offense_at_end_of_line(range, eol_comment)
|
83
|
+
->(corrector) { corrector.insert_after(range, eol_comment) }
|
84
|
+
end
|
85
|
+
|
86
|
+
def disable_offense_before_and_after(range_by_lines)
|
87
|
+
lambda do |corrector|
|
88
|
+
range_with_newline = range_by_lines.resize(range_by_lines.size + 1)
|
89
|
+
leading_whitespace = range_by_lines.source_line[/^\s*/]
|
90
|
+
|
91
|
+
corrector.insert_before(
|
92
|
+
range_with_newline,
|
93
|
+
"#{leading_whitespace}# rubocop:todo #{cop_name}\n"
|
94
|
+
)
|
95
|
+
corrector.insert_after(
|
96
|
+
range_with_newline,
|
97
|
+
"#{leading_whitespace}# rubocop:enable #{cop_name}\n"
|
98
|
+
)
|
99
|
+
end
|
100
|
+
end
|
31
101
|
end
|
32
102
|
end
|
33
103
|
end
|
@@ -33,7 +33,7 @@ module RuboCop
|
|
33
33
|
"Please change your source to 'https://rubygems.org' " \
|
34
34
|
"if possible, or 'http://rubygems.org' if not."
|
35
35
|
|
36
|
-
def_node_matcher :insecure_protocol_source?,
|
36
|
+
def_node_matcher :insecure_protocol_source?, <<~PATTERN
|
37
37
|
(send nil? :source
|
38
38
|
(sym ${:gemcutter :rubygems :rubyforge}))
|
39
39
|
PATTERN
|
@@ -7,8 +7,6 @@ module RuboCop
|
|
7
7
|
class Commissioner
|
8
8
|
include RuboCop::AST::Traversal
|
9
9
|
|
10
|
-
CopError = Struct.new(:error, :line, :column)
|
11
|
-
|
12
10
|
attr_reader :errors
|
13
11
|
|
14
12
|
def initialize(cops, forces = [], options = {})
|
@@ -62,21 +60,29 @@ module RuboCop
|
|
62
60
|
end
|
63
61
|
|
64
62
|
def reset_errors
|
65
|
-
@errors =
|
63
|
+
@errors = []
|
66
64
|
end
|
67
65
|
|
68
66
|
def remove_irrelevant_cops(filename)
|
69
|
-
@cops.reject! { |cop| cop.excluded_file?(filename) }
|
70
|
-
@cops.reject! do |cop|
|
71
|
-
cop.class.respond_to?(:support_target_ruby_version?) &&
|
72
|
-
!cop.class.support_target_ruby_version?(cop.target_ruby_version)
|
73
|
-
end
|
74
67
|
@cops.reject! do |cop|
|
75
|
-
cop.
|
76
|
-
!
|
68
|
+
cop.excluded_file?(filename) ||
|
69
|
+
!support_target_ruby_version?(cop) ||
|
70
|
+
!support_target_rails_version?(cop)
|
77
71
|
end
|
78
72
|
end
|
79
73
|
|
74
|
+
def support_target_ruby_version?(cop)
|
75
|
+
return true unless cop.class.respond_to?(:support_target_ruby_version?)
|
76
|
+
|
77
|
+
cop.class.support_target_ruby_version?(cop.target_ruby_version)
|
78
|
+
end
|
79
|
+
|
80
|
+
def support_target_rails_version?(cop)
|
81
|
+
return true unless cop.class.respond_to?(:support_target_rails_version?)
|
82
|
+
|
83
|
+
cop.class.support_target_rails_version?(cop.target_rails_version)
|
84
|
+
end
|
85
|
+
|
80
86
|
def reset_callbacks
|
81
87
|
@callbacks.clear
|
82
88
|
end
|
@@ -131,12 +137,8 @@ module RuboCop
|
|
131
137
|
rescue StandardError => e
|
132
138
|
raise e if @options[:raise_error]
|
133
139
|
|
134
|
-
|
135
|
-
|
136
|
-
column = node.loc.column
|
137
|
-
end
|
138
|
-
error = CopError.new(e, line, column)
|
139
|
-
@errors[cop] << error
|
140
|
+
err = ErrorWithAnalyzedFileLocation.new(cause: e, node: node, cop: cop)
|
141
|
+
@errors << err
|
140
142
|
end
|
141
143
|
end
|
142
144
|
end
|
data/lib/rubocop/cop/cop.rb
CHANGED
@@ -31,6 +31,16 @@ module RuboCop
|
|
31
31
|
include IgnoredNode
|
32
32
|
include AutocorrectLogic
|
33
33
|
|
34
|
+
Correction = Struct.new(:lambda, :node, :cop) do
|
35
|
+
def call(corrector)
|
36
|
+
lambda.call(corrector)
|
37
|
+
rescue StandardError => e
|
38
|
+
raise ErrorWithAnalyzedFileLocation.new(
|
39
|
+
cause: e, node: node, cop: cop
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
34
44
|
attr_reader :config, :offenses, :corrections
|
35
45
|
attr_accessor :processed_source # TODO: Bad design.
|
36
46
|
|
@@ -113,23 +123,19 @@ module RuboCop
|
|
113
123
|
self.class::MSG
|
114
124
|
end
|
115
125
|
|
116
|
-
# rubocop:disable Metrics/CyclomaticComplexity
|
117
126
|
def add_offense(node, location: :expression, message: nil, severity: nil)
|
118
127
|
loc = find_location(node, location)
|
119
128
|
|
120
129
|
return if duplicate_location?(loc)
|
121
130
|
|
122
|
-
severity =
|
123
|
-
|
124
|
-
message ||= message(node)
|
125
|
-
message = annotate(message)
|
131
|
+
severity = find_severity(node, severity)
|
132
|
+
message = find_message(node, message)
|
126
133
|
|
127
134
|
status = enabled_line?(loc.line) ? correct(node) : :disabled
|
128
135
|
|
129
136
|
@offenses << Offense.new(severity, loc, message, name, status)
|
130
137
|
yield if block_given? && status != :disabled
|
131
138
|
end
|
132
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
133
139
|
|
134
140
|
def find_location(node, loc)
|
135
141
|
# Location can be provided as a symbol, e.g.: `:keyword`
|
@@ -141,16 +147,37 @@ module RuboCop
|
|
141
147
|
end
|
142
148
|
|
143
149
|
def correct(node)
|
144
|
-
|
150
|
+
reason = reason_to_not_correct(node)
|
151
|
+
return reason if reason
|
152
|
+
|
153
|
+
@corrected_nodes[node] = true
|
154
|
+
if support_autocorrect?
|
155
|
+
correction = autocorrect(node)
|
156
|
+
return :uncorrected unless correction
|
157
|
+
|
158
|
+
@corrections << Correction.new(correction, node, self)
|
159
|
+
:corrected
|
160
|
+
elsif disable_uncorrectable?
|
161
|
+
disable_uncorrectable(node)
|
162
|
+
:corrected_with_todo
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def reason_to_not_correct(node)
|
167
|
+
return :unsupported unless correctable?
|
145
168
|
return :uncorrected unless autocorrect?
|
146
169
|
return :already_corrected if @corrected_nodes.key?(node)
|
147
170
|
|
148
|
-
|
149
|
-
|
150
|
-
|
171
|
+
nil
|
172
|
+
end
|
173
|
+
|
174
|
+
def disable_uncorrectable(node)
|
175
|
+
@disabled_lines ||= {}
|
176
|
+
line = node.location.line
|
177
|
+
return if @disabled_lines.key?(line)
|
151
178
|
|
152
|
-
@
|
153
|
-
|
179
|
+
@disabled_lines[line] = true
|
180
|
+
@corrections << Correction.new(disable_offense(node), node, self)
|
154
181
|
end
|
155
182
|
|
156
183
|
def config_to_allow_offenses
|
@@ -192,10 +219,14 @@ module RuboCop
|
|
192
219
|
|
193
220
|
private
|
194
221
|
|
222
|
+
def find_message(node, message)
|
223
|
+
annotate(message || message(node))
|
224
|
+
end
|
225
|
+
|
195
226
|
def annotate(message)
|
196
227
|
RuboCop::Cop::MessageAnnotator.new(
|
197
|
-
config, cop_config, @options
|
198
|
-
).annotate(message
|
228
|
+
config, cop_name, cop_config, @options
|
229
|
+
).annotate(message)
|
199
230
|
end
|
200
231
|
|
201
232
|
def file_name_matches_any?(file, parameter, default_result)
|
@@ -219,6 +250,10 @@ module RuboCop
|
|
219
250
|
@processed_source.comment_config.cop_enabled_at_line?(self, line_number)
|
220
251
|
end
|
221
252
|
|
253
|
+
def find_severity(_node, severity)
|
254
|
+
custom_severity || severity || default_severity
|
255
|
+
end
|
256
|
+
|
222
257
|
def default_severity
|
223
258
|
self.class.lint? ? :warning : :convention
|
224
259
|
end
|
@@ -57,16 +57,15 @@ module RuboCop
|
|
57
57
|
#
|
58
58
|
# @return [String]
|
59
59
|
def rewrite
|
60
|
-
# rubocop:disable Lint/HandleExceptions
|
61
60
|
@corrections.each do |correction|
|
62
61
|
begin
|
63
62
|
@source_rewriter.transaction do
|
64
63
|
correction.call(self)
|
65
64
|
end
|
66
|
-
rescue
|
65
|
+
rescue ErrorWithAnalyzedFileLocation => e
|
66
|
+
raise e unless e.cause.is_a?(::Parser::ClobberingError)
|
67
67
|
end
|
68
68
|
end
|
69
|
-
# rubocop:enable Lint/HandleExceptions
|
70
69
|
|
71
70
|
@source_rewriter.process
|
72
71
|
end
|
@@ -155,16 +154,17 @@ module RuboCop
|
|
155
154
|
|
156
155
|
# :nodoc:
|
157
156
|
def validate_range(range)
|
158
|
-
|
157
|
+
buffer = range.source_buffer
|
158
|
+
return if buffer == @source_buffer
|
159
159
|
|
160
|
-
unless
|
160
|
+
unless buffer.is_a?(Parser::Source::Buffer)
|
161
161
|
# actually this should be enforced by parser gem
|
162
|
-
raise 'Corrector expected range source buffer to be a '\
|
163
|
-
"Parser::Source::Buffer, but got #{
|
162
|
+
raise 'Corrector expected range source buffer to be a ' \
|
163
|
+
"Parser::Source::Buffer, but got #{buffer.class}"
|
164
164
|
end
|
165
|
-
raise "Correction target buffer #{
|
166
|
-
"name:#{
|
167
|
-
" is not current #{@source_buffer.object_id} "\
|
165
|
+
raise "Correction target buffer #{buffer.object_id} " \
|
166
|
+
"name:#{buffer.name.inspect}" \
|
167
|
+
" is not current #{@source_buffer.object_id} " \
|
168
168
|
"name:#{@source_buffer.name.inspect} under investigation"
|
169
169
|
end
|
170
170
|
end
|
@@ -19,10 +19,12 @@ module RuboCop
|
|
19
19
|
expr = node.respond_to?(:loc) ? node.loc.expression : node
|
20
20
|
return if block_comment_within?(expr)
|
21
21
|
|
22
|
+
taboo_ranges = inside_string_ranges(node)
|
23
|
+
|
22
24
|
lambda do |corrector|
|
23
25
|
each_line(expr) do |line_begin_pos|
|
24
26
|
autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
25
|
-
|
27
|
+
taboo_ranges)
|
26
28
|
end
|
27
29
|
end
|
28
30
|
end
|
@@ -39,27 +41,48 @@ module RuboCop
|
|
39
41
|
private
|
40
42
|
|
41
43
|
def autocorrect_line(corrector, line_begin_pos, expr, column_delta,
|
42
|
-
|
44
|
+
taboo_ranges)
|
43
45
|
range = calculate_range(expr, line_begin_pos, column_delta)
|
44
|
-
# We must not change indentation of heredoc strings
|
45
|
-
|
46
|
+
# We must not change indentation of heredoc strings or inside other
|
47
|
+
# string literals
|
48
|
+
return if taboo_ranges.any? { |t| within?(range, t) }
|
46
49
|
|
47
50
|
if column_delta.positive?
|
48
|
-
unless range.source == "\n"
|
49
|
-
|
50
|
-
corrector.insert_before(range.begin, ' ' * column_delta)
|
51
|
+
unless range.resize(1).source == "\n"
|
52
|
+
corrector.insert_before(range, ' ' * column_delta)
|
51
53
|
end
|
52
54
|
elsif range.source =~ /\A[ \t]+\z/
|
53
55
|
remove(range, corrector)
|
54
56
|
end
|
55
57
|
end
|
56
58
|
|
57
|
-
def
|
59
|
+
def inside_string_ranges(node)
|
58
60
|
return [] unless node.is_a?(Parser::AST::Node)
|
59
61
|
|
60
|
-
node.each_node(:dstr)
|
61
|
-
.
|
62
|
-
|
62
|
+
node.each_node(:str, :dstr, :xstr).map { |n| inside_string_range(n) }
|
63
|
+
.compact
|
64
|
+
end
|
65
|
+
|
66
|
+
def inside_string_range(node)
|
67
|
+
loc = node.location
|
68
|
+
|
69
|
+
if node.heredoc?
|
70
|
+
loc.heredoc_body.join(loc.heredoc_end)
|
71
|
+
elsif delimited_string_literal?(node)
|
72
|
+
loc.begin.end.join(loc.end.begin)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# Some special kinds of string literals are not composed of literal
|
77
|
+
# characters between two delimiters:
|
78
|
+
# - The source map of `?a` responds to :begin and :end but its end is
|
79
|
+
# nil.
|
80
|
+
# - The source map of `__FILE__` responds to neither :begin nor :end.
|
81
|
+
def delimited_string_literal?(node)
|
82
|
+
loc = node.location
|
83
|
+
|
84
|
+
loc.respond_to?(:begin) && loc.begin &&
|
85
|
+
loc.respond_to?(:end) && loc.end
|
63
86
|
end
|
64
87
|
|
65
88
|
def block_comment_within?(expr)
|
@@ -69,15 +92,18 @@ module RuboCop
|
|
69
92
|
end
|
70
93
|
|
71
94
|
def calculate_range(expr, line_begin_pos, column_delta)
|
95
|
+
if column_delta.positive?
|
96
|
+
return range_between(line_begin_pos, line_begin_pos)
|
97
|
+
end
|
98
|
+
|
72
99
|
starts_with_space =
|
73
100
|
expr.source_buffer.source[line_begin_pos].start_with?(' ')
|
74
|
-
pos_to_remove = if column_delta.positive? || starts_with_space
|
75
|
-
line_begin_pos
|
76
|
-
else
|
77
|
-
line_begin_pos - column_delta.abs
|
78
|
-
end
|
79
101
|
|
80
|
-
|
102
|
+
if starts_with_space
|
103
|
+
range_between(line_begin_pos, line_begin_pos + column_delta.abs)
|
104
|
+
else
|
105
|
+
range_between(line_begin_pos - column_delta.abs, line_begin_pos)
|
106
|
+
end
|
81
107
|
end
|
82
108
|
|
83
109
|
def remove(range, corrector)
|
@@ -9,9 +9,9 @@ module RuboCop
|
|
9
9
|
offense_style, range = node
|
10
10
|
lambda do |corrector|
|
11
11
|
case offense_style
|
12
|
-
when :no_empty_lines
|
12
|
+
when :no_empty_lines
|
13
13
|
corrector.remove(range)
|
14
|
-
when :empty_lines
|
14
|
+
when :empty_lines
|
15
15
|
corrector.insert_before(range, "\n")
|
16
16
|
end
|
17
17
|
end
|
@@ -40,8 +40,8 @@ module RuboCop
|
|
40
40
|
range_with_surrounding_space(range: node.loc.end, side: :left)
|
41
41
|
)
|
42
42
|
|
43
|
-
corrector.
|
44
|
-
last_element_range_with_trailing_comma(node),
|
43
|
+
corrector.insert_before(
|
44
|
+
last_element_range_with_trailing_comma(node).end,
|
45
45
|
node.loc.end.source
|
46
46
|
)
|
47
47
|
end
|