class Solargraph::Workspace


in an associated Library or ApiMap.
project’s configuration. It provides a Source for each file to be used
A workspace consists of the files in a project’s directory and the

def config

Returns:
  • (Solargraph::Workspace::Config) -
def config
  @config ||= Solargraph::Workspace::Config.new(directory)
end

def configured_require_paths

Returns:
  • (Array) -
def configured_require_paths
  return ['lib'] if directory.empty?
  return [File.join(directory, 'lib')] if config.require_paths.empty?
  config.require_paths.map{|p| File.join(directory, p)}
end

def filenames

Returns:
  • (Array) -
def filenames
  source_hash.keys
end

def gemspec?

Returns:
  • (Boolean) -
def gemspec?
  !gemspecs.empty?
end

def gemspecs

Returns:
  • (Array) -
def gemspecs
  return [] if directory.empty? || directory == '*'
  @gemspecs ||= Dir[File.join(directory, '**/*.gemspec')].select do |gs|
    config.allow? gs
  end
end

def generate_require_paths

Returns:
  • (Array) -
def generate_require_paths
  return configured_require_paths unless gemspec?
  result = []
  gemspecs.each do |file|
    base = File.dirname(file)
    # HACK: Evaluating gemspec files violates the goal of not running

    #   workspace code, but this is how Gem::Specification.load does it

    #   anyway.

    Dir.chdir base do
      begin
        # @type [Gem::Specification]

        spec = eval(File.read(file), TOPLEVEL_BINDING, file)
        next unless Gem::Specification === spec
        @gemnames.push spec.name
        result.concat(spec.require_paths.map { |path| File.join(base, path) })
      rescue RuntimeError, ScriptError, Errno::ENOENT => e
        # Don't die if we have an error during eval-ing a gem spec.

        # Concat the default lib directory instead.

        Solargraph.logger.warn "Error reading #{file}: [#{e.class}] #{e.message}"
        result.push File.join(base, 'lib')
      end
    end
  end
  result.concat config.require_paths
  result.push File.join(directory, 'lib') if result.empty?
  result
end

def has_file? filename

Returns:
  • (Boolean) -

Parameters:
  • filename (String) --
def has_file? filename
  source_hash.key?(filename)
end

def initialize directory = '', config = nil

Parameters:
  • config (Config, nil) --
  • directory (String) --
def initialize directory = '', config = nil
  @directory = directory
  @config = config
  load_sources
  @gemnames = []
  @require_paths = generate_require_paths
  require_plugins
end

def load_sources

Returns:
  • (void) -
def load_sources
  source_hash.clear
  unless directory.empty? || directory == '*'
    size = config.calculated.length
    raise WorkspaceTooLargeError, "The workspace is too large to index (#{size} files, #{config.max_files} max)" if config.max_files > 0 and size > config.max_files
    config.calculated.each do |filename|
      begin
        source_hash[filename] = Solargraph::Source.load(filename)
      rescue Errno::ENOENT => e
        Solargraph.logger.warn("Error loading #{filename}: [#{e.class}] #{e.message}")
      end
    end
  end
end

def merge source

Returns:
  • (Boolean) - True if the source was added to the workspace

Parameters:
  • source (Solargraph::Source) --
def merge source
  unless directory == '*' || source_hash.key?(source.filename)
    # Reload the config to determine if a new source should be included

    @config = Solargraph::Workspace::Config.new(directory)
    return false unless config.calculated.include?(source.filename)
  end
  source_hash[source.filename] = source
  true
end

def remove filename

Returns:
  • (Boolean) - True if the source was removed from the workspace

Parameters:
  • filename (String) --
def remove filename
  return false unless source_hash.key?(filename)
  source_hash.delete filename
  true
end

def require_plugins

def require_plugins
  config.plugins.each do |plugin|
    begin
      require plugin
    rescue LoadError
      Solargraph.logger.warn "Failed to load plugin '#{plugin}'"
    end
  end
end

def source filename

Returns:
  • (Solargraph::Source) -

Parameters:
  • filename (String) --
def source filename
  source_hash[filename]
end

def source_hash

Returns:
  • (Hash{String => Solargraph::Source}) -
def source_hash
  @source_hash ||= {}
end

def sources

Returns:
  • (Array) -
def sources
  source_hash.values
end

def synchronize! updater

Returns:
  • (void) -

Parameters:
  • updater (Source::Updater) --
def synchronize! updater
  source_hash[updater.filename] = source_hash[updater.filename].synchronize(updater)
end

def would_merge? filename

Returns:
  • (Boolean) -

Parameters:
  • filename (String) --
def would_merge? filename
  return true if directory == '*' || source_hash.include?(filename)
  @config = Solargraph::Workspace::Config.new(directory)
  config.calculated.include?(filename)
end

def would_require? path

Returns:
  • (Boolean) -

Parameters:
  • path (String) --
def would_require? path
  require_paths.each do |rp|
    return true if File.exist?(File.join(rp, "#{path}.rb"))
  end
  false
end