Class: RuboCop::Cop::Style::MutableConstant
- Extended by:
- AutoCorrector
- Includes:
- ConfigurableEnforcedStyle, FrozenStringLiteral
- Defined in:
- lib/rubocop/cop/style/mutable_constant.rb
Overview
Checks whether some constant value isn’t a mutable literal (e.g. array or hash).
When the ‘Recursive` option is enabled, mutable literals nested inside arrays and hashes are also frozen, so an offense on the outermost unfrozen literal will autocorrect every nested mutable literal as well. When the outer literal already has `.freeze` appended, the cop descends into it and reports each outermost unfrozen literal underneath. The option is disabled by default to preserve existing behavior; opt in to get strict nested freezing.
Strict mode can be used to freeze all constants, rather than just literals. Strict mode is considered an experimental feature. It has not been updated with an exhaustive list of all methods that will produce frozen objects so there is a decent chance of getting some false positives. Luckily, there is no harm in freezing an already frozen object.
From Ruby 3.0, this cop honours the magic comment ‘shareable_constant_value’. When this magic comment is set to any acceptable value other than none, it will suppress the offenses raised by this cop. It enforces frozen state.
NOTE: ‘Regexp` and `Range` literals are frozen objects since Ruby 3.0.
NOTE: From Ruby 3.0, interpolated strings are not frozen when ‘# frozen-string-literal: true` is used, so this cop enforces explicit freezing for such strings.
NOTE: From Ruby 3.0, this cop allows explicit freezing of constants when the ‘shareable_constant_value` directive is used.
Constant Summary collapse
- MSG =
'Freeze mutable objects assigned to constants.'
Constants included from FrozenStringLiteral
FrozenStringLiteral::FROZEN_STRING_LITERAL_ENABLED
Constants inherited from Base
Instance Attribute Summary
Attributes inherited from Base
#config, #processed_source, #project_index
Instance Method Summary collapse
Methods included from AutoCorrector
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 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
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#on_casgn(node) ⇒ Object
146 147 148 149 150 151 152 153 154 155 |
# File 'lib/rubocop/cop/style/mutable_constant.rb', line 146 def on_casgn(node) if node.expression.nil? # This is only the case for `CONST += ...` or similar parent = node.parent return unless parent.or_asgn_type? # We only care about `CONST ||= ...` on_assignment(parent.children.last) else on_assignment(node.expression) end end |