Class: RuboCop::Cop::Style::RedundantInterpolationUnfreeze

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector, TargetRubyVersion
Includes:
FrozenStringLiteral
Defined in:
lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb

Overview

Before Ruby 3.0, interpolated strings followed the frozen string literal magic comment which sometimes made it necessary to explicitly unfreeze them. Ruby 3.0 changed interpolated strings to always be unfrozen which makes unfreezing them redundant.

Examples:

# bad
+"#{foo} bar"

# bad
"#{foo} bar".dup

# bad
String.new("#{foo} bar")

# good
"#{foo} bar"

Constant Summary collapse

MSG =
"Don't unfreeze interpolated strings as they are already unfrozen."

Constants included from FrozenStringLiteral

FrozenStringLiteral::FROZEN_STRING_LITERAL_ENABLED

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods included from TargetRubyVersion

maximum_target_ruby_version, minimum_target_ruby_version, required_maximum_ruby_version, required_minimum_ruby_version, support_target_ruby_version?

Methods included from FrozenStringLiteral

frozen_string_literal?, frozen_string_literal_comment_exists?, frozen_string_literal_specified?, frozen_string_literals_disabled?, frozen_string_literals_enabled?, leading_comment_lines, leading_magic_comments, uninterpolated_heredoc?, uninterpolated_string?

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?, #message, #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

cop_dir_for, #exclude_limit, read_limits

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

#on_dstr(node) ⇒ Object



41
42
43
44
45
46
47
48
# File 'lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb', line 41

def on_dstr(node)
  return if uninterpolated_string?(node) || uninterpolated_heredoc?(node)
  return unless redundant_unfreeze?(node.parent)

  add_offense(offense_range(node.parent)) do |corrector|
    corrector.replace(node.parent, node.source)
  end
end

#redundant_unfreeze?(node) ⇒ Object



34
35
36
37
38
39
# File 'lib/rubocop/cop/style/redundant_interpolation_unfreeze.rb', line 34

def_node_matcher :redundant_unfreeze?, <<~PATTERN
  {
    (send dstr_type? {:+@ :dup})
    (send (const nil? :String) :new dstr_type?)
  }
PATTERN