class RuboCop::Cop::RSpec::LeadingSubject

end
end
expect(subject.valid?).to be(true)
it ‘is valid’ do
let(:params) { blah }
subject { described_class.new(params) }
RSpec.describe User do
# good
end
end
expect(subject.valid?).to be(true)
it ‘is valid’ do
subject { described_class.new(params) }
let(:params) { blah }
RSpec.describe User do
# bad
@example
Checks for ‘subject` definitions that come after `let` definitions.

def in_spec_block?(node)

def in_spec_block?(node)
  node.each_ancestor(:block).any? do |ancestor|
    Examples::ALL.include?(ancestor.method_name)
  end
end

def on_block(node)

def on_block(node)
  return unless subject?(node) && !in_spec_block?(node)
  node.parent.each_child_node do |sibling|
    break if sibling.equal?(node)
    if sibling.method_name.equal?(:let)
      break add_offense(node, :expression)
    end
  end
end