Module: Solargraph::LanguageServer::Host::Dispatch

Included in:
Solargraph::LanguageServer::Host
Defined in:
lib/solargraph/language_server/host/dispatch.rb

Overview

Methods for associating sources with libraries via URIs.

Instance Method Summary collapse

Instance Method Details

#explicit_library_for(uri) ⇒ Library?

Find an explicit library match for the given URI. An explicit match means the libary’s workspace includes the file.

If a matching library is found, the source corresponding to the URI gets attached to it.

Parameters:

  • uri (String)

Returns:

Raises:



59
60
61
62
63
64
65
66
67
68
# File 'lib/solargraph/language_server/host/dispatch.rb', line 59

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

#generic_libraryLibrary

Returns:



105
106
107
# File 'lib/solargraph/language_server/host/dispatch.rb', line 105

def generic_library
  @generic_library ||= Solargraph::Library.new
end

#generic_library_for(uri) ⇒ Library

Get a generic library for the given URI and attach the corresponding source.

Parameters:

  • uri (String)

Returns:

Raises:



99
100
101
102
# File 'lib/solargraph/language_server/host/dispatch.rb', line 99

def generic_library_for uri
  generic_library.attach sources.find(uri)
  generic_library
end

#implicit_library_for(uri) ⇒ Library?

Find an implicit library match for the given URI. An implicit match means the file is located inside the library’s workspace directory, regardless of whether the workspace is configured to include it.

If a matching library is found, the source corresponding to the URI gets attached to it.

Parameters:

  • uri (String)

Returns:

Raises:



81
82
83
84
85
86
87
88
89
90
# File 'lib/solargraph/language_server/host/dispatch.rb', line 81

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

#librariesArray<Library>

Returns:



19
20
21
# File 'lib/solargraph/language_server/host/dispatch.rb', line 19

def libraries
  @libraries ||= []
end

#library_for(uri) ⇒ Library

Find the best libary match for the given URI.

Parameters:

  • uri (String)

Returns:



40
41
42
43
44
45
46
47
# File 'lib/solargraph/language_server/host/dispatch.rb', line 40

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

#sourcesSources

Returns:



10
11
12
13
14
15
16
# File 'lib/solargraph/language_server/host/dispatch.rb', line 10

def sources
  @sources ||= begin
    src = Sources.new
    src.add_observer self, :update_libraries
    src
  end
end

#update_libraries(uri) ⇒ void

This method returns an undefined value.

The Sources observer callback that merges a source into the host’s libraries when it gets updated.

Parameters:

  • uri (String)


28
29
30
31
32
33
34
# File 'lib/solargraph/language_server/host/dispatch.rb', line 28

def update_libraries uri
  src = sources.find(uri)
  libraries.each do |lib|
    lib.merge src if lib.contain?(src.filename)
  end
  diagnoser.schedule uri
end