Class: RuboCop::Cop::Performance::BigDecimalWithNumericArgument
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
TargetRubyVersion,
AutoCorrector,
Base
|
|
Instance Chain:
self,
Base
|
|
Inherits: |
Base
|
Defined in: | lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb |
Overview
Identifies places where a float argument to BigDecimal should be converted to a string. Initializing from String is faster than from Float for BigDecimal.
Also identifies places where an integer string argument to BigDecimal should be converted to an integer. Initializing from Integer is faster than from String for BigDecimal.
Constant Summary
-
MSG_FROM_FLOAT_TO_STRING =
# File 'lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb', line 35'Convert float literal to string and pass it to `BigDecimal`.'
-
MSG_FROM_INTEGER_TO_STRING =
# File 'lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb', line 36'Convert string literal to integer and pass it to `BigDecimal`.'
-
RESTRICT_ON_SEND =
# File 'lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb', line 37%i[BigDecimal to_d].freeze
Instance Method Summary
-
#on_send(node)
Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength.
Instance Method Details
#on_send(node)
Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity, Metrics/MethodLength
# File 'lib/rubocop/cop/performance/big_decimal_with_numeric_argument.rb', line 48
def on_send(node) if (numeric = big_decimal_with_numeric_argument(node)) if numeric.numeric_type? add_offense(numeric, message: MSG_FROM_FLOAT_TO_STRING) do |corrector| corrector.wrap(numeric, "'", "'") end elsif numeric.value.match?(/\A\d+\z/) add_offense(numeric, message: MSG_FROM_INTEGER_TO_STRING) do |corrector| corrector.replace(numeric, numeric.value) end end elsif (numeric_to_d = to_d(node)) if numeric_to_d.numeric_type? add_offense(numeric_to_d, message: MSG_FROM_FLOAT_TO_STRING) do |corrector| big_decimal_args = node.arguments.map(&:source).unshift("'#{numeric_to_d.source}'").join(', ') corrector.replace(node, "BigDecimal(#{big_decimal_args})") end elsif numeric_to_d.value.match?(/\A\d+\z/) add_offense(numeric_to_d, message: MSG_FROM_INTEGER_TO_STRING) do |corrector| corrector.replace(node, "#{numeric_to_d.value}.to_d") end end end end