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,126 +1,126 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
class BaseVariable < Base
|
|
6
|
-
# include Solargraph::Source::NodeMethods
|
|
7
|
-
include Solargraph::Parser::NodeMethods
|
|
8
|
-
|
|
9
|
-
# @return [Parser::AST::Node, nil]
|
|
10
|
-
attr_reader :assignment
|
|
11
|
-
|
|
12
|
-
attr_accessor :mass_assignment
|
|
13
|
-
|
|
14
|
-
# @param return_type [ComplexType, nil]
|
|
15
|
-
# @param mass_assignment [::Array(Parser::AST::Node, Integer), nil]
|
|
16
|
-
# @param assignment [Parser::AST::Node, nil]
|
|
17
|
-
def initialize assignment: nil, return_type: nil, mass_assignment: nil, **splat
|
|
18
|
-
super(**splat)
|
|
19
|
-
@assignment = assignment
|
|
20
|
-
# @type [nil, ::Array(Parser::AST::Node, Integer)]
|
|
21
|
-
@mass_assignment = nil
|
|
22
|
-
@return_type = return_type
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def combine_with(other, attrs={})
|
|
26
|
-
new_attrs = attrs.merge({
|
|
27
|
-
assignment: assert_same(other, :assignment),
|
|
28
|
-
mass_assignment: assert_same(other, :mass_assignment),
|
|
29
|
-
return_type: combine_return_type(other),
|
|
30
|
-
})
|
|
31
|
-
super(other, new_attrs)
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def completion_item_kind
|
|
35
|
-
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
# @return [Integer]
|
|
39
|
-
def symbol_kind
|
|
40
|
-
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def return_type
|
|
44
|
-
@return_type ||= generate_complex_type
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def nil_assignment?
|
|
48
|
-
# this will always be false - should it be return_type ==
|
|
49
|
-
# ComplexType::NIL or somesuch?
|
|
50
|
-
return_type.nil?
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def variable?
|
|
54
|
-
true
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
# @param parent_node [Parser::AST::Node]
|
|
58
|
-
# @param api_map [ApiMap]
|
|
59
|
-
# @return [::Array<ComplexType>]
|
|
60
|
-
def return_types_from_node(parent_node, api_map)
|
|
61
|
-
types = []
|
|
62
|
-
value_position_nodes_only(parent_node).each do |node|
|
|
63
|
-
# Nil nodes may not have a location
|
|
64
|
-
if node.nil? || node.type == :NIL || node.type == :nil
|
|
65
|
-
types.push ComplexType::NIL
|
|
66
|
-
else
|
|
67
|
-
rng = Range.from_node(node)
|
|
68
|
-
next if rng.nil?
|
|
69
|
-
pos = rng.ending
|
|
70
|
-
clip = api_map.clip_at(location.filename, pos)
|
|
71
|
-
# Use the return node for inference. The clip might infer from the
|
|
72
|
-
# first node in a method call instead of the entire call.
|
|
73
|
-
chain = Parser.chain(node, nil, nil)
|
|
74
|
-
result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
|
|
75
|
-
types.push result unless result.undefined?
|
|
76
|
-
end
|
|
77
|
-
end
|
|
78
|
-
types
|
|
79
|
-
end
|
|
80
|
-
|
|
81
|
-
# @param api_map [ApiMap]
|
|
82
|
-
# @return [ComplexType]
|
|
83
|
-
def probe api_map
|
|
84
|
-
unless @assignment.nil?
|
|
85
|
-
types = return_types_from_node(@assignment, api_map)
|
|
86
|
-
return ComplexType.new(types.uniq) unless types.empty?
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
unless @mass_assignment.nil?
|
|
90
|
-
mass_node, index = @mass_assignment
|
|
91
|
-
types = return_types_from_node(mass_node, api_map)
|
|
92
|
-
types.map! do |type|
|
|
93
|
-
if type.tuple?
|
|
94
|
-
type.all_params[index]
|
|
95
|
-
elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
|
|
96
|
-
type.all_params.first
|
|
97
|
-
end
|
|
98
|
-
end.compact!
|
|
99
|
-
return ComplexType.new(types.uniq) unless types.empty?
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
ComplexType::UNDEFINED
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
# @param other [Object]
|
|
106
|
-
def == other
|
|
107
|
-
return false unless super
|
|
108
|
-
# @sg-ignore Should add type check on other
|
|
109
|
-
assignment == other.assignment
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def type_desc
|
|
113
|
-
"#{super} = #{assignment&.type.inspect}"
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
private
|
|
117
|
-
|
|
118
|
-
# @return [ComplexType]
|
|
119
|
-
def generate_complex_type
|
|
120
|
-
tag = docstring.tag(:type)
|
|
121
|
-
return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
|
|
122
|
-
ComplexType.new
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class BaseVariable < Base
|
|
6
|
+
# include Solargraph::Source::NodeMethods
|
|
7
|
+
include Solargraph::Parser::NodeMethods
|
|
8
|
+
|
|
9
|
+
# @return [Parser::AST::Node, nil]
|
|
10
|
+
attr_reader :assignment
|
|
11
|
+
|
|
12
|
+
attr_accessor :mass_assignment
|
|
13
|
+
|
|
14
|
+
# @param return_type [ComplexType, nil]
|
|
15
|
+
# @param mass_assignment [::Array(Parser::AST::Node, Integer), nil]
|
|
16
|
+
# @param assignment [Parser::AST::Node, nil]
|
|
17
|
+
def initialize assignment: nil, return_type: nil, mass_assignment: nil, **splat
|
|
18
|
+
super(**splat)
|
|
19
|
+
@assignment = assignment
|
|
20
|
+
# @type [nil, ::Array(Parser::AST::Node, Integer)]
|
|
21
|
+
@mass_assignment = nil
|
|
22
|
+
@return_type = return_type
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def combine_with(other, attrs={})
|
|
26
|
+
new_attrs = attrs.merge({
|
|
27
|
+
assignment: assert_same(other, :assignment),
|
|
28
|
+
mass_assignment: assert_same(other, :mass_assignment),
|
|
29
|
+
return_type: combine_return_type(other),
|
|
30
|
+
})
|
|
31
|
+
super(other, new_attrs)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def completion_item_kind
|
|
35
|
+
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [Integer]
|
|
39
|
+
def symbol_kind
|
|
40
|
+
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def return_type
|
|
44
|
+
@return_type ||= generate_complex_type
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def nil_assignment?
|
|
48
|
+
# this will always be false - should it be return_type ==
|
|
49
|
+
# ComplexType::NIL or somesuch?
|
|
50
|
+
return_type.nil?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def variable?
|
|
54
|
+
true
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# @param parent_node [Parser::AST::Node]
|
|
58
|
+
# @param api_map [ApiMap]
|
|
59
|
+
# @return [::Array<ComplexType>]
|
|
60
|
+
def return_types_from_node(parent_node, api_map)
|
|
61
|
+
types = []
|
|
62
|
+
value_position_nodes_only(parent_node).each do |node|
|
|
63
|
+
# Nil nodes may not have a location
|
|
64
|
+
if node.nil? || node.type == :NIL || node.type == :nil
|
|
65
|
+
types.push ComplexType::NIL
|
|
66
|
+
else
|
|
67
|
+
rng = Range.from_node(node)
|
|
68
|
+
next if rng.nil?
|
|
69
|
+
pos = rng.ending
|
|
70
|
+
clip = api_map.clip_at(location.filename, pos)
|
|
71
|
+
# Use the return node for inference. The clip might infer from the
|
|
72
|
+
# first node in a method call instead of the entire call.
|
|
73
|
+
chain = Parser.chain(node, nil, nil)
|
|
74
|
+
result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
|
|
75
|
+
types.push result unless result.undefined?
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
types
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# @param api_map [ApiMap]
|
|
82
|
+
# @return [ComplexType]
|
|
83
|
+
def probe api_map
|
|
84
|
+
unless @assignment.nil?
|
|
85
|
+
types = return_types_from_node(@assignment, api_map)
|
|
86
|
+
return ComplexType.new(types.uniq) unless types.empty?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
unless @mass_assignment.nil?
|
|
90
|
+
mass_node, index = @mass_assignment
|
|
91
|
+
types = return_types_from_node(mass_node, api_map)
|
|
92
|
+
types.map! do |type|
|
|
93
|
+
if type.tuple?
|
|
94
|
+
type.all_params[index]
|
|
95
|
+
elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
|
|
96
|
+
type.all_params.first
|
|
97
|
+
end
|
|
98
|
+
end.compact!
|
|
99
|
+
return ComplexType.new(types.uniq) unless types.empty?
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
ComplexType::UNDEFINED
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# @param other [Object]
|
|
106
|
+
def == other
|
|
107
|
+
return false unless super
|
|
108
|
+
# @sg-ignore Should add type check on other
|
|
109
|
+
assignment == other.assignment
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def type_desc
|
|
113
|
+
"#{super} = #{assignment&.type.inspect}"
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
private
|
|
117
|
+
|
|
118
|
+
# @return [ComplexType]
|
|
119
|
+
def generate_complex_type
|
|
120
|
+
tag = docstring.tag(:type)
|
|
121
|
+
return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
|
|
122
|
+
ComplexType.new
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
data/lib/solargraph/pin/block.rb
CHANGED
|
@@ -1,104 +1,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
|
-
end
|
|
25
|
-
|
|
26
|
-
# @param api_map [ApiMap]
|
|
27
|
-
# @return [void]
|
|
28
|
-
def rebind api_map
|
|
29
|
-
@rebind ||= maybe_rebind(api_map)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def binder
|
|
33
|
-
@rebind&.defined? ? @rebind : closure.binder
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# @param yield_types [::Array<ComplexType>]
|
|
37
|
-
# @param parameters [::Array<Parameter>]
|
|
38
|
-
#
|
|
39
|
-
# @return [::Array<ComplexType>]
|
|
40
|
-
def destructure_yield_types(yield_types, parameters)
|
|
41
|
-
# yielding a tuple into a block will destructure the tuple
|
|
42
|
-
if yield_types.length == 1
|
|
43
|
-
yield_type = yield_types.first
|
|
44
|
-
return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
|
|
45
|
-
end
|
|
46
|
-
parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# @param api_map [ApiMap]
|
|
50
|
-
# @return [::Array<ComplexType>]
|
|
51
|
-
def typify_parameters(api_map)
|
|
52
|
-
chain = Parser.chain(receiver, filename, node)
|
|
53
|
-
clip = api_map.clip_at(location.filename, location.range.start)
|
|
54
|
-
locals = clip.locals - [self]
|
|
55
|
-
meths = chain.define(api_map, closure, locals)
|
|
56
|
-
# @todo Convert logic to use signatures
|
|
57
|
-
# @param meth [Pin::Method]
|
|
58
|
-
meths.each do |meth|
|
|
59
|
-
next if meth.block.nil?
|
|
60
|
-
|
|
61
|
-
yield_types = meth.block.parameters.map(&:return_type)
|
|
62
|
-
# 'arguments' is what the method says it will yield to the
|
|
63
|
-
# block; 'parameters' is what the block accepts
|
|
64
|
-
argument_types = destructure_yield_types(yield_types, parameters)
|
|
65
|
-
param_types = argument_types.each_with_index.map do |arg_type, idx|
|
|
66
|
-
param = parameters[idx]
|
|
67
|
-
param_type = chain.base.infer(api_map, param, locals)
|
|
68
|
-
unless arg_type.nil?
|
|
69
|
-
if arg_type.generic? && param_type.defined?
|
|
70
|
-
namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
|
|
71
|
-
arg_type.resolve_generics(namespace_pin, param_type)
|
|
72
|
-
else
|
|
73
|
-
arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
return param_types if param_types.all?(&:defined?)
|
|
78
|
-
end
|
|
79
|
-
parameters.map { ComplexType::UNDEFINED }
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
private
|
|
83
|
-
|
|
84
|
-
# @param api_map [ApiMap]
|
|
85
|
-
# @return [ComplexType]
|
|
86
|
-
def maybe_rebind api_map
|
|
87
|
-
return ComplexType::UNDEFINED unless receiver
|
|
88
|
-
|
|
89
|
-
chain = Parser.chain(receiver, location.filename)
|
|
90
|
-
locals = api_map.source_map(location.filename).locals_at(location)
|
|
91
|
-
receiver_pin = chain.define(api_map, closure, locals).first
|
|
92
|
-
return ComplexType::UNDEFINED unless receiver_pin
|
|
93
|
-
|
|
94
|
-
types = receiver_pin.docstring.tag(:yieldreceiver)&.types
|
|
95
|
-
return ComplexType::UNDEFINED unless types&.any?
|
|
96
|
-
|
|
97
|
-
target = chain.base.infer(api_map, receiver_pin, locals)
|
|
98
|
-
target = full_context unless target.defined?
|
|
99
|
-
|
|
100
|
-
ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
|
|
101
|
-
end
|
|
102
|
-
end
|
|
103
|
-
end
|
|
104
|
-
end
|
|
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
|
+
end
|
|
25
|
+
|
|
26
|
+
# @param api_map [ApiMap]
|
|
27
|
+
# @return [void]
|
|
28
|
+
def rebind api_map
|
|
29
|
+
@rebind ||= maybe_rebind(api_map)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def binder
|
|
33
|
+
@rebind&.defined? ? @rebind : closure.binder
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param yield_types [::Array<ComplexType>]
|
|
37
|
+
# @param parameters [::Array<Parameter>]
|
|
38
|
+
#
|
|
39
|
+
# @return [::Array<ComplexType>]
|
|
40
|
+
def destructure_yield_types(yield_types, parameters)
|
|
41
|
+
# yielding a tuple into a block will destructure the tuple
|
|
42
|
+
if yield_types.length == 1
|
|
43
|
+
yield_type = yield_types.first
|
|
44
|
+
return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
|
|
45
|
+
end
|
|
46
|
+
parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @param api_map [ApiMap]
|
|
50
|
+
# @return [::Array<ComplexType>]
|
|
51
|
+
def typify_parameters(api_map)
|
|
52
|
+
chain = Parser.chain(receiver, filename, node)
|
|
53
|
+
clip = api_map.clip_at(location.filename, location.range.start)
|
|
54
|
+
locals = clip.locals - [self]
|
|
55
|
+
meths = chain.define(api_map, closure, locals)
|
|
56
|
+
# @todo Convert logic to use signatures
|
|
57
|
+
# @param meth [Pin::Method]
|
|
58
|
+
meths.each do |meth|
|
|
59
|
+
next if meth.block.nil?
|
|
60
|
+
|
|
61
|
+
yield_types = meth.block.parameters.map(&:return_type)
|
|
62
|
+
# 'arguments' is what the method says it will yield to the
|
|
63
|
+
# block; 'parameters' is what the block accepts
|
|
64
|
+
argument_types = destructure_yield_types(yield_types, parameters)
|
|
65
|
+
param_types = argument_types.each_with_index.map do |arg_type, idx|
|
|
66
|
+
param = parameters[idx]
|
|
67
|
+
param_type = chain.base.infer(api_map, param, locals)
|
|
68
|
+
unless arg_type.nil?
|
|
69
|
+
if arg_type.generic? && param_type.defined?
|
|
70
|
+
namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
|
|
71
|
+
arg_type.resolve_generics(namespace_pin, param_type)
|
|
72
|
+
else
|
|
73
|
+
arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
return param_types if param_types.all?(&:defined?)
|
|
78
|
+
end
|
|
79
|
+
parameters.map { ComplexType::UNDEFINED }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
private
|
|
83
|
+
|
|
84
|
+
# @param api_map [ApiMap]
|
|
85
|
+
# @return [ComplexType]
|
|
86
|
+
def maybe_rebind api_map
|
|
87
|
+
return ComplexType::UNDEFINED unless receiver
|
|
88
|
+
|
|
89
|
+
chain = Parser.chain(receiver, location.filename)
|
|
90
|
+
locals = api_map.source_map(location.filename).locals_at(location)
|
|
91
|
+
receiver_pin = chain.define(api_map, closure, locals).first
|
|
92
|
+
return ComplexType::UNDEFINED unless receiver_pin
|
|
93
|
+
|
|
94
|
+
types = receiver_pin.docstring.tag(:yieldreceiver)&.types
|
|
95
|
+
return ComplexType::UNDEFINED unless types&.any?
|
|
96
|
+
|
|
97
|
+
target = chain.base.infer(api_map, receiver_pin, locals)
|
|
98
|
+
target = full_context unless target.defined?
|
|
99
|
+
|
|
100
|
+
ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
module Solargraph
|
|
2
|
-
module Pin
|
|
3
|
-
# Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
|
|
4
|
-
module Breakable
|
|
5
|
-
# @return [Parser::AST::Node]
|
|
6
|
-
attr_reader :node
|
|
7
|
-
end
|
|
8
|
-
end
|
|
9
|
-
end
|
|
1
|
+
module Solargraph
|
|
2
|
+
module Pin
|
|
3
|
+
# Mix-in for pins which enclose code which the 'break' statement works with-in - e.g., blocks, when, until, ...
|
|
4
|
+
module Breakable
|
|
5
|
+
# @return [Parser::AST::Node]
|
|
6
|
+
attr_reader :node
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
end
|