Class: RuboCop::Cop::Style::RescueModifier

Inherits:
Cop
  • Object
show all
Includes:
Alignment, RescueNode
Defined in:
lib/rubocop/cop/style/rescue_modifier.rb

Overview

This cop checks for uses of rescue in its modifier form.

The cop to check rescue in its modifier form is added for following reasons:

  • The syntax of modifier form rescue can be misleading because it might led us to believe that rescue handles the given exception but it actually rescue all exceptions to return the given rescue block. In this case, value returned by handle_error or SomeException.

  • Modifier form rescue would rescue all the exceptions. It would silently skip all exception or errors and handle the error. Example: If NoMethodError is raised, modifier form rescue would handle the exception.

Examples:

# bad
some_method rescue handle_error

# bad
some_method rescue SomeException

# good
begin
  some_method
rescue
  handle_error
end

# good
begin
  some_method
rescue SomeException
  handle_error
end

Constant Summary collapse

MSG =
'Avoid using `rescue` in its modifier form.'

Constants included from Util

Util::LITERAL_REGEX

Instance Attribute Summary

Attributes inherited from Cop

#config, #corrections, #offenses, #processed_source

Instance Method Summary collapse

Methods included from RescueNode

#investigate

Methods inherited from Cop

#add_offense, all, autocorrect_incompatible_with, badge, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, #correct, department, #disable_uncorrectable, #duplicate_location?, #excluded_file?, #external_dependency_checksum, #find_location, #highlights, inherited, #initialize, #join_force?, lint?, match?, #message, #messages, #parse, qualified_cop_name, #reason_to_not_correct, #relevant_file?, #target_rails_version, #target_ruby_version

Methods included from AST::Sexp

#s

Methods included from NodePattern::Macros

#def_node_matcher, #def_node_search, #node_search, #node_search_all, #node_search_body, #node_search_first

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_offense, #disable_uncorrectable?, #safe_autocorrect?, #support_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

begins_its_line?, comment_line?, double_quotes_required?, escape_string, first_part_of_call_chain, interpret_string_escapes, line_range, needs_escaping?, on_node, parentheses?, same_line?, to_string_literal, to_supported_styles, tokens, trim_string_interporation_escape_character

Methods included from PathUtil

absolute?, chdir, hidden_dir?, hidden_file_in_not_hidden_dir?, match_path?, pwd, relative_path, reset_pwd, smart_path

Constructor Details

This class inherits a constructor from RuboCop::Cop::Cop

Instance Method Details

#autocorrect(node) ⇒ Object



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/rubocop/cop/style/rescue_modifier.rb', line 54

def autocorrect(node)
  operation, rescue_modifier, = *node
  *_, rescue_args = *rescue_modifier

  indent = indentation(node)
  correction =
    "begin\n" \
    "#{operation.source.gsub(/^/, indent)}" \
    "\n#{offset(node)}rescue\n" \
    "#{rescue_args.source.gsub(/^/, indent)}" \
    "\n#{offset(node)}end"

  lambda do |corrector|
    corrector.replace(node, correction)
  end
end

#on_resbody(node) ⇒ Object



48
49
50
51
52
# File 'lib/rubocop/cop/style/rescue_modifier.rb', line 48

def on_resbody(node)
  return unless rescue_modifier?(node)

  add_offense(node.parent)
end