Class: RuboCop::Cop::Lint::UselessConstantScoping
| Relationships & Source Files | |
| Super Chains via Extension / Inclusion / Inheritance | |
|
Class Chain:
self,
::RuboCop::Cop::Base,
::RuboCop::ExcludeLimit,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
|
Instance Chain:
self,
::RuboCop::Cop::Base,
::RuboCop::Cop::AutocorrectLogic,
::RuboCop::Cop::IgnoredNode,
::RuboCop::Util,
RuboCop::AST::Sexp
|
|
| Inherits: |
RuboCop::Cop::Base
|
| Defined in: | lib/rubocop/cop/lint/useless_constant_scoping.rb |
Overview
Checks for useless constant scoping. Private constants must be defined using
private_constant. Even if private access modifier is used, it is public scope despite
its appearance.
It does not support autocorrection due to behavior change and multiple ways to fix it. Or a public constant may be intended.
Constant assignments that define classes or modules via Class.new, Module.new,
Struct.new, or Data.define are allowed. Those forms are class and module definitions
written with assignment syntax, and match the common practice of placing nested
class / module bodies after private without intending private constant visibility.
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 51'Useless `private` access modifier for constant scope.'
::RuboCop::Cop::Base - Inherited
Class Attribute Summary
::RuboCop::Cop::Base - Inherited
| .gem_requirements, .lint?, | |
| .support_autocorrect? | Returns if class supports autocorrect. |
| .support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base - Inherited
| .autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
| .badge | Naming. |
| .callbacks_needed, .cop_name, .department, | |
| .documentation_url | Returns a url to view this cops documentation online. |
| .exclude_from_registry | Call for abstract Cop classes. |
| .inherited, | |
| .joining_forces | Override and return the Force class(es) you need to join. |
| .match? | Returns true if the cop name or the cop namespace matches any of the given names. |
| .new, | |
| .requires_gem | Register a version requirement for the given gem name. |
| .restrict_on_send | Reserved for Commissioner. |
::RuboCop::ExcludeLimit - Extended
| exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
| transform | |
Instance Attribute Summary
::RuboCop::Cop::Base - Inherited
::RuboCop::Cop::AutocorrectLogic - Included
| #autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?, | |
| #skipped_unsafe_correction_with_disable_uncorrectable? | Whether a correction exists but is skipped because it is unsafe in a safe autocorrect run, while |
Instance Method Summary
-
#class_or_module_definition_assignment?(node)
Matches class/module-like constant assignments.
- #on_casgn(node)
- #private_constants(node)
- #after_private_modifier?(left_siblings) ⇒ Boolean private
- #private_constantize?(right_siblings, const_value) ⇒ Boolean private
::RuboCop::Cop::Base - Inherited
| #add_global_offense | Adds an offense that has no particular location. |
| #add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
| #begin_investigation | Called before any investigation. |
| #callbacks_needed, | |
| #cop_config | Configuration Helpers. |
| #cop_name, #excluded_file?, | |
| #external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
| #inspect, | |
| #message | Gets called if no message is specified when calling |
| #name | Alias for Base#cop_name. |
| #offenses, | |
| #on_investigation_end | Called after all on_… |
| #on_new_investigation | Called before all on_… |
| #on_other_file | Called instead of all on_… |
| #parse | There should be very limited reasons for a Cop to do it’s own parsing. |
| #parser_engine, | |
| #ready | Called between investigations. |
| #relevant_file?, | |
| #target_gem_version | Returns a gems locked versions (i.e. |
| #target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
| #callback_argument | Reserved for Cop::Cop. |
| #complete_investigation | Called to complete an investigation. |
| #correct, #covering_disabled_range, #current_corrector, | |
| #current_offense_locations | Reserved for Commissioner: |
| #current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, | |
| #enabled_lines? | A multi-line offense is suppressed by a directive on any line of its range, not only its first line, matching the intuition that the directive is attached to the offending code. |
| #file_name_matches_any?, #find_message, #find_severity, #matches_absolute_include_pattern?, #range_for_original, #range_from_node_or_range, | |
| #reset_investigation | Actually private methods. |
| #suppression_reason | The |
| #use_corrector | |
::RuboCop::Cop::AutocorrectLogic - Included
::RuboCop::Cop::IgnoredNode - Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Method Details
#after_private_modifier?(left_siblings) ⇒ Boolean (private)
# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 85
def after_private_modifier?(left_siblings) access_modifier_candidates = left_siblings.compact.select do |left_sibling| left_sibling.respond_to?(:) && left_sibling. end return false if access_modifier_candidates.empty? access_modifier_candidates.last.command?(:private) end
#class_or_module_definition_assignment?(node)
Matches class/module-like constant assignments. Nested class / module
keyword definitions are not visited by this cop; these assignment forms are
the equivalent syntax and should be treated the same way.
# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 62
def_node_matcher :class_or_module_definition_assignment?, <<~PATTERN { (send (const {nil? cbase} {:Class :Module :Struct}) :new ...) (send (const {nil? cbase} :Data) :define ...) (any_block { (send (const {nil? cbase} {:Class :Module :Struct}) :new ...) (send (const {nil? cbase} :Data) :define ...) } ...) } PATTERN
#on_casgn(node)
[ GitHub ]# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 75
def on_casgn(node) return unless after_private_modifier?(node.left_siblings) return if private_constantize?(node.right_siblings, node.name) return if class_or_module_definition_assignment?(node.expression) add_offense(node) end
#private_constantize?(right_siblings, const_value) ⇒ Boolean (private)
# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 95
def private_constantize?(right_siblings, const_value) private_constant_arguments = right_siblings.map { |node| private_constants(node) } private_constant_values = private_constant_arguments.flatten.filter_map do |constant| constant.value.to_sym if constant.respond_to?(:value) end private_constant_values.include?(const_value) end
#private_constants(node)
[ GitHub ]# File 'lib/rubocop/cop/lint/useless_constant_scoping.rb', line 54
def_node_matcher :private_constants, <<~PATTERN (send nil? :private_constant $...) PATTERN