Class: RuboCop::Cop::Performance::CaseWhenSplat
- Includes:
- AutocorrectAlignment
- Defined in:
- lib/rubocop/cop/performance/case_when_splat.rb
Overview
Place when
conditions that use splat at the end
of the list of when
branches.
Ruby has to allocate memory for the splat expansion every time
that the case
when
statement is run. Since Ruby does not support
fall through inside of case
when
, like some other languages do,
the order of the when
branches does not matter. By placing any
splat expansions at the end of the list of when
branches we will
reduce the number of times that memory has to be allocated for
the expansion.
This is not a guaranteed performance improvement. If the data being
processed by the case
condition is normalized in a manner that favors
hitting a condition in the splat expansion, it is possible that
moving the splat condition to the end will use more memory,
and run slightly slower.
Constant Summary collapse
- MSG =
'Place `when` conditions with a splat ' \ 'at the end of the `when` branches.'.freeze
- ARRAY_MSG =
'Do not expand array literals in `when` conditions.'.freeze
- OPEN_BRACKET =
'['.freeze
- PERCENT_W =
'%w'.freeze
- PERCENT_CAPITAL_W =
'%W'.freeze
- PERCENT_I =
'%i'.freeze
- PERCENT_CAPITAL_I =
'%I'.freeze
Constants included from AutocorrectAlignment
Constants included from Util
Util::ASGN_NODES, Util::BYTE_ORDER_MARK, Util::EQUALS_ASGN_NODES, Util::LITERAL_REGEX, Util::OPERATOR_METHODS, Util::SHORTHAND_ASGN_NODES, Util::STRING_ESCAPES, Util::STRING_ESCAPE_REGEX
Instance Attribute Summary
Attributes inherited from Cop
#config, #corrections, #offenses, #processed_source
Instance Method Summary collapse
- #autocorrect(node) ⇒ Object
-
#initialize ⇒ CaseWhenSplat
constructor
A new instance of CaseWhenSplat.
- #on_case(node) ⇒ Object
Methods included from AutocorrectAlignment
#check_alignment, #configured_indentation_width, #display_column, #indentation, #offset
Methods inherited from Cop
#add_offense, all, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, cop_name, #cop_name, cop_type, #correct, #debug?, #details, #display_cop_names?, #display_style_guide?, #excluded_file?, #extra_details?, inherited, #join_force?, lint?, match?, #message, non_rails, #parse, qualified_cop_name, #reference_url, #relevant_file?, #style_guide_url, #target_ruby_version
Methods included from Sexp
Methods included from NodePattern::Macros
#def_node_matcher, #def_node_search, #node_search_body
Methods included from AutocorrectLogic
#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #support_autocorrect?
Methods included from IgnoredNode
#ignore_node, #ignored_node?, #part_of_ignored_node?
Methods included from Util
begins_its_line?, block_length, comment_line?, directions, double_quotes_acceptable?, double_quotes_required?, effective_column, ends_its_line?, first_part_of_call_chain, interpret_string_escapes, line_range, move_pos, numeric_range_size, on_node, operator?, parentheses?, range_with_surrounding_comma, range_with_surrounding_space, source_range, strip_quotes, to_string_literal, to_symbol_literal, within_node?
Methods included from PathUtil
absolute?, hidden?, issue_deprecation_warning, match_path?, relative_path
Constructor Details
#initialize ⇒ CaseWhenSplat
Returns a new instance of CaseWhenSplat.
66 67 68 69 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 66 def initialize(*) super @reordered_splat_condition = false end |
Instance Method Details
#autocorrect(node) ⇒ Object
87 88 89 90 91 92 93 94 95 96 97 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 87 def autocorrect(node) condition, = *node variable, = *condition if variable.array_type? correct_array_literal(condition, variable) else return if @reordered_splat_condition @reordered_splat_condition = true reorder_splat_condition(node) end end |
#on_case(node) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/rubocop/cop/performance/case_when_splat.rb', line 71 def on_case(node) _case_branch, *when_branches, _else_branch = *node when_conditions = when_branches.each_with_object([]) do |branch, conditions| condition, = *branch conditions << condition end splat_offenses(when_conditions).reverse_each do |condition| range = condition.parent.loc.keyword.join(condition.source_range) variable, = *condition = variable.array_type? ? ARRAY_MSG : MSG add_offense(condition.parent, range, ) end end |