Class: RuboCop::Cop::Lint::ConstantResolution

Inherits:
Base
  • Object
show all
Includes:
ProjectIndexHelp
Defined in:
lib/rubocop/cop/lint/constant_resolution.rb

Overview

Checks that certain constants are fully qualified.

This is not enabled by default because it would mark a lot of offenses unnecessarily.

Generally, gems should fully qualify all constants to avoid conflicts with the code that uses the gem. Enable this cop without using Only/Ignore

Large projects will over time end up with one or two constant names that are problematic because of a conflict with a library or just internally using the same name for a namespace and a class. To avoid too many unnecessary offenses, enable this cop with Only: [The, Constant, Names, Causing, Issues]

NOTE: Style/RedundantConstantBase cop is disabled if this cop is enabled, to prevent conflicting rules. This is because it respects user configurations that want to enable this cop which is disabled by default.

When AllCops/UseProjectIndex is enabled and the rubydex gem is installed, only genuinely ambiguous constants are reported: those that resolve to a different declaration through the surrounding nesting than they would fully qualified. This makes the cop practical to enable without Only/Ignore lists.

Examples:

# By default checks every constant

# bad
User

# bad
User::Login

# good
::User

# good
::User::Login

Only: ['Login']

# Restrict this cop to only being concerned about certain constants

# bad
Login

# good
::Login

# good
User::Login

Ignore: ['Login']

# Restrict this cop not being concerned about certain constants

# bad
User

# good
::User::Login

# good
Login

Constant Summary collapse

MSG =
'Fully qualify this constant to avoid possibly ambiguous resolution.'

Constants included from ProjectIndexHelp

ProjectIndexHelp::BUILTIN_DOCUMENT_URI, ProjectIndexHelp::FILE_URI_PREFIX, ProjectIndexHelp::WINDOWS_DRIVE_PREFIX

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source, #project_index

Instance Method Summary collapse

Methods included from ProjectIndexHelp

#external_dependency_checksum

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_const(node) ⇒ Object



78
79
80
81
82
83
# File 'lib/rubocop/cop/lint/constant_resolution.rb', line 78

def on_const(node)
  return if !unqualified_const?(node) || node.parent&.defined_module || node.loc.nil?
  return if project_index && !ambiguous_resolution?(node)

  add_offense(node)
end

#unqualified_const?(node) ⇒ Object



74
75
76
# File 'lib/rubocop/cop/lint/constant_resolution.rb', line 74

def_node_matcher :unqualified_const?, <<~PATTERN
  (const nil? #const_name?)
PATTERN