solargraph 0.46.0 → 0.54.5
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 +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +37 -41
- data/.github/workflows/typecheck.yml +34 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.yardopts +2 -2
- data/CHANGELOG.md +1338 -1115
- data/Gemfile +0 -0
- data/LICENSE +1 -1
- data/README.md +131 -128
- data/Rakefile +0 -0
- data/SPONSORS.md +10 -18
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/cache.rb +109 -70
- data/lib/solargraph/api_map/index.rb +167 -0
- data/lib/solargraph/api_map/source_to_yard.rb +88 -81
- data/lib/solargraph/api_map/store.rb +260 -256
- data/lib/solargraph/api_map.rb +870 -686
- data/lib/solargraph/bench.rb +44 -27
- data/lib/solargraph/cache.rb +77 -0
- data/lib/solargraph/complex_type/type_methods.rb +217 -130
- data/lib/solargraph/complex_type/unique_type.rb +386 -75
- data/lib/solargraph/complex_type.rb +394 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rakefile.rb +17 -0
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +17 -12
- data/lib/solargraph/converters/dl.rb +15 -12
- data/lib/solargraph/converters/dt.rb +15 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +113 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +66 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +55 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/doc_map.rb +188 -0
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/equality.rb +33 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +128 -111
- data/lib/solargraph/language_server/host/message_worker.rb +106 -59
- data/lib/solargraph/language_server/host/sources.rb +99 -156
- data/lib/solargraph/language_server/host.rb +861 -865
- data/lib/solargraph/language_server/message/base.rb +96 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +112 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +19 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +191 -162
- data/lib/solargraph/language_server/message/initialized.rb +28 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +131 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -54
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -29
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +94 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/progress.rb +135 -0
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +68 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +74 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +20 -19
- data/lib/solargraph/library.rb +663 -546
- data/lib/solargraph/location.rb +58 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +89 -83
- data/lib/solargraph/parser/comment_ripper.rb +56 -52
- data/lib/solargraph/parser/node_methods.rb +83 -43
- data/lib/solargraph/parser/node_processor/base.rb +87 -77
- data/lib/solargraph/parser/node_processor.rb +45 -43
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +153 -135
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +18 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +164 -148
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +43 -42
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +35 -25
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +50 -63
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +259 -257
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/snippet.rb +15 -13
- data/lib/solargraph/parser.rb +22 -26
- data/lib/solargraph/pin/base.rb +378 -296
- data/lib/solargraph/pin/base_variable.rb +118 -84
- data/lib/solargraph/pin/block.rb +101 -72
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +57 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +123 -96
- data/lib/solargraph/pin/delegated_method.rb +101 -0
- data/lib/solargraph/pin/documenting.rb +98 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +34 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +67 -55
- data/lib/solargraph/pin/method.rb +527 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +107 -91
- data/lib/solargraph/pin/parameter.rb +212 -201
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +22 -14
- data/lib/solargraph/pin/search.rb +56 -56
- data/lib/solargraph/pin/signature.rb +17 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +41 -37
- data/lib/solargraph/position.rb +107 -100
- data/lib/solargraph/range.rb +98 -95
- data/lib/solargraph/rbs_map/conversions.rb +646 -0
- data/lib/solargraph/rbs_map/core_fills.rb +50 -0
- data/lib/solargraph/rbs_map/core_map.rb +28 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
- data/lib/solargraph/rbs_map.rb +93 -0
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +269 -226
- data/lib/solargraph/source/chain/array.rb +33 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +303 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +89 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +33 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/if.rb +28 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +98 -71
- data/lib/solargraph/source/chain/literal.rb +28 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +252 -164
- data/lib/solargraph/source/change.rb +82 -79
- data/lib/solargraph/source/cursor.rb +167 -164
- data/lib/solargraph/source/source_chainer.rb +194 -191
- data/lib/solargraph/source/updater.rb +55 -54
- data/lib/solargraph/source.rb +495 -522
- data/lib/solargraph/source_map/clip.rb +232 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map/mapper.rb +255 -212
- data/lib/solargraph/source_map.rb +217 -180
- data/lib/solargraph/type_checker/checks.rb +120 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +62 -57
- data/lib/solargraph/type_checker.rb +672 -543
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +56 -58
- data/lib/solargraph/workspace/config.rb +239 -231
- data/lib/solargraph/workspace.rb +239 -215
- data/lib/solargraph/yard_map/cache.rb +25 -19
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +26 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +94 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +28 -27
- data/lib/solargraph/yard_map/mapper.rb +78 -77
- data/lib/solargraph/yard_map/to_method.rb +86 -79
- data/lib/solargraph/yard_map.rb +18 -460
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +72 -69
- data/solargraph.gemspec +21 -10
- metadata +184 -115
- data/.travis.yml +0 -19
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/compat.rb +0 -37
- data/lib/solargraph/convention/rspec.rb +0 -30
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/yard_map/core_docs.rb +0 -170
- data/lib/solargraph/yard_map/core_fills.rb +0 -208
- data/lib/solargraph/yard_map/core_gen.rb +0 -76
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
- data/lib/yard-solargraph.rb +0 -33
- data/yardoc/2.2.2.tar.gz +0 -0
@@ -0,0 +1,135 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'securerandom'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
# Progress notification handling for language server hosts.
|
8
|
+
#
|
9
|
+
class Progress
|
10
|
+
WAITING = :waiting
|
11
|
+
CREATED = :created
|
12
|
+
FINISHED = :finished
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
attr_reader :uuid
|
16
|
+
|
17
|
+
# @return [String]
|
18
|
+
attr_reader :title
|
19
|
+
|
20
|
+
# @return [String, nil]
|
21
|
+
attr_reader :kind
|
22
|
+
|
23
|
+
# @return [String, nil]
|
24
|
+
attr_reader :message
|
25
|
+
|
26
|
+
# @return [Integer]
|
27
|
+
attr_reader :percentage
|
28
|
+
|
29
|
+
# @return [Symbol]
|
30
|
+
attr_reader :status
|
31
|
+
|
32
|
+
# @param title [String]
|
33
|
+
def initialize title
|
34
|
+
@title = title
|
35
|
+
@uuid = SecureRandom.uuid
|
36
|
+
@percentage = 0
|
37
|
+
@status = WAITING
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param message [String]
|
41
|
+
# @param percentage [Integer]
|
42
|
+
def begin message, percentage
|
43
|
+
@kind = 'begin'
|
44
|
+
@message = message
|
45
|
+
@percentage = percentage
|
46
|
+
end
|
47
|
+
|
48
|
+
# @param message [String]
|
49
|
+
# @param percentage [Integer]
|
50
|
+
def report message, percentage
|
51
|
+
@kind = 'report'
|
52
|
+
@message = message
|
53
|
+
@percentage = percentage
|
54
|
+
end
|
55
|
+
|
56
|
+
# @param message [String]
|
57
|
+
def finish message
|
58
|
+
@kind = 'end'
|
59
|
+
@message = message
|
60
|
+
@percentage = 100
|
61
|
+
true
|
62
|
+
end
|
63
|
+
|
64
|
+
# @param host [Solargraph::LanguageServer::Host]
|
65
|
+
def send host
|
66
|
+
return unless host.client_supports_progress? && !finished?
|
67
|
+
|
68
|
+
message = build
|
69
|
+
create(host)
|
70
|
+
host.send_notification '$/progress', message
|
71
|
+
@status = FINISHED if kind == 'end'
|
72
|
+
keep_alive host
|
73
|
+
end
|
74
|
+
|
75
|
+
def created?
|
76
|
+
[CREATED, FINISHED].include?(status)
|
77
|
+
end
|
78
|
+
|
79
|
+
def finished?
|
80
|
+
status == FINISHED
|
81
|
+
end
|
82
|
+
|
83
|
+
private
|
84
|
+
|
85
|
+
# @param host [Solargraph::LanguageServer::Host]
|
86
|
+
# @return [void]
|
87
|
+
def create host
|
88
|
+
return if created?
|
89
|
+
|
90
|
+
host.send_request 'window/workDoneProgress/create', { token: uuid }
|
91
|
+
@status = CREATED
|
92
|
+
end
|
93
|
+
|
94
|
+
def build
|
95
|
+
{
|
96
|
+
token: uuid,
|
97
|
+
value: {
|
98
|
+
kind: kind,
|
99
|
+
cancellable: false
|
100
|
+
}.merge(build_value)
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
def build_value
|
105
|
+
case kind
|
106
|
+
when 'begin'
|
107
|
+
{ title: title, message: message, percentage: percentage }
|
108
|
+
when 'report'
|
109
|
+
{ message: message, percentage: percentage }
|
110
|
+
when 'end'
|
111
|
+
{ message: message }
|
112
|
+
else
|
113
|
+
raise "Invalid progress kind #{kind}"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# @param host [Host]
|
118
|
+
def keep_alive host
|
119
|
+
mutex.synchronize { @last = Time.now }
|
120
|
+
@keep_alive ||= Thread.new do
|
121
|
+
until finished?
|
122
|
+
sleep 10
|
123
|
+
break if finished?
|
124
|
+
next if mutex.synchronize { Time.now - @last < 10 }
|
125
|
+
send host
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
def mutex
|
131
|
+
@mutex ||= Mutex.new
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -1,24 +1,24 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
module LanguageServer
|
5
|
-
class Request
|
6
|
-
# @param id [Integer]
|
7
|
-
# @param &block The block that processes the client's response
|
8
|
-
def initialize id, &block
|
9
|
-
@id = id
|
10
|
-
@block = block
|
11
|
-
end
|
12
|
-
|
13
|
-
# @param result [Object]
|
14
|
-
# @return [void]
|
15
|
-
def process result
|
16
|
-
@block.call(result) unless @block.nil?
|
17
|
-
end
|
18
|
-
|
19
|
-
def send_response
|
20
|
-
# noop
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
class Request
|
6
|
+
# @param id [Integer]
|
7
|
+
# @param &block The block that processes the client's response
|
8
|
+
def initialize id, &block
|
9
|
+
@id = id
|
10
|
+
@block = block
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param result [Object]
|
14
|
+
# @return [void]
|
15
|
+
def process result
|
16
|
+
@block.call(result) unless @block.nil?
|
17
|
+
end
|
18
|
+
|
19
|
+
def send_response
|
20
|
+
# noop
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -1,36 +1,36 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
module LanguageServer
|
5
|
-
# The SymbolKind constants for the language server protocol.
|
6
|
-
#
|
7
|
-
module SymbolKinds
|
8
|
-
FILE = 1
|
9
|
-
MODULE = 2
|
10
|
-
NAMESPACE = 3
|
11
|
-
PACKAGE = 4
|
12
|
-
CLASS = 5
|
13
|
-
METHOD = 6
|
14
|
-
PROPERTY = 7
|
15
|
-
FIELD = 8
|
16
|
-
CONSTRUCTOR = 9
|
17
|
-
ENUM = 10
|
18
|
-
INTERFACE = 11
|
19
|
-
FUNCTION = 12
|
20
|
-
VARIABLE = 13
|
21
|
-
CONSTANT = 14
|
22
|
-
STRING = 15
|
23
|
-
NUMBER = 16
|
24
|
-
BOOLEAN = 17
|
25
|
-
ARRAY = 18
|
26
|
-
OBJECT = 19
|
27
|
-
KEY = 20
|
28
|
-
NULL = 21
|
29
|
-
ENUM_MEMBER = 22
|
30
|
-
STRUCT = 23
|
31
|
-
EVENT = 24
|
32
|
-
OPERATOR = 25
|
33
|
-
TYPE_PARAMETER = 26
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
# The SymbolKind constants for the language server protocol.
|
6
|
+
#
|
7
|
+
module SymbolKinds
|
8
|
+
FILE = 1
|
9
|
+
MODULE = 2
|
10
|
+
NAMESPACE = 3
|
11
|
+
PACKAGE = 4
|
12
|
+
CLASS = 5
|
13
|
+
METHOD = 6
|
14
|
+
PROPERTY = 7
|
15
|
+
FIELD = 8
|
16
|
+
CONSTRUCTOR = 9
|
17
|
+
ENUM = 10
|
18
|
+
INTERFACE = 11
|
19
|
+
FUNCTION = 12
|
20
|
+
VARIABLE = 13
|
21
|
+
CONSTANT = 14
|
22
|
+
STRING = 15
|
23
|
+
NUMBER = 16
|
24
|
+
BOOLEAN = 17
|
25
|
+
ARRAY = 18
|
26
|
+
OBJECT = 19
|
27
|
+
KEY = 20
|
28
|
+
NULL = 21
|
29
|
+
ENUM_MEMBER = 22
|
30
|
+
STRUCT = 23
|
31
|
+
EVENT = 24
|
32
|
+
OPERATOR = 25
|
33
|
+
TYPE_PARAMETER = 26
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -1,53 +1,68 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'backport'
|
4
|
-
|
5
|
-
module Solargraph
|
6
|
-
module LanguageServer
|
7
|
-
module Transport
|
8
|
-
# A common module for running language servers in Backport.
|
9
|
-
#
|
10
|
-
module Adapter
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
@data_reader.
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'backport'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
module Transport
|
8
|
+
# A common module for running language servers in Backport.
|
9
|
+
#
|
10
|
+
module Adapter
|
11
|
+
# This runs in the context of Backport::Adapter, which
|
12
|
+
# provides write() - but if we didn't hide this behind a parse
|
13
|
+
# tag, it would override the one in the class.
|
14
|
+
#
|
15
|
+
# @!method write(text)
|
16
|
+
# @abstract
|
17
|
+
# Write the change to the specified text.
|
18
|
+
# @param text [String] The text to be changed.
|
19
|
+
# @return [String] The updated text.
|
20
|
+
|
21
|
+
# @return [void]
|
22
|
+
def opening
|
23
|
+
@host = Solargraph::LanguageServer::Host.new
|
24
|
+
@host.add_observer self
|
25
|
+
@host.start
|
26
|
+
@data_reader = Solargraph::LanguageServer::Transport::DataReader.new
|
27
|
+
@data_reader.set_message_handler do |message|
|
28
|
+
process message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# @return [void]
|
33
|
+
def closing
|
34
|
+
@host.stop
|
35
|
+
end
|
36
|
+
|
37
|
+
# @param data [String]
|
38
|
+
# @return [void]
|
39
|
+
def receiving data
|
40
|
+
@data_reader.receive data
|
41
|
+
end
|
42
|
+
|
43
|
+
# @return [void]
|
44
|
+
def update
|
45
|
+
if @host.stopped?
|
46
|
+
shutdown
|
47
|
+
else
|
48
|
+
tmp = @host.flush
|
49
|
+
write tmp unless tmp.empty?
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
# @param request [Hash]
|
56
|
+
# @return [void]
|
57
|
+
def process request
|
58
|
+
@host.process(request)
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [void]
|
62
|
+
def shutdown
|
63
|
+
Backport.stop unless @host.options['transport'] == 'external'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -1,72 +1,74 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
|
5
|
-
module Solargraph
|
6
|
-
module LanguageServer
|
7
|
-
module Transport
|
8
|
-
class DataReader
|
9
|
-
def initialize
|
10
|
-
@in_header = true
|
11
|
-
@content_length = 0
|
12
|
-
@buffer = String.new
|
13
|
-
end
|
14
|
-
|
15
|
-
# Declare a block to be executed for each message received from the
|
16
|
-
# client.
|
17
|
-
#
|
18
|
-
# @yieldparam [Hash] The message received from the client
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
#
|
25
|
-
#
|
26
|
-
#
|
27
|
-
#
|
28
|
-
#
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@buffer
|
65
|
-
|
66
|
-
@
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
module Transport
|
8
|
+
class DataReader
|
9
|
+
def initialize
|
10
|
+
@in_header = true
|
11
|
+
@content_length = 0
|
12
|
+
@buffer = String.new
|
13
|
+
end
|
14
|
+
|
15
|
+
# Declare a block to be executed for each message received from the
|
16
|
+
# client.
|
17
|
+
#
|
18
|
+
# @yieldparam [Hash] The message received from the client
|
19
|
+
# @return [void]
|
20
|
+
def set_message_handler &block
|
21
|
+
@message_handler = block
|
22
|
+
end
|
23
|
+
|
24
|
+
# Process raw data received from the client. The data will be parsed
|
25
|
+
# into messages based on the JSON-RPC protocol. Each message will be
|
26
|
+
# passed to the block declared via set_message_handler. Incomplete data
|
27
|
+
# will be buffered and subsequent data will be appended to the buffer.
|
28
|
+
#
|
29
|
+
# @param data [String]
|
30
|
+
# @return [void]
|
31
|
+
def receive data
|
32
|
+
data.each_char do |char|
|
33
|
+
@buffer.concat char
|
34
|
+
if @in_header
|
35
|
+
prepare_to_parse_message if @buffer.end_with?("\r\n\r\n")
|
36
|
+
else
|
37
|
+
parse_message_from_buffer if @buffer.bytesize == @content_length
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# @return [void]
|
45
|
+
def prepare_to_parse_message
|
46
|
+
@in_header = false
|
47
|
+
@buffer.each_line do |line|
|
48
|
+
parts = line.split(':').map(&:strip)
|
49
|
+
if parts[0] == 'Content-Length'
|
50
|
+
@content_length = parts[1].to_i
|
51
|
+
break
|
52
|
+
end
|
53
|
+
end
|
54
|
+
@buffer.clear
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [void]
|
58
|
+
def parse_message_from_buffer
|
59
|
+
begin
|
60
|
+
msg = JSON.parse(@buffer)
|
61
|
+
@message_handler.call msg unless @message_handler.nil?
|
62
|
+
rescue JSON::ParserError => e
|
63
|
+
Solargraph::Logging.logger.warn "Failed to parse request: #{e.message}"
|
64
|
+
Solargraph::Logging.logger.debug "Buffer: #{@buffer}"
|
65
|
+
ensure
|
66
|
+
@buffer.clear
|
67
|
+
@in_header = true
|
68
|
+
@content_length = 0
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Solargraph
|
4
|
-
module LanguageServer
|
5
|
-
# The Transport namespace contains concrete implementations of
|
6
|
-
# communication protocols for language servers.
|
7
|
-
#
|
8
|
-
module Transport
|
9
|
-
autoload :Adapter, 'solargraph/language_server/transport/adapter'
|
10
|
-
autoload :DataReader, 'solargraph/language_server/transport/data_reader'
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module LanguageServer
|
5
|
+
# The Transport namespace contains concrete implementations of
|
6
|
+
# communication protocols for language servers.
|
7
|
+
#
|
8
|
+
module Transport
|
9
|
+
autoload :Adapter, 'solargraph/language_server/transport/adapter'
|
10
|
+
autoload :DataReader, 'solargraph/language_server/transport/data_reader'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -1,49 +1,49 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'cgi'
|
4
|
-
|
5
|
-
module Solargraph
|
6
|
-
module LanguageServer
|
7
|
-
# Methods to handle conversions between file URIs and paths.
|
8
|
-
#
|
9
|
-
module UriHelpers
|
10
|
-
module_function
|
11
|
-
|
12
|
-
# Convert a file URI to a path.
|
13
|
-
#
|
14
|
-
# @param uri [String]
|
15
|
-
# @return [String]
|
16
|
-
def uri_to_file uri
|
17
|
-
decode(uri).sub(/^file\:(?:\/\/)?/, '').sub(/^\/([a-z]\:)/i, '\1')
|
18
|
-
end
|
19
|
-
|
20
|
-
# Convert a file path to a URI.
|
21
|
-
#
|
22
|
-
# @param file [String]
|
23
|
-
# @return [String]
|
24
|
-
def file_to_uri file
|
25
|
-
"file://#{encode(file.gsub(/^([a-z]\:)/i, '/\1'))}"
|
26
|
-
end
|
27
|
-
|
28
|
-
# Encode text to be used as a URI path component in LSP.
|
29
|
-
#
|
30
|
-
# @param text [String]
|
31
|
-
# @return [String]
|
32
|
-
def encode text
|
33
|
-
CGI.escape(text)
|
34
|
-
.gsub('%3A', ':')
|
35
|
-
.gsub('%5C', '\\')
|
36
|
-
.gsub('%2F', '/')
|
37
|
-
.gsub('+', '%20')
|
38
|
-
end
|
39
|
-
|
40
|
-
# Decode text from a URI path component in LSP.
|
41
|
-
#
|
42
|
-
# @param text [String]
|
43
|
-
# @return [String]
|
44
|
-
def decode text
|
45
|
-
CGI.unescape(text)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'cgi'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module LanguageServer
|
7
|
+
# Methods to handle conversions between file URIs and paths.
|
8
|
+
#
|
9
|
+
module UriHelpers
|
10
|
+
module_function
|
11
|
+
|
12
|
+
# Convert a file URI to a path.
|
13
|
+
#
|
14
|
+
# @param uri [String]
|
15
|
+
# @return [String]
|
16
|
+
def uri_to_file uri
|
17
|
+
decode(uri).sub(/^file\:(?:\/\/)?/, '').sub(/^\/([a-z]\:)/i, '\1')
|
18
|
+
end
|
19
|
+
|
20
|
+
# Convert a file path to a URI.
|
21
|
+
#
|
22
|
+
# @param file [String]
|
23
|
+
# @return [String]
|
24
|
+
def file_to_uri file
|
25
|
+
"file://#{encode(file.gsub(/^([a-z]\:)/i, '/\1'))}"
|
26
|
+
end
|
27
|
+
|
28
|
+
# Encode text to be used as a URI path component in LSP.
|
29
|
+
#
|
30
|
+
# @param text [String]
|
31
|
+
# @return [String]
|
32
|
+
def encode text
|
33
|
+
CGI.escape(text)
|
34
|
+
.gsub('%3A', ':')
|
35
|
+
.gsub('%5C', '\\')
|
36
|
+
.gsub('%2F', '/')
|
37
|
+
.gsub('+', '%20')
|
38
|
+
end
|
39
|
+
|
40
|
+
# Decode text from a URI path component in LSP.
|
41
|
+
#
|
42
|
+
# @param text [String]
|
43
|
+
# @return [String]
|
44
|
+
def decode text
|
45
|
+
CGI.unescape(text)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|