rubocop 0.49.1 → 0.50.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 +5 -3
- data/bin/rubocop +1 -1
- data/config/default.yml +160 -99
- data/config/disabled.yml +4 -5
- data/config/enabled.yml +149 -47
- data/lib/rubocop.rb +41 -14
- data/lib/rubocop/ast/builder.rb +4 -1
- data/lib/rubocop/ast/node.rb +36 -42
- data/lib/rubocop/ast/node/args_node.rb +1 -13
- data/lib/rubocop/ast/node/array_node.rb +9 -0
- data/lib/rubocop/ast/node/block_node.rb +9 -0
- data/lib/rubocop/ast/node/def_node.rb +71 -0
- data/lib/rubocop/ast/node/for_node.rb +8 -0
- data/lib/rubocop/ast/node/if_node.rb +10 -2
- data/lib/rubocop/ast/node/mixin/collection_node.rb +15 -0
- data/lib/rubocop/ast/node/mixin/method_dispatch_node.rb +174 -0
- data/lib/rubocop/ast/node/mixin/method_identifier_predicates.rb +89 -0
- data/lib/rubocop/ast/node/mixin/parameterized_node.rb +18 -31
- data/lib/rubocop/ast/node/regexp_node.rb +35 -0
- data/lib/rubocop/ast/node/send_node.rb +1 -154
- data/lib/rubocop/ast/node/super_node.rb +3 -24
- data/lib/rubocop/ast/node/yield_node.rb +21 -0
- data/lib/rubocop/ast/traversal.rb +6 -6
- data/lib/rubocop/cli.rb +7 -3
- data/lib/rubocop/config.rb +45 -8
- data/lib/rubocop/config_loader.rb +7 -5
- data/lib/rubocop/cop/bundler/duplicated_gem.rb +3 -3
- data/lib/rubocop/cop/bundler/insecure_protocol_source.rb +64 -0
- data/lib/rubocop/cop/bundler/ordered_gems.rb +12 -12
- data/lib/rubocop/cop/commissioner.rb +8 -2
- data/lib/rubocop/cop/cop.rb +3 -1
- data/lib/rubocop/cop/generator.rb +94 -21
- data/lib/rubocop/cop/internal_affairs.rb +3 -0
- data/lib/rubocop/cop/internal_affairs/node_type_predicate.rb +14 -3
- data/lib/rubocop/cop/internal_affairs/offense_location_keyword.rb +43 -0
- data/lib/rubocop/cop/internal_affairs/redundant_location_argument.rb +46 -0
- data/lib/rubocop/cop/internal_affairs/redundant_message_argument.rb +49 -0
- data/lib/rubocop/cop/internal_affairs/useless_message_assertion.rb +1 -1
- data/lib/rubocop/cop/layout/access_modifier_indentation.rb +2 -3
- data/lib/rubocop/cop/layout/align_array.rb +2 -2
- data/lib/rubocop/cop/layout/align_hash.rb +2 -2
- data/lib/rubocop/cop/layout/align_parameters.rb +5 -11
- data/lib/rubocop/cop/layout/closing_parenthesis_indentation.rb +5 -5
- data/lib/rubocop/cop/layout/comment_indentation.rb +1 -1
- data/lib/rubocop/cop/layout/dot_position.rb +9 -0
- data/lib/rubocop/cop/layout/else_alignment.rb +30 -13
- data/lib/rubocop/cop/layout/empty_line_between_defs.rb +4 -0
- data/lib/rubocop/cop/layout/empty_lines_around_access_modifier.rb +20 -4
- data/lib/rubocop/cop/layout/empty_lines_around_exception_handling_keywords.rb +3 -3
- data/lib/rubocop/cop/layout/empty_lines_around_method_body.rb +3 -3
- data/lib/rubocop/cop/layout/first_method_parameter_line_break.rb +3 -3
- data/lib/rubocop/cop/layout/first_parameter_indentation.rb +5 -2
- data/lib/rubocop/cop/layout/indent_heredoc.rb +19 -24
- data/lib/rubocop/cop/layout/indentation_consistency.rb +1 -2
- data/lib/rubocop/cop/layout/indentation_width.rb +12 -8
- data/lib/rubocop/cop/layout/leading_comment_space.rb +33 -18
- data/lib/rubocop/cop/layout/multiline_method_call_indentation.rb +20 -17
- data/lib/rubocop/cop/layout/multiline_method_definition_brace_layout.rb +3 -3
- data/lib/rubocop/cop/layout/multiline_operation_indentation.rb +6 -0
- data/lib/rubocop/cop/layout/space_after_colon.rb +7 -0
- data/lib/rubocop/cop/layout/space_after_comma.rb +10 -0
- data/lib/rubocop/cop/layout/space_after_method_name.rb +5 -3
- data/lib/rubocop/cop/layout/space_after_not.rb +1 -1
- data/lib/rubocop/cop/layout/space_around_block_parameters.rb +13 -4
- data/lib/rubocop/cop/layout/space_around_keyword.rb +9 -5
- data/lib/rubocop/cop/layout/space_before_block_braces.rb +54 -5
- data/lib/rubocop/cop/layout/space_before_comment.rb +7 -0
- data/lib/rubocop/cop/layout/space_before_semicolon.rb +7 -0
- data/lib/rubocop/cop/layout/space_inside_array_percent_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_range_literal.rb +1 -1
- data/lib/rubocop/cop/layout/space_inside_string_interpolation.rb +8 -4
- data/lib/rubocop/cop/layout/tab.rb +1 -1
- data/lib/rubocop/cop/lint/ambiguous_block_association.rb +4 -2
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +15 -1
- data/lib/rubocop/cop/lint/block_alignment.rb +15 -6
- data/lib/rubocop/cop/lint/boolean_symbol.rb +38 -0
- data/lib/rubocop/cop/lint/condition_position.rb +5 -1
- data/lib/rubocop/cop/lint/debugger.rb +16 -9
- data/lib/rubocop/cop/lint/def_end_alignment.rb +4 -4
- data/lib/rubocop/cop/lint/duplicate_case_condition.rb +3 -3
- data/lib/rubocop/cop/lint/duplicate_methods.rb +73 -5
- data/lib/rubocop/cop/lint/duplicated_key.rb +1 -1
- data/lib/rubocop/cop/lint/each_with_object_argument.rb +1 -1
- data/lib/rubocop/cop/lint/else_layout.rb +1 -1
- data/lib/rubocop/cop/lint/empty_expression.rb +1 -1
- data/lib/rubocop/cop/lint/empty_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/empty_when.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/float_out_of_range.rb +5 -5
- data/lib/rubocop/cop/lint/format_parameter_mismatch.rb +35 -40
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
- data/lib/rubocop/cop/lint/ineffective_access_modifier.rb +18 -13
- data/lib/rubocop/cop/lint/inherit_exception.rb +8 -7
- data/lib/rubocop/cop/lint/interpolation_check.rb +36 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +3 -3
- data/lib/rubocop/cop/lint/literal_in_interpolation.rb +1 -1
- data/lib/rubocop/cop/lint/multiple_compare.rb +1 -1
- data/lib/rubocop/cop/lint/nested_method_definition.rb +5 -7
- data/lib/rubocop/cop/lint/next_without_accumulator.rb +1 -1
- data/lib/rubocop/cop/lint/percent_string_array.rb +3 -12
- data/lib/rubocop/cop/lint/percent_symbol_array.rb +1 -1
- data/lib/rubocop/cop/lint/rand_one.rb +7 -1
- data/lib/rubocop/cop/lint/redundant_with_index.rb +77 -0
- data/lib/rubocop/cop/lint/require_parentheses.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_type.rb +13 -6
- data/lib/rubocop/cop/lint/rescue_without_error_class.rb +38 -0
- data/lib/rubocop/cop/lint/return_in_void_context.rb +63 -0
- data/lib/rubocop/cop/lint/script_permission.rb +6 -0
- data/lib/rubocop/cop/lint/syntax.rb +17 -20
- data/lib/rubocop/cop/lint/unified_integer.rb +3 -2
- data/lib/rubocop/cop/lint/unneeded_disable.rb +1 -1
- data/lib/rubocop/cop/lint/unneeded_splat_expansion.rb +1 -1
- data/lib/rubocop/cop/lint/unreachable_code.rb +53 -8
- data/lib/rubocop/cop/lint/uri_escape_unescape.rb +74 -0
- data/lib/rubocop/cop/lint/uri_regexp.rb +73 -0
- data/lib/rubocop/cop/lint/useless_access_modifier.rb +4 -8
- data/lib/rubocop/cop/lint/useless_setter_call.rb +10 -11
- data/lib/rubocop/cop/lint/void.rb +29 -23
- data/lib/rubocop/cop/metrics/line_length.rb +2 -2
- data/lib/rubocop/cop/metrics/method_length.rb +8 -3
- data/lib/rubocop/cop/metrics/parameter_lists.rb +5 -2
- data/lib/rubocop/cop/mixin/autocorrect_alignment.rb +1 -1
- data/lib/rubocop/cop/mixin/enforce_superclass.rb +2 -2
- data/lib/rubocop/cop/mixin/first_element_line_break.rb +12 -3
- data/lib/rubocop/cop/mixin/heredoc.rb +28 -0
- data/lib/rubocop/cop/mixin/method_complexity.rb +9 -6
- data/lib/rubocop/cop/mixin/multiline_expression_indentation.rb +68 -31
- data/lib/rubocop/cop/mixin/multiline_literal_brace_layout.rb +18 -0
- data/lib/rubocop/cop/mixin/negative_conditional.rb +1 -1
- data/lib/rubocop/cop/mixin/percent_array.rb +52 -0
- data/lib/rubocop/cop/mixin/string_help.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/accessor_method_name.rb +11 -12
- data/lib/rubocop/cop/{style → naming}/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/{style/op_method.rb → naming/binary_operator_parameter_name.rb} +2 -2
- data/lib/rubocop/cop/{style → naming}/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/constant_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/file_name.rb +8 -4
- data/lib/rubocop/cop/naming/heredoc_delimiter_case.rb +68 -0
- data/lib/rubocop/cop/naming/heredoc_delimiter_naming.rb +58 -0
- data/lib/rubocop/cop/{style → naming}/method_name.rb +1 -1
- data/lib/rubocop/cop/{style → naming}/predicate_name.rb +6 -7
- data/lib/rubocop/cop/{style → naming}/variable_name.rb +11 -15
- data/lib/rubocop/cop/{style → naming}/variable_number.rb +1 -1
- data/lib/rubocop/cop/performance/caller.rb +39 -11
- data/lib/rubocop/cop/performance/casecmp.rb +4 -4
- data/lib/rubocop/cop/performance/compare_with_block.rb +4 -4
- data/lib/rubocop/cop/performance/double_start_end_with.rb +4 -4
- data/lib/rubocop/cop/performance/end_with.rb +3 -3
- data/lib/rubocop/cop/performance/fixed_size.rb +1 -1
- data/lib/rubocop/cop/performance/hash_each_methods.rb +66 -25
- data/lib/rubocop/cop/performance/lstrip_rstrip.rb +2 -2
- data/lib/rubocop/cop/performance/range_include.rb +2 -2
- data/lib/rubocop/cop/performance/redundant_block_call.rb +6 -6
- data/lib/rubocop/cop/performance/redundant_match.rb +5 -5
- data/lib/rubocop/cop/performance/redundant_merge.rb +39 -23
- data/lib/rubocop/cop/performance/redundant_sort_by.rb +2 -2
- data/lib/rubocop/cop/performance/regexp_match.rb +13 -5
- data/lib/rubocop/cop/performance/size.rb +1 -1
- data/lib/rubocop/cop/performance/start_with.rb +3 -3
- data/lib/rubocop/cop/performance/times_map.rb +23 -12
- data/lib/rubocop/cop/performance/unfreeze_string.rb +50 -0
- data/lib/rubocop/cop/performance/uri_default_parser.rb +47 -0
- data/lib/rubocop/cop/rails/active_support_aliases.rb +1 -1
- data/lib/rubocop/cop/rails/delegate.rb +36 -7
- data/lib/rubocop/cop/rails/delegate_allow_blank.rb +1 -1
- data/lib/rubocop/cop/rails/enum_uniqueness.rb +2 -2
- data/lib/rubocop/cop/rails/file_path.rb +3 -4
- data/lib/rubocop/cop/rails/find_each.rb +1 -1
- data/lib/rubocop/cop/rails/has_many_or_has_one_dependent.rb +48 -0
- data/lib/rubocop/cop/rails/http_positional_arguments.rb +5 -5
- data/lib/rubocop/cop/rails/not_null_column.rb +1 -1
- data/lib/rubocop/cop/rails/pluralization_grammar.rb +2 -2
- data/lib/rubocop/cop/rails/relative_date_constant.rb +1 -1
- data/lib/rubocop/cop/rails/request_referer.rb +2 -2
- data/lib/rubocop/cop/rails/reversible_migration.rb +12 -12
- data/lib/rubocop/cop/rails/save_bang.rb +8 -6
- data/lib/rubocop/cop/rails/scope_args.rb +1 -1
- data/lib/rubocop/cop/security/eval.rb +2 -2
- data/lib/rubocop/cop/security/json_load.rb +2 -2
- data/lib/rubocop/cop/security/marshal_load.rb +2 -2
- data/lib/rubocop/cop/security/yaml_load.rb +2 -2
- data/lib/rubocop/cop/style/alias.rb +44 -20
- data/lib/rubocop/cop/style/and_or.rb +48 -34
- data/lib/rubocop/cop/style/auto_resource_cleanup.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +3 -1
- data/lib/rubocop/cop/style/block_delimiters.rb +2 -1
- data/lib/rubocop/cop/style/command_literal.rb +20 -9
- data/lib/rubocop/cop/style/conditional_assignment.rb +30 -28
- data/lib/rubocop/cop/style/copyright.rb +10 -10
- data/lib/rubocop/cop/style/def_with_parentheses.rb +6 -5
- data/lib/rubocop/cop/style/dir.rb +52 -0
- data/lib/rubocop/cop/style/documentation_method.rb +2 -6
- data/lib/rubocop/cop/style/empty_case_condition.rb +1 -1
- data/lib/rubocop/cop/style/empty_else.rb +3 -2
- data/lib/rubocop/cop/style/empty_literal.rb +1 -2
- data/lib/rubocop/cop/style/empty_method.rb +27 -17
- data/lib/rubocop/cop/style/flip_flop.rb +2 -2
- data/lib/rubocop/cop/style/frozen_string_literal_comment.rb +1 -1
- data/lib/rubocop/cop/style/guard_clause.rb +4 -2
- data/lib/rubocop/cop/style/hash_syntax.rb +10 -10
- data/lib/rubocop/cop/style/identical_conditional_branches.rb +5 -1
- data/lib/rubocop/cop/style/if_with_semicolon.rb +1 -1
- data/lib/rubocop/cop/style/implicit_runtime_error.rb +4 -3
- data/lib/rubocop/cop/style/inline_comment.rb +1 -1
- data/lib/rubocop/cop/style/inverse_methods.rb +20 -8
- data/lib/rubocop/cop/style/lambda.rb +19 -9
- data/lib/rubocop/cop/style/lambda_call.rb +22 -1
- data/lib/rubocop/cop/style/method_call_with_args_parentheses.rb +4 -20
- data/lib/rubocop/cop/style/method_call_without_args_parentheses.rb +6 -4
- data/lib/rubocop/cop/style/method_def_parentheses.rb +18 -26
- data/lib/rubocop/cop/style/method_missing.rb +5 -18
- data/lib/rubocop/cop/style/min_max.rb +67 -0
- data/lib/rubocop/cop/style/missing_else.rb +16 -3
- data/lib/rubocop/cop/style/mixin_grouping.rb +2 -2
- data/lib/rubocop/cop/style/module_function.rb +8 -4
- data/lib/rubocop/cop/style/multiline_if_modifier.rb +5 -1
- data/lib/rubocop/cop/style/multiline_memoization.rb +25 -3
- data/lib/rubocop/cop/style/multiline_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/multiple_comparison.rb +1 -1
- data/lib/rubocop/cop/style/mutable_constant.rb +2 -6
- data/lib/rubocop/cop/style/negated_if.rb +8 -4
- data/lib/rubocop/cop/style/nested_parenthesized_calls.rb +8 -8
- data/lib/rubocop/cop/style/nested_ternary_operator.rb +1 -1
- data/lib/rubocop/cop/style/non_nil_check.rb +14 -14
- data/lib/rubocop/cop/style/numeric_literal_prefix.rb +6 -2
- data/lib/rubocop/cop/style/numeric_literals.rb +2 -2
- data/lib/rubocop/cop/style/numeric_predicate.rb +8 -4
- data/lib/rubocop/cop/style/one_line_conditional.rb +8 -3
- data/lib/rubocop/cop/style/option_hash.rb +1 -1
- data/lib/rubocop/cop/style/optional_arguments.rb +1 -2
- data/lib/rubocop/cop/style/or_assignment.rb +88 -0
- data/lib/rubocop/cop/style/parallel_assignment.rb +2 -2
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +12 -11
- data/lib/rubocop/cop/style/percent_literal_delimiters.rb +1 -1
- data/lib/rubocop/cop/style/percent_q_literals.rb +2 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +1 -1
- data/lib/rubocop/cop/style/proc.rb +1 -1
- data/lib/rubocop/cop/style/raise_args.rb +16 -17
- data/lib/rubocop/cop/style/redundant_begin.rb +6 -5
- data/lib/rubocop/cop/style/redundant_conditional.rb +95 -0
- data/lib/rubocop/cop/style/redundant_freeze.rb +1 -1
- data/lib/rubocop/cop/style/redundant_parentheses.rb +13 -11
- data/lib/rubocop/cop/style/redundant_return.rb +23 -11
- data/lib/rubocop/cop/style/redundant_self.rb +18 -9
- data/lib/rubocop/cop/style/regexp_literal.rb +12 -4
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/return_nil.rb +98 -0
- data/lib/rubocop/cop/style/safe_navigation.rb +80 -43
- data/lib/rubocop/cop/style/single_line_block_params.rb +14 -13
- data/lib/rubocop/cop/style/single_line_methods.rb +9 -13
- data/lib/rubocop/cop/style/special_global_vars.rb +3 -3
- data/lib/rubocop/cop/style/stabby_lambda_parentheses.rb +17 -39
- data/lib/rubocop/cop/style/string_literals_in_interpolation.rb +22 -1
- data/lib/rubocop/cop/style/struct_inheritance.rb +1 -1
- data/lib/rubocop/cop/style/symbol_array.rb +5 -25
- data/lib/rubocop/cop/style/symbol_literal.rb +1 -1
- data/lib/rubocop/cop/style/symbol_proc.rb +3 -18
- data/lib/rubocop/cop/style/ternary_parentheses.rb +14 -10
- data/lib/rubocop/cop/style/trailing_underscore_variable.rb +28 -9
- data/lib/rubocop/cop/style/trivial_accessors.rb +39 -56
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_capital_w.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_interpolation.rb +1 -1
- data/lib/rubocop/cop/style/unneeded_percent_q.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +8 -3
- data/lib/rubocop/cop/style/word_array.rb +7 -24
- data/lib/rubocop/cop/style/yoda_condition.rb +49 -14
- data/lib/rubocop/cop/style/zero_length_predicate.rb +25 -18
- data/lib/rubocop/cop/team.rb +16 -8
- data/lib/rubocop/cop/util.rb +11 -0
- data/lib/rubocop/formatter/disabled_config_formatter.rb +1 -1
- data/lib/rubocop/formatter/formatter_set.rb +2 -1
- data/lib/rubocop/formatter/offense_count_formatter.rb +2 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +1 -1
- data/lib/rubocop/formatter/tap_formatter.rb +71 -0
- data/lib/rubocop/formatter/worst_offenders_formatter.rb +2 -0
- data/lib/rubocop/node_pattern.rb +44 -26
- data/lib/rubocop/options.rb +1 -0
- data/lib/rubocop/processed_source.rb +3 -1
- data/lib/rubocop/remote_config.rb +5 -1
- data/lib/rubocop/result_cache.rb +1 -0
- data/lib/rubocop/rspec/cop_helper.rb +10 -10
- data/lib/rubocop/rspec/expect_offense.rb +6 -8
- data/lib/rubocop/rspec/shared_examples.rb +8 -8
- data/lib/rubocop/string_util.rb +2 -0
- data/lib/rubocop/version.rb +1 -1
- metadata +51 -18
- data/lib/rubocop/cop/mixin/access_modifier_node.rb +0 -41
- data/lib/rubocop/cop/mixin/on_method_def.rb +0 -44
@@ -60,38 +60,37 @@ module RuboCop
|
|
60
60
|
private
|
61
61
|
|
62
62
|
def autocorrect(node)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
replacement = "#{node.method_name} #{new_exception}"
|
63
|
+
replacement = if style == :compact
|
64
|
+
correction_exploded_to_compact(node)
|
65
|
+
else
|
66
|
+
correction_compact_to_exploded(node)
|
67
|
+
end
|
69
68
|
|
70
69
|
->(corrector) { corrector.replace(node.source_range, replacement) }
|
71
70
|
end
|
72
71
|
|
73
72
|
def correction_compact_to_exploded(node)
|
74
|
-
exception_node, _new, message_node = *node
|
73
|
+
exception_node, _new, message_node = *node.first_argument
|
75
74
|
|
76
75
|
message = message_node && message_node.source
|
77
76
|
|
78
77
|
correction = exception_node.const_name.to_s
|
79
78
|
correction = "#{correction}, #{message}" if message
|
80
79
|
|
81
|
-
correction
|
80
|
+
"#{node.method_name} #{correction}"
|
82
81
|
end
|
83
82
|
|
84
83
|
def correction_exploded_to_compact(node)
|
85
|
-
exception_node, *message_nodes = *node
|
84
|
+
exception_node, *message_nodes = *node.arguments
|
85
|
+
return node.source if message_nodes.size > 1
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
"#{exception_node.const_name}.new(#{messages})"
|
87
|
+
argument = message_nodes.first.source
|
88
|
+
"#{node.method_name} #{exception_node.const_name}.new(#{argument})"
|
90
89
|
end
|
91
90
|
|
92
91
|
def check_compact(node)
|
93
92
|
if node.arguments.size > 1
|
94
|
-
add_offense(node
|
93
|
+
add_offense(node) do
|
95
94
|
opposite_style_detected
|
96
95
|
end
|
97
96
|
else
|
@@ -108,7 +107,7 @@ module RuboCop
|
|
108
107
|
|
109
108
|
return if acceptable_exploded_args?(first_arg.arguments)
|
110
109
|
|
111
|
-
add_offense(node
|
110
|
+
add_offense(node) do
|
112
111
|
opposite_style_detected
|
113
112
|
end
|
114
113
|
end
|
@@ -127,11 +126,11 @@ module RuboCop
|
|
127
126
|
arg.hash_type? || arg.splat_type?
|
128
127
|
end
|
129
128
|
|
130
|
-
def message(
|
129
|
+
def message(node)
|
131
130
|
if style == :compact
|
132
|
-
format(COMPACT_MSG,
|
131
|
+
format(COMPACT_MSG, node.method_name)
|
133
132
|
else
|
134
|
-
format(EXPLODED_MSG,
|
133
|
+
format(EXPLODED_MSG, node.method_name)
|
135
134
|
end
|
136
135
|
end
|
137
136
|
end
|
@@ -25,15 +25,16 @@ module RuboCop
|
|
25
25
|
# something
|
26
26
|
# end
|
27
27
|
class RedundantBegin < Cop
|
28
|
-
include OnMethodDef
|
29
|
-
|
30
28
|
MSG = 'Redundant `begin` block detected.'.freeze
|
31
29
|
|
32
|
-
def
|
33
|
-
return unless body && body.kwbegin_type?
|
30
|
+
def on_def(node)
|
31
|
+
return unless node.body && node.body.kwbegin_type?
|
34
32
|
|
35
|
-
add_offense(body, :begin)
|
33
|
+
add_offense(node.body, :begin)
|
36
34
|
end
|
35
|
+
alias on_defs on_def
|
36
|
+
|
37
|
+
private
|
37
38
|
|
38
39
|
def autocorrect(node)
|
39
40
|
lambda do |corrector|
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop checks for redundant returning of true/false in conditionals.
|
7
|
+
#
|
8
|
+
# @example
|
9
|
+
# # bad
|
10
|
+
# x == y ? true : false
|
11
|
+
#
|
12
|
+
# # bad
|
13
|
+
# if x == y
|
14
|
+
# true
|
15
|
+
# else
|
16
|
+
# false
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# x == y
|
21
|
+
#
|
22
|
+
# # bad
|
23
|
+
# x == y ? false : true
|
24
|
+
#
|
25
|
+
# # good
|
26
|
+
# x != y
|
27
|
+
class RedundantConditional < Cop
|
28
|
+
include AutocorrectAlignment
|
29
|
+
|
30
|
+
COMPARISON_OPERATORS = RuboCop::AST::Node::COMPARISON_OPERATORS
|
31
|
+
|
32
|
+
MSG = 'This conditional expression can just be replaced by `%s`.'.freeze
|
33
|
+
|
34
|
+
def on_if(node)
|
35
|
+
return unless offense?(node)
|
36
|
+
|
37
|
+
add_offense(node)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def message(node)
|
43
|
+
replacement = replacement_condition(node)
|
44
|
+
msg = node.elsif? ? "\n#{replacement}" : replacement
|
45
|
+
|
46
|
+
format(MSG, msg)
|
47
|
+
end
|
48
|
+
|
49
|
+
def_node_matcher :redundant_condition?, <<-RUBY
|
50
|
+
(if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) true false)
|
51
|
+
RUBY
|
52
|
+
|
53
|
+
def_node_matcher :redundant_condition_inverted?, <<-RUBY
|
54
|
+
(if (send _ {:#{COMPARISON_OPERATORS.join(' :')}} _) false true)
|
55
|
+
RUBY
|
56
|
+
|
57
|
+
def offense?(node)
|
58
|
+
return if node.modifier_form?
|
59
|
+
redundant_condition?(node) || redundant_condition_inverted?(node)
|
60
|
+
end
|
61
|
+
|
62
|
+
def autocorrect(node)
|
63
|
+
lambda do |corrector|
|
64
|
+
corrector.replace(node.loc.expression, replacement_condition(node))
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def replacement_condition(node)
|
69
|
+
condition = node.condition.source
|
70
|
+
expression = invert_expression?(node) ? "!(#{condition})" : condition
|
71
|
+
|
72
|
+
node.elsif? ? indented_else_node(expression, node) : expression
|
73
|
+
end
|
74
|
+
|
75
|
+
def invert_expression?(node)
|
76
|
+
(
|
77
|
+
(node.if? || node.elsif? || node.ternary?) &&
|
78
|
+
redundant_condition_inverted?(node)
|
79
|
+
) || (
|
80
|
+
node.unless? &&
|
81
|
+
redundant_condition?(node)
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def indented_else_node(expression, node)
|
86
|
+
"else\n#{indentation(node)}#{expression}"
|
87
|
+
end
|
88
|
+
|
89
|
+
def configured_indentation_width
|
90
|
+
super || 2
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -31,11 +31,17 @@ module RuboCop
|
|
31
31
|
check(node)
|
32
32
|
end
|
33
33
|
|
34
|
+
private
|
35
|
+
|
34
36
|
def parens_allowed?(node)
|
35
37
|
empty_parentheses?(node) ||
|
36
|
-
allowed_ancestor?(node) ||
|
37
38
|
hash_literal_as_first_arg?(node) ||
|
38
39
|
rescue?(node) ||
|
40
|
+
allowed_expression?(node)
|
41
|
+
end
|
42
|
+
|
43
|
+
def allowed_expression?(node)
|
44
|
+
allowed_ancestor?(node) ||
|
39
45
|
allowed_method_call?(node) ||
|
40
46
|
allowed_array_or_hash_element?(node) ||
|
41
47
|
allowed_multiple_expression?(node)
|
@@ -52,7 +58,7 @@ module RuboCop
|
|
52
58
|
end
|
53
59
|
|
54
60
|
def allowed_multiple_expression?(node)
|
55
|
-
return false if node.children.
|
61
|
+
return false if node.children.one?
|
56
62
|
ancestor = node.ancestors.first
|
57
63
|
return false unless ancestor
|
58
64
|
!ancestor.begin_type? && !ancestor.def_type? && !ancestor.block_type?
|
@@ -65,7 +71,7 @@ module RuboCop
|
|
65
71
|
|
66
72
|
def hash_literal_as_first_arg?(node)
|
67
73
|
# Don't flag `method ({key: value})`
|
68
|
-
node.children.first.hash_type? &&
|
74
|
+
node.children.first.hash_type? && first_argument?(node) &&
|
69
75
|
!parentheses?(node.parent)
|
70
76
|
end
|
71
77
|
|
@@ -177,16 +183,12 @@ module RuboCop
|
|
177
183
|
end
|
178
184
|
|
179
185
|
def only_begin_arg?(args)
|
180
|
-
args.
|
186
|
+
args.one? && args.first.begin_type?
|
181
187
|
end
|
182
188
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
_receiver, _method_name, *args = *send_node
|
188
|
-
node.equal?(args.first)
|
189
|
-
end
|
189
|
+
def_node_matcher :first_argument?, <<-PATTERN
|
190
|
+
^(send _ _ equal?(%0) ...)
|
191
|
+
PATTERN
|
190
192
|
|
191
193
|
def call_chain_starts_with_int?(begin_node, send_node)
|
192
194
|
recv = first_part_of_call_chain(send_node)
|
@@ -21,9 +21,15 @@ module RuboCop
|
|
21
21
|
# It should be extended to handle methods whose body is if/else
|
22
22
|
# or a case expression with a default branch.
|
23
23
|
class RedundantReturn < Cop
|
24
|
-
include OnMethodDef
|
25
|
-
|
26
24
|
MSG = 'Redundant `return` detected.'.freeze
|
25
|
+
MULTI_RETURN_MSG = 'To return multiple values, use an array.'.freeze
|
26
|
+
|
27
|
+
def on_def(node)
|
28
|
+
return unless node.body
|
29
|
+
|
30
|
+
check_branch(node.body)
|
31
|
+
end
|
32
|
+
alias on_defs on_def
|
27
33
|
|
28
34
|
private
|
29
35
|
|
@@ -64,18 +70,12 @@ module RuboCop
|
|
64
70
|
!args.first.begin_type? || !args.first.children.empty?
|
65
71
|
end
|
66
72
|
|
67
|
-
def on_method_def(_node, _method_name, _args, body)
|
68
|
-
return unless body
|
69
|
-
|
70
|
-
check_branch(body)
|
71
|
-
end
|
72
|
-
|
73
73
|
def check_branch(node)
|
74
74
|
case node.type
|
75
75
|
when :return then check_return_node(node)
|
76
|
-
when :case
|
77
|
-
when :if
|
78
|
-
when :begin
|
76
|
+
when :case then check_case_node(node)
|
77
|
+
when :if then check_if_node(node)
|
78
|
+
when :begin then check_begin_node(node)
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
@@ -115,6 +115,18 @@ module RuboCop
|
|
115
115
|
|
116
116
|
check_return_node(last_expr)
|
117
117
|
end
|
118
|
+
|
119
|
+
def allow_multiple_return_values?
|
120
|
+
cop_config['AllowMultipleReturnValues'] || false
|
121
|
+
end
|
122
|
+
|
123
|
+
def message(node)
|
124
|
+
if !allow_multiple_return_values? && node.children.size > 1
|
125
|
+
"#{MSG} #{MULTI_RETURN_MSG}"
|
126
|
+
else
|
127
|
+
MSG
|
128
|
+
end
|
129
|
+
end
|
118
130
|
end
|
119
131
|
end
|
120
132
|
end
|
@@ -30,6 +30,10 @@ module RuboCop
|
|
30
30
|
# self.bar # resolves name clash with local variable
|
31
31
|
# end
|
32
32
|
#
|
33
|
+
# %w[x y z].select do |bar|
|
34
|
+
# self.bar == bar # resolves name clash with argument of a block
|
35
|
+
# end
|
36
|
+
#
|
33
37
|
# * Calling an attribute writer to prevent an local variable assignment
|
34
38
|
#
|
35
39
|
# attr_writer :bar
|
@@ -57,7 +61,6 @@ module RuboCop
|
|
57
61
|
lhs, _rhs = *node
|
58
62
|
allow_self(lhs)
|
59
63
|
end
|
60
|
-
|
61
64
|
alias on_and_asgn on_or_asgn
|
62
65
|
|
63
66
|
def on_op_asgn(node)
|
@@ -70,7 +73,6 @@ module RuboCop
|
|
70
73
|
def on_def(node)
|
71
74
|
add_scope(node)
|
72
75
|
end
|
73
|
-
|
74
76
|
alias on_defs on_def
|
75
77
|
|
76
78
|
def on_args(node)
|
@@ -90,12 +92,17 @@ module RuboCop
|
|
90
92
|
return unless node.self_receiver? && regular_method_call?(node)
|
91
93
|
return if node.parent && node.parent.mlhs_type?
|
92
94
|
|
93
|
-
return if
|
94
|
-
|
95
|
+
return if allowed_send_node?(node)
|
96
|
+
|
97
|
+
add_offense(node)
|
98
|
+
end
|
95
99
|
|
96
|
-
|
100
|
+
def on_block(node)
|
101
|
+
add_scope(node, @local_variables_scopes[node])
|
97
102
|
end
|
98
103
|
|
104
|
+
private
|
105
|
+
|
99
106
|
def autocorrect(node)
|
100
107
|
lambda do |corrector|
|
101
108
|
corrector.remove(node.receiver.source_range)
|
@@ -103,15 +110,17 @@ module RuboCop
|
|
103
110
|
end
|
104
111
|
end
|
105
112
|
|
106
|
-
|
107
|
-
|
108
|
-
def add_scope(node)
|
109
|
-
local_variables = []
|
113
|
+
def add_scope(node, local_variables = [])
|
110
114
|
node.descendants.each do |child_node|
|
111
115
|
@local_variables_scopes[child_node] = local_variables
|
112
116
|
end
|
113
117
|
end
|
114
118
|
|
119
|
+
def allowed_send_node?(node)
|
120
|
+
@allowed_send_nodes.include?(node) ||
|
121
|
+
@local_variables_scopes[node].include?(node.method_name)
|
122
|
+
end
|
123
|
+
|
115
124
|
def regular_method_call?(node)
|
116
125
|
!(operator?(node.method_name) ||
|
117
126
|
keyword?(node.method_name) ||
|
@@ -58,15 +58,23 @@ module RuboCop
|
|
58
58
|
|
59
59
|
def allowed_slash_literal?(node)
|
60
60
|
style == :slashes && !contains_disallowed_slash?(node) ||
|
61
|
-
|
62
|
-
|
61
|
+
allowed_mixed_slash?(node)
|
62
|
+
end
|
63
|
+
|
64
|
+
def allowed_mixed_slash?(node)
|
65
|
+
style == :mixed && node.single_line? &&
|
66
|
+
!contains_disallowed_slash?(node)
|
63
67
|
end
|
64
68
|
|
65
69
|
def allowed_percent_r_literal?(node)
|
66
70
|
style == :slashes && contains_disallowed_slash?(node) ||
|
67
71
|
style == :percent_r ||
|
68
|
-
|
69
|
-
|
72
|
+
allowed_mixed_percent_r?(node)
|
73
|
+
end
|
74
|
+
|
75
|
+
def allowed_mixed_percent_r?(node)
|
76
|
+
style == :mixed && node.multiline? ||
|
77
|
+
contains_disallowed_slash?(node)
|
70
78
|
end
|
71
79
|
|
72
80
|
def contains_disallowed_slash?(node)
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RuboCop
|
4
|
+
module Cop
|
5
|
+
module Style
|
6
|
+
# This cop enforces consistency between 'return nil' and 'return'.
|
7
|
+
#
|
8
|
+
# Supported styles are: return, return_nil.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
#
|
12
|
+
# # EnforcedStyle: return (default)
|
13
|
+
#
|
14
|
+
# # bad
|
15
|
+
# def foo(arg)
|
16
|
+
# return nil if arg
|
17
|
+
# end
|
18
|
+
#
|
19
|
+
# # good
|
20
|
+
# def foo(arg)
|
21
|
+
# return if arg
|
22
|
+
# end
|
23
|
+
#
|
24
|
+
# # EnforcedStyle: return_nil
|
25
|
+
#
|
26
|
+
# # bad
|
27
|
+
# def foo(arg)
|
28
|
+
# return if arg
|
29
|
+
# end
|
30
|
+
#
|
31
|
+
# # good
|
32
|
+
# def foo(arg)
|
33
|
+
# return nil if arg
|
34
|
+
# end
|
35
|
+
class ReturnNil < Cop
|
36
|
+
include ConfigurableEnforcedStyle
|
37
|
+
|
38
|
+
RETURN_MSG = 'Use `return` instead of `return nil`.'.freeze
|
39
|
+
RETURN_NIL_MSG = 'Use `return nil` instead of `return`.'.freeze
|
40
|
+
|
41
|
+
def_node_matcher :return_node?, '(return)'
|
42
|
+
# TODO: fix (return nil) on the NodePattern class
|
43
|
+
# def_node_matcher :return_nil_node?, '(return nil)'
|
44
|
+
|
45
|
+
def on_return(node)
|
46
|
+
# Check Lint/NonLocalExitFromIterator first before this cop
|
47
|
+
node.each_ancestor(:block, :def, :defs) do |n|
|
48
|
+
break if scoped_node?(n)
|
49
|
+
|
50
|
+
send_node, args_node, _body_node = *n
|
51
|
+
|
52
|
+
# if a proc is passed to `Module#define_method` or
|
53
|
+
# `Object#define_singleton_method`, `return` will not cause a
|
54
|
+
# non-local exit error
|
55
|
+
break if define_method?(send_node)
|
56
|
+
|
57
|
+
next if args_node.children.empty?
|
58
|
+
|
59
|
+
return nil if chained_send?(send_node)
|
60
|
+
end
|
61
|
+
|
62
|
+
add_offense(node) unless correct_style?(node)
|
63
|
+
end
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def autocorrect(node)
|
68
|
+
lambda do |corrector|
|
69
|
+
corrected = style == :return ? 'return' : 'return nil'
|
70
|
+
corrector.replace(node.source_range, corrected)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def message(_node)
|
75
|
+
style == :return ? RETURN_MSG : RETURN_NIL_MSG
|
76
|
+
end
|
77
|
+
|
78
|
+
def correct_style?(node)
|
79
|
+
style == :return && !return_nil_node?(node) ||
|
80
|
+
style == :return_nil && !return_node?(node)
|
81
|
+
end
|
82
|
+
|
83
|
+
def return_nil_node?(node)
|
84
|
+
!node.children.empty? && node.children.first.nil_type?
|
85
|
+
end
|
86
|
+
|
87
|
+
def scoped_node?(node)
|
88
|
+
node.def_type? || node.defs_type? || node.lambda?
|
89
|
+
end
|
90
|
+
|
91
|
+
def_node_matcher :chained_send?, '(send !nil ...)'
|
92
|
+
def_node_matcher :define_method?, <<-PATTERN
|
93
|
+
(send _ {:define_method :define_singleton_method} _)
|
94
|
+
PATTERN
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|