class Sorbet::Private::GemLoader

def self.my_require(gem)

before loading this file
This is so that the autoloader doesn't treat these as mandatory requires
def self.my_require(gem)
  require gem # rubocop:disable PrisonGuard/NoDynamicRequire
end

def self.require_all_gems

def self.require_all_gems
  require 'bundler/setup'
  require 'bundler/lockfile_parser'
  specs = []
  # Do not load gems in Gemfile where require is false
  gemfile_dependencies = Bundler.load.dependencies.
    reject { |dep| dep.autorequire && dep.autorequire.empty? }
  required_dependency_names = gemfile_dependencies.map(&:name)
  lockfile_parser = Bundler::LockfileParser.new(File.read(Bundler.default_lockfile))
  lockfile_parser.specs.each do |spec|
    # Only include the spec for a gem and it's dependencies if it's autorequired.
    if required_dependency_names.include?(spec.name)
      specs << spec
      specs << spec.dependencies
    end
  end
  specs.flatten!
  specs.uniq! { |spec| spec.name }
  specs = specs.to_set
  specs.sort_by(&:name).each do |gemspec|
    begin
      require_gem(gemspec.name)
    rescue LoadError => e
      puts "LoadError: #{e}"
    rescue NameError => e
      puts "NameError: #{e}"
    end
  end
  begin
    Bundler.require
  rescue NameError => e
    puts "NameError: #{e}"
  end
end

def self.require_gem(gem)

def self.require_gem(gem)
  if gem == NO_GEM
    require_all_gems
    return
  end
  loader = GEM_LOADER[gem]
  if loader
    begin
      loader.call
    rescue NameError => e
      puts "NameError: #{e}"
    end
  else
    begin
      require gem # rubocop:disable PrisonGuard/NoDynamicRequire
    rescue NameError => e
      puts "NameError: #{e}"
    end
  end
end