jimeh-solargraph 0.40.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +54 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +24 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +1003 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +123 -0
- data/Rakefile +25 -0
- data/SPONSORS.md +15 -0
- data/bin/solargraph +5 -0
- data/jimeh-solargraph.gemspec +44 -0
- data/lib/.rubocop.yml +21 -0
- data/lib/solargraph.rb +67 -0
- data/lib/solargraph/api_map.rb +752 -0
- data/lib/solargraph/api_map/bundler_methods.rb +27 -0
- data/lib/solargraph/api_map/cache.rb +70 -0
- data/lib/solargraph/api_map/source_to_yard.rb +81 -0
- data/lib/solargraph/api_map/store.rb +256 -0
- data/lib/solargraph/bench.rb +30 -0
- data/lib/solargraph/compat.rb +23 -0
- data/lib/solargraph/complex_type.rb +213 -0
- data/lib/solargraph/complex_type/type_methods.rb +127 -0
- data/lib/solargraph/complex_type/unique_type.rb +75 -0
- data/lib/solargraph/convention.rb +47 -0
- data/lib/solargraph/convention/base.rb +33 -0
- data/lib/solargraph/convention/gemfile.rb +15 -0
- data/lib/solargraph/convention/gemspec.rb +22 -0
- data/lib/solargraph/convention/rspec.rb +21 -0
- data/lib/solargraph/converters/dd.rb +12 -0
- data/lib/solargraph/converters/dl.rb +12 -0
- data/lib/solargraph/converters/dt.rb +12 -0
- data/lib/solargraph/converters/misc.rb +1 -0
- data/lib/solargraph/diagnostics.rb +55 -0
- data/lib/solargraph/diagnostics/base.rb +29 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
- data/lib/solargraph/diagnostics/rubocop.rb +90 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +45 -0
- data/lib/solargraph/diagnostics/severities.rb +15 -0
- data/lib/solargraph/diagnostics/type_check.rb +54 -0
- data/lib/solargraph/diagnostics/update_errors.rb +41 -0
- data/lib/solargraph/documentor.rb +78 -0
- data/lib/solargraph/environ.rb +45 -0
- data/lib/solargraph/language_server.rb +19 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
- data/lib/solargraph/language_server/error_codes.rb +20 -0
- data/lib/solargraph/language_server/host.rb +746 -0
- data/lib/solargraph/language_server/host/cataloger.rb +56 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
- data/lib/solargraph/language_server/host/dispatch.rb +112 -0
- data/lib/solargraph/language_server/host/sources.rb +156 -0
- data/lib/solargraph/language_server/message.rb +92 -0
- data/lib/solargraph/language_server/message/base.rb +85 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
- data/lib/solargraph/language_server/message/client.rb +11 -0
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
- data/lib/solargraph/language_server/message/completion_item.rb +11 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
- data/lib/solargraph/language_server/message/extended.rb +21 -0
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -0
- data/lib/solargraph/language_server/message/extended/document.rb +20 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
- data/lib/solargraph/language_server/message/extended/search.rb +20 -0
- data/lib/solargraph/language_server/message/initialize.rb +153 -0
- data/lib/solargraph/language_server/message/initialized.rb +26 -0
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
- data/lib/solargraph/language_server/message/shutdown.rb +13 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -0
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +105 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
- data/lib/solargraph/language_server/message/workspace.rb +14 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
- data/lib/solargraph/language_server/message_types.rb +14 -0
- data/lib/solargraph/language_server/request.rb +24 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
- data/lib/solargraph/language_server/transport.rb +13 -0
- data/lib/solargraph/language_server/transport/adapter.rb +56 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
- data/lib/solargraph/language_server/uri_helpers.rb +49 -0
- data/lib/solargraph/library.rb +426 -0
- data/lib/solargraph/location.rb +37 -0
- data/lib/solargraph/logging.rb +27 -0
- data/lib/solargraph/page.rb +83 -0
- data/lib/solargraph/parser.rb +26 -0
- data/lib/solargraph/parser/comment_ripper.rb +52 -0
- data/lib/solargraph/parser/legacy.rb +12 -0
- data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
- data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
- data/lib/solargraph/parser/legacy/node_methods.rb +311 -0
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -0
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/node_methods.rb +43 -0
- data/lib/solargraph/parser/node_processor.rb +43 -0
- data/lib/solargraph/parser/node_processor/base.rb +80 -0
- data/lib/solargraph/parser/region.rb +66 -0
- data/lib/solargraph/parser/rubyvm.rb +40 -0
- data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
- data/lib/solargraph/parser/rubyvm/node_methods.rb +301 -0
- data/lib/solargraph/parser/rubyvm/node_processors.rb +62 -0
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +86 -0
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -0
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/snippet.rb +13 -0
- data/lib/solargraph/pin.rb +36 -0
- data/lib/solargraph/pin/base.rb +296 -0
- data/lib/solargraph/pin/base_variable.rb +84 -0
- data/lib/solargraph/pin/block.rb +62 -0
- data/lib/solargraph/pin/class_variable.rb +8 -0
- data/lib/solargraph/pin/closure.rb +37 -0
- data/lib/solargraph/pin/common.rb +70 -0
- data/lib/solargraph/pin/constant.rb +43 -0
- data/lib/solargraph/pin/conversions.rb +96 -0
- data/lib/solargraph/pin/documenting.rb +105 -0
- data/lib/solargraph/pin/duck_method.rb +16 -0
- data/lib/solargraph/pin/global_variable.rb +8 -0
- data/lib/solargraph/pin/instance_variable.rb +30 -0
- data/lib/solargraph/pin/keyword.rb +15 -0
- data/lib/solargraph/pin/keyword_param.rb +8 -0
- data/lib/solargraph/pin/local_variable.rb +21 -0
- data/lib/solargraph/pin/localized.rb +43 -0
- data/lib/solargraph/pin/method.rb +245 -0
- data/lib/solargraph/pin/method_alias.rb +31 -0
- data/lib/solargraph/pin/namespace.rb +85 -0
- data/lib/solargraph/pin/parameter.rb +206 -0
- data/lib/solargraph/pin/proxy_type.rb +29 -0
- data/lib/solargraph/pin/reference.rb +14 -0
- data/lib/solargraph/pin/reference/extend.rb +10 -0
- data/lib/solargraph/pin/reference/include.rb +10 -0
- data/lib/solargraph/pin/reference/override.rb +29 -0
- data/lib/solargraph/pin/reference/prepend.rb +10 -0
- data/lib/solargraph/pin/reference/require.rb +14 -0
- data/lib/solargraph/pin/reference/superclass.rb +10 -0
- data/lib/solargraph/pin/singleton.rb +11 -0
- data/lib/solargraph/pin/symbol.rb +47 -0
- data/lib/solargraph/position.rb +100 -0
- data/lib/solargraph/range.rb +95 -0
- data/lib/solargraph/server_methods.rb +16 -0
- data/lib/solargraph/shell.rb +222 -0
- data/lib/solargraph/source.rb +537 -0
- data/lib/solargraph/source/chain.rb +154 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +203 -0
- data/lib/solargraph/source/chain/class_variable.rb +13 -0
- data/lib/solargraph/source/chain/constant.rb +75 -0
- data/lib/solargraph/source/chain/global_variable.rb +13 -0
- data/lib/solargraph/source/chain/head.rb +35 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -0
- data/lib/solargraph/source/chain/link.rb +67 -0
- data/lib/solargraph/source/chain/literal.rb +23 -0
- data/lib/solargraph/source/chain/or.rb +23 -0
- data/lib/solargraph/source/chain/variable.rb +13 -0
- data/lib/solargraph/source/chain/z_super.rb +30 -0
- data/lib/solargraph/source/change.rb +79 -0
- data/lib/solargraph/source/cursor.rb +164 -0
- data/lib/solargraph/source/encoding_fixes.rb +23 -0
- data/lib/solargraph/source/source_chainer.rb +190 -0
- data/lib/solargraph/source/updater.rb +54 -0
- data/lib/solargraph/source_map.rb +188 -0
- data/lib/solargraph/source_map/clip.rb +224 -0
- data/lib/solargraph/source_map/completion.rb +23 -0
- data/lib/solargraph/source_map/mapper.rb +215 -0
- data/lib/solargraph/type_checker.rb +503 -0
- data/lib/solargraph/type_checker/checks.rb +99 -0
- data/lib/solargraph/type_checker/param_def.rb +35 -0
- data/lib/solargraph/type_checker/problem.rb +32 -0
- data/lib/solargraph/type_checker/rules.rb +57 -0
- data/lib/solargraph/version.rb +5 -0
- data/lib/solargraph/views/_method.erb +62 -0
- data/lib/solargraph/views/_name_type_tag.erb +10 -0
- data/lib/solargraph/views/_namespace.erb +24 -0
- data/lib/solargraph/views/document.erb +23 -0
- data/lib/solargraph/views/environment.erb +58 -0
- data/lib/solargraph/views/layout.erb +44 -0
- data/lib/solargraph/views/search.erb +11 -0
- data/lib/solargraph/workspace.rb +209 -0
- data/lib/solargraph/workspace/config.rb +230 -0
- data/lib/solargraph/yard_map.rb +435 -0
- data/lib/solargraph/yard_map/cache.rb +19 -0
- data/lib/solargraph/yard_map/core_docs.rb +170 -0
- data/lib/solargraph/yard_map/core_fills.rb +185 -0
- data/lib/solargraph/yard_map/core_gen.rb +76 -0
- data/lib/solargraph/yard_map/helpers.rb +16 -0
- data/lib/solargraph/yard_map/mapper.rb +77 -0
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -0
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -0
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -0
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -0
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -0
- data/lib/solargraph/yard_map/to_method.rb +79 -0
- data/lib/yard-solargraph.rb +30 -0
- data/yardoc/2.2.2.tar.gz +0 -0
- metadata +564 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
class Host
|
6
|
+
# An asynchronous library cataloging handler.
|
7
|
+
#
|
8
|
+
class Cataloger
|
9
|
+
def initialize host
|
10
|
+
@host = host
|
11
|
+
@stopped = true
|
12
|
+
end
|
13
|
+
|
14
|
+
# Stop the catalog thread.
|
15
|
+
#
|
16
|
+
# @return [void]
|
17
|
+
def stop
|
18
|
+
@stopped = true
|
19
|
+
end
|
20
|
+
|
21
|
+
# True if the cataloger is stopped.
|
22
|
+
#
|
23
|
+
# @return [Boolean]
|
24
|
+
def stopped?
|
25
|
+
@stopped
|
26
|
+
end
|
27
|
+
|
28
|
+
# Start the catalog thread.
|
29
|
+
#
|
30
|
+
# @return [void]
|
31
|
+
def start
|
32
|
+
return unless stopped?
|
33
|
+
@stopped = false
|
34
|
+
Thread.new do
|
35
|
+
until stopped?
|
36
|
+
tick
|
37
|
+
sleep 0.01
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Perform cataloging.
|
43
|
+
#
|
44
|
+
# @return [void]
|
45
|
+
def tick
|
46
|
+
host.catalog
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
# @return [Host]
|
52
|
+
attr_reader :host
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
class Host
|
6
|
+
# An asynchronous diagnosis reporter.
|
7
|
+
#
|
8
|
+
class Diagnoser
|
9
|
+
# @param host [Host]
|
10
|
+
def initialize host
|
11
|
+
@host = host
|
12
|
+
@mutex = Mutex.new
|
13
|
+
@queue = []
|
14
|
+
@stopped = true
|
15
|
+
end
|
16
|
+
|
17
|
+
# Schedule a file to be diagnosed.
|
18
|
+
#
|
19
|
+
# @param uri [String]
|
20
|
+
# @return [void]
|
21
|
+
def schedule uri
|
22
|
+
mutex.synchronize { queue.push uri }
|
23
|
+
end
|
24
|
+
|
25
|
+
# Stop the diagnosis thread.
|
26
|
+
#
|
27
|
+
# @return [void]
|
28
|
+
def stop
|
29
|
+
@stopped = true
|
30
|
+
end
|
31
|
+
|
32
|
+
# True is the diagnoser is stopped.
|
33
|
+
#
|
34
|
+
# @return [Boolean]
|
35
|
+
def stopped?
|
36
|
+
@stopped
|
37
|
+
end
|
38
|
+
|
39
|
+
# Start the diagnosis thread.
|
40
|
+
#
|
41
|
+
# @return [self]
|
42
|
+
def start
|
43
|
+
return unless @stopped
|
44
|
+
@stopped = false
|
45
|
+
Thread.new do
|
46
|
+
until stopped?
|
47
|
+
tick
|
48
|
+
sleep 0.1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
self
|
52
|
+
end
|
53
|
+
|
54
|
+
# Perform diagnoses.
|
55
|
+
#
|
56
|
+
# @return [void]
|
57
|
+
def tick
|
58
|
+
return if queue.empty? || host.synchronizing?
|
59
|
+
if !host.options['diagnostics']
|
60
|
+
mutex.synchronize { queue.clear }
|
61
|
+
return
|
62
|
+
end
|
63
|
+
current = mutex.synchronize { queue.shift }
|
64
|
+
return if queue.include?(current)
|
65
|
+
host.diagnose current
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# @return [Host]
|
71
|
+
attr_reader :host
|
72
|
+
|
73
|
+
# @return [Mutex]
|
74
|
+
attr_reader :mutex
|
75
|
+
|
76
|
+
# @return [Array]
|
77
|
+
attr_reader :queue
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
class Host
|
6
|
+
# Methods for associating sources with libraries via URIs.
|
7
|
+
#
|
8
|
+
module Dispatch
|
9
|
+
# @return [Sources]
|
10
|
+
def sources
|
11
|
+
@sources ||= begin
|
12
|
+
src = Sources.new
|
13
|
+
src.add_observer self, :update_libraries
|
14
|
+
src
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Array<Library>]
|
19
|
+
def libraries
|
20
|
+
@libraries ||= []
|
21
|
+
end
|
22
|
+
|
23
|
+
# The Sources observer callback that merges a source into the host's
|
24
|
+
# libraries when it gets updated.
|
25
|
+
#
|
26
|
+
# @param uri [String]
|
27
|
+
# @return [void]
|
28
|
+
def update_libraries uri
|
29
|
+
src = sources.find(uri)
|
30
|
+
libraries.each do |lib|
|
31
|
+
lib.merge src if lib.contain?(src.filename)
|
32
|
+
end
|
33
|
+
diagnoser.schedule uri
|
34
|
+
end
|
35
|
+
|
36
|
+
# Find the best libary match for the given URI.
|
37
|
+
#
|
38
|
+
# @param uri [String]
|
39
|
+
# @return [Library]
|
40
|
+
def library_for uri
|
41
|
+
result = explicit_library_for(uri) ||
|
42
|
+
implicit_library_for(uri) ||
|
43
|
+
generic_library_for(uri)
|
44
|
+
result.attach sources.find(uri) if sources.include?(uri)
|
45
|
+
result
|
46
|
+
end
|
47
|
+
|
48
|
+
# Find an explicit library match for the given URI. An explicit match
|
49
|
+
# means the libary's workspace includes the file.
|
50
|
+
#
|
51
|
+
# If a matching library is found, the source corresponding to the URI
|
52
|
+
# gets attached to it.
|
53
|
+
#
|
54
|
+
# @raise [FileNotFoundError] if the source could not be attached.
|
55
|
+
#
|
56
|
+
# @param uri [String]
|
57
|
+
# @return [Library, nil]
|
58
|
+
def explicit_library_for uri
|
59
|
+
filename = UriHelpers.uri_to_file(uri)
|
60
|
+
libraries.each do |lib|
|
61
|
+
if lib.contain?(filename)
|
62
|
+
lib.attach sources.find(uri) if sources.include?(uri)
|
63
|
+
return lib
|
64
|
+
end
|
65
|
+
end
|
66
|
+
nil
|
67
|
+
end
|
68
|
+
|
69
|
+
# Find an implicit library match for the given URI. An implicit match
|
70
|
+
# means the file is located inside the library's workspace directory,
|
71
|
+
# regardless of whether the workspace is configured to include it.
|
72
|
+
#
|
73
|
+
# If a matching library is found, the source corresponding to the URI
|
74
|
+
# gets attached to it.
|
75
|
+
#
|
76
|
+
# @raise [FileNotFoundError] if the source could not be attached.
|
77
|
+
#
|
78
|
+
# @param uri [String]
|
79
|
+
# @return [Library, nil]
|
80
|
+
def implicit_library_for uri
|
81
|
+
filename = UriHelpers.uri_to_file(uri)
|
82
|
+
libraries.each do |lib|
|
83
|
+
if filename.start_with?(lib.workspace.directory)
|
84
|
+
lib.attach sources.find(uri)
|
85
|
+
lib.catalog
|
86
|
+
return lib
|
87
|
+
end
|
88
|
+
end
|
89
|
+
nil
|
90
|
+
end
|
91
|
+
|
92
|
+
# Get a generic library for the given URI and attach the corresponding
|
93
|
+
# source.
|
94
|
+
#
|
95
|
+
# @raise [FileNotFoundError] if the source could not be attached.
|
96
|
+
#
|
97
|
+
# @param uri [String]
|
98
|
+
# @return [Library]
|
99
|
+
def generic_library_for uri
|
100
|
+
generic_library.attach sources.find(uri)
|
101
|
+
generic_library.catalog
|
102
|
+
generic_library
|
103
|
+
end
|
104
|
+
|
105
|
+
# @return [Library]
|
106
|
+
def generic_library
|
107
|
+
@generic_library ||= Solargraph::Library.new
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'observer'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
class Host
|
8
|
+
# A Host class for managing sources.
|
9
|
+
#
|
10
|
+
class Sources
|
11
|
+
include Observable
|
12
|
+
include UriHelpers
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
@mutex = Mutex.new
|
16
|
+
@stopped = true
|
17
|
+
@has_uri = ConditionVariable.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def stopped?
|
21
|
+
@stopped
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [void]
|
25
|
+
def start
|
26
|
+
return unless @stopped
|
27
|
+
@stopped = false
|
28
|
+
Thread.new do
|
29
|
+
tick until stopped?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
# @return [void]
|
34
|
+
def tick
|
35
|
+
uri = mutex.synchronize { next_uri }
|
36
|
+
|
37
|
+
return if queue.include?(uri)
|
38
|
+
mutex.synchronize do
|
39
|
+
nxt = open_source_hash[uri].finish_synchronize
|
40
|
+
open_source_hash[uri] = nxt
|
41
|
+
changed
|
42
|
+
notify_observers uri
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# @return [void]
|
47
|
+
def add_uri(uri)
|
48
|
+
queue.push(uri)
|
49
|
+
@has_uri.signal
|
50
|
+
end
|
51
|
+
|
52
|
+
# @return [String]
|
53
|
+
def next_uri
|
54
|
+
@has_uri.wait(mutex) if queue.empty?
|
55
|
+
queue.shift
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [void]
|
59
|
+
def stop
|
60
|
+
@stopped = true
|
61
|
+
end
|
62
|
+
|
63
|
+
# Open a source.
|
64
|
+
#
|
65
|
+
# @param uri [String]
|
66
|
+
# @param text [String]
|
67
|
+
# @param version [Integer]
|
68
|
+
# @return [Source]
|
69
|
+
def open uri, text, version
|
70
|
+
filename = uri_to_file(uri)
|
71
|
+
source = Solargraph::Source.new(text, filename, version)
|
72
|
+
open_source_hash[uri] = source
|
73
|
+
end
|
74
|
+
|
75
|
+
def open_from_disk uri
|
76
|
+
source = Solargraph::Source.load(UriHelpers.uri_to_file(uri))
|
77
|
+
open_source_hash[uri] = source
|
78
|
+
end
|
79
|
+
|
80
|
+
# Update an existing source.
|
81
|
+
#
|
82
|
+
# @raise [FileNotFoundError] if the URI does not match an open source.
|
83
|
+
#
|
84
|
+
# @param uri [String]
|
85
|
+
# @param updater [Source::Updater]
|
86
|
+
# @return [Source]
|
87
|
+
def update uri, updater
|
88
|
+
src = find(uri)
|
89
|
+
mutex.synchronize { open_source_hash[uri] = src.synchronize(updater) }
|
90
|
+
changed
|
91
|
+
notify_observers uri
|
92
|
+
end
|
93
|
+
|
94
|
+
# @param uri [String]
|
95
|
+
# @param updater [Source::Updater]
|
96
|
+
# @return [void]
|
97
|
+
def async_update uri, updater
|
98
|
+
src = find(uri)
|
99
|
+
mutex.synchronize do
|
100
|
+
open_source_hash[uri] = src.start_synchronize(updater)
|
101
|
+
add_uri(uri)
|
102
|
+
end
|
103
|
+
changed
|
104
|
+
notify_observers uri
|
105
|
+
end
|
106
|
+
|
107
|
+
# Find the source with the given URI.
|
108
|
+
#
|
109
|
+
# @raise [FileNotFoundError] if the URI does not match an open source.
|
110
|
+
#
|
111
|
+
# @param uri [String]
|
112
|
+
# @return [Source]
|
113
|
+
def find uri
|
114
|
+
open_source_hash[uri] || raise(Solargraph::FileNotFoundError, "Host could not find #{uri}")
|
115
|
+
end
|
116
|
+
|
117
|
+
# Close the source with the given URI.
|
118
|
+
#
|
119
|
+
# @param uri [String]
|
120
|
+
# @return [void]
|
121
|
+
def close uri
|
122
|
+
open_source_hash.delete uri
|
123
|
+
end
|
124
|
+
|
125
|
+
# True if a source with given URI is currently open.
|
126
|
+
# @param uri [String]
|
127
|
+
# @return [Boolean]
|
128
|
+
def include? uri
|
129
|
+
open_source_hash.key? uri
|
130
|
+
end
|
131
|
+
|
132
|
+
# @return [void]
|
133
|
+
def clear
|
134
|
+
open_source_hash.clear
|
135
|
+
end
|
136
|
+
|
137
|
+
private
|
138
|
+
|
139
|
+
# @return [Hash]
|
140
|
+
def open_source_hash
|
141
|
+
@open_source_hash ||= {}
|
142
|
+
end
|
143
|
+
|
144
|
+
# @return [Mutex]
|
145
|
+
attr_reader :mutex
|
146
|
+
|
147
|
+
# An array of source URIs that are waiting to finish synchronizing.
|
148
|
+
#
|
149
|
+
# @return [Array<String>]
|
150
|
+
def queue
|
151
|
+
@queue ||= []
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'solargraph'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
# The Message namespace contains classes that implement language server
|
8
|
+
# protocol methods.
|
9
|
+
#
|
10
|
+
module Message
|
11
|
+
autoload :Base, 'solargraph/language_server/message/base'
|
12
|
+
autoload :Initialize, 'solargraph/language_server/message/initialize'
|
13
|
+
autoload :Initialized, 'solargraph/language_server/message/initialized'
|
14
|
+
autoload :TextDocument, 'solargraph/language_server/message/text_document'
|
15
|
+
autoload :CompletionItem, 'solargraph/language_server/message/completion_item'
|
16
|
+
autoload :CancelRequest, 'solargraph/language_server/message/cancel_request'
|
17
|
+
autoload :MethodNotFound, 'solargraph/language_server/message/method_not_found'
|
18
|
+
autoload :MethodNotImplemented, 'solargraph/language_server/message/method_not_implemented'
|
19
|
+
autoload :Extended, 'solargraph/language_server/message/extended'
|
20
|
+
autoload :Shutdown, 'solargraph/language_server/message/shutdown'
|
21
|
+
autoload :ExitNotification, 'solargraph/language_server/message/exit_notification'
|
22
|
+
autoload :Workspace, 'solargraph/language_server/message/workspace'
|
23
|
+
|
24
|
+
class << self
|
25
|
+
# Register a method name and message for handling by the language
|
26
|
+
# server.
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# Message.register 'initialize', Solargraph::Message::Initialize
|
30
|
+
#
|
31
|
+
# @param path [String] The method name
|
32
|
+
# @param message_class [Class<Message::Base>] The message class
|
33
|
+
# @return [void]
|
34
|
+
def register path, message_class
|
35
|
+
method_map[path] = message_class
|
36
|
+
end
|
37
|
+
|
38
|
+
# @param path [String]
|
39
|
+
# @return [Class<Solargraph::LanguageServer::Message::Base>]
|
40
|
+
def select path
|
41
|
+
if method_map.has_key?(path)
|
42
|
+
method_map[path]
|
43
|
+
elsif path.start_with?('$/')
|
44
|
+
MethodNotImplemented
|
45
|
+
else
|
46
|
+
MethodNotFound
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# @return [Hash{String => Class<Message::Base>}]
|
53
|
+
def method_map
|
54
|
+
@method_map ||= {}
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
register 'initialize', Initialize
|
59
|
+
register 'initialized', Initialized
|
60
|
+
register 'textDocument/completion', TextDocument::Completion
|
61
|
+
register 'completionItem/resolve', CompletionItem::Resolve
|
62
|
+
register 'textDocument/signatureHelp', TextDocument::SignatureHelp
|
63
|
+
register 'textDocument/didOpen', TextDocument::DidOpen
|
64
|
+
register 'textDocument/didChange', TextDocument::DidChange
|
65
|
+
register 'textDocument/didSave', TextDocument::DidSave
|
66
|
+
register 'textDocument/didClose', TextDocument::DidClose
|
67
|
+
register 'textDocument/hover', TextDocument::Hover
|
68
|
+
register 'textDocument/definition', TextDocument::Definition
|
69
|
+
register 'textDocument/formatting', TextDocument::Formatting
|
70
|
+
register 'textDocument/onTypeFormatting', TextDocument::OnTypeFormatting
|
71
|
+
register 'textDocument/documentSymbol', TextDocument::DocumentSymbol
|
72
|
+
register 'textDocument/references', TextDocument::References
|
73
|
+
register 'textDocument/rename', TextDocument::Rename
|
74
|
+
register 'textDocument/prepareRename', TextDocument::PrepareRename
|
75
|
+
register 'textDocument/foldingRange', TextDocument::FoldingRange
|
76
|
+
register 'textDocument/codeAction', TextDocument::CodeAction
|
77
|
+
register 'workspace/didChangeWatchedFiles', Workspace::DidChangeWatchedFiles
|
78
|
+
register 'workspace/didChangeConfiguration', Workspace::DidChangeConfiguration
|
79
|
+
register 'workspace/didChangeWorkspaceFolders', Workspace::DidChangeWorkspaceFolders
|
80
|
+
register 'workspace/symbol', Workspace::WorkspaceSymbol
|
81
|
+
register '$/cancelRequest', CancelRequest
|
82
|
+
register '$/solargraph/document', Extended::Document
|
83
|
+
register '$/solargraph/search', Extended::Search
|
84
|
+
register '$/solargraph/checkGemVersion', Extended::CheckGemVersion
|
85
|
+
register '$/solargraph/documentGems', Extended::DocumentGems
|
86
|
+
register '$/solargraph/downloadCore', Extended::DownloadCore
|
87
|
+
register '$/solargraph/environment', Extended::Environment
|
88
|
+
register 'shutdown', Shutdown
|
89
|
+
register 'exit', ExitNotification
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|