solargraph 0.59.0.dev.1 → 0.59.0.dev.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/.github/workflows/plugins.yml +4 -1
- data/.github/workflows/rspec.yml +3 -14
- data/.gitignore +1 -0
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +37 -931
- data/CHANGELOG.md +7 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/index.rb +5 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +22 -20
- data/lib/solargraph/api_map.rb +50 -37
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +12 -15
- data/lib/solargraph/complex_type/unique_type.rb +54 -43
- data/lib/solargraph/complex_type.rb +69 -61
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +9 -10
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +7 -5
- 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 +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +28 -33
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +78 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +71 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +16 -19
- data/lib/solargraph/position.rb +35 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +312 -206
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +3 -12
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +63 -53
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +24 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +52 -46
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -101
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +10 -9
- data/lib/solargraph/workspace/gemspecs.rb +1 -1
- data/lib/solargraph/workspace.rb +21 -44
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph.rb +5 -5
- data/solargraph.gemspec +35 -34
- metadata +28 -28
|
@@ -28,19 +28,14 @@ module Solargraph
|
|
|
28
28
|
# @param arguments [::Array<Chain>]
|
|
29
29
|
# @param block [Chain, nil]
|
|
30
30
|
def initialize word, location = nil, arguments = [], block = nil
|
|
31
|
-
|
|
31
|
+
super(word)
|
|
32
|
+
|
|
32
33
|
@location = location
|
|
33
34
|
@arguments = arguments
|
|
34
35
|
@block = block
|
|
35
36
|
fix_block_pass
|
|
36
37
|
end
|
|
37
38
|
|
|
38
|
-
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
39
|
-
protected def equality_fields
|
|
40
|
-
# @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
41
|
-
super + [arguments, block]
|
|
42
|
-
end
|
|
43
|
-
|
|
44
39
|
def with_block?
|
|
45
40
|
!!@block
|
|
46
41
|
end
|
|
@@ -68,10 +63,7 @@ module Solargraph
|
|
|
68
63
|
stack = api_map.get_method_stack(ns_tag, word, scope: context.scope)
|
|
69
64
|
[stack.first].compact
|
|
70
65
|
end
|
|
71
|
-
|
|
72
|
-
if !api_map.loose_unions && pin_groups.any? { |pins| pins.empty? }
|
|
73
|
-
pin_groups = []
|
|
74
|
-
end
|
|
66
|
+
pin_groups = [] if !api_map.loose_unions && pin_groups.any?(&:empty?)
|
|
75
67
|
pins = pin_groups.flatten.uniq(&:path)
|
|
76
68
|
return [] if pins.empty?
|
|
77
69
|
inferred_pins(pins, api_map, name_pin, locals)
|
|
@@ -128,38 +120,42 @@ module Solargraph
|
|
|
128
120
|
if ol.block && with_block?
|
|
129
121
|
block_atypes = ol.block.parameters.map(&:return_type)
|
|
130
122
|
# @todo Need to add nil check here
|
|
131
|
-
if block.links.map(&:class) == [BlockSymbol]
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
123
|
+
blocktype = if block.links.map(&:class) == [BlockSymbol]
|
|
124
|
+
# like the bar in foo(&:bar)
|
|
125
|
+
block_symbol_call_type(api_map, name_pin.context, block_atypes, locals)
|
|
126
|
+
else
|
|
127
|
+
block_call_type(api_map, name_pin, locals)
|
|
128
|
+
end
|
|
137
129
|
end
|
|
138
130
|
# @type new_signature_pin [Pin::Signature]
|
|
139
|
-
new_signature_pin = ol.resolve_generics_from_context_until_complete(ol.generics, atypes, nil, nil,
|
|
131
|
+
new_signature_pin = ol.resolve_generics_from_context_until_complete(ol.generics, atypes, nil, nil,
|
|
132
|
+
blocktype)
|
|
140
133
|
new_return_type = new_signature_pin.return_type
|
|
141
|
-
if head?
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
134
|
+
self_type = if head?
|
|
135
|
+
# If we're at the head of the chain, we called a
|
|
136
|
+
# method somewhere that marked itself as returning
|
|
137
|
+
# self. Given we didn't invoke this on an object,
|
|
138
|
+
# this must be a method in this same class - so we
|
|
139
|
+
# use our own self type
|
|
140
|
+
name_pin.context
|
|
141
|
+
else
|
|
142
|
+
# if we're past the head in the chain, whatever the
|
|
143
|
+
# type of the lhs side is what 'self' will be in its
|
|
144
|
+
# declaration - we can't just use the type of the
|
|
145
|
+
# method pin, as this might be a subclass of the
|
|
146
|
+
# place where the method is defined
|
|
147
|
+
name_pin.binder
|
|
148
|
+
end
|
|
156
149
|
# This same logic applies to the YARD work done by
|
|
157
150
|
# 'with_params()'.
|
|
158
151
|
#
|
|
159
152
|
# qualify(), however, happens in the namespace where
|
|
160
153
|
# the docs were written - from the method pin.
|
|
161
154
|
# @todo Need to add nil check here
|
|
162
|
-
|
|
155
|
+
if new_return_type.defined?
|
|
156
|
+
type = with_params(new_return_type.self_to_type(self_type), self_type).qualify(api_map,
|
|
157
|
+
*p.gates)
|
|
158
|
+
end
|
|
163
159
|
type ||= ComplexType::UNDEFINED
|
|
164
160
|
end
|
|
165
161
|
break if type.defined?
|
|
@@ -177,8 +173,10 @@ module Solargraph
|
|
|
177
173
|
end
|
|
178
174
|
p
|
|
179
175
|
end
|
|
180
|
-
logger.debug
|
|
181
|
-
|
|
176
|
+
logger.debug do
|
|
177
|
+
"Call#inferred_pins(name_pin.binder=#{name_pin.binder}, word=#{word}, pins=#{pins.map(&:desc)}, name_pin=#{name_pin}) - result=#{result}"
|
|
178
|
+
end
|
|
179
|
+
result.map do |pin|
|
|
182
180
|
if pin.path == 'Class#new' && name_pin.binder.tag != 'Class'
|
|
183
181
|
reduced_context = name_pin.binder.reduce_class_type
|
|
184
182
|
pin.proxy(reduced_context)
|
|
@@ -234,7 +232,7 @@ module Solargraph
|
|
|
234
232
|
# @param locals [::Array<Pin::LocalVariable, Pin::Parameter>]
|
|
235
233
|
# @return [Pin::ProxyType]
|
|
236
234
|
def inner_process_macro pin, macro, api_map, context, locals
|
|
237
|
-
vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals), source: :chain) }
|
|
235
|
+
vals = arguments.map { |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals), source: :chain) }
|
|
238
236
|
txt = macro.tag.text.clone
|
|
239
237
|
# @sg-ignore Need to add nil check here
|
|
240
238
|
if txt.empty? && macro.tag.name
|
|
@@ -260,7 +258,7 @@ module Solargraph
|
|
|
260
258
|
# @param context [ComplexType]
|
|
261
259
|
# @return [ComplexType, nil]
|
|
262
260
|
def extra_return_type docstring, context
|
|
263
|
-
if docstring.has_tag?('return_single_parameter')
|
|
261
|
+
if docstring.has_tag?('return_single_parameter') # && context.subtypes.one?
|
|
264
262
|
return context.subtypes.first || ComplexType::UNDEFINED
|
|
265
263
|
elsif docstring.has_tag?('return_value_parameter') && context.value_types.one?
|
|
266
264
|
return context.value_types.first
|
|
@@ -270,7 +268,7 @@ module Solargraph
|
|
|
270
268
|
|
|
271
269
|
# @param name_pin [Pin::Base]
|
|
272
270
|
# @return [Pin::Method, nil]
|
|
273
|
-
def find_method_pin
|
|
271
|
+
def find_method_pin name_pin
|
|
274
272
|
method_pin = name_pin
|
|
275
273
|
until method_pin.is_a?(Pin::Method)
|
|
276
274
|
# @sg-ignore Need to support this in flow sensitive typing
|
|
@@ -287,7 +285,7 @@ module Solargraph
|
|
|
287
285
|
method_pin = find_method_pin(name_pin)
|
|
288
286
|
return [] if method_pin.nil?
|
|
289
287
|
pins = api_map.get_method_stack(method_pin.namespace, method_pin.name, scope: method_pin.context.scope)
|
|
290
|
-
pins.reject{|p| p.path == name_pin.path}
|
|
288
|
+
pins.reject { |p| p.path == name_pin.path }
|
|
291
289
|
end
|
|
292
290
|
|
|
293
291
|
# @param api_map [ApiMap]
|
|
@@ -324,7 +322,7 @@ module Solargraph
|
|
|
324
322
|
# @param block_parameter_types [::Array<ComplexType>]
|
|
325
323
|
# @param locals [::Array<Pin::LocalVariable>]
|
|
326
324
|
# @return [ComplexType, nil]
|
|
327
|
-
def block_symbol_call_type
|
|
325
|
+
def block_symbol_call_type api_map, context, block_parameter_types, locals
|
|
328
326
|
# Ruby's shorthand for sending the passed in method name
|
|
329
327
|
# to the first yield parameter with no arguments
|
|
330
328
|
# @sg-ignore Need to add nil check here
|
|
@@ -342,7 +340,7 @@ module Solargraph
|
|
|
342
340
|
|
|
343
341
|
# @param api_map [ApiMap]
|
|
344
342
|
# @return [Pin::Block, nil]
|
|
345
|
-
def find_block_pin
|
|
343
|
+
def find_block_pin api_map
|
|
346
344
|
# @sg-ignore Need to add nil check here
|
|
347
345
|
node_location = Solargraph::Location.from_node(block.node)
|
|
348
346
|
return if node_location.nil?
|
|
@@ -353,10 +351,9 @@ module Solargraph
|
|
|
353
351
|
|
|
354
352
|
# @param api_map [ApiMap]
|
|
355
353
|
# @param name_pin [Pin::Base]
|
|
356
|
-
# @param block_parameter_types [::Array<ComplexType>]
|
|
357
354
|
# @param locals [::Array<Pin::LocalVariable>]
|
|
358
355
|
# @return [ComplexType, nil]
|
|
359
|
-
def block_call_type
|
|
356
|
+
def block_call_type api_map, name_pin, locals
|
|
360
357
|
return nil unless with_block?
|
|
361
358
|
|
|
362
359
|
block_pin = find_block_pin(api_map)
|
|
@@ -366,6 +363,14 @@ module Solargraph
|
|
|
366
363
|
# @sg-ignore Need to add nil check here
|
|
367
364
|
block.infer(api_map, block_pin, locals)
|
|
368
365
|
end
|
|
366
|
+
|
|
367
|
+
protected
|
|
368
|
+
|
|
369
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
370
|
+
def equality_fields
|
|
371
|
+
# @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
372
|
+
super + [arguments, block]
|
|
373
|
+
end
|
|
369
374
|
end
|
|
370
375
|
end
|
|
371
376
|
end
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
class Chain
|
|
6
|
-
class ClassVariable < Link
|
|
7
|
-
def resolve api_map, name_pin, locals
|
|
8
|
-
api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class ClassVariable < Link
|
|
7
|
+
def resolve api_map, name_pin, locals
|
|
8
|
+
api_map.get_class_variable_pins(name_pin.context.namespace).select { |p| p.name == word }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -6,12 +6,14 @@ module Solargraph
|
|
|
6
6
|
class Constant < Link
|
|
7
7
|
def initialize word
|
|
8
8
|
@word = word
|
|
9
|
+
|
|
10
|
+
super
|
|
9
11
|
end
|
|
10
12
|
|
|
11
13
|
def resolve api_map, name_pin, locals
|
|
12
14
|
return [Pin::ROOT_PIN] if word.empty?
|
|
13
15
|
if word.start_with?('::')
|
|
14
|
-
base = word[2
|
|
16
|
+
base = word[2..]
|
|
15
17
|
gates = ['']
|
|
16
18
|
else
|
|
17
19
|
base = word
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
class Chain
|
|
6
|
-
class GlobalVariable < Link
|
|
7
|
-
def resolve api_map, name_pin, locals
|
|
8
|
-
api_map.get_global_variable_pins.select{|p| p.name == word}
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class GlobalVariable < Link
|
|
7
|
+
def resolve api_map, name_pin, locals
|
|
8
|
+
api_map.get_global_variable_pins.select { |p| p.name == word }
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -12,12 +12,6 @@ module Solargraph
|
|
|
12
12
|
@splatted = splatted
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
16
|
-
protected def equality_fields
|
|
17
|
-
# @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
18
|
-
super + [@splatted]
|
|
19
|
-
end
|
|
20
|
-
|
|
21
15
|
def word
|
|
22
16
|
@word ||= "<#{@type}>"
|
|
23
17
|
end
|
|
@@ -29,6 +23,14 @@ module Solargraph
|
|
|
29
23
|
def splatted?
|
|
30
24
|
@splatted
|
|
31
25
|
end
|
|
26
|
+
|
|
27
|
+
protected
|
|
28
|
+
|
|
29
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
30
|
+
def equality_fields
|
|
31
|
+
# @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
32
|
+
super + [@splatted]
|
|
33
|
+
end
|
|
32
34
|
end
|
|
33
35
|
end
|
|
34
36
|
end
|
|
@@ -4,25 +4,26 @@ module Solargraph
|
|
|
4
4
|
class Source
|
|
5
5
|
class Chain
|
|
6
6
|
class If < Link
|
|
7
|
-
def word
|
|
8
|
-
'<if>'
|
|
9
|
-
end
|
|
10
|
-
|
|
11
7
|
# @param links [::Array<Chain>]
|
|
12
8
|
def initialize links
|
|
9
|
+
super('<if>')
|
|
10
|
+
|
|
13
11
|
@links = links
|
|
14
12
|
end
|
|
15
13
|
|
|
14
|
+
def resolve api_map, name_pin, locals
|
|
15
|
+
types = @links.map { |link| link.infer(api_map, name_pin, locals) }
|
|
16
|
+
[Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')),
|
|
17
|
+
source: :chain)]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
protected
|
|
21
|
+
|
|
16
22
|
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
17
|
-
|
|
23
|
+
def equality_fields
|
|
18
24
|
# @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
|
|
19
25
|
super + [@links]
|
|
20
26
|
end
|
|
21
|
-
|
|
22
|
-
def resolve api_map, name_pin, locals
|
|
23
|
-
types = @links.map { |link| link.infer(api_map, name_pin, locals) }
|
|
24
|
-
[Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')), source: :chain)]
|
|
25
|
-
end
|
|
26
27
|
end
|
|
27
28
|
end
|
|
28
29
|
end
|
|
@@ -18,7 +18,9 @@ module Solargraph
|
|
|
18
18
|
# type ::Array<::Solargraph::Pin::BaseVariable, ::NilClass>
|
|
19
19
|
# for Solargraph::Source::Chain::InstanceVariable#resolve
|
|
20
20
|
def resolve api_map, name_pin, locals
|
|
21
|
-
ivars = api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select
|
|
21
|
+
ivars = api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select do |p|
|
|
22
|
+
p.name == word
|
|
23
|
+
end
|
|
22
24
|
out = api_map.var_at_location(ivars, word, name_pin, location)
|
|
23
25
|
[out].compact
|
|
24
26
|
end
|
|
@@ -1,109 +1,99 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
class Chain
|
|
6
|
-
class Link
|
|
7
|
-
include Equality
|
|
8
|
-
|
|
9
|
-
# @return [String]
|
|
10
|
-
attr_reader :word
|
|
11
|
-
|
|
12
|
-
# @return [Pin::Base]
|
|
13
|
-
attr_accessor :last_context
|
|
14
|
-
|
|
15
|
-
# @param word [String]
|
|
16
|
-
def initialize word = '<undefined>'
|
|
17
|
-
@word = word
|
|
18
|
-
end
|
|
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
|
-
|
|
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
|
-
# @param bool [Boolean]
|
|
101
|
-
# @return [self]
|
|
102
|
-
def mark_head bool
|
|
103
|
-
@head = bool
|
|
104
|
-
self
|
|
105
|
-
end
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
end
|
|
109
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Link
|
|
7
|
+
include Equality
|
|
8
|
+
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :word
|
|
11
|
+
|
|
12
|
+
# @return [Pin::Base]
|
|
13
|
+
attr_accessor :last_context
|
|
14
|
+
|
|
15
|
+
# @param word [String]
|
|
16
|
+
def initialize word = '<undefined>'
|
|
17
|
+
@word = word
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def undefined?
|
|
21
|
+
word == '<undefined>'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def constant?
|
|
25
|
+
is_a?(Chain::Constant)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# @param api_map [ApiMap]
|
|
29
|
+
# @param name_pin [Pin::Base]
|
|
30
|
+
# @param locals [::Array<Pin::Base>]
|
|
31
|
+
# @return [::Array<Pin::Base>]
|
|
32
|
+
def resolve api_map, name_pin, locals
|
|
33
|
+
[]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def to_s
|
|
37
|
+
desc
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def inspect
|
|
41
|
+
"#<#{self.class} - `#{desc}`>"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def head?
|
|
45
|
+
@head ||= false
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Make a copy of this link marked as the head of a chain
|
|
49
|
+
#
|
|
50
|
+
# @return [self]
|
|
51
|
+
def clone_head
|
|
52
|
+
clone.mark_head(true)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Make a copy of this link unmarked as the head of a chain
|
|
56
|
+
#
|
|
57
|
+
# @return [self]
|
|
58
|
+
def clone_body
|
|
59
|
+
clone.mark_head(false)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def nullable?
|
|
63
|
+
false
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# debugging description of contents; not for machine use
|
|
67
|
+
#
|
|
68
|
+
# @return [String]
|
|
69
|
+
def desc
|
|
70
|
+
word
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
include Logging
|
|
74
|
+
|
|
75
|
+
protected
|
|
76
|
+
|
|
77
|
+
# @sg-ignore two problems - Declared return type
|
|
78
|
+
# ::Solargraph::Source::Chain::Array does not match inferred
|
|
79
|
+
# type ::Array(::Class<::Solargraph::Source::Chain::Link>,
|
|
80
|
+
# ::String) for
|
|
81
|
+
# Solargraph::Source::Chain::Link#equality_fields
|
|
82
|
+
# and
|
|
83
|
+
# Not enough arguments to Module#protected
|
|
84
|
+
def equality_fields
|
|
85
|
+
[self.class, word]
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Mark whether this link is the head of a chain
|
|
89
|
+
#
|
|
90
|
+
# @param bool [Boolean]
|
|
91
|
+
# @return [self]
|
|
92
|
+
def mark_head bool
|
|
93
|
+
@head = bool
|
|
94
|
+
self
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -6,15 +6,13 @@ module Solargraph
|
|
|
6
6
|
class Source
|
|
7
7
|
class Chain
|
|
8
8
|
class Literal < Link
|
|
9
|
-
|
|
10
|
-
@word ||= "<#{@type}>"
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
attr_reader :value
|
|
9
|
+
attr_reader :word, :value
|
|
14
10
|
|
|
15
11
|
# @param type [String]
|
|
16
12
|
# @param node [Parser::AST::Node, Object]
|
|
17
13
|
def initialize type, node
|
|
14
|
+
super("<#{type}>")
|
|
15
|
+
|
|
18
16
|
if node.is_a?(::Parser::AST::Node)
|
|
19
17
|
# @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
|
|
20
18
|
if node.type == :true
|
|
@@ -23,7 +21,7 @@ module Solargraph
|
|
|
23
21
|
elsif node.type == :false
|
|
24
22
|
@value = false
|
|
25
23
|
# @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
|
|
26
|
-
elsif [
|
|
24
|
+
elsif %i[int sym].include?(node.type)
|
|
27
25
|
# @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
|
|
28
26
|
@value = node.children.first
|
|
29
27
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class QCall < Call
|
|
7
|
+
def nullable?
|
|
8
|
+
true
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
class Chain
|
|
6
|
-
class Variable < Link
|
|
7
|
-
def resolve api_map, name_pin, locals
|
|
8
|
-
api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
class Chain
|
|
6
|
+
class Variable < Link
|
|
7
|
+
def resolve api_map, name_pin, locals
|
|
8
|
+
api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select do |p|
|
|
9
|
+
p.name == word
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|