Sha256: 7cc0297bc77d9fe21a641a7c5b6cdb9cd2e5b2bb37e6866372f4efe3578a8b42
Contents?: true
Size: 1.74 KB
Versions: 6789
Compression:
Stored size: 1.74 KB
Contents
# frozen_string_literal: true module RuboCop module Cop module Style # This cop checks that `include`, `extend` and `prepend` statements appear # inside classes and modules, not at the top level, so as to not affect # the behavior of `Object`. # # @example # # bad # include M # # class C # end # # # bad # extend M # # class C # end # # # bad # prepend M # # class C # end # # # good # class C # include M # end # # # good # class C # extend M # end # # # good # class C # prepend M # end class MixinUsage < Cop MSG = '`%<statement>s` is used at the top level. Use inside `class` ' \ 'or `module`.'.freeze def_node_matcher :include_statement, <<-PATTERN (send nil? ${:include :extend :prepend} const) PATTERN def on_send(node) include_statement(node) do |statement| return if node.argument? || accepted_include?(node) || belongs_to_class_or_module?(node) add_offense(node, message: format(MSG, statement: statement)) end end private def accepted_include?(node) node.parent && node.macro? end def belongs_to_class_or_module?(node) if !node.parent false else return true if node.parent.class_type? || node.parent.module_type? belongs_to_class_or_module?(node.parent) end end end end end end
Version data entries
6,789 entries across 6,783 versions & 25 rubygems