class RuboCop::Cop::Lint::ConstantDefinitionInBlock


end
end
Foo = new(“foo”)
enums do
class TestEnum < T::Enum
# sorbet.org/docs/tenum<br># ‘enums` for Typed Enums via `T::Enum` in Sorbet.
# good
@example AllowedMethods: [’enums’] (default)
end
end
const_set(:LIST, [])
included do
extend ActiveSupport::Concern
module M
# good
end
# see also ‘stub_const` for RSpec
let(:test_request) { Class.new }
describe ’making a request’ do
# good
end
files_to_lint = Dir[‘lib/*.rb’]
task :lint do
# good
end
end
LIST = []
included do
extend ActiveSupport::Concern
module M
# bad
end
class TestRequest; end
describe ‘making a request’ do
# bad
end
FILES_TO_LINT = Dir[‘lib/*.rb’]
task :lint do
# bad
@example
For meta-programming, use ‘const_set`.
in the outer scope would be problematic.
the block instead, or use a variable or method if defining the constant
If you are trying to define that constant once, define it outside of
isolate or namespace the constant in any way.
Do not define constants within a block, since the block’s scope does not

def method_name(node)

def method_name(node)
  node.ancestors.find(&:block_type?).send_node.method_name
end

def on_casgn(node)

def on_casgn(node)
  return if !constant_assigned_in_block?(node) || allowed_method?(method_name(node))
  add_offense(node)
end

def on_class(node)

def on_class(node)
  return if !module_defined_in_block?(node) || allowed_method?(method_name(node))
  add_offense(node)
end