Class: RuboCop::Cop::Base
- Inherits:
-
Object
- Object
- RuboCop::Cop::Base
- Extended by:
- NodePattern::Macros, AST::Sexp, ExcludeLimit
- Includes:
- AST::Sexp, AutocorrectLogic, IgnoredNode, Util
- Defined in:
- lib/rubocop/cop/base.rb
Overview
A scaffold for concrete cops.
The Cop::Base class is meant to be extended.
Cops track offenses and can autocorrect them on the fly.
A commissioner object is responsible for traversing the AST and invoking the specific callbacks on each cop.
First the callback on_new_investigation is called; if a cop needs to do its own processing of the AST or depends on something else.
Then callbacks like on_def, on_send (see AST::Traversal) are called with their respective nodes.
Finally the callback on_investigation_end is called.
Within these callbacks, cops are meant to call add_offense or add_global_offense. Use the processed_source method to get the currently processed source being investigated.
In case of invalid syntax / unparsable content, the callback on_other_file is called instead of all the other on_... callbacks.
Private methods are not meant for custom cops consumption, nor are any instance variables.
Direct Known Subclasses
RuboCop::Cop::Bundler::DuplicatedGem, RuboCop::Cop::Bundler::GemComment, RuboCop::Cop::Bundler::GemFilename, RuboCop::Cop::Bundler::GemVersion, RuboCop::Cop::Bundler::InsecureProtocolSource, RuboCop::Cop::Bundler::OrderedGems, Cop, Gemspec::DependencyVersion, Gemspec::DeprecatedAttributeAssignment, Gemspec::DuplicatedAssignment, Gemspec::OrderedDependencies, Gemspec::RequireMFA, Gemspec::RequiredRubyVersion, Gemspec::RubyVersionGlobalsUsage, InternalAffairs::CopDescription, InternalAffairs::CreateEmptyFile, InternalAffairs::EmptyLineBetweenExpectOffenseAndCorrection, InternalAffairs::ExampleDescription, InternalAffairs::ExampleHeredocDelimiter, InternalAffairs::InheritDeprecatedCopClass, InternalAffairs::LambdaOrProc, InternalAffairs::LocationLineEqualityComparison, InternalAffairs::MethodNameEndWith, InternalAffairs::MethodNameEqual, InternalAffairs::NodeDestructuring, InternalAffairs::NodeMatcherDirective, InternalAffairs::NodeTypePredicate, InternalAffairs::NumblockHandler, InternalAffairs::OffenseLocationKeyword, InternalAffairs::RedundantContextConfigParameter, InternalAffairs::RedundantDescribedClassAsSubject, InternalAffairs::RedundantLetRuboCopConfigNew, InternalAffairs::RedundantLocationArgument, InternalAffairs::RedundantMessageArgument, InternalAffairs::RedundantMethodDispatchNode, InternalAffairs::SingleLineComparison, InternalAffairs::StyleDetectedApiUse, InternalAffairs::UndefinedConfig, InternalAffairs::UselessMessageAssertion, InternalAffairs::UselessRestrictOnSend, Layout::AccessModifierIndentation, Layout::ArgumentAlignment, Layout::ArrayAlignment, Layout::AssignmentIndentation, Layout::BeginEndAlignment, Layout::BlockAlignment, Layout::BlockEndNewline, Layout::CaseIndentation, Layout::ClassStructure, Layout::ClosingHeredocIndentation, Layout::ClosingParenthesisIndentation, Layout::CommentIndentation, Layout::ConditionPosition, Layout::DefEndAlignment, Layout::DotPosition, Layout::ElseAlignment, Layout::EmptyComment, Layout::EmptyLineAfterGuardClause, Layout::EmptyLineAfterMagicComment, Layout::EmptyLineAfterMultilineCondition, Layout::EmptyLineBetweenDefs, Layout::EmptyLines, Layout::EmptyLinesAroundAccessModifier, Layout::EmptyLinesAroundArguments, Layout::EmptyLinesAroundAttributeAccessor, Layout::EmptyLinesAroundBeginBody, Layout::EmptyLinesAroundBlockBody, Layout::EmptyLinesAroundClassBody, Layout::EmptyLinesAroundExceptionHandlingKeywords, Layout::EmptyLinesAroundMethodBody, Layout::EmptyLinesAroundModuleBody, Layout::EndAlignment, Layout::EndOfLine, Layout::ExtraSpacing, Layout::FirstArgumentIndentation, Layout::FirstArrayElementIndentation, Layout::FirstArrayElementLineBreak, Layout::FirstHashElementIndentation, Layout::FirstHashElementLineBreak, Layout::FirstMethodArgumentLineBreak, Layout::FirstMethodParameterLineBreak, Layout::FirstParameterIndentation, Layout::HashAlignment, Layout::HeredocArgumentClosingParenthesis, Layout::HeredocIndentation, Layout::IndentationConsistency, Layout::IndentationStyle, Layout::IndentationWidth, Layout::InitialIndentation, Layout::LeadingCommentSpace, Layout::LeadingEmptyLines, Layout::LineContinuationLeadingSpace, Layout::LineContinuationSpacing, Layout::LineEndStringConcatenationIndentation, Layout::LineLength, Layout::MultilineArrayBraceLayout, Layout::MultilineArrayLineBreaks, Layout::MultilineAssignmentLayout, Layout::MultilineBlockLayout, Layout::MultilineHashBraceLayout, Layout::MultilineHashKeyLineBreaks, Layout::MultilineMethodArgumentLineBreaks, Layout::MultilineMethodCallBraceLayout, Layout::MultilineMethodCallIndentation, Layout::MultilineMethodDefinitionBraceLayout, Layout::MultilineMethodParameterLineBreaks, Layout::MultilineOperationIndentation, Layout::ParameterAlignment, Layout::RedundantLineBreak, Layout::RescueEnsureAlignment, Layout::SingleLineBlockChain, Layout::SpaceAfterColon, Layout::SpaceAfterComma, Layout::SpaceAfterMethodName, Layout::SpaceAfterNot, Layout::SpaceAfterSemicolon, Layout::SpaceAroundBlockParameters, Layout::SpaceAroundEqualsInParameterDefault, Layout::SpaceAroundKeyword, Layout::SpaceAroundMethodCallOperator, Layout::SpaceAroundOperators, Layout::SpaceBeforeBlockBraces, Layout::SpaceBeforeBrackets, Layout::SpaceBeforeComma, Layout::SpaceBeforeComment, Layout::SpaceBeforeFirstArg, Layout::SpaceBeforeSemicolon, Layout::SpaceInLambdaLiteral, Layout::SpaceInsideArrayLiteralBrackets, Layout::SpaceInsideArrayPercentLiteral, Layout::SpaceInsideBlockBraces, Layout::SpaceInsideHashLiteralBraces, Layout::SpaceInsideParens, Layout::SpaceInsidePercentLiteralDelimiters, Layout::SpaceInsideRangeLiteral, Layout::SpaceInsideReferenceBrackets, Layout::SpaceInsideStringInterpolation, Layout::TrailingEmptyLines, Layout::TrailingWhitespace, Lint::AmbiguousAssignment, Lint::AmbiguousBlockAssociation, Lint::AmbiguousOperator, Lint::AmbiguousOperatorPrecedence, Lint::AmbiguousRange, Lint::AmbiguousRegexpLiteral, Lint::AssignmentInCondition, Lint::BigDecimalNew, Lint::BinaryOperatorWithIdenticalOperands, Lint::BooleanSymbol, Lint::CircularArgumentReference, Lint::ConstantDefinitionInBlock, Lint::ConstantOverwrittenInRescue, Lint::ConstantResolution, Lint::Debugger, Lint::DeprecatedClassMethods, Lint::DeprecatedConstants, Lint::DeprecatedOpenSSLConstant, Lint::DisjunctiveAssignmentInConstructor, Lint::DuplicateBranch, Lint::DuplicateCaseCondition, Lint::DuplicateElsifCondition, Lint::DuplicateHashKey, Lint::DuplicateMagicComment, Lint::DuplicateMethods, Lint::DuplicateRegexpCharacterClassElement, Lint::DuplicateRequire, Lint::DuplicateRescueException, Lint::EachWithObjectArgument, Lint::ElseLayout, Lint::EmptyBlock, Lint::EmptyClass, Lint::EmptyConditionalBody, Lint::EmptyEnsure, Lint::EmptyExpression, Lint::EmptyFile, Lint::EmptyInPattern, Lint::EmptyInterpolation, Lint::EmptyWhen, Lint::EnsureReturn, Lint::ErbNewArguments, Lint::FlipFlop, Lint::FloatComparison, Lint::FloatOutOfRange, Lint::FormatParameterMismatch, Lint::HashCompareByIdentity, Lint::HeredocMethodCallPosition, Lint::IdentityComparison, Lint::ImplicitStringConcatenation, Lint::IncompatibleIoSelectWithFiberScheduler, Lint::IneffectiveAccessModifier, Lint::InheritException, Lint::InterpolationCheck, Lint::LambdaWithoutLiteralBlock, Lint::LiteralAsCondition, Lint::LiteralInInterpolation, Lint::Loop, Lint::MissingCopEnableDirective, Lint::MissingSuper, Lint::MixedRegexpCaptureTypes, Lint::MultipleComparison, Lint::NestedMethodDefinition, Lint::NestedPercentLiteral, Lint::NextWithoutAccumulator, Lint::NoReturnInBeginEndBlocks, Lint::NonAtomicFileOperation, Lint::NonDeterministicRequireOrder, Lint::NonLocalExitFromIterator, Lint::NumberConversion, Lint::NumberedParameterAssignment, Lint::OrAssignmentToConstant, Lint::OrderedMagicComments, Lint::OutOfRangeRegexpRef, Lint::ParenthesesAsGroupedExpression, Lint::PercentStringArray, Lint::PercentSymbolArray, Lint::RaiseException, Lint::RandOne, Lint::RedundantCopDisableDirective, Lint::RedundantCopEnableDirective, Lint::RedundantDirGlobSort, Lint::RedundantRequireStatement, Lint::RedundantSafeNavigation, Lint::RedundantSplatExpansion, Lint::RedundantStringCoercion, Lint::RedundantWithIndex, Lint::RedundantWithObject, Lint::RefinementImportMethods, Lint::RegexpAsCondition, Lint::RequireParentheses, Lint::RequireRangeParentheses, Lint::RequireRelativeSelfPath, Lint::RescueException, Lint::RescueType, Lint::ReturnInVoidContext, Lint::SafeNavigationChain, Lint::SafeNavigationConsistency, Lint::SafeNavigationWithEmpty, Lint::ScriptPermission, Lint::SelfAssignment, Lint::SendWithMixinArgument, Lint::ShadowedArgument, Lint::ShadowedException, Lint::ShadowingOuterLocalVariable, Lint::StructNewOverride, Lint::SuppressedException, Lint::SymbolConversion, Lint::Syntax, Lint::ToEnumArguments, Lint::ToJSON, Lint::TopLevelReturnWithArgument, Lint::TrailingCommaInAttributeDeclaration, Lint::TripleQuotes, Lint::UnderscorePrefixedVariableName, Lint::UnexpectedBlockArity, Lint::UnifiedInteger, Lint::UnmodifiedReduceAccumulator, Lint::UnreachableCode, Lint::UnreachableLoop, Lint::UnusedBlockArgument, Lint::UnusedMethodArgument, Lint::UriEscapeUnescape, Lint::UriRegexp, Lint::UselessAccessModifier, Lint::UselessAssignment, Lint::UselessElseWithoutRescue, Lint::UselessMethodDefinition, Lint::UselessRescue, Lint::UselessRuby2Keywords, Lint::UselessSetterCall, Lint::UselessTimes, Lint::Void, Metrics::AbcSize, Metrics::BlockLength, Metrics::BlockNesting, Metrics::ClassLength, Metrics::CyclomaticComplexity, Metrics::MethodLength, Metrics::ModuleLength, Metrics::ParameterLists, Migration::DepartmentName, Naming::AccessorMethodName, Naming::AsciiIdentifiers, Naming::BinaryOperatorParameterName, Naming::BlockForwarding, Naming::BlockParameterName, Naming::ClassAndModuleCamelCase, Naming::ConstantName, Naming::FileName, Naming::HeredocDelimiterCase, Naming::HeredocDelimiterNaming, Naming::InclusiveLanguage, Naming::MemoizedInstanceVariableName, Naming::MethodName, Naming::MethodParameterName, Naming::PredicateName, Naming::RescuedExceptionsVariableName, Naming::VariableName, Naming::VariableNumber, Security::CompoundHash, Security::Eval, Security::IoMethods, Security::JSONLoad, Security::MarshalLoad, Security::Open, Security::YAMLLoad, Style::AccessModifierDeclarations, Style::AccessorGrouping, Style::Alias, Style::AndOr, Style::ArgumentsForwarding, Style::ArrayCoercion, Style::ArrayIntersect, Style::ArrayJoin, Style::AsciiComments, Style::Attr, Style::AutoResourceCleanup, Style::BarePercentLiterals, Style::BeginBlock, Style::BisectedAttrAccessor, Style::BlockComments, Style::BlockDelimiters, Style::CaseEquality, Style::CaseLikeIf, Style::CharacterLiteral, Style::ClassAndModuleChildren, Style::ClassCheck, Style::ClassEqualityComparison, Style::ClassMethods, Style::ClassMethodsDefinitions, Style::ClassVars, Style::CollectionCompact, Style::CollectionMethods, Style::ColonMethodCall, Style::ColonMethodDefinition, Style::CombinableLoops, Style::CommandLiteral, Style::CommentAnnotation, Style::CommentedKeyword, Style::ConcatArrayLiterals, Style::ConditionalAssignment, Style::ConstantVisibility, Style::Copyright, Style::DateTime, Style::DefWithParentheses, Style::Dir, Style::DisableCopsWithinSourceCodeDirective, Style::DocumentDynamicEvalDefinition, Style::Documentation, Style::DocumentationMethod, Style::DoubleCopDisableDirective, Style::DoubleNegation, Style::EachForSimpleLoop, Style::EachWithObject, Style::EmptyBlockParameter, Style::EmptyCaseCondition, Style::EmptyElse, Style::EmptyHeredoc, Style::EmptyLambdaParameter, Style::EmptyLiteral, Style::EmptyMethod, Style::Encoding, Style::EndBlock, Style::EndlessMethod, Style::EnvHome, Style::EvalWithLocation, Style::EvenOdd, Style::ExpandPathArguments, Style::ExplicitBlockArgument, Style::ExponentialNotation, Style::FetchEnvVar, Style::FileRead, Style::FileWrite, Style::FloatDivision, Style::For, Style::FormatString, Style::FormatStringToken, Style::FrozenStringLiteralComment, Style::GlobalStdStream, Style::GlobalVars, Style::GuardClause, Style::HashAsLastArrayItem, Style::HashConversion, Style::HashEachMethods, Style::HashExcept, Style::HashLikeCase, Style::HashSyntax, Style::HashTransformKeys, Style::HashTransformValues, Style::IdenticalConditionalBranches, Style::IfInsideElse, Style::IfUnlessModifier, Style::IfUnlessModifierOfIfUnless, Style::IfWithBooleanLiteralBranches, Style::IfWithSemicolon, Style::ImplicitRuntimeError, Style::InPatternThen, Style::InfiniteLoop, Style::InlineComment, Style::InverseMethods, Style::IpAddresses, Style::KeywordParametersOrder, Style::Lambda, Style::LambdaCall, Style::LineEndConcatenation, Style::MagicCommentFormat, Style::MapCompactWithConditionalBlock, Style::MapToHash, Style::MapToSet, Style::MethodCallWithArgsParentheses, Style::MethodCallWithoutArgsParentheses, Style::MethodCalledOnDoEndBlock, Style::MethodDefParentheses, Style::MinMax, Style::MinMaxComparison, Style::MissingElse, Style::MissingRespondToMissing, Style::MixinGrouping, Style::MixinUsage, Style::ModuleFunction, Style::MultilineBlockChain, Style::MultilineIfModifier, Style::MultilineIfThen, Style::MultilineInPatternThen, Style::MultilineMemoization, Style::MultilineMethodSignature, Style::MultilineTernaryOperator, Style::MultilineWhenThen, Style::MultipleComparison, Style::MutableConstant, Style::NegatedIf, Style::NegatedIfElseCondition, Style::NegatedUnless, Style::NegatedWhile, Style::NestedFileDirname, Style::NestedModifier, Style::NestedParenthesizedCalls, Style::NestedTernaryOperator, Style::Next, Style::NilComparison, Style::NilLambda, Style::NonNilCheck, Style::Not, Style::NumberedParameters, Style::NumberedParametersLimit, Style::NumericLiteralPrefix, Style::NumericLiterals, Style::NumericPredicate, Style::ObjectThen, Style::OneLineConditional, Style::OpenStructUse, Style::OperatorMethodCall, Style::OptionHash, Style::OptionalArguments, Style::OptionalBooleanParameter, Style::OrAssignment, Style::ParallelAssignment, Style::ParenthesesAroundCondition, Style::PercentLiteralDelimiters, Style::PercentQLiterals, Style::PerlBackrefs, Style::PreferredHashMethods, Style::Proc, Style::QuotedSymbols, Style::RaiseArgs, Style::RandomWithOffset, Style::RedundantArgument, Style::RedundantAssignment, Style::RedundantBegin, Style::RedundantCapitalW, Style::RedundantCondition, Style::RedundantConditional, Style::RedundantConstantBase, Style::RedundantDoubleSplatHashBraces, Style::RedundantEach, Style::RedundantException, Style::RedundantFetchBlock, Style::RedundantFileExtensionInRequire, Style::RedundantFreeze, Style::RedundantInitialize, Style::RedundantInterpolation, Style::RedundantParentheses, Style::RedundantPercentQ, Style::RedundantRegexpCharacterClass, Style::RedundantRegexpEscape, Style::RedundantReturn, Style::RedundantSelf, Style::RedundantSelfAssignment, Style::RedundantSelfAssignmentBranch, Style::RedundantSort, Style::RedundantSortBy, Style::RedundantStringEscape, Style::RegexpLiteral, Style::RequireOrder, Style::RescueModifier, Style::RescueStandardError, Style::ReturnNil, Style::SafeNavigation, Style::Sample, Style::SelectByRegexp, Style::SelfAssignment, Style::Semicolon, Style::Send, Style::SignalException, Style::SingleArgumentDig, Style::SingleLineBlockParams, Style::SingleLineMethods, Style::SlicingWithRange, Style::SoleNestedConditional, Style::SpecialGlobalVars, Style::StabbyLambdaParentheses, Style::StaticClass, Style::StderrPuts, Style::StringChars, Style::StringConcatenation, Style::StringHashKeys, Style::StringLiterals, Style::StringLiteralsInInterpolation, Style::StringMethods, Style::Strip, Style::StructInheritance, Style::SwapValues, Style::SymbolArray, Style::SymbolLiteral, Style::SymbolProc, Style::TernaryParentheses, Style::TopLevelMethodDefinition, Style::TrailingBodyOnClass, Style::TrailingBodyOnMethodDefinition, Style::TrailingBodyOnModule, Style::TrailingCommaInArguments, Style::TrailingCommaInArrayLiteral, Style::TrailingCommaInBlockArgs, Style::TrailingCommaInHashLiteral, Style::TrailingMethodEndStatement, Style::TrailingUnderscoreVariable, Style::TrivialAccessors, Style::UnlessElse, Style::UnlessLogicalOperators, Style::UnpackFirst, Style::VariableInterpolation, Style::WhenThen, Style::WhileUntilDo, Style::WhileUntilModifier, Style::WordArray, Style::YodaCondition, Style::YodaExpression, Style::ZeroLengthPredicate
Defined Under Namespace
Classes: InvestigationReport
Constant Summary collapse
- RESTRICT_ON_SEND =
List of methods names to restrict calls for
on_send/on_csend Set[].freeze
Instance Attribute Summary collapse
-
#config ⇒ Object
readonly
Returns the value of attribute config.
-
#processed_source ⇒ Object
readonly
Returns the value of attribute processed_source.
Class Method Summary collapse
-
.autocorrect_incompatible_with ⇒ Array<RuboCop::Cop::Cop>
List of cops that should not try to autocorrect at the same time as this cop.
-
.badge ⇒ Object
Naming.
- .callbacks_needed ⇒ Object private
- .cop_name ⇒ Object
- .department ⇒ Object
-
.documentation_url ⇒ String?
Cops (other than builtin) are encouraged to implement this.
-
.exclude_from_registry ⇒ Object
Call for abstract Cop classes.
- .inherited(subclass) ⇒ Object
-
.joining_forces ⇒ Object
Override and return the Force class(es) you need to join.
- .lint? ⇒ Boolean
-
.match?(given_names) ⇒ Boolean
Returns true if the cop name or the cop namespace matches any of the given names.
-
.support_autocorrect? ⇒ Boolean
Returns if class supports autocorrect.
-
.support_multiple_source? ⇒ Boolean
Override if your cop should be called repeatedly for multiple investigations Between calls to
on_new_investigationandon_investigation_end, the result ofprocessed_sourcewill remain constant.
Instance Method Summary collapse
- #active_support_extensions_enabled? ⇒ Boolean
-
#add_global_offense(message = nil, severity: nil) ⇒ Object
Adds an offense that has no particular location.
-
#add_offense(node_or_range, message: nil, severity: nil, &block) ⇒ Object
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.
-
#callbacks_needed ⇒ Object
private
rubocop:disable Layout/ClassStructure.
- #config_to_allow_offenses ⇒ Object
- #config_to_allow_offenses=(hash) ⇒ Object
-
#cop_config ⇒ Object
Configuration Helpers.
- #cop_name ⇒ Object (also: #name)
- #excluded_file?(file) ⇒ Boolean
-
#external_dependency_checksum ⇒ Object
This method should be overridden when a cop’s behavior depends on state that lives outside of these locations:.
-
#initialize(config = nil, options = nil) ⇒ Base
constructor
A new instance of Base.
-
#message(_range = nil) ⇒ Object
Gets called if no message is specified when calling
add_offenseoradd_global_offenseCops are discouraged to override this; instead pass your message directly. -
#offenses ⇒ Object
deprecated
Deprecated.
Make potential errors with previous API more obvious
-
#on_investigation_end ⇒ Object
Called after all on_…
-
#on_new_investigation ⇒ Object
Called before all on_…
-
#on_other_file ⇒ Object
Called instead of all on_…
-
#parse(source, path = nil) ⇒ Object
There should be very limited reasons for a Cop to do it’s own parsing.
-
#ready ⇒ Object
private
Called between investigations.
- #relevant_file?(file) ⇒ Boolean
- #target_rails_version ⇒ Object
- #target_ruby_version ⇒ Object
Methods included from ExcludeLimit
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
Instance Attribute Details
#config ⇒ Object (readonly)
Returns the value of attribute config.
43 44 45 |
# File 'lib/rubocop/cop/base.rb', line 43 def config @config end |
#processed_source ⇒ Object (readonly)
Returns the value of attribute processed_source.
43 44 45 |
# File 'lib/rubocop/cop/base.rb', line 43 def processed_source @processed_source end |
Class Method Details
.autocorrect_incompatible_with ⇒ Array<RuboCop::Cop::Cop>
List of cops that should not try to autocorrect at the same time as this cop
59 60 61 |
# File 'lib/rubocop/cop/base.rb', line 59 def self.autocorrect_incompatible_with [] end |
.badge ⇒ Object
Naming
89 90 91 |
# File 'lib/rubocop/cop/base.rb', line 89 def self.badge @badge ||= Badge.for(name) end |
.callbacks_needed ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
281 282 283 284 285 286 |
# File 'lib/rubocop/cop/base.rb', line 281 def self.callbacks_needed @callbacks_needed ||= public_instance_methods.select do |m| m.match?(/^on_|^after_/) && !Base.method_defined?(m) # exclude standard "callbacks" like 'on_begin_investigation' end end |
.cop_name ⇒ Object
93 94 95 |
# File 'lib/rubocop/cop/base.rb', line 93 def self.cop_name badge.to_s end |
.department ⇒ Object
97 98 99 |
# File 'lib/rubocop/cop/base.rb', line 97 def self.department badge.department end |
.documentation_url ⇒ String?
Cops (other than builtin) are encouraged to implement this
67 68 69 |
# File 'lib/rubocop/cop/base.rb', line 67 def self.documentation_url Documentation.url_for(self) if builtin? end |
.exclude_from_registry ⇒ Object
Call for abstract Cop classes
77 78 79 |
# File 'lib/rubocop/cop/base.rb', line 77 def self.exclude_from_registry Registry.global.dismiss(self) end |
.inherited(subclass) ⇒ Object
71 72 73 74 |
# File 'lib/rubocop/cop/base.rb', line 71 def self.inherited(subclass) super Registry.global.enlist(subclass) end |
.joining_forces ⇒ Object
Override and return the Force class(es) you need to join
114 |
# File 'lib/rubocop/cop/base.rb', line 114 def self.joining_forces; end |
.lint? ⇒ Boolean
101 102 103 |
# File 'lib/rubocop/cop/base.rb', line 101 def self.lint? department == :Lint end |
.match?(given_names) ⇒ Boolean
Returns true if the cop name or the cop namespace matches any of the given names.
107 108 109 110 111 |
# File 'lib/rubocop/cop/base.rb', line 107 def self.match?(given_names) return false unless given_names given_names.include?(cop_name) || given_names.include?(badge.department_name) end |
.support_autocorrect? ⇒ Boolean
Returns if class supports autocorrect. It is recommended to extend AutoCorrector instead of overriding
83 84 85 |
# File 'lib/rubocop/cop/base.rb', line 83 def self.support_autocorrect? false end |
.support_multiple_source? ⇒ Boolean
Override if your cop should be called repeatedly for multiple investigations Between calls to on_new_investigation and on_investigation_end, the result of processed_source will remain constant. You should invalidate any caches that depend on the current processed_source in the on_new_investigation callback. If your cop does autocorrections, be aware that your instance may be called multiple times with the same processed_source.path but different content.
125 126 127 |
# File 'lib/rubocop/cop/base.rb', line 125 def self.support_multiple_source? false end |
Instance Method Details
#active_support_extensions_enabled? ⇒ Boolean
235 236 237 |
# File 'lib/rubocop/cop/base.rb', line 235 def active_support_extensions_enabled? @config.active_support_extensions_enabled? end |
#add_global_offense(message = nil, severity: nil) ⇒ Object
Adds an offense that has no particular location. No correction can be applied to global offenses
162 163 164 165 166 |
# File 'lib/rubocop/cop/base.rb', line 162 def add_global_offense( = nil, severity: nil) severity = find_severity(nil, severity) = (nil, ) current_offenses << Offense.new(severity, Offense::NO_LOCATION, , name, :unsupported) end |
#add_offense(node_or_range, message: nil, severity: nil, &block) ⇒ Object
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. If message is not specified, the method message will be called.
172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/rubocop/cop/base.rb', line 172 def add_offense(node_or_range, message: nil, severity: nil, &block) range = range_from_node_or_range(node_or_range) return unless current_offense_locations.add?(range) range_to_pass = callback_argument(range) severity = find_severity(range_to_pass, severity) = (range_to_pass, ) status, corrector = enabled_line?(range.line) ? correct(range, &block) : :disabled current_offenses << Offense.new(severity, range, , name, status, corrector) end |
#callbacks_needed ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
rubocop:disable Layout/ClassStructure
276 277 278 |
# File 'lib/rubocop/cop/base.rb', line 276 def callbacks_needed self.class.callbacks_needed end |
#config_to_allow_offenses ⇒ Object
219 220 221 |
# File 'lib/rubocop/cop/base.rb', line 219 def config_to_allow_offenses Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] ||= {} end |
#config_to_allow_offenses=(hash) ⇒ Object
223 224 225 |
# File 'lib/rubocop/cop/base.rb', line 223 def config_to_allow_offenses=(hash) Formatter::DisabledConfigFormatter.config_to_allow_offenses[cop_name] = hash end |
#cop_config ⇒ Object
Configuration Helpers
213 214 215 216 217 |
# File 'lib/rubocop/cop/base.rb', line 213 def cop_config # Use department configuration as basis, but let individual cop # configuration override. @cop_config ||= @config.for_badge(self.class.badge) end |
#cop_name ⇒ Object Also known as: name
205 206 207 |
# File 'lib/rubocop/cop/base.rb', line 205 def cop_name @cop_name ||= self.class.cop_name end |
#excluded_file?(file) ⇒ Boolean
247 248 249 |
# File 'lib/rubocop/cop/base.rb', line 247 def excluded_file?(file) !relevant_file?(file) end |
#external_dependency_checksum ⇒ Object
This method should be overridden when a cop’s behavior depends on state that lives outside of these locations:
(1) the file under inspection
(2) the cop's source code
(3) the config (eg a .rubocop.yml file)
For example, some cops may want to look at other parts of the codebase being inspected to find violations. A cop may use the presence or absence of file foo.rb to determine whether a certain violation exists in bar.rb.
Overriding this method allows the cop to indicate to RuboCop’s ResultCache system when those external dependencies change, ie when the ResultCache should be invalidated.
201 202 203 |
# File 'lib/rubocop/cop/base.rb', line 201 def external_dependency_checksum nil end |
#message(_range = nil) ⇒ Object
Gets called if no message is specified when calling add_offense or add_global_offense Cops are discouraged to override this; instead pass your message directly
156 157 158 |
# File 'lib/rubocop/cop/base.rb', line 156 def (_range = nil) self.class::MSG end |
#offenses ⇒ Object
Make potential errors with previous API more obvious
267 268 269 270 |
# File 'lib/rubocop/cop/base.rb', line 267 def offenses raise 'The offenses are not directly available; ' \ 'they are returned as the result of the investigation' end |
#on_investigation_end ⇒ Object
Called after all on_… have been called When refining this method, always call super
143 144 145 |
# File 'lib/rubocop/cop/base.rb', line 143 def on_investigation_end # Typically do nothing here end |
#on_new_investigation ⇒ Object
Called before all on_… have been called When refining this method, always call super
137 138 139 |
# File 'lib/rubocop/cop/base.rb', line 137 def on_new_investigation # Typically do nothing here end |
#on_other_file ⇒ Object
Called instead of all on_… callbacks for unrecognized files / syntax errors When refining this method, always call super
149 150 151 |
# File 'lib/rubocop/cop/base.rb', line 149 def on_other_file # Typically do nothing here end |
#parse(source, path = nil) ⇒ Object
There should be very limited reasons for a Cop to do it’s own parsing
252 253 254 |
# File 'lib/rubocop/cop/base.rb', line 252 def parse(source, path = nil) ProcessedSource.new(source, target_ruby_version, path) end |
#ready ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Called between investigations
258 259 260 261 262 |
# File 'lib/rubocop/cop/base.rb', line 258 def ready return self if self.class.support_multiple_source? self.class.new(@config, @options) end |
#relevant_file?(file) ⇒ Boolean
239 240 241 242 243 244 245 |
# File 'lib/rubocop/cop/base.rb', line 239 def relevant_file?(file) return true unless @config.clusivity_config_for_badge?(self.class.badge) file == RuboCop::AST::ProcessedSource::STRING_SOURCE_NAME || (file_name_matches_any?(file, 'Include', true) && !file_name_matches_any?(file, 'Exclude', false)) end |
#target_rails_version ⇒ Object
231 232 233 |
# File 'lib/rubocop/cop/base.rb', line 231 def target_rails_version @config.target_rails_version end |
#target_ruby_version ⇒ Object
227 228 229 |
# File 'lib/rubocop/cop/base.rb', line 227 def target_ruby_version @config.target_ruby_version end |