require 'simplabs/excellent/warning'
module Simplabs
module Excellent
module Checks
# This is the base class for all code checks. All checks must specify +interesting_contexts+. When one of these contexts is processed by Excellent, it
# will invoke the +evaluate_context+ method of all checks that specify the context as one if their +interesting_contexts+.
class Base
attr_reader :warnings #:nodoc:
attr_reader :options #:nodoc:
# An array of contexts that are interesting for the check. These contexts are based on symbols as returned by RubyParser (see
# http://parsetree.rubyforge.org/ruby_parser/) and add some additional data,
# e.g. Ifcontext or MethodContext
attr_reader :interesting_contexts
# An array of regular expressions for file names that are interesting for the check. These will usually be path extensions rather than longer
# patterns (e.g. *.rb as well as *.erb files or *.rb files only).
#
# Defaults to /\.rb$/. If you do not specify anything else in custom checks, only *.rb files will be processed
attr_reader :interesting_files
def initialize(options = {}) #:nodoc:
@options = options
@interesting_contexts = []
@warnings = []
@interesting_files = [/\.rb$/]
end
# This method is called whenever Excellent processes a context that the check specified as one of the contexts it is interested in (see
# interesting_contexts).
#
# ==== Parameters
#
# * context - This is the last context the code processor has constructed. It contains all information required to execute the check (see Simplabs::Excellent::Parsing::SexpContext).
def evaluate_context(context)
evaluate(context)
end
# Adds a warning
#
# ==== Parameters
#
# * context - The context the check has been executed on.
# * message - The warning message.
# * info - The information hash that contains more info on the finding.
# * offset - The line offset that is added to the context's line property.
def add_warning(context, message, info = {}, offset = 0)
@warnings << Simplabs::Excellent::Warning.new(message, context.file, context.line + offset, info)
end
def warnings_for(filename) #:nodoc:
warnings.select { |warning| warning.filename == filename }
end
end
end
end
end