rubocop 0.89.1 → 0.90.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 +1 -1
- data/config/default.yml +79 -11
- data/lib/rubocop.rb +13 -0
- data/lib/rubocop/cached_data.rb +1 -0
- data/lib/rubocop/cli/command.rb +1 -0
- data/lib/rubocop/cli/command/auto_genenerate_config.rb +1 -0
- data/lib/rubocop/cli/command/base.rb +1 -0
- data/lib/rubocop/cli/command/execute_runner.rb +1 -0
- data/lib/rubocop/cli/command/init_dotfile.rb +1 -0
- data/lib/rubocop/cli/command/show_cops.rb +1 -0
- data/lib/rubocop/cli/command/version.rb +1 -0
- data/lib/rubocop/cli/environment.rb +1 -0
- data/lib/rubocop/comment_config.rb +5 -0
- data/lib/rubocop/config_loader.rb +17 -6
- data/lib/rubocop/config_loader_resolver.rb +1 -0
- data/lib/rubocop/config_obsoletion.rb +1 -0
- data/lib/rubocop/config_validator.rb +3 -0
- data/lib/rubocop/cop/base.rb +23 -0
- data/lib/rubocop/cop/bundler/gem_comment.rb +7 -3
- data/lib/rubocop/cop/commissioner.rb +47 -7
- data/lib/rubocop/cop/correctors/alignment_corrector.rb +4 -4
- data/lib/rubocop/cop/correctors/condition_corrector.rb +3 -5
- data/lib/rubocop/cop/correctors/empty_line_corrector.rb +9 -10
- data/lib/rubocop/cop/correctors/line_break_corrector.rb +2 -2
- data/lib/rubocop/cop/correctors/multiline_literal_brace_corrector.rb +8 -3
- data/lib/rubocop/cop/correctors/parentheses_corrector.rb +5 -8
- data/lib/rubocop/cop/correctors/percent_literal_corrector.rb +4 -9
- data/lib/rubocop/cop/correctors/punctuation_corrector.rb +8 -10
- data/lib/rubocop/cop/documentation.rb +22 -0
- data/lib/rubocop/cop/generator.rb +1 -0
- data/lib/rubocop/cop/layout/block_alignment.rb +23 -19
- data/lib/rubocop/cop/layout/class_structure.rb +10 -9
- data/lib/rubocop/cop/layout/closing_heredoc_indentation.rb +4 -6
- data/lib/rubocop/cop/layout/condition_position.rb +13 -15
- data/lib/rubocop/cop/layout/def_end_alignment.rb +7 -4
- data/lib/rubocop/cop/layout/dot_position.rb +21 -17
- data/lib/rubocop/cop/layout/empty_comment.rb +30 -23
- data/lib/rubocop/cop/layout/empty_line_after_guard_clause.rb +19 -16
- data/lib/rubocop/cop/layout/empty_line_after_magic_comment.rb +13 -13
- data/lib/rubocop/cop/layout/empty_line_after_multiline_condition.rb +144 -0
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +21 -23
- data/lib/rubocop/cop/layout/empty_lines.rb +6 -7
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +4 -6
- data/lib/rubocop/cop/layout/empty_lines_around_arguments.rb +7 -8
- data/lib/rubocop/cop/layout/empty_lines_around_attribute_accessor.rb +3 -6
- data/lib/rubocop/cop/layout/empty_lines_around_begin_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_block_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_class_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +2 -5
- data/lib/rubocop/cop/layout/empty_lines_around_module_body.rb +2 -5
- data/lib/rubocop/cop/layout/end_alignment.rb +6 -7
- data/lib/rubocop/cop/layout/first_array_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_hash_element_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/first_method_argument_line_break.rb +4 -8
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +2 -5
- data/lib/rubocop/cop/layout/hash_alignment.rb +17 -20
- data/lib/rubocop/cop/layout/heredoc_argument_closing_parenthesis.rb +15 -14
- data/lib/rubocop/cop/layout/heredoc_indentation.rb +14 -11
- data/lib/rubocop/cop/layout/initial_indentation.rb +6 -7
- data/lib/rubocop/cop/layout/leading_comment_space.rb +11 -9
- data/lib/rubocop/cop/layout/leading_empty_lines.rb +6 -11
- data/lib/rubocop/cop/layout/multiline_array_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_array_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_assignment_layout.rb +10 -14
- data/lib/rubocop/cop/layout/multiline_block_layout.rb +21 -19
- data/lib/rubocop/cop/layout/multiline_hash_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_hash_key_line_breaks.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_argument_line_breaks.rb +5 -9
- data/lib/rubocop/cop/layout/multiline_method_call_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +2 -5
- data/lib/rubocop/cop/layout/rescue_ensure_alignment.rb +18 -21
- data/lib/rubocop/cop/layout/space_after_colon.rb +11 -7
- data/lib/rubocop/cop/layout/space_after_comma.rb +2 -5
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -6
- data/lib/rubocop/cop/layout/space_after_not.rb +9 -11
- data/lib/rubocop/cop/layout/space_after_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_around_equals_in_parameter_default.rb +20 -15
- data/lib/rubocop/cop/layout/space_around_keyword.rb +17 -18
- data/lib/rubocop/cop/layout/space_around_operators.rb +17 -16
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +23 -22
- data/lib/rubocop/cop/layout/space_before_comma.rb +3 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +10 -7
- data/lib/rubocop/cop/layout/space_before_first_arg.rb +7 -7
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +2 -5
- data/lib/rubocop/cop/layout/space_in_lambda_literal.rb +9 -17
- data/lib/rubocop/cop/layout/space_inside_array_literal_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +3 -8
- data/lib/rubocop/cop/layout/space_inside_block_braces.rb +17 -16
- data/lib/rubocop/cop/layout/space_inside_hash_literal_braces.rb +16 -19
- data/lib/rubocop/cop/layout/space_inside_parens.rb +9 -14
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +5 -10
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +8 -17
- data/lib/rubocop/cop/layout/space_inside_reference_brackets.rb +13 -16
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +10 -11
- data/lib/rubocop/cop/layout/trailing_empty_lines.rb +10 -15
- data/lib/rubocop/cop/layout/trailing_whitespace.rb +11 -11
- data/lib/rubocop/cop/lint/binary_operator_with_identical_operands.rb +1 -1
- data/lib/rubocop/cop/lint/constant_resolution.rb +1 -1
- data/lib/rubocop/cop/lint/duplicate_require.rb +41 -0
- data/lib/rubocop/cop/lint/duplicate_rescue_exception.rb +0 -11
- data/lib/rubocop/cop/lint/empty_file.rb +53 -0
- data/lib/rubocop/cop/lint/missing_super.rb +2 -2
- data/lib/rubocop/cop/lint/mixed_regexp_capture_types.rb +2 -35
- data/lib/rubocop/cop/lint/out_of_range_regexp_ref.rb +9 -19
- data/lib/rubocop/cop/lint/percent_string_array.rb +8 -12
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +4 -4
- data/lib/rubocop/cop/lint/top_level_return_with_argument.rb +1 -1
- data/lib/rubocop/cop/lint/trailing_comma_in_attribute_declaration.rb +57 -0
- data/lib/rubocop/cop/lint/useless_method_definition.rb +77 -0
- data/lib/rubocop/cop/metrics/utils/abc_size_calculator.rb +2 -0
- data/lib/rubocop/cop/metrics/utils/code_length_calculator.rb +1 -0
- data/lib/rubocop/cop/mixin/alignment.rb +3 -0
- data/lib/rubocop/cop/mixin/allowed_methods.rb +2 -0
- data/lib/rubocop/cop/mixin/annotation_comment.rb +5 -0
- data/lib/rubocop/cop/mixin/check_line_breakable.rb +16 -7
- data/lib/rubocop/cop/mixin/comments_help.rb +54 -0
- data/lib/rubocop/cop/mixin/empty_lines_around_body.rb +8 -7
- data/lib/rubocop/cop/mixin/empty_parameter.rb +3 -1
- data/lib/rubocop/cop/mixin/end_keyword_alignment.rb +3 -1
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +3 -1
- data/lib/rubocop/cop/mixin/hash_transform_method.rb +17 -0
- data/lib/rubocop/cop/mixin/multiline_element_line_breaks.rb +3 -1
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +12 -10
- data/lib/rubocop/cop/mixin/negative_conditional.rb +2 -2
- data/lib/rubocop/cop/mixin/percent_array.rb +14 -3
- data/lib/rubocop/cop/mixin/regexp_literal_help.rb +1 -1
- data/lib/rubocop/cop/mixin/rescue_node.rb +10 -1
- data/lib/rubocop/cop/mixin/space_after_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/space_before_punctuation.rb +4 -3
- data/lib/rubocop/cop/mixin/surrounding_space.rb +8 -4
- data/lib/rubocop/cop/mixin/trailing_comma.rb +7 -7
- data/lib/rubocop/cop/offense.rb +1 -0
- data/lib/rubocop/cop/severity.rb +0 -8
- data/lib/rubocop/cop/style/case_equality.rb +8 -3
- data/lib/rubocop/cop/style/case_like_if.rb +20 -4
- data/lib/rubocop/cop/style/class_methods_definitions.rb +131 -0
- data/lib/rubocop/cop/style/combinable_loops.rb +89 -0
- data/lib/rubocop/cop/style/empty_block_parameter.rb +9 -10
- data/lib/rubocop/cop/style/empty_lambda_parameter.rb +9 -10
- data/lib/rubocop/cop/style/guard_clause.rb +1 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +6 -5
- data/lib/rubocop/cop/style/hash_transform_keys.rb +14 -1
- data/lib/rubocop/cop/style/hash_transform_values.rb +14 -1
- data/lib/rubocop/cop/style/if_unless_modifier.rb +2 -2
- data/lib/rubocop/cop/style/keyword_parameters_order.rb +58 -0
- data/lib/rubocop/cop/style/method_called_on_do_end_block.rb +10 -1
- data/lib/rubocop/cop/style/multiline_when_then.rb +2 -2
- data/lib/rubocop/cop/style/negated_if.rb +6 -6
- data/lib/rubocop/cop/style/negated_unless.rb +6 -6
- data/lib/rubocop/cop/style/negated_while.rb +7 -15
- data/lib/rubocop/cop/style/nested_modifier.rb +10 -13
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +11 -11
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +14 -16
- data/lib/rubocop/cop/style/next.rb +10 -14
- data/lib/rubocop/cop/style/nil_comparison.rb +11 -11
- data/lib/rubocop/cop/style/non_nil_check.rb +32 -26
- data/lib/rubocop/cop/style/not.rb +19 -26
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +4 -9
- data/lib/rubocop/cop/style/numeric_predicate.rb +4 -11
- data/lib/rubocop/cop/style/one_line_conditional.rb +71 -23
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -1
- data/lib/rubocop/cop/style/or_assignment.rb +13 -10
- data/lib/rubocop/cop/style/parallel_assignment.rb +14 -14
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +6 -6
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +13 -19
- data/lib/rubocop/cop/style/percent_q_literals.rb +8 -10
- data/lib/rubocop/cop/style/perl_backrefs.rb +8 -10
- data/lib/rubocop/cop/style/preferred_hash_methods.rb +9 -14
- data/lib/rubocop/cop/style/proc.rb +6 -6
- data/lib/rubocop/cop/style/raise_args.rb +13 -24
- data/lib/rubocop/cop/style/random_with_offset.rb +15 -16
- data/lib/rubocop/cop/style/redundant_assignment.rb +8 -10
- data/lib/rubocop/cop/style/redundant_begin.rb +7 -9
- data/lib/rubocop/cop/style/redundant_capital_w.rb +6 -9
- data/lib/rubocop/cop/style/redundant_condition.rb +5 -6
- data/lib/rubocop/cop/style/redundant_fetch_block.rb +3 -12
- data/lib/rubocop/cop/style/redundant_file_extension_in_require.rb +8 -8
- data/lib/rubocop/cop/style/redundant_freeze.rb +3 -6
- data/lib/rubocop/cop/style/redundant_interpolation.rb +25 -24
- data/lib/rubocop/cop/style/redundant_parentheses.rb +7 -9
- data/lib/rubocop/cop/style/redundant_regexp_character_class.rb +6 -13
- data/lib/rubocop/cop/style/redundant_regexp_escape.rb +5 -14
- data/lib/rubocop/cop/style/redundant_self.rb +2 -2
- data/lib/rubocop/cop/style/redundant_self_assignment.rb +116 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +10 -21
- data/lib/rubocop/cop/style/rescue_modifier.rb +29 -9
- data/lib/rubocop/cop/style/return_nil.rb +5 -5
- data/lib/rubocop/cop/style/safe_navigation.rb +13 -12
- data/lib/rubocop/cop/style/sample.rb +10 -13
- data/lib/rubocop/cop/style/self_assignment.rb +26 -22
- data/lib/rubocop/cop/style/semicolon.rb +6 -9
- data/lib/rubocop/cop/style/send.rb +2 -2
- data/lib/rubocop/cop/style/signal_exception.rb +21 -19
- data/lib/rubocop/cop/style/single_line_block_params.rb +4 -2
- data/lib/rubocop/cop/style/single_line_methods.rb +17 -16
- data/lib/rubocop/cop/style/slicing_with_range.rb +4 -7
- data/lib/rubocop/cop/style/sole_nested_conditional.rb +66 -0
- data/lib/rubocop/cop/style/special_global_vars.rb +10 -15
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -21
- data/lib/rubocop/cop/style/stderr_puts.rb +4 -6
- data/lib/rubocop/cop/style/string_hash_keys.rb +6 -7
- data/lib/rubocop/cop/style/string_methods.rb +7 -17
- data/lib/rubocop/cop/style/strip.rb +8 -14
- data/lib/rubocop/cop/style/struct_inheritance.rb +3 -6
- data/lib/rubocop/cop/style/symbol_array.rb +5 -16
- data/lib/rubocop/cop/style/symbol_literal.rb +4 -6
- data/lib/rubocop/cop/style/symbol_proc.rb +14 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +21 -20
- data/lib/rubocop/cop/style/trailing_body_on_class.rb +3 -6
- data/lib/rubocop/cop/style/trailing_body_on_method_definition.rb +4 -7
- data/lib/rubocop/cop/style/trailing_body_on_module.rb +3 -6
- data/lib/rubocop/cop/style/trailing_comma_in_arguments.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_array_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_comma_in_block_args.rb +7 -6
- data/lib/rubocop/cop/style/trailing_comma_in_hash_literal.rb +2 -5
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +8 -17
- data/lib/rubocop/cop/style/trivial_accessors.rb +26 -30
- data/lib/rubocop/cop/style/unless_else.rb +5 -8
- data/lib/rubocop/cop/style/unpack_first.rb +4 -8
- data/lib/rubocop/cop/style/variable_interpolation.rb +7 -10
- data/lib/rubocop/cop/style/when_then.rb +4 -6
- data/lib/rubocop/cop/style/while_until_do.rb +6 -16
- data/lib/rubocop/cop/style/while_until_modifier.rb +6 -20
- data/lib/rubocop/cop/style/word_array.rb +5 -23
- data/lib/rubocop/cop/style/yoda_condition.rb +4 -15
- data/lib/rubocop/cop/style/zero_length_predicate.rb +11 -13
- data/lib/rubocop/cop/team.rb +1 -0
- data/lib/rubocop/cop/util.rb +1 -1
- data/lib/rubocop/cop/utils/format_string.rb +3 -5
- data/lib/rubocop/cop/variable_force.rb +2 -0
- data/lib/rubocop/cops_documentation_generator.rb +4 -2
- data/lib/rubocop/core_ext/string.rb +1 -1
- data/lib/rubocop/ext/regexp_node.rb +46 -0
- data/lib/rubocop/file_finder.rb +1 -0
- data/lib/rubocop/formatter/auto_gen_config_formatter.rb +2 -1
- data/lib/rubocop/formatter/html_formatter.rb +2 -0
- data/lib/rubocop/formatter/progress_formatter.rb +2 -1
- data/lib/rubocop/formatter/quiet_formatter.rb +1 -1
- data/lib/rubocop/formatter/simple_text_formatter.rb +36 -6
- data/lib/rubocop/name_similarity.rb +1 -0
- data/lib/rubocop/options.rb +3 -0
- data/lib/rubocop/remote_config.rb +1 -0
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +4 -1
- data/lib/rubocop/rspec/expect_offense.rb +10 -5
- data/lib/rubocop/rspec/shared_contexts.rb +12 -0
- data/lib/rubocop/runner.rb +1 -0
- data/lib/rubocop/string_interpreter.rb +3 -0
- data/lib/rubocop/target_finder.rb +1 -0
- data/lib/rubocop/target_ruby.rb +6 -0
- data/lib/rubocop/version.rb +2 -1
- data/lib/rubocop/yaml_duplication_checker.rb +1 -0
- metadata +15 -2
@@ -133,8 +133,9 @@ module RuboCop
|
|
133
133
|
# end
|
134
134
|
#
|
135
135
|
# @see https://rubystyle.guide#consistent-classes
|
136
|
-
class ClassStructure <
|
136
|
+
class ClassStructure < Base
|
137
137
|
include VisibilityHelp
|
138
|
+
extend AutoCorrector
|
138
139
|
|
139
140
|
HUMANIZED_NODE_TYPE = {
|
140
141
|
casgn: :constants,
|
@@ -155,14 +156,18 @@ module RuboCop
|
|
155
156
|
if index < previous
|
156
157
|
message = format(MSG, category: category,
|
157
158
|
previous: expected_order[previous])
|
158
|
-
add_offense(node, message: message)
|
159
|
+
add_offense(node, message: message) do |corrector|
|
160
|
+
autocorrect(corrector, node)
|
161
|
+
end
|
159
162
|
end
|
160
163
|
previous = index
|
161
164
|
end
|
162
165
|
end
|
163
166
|
|
167
|
+
private
|
168
|
+
|
164
169
|
# Autocorrect by swapping between two nodes autocorrecting them
|
165
|
-
def autocorrect(node)
|
170
|
+
def autocorrect(corrector, node)
|
166
171
|
node_classification = classify(node)
|
167
172
|
previous = left_siblings_of(node).find do |sibling|
|
168
173
|
classification = classify(sibling)
|
@@ -172,14 +177,10 @@ module RuboCop
|
|
172
177
|
current_range = source_range_with_comment(node)
|
173
178
|
previous_range = source_range_with_comment(previous)
|
174
179
|
|
175
|
-
|
176
|
-
|
177
|
-
corrector.remove(current_range)
|
178
|
-
end
|
180
|
+
corrector.insert_before(previous_range, current_range.source)
|
181
|
+
corrector.remove(current_range)
|
179
182
|
end
|
180
183
|
|
181
|
-
private
|
182
|
-
|
183
184
|
# Classifies a node to match with something in the {expected_order}
|
184
185
|
# @param node to be analysed
|
185
186
|
# @return String when the node type is a `:block` then
|
@@ -46,8 +46,9 @@ module RuboCop
|
|
46
46
|
# Hi
|
47
47
|
# EOS
|
48
48
|
#
|
49
|
-
class ClosingHeredocIndentation <
|
49
|
+
class ClosingHeredocIndentation < Base
|
50
50
|
include Heredoc
|
51
|
+
extend AutoCorrector
|
51
52
|
|
52
53
|
SIMPLE_HEREDOC = '<<'
|
53
54
|
MSG = '`%<closing>s` is not aligned with `%<opening>s`.'
|
@@ -59,11 +60,8 @@ module RuboCop
|
|
59
60
|
opening_indentation(node) == closing_indentation(node) ||
|
60
61
|
argument_indentation_correct?(node)
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
def autocorrect(node)
|
66
|
-
lambda do |corrector|
|
63
|
+
message = message(node)
|
64
|
+
add_offense(node.loc.heredoc_end, message: message) do |corrector|
|
67
65
|
corrector.replace(node.loc.heredoc_end, indented_end(node))
|
68
66
|
end
|
69
67
|
end
|
@@ -22,8 +22,9 @@ module RuboCop
|
|
22
22
|
# if some_condition
|
23
23
|
# do_something
|
24
24
|
# end
|
25
|
-
class ConditionPosition <
|
25
|
+
class ConditionPosition < Base
|
26
26
|
include RangeHelp
|
27
|
+
extend AutoCorrector
|
27
28
|
|
28
29
|
MSG = 'Place the condition on the same line as `%<keyword>s`.'
|
29
30
|
|
@@ -38,27 +39,24 @@ module RuboCop
|
|
38
39
|
end
|
39
40
|
alias on_until on_while
|
40
41
|
|
41
|
-
def autocorrect(node)
|
42
|
-
lambda do |corrector|
|
43
|
-
range = range_by_whole_lines(
|
44
|
-
node.source_range, include_final_newline: true
|
45
|
-
)
|
46
|
-
|
47
|
-
corrector.insert_after(node.parent.loc.keyword, " #{node.source}")
|
48
|
-
corrector.remove(range)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
42
|
private
|
53
43
|
|
54
44
|
def check(node)
|
55
45
|
return if node.modifier_form? || node.single_line_condition?
|
56
46
|
|
57
|
-
|
47
|
+
condition = node.condition
|
48
|
+
message = message(condition)
|
49
|
+
|
50
|
+
add_offense(condition, message: message) do |corrector|
|
51
|
+
range = range_by_whole_lines(condition.source_range, include_final_newline: true)
|
52
|
+
|
53
|
+
corrector.insert_after(condition.parent.loc.keyword, " #{condition.source}")
|
54
|
+
corrector.remove(range)
|
55
|
+
end
|
58
56
|
end
|
59
57
|
|
60
|
-
def message(
|
61
|
-
format(MSG, keyword:
|
58
|
+
def message(condition)
|
59
|
+
format(MSG, keyword: condition.parent.keyword)
|
62
60
|
end
|
63
61
|
end
|
64
62
|
end
|
@@ -33,9 +33,10 @@ module RuboCop
|
|
33
33
|
#
|
34
34
|
# private def foo
|
35
35
|
# end
|
36
|
-
class DefEndAlignment <
|
36
|
+
class DefEndAlignment < Base
|
37
37
|
include EndKeywordAlignment
|
38
38
|
include RangeHelp
|
39
|
+
extend AutoCorrector
|
39
40
|
|
40
41
|
MSG = '`end` at %d, %d is not aligned with `%s` at %d, %d.'
|
41
42
|
|
@@ -61,11 +62,13 @@ module RuboCop
|
|
61
62
|
ignore_node(method_def) # Don't check the same `end` again.
|
62
63
|
end
|
63
64
|
|
64
|
-
|
65
|
+
private
|
66
|
+
|
67
|
+
def autocorrect(corrector, node)
|
65
68
|
if style == :start_of_line && node.parent && node.parent.send_type?
|
66
|
-
AlignmentCorrector.align_end(processed_source, node, node.parent)
|
69
|
+
AlignmentCorrector.align_end(corrector, processed_source, node, node.parent)
|
67
70
|
else
|
68
|
-
AlignmentCorrector.align_end(processed_source, node, node)
|
71
|
+
AlignmentCorrector.align_end(corrector, processed_source, node, node)
|
69
72
|
end
|
70
73
|
end
|
71
74
|
end
|
@@ -22,8 +22,9 @@ module RuboCop
|
|
22
22
|
# # good
|
23
23
|
# something.
|
24
24
|
# method
|
25
|
-
class DotPosition <
|
25
|
+
class DotPosition < Base
|
26
26
|
include ConfigurableEnforcedStyle
|
27
|
+
extend AutoCorrector
|
27
28
|
|
28
29
|
def on_send(node)
|
29
30
|
return unless node.dot? || ampersand_dot?(node)
|
@@ -31,29 +32,32 @@ module RuboCop
|
|
31
32
|
if proper_dot_position?(node)
|
32
33
|
correct_style_detected
|
33
34
|
else
|
34
|
-
|
35
|
-
end
|
36
|
-
end
|
37
|
-
alias on_csend on_send
|
35
|
+
return unless opposite_style_detected
|
38
36
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
when :leading
|
45
|
-
corrector.insert_before(selector_range(node), dot)
|
46
|
-
when :trailing
|
47
|
-
corrector.insert_after(node.receiver, dot)
|
37
|
+
dot = node.loc.dot
|
38
|
+
message = message(dot)
|
39
|
+
|
40
|
+
add_offense(dot, message: message) do |corrector|
|
41
|
+
autocorrect(corrector, dot, node)
|
48
42
|
end
|
49
43
|
end
|
50
44
|
end
|
45
|
+
alias on_csend on_send
|
51
46
|
|
52
47
|
private
|
53
48
|
|
54
|
-
def
|
55
|
-
|
56
|
-
|
49
|
+
def autocorrect(corrector, dot, node)
|
50
|
+
corrector.remove(dot)
|
51
|
+
case style
|
52
|
+
when :leading
|
53
|
+
corrector.insert_before(selector_range(node), dot.source)
|
54
|
+
when :trailing
|
55
|
+
corrector.insert_after(node.receiver, dot.source)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def message(dot)
|
60
|
+
"Place the #{dot.source} on the " +
|
57
61
|
case style
|
58
62
|
when :leading
|
59
63
|
'next line, together with the method name.'
|
@@ -60,47 +60,54 @@ module RuboCop
|
|
60
60
|
# class Foo
|
61
61
|
# end
|
62
62
|
#
|
63
|
-
class EmptyComment <
|
63
|
+
class EmptyComment < Base
|
64
64
|
include RangeHelp
|
65
|
+
extend AutoCorrector
|
65
66
|
|
66
67
|
MSG = 'Source code comment is empty.'
|
67
68
|
|
68
|
-
def
|
69
|
+
def on_new_investigation
|
69
70
|
if allow_margin_comment?
|
70
71
|
comments = concat_consecutive_comments(processed_source.comments)
|
71
72
|
|
72
|
-
comments
|
73
|
-
next unless empty_comment_only?(comment[0])
|
74
|
-
|
75
|
-
comment[1].each do |offense_comment|
|
76
|
-
add_offense(offense_comment)
|
77
|
-
end
|
78
|
-
end
|
73
|
+
investigate(comments)
|
79
74
|
else
|
80
75
|
processed_source.comments.each do |comment|
|
81
76
|
next unless empty_comment_only?(comment_text(comment))
|
82
77
|
|
83
|
-
add_offense(comment)
|
78
|
+
add_offense(comment) do |corrector|
|
79
|
+
autocorrect(corrector, comment)
|
80
|
+
end
|
84
81
|
end
|
85
82
|
end
|
86
83
|
end
|
87
84
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
corrector.remove(range)
|
85
|
+
private
|
86
|
+
|
87
|
+
def investigate(comments)
|
88
|
+
comments.each do |comment|
|
89
|
+
next unless empty_comment_only?(comment[0])
|
90
|
+
|
91
|
+
comment[1].each do |offense_comment|
|
92
|
+
add_offense(offense_comment) do |corrector|
|
93
|
+
autocorrect(corrector, offense_comment)
|
94
|
+
end
|
95
|
+
end
|
100
96
|
end
|
101
97
|
end
|
102
98
|
|
103
|
-
|
99
|
+
def autocorrect(corrector, node)
|
100
|
+
previous_token = previous_token(node)
|
101
|
+
range = if previous_token && node.loc.line == previous_token.line
|
102
|
+
range_with_surrounding_space(range: node.loc.expression,
|
103
|
+
newlines: false)
|
104
|
+
else
|
105
|
+
range_by_whole_lines(node.loc.expression,
|
106
|
+
include_final_newline: true)
|
107
|
+
end
|
108
|
+
|
109
|
+
corrector.remove(range)
|
110
|
+
end
|
104
111
|
|
105
112
|
def concat_consecutive_comments(comments)
|
106
113
|
consecutive_comments =
|
@@ -35,8 +35,9 @@ module RuboCop
|
|
35
35
|
# return if need_return?
|
36
36
|
# end
|
37
37
|
# end
|
38
|
-
class EmptyLineAfterGuardClause <
|
38
|
+
class EmptyLineAfterGuardClause < Base
|
39
39
|
include RangeHelp
|
40
|
+
extend AutoCorrector
|
40
41
|
|
41
42
|
MSG = 'Add empty line after guard clause.'
|
42
43
|
END_OF_HEREDOC_LINE = 1
|
@@ -49,27 +50,29 @@ module RuboCop
|
|
49
50
|
|
50
51
|
return if next_line_empty?(heredoc_line(node, heredoc_node))
|
51
52
|
|
52
|
-
add_offense(heredoc_node
|
53
|
+
add_offense(heredoc_node.loc.heredoc_end) do |corrector|
|
54
|
+
autocorrect(corrector, heredoc_node)
|
55
|
+
end
|
53
56
|
else
|
54
57
|
return if next_line_empty?(node.last_line)
|
55
58
|
|
56
|
-
add_offense(
|
59
|
+
add_offense(offense_location(node)) do |corrector|
|
60
|
+
autocorrect(corrector, node)
|
61
|
+
end
|
57
62
|
end
|
58
63
|
end
|
59
64
|
|
60
|
-
|
61
|
-
lambda do |corrector|
|
62
|
-
node_range = if node.respond_to?(:heredoc?) && node.heredoc?
|
63
|
-
range_by_whole_lines(node.loc.heredoc_body)
|
64
|
-
else
|
65
|
-
range_by_whole_lines(node.source_range)
|
66
|
-
end
|
65
|
+
private
|
67
66
|
|
68
|
-
|
69
|
-
|
70
|
-
|
67
|
+
def autocorrect(corrector, node)
|
68
|
+
node_range = if node.respond_to?(:heredoc?) && node.heredoc?
|
69
|
+
range_by_whole_lines(node.loc.heredoc_body)
|
70
|
+
else
|
71
|
+
range_by_whole_lines(node.source_range)
|
72
|
+
end
|
71
73
|
|
72
|
-
|
74
|
+
corrector.insert_after(node_range, "\n")
|
75
|
+
end
|
73
76
|
|
74
77
|
def correct_style?(node)
|
75
78
|
!contains_guard_clause?(node) ||
|
@@ -146,9 +149,9 @@ module RuboCop
|
|
146
149
|
|
147
150
|
def offense_location(node)
|
148
151
|
if node.loc.respond_to?(:end) && node.loc.end
|
149
|
-
|
152
|
+
node.loc.end
|
150
153
|
else
|
151
|
-
|
154
|
+
node
|
152
155
|
end
|
153
156
|
end
|
154
157
|
end
|
@@ -20,30 +20,30 @@ module RuboCop
|
|
20
20
|
# class Person
|
21
21
|
# # Some code
|
22
22
|
# end
|
23
|
-
class EmptyLineAfterMagicComment <
|
23
|
+
class EmptyLineAfterMagicComment < Base
|
24
24
|
include RangeHelp
|
25
|
+
extend AutoCorrector
|
25
26
|
|
26
27
|
MSG = 'Add an empty line after magic comments.'
|
27
28
|
|
28
|
-
def
|
29
|
-
return unless
|
30
|
-
(last_magic_comment = last_magic_comment(
|
31
|
-
return if
|
29
|
+
def on_new_investigation
|
30
|
+
return unless processed_source.ast &&
|
31
|
+
(last_magic_comment = last_magic_comment(processed_source))
|
32
|
+
return if processed_source[last_magic_comment.loc.line].strip.empty?
|
32
33
|
|
33
|
-
offending_range =
|
34
|
-
source_range(source.buffer, last_magic_comment.loc.line + 1, 0)
|
34
|
+
offending_range = offending_range(last_magic_comment)
|
35
35
|
|
36
|
-
add_offense(offending_range
|
37
|
-
|
38
|
-
|
39
|
-
def autocorrect(token)
|
40
|
-
lambda do |corrector|
|
41
|
-
corrector.insert_before(token, "\n")
|
36
|
+
add_offense(offending_range) do |corrector|
|
37
|
+
corrector.insert_before(offending_range, "\n")
|
42
38
|
end
|
43
39
|
end
|
44
40
|
|
45
41
|
private
|
46
42
|
|
43
|
+
def offending_range(last_magic_comment)
|
44
|
+
source_range(processed_source.buffer, last_magic_comment.loc.line + 1, 0)
|
45
|
+
end
|
46
|
+
|
47
47
|
# Find the last magic comment in the source file.
|
48
48
|
#
|
49
49
|
# Take all comments that precede the first line of code, select the
|
@@ -0,0 +1,144 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Layout
|
6
|
+
# This cop enforces empty line after multiline condition.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# if multiline &&
|
11
|
+
# condition
|
12
|
+
# do_something
|
13
|
+
# end
|
14
|
+
#
|
15
|
+
# # good
|
16
|
+
# if multiline &&
|
17
|
+
# condition
|
18
|
+
#
|
19
|
+
# do_something
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# case x
|
24
|
+
# when foo,
|
25
|
+
# bar
|
26
|
+
# do_something
|
27
|
+
# end
|
28
|
+
#
|
29
|
+
# # good
|
30
|
+
# case x
|
31
|
+
# when foo,
|
32
|
+
# bar
|
33
|
+
#
|
34
|
+
# do_something
|
35
|
+
# end
|
36
|
+
#
|
37
|
+
# # bad
|
38
|
+
# begin
|
39
|
+
# do_something
|
40
|
+
# rescue FooError,
|
41
|
+
# BarError
|
42
|
+
# handle_error
|
43
|
+
# end
|
44
|
+
#
|
45
|
+
# # good
|
46
|
+
# begin
|
47
|
+
# do_something
|
48
|
+
# rescue FooError,
|
49
|
+
# BarError
|
50
|
+
#
|
51
|
+
# handle_error
|
52
|
+
# end
|
53
|
+
#
|
54
|
+
class EmptyLineAfterMultilineCondition < Base
|
55
|
+
include RangeHelp
|
56
|
+
include RescueNode
|
57
|
+
extend AutoCorrector
|
58
|
+
|
59
|
+
MSG = 'Use empty line after multiline condition.'
|
60
|
+
|
61
|
+
def on_if(node)
|
62
|
+
return if node.ternary?
|
63
|
+
|
64
|
+
if node.modifier_form?
|
65
|
+
check_condition(node.condition) unless next_sibling_empty?(node)
|
66
|
+
else
|
67
|
+
check_condition(node.condition)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_while(node)
|
72
|
+
check_condition(node.condition)
|
73
|
+
end
|
74
|
+
alias on_until on_while
|
75
|
+
|
76
|
+
def on_while_post(node)
|
77
|
+
return if next_sibling_empty?(node)
|
78
|
+
|
79
|
+
check_condition(node.condition)
|
80
|
+
end
|
81
|
+
alias on_until_post on_while_post
|
82
|
+
|
83
|
+
def on_case(node)
|
84
|
+
node.each_when do |when_node|
|
85
|
+
last_condition = when_node.conditions.last
|
86
|
+
|
87
|
+
next if !multiline_when_condition?(when_node) ||
|
88
|
+
next_line_empty?(last_condition.last_line)
|
89
|
+
|
90
|
+
add_offense(when_node, &autocorrect(last_condition))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def on_rescue(node)
|
95
|
+
_body, *resbodies, _else = *node
|
96
|
+
|
97
|
+
resbodies.each do |resbody|
|
98
|
+
rescued_exceptions = rescued_exceptions(resbody)
|
99
|
+
next if !multiline_rescue_exceptions?(rescued_exceptions) ||
|
100
|
+
next_line_empty?(rescued_exceptions.last.last_line)
|
101
|
+
|
102
|
+
add_offense(resbody, &autocorrect(rescued_exceptions.last))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
private
|
107
|
+
|
108
|
+
def check_condition(condition)
|
109
|
+
return unless condition.multiline?
|
110
|
+
return if next_line_empty?(condition.last_line)
|
111
|
+
|
112
|
+
add_offense(condition, &autocorrect(condition))
|
113
|
+
end
|
114
|
+
|
115
|
+
def next_line_empty?(line)
|
116
|
+
processed_source[line].blank?
|
117
|
+
end
|
118
|
+
|
119
|
+
def next_sibling_empty?(node)
|
120
|
+
next_sibling = node.parent.children[node.sibling_index + 1]
|
121
|
+
next_sibling.nil?
|
122
|
+
end
|
123
|
+
|
124
|
+
def multiline_when_condition?(when_node)
|
125
|
+
when_node.conditions.first.first_line != when_node.conditions.last.last_line
|
126
|
+
end
|
127
|
+
|
128
|
+
def multiline_rescue_exceptions?(exception_nodes)
|
129
|
+
return false if exception_nodes.size <= 1
|
130
|
+
|
131
|
+
first, *_rest, last = *exception_nodes
|
132
|
+
first.first_line != last.last_line
|
133
|
+
end
|
134
|
+
|
135
|
+
def autocorrect(node)
|
136
|
+
lambda do |corrector|
|
137
|
+
range = range_by_whole_lines(node.source_range)
|
138
|
+
corrector.insert_after(range, "\n")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|