module ActionView::LookupContext::ViewPaths

def any?(name, prefixes = [], partial = false)

def any?(name, prefixes = [], partial = false)
  @view_paths.exists?(*args_for_any(name, prefixes, partial))
end

def args_for_any(name, prefixes, partial)

def args_for_any(name, prefixes, partial)
  name, prefixes = normalize_name(name, prefixes)
  details, details_key = detail_args_for_any
  [name, prefixes, partial || false, details, details_key]
end

def args_for_lookup(name, prefixes, partial, keys, details_options)

def args_for_lookup(name, prefixes, partial, keys, details_options)
  name, prefixes = normalize_name(name, prefixes)
  details, details_key = detail_args_for(details_options)
  [name, prefixes, partial || false, details, details_key, keys]
end

def build_view_paths(paths)

instance objects as we wish.
Whenever setting view paths, makes a copy so that we can manipulate them in
def build_view_paths(paths)
  ActionView::PathSet.new(Array(paths))
end

def detail_args_for(options) # :doc:

:doc:
Compute details hash and key according to user options (e.g. passed from #render).
def detail_args_for(options) # :doc:
  return @details, details_key if options.empty? # most common path.
  user_details = @details.merge(options)
  if @cache
    details_key = DetailsKey.details_cache_key(user_details)
  else
    details_key = nil
  end
  [user_details, details_key]
end

def detail_args_for_any

def detail_args_for_any
  @detail_args_for_any ||= begin
    details = {}
    registered_details.each do |k|
      if k == :variants
        details[k] = :any
      else
        details[k] = Accessors::DEFAULT_PROCS[k].call
      end
    end
    if @cache
      [details, DetailsKey.details_cache_key(details)]
    else
      [details, nil]
    end
  end
end

def exists?(name, prefixes = [], partial = false, keys = [], **options)

def exists?(name, prefixes = [], partial = false, keys = [], **options)
  @view_paths.exists?(*args_for_lookup(name, prefixes, partial, keys, options))
end

def find(name, prefixes = [], partial = false, keys = [], options = {})

def find(name, prefixes = [], partial = false, keys = [], options = {})
  @view_paths.find(*args_for_lookup(name, prefixes, partial, keys, options))
end

def find_all(name, prefixes = [], partial = false, keys = [], options = {})

def find_all(name, prefixes = [], partial = false, keys = [], options = {})
  @view_paths.find_all(*args_for_lookup(name, prefixes, partial, keys, options))
end

def normalize_name(name, prefixes)

name instead of the prefix.
as well as incorrectly putting part of the path in the template
Support legacy foo.erb names even though we now ignore .erb
def normalize_name(name, prefixes)
  prefixes = prefixes.presence
  parts    = name.to_s.split("/")
  parts.shift if parts.first.empty?
  name = parts.pop
  return name, prefixes || [""] if parts.empty?
  parts    = parts.join("/")
  prefixes = prefixes ? prefixes.map { |p| "#{p}/#{parts}" } : [parts]
  return name, prefixes
end

def with_fallbacks

a :file.
Adds fallbacks to the view paths. Useful in cases when you are rendering
def with_fallbacks
  view_paths = build_view_paths((@view_paths.paths + self.class.fallbacks).uniq)
  if block_given?
    raise ArgumentError, <<~eowarn.squish
    Calling `with_fallbacks` with a block is not supported. Call methods on
    the lookup context returned by `with_fallbacks` instead.
    eowarn
  else
    ActionView::LookupContext.new(view_paths, @details, @prefixes)
  end
end