class RuboCop::Cop::Sorbet::ObsoleteStrictMemoization


end
@foo ||= T.let(Foo.new, T.nilable(Foo))
def foo
sig { returns(Foo) }
# good
end
@foo ||= Foo.new
@foo = T.let(nil, T.nilable(Foo))
# This would have been a mistake, causing the memoized value to be discarded and recomputed on every call.
def foo
sig { returns(Foo) }
# bad
end
@foo ||= Foo.new
@foo = T.let(@foo, T.nilable(Foo))
def foo
sig { returns(Foo) }
# bad
@example
See sorbet.org/docs/type-assertions#put-type-assertions-behind-memoization<br>It’s no longer required, as of Sorbet 0.5.10210
versions in ‘#typed: strict` files.
Checks for the obsolete pattern for initializing instance variables that was required for older Sorbet

def on_begin(node)

def on_begin(node)
  legacy_memoization_pattern?(node) do |first_asgn_node, ivar, t, ivar_type, second_or_asgn_node, init_expr| # rubocop:disable Metrics/ParameterLists
    add_offense(first_asgn_node) do |corrector|
      indent = offset(node)
      correction = "#{ivar} ||= #{t.source}.let(#{init_expr.source}, #{t.source}.nilable(#{ivar_type.source}))"
      # We know good places to put line breaks, if required.
      if line_length(indent + correction) > max_line_length || correction.include?("\n")
        correction = <<~RUBY.chomp
          #{ivar} ||= #{t.source}.let(
          #{indent}  #{init_expr.source.gsub("\n", "\n#{indent}")},
          #{indent}  #{t.source}.nilable(#{ivar_type.source.gsub("\n", "\n#{indent}")}),
          #{indent})
        RUBY
      end
      corrector.replace(
        range_between(first_asgn_node.source_range.begin_pos, second_or_asgn_node.source_range.end_pos),
        correction,
      )
    end
  end
end

def relevant_file?(file)

def relevant_file?(file)
  super && enabled_for_sorbet_static_version?
end