solargraph 0.58.1 → 0.59.0.dev.1
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/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -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 +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -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 +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -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 +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /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
data/lib/solargraph/pin/block.rb
CHANGED
|
@@ -1,104 +1,126 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class Block < Callable
|
|
6
|
-
include Breakable
|
|
7
|
-
|
|
8
|
-
# @return [Parser::AST::Node]
|
|
9
|
-
attr_reader :receiver
|
|
10
|
-
|
|
11
|
-
# @return [Parser::AST::Node]
|
|
12
|
-
attr_reader :node
|
|
13
|
-
|
|
14
|
-
# @param receiver [Parser::AST::Node, nil]
|
|
15
|
-
# @param node [Parser::AST::Node, nil]
|
|
16
|
-
# @param context [ComplexType, nil]
|
|
17
|
-
# @param args [::Array<Parameter>]
|
|
18
|
-
def initialize receiver: nil, args: [], context: nil, node: nil, **splat
|
|
19
|
-
super(**splat, parameters: args)
|
|
20
|
-
@receiver = receiver
|
|
21
|
-
@context = context
|
|
22
|
-
@return_type = ComplexType.parse('::Proc')
|
|
23
|
-
@node = node
|
|
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
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Block < Callable
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
8
|
+
# @return [Parser::AST::Node]
|
|
9
|
+
attr_reader :receiver
|
|
10
|
+
|
|
11
|
+
# @return [Parser::AST::Node]
|
|
12
|
+
attr_reader :node
|
|
13
|
+
|
|
14
|
+
# @param receiver [Parser::AST::Node, nil]
|
|
15
|
+
# @param node [Parser::AST::Node, nil]
|
|
16
|
+
# @param context [ComplexType, nil]
|
|
17
|
+
# @param args [::Array<Parameter>]
|
|
18
|
+
def initialize receiver: nil, args: [], context: nil, node: nil, **splat
|
|
19
|
+
super(**splat, parameters: args)
|
|
20
|
+
@receiver = receiver
|
|
21
|
+
@context = context
|
|
22
|
+
@return_type = ComplexType.parse('::Proc')
|
|
23
|
+
@node = node
|
|
24
|
+
@name = '<block>'
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @param api_map [ApiMap]
|
|
28
|
+
# @return [void]
|
|
29
|
+
def rebind api_map
|
|
30
|
+
@rebind ||= maybe_rebind(api_map)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def binder
|
|
34
|
+
out = @rebind if @rebind&.defined?
|
|
35
|
+
out ||= super
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def context
|
|
39
|
+
@context = @rebind if @rebind&.defined?
|
|
40
|
+
super
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param yield_types [::Array<ComplexType>]
|
|
44
|
+
# @param parameters [::Array<Parameter>]
|
|
45
|
+
#
|
|
46
|
+
# @return [::Array<ComplexType>]
|
|
47
|
+
def destructure_yield_types(yield_types, parameters)
|
|
48
|
+
# yielding a tuple into a block will destructure the tuple
|
|
49
|
+
if yield_types.length == 1
|
|
50
|
+
yield_type = yield_types.first
|
|
51
|
+
return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
|
|
52
|
+
end
|
|
53
|
+
parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @param api_map [ApiMap]
|
|
57
|
+
# @return [::Array<ComplexType>]
|
|
58
|
+
def typify_parameters(api_map)
|
|
59
|
+
chain = Parser.chain(receiver, filename, node)
|
|
60
|
+
# @sg-ignore Need to add nil check here
|
|
61
|
+
clip = api_map.clip_at(location.filename, location.range.start)
|
|
62
|
+
locals = clip.locals - [self]
|
|
63
|
+
# @sg-ignore Need to add nil check here
|
|
64
|
+
meths = chain.define(api_map, closure, locals)
|
|
65
|
+
# @todo Convert logic to use signatures
|
|
66
|
+
# @param meth [Pin::Method]
|
|
67
|
+
meths.each do |meth|
|
|
68
|
+
next if meth.block.nil?
|
|
69
|
+
|
|
70
|
+
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
71
|
+
yield_types = meth.block.parameters.map(&:return_type)
|
|
72
|
+
# 'arguments' is what the method says it will yield to the
|
|
73
|
+
# block; 'parameters' is what the block accepts
|
|
74
|
+
argument_types = destructure_yield_types(yield_types, parameters)
|
|
75
|
+
param_types = argument_types.each_with_index.map do |arg_type, idx|
|
|
76
|
+
param = parameters[idx]
|
|
77
|
+
param_type = chain.base.infer(api_map, param, locals)
|
|
78
|
+
unless arg_type.nil?
|
|
79
|
+
if arg_type.generic? && param_type.defined?
|
|
80
|
+
# @sg-ignore Need to add nil check here
|
|
81
|
+
namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
|
|
82
|
+
arg_type.resolve_generics(namespace_pin, param_type)
|
|
83
|
+
else
|
|
84
|
+
arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
return param_types if param_types.all?(&:defined?)
|
|
89
|
+
end
|
|
90
|
+
parameters.map { ComplexType::UNDEFINED }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
private
|
|
94
|
+
|
|
95
|
+
# @param api_map [ApiMap]
|
|
96
|
+
# @return [ComplexType]
|
|
97
|
+
def maybe_rebind api_map
|
|
98
|
+
return ComplexType::UNDEFINED unless receiver
|
|
99
|
+
|
|
100
|
+
# @sg-ignore Need to add nil check here
|
|
101
|
+
chain = Parser.chain(receiver, location.filename, node)
|
|
102
|
+
# @sg-ignore Need to add nil check here
|
|
103
|
+
locals = api_map.source_map(location.filename).locals_at(location)
|
|
104
|
+
# @sg-ignore Need to add nil check here
|
|
105
|
+
receiver_pin = chain.define(api_map, closure, locals).first
|
|
106
|
+
return ComplexType::UNDEFINED unless receiver_pin
|
|
107
|
+
|
|
108
|
+
types = receiver_pin.docstring.tag(:yieldreceiver)&.types
|
|
109
|
+
return ComplexType::UNDEFINED unless types&.any?
|
|
110
|
+
|
|
111
|
+
name_pin = self
|
|
112
|
+
# if we have Foo.bar { |x| ... }, and the bar method references self...
|
|
113
|
+
target = if chain.base.defined?
|
|
114
|
+
# figure out Foo
|
|
115
|
+
chain.base.infer(api_map, name_pin, locals)
|
|
116
|
+
else
|
|
117
|
+
# if not, any self there must be the context of our closure
|
|
118
|
+
# @sg-ignore Need to add nil check here
|
|
119
|
+
closure.full_context
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
# Mix-in for pins which enclose code which the 'break' statement
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
# Mix-in for pins which enclose code which the 'break' statement
|
|
4
|
+
# works with-in - e.g., blocks, when, until, ...
|
|
5
|
+
module Breakable
|
|
6
|
+
# @return [Parser::AST::Node]
|
|
7
|
+
attr_reader :node
|
|
8
|
+
|
|
9
|
+
# @return [Location, nil]
|
|
10
|
+
attr_reader :location
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|