solargraph 0.52.0 → 0.53.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 +4 -4
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +1 -3
- data/.github/workflows/typecheck.yml +34 -0
- data/CHANGELOG.md +30 -0
- data/README.md +13 -16
- data/SPONSORS.md +1 -7
- data/lib/solargraph/api_map/cache.rb +59 -21
- data/lib/solargraph/api_map/store.rb +45 -9
- data/lib/solargraph/api_map.rb +152 -93
- data/lib/solargraph/bench.rb +2 -2
- data/lib/solargraph/cache.rb +29 -5
- data/lib/solargraph/complex_type/type_methods.rb +53 -8
- data/lib/solargraph/complex_type/unique_type.rb +149 -59
- data/lib/solargraph/complex_type.rb +62 -9
- data/lib/solargraph/convention.rb +0 -1
- data/lib/solargraph/converters/dd.rb +5 -0
- data/lib/solargraph/converters/dl.rb +3 -0
- data/lib/solargraph/converters/dt.rb +3 -0
- data/lib/solargraph/diagnostics/rubocop.rb +8 -7
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics.rb +2 -2
- data/lib/solargraph/doc_map.rb +146 -0
- data/lib/solargraph/gem_pins.rb +64 -0
- data/lib/solargraph/language_server/host/cataloger.rb +1 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
- data/lib/solargraph/language_server/host/dispatch.rb +10 -4
- data/lib/solargraph/language_server/host/message_worker.rb +4 -0
- data/lib/solargraph/language_server/host/sources.rb +7 -4
- data/lib/solargraph/language_server/host.rb +15 -6
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
- data/lib/solargraph/language_server/message/initialize.rb +5 -2
- data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
- data/lib/solargraph/language_server/message/text_document.rb +0 -1
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
- data/lib/solargraph/language_server/transport/adapter.rb +16 -1
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
- data/lib/solargraph/library.rb +58 -11
- data/lib/solargraph/location.rb +1 -0
- data/lib/solargraph/parser/comment_ripper.rb +3 -0
- data/lib/solargraph/parser/node_methods.rb +47 -8
- data/lib/solargraph/parser/node_processor/base.rb +9 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +29 -3
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +42 -34
- data/lib/solargraph/parser/{legacy → parser_gem}/node_methods.rb +201 -29
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/args_node.rb +4 -1
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +2 -2
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +54 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +8 -11
- data/lib/solargraph/pin/base.rb +63 -8
- data/lib/solargraph/pin/base_variable.rb +6 -2
- data/lib/solargraph/pin/block.rb +11 -6
- data/lib/solargraph/pin/closure.rb +17 -2
- data/lib/solargraph/pin/common.rb +7 -3
- data/lib/solargraph/pin/conversions.rb +33 -3
- data/lib/solargraph/pin/documenting.rb +25 -34
- data/lib/solargraph/pin/instance_variable.rb +4 -0
- data/lib/solargraph/pin/local_variable.rb +13 -1
- data/lib/solargraph/pin/method.rb +109 -15
- data/lib/solargraph/pin/namespace.rb +16 -10
- data/lib/solargraph/pin/parameter.rb +41 -10
- data/lib/solargraph/pin/reference/override.rb +2 -2
- data/lib/solargraph/pin/reference.rb +8 -0
- data/lib/solargraph/pin/search.rb +3 -3
- data/lib/solargraph/pin/signature.rb +114 -2
- data/lib/solargraph/pin.rb +0 -1
- data/lib/solargraph/range.rb +2 -2
- data/lib/solargraph/rbs_map/conversions.rb +212 -25
- data/lib/solargraph/rbs_map/core_fills.rb +4 -26
- data/lib/solargraph/rbs_map/core_map.rb +1 -0
- data/lib/solargraph/rbs_map/core_signs.rb +2 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
- data/lib/solargraph/rbs_map.rb +19 -9
- data/lib/solargraph/shell.rb +62 -59
- data/lib/solargraph/source/chain/array.rb +4 -1
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +95 -26
- data/lib/solargraph/source/chain/constant.rb +15 -1
- data/lib/solargraph/source/chain/if.rb +23 -0
- data/lib/solargraph/source/chain/link.rb +7 -1
- data/lib/solargraph/source/chain/or.rb +1 -1
- data/lib/solargraph/source/chain/z_super.rb +2 -2
- data/lib/solargraph/source/chain.rb +20 -4
- data/lib/solargraph/source/change.rb +3 -0
- data/lib/solargraph/source/cursor.rb +2 -0
- data/lib/solargraph/source/source_chainer.rb +6 -5
- data/lib/solargraph/source.rb +15 -16
- data/lib/solargraph/source_map/clip.rb +11 -7
- data/lib/solargraph/source_map/mapper.rb +10 -0
- data/lib/solargraph/source_map.rb +13 -3
- data/lib/solargraph/type_checker/checks.rb +10 -2
- data/lib/solargraph/type_checker.rb +74 -19
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +8 -6
- data/lib/solargraph/workspace.rb +1 -1
- data/lib/solargraph/yard_map/cache.rb +6 -0
- data/lib/solargraph/yard_map/helpers.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +11 -1
- data/lib/solargraph/yard_map/to_method.rb +11 -4
- data/lib/solargraph/yard_map.rb +0 -292
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +4 -1
- data/solargraph.gemspec +2 -2
- metadata +35 -57
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -151
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -163
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
- 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 -33
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
- 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 -51
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
- data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
- data/lib/solargraph/parser/rubyvm.rb +0 -40
@@ -27,7 +27,7 @@ module Solargraph
|
|
27
27
|
|
28
28
|
private
|
29
29
|
|
30
|
-
# @return Hash{String => RBS::AST::Declarations::TypeAlias}
|
30
|
+
# @return [Hash{String => RBS::AST::Declarations::TypeAlias}]
|
31
31
|
def type_aliases
|
32
32
|
@type_aliases ||= {}
|
33
33
|
end
|
@@ -42,7 +42,7 @@ module Solargraph
|
|
42
42
|
add_back_implicit_pins(added_pins)
|
43
43
|
end
|
44
44
|
|
45
|
-
# @param added_pins [
|
45
|
+
# @param added_pins [::Enumerable<Pin>]
|
46
46
|
# @return [void]
|
47
47
|
def add_back_implicit_pins(added_pins)
|
48
48
|
added_pins.each do |pin|
|
@@ -68,7 +68,7 @@ module Solargraph
|
|
68
68
|
class_decl_to_pin decl
|
69
69
|
when RBS::AST::Declarations::Interface
|
70
70
|
# STDERR.puts "Skipping interface #{decl.name.relative!}"
|
71
|
-
interface_decl_to_pin decl
|
71
|
+
interface_decl_to_pin decl, closure
|
72
72
|
when RBS::AST::Declarations::TypeAlias
|
73
73
|
type_aliases[decl.name.to_s] = decl
|
74
74
|
when RBS::AST::Declarations::Module
|
@@ -77,16 +77,46 @@ module Solargraph
|
|
77
77
|
constant_decl_to_pin decl
|
78
78
|
when RBS::AST::Declarations::ClassAlias
|
79
79
|
class_alias_decl_to_pin decl
|
80
|
+
when RBS::AST::Declarations::ModuleAlias
|
81
|
+
module_alias_decl_to_pin decl
|
82
|
+
when RBS::AST::Declarations::Global
|
83
|
+
global_decl_to_pin decl
|
80
84
|
else
|
81
|
-
Solargraph.logger.
|
85
|
+
Solargraph.logger.warn "Skipping declaration #{decl.class}"
|
82
86
|
end
|
83
87
|
end
|
84
88
|
|
85
|
-
|
89
|
+
# @param decl [RBS::AST::Declarations::Module]
|
90
|
+
# @param module_pin [Pin::Namespace]
|
91
|
+
# @return [void]
|
92
|
+
def convert_self_types_to_pins decl, module_pin
|
93
|
+
decl.self_types.each { |self_type| context = convert_self_type_to_pins(self_type, module_pin) }
|
94
|
+
end
|
95
|
+
|
96
|
+
# @param decl [RBS::AST::Declarations::Module::Self]
|
97
|
+
# @param closure [Pin::Namespace]
|
98
|
+
# @return [void]
|
99
|
+
def convert_self_type_to_pins decl, closure
|
100
|
+
include_pin = Solargraph::Pin::Reference::Include.new(
|
101
|
+
name: decl.name.relative!.to_s,
|
102
|
+
location: rbs_location_to_location(decl.location),
|
103
|
+
closure: closure
|
104
|
+
)
|
105
|
+
pins.push include_pin
|
106
|
+
end
|
107
|
+
|
108
|
+
# @param decl [RBS::AST::Declarations::Module,RBS::AST::Declarations::Class,RBS::AST::Declarations::Interface]
|
109
|
+
# @param closure [Pin::Namespace]
|
110
|
+
# @return [void]
|
111
|
+
def convert_members_to_pins decl, closure
|
86
112
|
context = Context.new
|
87
113
|
decl.members.each { |m| context = convert_member_to_pin(m, closure, context) }
|
88
114
|
end
|
89
115
|
|
116
|
+
# @param member [RBS::AST::Members::Base,RBS::AST::Declarations::Base]
|
117
|
+
# @param closure [Pin::Namespace]
|
118
|
+
# @param context [Context]
|
119
|
+
# @return [void]
|
90
120
|
def convert_member_to_pin member, closure, context
|
91
121
|
case member
|
92
122
|
when RBS::AST::Members::MethodDefinition
|
@@ -105,6 +135,10 @@ module Solargraph
|
|
105
135
|
extend_to_pin(member, closure)
|
106
136
|
when RBS::AST::Members::Alias
|
107
137
|
alias_to_pin(member, closure)
|
138
|
+
when RBS::AST::Members::ClassInstanceVariable
|
139
|
+
civar_to_pin(member, closure)
|
140
|
+
when RBS::AST::Members::ClassVariable
|
141
|
+
cvar_to_pin(member, closure)
|
108
142
|
when RBS::AST::Members::InstanceVariable
|
109
143
|
ivar_to_pin(member, closure)
|
110
144
|
when RBS::AST::Members::Public
|
@@ -114,7 +148,7 @@ module Solargraph
|
|
114
148
|
when RBS::AST::Declarations::Base
|
115
149
|
convert_decl_to_pin(member, closure)
|
116
150
|
else
|
117
|
-
Solargraph.logger.warn "Skipping member #{member.class}"
|
151
|
+
Solargraph.logger.warn "Skipping member type #{member.class}"
|
118
152
|
end
|
119
153
|
context
|
120
154
|
end
|
@@ -127,6 +161,9 @@ module Solargraph
|
|
127
161
|
name: decl.name.relative!.to_s,
|
128
162
|
closure: Solargraph::Pin::ROOT_PIN,
|
129
163
|
comments: decl.comment&.string,
|
164
|
+
# @todo some type parameters in core/stdlib have default
|
165
|
+
# values; Solargraph doesn't support that yet as so these
|
166
|
+
# get treated as undefined if not specified
|
130
167
|
generics: decl.type_params.map(&:name).map(&:to_s)
|
131
168
|
)
|
132
169
|
pins.push class_pin
|
@@ -136,24 +173,27 @@ module Solargraph
|
|
136
173
|
name: decl.super_class.name.relative!.to_s
|
137
174
|
)
|
138
175
|
end
|
139
|
-
|
176
|
+
add_mixins decl, class_pin.closure
|
177
|
+
convert_members_to_pins decl, class_pin
|
140
178
|
end
|
141
179
|
|
142
180
|
# @param decl [RBS::AST::Declarations::Interface]
|
181
|
+
# @param closure [Pin::Closure]
|
143
182
|
# @return [void]
|
144
|
-
def interface_decl_to_pin decl
|
183
|
+
def interface_decl_to_pin decl, closure
|
145
184
|
class_pin = Solargraph::Pin::Namespace.new(
|
146
185
|
type: :module,
|
147
186
|
name: decl.name.relative!.to_s,
|
148
187
|
closure: Solargraph::Pin::ROOT_PIN,
|
149
188
|
comments: decl.comment&.string,
|
189
|
+
generics: decl.type_params.map(&:name).map(&:to_s),
|
150
190
|
# HACK: Using :hidden to keep interfaces from appearing in
|
151
191
|
# autocompletion
|
152
192
|
visibility: :hidden
|
153
193
|
)
|
154
194
|
class_pin.docstring.add_tag(YARD::Tags::Tag.new(:abstract, '(RBS interface)'))
|
155
195
|
pins.push class_pin
|
156
|
-
|
196
|
+
convert_members_to_pins decl, class_pin
|
157
197
|
end
|
158
198
|
|
159
199
|
# @param decl [RBS::AST::Declarations::Module]
|
@@ -167,15 +207,19 @@ module Solargraph
|
|
167
207
|
generics: decl.type_params.map(&:name).map(&:to_s),
|
168
208
|
)
|
169
209
|
pins.push module_pin
|
170
|
-
|
210
|
+
convert_self_types_to_pins decl, module_pin
|
211
|
+
convert_members_to_pins decl, module_pin
|
212
|
+
|
213
|
+
add_mixins decl, module_pin.closure
|
171
214
|
end
|
172
215
|
|
173
216
|
# @param name [String]
|
174
217
|
# @param tag [String]
|
175
218
|
# @param comments [String]
|
219
|
+
# @param base [String, nil] Optional conversion of tag to base<tag>
|
176
220
|
#
|
177
221
|
# @return [Solargraph::Pin::Constant]
|
178
|
-
def create_constant(name, tag, comments)
|
222
|
+
def create_constant(name, tag, comments, base = nil)
|
179
223
|
parts = name.split('::')
|
180
224
|
if parts.length > 1
|
181
225
|
name = parts.last
|
@@ -189,8 +233,8 @@ module Solargraph
|
|
189
233
|
closure: closure,
|
190
234
|
comments: comments
|
191
235
|
)
|
192
|
-
|
193
|
-
constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '',
|
236
|
+
tag = "#{base}<#{tag}>" if base
|
237
|
+
constant_pin.docstring.add_tag(YARD::Tags::Tag.new(:return, '', tag))
|
194
238
|
constant_pin
|
195
239
|
end
|
196
240
|
|
@@ -201,7 +245,17 @@ module Solargraph
|
|
201
245
|
new_name = decl.new_name.relative!.to_s
|
202
246
|
old_name = decl.old_name.relative!.to_s
|
203
247
|
|
204
|
-
pins.push create_constant(new_name, old_name, decl.comment&.string)
|
248
|
+
pins.push create_constant(new_name, old_name, decl.comment&.string, 'Class')
|
249
|
+
end
|
250
|
+
|
251
|
+
# @param decl [RBS::AST::Declarations::ModuleAlias]
|
252
|
+
# @return [void]
|
253
|
+
def module_alias_decl_to_pin decl
|
254
|
+
# See https://www.rubydoc.info/gems/rbs/3.4.3/RBS/AST/Declarations/ModuleAlias
|
255
|
+
new_name = decl.new_name.relative!.to_s
|
256
|
+
old_name = decl.old_name.relative!.to_s
|
257
|
+
|
258
|
+
pins.push create_constant(new_name, old_name, decl.comment&.string, 'Module')
|
205
259
|
end
|
206
260
|
|
207
261
|
# @param decl [RBS::AST::Declarations::Constant]
|
@@ -211,17 +265,40 @@ module Solargraph
|
|
211
265
|
pins.push create_constant(decl.name.relative!.to_s, tag, decl.comment&.string)
|
212
266
|
end
|
213
267
|
|
268
|
+
# @param decl [RBS::AST::Declarations::Global]
|
269
|
+
# @return [void]
|
270
|
+
def global_decl_to_pin decl
|
271
|
+
closure = Solargraph::Pin::ROOT_PIN
|
272
|
+
name = decl.name.to_s
|
273
|
+
tag = other_type_to_tag(decl.type)
|
274
|
+
pin = Solargraph::Pin::GlobalVariable.new(
|
275
|
+
name: name,
|
276
|
+
closure: closure,
|
277
|
+
comments: decl.comment&.string,
|
278
|
+
)
|
279
|
+
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', tag))
|
280
|
+
pins.push pin
|
281
|
+
end
|
282
|
+
|
214
283
|
# @param decl [RBS::AST::Members::MethodDefinition]
|
215
284
|
# @param closure [Pin::Closure]
|
216
285
|
# @return [void]
|
217
286
|
def method_def_to_pin decl, closure
|
287
|
+
# there may be edge cases here around different signatures
|
288
|
+
# having different type params / orders - we may need to match
|
289
|
+
# this data model and have generics live in signatures to
|
290
|
+
# handle those correctly
|
291
|
+
generics = decl.overloads.map(&:method_type).flat_map(&:type_params).map(&:name).map(&:to_s).uniq
|
218
292
|
if decl.instance?
|
219
293
|
pin = Solargraph::Pin::Method.new(
|
220
294
|
name: decl.name.to_s,
|
221
295
|
closure: closure,
|
222
296
|
comments: decl.comment&.string,
|
223
297
|
scope: :instance,
|
224
|
-
signatures: []
|
298
|
+
signatures: [],
|
299
|
+
generics: generics,
|
300
|
+
# @todo RBS core has unreliable visibility definitions
|
301
|
+
visibility: closure.path == 'Kernel' && Kernel.private_instance_methods(false).include?(decl.name) ? :private : :public
|
225
302
|
)
|
226
303
|
pin.signatures.concat method_def_to_sigs(decl, pin)
|
227
304
|
pins.push pin
|
@@ -237,6 +314,7 @@ module Solargraph
|
|
237
314
|
pins.last.signatures.replace(
|
238
315
|
pin.signatures.map do |p|
|
239
316
|
Pin::Signature.new(
|
317
|
+
p.generics,
|
240
318
|
p.parameters,
|
241
319
|
ComplexType::SELF
|
242
320
|
)
|
@@ -253,7 +331,8 @@ module Solargraph
|
|
253
331
|
closure: closure,
|
254
332
|
comments: decl.comment&.string,
|
255
333
|
scope: :class,
|
256
|
-
signatures: []
|
334
|
+
signatures: [],
|
335
|
+
generics: generics
|
257
336
|
)
|
258
337
|
pin.signatures.concat method_def_to_sigs(decl, pin)
|
259
338
|
pins.push pin
|
@@ -262,17 +341,33 @@ module Solargraph
|
|
262
341
|
|
263
342
|
# @param decl [RBS::AST::Members::MethodDefinition]
|
264
343
|
# @param pin [Pin::Method]
|
344
|
+
# @return [void]
|
265
345
|
def method_def_to_sigs decl, pin
|
266
346
|
decl.overloads.map do |overload|
|
347
|
+
generics = overload.method_type.type_params.map(&:to_s)
|
267
348
|
parameters, return_type = parts_of_function(overload.method_type, pin)
|
268
349
|
block = if overload.method_type.block
|
269
|
-
Pin::Signature.new(*parts_of_function(overload.method_type.block, pin))
|
350
|
+
Pin::Signature.new(generics, *parts_of_function(overload.method_type.block, pin))
|
270
351
|
end
|
271
352
|
return_type = ComplexType.try_parse(method_type_to_tag(overload.method_type))
|
272
|
-
Pin::Signature.new(parameters, return_type, block)
|
353
|
+
Pin::Signature.new(generics, parameters, return_type, block)
|
273
354
|
end
|
274
355
|
end
|
275
356
|
|
357
|
+
# @param location [RBS::Location, nil]
|
358
|
+
# @return [Solargraph::Location, nil]
|
359
|
+
def rbs_location_to_location(location)
|
360
|
+
return nil if location&.name.nil?
|
361
|
+
|
362
|
+
start_pos = Position.new(location.start_line - 1, location.start_column)
|
363
|
+
end_pos = Position.new(location.end_line - 1, location.end_column)
|
364
|
+
range = Range.new(start_pos, end_pos)
|
365
|
+
Location.new(location.name, range)
|
366
|
+
end
|
367
|
+
|
368
|
+
# @param type [RBS::MethodType,RBS::Types::Block]
|
369
|
+
# @param pin [Pin::Method]
|
370
|
+
# @return [Array<Array<Pin::Parameter>, ComplexType>]
|
276
371
|
def parts_of_function type, pin
|
277
372
|
return [[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin)], ComplexType.try_parse(method_type_to_tag(type))] if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
|
278
373
|
|
@@ -313,6 +408,9 @@ module Solargraph
|
|
313
408
|
[parameters, return_type]
|
314
409
|
end
|
315
410
|
|
411
|
+
# @param decl [RBS::AST::Members::AttrReader,RBS::AST::Members::AttrAccessor]
|
412
|
+
# @param closure [Pin::Namespace]
|
413
|
+
# @return [void]
|
316
414
|
def attr_reader_to_pin(decl, closure)
|
317
415
|
pin = Solargraph::Pin::Method.new(
|
318
416
|
name: decl.name.to_s,
|
@@ -325,6 +423,9 @@ module Solargraph
|
|
325
423
|
pins.push pin
|
326
424
|
end
|
327
425
|
|
426
|
+
# @param decl [RBS::AST::Members::AttrWriter, RBS::AST::Members::AttrAccessor]
|
427
|
+
# @param closure [Pin::Namespace]
|
428
|
+
# @return [void]
|
328
429
|
def attr_writer_to_pin(decl, closure)
|
329
430
|
pin = Solargraph::Pin::Method.new(
|
330
431
|
name: "#{decl.name.to_s}=",
|
@@ -337,11 +438,17 @@ module Solargraph
|
|
337
438
|
pins.push pin
|
338
439
|
end
|
339
440
|
|
441
|
+
# @param decl [RBS::AST::Members::AttrAccessor]
|
442
|
+
# @param closure [Pin::Namespace]
|
443
|
+
# @return [void]
|
340
444
|
def attr_accessor_to_pin(decl, closure)
|
341
445
|
attr_reader_to_pin(decl, closure)
|
342
446
|
attr_writer_to_pin(decl, closure)
|
343
447
|
end
|
344
448
|
|
449
|
+
# @param decl [RBS::AST::Members::InstanceVariable]
|
450
|
+
# @param closure [Pin::Namespace]
|
451
|
+
# @return [void]
|
345
452
|
def ivar_to_pin(decl, closure)
|
346
453
|
pin = Solargraph::Pin::InstanceVariable.new(
|
347
454
|
name: decl.name.to_s,
|
@@ -352,13 +459,50 @@ module Solargraph
|
|
352
459
|
pins.push pin
|
353
460
|
end
|
354
461
|
|
462
|
+
# @param decl [RBS::AST::Members::ClassVariable]
|
463
|
+
# @param closure [Pin::Namespace]
|
464
|
+
# @return [void]
|
465
|
+
def cvar_to_pin(decl, closure)
|
466
|
+
name = decl.name.to_s
|
467
|
+
pin = Solargraph::Pin::ClassVariable.new(
|
468
|
+
name: name,
|
469
|
+
closure: closure,
|
470
|
+
comments: decl.comment&.string
|
471
|
+
)
|
472
|
+
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
|
473
|
+
pins.push pin
|
474
|
+
end
|
475
|
+
|
476
|
+
# @param decl [RBS::AST::Members::ClassInstanceVariable]
|
477
|
+
# @param closure [Pin::Namespace]
|
478
|
+
# @return [void]
|
479
|
+
def civar_to_pin(decl, closure)
|
480
|
+
name = decl.name.to_s
|
481
|
+
pin = Solargraph::Pin::InstanceVariable.new(
|
482
|
+
name: name,
|
483
|
+
closure: closure,
|
484
|
+
comments: decl.comment&.string
|
485
|
+
)
|
486
|
+
pin.docstring.add_tag(YARD::Tags::Tag.new(:type, '', other_type_to_tag(decl.type)))
|
487
|
+
pins.push pin
|
488
|
+
end
|
489
|
+
|
490
|
+
# @param decl [RBS::AST::Members::Include]
|
491
|
+
# @param closure [Pin::Namespace]
|
492
|
+
# @return [void]
|
355
493
|
def include_to_pin decl, closure
|
494
|
+
type = generic_type(decl.name, decl.args)
|
495
|
+
generic_values = type.all_params.map(&:to_s)
|
356
496
|
pins.push Solargraph::Pin::Reference::Include.new(
|
357
497
|
name: decl.name.relative!.to_s,
|
498
|
+
generic_values: generic_values,
|
358
499
|
closure: closure
|
359
500
|
)
|
360
501
|
end
|
361
502
|
|
503
|
+
# @param decl [RBS::AST::Members::Prepend]
|
504
|
+
# @param closure [Pin::Namespace]
|
505
|
+
# @return [void]
|
362
506
|
def prepend_to_pin decl, closure
|
363
507
|
pins.push Solargraph::Pin::Reference::Prepend.new(
|
364
508
|
name: decl.name.relative!.to_s,
|
@@ -366,6 +510,9 @@ module Solargraph
|
|
366
510
|
)
|
367
511
|
end
|
368
512
|
|
513
|
+
# @param decl [RBS::AST::Members::Extend]
|
514
|
+
# @param closure [Pin::Namespace]
|
515
|
+
# @return [void]
|
369
516
|
def extend_to_pin decl, closure
|
370
517
|
pins.push Solargraph::Pin::Reference::Extend.new(
|
371
518
|
name: decl.name.relative!.to_s,
|
@@ -374,6 +521,8 @@ module Solargraph
|
|
374
521
|
end
|
375
522
|
|
376
523
|
# @param decl [RBS::AST::Members::Alias]
|
524
|
+
# @param closure [Pin::Namespace]
|
525
|
+
# @return [void]
|
377
526
|
def alias_to_pin decl, closure
|
378
527
|
pins.push Solargraph::Pin::MethodAlias.new(
|
379
528
|
name: decl.new_name.to_s,
|
@@ -390,7 +539,7 @@ module Solargraph
|
|
390
539
|
'NilClass' => 'nil'
|
391
540
|
}
|
392
541
|
|
393
|
-
# @param type [RBS::
|
542
|
+
# @param type [RBS::MethodType]
|
394
543
|
# @return [String]
|
395
544
|
def method_type_to_tag type
|
396
545
|
if type_aliases.key?(type.type.return_type.to_s)
|
@@ -400,6 +549,25 @@ module Solargraph
|
|
400
549
|
end
|
401
550
|
end
|
402
551
|
|
552
|
+
# @param type_name [RBS::TypeName]
|
553
|
+
# @param type_args [Enumerable<RBS::Types::Bases::Base>]
|
554
|
+
# @return [ComplexType]
|
555
|
+
def generic_type(type_name, type_args)
|
556
|
+
base = RBS_TO_YARD_TYPE[type_name.relative!.to_s] || type_name.relative!.to_s
|
557
|
+
params = type_args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }
|
558
|
+
params_str = params.empty? ? '' : "<#{params.join(', ')}>"
|
559
|
+
type_string = "#{base}#{params_str}"
|
560
|
+
ComplexType.parse(type_string)
|
561
|
+
end
|
562
|
+
|
563
|
+
# @param type_name [RBS::TypeName]
|
564
|
+
# @param type_args [Enumerable<RBS::Types::Bases::Base>]
|
565
|
+
# @return [String]
|
566
|
+
def generic_type_tag(type_name, type_args)
|
567
|
+
generic_type(type_name, type_args).tag
|
568
|
+
end
|
569
|
+
|
570
|
+
# @param type [RBS::Types::Bases::Base]
|
403
571
|
# @return [String]
|
404
572
|
def other_type_to_tag type
|
405
573
|
if type.is_a?(RBS::Types::Optional)
|
@@ -427,14 +595,19 @@ module Solargraph
|
|
427
595
|
elsif type.is_a?(RBS::Types::Variable)
|
428
596
|
"#{Solargraph::ComplexType::GENERIC_TAG_NAME}<#{type.name}>"
|
429
597
|
elsif type.is_a?(RBS::Types::ClassInstance) #&& !type.args.empty?
|
430
|
-
|
431
|
-
params = type.args.map { |a| other_type_to_tag(a) }.reject { |t| t == 'undefined' }
|
432
|
-
return base if params.empty?
|
433
|
-
"#{base}<#{params.join(', ')}>"
|
598
|
+
generic_type_tag(type.name, type.args)
|
434
599
|
elsif type.is_a?(RBS::Types::Bases::Instance)
|
435
600
|
'self'
|
436
|
-
elsif type.is_a?(RBS::Types::Bases::Top)
|
437
|
-
|
601
|
+
elsif type.is_a?(RBS::Types::Bases::Top)
|
602
|
+
# top is the most super superclass
|
603
|
+
'BasicObject'
|
604
|
+
elsif type.is_a?(RBS::Types::Bases::Bottom)
|
605
|
+
# bottom is used in contexts where nothing will ever return
|
606
|
+
# - e.g., it could be the return type of 'exit()' or 'raise'
|
607
|
+
#
|
608
|
+
# @todo define a specific bottom type and use it to
|
609
|
+
# determine dead code
|
610
|
+
'undefined'
|
438
611
|
elsif type.is_a?(RBS::Types::Intersection)
|
439
612
|
type.types.map { |member| other_type_to_tag(member) }.join(', ')
|
440
613
|
elsif type.is_a?(RBS::Types::Proc)
|
@@ -446,6 +619,20 @@ module Solargraph
|
|
446
619
|
'undefined'
|
447
620
|
end
|
448
621
|
end
|
622
|
+
|
623
|
+
# @param decl [RBS::AST::Declarations::Class, RBS::AST::Declarations::Module]
|
624
|
+
# @param closure [Pin::Closure]
|
625
|
+
# @return [void]
|
626
|
+
def add_mixins decl, closure
|
627
|
+
decl.each_mixin do |mixin|
|
628
|
+
klass = mixin.is_a?(RBS::AST::Members::Include) ? Pin::Reference::Include : Pin::Reference::Extend
|
629
|
+
pins.push klass.new(
|
630
|
+
name: mixin.name.relative!.to_s,
|
631
|
+
location: rbs_location_to_location(mixin.location),
|
632
|
+
closure: closure
|
633
|
+
)
|
634
|
+
end
|
635
|
+
end
|
449
636
|
end
|
450
637
|
end
|
451
638
|
end
|
@@ -22,33 +22,11 @@ module Solargraph
|
|
22
22
|
closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [Class<self>]')
|
23
23
|
]
|
24
24
|
|
25
|
-
YIELDPARAMS = [
|
26
|
-
Override.from_comment('Object#tap', %(
|
27
|
-
@return [self]
|
28
|
-
@yieldparam [self]
|
29
|
-
)),
|
30
|
-
Override.from_comment('String#each_line', %(
|
31
|
-
@yieldparam [String]
|
32
|
-
))
|
33
|
-
]
|
34
|
-
|
35
|
-
methods_with_yieldparam_subtypes = %w[
|
36
|
-
Array#each Array#map Array#map! Array#any? Array#all? Array#index
|
37
|
-
Array#keep_if Array#delete_if
|
38
|
-
Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
|
39
|
-
Enumerable#select Enumerable#reject
|
40
|
-
Set#each
|
41
|
-
]
|
42
|
-
|
43
|
-
YIELDPARAM_SINGLE_PARAMETERS = methods_with_yieldparam_subtypes.map do |path|
|
44
|
-
Override.from_comment(path, <<~DOC
|
45
|
-
@yieldparam [generic<Elem>]
|
46
|
-
DOC
|
47
|
-
)
|
48
|
-
end
|
49
|
-
|
50
25
|
CLASS_RETURN_TYPES = [
|
26
|
+
Override.method_return('Class#new', 'self'),
|
27
|
+
Override.method_return('Class.new', 'Class<BasicObject>'),
|
51
28
|
Override.method_return('Class#allocate', 'self'),
|
29
|
+
Override.method_return('Class.allocate', 'Class<BasicObject>')
|
52
30
|
]
|
53
31
|
|
54
32
|
# HACK: Add Errno exception classes
|
@@ -60,7 +38,7 @@ module Solargraph
|
|
60
38
|
end
|
61
39
|
ERRNOS = errnos
|
62
40
|
|
63
|
-
ALL = KEYWORDS + MISSING +
|
41
|
+
ALL = KEYWORDS + MISSING + CLASS_RETURN_TYPES + ERRNOS
|
64
42
|
end
|
65
43
|
end
|
66
44
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rbs'
|
4
|
-
require 'set'
|
5
4
|
|
6
5
|
module Solargraph
|
7
6
|
class RbsMap
|
@@ -16,11 +15,10 @@ module Solargraph
|
|
16
15
|
cache = Cache.load('stdlib', "#{library}.ser")
|
17
16
|
if cache
|
18
17
|
pins.replace cache
|
18
|
+
@resolved = true
|
19
19
|
else
|
20
20
|
super
|
21
|
-
|
22
|
-
pins.push Solargraph::Pin::Constant.new(name: 'YAML', comments: '@return [Module<Psych>]', closure: Pin::ROOT_PIN)
|
23
|
-
end
|
21
|
+
return unless resolved?
|
24
22
|
Cache.save('stdlib', "#{library}.ser", pins)
|
25
23
|
end
|
26
24
|
end
|
@@ -30,10 +28,6 @@ module Solargraph
|
|
30
28
|
def self.load library
|
31
29
|
@stdlib_maps_hash[library] ||= StdlibMap.new(library)
|
32
30
|
end
|
33
|
-
|
34
|
-
def repository
|
35
|
-
@repository ||= RBS::Repository.new
|
36
|
-
end
|
37
31
|
end
|
38
32
|
end
|
39
33
|
end
|
data/lib/solargraph/rbs_map.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rbs'
|
4
|
-
require 'set'
|
5
4
|
|
6
5
|
module Solargraph
|
7
6
|
class RbsMap
|
@@ -19,18 +18,24 @@ module Solargraph
|
|
19
18
|
attr_reader :library
|
20
19
|
|
21
20
|
# @param library [String]
|
22
|
-
def initialize library
|
21
|
+
def initialize library, version = nil
|
23
22
|
@library = library
|
23
|
+
@version = version
|
24
|
+
@collection = nil
|
24
25
|
loader = RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
|
25
|
-
add_library loader, library
|
26
|
+
add_library loader, library, version
|
26
27
|
return unless resolved?
|
27
28
|
load_environment_to_pins(loader)
|
28
29
|
end
|
29
30
|
|
31
|
+
# @param path [String]
|
32
|
+
# @return [Pin::Base, nil]
|
30
33
|
def path_pin path
|
31
34
|
pins.find { |p| p.path == path }
|
32
35
|
end
|
33
36
|
|
37
|
+
# @param path [String]
|
38
|
+
# @return [Array<Pin::Base>]
|
34
39
|
def path_pins path
|
35
40
|
pins.select { |p| p.path == path }
|
36
41
|
end
|
@@ -39,14 +44,18 @@ module Solargraph
|
|
39
44
|
@resolved
|
40
45
|
end
|
41
46
|
|
47
|
+
def repository
|
48
|
+
@repository ||= RBS::Repository.new(no_stdlib: false)
|
49
|
+
end
|
50
|
+
|
42
51
|
# @param library [String]
|
43
52
|
# @return [RbsMap]
|
44
53
|
def self.load library
|
45
54
|
@@rbs_maps_hash[library] ||= RbsMap.new(library)
|
46
55
|
end
|
47
56
|
|
48
|
-
def
|
49
|
-
|
57
|
+
def self.from_gemspec(gemspec)
|
58
|
+
RbsMap.new(gemspec.name, gemspec.version)
|
50
59
|
end
|
51
60
|
|
52
61
|
private
|
@@ -54,17 +63,18 @@ module Solargraph
|
|
54
63
|
# @param loader [RBS::EnvironmentLoader]
|
55
64
|
# @param library [String]
|
56
65
|
# @return [Boolean] true if adding the library succeeded
|
57
|
-
def add_library loader, library
|
58
|
-
@resolved = if loader.has_library?(library: library, version:
|
59
|
-
loader.add library: library, version:
|
66
|
+
def add_library loader, library, version
|
67
|
+
@resolved = if loader.has_library?(library: library, version: version)
|
68
|
+
loader.add library: library, version: version
|
60
69
|
Solargraph.logger.info "#{short_name} successfully loaded library #{library}"
|
61
70
|
true
|
62
71
|
else
|
63
|
-
Solargraph.logger.
|
72
|
+
Solargraph.logger.debug "#{short_name} failed to load library #{library}"
|
64
73
|
false
|
65
74
|
end
|
66
75
|
end
|
67
76
|
|
77
|
+
# @return [String]
|
68
78
|
def short_name
|
69
79
|
self.class.name.split('::').last
|
70
80
|
end
|