module Solargraph::LanguageServer::Host::Dispatch

def diagnoser

Returns:
  • (Host::Diagnoser) -

Other tags:
    Abstract: -
def diagnoser
  raise NotImplementedError, 'Host::Dispatch requires a diagnoser method'
end

def explicit_library_for uri

Returns:
  • (Library, nil) -

Parameters:
  • uri (String) --

Raises:
  • (FileNotFoundError) - if the source could not be attached.
def explicit_library_for uri
  filename = UriHelpers.uri_to_file(uri)
  libraries.each do |lib|
    if lib.contain?(filename)
      lib.attach sources.find(uri) if sources.include?(uri)
      return lib
    end
  end
  nil
end

def generic_library

Returns:
  • (Library) -
def generic_library
  @generic_library ||= Solargraph::Library.new(Solargraph::Workspace.new('', nil, options), nil)
                                          .tap { |lib| lib.add_observer self }
end

def generic_library_for uri

Returns:
  • (Library) -

Parameters:
  • uri (String) --

Raises:
  • (FileNotFoundError) - if the source could not be attached.
def generic_library_for uri
  generic_library.attach sources.find(uri)
  generic_library
end

def implicit_library_for uri

Returns:
  • (Library, nil) -

Parameters:
  • uri (String) --

Raises:
  • (FileNotFoundError) - if the source could not be attached.
def implicit_library_for uri
  filename = UriHelpers.uri_to_file(uri)
  libraries.each do |lib|
    if filename.start_with?(lib.workspace.directory)
      lib.attach sources.find(uri)
      return lib
    end
  end
  nil
end

def libraries

Returns:
  • (::Array) -
def libraries
  @libraries ||= []
end

def library_for uri

Returns:
  • (Library) -

Parameters:
  • uri (String) --
def library_for uri
  result = explicit_library_for(uri) ||
    implicit_library_for(uri) ||
    generic_library_for(uri)
  # previous library for already call attach. avoid call twice

  # result.attach sources.find(uri) if sources.include?(uri)

  result
end

def options

def options
  @options ||= {}.freeze
end

def sources

Returns:
  • (Sources) -
def sources
  @sources ||= begin
    src = Sources.new
    src.add_observer self, :update_libraries
    src
  end
end

def update progress

Returns:
  • (void) -

Parameters:
  • library (Solargraph::Library) --
def update progress
  progress&.send(self)
end

def update_libraries uri

Returns:
  • (void) -

Parameters:
  • uri (String) --
def update_libraries uri
  src = sources.find(uri)
  using = libraries.select { |lib| lib.contain?(src.filename) }
  using.push library_for(uri) if using.empty?
  using.each { |lib| lib.merge src }
  diagnoser.schedule uri
end