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 autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    first_let = find_first_let(node)
    first_let_position = first_let.loc.expression
    indent = "\n" + ' ' * first_let.loc.column
    corrector.insert_before(first_let_position, node.source + indent)
    corrector.remove(node_range(node))
  end
end

def find_first_let(node)

def find_first_let(node)
  node.parent.children.find { |sibling| let?(sibling) }
end

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 let?(node)

def let?(node)
  %i[let let!].include?(node.method_name)
end

def node_range(node)

def node_range(node)
  range_by_whole_lines(node.source_range, include_final_newline: true)
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)
    break add_offense(node, location: :expression) if let?(sibling)
  end
end