solargraph 0.56.0 → 0.58.2
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/.gitattributes +2 -0
- data/.github/workflows/linting.yml +127 -0
- data/.github/workflows/plugins.yml +183 -7
- data/.github/workflows/rspec.yml +55 -5
- data/.github/workflows/typecheck.yml +6 -3
- data/.gitignore +6 -0
- data/.overcommit.yml +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +1279 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +92 -1
- data/README.md +8 -4
- data/Rakefile +125 -13
- data/bin/solargraph +3 -0
- data/lib/solargraph/api_map/cache.rb +110 -109
- data/lib/solargraph/api_map/constants.rb +279 -0
- data/lib/solargraph/api_map/index.rb +193 -175
- data/lib/solargraph/api_map/source_to_yard.rb +97 -88
- data/lib/solargraph/api_map/store.rb +384 -266
- data/lib/solargraph/api_map.rb +945 -973
- data/lib/solargraph/bench.rb +1 -0
- data/lib/solargraph/complex_type/type_methods.rb +228 -222
- data/lib/solargraph/complex_type/unique_type.rb +482 -475
- data/lib/solargraph/complex_type.rb +444 -423
- data/lib/solargraph/convention/active_support_concern.rb +111 -0
- data/lib/solargraph/convention/base.rb +17 -0
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
- data/lib/solargraph/convention/data_definition.rb +105 -0
- data/lib/solargraph/convention/gemspec.rb +3 -2
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -60
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -100
- data/lib/solargraph/convention/struct_definition.rb +164 -101
- data/lib/solargraph/convention.rb +32 -2
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -113
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -66
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -405
- data/lib/solargraph/environ.rb +9 -2
- data/lib/solargraph/equality.rb +34 -33
- data/lib/solargraph/gem_pins.rb +98 -88
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -128
- data/lib/solargraph/language_server/host/message_worker.rb +112 -109
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -871
- data/lib/solargraph/language_server/message/base.rb +2 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +114 -114
- data/lib/solargraph/language_server/message/extended/document.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +56 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +40 -38
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -131
- data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +24 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -24
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/progress.rb +8 -0
- data/lib/solargraph/language_server/request.rb +4 -1
- data/lib/solargraph/library.rb +683 -666
- data/lib/solargraph/location.rb +82 -79
- data/lib/solargraph/logging.rb +37 -28
- data/lib/solargraph/page.rb +3 -0
- data/lib/solargraph/parser/comment_ripper.rb +69 -62
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -227
- data/lib/solargraph/parser/node_processor/base.rb +92 -87
- data/lib/solargraph/parser/node_processor.rb +62 -46
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -159
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -164
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -497
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -21
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +59 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -45
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +1 -21
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +53 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -21
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +40 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +59 -53
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +0 -22
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -41
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -16
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -43
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -271
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -66
- data/lib/solargraph/parser/region.rb +69 -66
- data/lib/solargraph/parser/snippet.rb +17 -15
- data/lib/solargraph/pin/base.rb +729 -651
- data/lib/solargraph/pin/base_variable.rb +126 -125
- data/lib/solargraph/pin/block.rb +104 -103
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -218
- data/lib/solargraph/pin/closure.rb +72 -74
- data/lib/solargraph/pin/common.rb +79 -75
- data/lib/solargraph/pin/constant.rb +2 -0
- data/lib/solargraph/pin/conversions.rb +123 -123
- data/lib/solargraph/pin/delegated_method.rb +120 -120
- data/lib/solargraph/pin/documenting.rb +114 -114
- data/lib/solargraph/pin/instance_variable.rb +34 -34
- data/lib/solargraph/pin/keyword.rb +20 -20
- data/lib/solargraph/pin/local_variable.rb +75 -76
- data/lib/solargraph/pin/method.rb +672 -651
- data/lib/solargraph/pin/method_alias.rb +34 -31
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -261
- data/lib/solargraph/pin/proxy_type.rb +39 -35
- data/lib/solargraph/pin/reference/override.rb +47 -33
- data/lib/solargraph/pin/reference/superclass.rb +15 -10
- data/lib/solargraph/pin/reference.rb +39 -22
- data/lib/solargraph/pin/search.rb +61 -56
- data/lib/solargraph/pin/signature.rb +61 -59
- data/lib/solargraph/pin/symbol.rb +53 -48
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +44 -44
- data/lib/solargraph/pin_cache.rb +245 -185
- data/lib/solargraph/position.rb +132 -116
- data/lib/solargraph/range.rb +112 -107
- data/lib/solargraph/rbs_map/conversions.rb +823 -773
- data/lib/solargraph/rbs_map/core_fills.rb +18 -0
- data/lib/solargraph/rbs_map/core_map.rb +58 -51
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -150
- data/lib/solargraph/shell.rb +352 -268
- data/lib/solargraph/source/chain/call.rb +337 -333
- data/lib/solargraph/source/chain/constant.rb +26 -89
- data/lib/solargraph/source/chain/hash.rb +34 -34
- data/lib/solargraph/source/chain/if.rb +28 -28
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +11 -2
- data/lib/solargraph/source/chain/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -282
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -167
- data/lib/solargraph/source/encoding_fixes.rb +23 -23
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -495
- data/lib/solargraph/source_map/clip.rb +226 -234
- data/lib/solargraph/source_map/data.rb +34 -30
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -200
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -62
- data/lib/solargraph/type_checker.rb +814 -699
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/workspace/config.rb +255 -239
- data/lib/solargraph/workspace/require_paths.rb +97 -0
- data/lib/solargraph/workspace.rb +220 -249
- data/lib/solargraph/yard_map/helpers.rb +44 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +5 -5
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -134
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -30
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -88
- data/lib/solargraph/yardoc.rb +87 -49
- data/lib/solargraph.rb +105 -90
- data/rbs/fills/bundler/0/bundler.rbs +4271 -0
- data/rbs/fills/open3/0/open3.rbs +172 -0
- data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
- data/rbs/fills/rubygems/0/errors.rbs +364 -0
- data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
- data/rbs/fills/rubygems/0/specification.rbs +1753 -0
- data/rbs/fills/{tuple.rbs → tuple/tuple.rbs} +2 -3
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/ast/2.4/.rbs_meta.yaml +9 -0
- data/rbs/shims/ast/2.4/ast.rbs +73 -0
- data/rbs/shims/parser/3.2.0.1/builders/default.rbs +195 -0
- data/rbs/shims/parser/3.2.0.1/manifest.yaml +7 -0
- data/rbs/shims/parser/3.2.0.1/parser.rbs +201 -0
- data/rbs/shims/parser/3.2.0.1/polyfill.rbs +4 -0
- data/rbs/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
- data/rbs/shims/thor/1.2.0.1/manifest.yaml +7 -0
- data/rbs/shims/thor/1.2.0.1/thor.rbs +17 -0
- data/rbs_collection.yaml +4 -4
- data/solargraph.gemspec +26 -5
- metadata +187 -15
- data/lib/.rubocop.yml +0 -22
- data/lib/solargraph/parser/node_methods.rb +0 -97
|
@@ -1,131 +1,148 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'securerandom'
|
|
4
|
-
require 'tmpdir'
|
|
5
|
-
|
|
6
|
-
module Solargraph
|
|
7
|
-
module LanguageServer
|
|
8
|
-
module Message
|
|
9
|
-
module TextDocument
|
|
10
|
-
class Formatting < Base
|
|
11
|
-
include Solargraph::Diagnostics::RubocopHelpers
|
|
12
|
-
|
|
13
|
-
def process
|
|
14
|
-
file_uri = params['textDocument']['uri']
|
|
15
|
-
config = config_for(file_uri)
|
|
16
|
-
original = host.read_text(file_uri)
|
|
17
|
-
args = cli_args(file_uri, config)
|
|
18
|
-
|
|
19
|
-
require_rubocop(config['version'])
|
|
20
|
-
options, paths = ::RuboCop::Options.new.parse(args)
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'securerandom'
|
|
4
|
+
require 'tmpdir'
|
|
5
|
+
|
|
6
|
+
module Solargraph
|
|
7
|
+
module LanguageServer
|
|
8
|
+
module Message
|
|
9
|
+
module TextDocument
|
|
10
|
+
class Formatting < Base
|
|
11
|
+
include Solargraph::Diagnostics::RubocopHelpers
|
|
12
|
+
|
|
13
|
+
def process
|
|
14
|
+
file_uri = params['textDocument']['uri']
|
|
15
|
+
config = config_for(file_uri)
|
|
16
|
+
original = host.read_text(file_uri)
|
|
17
|
+
args = cli_args(file_uri, config)
|
|
18
|
+
|
|
19
|
+
require_rubocop(config['version'])
|
|
20
|
+
options, paths = ::RuboCop::Options.new.parse(args)
|
|
21
|
+
# @sg-ignore Unresolved call to []=
|
|
22
|
+
options[:stdin] = original
|
|
23
|
+
|
|
24
|
+
# Ensure only one instance of RuboCop::Runner is running at
|
|
25
|
+
# a time - it uses 'chdir' to read config files with ERB,
|
|
26
|
+
# which can conflict with other chdirs.
|
|
27
|
+
corrections = Solargraph::CHDIR_MUTEX.synchronize do
|
|
28
|
+
redirect_stdout do
|
|
29
|
+
::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
# @sg-ignore Unresolved call to []=
|
|
33
|
+
result = options[:stdin]
|
|
34
|
+
|
|
35
|
+
log_corrections(corrections)
|
|
36
|
+
|
|
37
|
+
format original, result
|
|
38
|
+
rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
|
|
39
|
+
set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# @param corrections [String]
|
|
45
|
+
# @return [void]
|
|
46
|
+
def log_corrections(corrections)
|
|
47
|
+
corrections = corrections&.strip
|
|
48
|
+
return if corrections&.empty?
|
|
49
|
+
|
|
50
|
+
Solargraph.logger.info('Formatting result:')
|
|
51
|
+
corrections.each_line do |line|
|
|
52
|
+
next if line.strip.empty?
|
|
53
|
+
Solargraph.logger.info(line.strip)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @param file_uri [String]
|
|
58
|
+
# @return [Hash{String => undefined}]
|
|
59
|
+
def config_for(file_uri)
|
|
60
|
+
conf = host.formatter_config(file_uri)
|
|
61
|
+
return {} unless conf.is_a?(Hash)
|
|
62
|
+
|
|
63
|
+
conf['rubocop'] || {}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# @param file_uri [String]
|
|
67
|
+
# @param config [Hash{String => String}]
|
|
68
|
+
# @return [Array<String>]
|
|
69
|
+
def cli_args file_uri, config
|
|
70
|
+
file = UriHelpers.uri_to_file(file_uri)
|
|
71
|
+
args = [
|
|
72
|
+
config['cops'] == 'all' ? '-A' : '-a',
|
|
73
|
+
'--cache', 'false',
|
|
74
|
+
'--format', formatter_class(config).name,
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
['except', 'only'].each do |arg|
|
|
78
|
+
cops = cop_list(config[arg])
|
|
79
|
+
args += ["--#{arg}", cops] if cops
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
args += config['extra_args'] if config['extra_args']
|
|
83
|
+
args + [file]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# @param config [Hash{String => String}]
|
|
87
|
+
# @sg-ignore
|
|
88
|
+
# @return [Class<RuboCop::Formatter::BaseFormatter>]
|
|
89
|
+
def formatter_class(config)
|
|
90
|
+
if self.class.const_defined?('BlankRubocopFormatter')
|
|
91
|
+
# @sg-ignore
|
|
92
|
+
BlankRubocopFormatter
|
|
93
|
+
else
|
|
94
|
+
require_rubocop(config['version'])
|
|
95
|
+
klass = Class.new(::RuboCop::Formatter::BaseFormatter)
|
|
96
|
+
self.class.const_set 'BlankRubocopFormatter', klass
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @param value [Array, String]
|
|
101
|
+
# @return [String, nil]
|
|
102
|
+
def cop_list(value)
|
|
103
|
+
# @type [String]
|
|
104
|
+
value = value.join(',') if value.respond_to?(:join)
|
|
105
|
+
return nil if value == '' || !value.is_a?(String)
|
|
106
|
+
value
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @param original [String]
|
|
110
|
+
# @param result [String]
|
|
111
|
+
# @return [void]
|
|
112
|
+
def format original, result
|
|
113
|
+
ending = if original.end_with?("\n")
|
|
114
|
+
{
|
|
115
|
+
line: original.lines.length,
|
|
116
|
+
character: 0
|
|
117
|
+
}
|
|
118
|
+
elsif original.lines.empty?
|
|
119
|
+
{
|
|
120
|
+
line: 0,
|
|
121
|
+
character: 0
|
|
122
|
+
}
|
|
123
|
+
else
|
|
124
|
+
{
|
|
125
|
+
line: original.lines.length - 1,
|
|
126
|
+
character: original.lines.last.length
|
|
127
|
+
}
|
|
128
|
+
end
|
|
129
|
+
set_result(
|
|
130
|
+
[
|
|
131
|
+
{
|
|
132
|
+
range: {
|
|
133
|
+
start: {
|
|
134
|
+
line: 0,
|
|
135
|
+
character: 0
|
|
136
|
+
},
|
|
137
|
+
end: ending
|
|
138
|
+
},
|
|
139
|
+
newText: result
|
|
140
|
+
}
|
|
141
|
+
]
|
|
142
|
+
)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
module TextDocument
|
|
7
|
-
class Hover < Base
|
|
8
|
-
def process
|
|
9
|
-
line = params['position']['line']
|
|
10
|
-
col = params['position']['character']
|
|
11
|
-
contents = []
|
|
12
|
-
suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
|
|
13
|
-
last_link = nil
|
|
14
|
-
suggestions.each do |pin|
|
|
15
|
-
parts = []
|
|
16
|
-
this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
|
|
17
|
-
if !this_link.nil? && this_link != last_link
|
|
18
|
-
parts.push this_link
|
|
19
|
-
end
|
|
20
|
-
parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
|
|
21
|
-
parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
|
|
22
|
-
unless parts.empty?
|
|
23
|
-
data = parts.join("\n\n")
|
|
24
|
-
next if contents.last&.end_with?(data)
|
|
25
|
-
contents.push data
|
|
26
|
-
end
|
|
27
|
-
last_link = this_link unless this_link.nil?
|
|
28
|
-
end
|
|
29
|
-
set_result(
|
|
30
|
-
contents_or_nil(contents)
|
|
31
|
-
)
|
|
32
|
-
rescue FileNotFoundError => e
|
|
33
|
-
Logging.logger.warn "[#{e.class}] #{e.message}"
|
|
34
|
-
Logging.logger.warn e.backtrace.join("\n")
|
|
35
|
-
set_result nil
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
private
|
|
39
|
-
|
|
40
|
-
# @param contents [Array<String>]
|
|
41
|
-
# @return [Hash{Symbol => Hash{Symbol => String}}, nil]
|
|
42
|
-
def contents_or_nil contents
|
|
43
|
-
stripped = contents
|
|
44
|
-
.map(&:strip)
|
|
45
|
-
.reject { |c| c.empty? }
|
|
46
|
-
return nil if stripped.empty?
|
|
47
|
-
{
|
|
48
|
-
contents: {
|
|
49
|
-
kind: 'markdown',
|
|
50
|
-
value: stripped.join("\n\n")
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class Hover < Base
|
|
8
|
+
def process
|
|
9
|
+
line = params['position']['line']
|
|
10
|
+
col = params['position']['character']
|
|
11
|
+
contents = []
|
|
12
|
+
suggestions = host.definitions_at(params['textDocument']['uri'], line, col)
|
|
13
|
+
last_link = nil
|
|
14
|
+
suggestions.each do |pin|
|
|
15
|
+
parts = []
|
|
16
|
+
this_link = host.options['enablePages'] ? pin.link_documentation : pin.text_documentation
|
|
17
|
+
if !this_link.nil? && this_link != last_link
|
|
18
|
+
parts.push this_link
|
|
19
|
+
end
|
|
20
|
+
parts.push "`#{pin.detail}`" unless pin.is_a?(Pin::Namespace) || pin.detail.nil?
|
|
21
|
+
parts.push pin.documentation unless pin.documentation.nil? || pin.documentation.empty?
|
|
22
|
+
unless parts.empty?
|
|
23
|
+
data = parts.join("\n\n")
|
|
24
|
+
next if contents.last&.end_with?(data)
|
|
25
|
+
contents.push data
|
|
26
|
+
end
|
|
27
|
+
last_link = this_link unless this_link.nil?
|
|
28
|
+
end
|
|
29
|
+
set_result(
|
|
30
|
+
contents_or_nil(contents)
|
|
31
|
+
)
|
|
32
|
+
rescue FileNotFoundError => e
|
|
33
|
+
Logging.logger.warn "[#{e.class}] #{e.message}"
|
|
34
|
+
Logging.logger.warn e.backtrace.join("\n")
|
|
35
|
+
set_result nil
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
# @param contents [Array<String>]
|
|
41
|
+
# @return [Hash{Symbol => Hash{Symbol => String}}, nil]
|
|
42
|
+
def contents_or_nil contents
|
|
43
|
+
stripped = contents
|
|
44
|
+
.map(&:strip)
|
|
45
|
+
.reject { |c| c.empty? }
|
|
46
|
+
return nil if stripped.empty?
|
|
47
|
+
{
|
|
48
|
+
contents: {
|
|
49
|
+
kind: 'markdown',
|
|
50
|
+
value: stripped.join("\n\n")
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module LanguageServer
|
|
5
|
-
module Message
|
|
6
|
-
module TextDocument
|
|
7
|
-
class SignatureHelp < TextDocument::Base
|
|
8
|
-
def process
|
|
9
|
-
line = params['position']['line']
|
|
10
|
-
col = params['position']['character']
|
|
11
|
-
suggestions = host.signatures_at(params['textDocument']['uri'], line, col)
|
|
12
|
-
set_result({
|
|
13
|
-
signatures: suggestions.flat_map { |pin| pin.signature_help }
|
|
14
|
-
})
|
|
15
|
-
rescue FileNotFoundError => e
|
|
16
|
-
Logging.logger.warn "[#{e.class}] #{e.message}"
|
|
17
|
-
Logging.logger.warn e.backtrace.join("\n")
|
|
18
|
-
set_result nil
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module LanguageServer
|
|
5
|
+
module Message
|
|
6
|
+
module TextDocument
|
|
7
|
+
class SignatureHelp < TextDocument::Base
|
|
8
|
+
def process
|
|
9
|
+
line = params['position']['line']
|
|
10
|
+
col = params['position']['character']
|
|
11
|
+
suggestions = host.signatures_at(params['textDocument']['uri'], line, col)
|
|
12
|
+
set_result({
|
|
13
|
+
signatures: suggestions.flat_map { |pin| pin.signature_help }
|
|
14
|
+
})
|
|
15
|
+
rescue FileNotFoundError => e
|
|
16
|
+
Logging.logger.warn "[#{e.class}] #{e.message}"
|
|
17
|
+
Logging.logger.warn e.backtrace.join("\n")
|
|
18
|
+
set_result nil
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -1,24 +1,25 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph::LanguageServer::Message::TextDocument
|
|
4
|
-
class TypeDefinition < Base
|
|
5
|
-
def process
|
|
6
|
-
@line = params['position']['line']
|
|
7
|
-
@column = params['position']['character']
|
|
8
|
-
set_result(code_location || [])
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph::LanguageServer::Message::TextDocument
|
|
4
|
+
class TypeDefinition < Base
|
|
5
|
+
def process
|
|
6
|
+
@line = params['position']['line']
|
|
7
|
+
@column = params['position']['character']
|
|
8
|
+
set_result(code_location || [])
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# @return [Array<Hash>, nil]
|
|
14
|
+
def code_location
|
|
15
|
+
suggestions = host.type_definitions_at(params['textDocument']['uri'], @line, @column)
|
|
16
|
+
return nil if suggestions.empty?
|
|
17
|
+
suggestions.reject { |pin| pin.best_location.nil? || pin.best_location.filename.nil? }.map do |pin|
|
|
18
|
+
{
|
|
19
|
+
uri: file_to_uri(pin.best_location.filename),
|
|
20
|
+
range: pin.best_location.range.to_hash
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -9,11 +9,13 @@ module Solargraph::LanguageServer::Message::Workspace
|
|
|
9
9
|
|
|
10
10
|
private
|
|
11
11
|
|
|
12
|
+
# @return [void]
|
|
12
13
|
def add_folders
|
|
13
14
|
return unless params['event'] && params['event']['added']
|
|
14
15
|
host.prepare_folders params['event']['added']
|
|
15
16
|
end
|
|
16
17
|
|
|
18
|
+
# @return [void]
|
|
17
19
|
def remove_folders
|
|
18
20
|
return unless params['event'] && params['event']['removed']
|
|
19
21
|
params['event']['removed'].each do |folder|
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
class Solargraph::LanguageServer::Message::Workspace::WorkspaceSymbol < Solargraph::LanguageServer::Message::Base
|
|
4
|
-
include Solargraph::LanguageServer::UriHelpers
|
|
5
|
-
|
|
6
|
-
def process
|
|
7
|
-
pins = host.query_symbols(params['query'])
|
|
8
|
-
info = pins.map do |pin|
|
|
9
|
-
uri = file_to_uri(pin.best_location.filename)
|
|
10
|
-
{
|
|
11
|
-
name: pin.path,
|
|
12
|
-
containerName: pin.namespace,
|
|
13
|
-
kind: pin.symbol_kind,
|
|
14
|
-
location: {
|
|
15
|
-
uri: uri,
|
|
16
|
-
range: pin.best_location.range.to_hash
|
|
17
|
-
},
|
|
18
|
-
deprecated: pin.deprecated?
|
|
19
|
-
}
|
|
20
|
-
end
|
|
21
|
-
set_result info
|
|
22
|
-
end
|
|
23
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class Solargraph::LanguageServer::Message::Workspace::WorkspaceSymbol < Solargraph::LanguageServer::Message::Base
|
|
4
|
+
include Solargraph::LanguageServer::UriHelpers
|
|
5
|
+
|
|
6
|
+
def process
|
|
7
|
+
pins = host.query_symbols(params['query'])
|
|
8
|
+
info = pins.map do |pin|
|
|
9
|
+
uri = file_to_uri(pin.best_location.filename)
|
|
10
|
+
{
|
|
11
|
+
name: pin.path,
|
|
12
|
+
containerName: pin.namespace,
|
|
13
|
+
kind: pin.symbol_kind,
|
|
14
|
+
location: {
|
|
15
|
+
uri: uri,
|
|
16
|
+
range: pin.best_location.range.to_hash
|
|
17
|
+
},
|
|
18
|
+
deprecated: pin.deprecated?
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
set_result info
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -39,6 +39,7 @@ module Solargraph
|
|
|
39
39
|
|
|
40
40
|
# @param message [String]
|
|
41
41
|
# @param percentage [Integer]
|
|
42
|
+
# @return [void]
|
|
42
43
|
def begin message, percentage
|
|
43
44
|
@kind = 'begin'
|
|
44
45
|
@message = message
|
|
@@ -47,6 +48,7 @@ module Solargraph
|
|
|
47
48
|
|
|
48
49
|
# @param message [String]
|
|
49
50
|
# @param percentage [Integer]
|
|
51
|
+
# @return [void]
|
|
50
52
|
def report message, percentage
|
|
51
53
|
@kind = 'report'
|
|
52
54
|
@message = message
|
|
@@ -54,6 +56,7 @@ module Solargraph
|
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
# @param message [String]
|
|
59
|
+
# @return [void]
|
|
57
60
|
def finish message
|
|
58
61
|
@kind = 'end'
|
|
59
62
|
@message = message
|
|
@@ -62,6 +65,7 @@ module Solargraph
|
|
|
62
65
|
end
|
|
63
66
|
|
|
64
67
|
# @param host [Solargraph::LanguageServer::Host]
|
|
68
|
+
# @return [void]
|
|
65
69
|
def send host
|
|
66
70
|
return unless host.client_supports_progress? && !finished?
|
|
67
71
|
|
|
@@ -91,6 +95,7 @@ module Solargraph
|
|
|
91
95
|
@status = CREATED
|
|
92
96
|
end
|
|
93
97
|
|
|
98
|
+
# @return [Hash]
|
|
94
99
|
def build
|
|
95
100
|
{
|
|
96
101
|
token: uuid,
|
|
@@ -101,6 +106,7 @@ module Solargraph
|
|
|
101
106
|
}
|
|
102
107
|
end
|
|
103
108
|
|
|
109
|
+
# @return [Hash]
|
|
104
110
|
def build_value
|
|
105
111
|
case kind
|
|
106
112
|
when 'begin'
|
|
@@ -115,6 +121,7 @@ module Solargraph
|
|
|
115
121
|
end
|
|
116
122
|
|
|
117
123
|
# @param host [Host]
|
|
124
|
+
# @return [void]
|
|
118
125
|
def keep_alive host
|
|
119
126
|
mutex.synchronize { @last = Time.now }
|
|
120
127
|
@keep_alive ||= Thread.new do
|
|
@@ -127,6 +134,7 @@ module Solargraph
|
|
|
127
134
|
end
|
|
128
135
|
end
|
|
129
136
|
|
|
137
|
+
# @return [Thread::Mutex]
|
|
130
138
|
def mutex
|
|
131
139
|
@mutex ||= Mutex.new
|
|
132
140
|
end
|
|
@@ -11,11 +11,14 @@ module Solargraph
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
# @param result [Object]
|
|
14
|
-
# @
|
|
14
|
+
# @generic T
|
|
15
|
+
# @yieldreturn [generic<T>]
|
|
16
|
+
# @return [generic<T>, nil]
|
|
15
17
|
def process result
|
|
16
18
|
@block.call(result) unless @block.nil?
|
|
17
19
|
end
|
|
18
20
|
|
|
21
|
+
# @return [void]
|
|
19
22
|
def send_response
|
|
20
23
|
# noop
|
|
21
24
|
end
|