Class: RuboCop::Cop::Style::FloatDivision

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
ConfigurableEnforcedStyle
Defined in:
lib/rubocop/cop/style/float_division.rb

Overview

Checks for division with integers coerced to floats. It is recommended to either always use fdiv or coerce one side only. This cop also provides other options for code consistency.

For Regexp.last_match and nth reference (e.g., ‘$1`), it assumes that the value is a string matched by a regular expression, and allows conversion with #to_f.

Examples:

EnforcedStyle: single_coerce (default)

# bad
a.to_f / b.to_f

# good
a.to_f / b
a / b.to_f

EnforcedStyle: left_coerce

# bad
a / b.to_f
a.to_f / b.to_f

# good
a.to_f / b

EnforcedStyle: right_coerce

# bad
a.to_f / b
a.to_f / b.to_f

# good
a / b.to_f

EnforcedStyle: fdiv

# bad
a / b.to_f
a.to_f / b
a.to_f / b.to_f

# good
a.fdiv(b)

Constant Summary collapse

MESSAGES =
{
  left_coerce: 'Prefer using `.to_f` on the left side.',
  right_coerce: 'Prefer using `.to_f` on the right side.',
  single_coerce: 'Prefer using `.to_f` on one side only.',
  fdiv: 'Prefer using `fdiv` for float divisions.'
}.freeze
RESTRICT_ON_SEND =
i[/].freeze

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods included from ConfigurableEnforcedStyle

#alternative_style, #alternative_styles, #ambiguous_style_detected, #correct_style_detected, #detected_style, #detected_style=, #no_acceptable_style!, #no_acceptable_style?, #opposite_style_detected, #style, #style_configured?, #style_detected, #style_parameter_name, #supported_styles, #unexpected_style_detected

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, cop_name, #cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_gem_version, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

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

Instance Method Details

#any_coerce?(node) ⇒ Object



82
83
84
# File 'lib/rubocop/cop/style/float_division.rb', line 82

def_node_matcher :any_coerce?, "{(send _ :/ #to_f_method?) (send #to_f_method? :/ _)}\n"

#both_coerce?(node) ⇒ Object



78
79
80
# File 'lib/rubocop/cop/style/float_division.rb', line 78

def_node_matcher :both_coerce?, "(send #to_f_method? :/ #to_f_method?)\n"

#left_coerce?(node) ⇒ Object



74
75
76
# File 'lib/rubocop/cop/style/float_division.rb', line 74

def_node_matcher :left_coerce?, "(send #to_f_method? :/ _)\n"

#on_send(node) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# File 'lib/rubocop/cop/style/float_division.rb', line 98

def on_send(node)
  return unless offense_condition?(node)

  add_offense(node) do |corrector|
    case style
    when :left_coerce, :single_coerce
      add_to_f_method(corrector, node.receiver)
      remove_to_f_method(corrector, node.first_argument)
    when :right_coerce
      remove_to_f_method(corrector, node.receiver)
      add_to_f_method(corrector, node.first_argument)
    when :fdiv
      correct_from_slash_to_fdiv(corrector, node, node.receiver, node.first_argument)
    end
  end
end

#regexp_last_match?(node) ⇒ Object



91
92
93
94
95
96
# File 'lib/rubocop/cop/style/float_division.rb', line 91

def_node_matcher :regexp_last_match?, "{\n  (send (const {nil? cbase} :Regexp) :last_match int)\n  (:nth_ref _)\n}\n"

#right_coerce?(node) ⇒ Object



70
71
72
# File 'lib/rubocop/cop/style/float_division.rb', line 70

def_node_matcher :right_coerce?, "(send _ :/ #to_f_method?)\n"

#to_f_method?(node) ⇒ Object



86
87
88
# File 'lib/rubocop/cop/style/float_division.rb', line 86

def_node_matcher :to_f_method?, "(send !nil? :to_f)\n"