solargraph 0.58.1 → 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/.gitignore +1 -0
- data/CHANGELOG.md +7 -1
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +279 -279
- data/lib/solargraph/api_map/index.rb +193 -193
- data/lib/solargraph/api_map/source_to_yard.rb +97 -97
- data/lib/solargraph/api_map/store.rb +384 -384
- data/lib/solargraph/api_map.rb +945 -945
- data/lib/solargraph/complex_type/type_methods.rb +228 -228
- data/lib/solargraph/complex_type/unique_type.rb +482 -482
- data/lib/solargraph/complex_type.rb +444 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -91
- data/lib/solargraph/convention/data_definition.rb +105 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -102
- data/lib/solargraph/convention/struct_definition.rb +164 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -53
- data/lib/solargraph/diagnostics/rubocop.rb +118 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +68 -68
- data/lib/solargraph/diagnostics/type_check.rb +55 -55
- data/lib/solargraph/doc_map.rb +439 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +98 -98
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +130 -130
- data/lib/solargraph/language_server/host/message_worker.rb +112 -112
- data/lib/solargraph/language_server/host/sources.rb +99 -99
- data/lib/solargraph/language_server/host.rb +878 -878
- 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 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +148 -148
- 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 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/library.rb +683 -683
- data/lib/solargraph/location.rb +82 -82
- data/lib/solargraph/logging.rb +37 -37
- data/lib/solargraph/parser/comment_ripper.rb +69 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -255
- data/lib/solargraph/parser/node_processor/base.rb +92 -92
- data/lib/solargraph/parser/node_processor.rb +62 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +149 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +166 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +486 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- 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 -46
- 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 -23
- 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 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +38 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +52 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +291 -291
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +70 -70
- data/lib/solargraph/parser/region.rb +69 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +729 -729
- data/lib/solargraph/pin/base_variable.rb +126 -126
- data/lib/solargraph/pin/block.rb +104 -104
- data/lib/solargraph/pin/breakable.rb +9 -9
- data/lib/solargraph/pin/callable.rb +231 -231
- data/lib/solargraph/pin/closure.rb +72 -72
- data/lib/solargraph/pin/common.rb +79 -79
- 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 -75
- data/lib/solargraph/pin/method.rb +672 -672
- data/lib/solargraph/pin/method_alias.rb +34 -34
- data/lib/solargraph/pin/namespace.rb +115 -115
- data/lib/solargraph/pin/parameter.rb +275 -275
- data/lib/solargraph/pin/proxy_type.rb +39 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +15 -15
- data/lib/solargraph/pin/reference.rb +39 -39
- data/lib/solargraph/pin/search.rb +61 -61
- data/lib/solargraph/pin/signature.rb +61 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- 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 -245
- data/lib/solargraph/position.rb +132 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +823 -823
- data/lib/solargraph/rbs_map/core_map.rb +58 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +43 -43
- data/lib/solargraph/rbs_map.rb +163 -163
- data/lib/solargraph/shell.rb +352 -352
- data/lib/solargraph/source/chain/call.rb +337 -337
- data/lib/solargraph/source/chain/constant.rb +26 -26
- 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/literal.rb +48 -48
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain.rb +291 -291
- data/lib/solargraph/source/change.rb +82 -82
- data/lib/solargraph/source/cursor.rb +166 -166
- data/lib/solargraph/source/source_chainer.rb +194 -194
- data/lib/solargraph/source/updater.rb +55 -55
- data/lib/solargraph/source.rb +498 -498
- data/lib/solargraph/source_map/clip.rb +226 -226
- data/lib/solargraph/source_map/data.rb +34 -34
- data/lib/solargraph/source_map/mapper.rb +259 -259
- data/lib/solargraph/source_map.rb +212 -212
- data/lib/solargraph/type_checker/checks.rb +124 -124
- data/lib/solargraph/type_checker/param_def.rb +37 -37
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +84 -84
- data/lib/solargraph/type_checker.rb +814 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +255 -255
- data/lib/solargraph/workspace/require_paths.rb +97 -97
- data/lib/solargraph/workspace.rb +220 -220
- data/lib/solargraph/yard_map/helpers.rb +44 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +130 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +31 -31
- data/lib/solargraph/yard_map/mapper.rb +79 -79
- data/lib/solargraph/yard_map/to_method.rb +89 -89
- data/lib/solargraph/yardoc.rb +87 -87
- data/lib/solargraph.rb +105 -105
- data/rbs_collection.yaml +1 -1
- metadata +12 -12
- /data/{sig → rbs}/shims/ast/0/node.rbs +0 -0
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
|
@@ -1,148 +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
|
-
# @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
|
+
# 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,25 +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
|
-
# @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
|
|
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
|
|
@@ -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
|