solargraph 0.54.0 → 0.58.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/linting.yml +127 -0
- data/.github/workflows/plugins.yml +184 -6
- data/.github/workflows/rspec.yml +55 -5
- data/.github/workflows/typecheck.yml +8 -3
- data/.gitignore +7 -0
- data/.overcommit.yml +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +1279 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +171 -0
- data/README.md +20 -6
- data/Rakefile +125 -13
- data/bin/solargraph +8 -5
- data/lib/solargraph/api_map/cache.rb +13 -3
- data/lib/solargraph/api_map/constants.rb +279 -0
- data/lib/solargraph/api_map/index.rb +193 -0
- data/lib/solargraph/api_map/source_to_yard.rb +13 -4
- data/lib/solargraph/api_map/store.rb +207 -132
- data/lib/solargraph/api_map.rb +394 -261
- data/lib/solargraph/bench.rb +18 -1
- data/lib/solargraph/complex_type/type_methods.rb +29 -12
- data/lib/solargraph/complex_type/unique_type.rb +205 -26
- data/lib/solargraph/complex_type.rb +126 -26
- data/lib/solargraph/convention/active_support_concern.rb +111 -0
- data/lib/solargraph/convention/base.rb +20 -3
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
- data/lib/solargraph/convention/data_definition.rb +105 -0
- data/lib/solargraph/convention/gemspec.rb +3 -2
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
- data/lib/solargraph/convention/struct_definition.rb +164 -0
- data/lib/solargraph/convention.rb +36 -4
- data/lib/solargraph/diagnostics/rubocop.rb +6 -1
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/doc_map.rb +316 -64
- data/lib/solargraph/environ.rb +9 -2
- data/lib/solargraph/equality.rb +34 -0
- data/lib/solargraph/gem_pins.rb +64 -38
- data/lib/solargraph/language_server/host/dispatch.rb +2 -0
- data/lib/solargraph/language_server/host/message_worker.rb +54 -5
- data/lib/solargraph/language_server/host.rb +36 -18
- data/lib/solargraph/language_server/message/base.rb +20 -12
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
- data/lib/solargraph/language_server/message/extended/document.rb +5 -2
- data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
- data/lib/solargraph/language_server/message/initialize.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
- data/lib/solargraph/language_server/message/text_document/definition.rb +5 -3
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
- data/lib/solargraph/language_server/progress.rb +27 -2
- data/lib/solargraph/language_server/request.rb +4 -1
- data/lib/solargraph/library.rb +83 -73
- data/lib/solargraph/location.rb +45 -1
- data/lib/solargraph/logging.rb +12 -2
- data/lib/solargraph/page.rb +3 -0
- data/lib/solargraph/parser/comment_ripper.rb +20 -7
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
- data/lib/solargraph/parser/node_processor/base.rb +10 -5
- data/lib/solargraph/parser/node_processor.rb +26 -8
- data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +14 -2
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
- data/lib/solargraph/parser/region.rb +4 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +3 -5
- data/lib/solargraph/pin/base.rb +417 -42
- data/lib/solargraph/pin/base_variable.rb +21 -12
- data/lib/solargraph/pin/block.rb +9 -26
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +231 -0
- data/lib/solargraph/pin/closure.rb +30 -10
- data/lib/solargraph/pin/common.rb +12 -7
- data/lib/solargraph/pin/constant.rb +2 -0
- data/lib/solargraph/pin/conversions.rb +3 -2
- data/lib/solargraph/pin/delegated_method.rb +20 -1
- data/lib/solargraph/pin/documenting.rb +16 -0
- data/lib/solargraph/pin/instance_variable.rb +2 -2
- data/lib/solargraph/pin/keyword.rb +7 -2
- data/lib/solargraph/pin/local_variable.rb +15 -7
- data/lib/solargraph/pin/method.rb +241 -70
- data/lib/solargraph/pin/method_alias.rb +3 -0
- data/lib/solargraph/pin/namespace.rb +21 -13
- data/lib/solargraph/pin/parameter.rb +94 -32
- data/lib/solargraph/pin/proxy_type.rb +17 -7
- data/lib/solargraph/pin/reference/override.rb +24 -6
- data/lib/solargraph/pin/reference/require.rb +2 -2
- data/lib/solargraph/pin/reference/superclass.rb +5 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +6 -1
- data/lib/solargraph/pin/signature.rb +39 -121
- data/lib/solargraph/pin/singleton.rb +1 -1
- data/lib/solargraph/pin/symbol.rb +8 -2
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +8 -2
- data/lib/solargraph/pin_cache.rb +245 -0
- data/lib/solargraph/position.rb +19 -0
- data/lib/solargraph/range.rb +23 -4
- data/lib/solargraph/rbs_map/conversions.rb +315 -99
- data/lib/solargraph/rbs_map/core_fills.rb +50 -16
- data/lib/solargraph/rbs_map/core_map.rb +41 -11
- data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
- data/lib/solargraph/rbs_map.rb +87 -16
- data/lib/solargraph/shell.rb +117 -17
- data/lib/solargraph/source/chain/array.rb +13 -8
- data/lib/solargraph/source/chain/block_symbol.rb +1 -1
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +135 -66
- data/lib/solargraph/source/chain/constant.rb +3 -66
- data/lib/solargraph/source/chain/hash.rb +9 -3
- data/lib/solargraph/source/chain/head.rb +1 -1
- data/lib/solargraph/source/chain/if.rb +7 -2
- data/lib/solargraph/source/chain/link.rb +38 -6
- data/lib/solargraph/source/chain/literal.rb +27 -2
- data/lib/solargraph/source/chain/or.rb +2 -2
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +140 -63
- data/lib/solargraph/source/change.rb +2 -2
- data/lib/solargraph/source/cursor.rb +4 -4
- data/lib/solargraph/source/source_chainer.rb +3 -3
- data/lib/solargraph/source.rb +110 -89
- data/lib/solargraph/source_map/clip.rb +22 -28
- data/lib/solargraph/source_map/data.rb +34 -0
- data/lib/solargraph/source_map/mapper.rb +11 -7
- data/lib/solargraph/source_map.rb +50 -43
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker/param_def.rb +2 -0
- data/lib/solargraph/type_checker/rules.rb +35 -8
- data/lib/solargraph/type_checker.rb +331 -189
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/_method.erb +10 -10
- data/lib/solargraph/views/_namespace.erb +3 -3
- data/lib/solargraph/views/document.erb +10 -10
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +25 -5
- data/lib/solargraph/workspace/require_paths.rb +97 -0
- data/lib/solargraph/workspace.rb +53 -72
- data/lib/solargraph/yard_map/helpers.rb +29 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
- data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
- data/lib/solargraph/yard_map/mapper.rb +5 -3
- data/lib/solargraph/yard_map/to_method.rb +6 -3
- data/lib/solargraph/yardoc.rb +45 -10
- data/lib/solargraph.rb +35 -1
- data/rbs/fills/bundler/0/bundler.rbs +4271 -0
- data/rbs/fills/open3/0/open3.rbs +172 -0
- data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
- data/rbs/fills/rubygems/0/errors.rbs +364 -0
- data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
- data/rbs/fills/rubygems/0/specification.rbs +1753 -0
- data/rbs/fills/tuple/tuple.rbs +149 -0
- data/rbs_collection.yaml +19 -0
- data/sig/shims/ast/0/node.rbs +5 -0
- data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
- data/sig/shims/ast/2.4/ast.rbs +73 -0
- data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
- data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
- data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
- data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
- data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
- data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
- data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
- data/solargraph.gemspec +32 -10
- metadata +237 -37
- data/lib/.rubocop.yml +0 -22
- data/lib/solargraph/cache.rb +0 -77
- data/lib/solargraph/parser/node_methods.rb +0 -83
|
@@ -3,20 +3,39 @@
|
|
|
3
3
|
module Solargraph
|
|
4
4
|
module Pin
|
|
5
5
|
class Parameter < LocalVariable
|
|
6
|
-
# @return [Symbol]
|
|
6
|
+
# @return [::Symbol]
|
|
7
7
|
attr_reader :decl
|
|
8
8
|
|
|
9
9
|
# @return [String]
|
|
10
10
|
attr_reader :asgn_code
|
|
11
11
|
|
|
12
|
+
# allow this to be set to the method after the method itself has
|
|
13
|
+
# been created
|
|
14
|
+
attr_writer :closure
|
|
15
|
+
|
|
12
16
|
# @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
|
|
13
17
|
# @param asgn_code [String, nil]
|
|
14
|
-
|
|
15
|
-
def initialize decl: :arg, asgn_code: nil, return_type: nil, **splat
|
|
18
|
+
def initialize decl: :arg, asgn_code: nil, **splat
|
|
16
19
|
super(**splat)
|
|
17
20
|
@asgn_code = asgn_code
|
|
18
21
|
@decl = decl
|
|
19
|
-
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def type_location
|
|
25
|
+
super || closure&.type_location
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def location
|
|
29
|
+
super || closure&.type_location
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def combine_with(other, attrs={})
|
|
33
|
+
new_attrs = {
|
|
34
|
+
decl: assert_same(other, :decl),
|
|
35
|
+
presence: choose(other, :presence),
|
|
36
|
+
asgn_code: choose(other, :asgn_code),
|
|
37
|
+
}.merge(attrs)
|
|
38
|
+
super(other, new_attrs)
|
|
20
39
|
end
|
|
21
40
|
|
|
22
41
|
def keyword?
|
|
@@ -27,6 +46,36 @@ module Solargraph
|
|
|
27
46
|
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
|
28
47
|
end
|
|
29
48
|
|
|
49
|
+
def needs_consistent_name?
|
|
50
|
+
keyword?
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [String]
|
|
54
|
+
def arity_decl
|
|
55
|
+
name = (self.name || '(anon)')
|
|
56
|
+
type = (return_type&.to_rbs || 'untyped')
|
|
57
|
+
case decl
|
|
58
|
+
when :arg
|
|
59
|
+
""
|
|
60
|
+
when :optarg
|
|
61
|
+
"?"
|
|
62
|
+
when :kwarg
|
|
63
|
+
"#{name}:"
|
|
64
|
+
when :kwoptarg
|
|
65
|
+
"?#{name}:"
|
|
66
|
+
when :restarg
|
|
67
|
+
"*"
|
|
68
|
+
when :kwrestarg
|
|
69
|
+
"**"
|
|
70
|
+
else
|
|
71
|
+
"(unknown decl: #{decl})"
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def arg?
|
|
76
|
+
decl == :arg
|
|
77
|
+
end
|
|
78
|
+
|
|
30
79
|
def restarg?
|
|
31
80
|
decl == :restarg
|
|
32
81
|
end
|
|
@@ -56,15 +105,13 @@ module Solargraph
|
|
|
56
105
|
end
|
|
57
106
|
end
|
|
58
107
|
|
|
59
|
-
# @return [String]
|
|
60
|
-
|
|
108
|
+
# @return [String] the full name of the parameter, including any
|
|
109
|
+
# declarative symbols such as `*` or `:` indicating type of
|
|
110
|
+
# parameter. This is used in method signatures.
|
|
111
|
+
def full_name
|
|
61
112
|
case decl
|
|
62
|
-
when :
|
|
63
|
-
"#{name} = #{asgn_code || '?'}"
|
|
64
|
-
when :kwarg
|
|
113
|
+
when :kwarg, :kwoptarg
|
|
65
114
|
"#{name}:"
|
|
66
|
-
when :kwoptarg
|
|
67
|
-
"#{name}: #{asgn_code || '?'}"
|
|
68
115
|
when :restarg
|
|
69
116
|
"*#{name}"
|
|
70
117
|
when :kwrestarg
|
|
@@ -76,6 +123,18 @@ module Solargraph
|
|
|
76
123
|
end
|
|
77
124
|
end
|
|
78
125
|
|
|
126
|
+
# @return [String]
|
|
127
|
+
def full
|
|
128
|
+
full_name + case decl
|
|
129
|
+
when :optarg
|
|
130
|
+
" = #{asgn_code || '?'}"
|
|
131
|
+
when :kwoptarg
|
|
132
|
+
" #{asgn_code || '?'}"
|
|
133
|
+
else
|
|
134
|
+
''
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
79
138
|
# @return [ComplexType]
|
|
80
139
|
def return_type
|
|
81
140
|
if @return_type.nil?
|
|
@@ -84,11 +143,11 @@ module Solargraph
|
|
|
84
143
|
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
85
144
|
if @return_type.undefined?
|
|
86
145
|
if decl == :restarg
|
|
87
|
-
@return_type = ComplexType.try_parse('Array')
|
|
146
|
+
@return_type = ComplexType.try_parse('::Array')
|
|
88
147
|
elsif decl == :kwrestarg
|
|
89
|
-
@return_type = ComplexType.try_parse('Hash')
|
|
148
|
+
@return_type = ComplexType.try_parse('::Hash')
|
|
90
149
|
elsif decl == :blockarg
|
|
91
|
-
@return_type = ComplexType.try_parse('Proc')
|
|
150
|
+
@return_type = ComplexType.try_parse('::Proc')
|
|
92
151
|
end
|
|
93
152
|
end
|
|
94
153
|
end
|
|
@@ -107,43 +166,42 @@ module Solargraph
|
|
|
107
166
|
|
|
108
167
|
# @param api_map [ApiMap]
|
|
109
168
|
def typify api_map
|
|
110
|
-
return return_type.qualify(api_map, closure.
|
|
169
|
+
return return_type.qualify(api_map, *closure.gates) unless return_type.undefined?
|
|
111
170
|
closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
|
|
112
171
|
end
|
|
113
172
|
|
|
173
|
+
# @param atype [ComplexType]
|
|
174
|
+
# @param api_map [ApiMap]
|
|
175
|
+
def compatible_arg?(atype, api_map)
|
|
176
|
+
# make sure we get types from up the method
|
|
177
|
+
# inheritance chain if we don't have them on this pin
|
|
178
|
+
ptype = typify api_map
|
|
179
|
+
ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
|
|
180
|
+
end
|
|
181
|
+
|
|
114
182
|
def documentation
|
|
115
183
|
tag = param_tag
|
|
116
184
|
return '' if tag.nil? || tag.text.nil?
|
|
117
185
|
tag.text
|
|
118
186
|
end
|
|
119
187
|
|
|
120
|
-
def try_merge! pin
|
|
121
|
-
return false unless super && closure == pin.closure
|
|
122
|
-
true
|
|
123
|
-
end
|
|
124
|
-
|
|
125
188
|
private
|
|
126
189
|
|
|
127
190
|
# @return [YARD::Tags::Tag, nil]
|
|
128
191
|
def param_tag
|
|
129
|
-
found = nil
|
|
130
192
|
params = closure.docstring.tags(:param)
|
|
131
193
|
params.each do |p|
|
|
132
|
-
|
|
133
|
-
found = p
|
|
134
|
-
break
|
|
135
|
-
end
|
|
136
|
-
if found.nil? and !index.nil?
|
|
137
|
-
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
194
|
+
return p if p.name == name
|
|
138
195
|
end
|
|
139
|
-
|
|
196
|
+
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
140
197
|
end
|
|
141
198
|
|
|
142
199
|
# @param api_map [ApiMap]
|
|
143
200
|
# @return [ComplexType]
|
|
144
201
|
def typify_block_param api_map
|
|
145
|
-
|
|
146
|
-
|
|
202
|
+
block_pin = closure
|
|
203
|
+
if block_pin.is_a?(Pin::Block) && block_pin.receiver
|
|
204
|
+
return block_pin.typify_parameters(api_map)[index]
|
|
147
205
|
end
|
|
148
206
|
ComplexType::UNDEFINED
|
|
149
207
|
end
|
|
@@ -164,7 +222,7 @@ module Solargraph
|
|
|
164
222
|
if found.nil? and !index.nil?
|
|
165
223
|
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
166
224
|
end
|
|
167
|
-
return ComplexType.try_parse(*found.types).qualify(api_map, meth.
|
|
225
|
+
return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
|
|
168
226
|
end
|
|
169
227
|
ComplexType::UNDEFINED
|
|
170
228
|
end
|
|
@@ -174,8 +232,12 @@ module Solargraph
|
|
|
174
232
|
# @param skip [::Array]
|
|
175
233
|
# @return [::Array<YARD::Tags::Tag>]
|
|
176
234
|
def see_reference heredoc, api_map, skip = []
|
|
235
|
+
# This should actually be an intersection type
|
|
236
|
+
# @param ref [YARD::Tags::Tag, Solargraph::Yard::Tags::RefTag]
|
|
177
237
|
heredoc.ref_tags.each do |ref|
|
|
238
|
+
# @sg-ignore ref should actually be an intersection type
|
|
178
239
|
next unless ref.tag_name == 'param' && ref.owner
|
|
240
|
+
# @sg-ignore ref should actually be an intersection type
|
|
179
241
|
result = resolve_reference(ref.owner.to_s, api_map, skip)
|
|
180
242
|
return result unless result.nil?
|
|
181
243
|
end
|
|
@@ -189,7 +251,7 @@ module Solargraph
|
|
|
189
251
|
def resolve_reference ref, api_map, skip
|
|
190
252
|
return nil if skip.include?(ref)
|
|
191
253
|
skip.push ref
|
|
192
|
-
parts = ref.split(/[
|
|
254
|
+
parts = ref.split(/[.#]/)
|
|
193
255
|
if parts.first.empty?
|
|
194
256
|
path = "#{namespace}#{ref}"
|
|
195
257
|
else
|
|
@@ -4,24 +4,34 @@ module Solargraph
|
|
|
4
4
|
module Pin
|
|
5
5
|
class ProxyType < Base
|
|
6
6
|
# @param return_type [ComplexType]
|
|
7
|
-
|
|
7
|
+
# @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
|
|
8
|
+
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
9
|
+
# @param gates [Array<String>, nil]
|
|
10
|
+
def initialize return_type: ComplexType::UNDEFINED, binder: nil, gates: nil, **splat
|
|
8
11
|
super(**splat)
|
|
12
|
+
@gates = gates
|
|
9
13
|
@return_type = return_type
|
|
14
|
+
@binder = binder if binder
|
|
10
15
|
end
|
|
11
16
|
|
|
12
17
|
def context
|
|
13
18
|
@return_type
|
|
14
19
|
end
|
|
15
20
|
|
|
16
|
-
# @param
|
|
21
|
+
# @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
|
|
22
|
+
# @param closure [Pin::Namespace, nil] Used as the closure for this pin
|
|
23
|
+
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
17
24
|
# @return [ProxyType]
|
|
18
|
-
def self.anonymous
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
25
|
+
def self.anonymous context, closure: nil, binder: nil, **kwargs
|
|
26
|
+
unless closure
|
|
27
|
+
parts = context.namespace.split('::')
|
|
28
|
+
namespace = parts[0..-2].join('::').to_s
|
|
29
|
+
closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
|
|
30
|
+
end
|
|
31
|
+
# name = parts.last.to_s
|
|
22
32
|
# ProxyType.new(nil, namespace, name, return_type)
|
|
23
33
|
ProxyType.new(
|
|
24
|
-
closure:
|
|
34
|
+
closure: closure, return_type: context, binder: binder || context, **kwargs
|
|
25
35
|
)
|
|
26
36
|
end
|
|
27
37
|
end
|
|
@@ -10,18 +10,36 @@ module Solargraph
|
|
|
10
10
|
# @return [::Array<Symbol>]
|
|
11
11
|
attr_reader :delete
|
|
12
12
|
|
|
13
|
-
def
|
|
14
|
-
|
|
13
|
+
def closure
|
|
14
|
+
nil
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @param location [Location, nil]
|
|
18
|
+
# @param name [String]
|
|
19
|
+
# @param tags [::Array<YARD::Tags::Tag>]
|
|
20
|
+
# @param delete [::Array<Symbol>]
|
|
21
|
+
# @param splat [Hash]
|
|
22
|
+
def initialize location, name, tags, delete = [], **splat
|
|
23
|
+
super(location: location, name: name, **splat)
|
|
15
24
|
@tags = tags
|
|
16
25
|
@delete = delete
|
|
17
26
|
end
|
|
18
27
|
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
# @param name [String]
|
|
29
|
+
# @param tags [::Array<String>]
|
|
30
|
+
# @param delete [::Array<Symbol>]
|
|
31
|
+
# @param splat [Hash]
|
|
32
|
+
# @return [Solargraph::Pin::Reference::Override]
|
|
33
|
+
def self.method_return name, *tags, delete: [], **splat
|
|
34
|
+
new(nil, name, [YARD::Tags::Tag.new('return', '', tags)], delete, **splat)
|
|
21
35
|
end
|
|
22
36
|
|
|
23
|
-
|
|
24
|
-
|
|
37
|
+
# @param name [String]
|
|
38
|
+
# @param comment [String]
|
|
39
|
+
# @param splat [Hash]
|
|
40
|
+
# @return [Solargraph::Pin::Reference::Override]
|
|
41
|
+
def self.from_comment name, comment, **splat
|
|
42
|
+
new(nil, name, Solargraph::Source.parse_docstring(comment).to_docstring.tags, **splat)
|
|
25
43
|
end
|
|
26
44
|
end
|
|
27
45
|
end
|
|
@@ -4,9 +4,9 @@ module Solargraph
|
|
|
4
4
|
module Pin
|
|
5
5
|
class Reference
|
|
6
6
|
class Require < Reference
|
|
7
|
-
def initialize location, name
|
|
7
|
+
def initialize location, name, **splat
|
|
8
8
|
# super(location, '', name)
|
|
9
|
-
super(location: location, name: name)
|
|
9
|
+
super(location: location, name: name, closure: Pin::ROOT_PIN, **splat)
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
end
|
|
@@ -17,6 +17,23 @@ module Solargraph
|
|
|
17
17
|
super(**splat)
|
|
18
18
|
@generic_values = generic_values
|
|
19
19
|
end
|
|
20
|
+
|
|
21
|
+
# @return [ComplexType]
|
|
22
|
+
def type
|
|
23
|
+
@type ||= ComplexType.try_parse(
|
|
24
|
+
name +
|
|
25
|
+
if generic_values&.length&.> 0
|
|
26
|
+
"<#{generic_values.join(', ')}>"
|
|
27
|
+
else
|
|
28
|
+
''
|
|
29
|
+
end
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# @return [Array<String>]
|
|
34
|
+
def reference_gates
|
|
35
|
+
closure.gates
|
|
36
|
+
end
|
|
20
37
|
end
|
|
21
38
|
end
|
|
22
39
|
end
|
|
@@ -12,6 +12,8 @@ module Solargraph
|
|
|
12
12
|
# @return [Pin::Base]
|
|
13
13
|
attr_reader :pin
|
|
14
14
|
|
|
15
|
+
# @param match [Float] The match score for the pin
|
|
16
|
+
# @param pin [Pin::Base]
|
|
15
17
|
def initialize match, pin
|
|
16
18
|
@match = match
|
|
17
19
|
@pin = pin
|
|
@@ -40,6 +42,9 @@ module Solargraph
|
|
|
40
42
|
Result.new(match, pin) if match > 0.7
|
|
41
43
|
end
|
|
42
44
|
.compact
|
|
45
|
+
# @param a [self]
|
|
46
|
+
# @param b [self]
|
|
47
|
+
# @sg-ignore https://github.com/castwide/solargraph/pull/1050
|
|
43
48
|
.sort { |a, b| b.match <=> a.match }
|
|
44
49
|
.map(&:pin)
|
|
45
50
|
end
|
|
@@ -48,7 +53,7 @@ module Solargraph
|
|
|
48
53
|
# @param str2 [String]
|
|
49
54
|
# @return [Float]
|
|
50
55
|
def fuzzy_string_match str1, str2
|
|
51
|
-
return
|
|
56
|
+
return 1.0 + (str2.length.to_f / str1.length.to_f) if str1.downcase.include?(str2.downcase)
|
|
52
57
|
JaroWinkler.similarity(str1, str2, ignore_case: true)
|
|
53
58
|
end
|
|
54
59
|
end
|
|
@@ -1,143 +1,61 @@
|
|
|
1
1
|
module Solargraph
|
|
2
2
|
module Pin
|
|
3
|
-
class Signature <
|
|
4
|
-
#
|
|
5
|
-
|
|
3
|
+
class Signature < Callable
|
|
4
|
+
# allow signature to be created before method pin, then set this
|
|
5
|
+
# to the method pin
|
|
6
|
+
attr_writer :closure
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
# @return [self]
|
|
11
|
-
attr_reader :block
|
|
12
|
-
|
|
13
|
-
# @param generics [Array<String>]
|
|
14
|
-
# @param parameters [Array<Parameter>]
|
|
15
|
-
# @param return_type [ComplexType]
|
|
16
|
-
# @param block [Signature, nil]
|
|
17
|
-
def initialize generics, parameters, return_type, block = nil
|
|
18
|
-
@generics = generics
|
|
19
|
-
@parameters = parameters
|
|
20
|
-
@return_type = return_type
|
|
21
|
-
@block = block
|
|
8
|
+
def initialize **splat
|
|
9
|
+
super(**splat)
|
|
22
10
|
end
|
|
23
11
|
|
|
24
12
|
def generics
|
|
25
13
|
@generics ||= [].freeze
|
|
26
14
|
end
|
|
27
15
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# @return [String]
|
|
34
|
-
def rbs_generics
|
|
35
|
-
if generics.empty?
|
|
36
|
-
return ''
|
|
37
|
-
else
|
|
38
|
-
return '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
39
|
-
end
|
|
16
|
+
def identity
|
|
17
|
+
@identity ||= "signature#{object_id}"
|
|
40
18
|
end
|
|
41
19
|
|
|
42
|
-
|
|
43
|
-
# @yieldparam [ComplexType]
|
|
44
|
-
# @yieldreturn [ComplexType]
|
|
45
|
-
# @return [self]
|
|
46
|
-
def transform_types(&transform)
|
|
47
|
-
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
48
|
-
signature = super(&transform)
|
|
49
|
-
signature.parameters = signature.parameters.map do |param|
|
|
50
|
-
param.transform_types(&transform)
|
|
51
|
-
end
|
|
52
|
-
signature.block = block.transform_types(&transform) if signature.block?
|
|
53
|
-
signature
|
|
54
|
-
end
|
|
20
|
+
attr_writer :closure
|
|
55
21
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
# @param return_type_context [ComplexType, nil]
|
|
59
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
60
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
61
|
-
# @param context [ComplexType, nil]
|
|
62
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
63
|
-
# @return [self]
|
|
64
|
-
def resolve_generics_from_context(generics_to_resolve,
|
|
65
|
-
arg_types = nil,
|
|
66
|
-
return_type_context = nil,
|
|
67
|
-
yield_arg_types = nil,
|
|
68
|
-
yield_return_type_context = nil,
|
|
69
|
-
resolved_generic_values: {})
|
|
70
|
-
signature = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
71
|
-
signature.parameters = signature.parameters.each_with_index.map do |param, i|
|
|
72
|
-
if arg_types.nil?
|
|
73
|
-
param.dup
|
|
74
|
-
else
|
|
75
|
-
param.resolve_generics_from_context(generics_to_resolve,
|
|
76
|
-
arg_types[i],
|
|
77
|
-
resolved_generic_values: resolved_generic_values)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
signature.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
81
|
-
yield_arg_types,
|
|
82
|
-
yield_return_type_context,
|
|
83
|
-
resolved_generic_values: resolved_generic_values) if signature.block?
|
|
84
|
-
signature
|
|
22
|
+
def dodgy_return_type_source?
|
|
23
|
+
super || closure&.dodgy_return_type_source?
|
|
85
24
|
end
|
|
86
25
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
# @param return_type_context [ComplexType, nil]
|
|
90
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
91
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
92
|
-
# @param context [ComplexType, nil]
|
|
93
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
94
|
-
# @return [self]
|
|
95
|
-
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
96
|
-
arg_types = nil,
|
|
97
|
-
return_type_context = nil,
|
|
98
|
-
yield_arg_types = nil,
|
|
99
|
-
yield_return_type_context = nil,
|
|
100
|
-
resolved_generic_values: {})
|
|
101
|
-
# See
|
|
102
|
-
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
103
|
-
# and
|
|
104
|
-
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
105
|
-
# for other implementations
|
|
106
|
-
|
|
107
|
-
return self if generics_to_resolve.empty?
|
|
108
|
-
|
|
109
|
-
last_resolved_generic_values = resolved_generic_values.dup
|
|
110
|
-
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
111
|
-
arg_types,
|
|
112
|
-
return_type_context,
|
|
113
|
-
yield_arg_types,
|
|
114
|
-
yield_return_type_context,
|
|
115
|
-
resolved_generic_values: resolved_generic_values)
|
|
116
|
-
if last_resolved_generic_values == resolved_generic_values
|
|
117
|
-
# erase anything unresolved
|
|
118
|
-
return new_pin.erase_generics(self.generics)
|
|
119
|
-
end
|
|
120
|
-
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
121
|
-
arg_types,
|
|
122
|
-
return_type_context,
|
|
123
|
-
yield_arg_types,
|
|
124
|
-
yield_return_type_context,
|
|
125
|
-
resolved_generic_values: resolved_generic_values)
|
|
26
|
+
def type_location
|
|
27
|
+
super || closure&.type_location
|
|
126
28
|
end
|
|
127
29
|
|
|
128
|
-
def
|
|
129
|
-
|
|
30
|
+
def location
|
|
31
|
+
super || closure&.location
|
|
130
32
|
end
|
|
131
33
|
|
|
132
|
-
def
|
|
133
|
-
|
|
34
|
+
def typify api_map
|
|
35
|
+
if return_type.defined?
|
|
36
|
+
qualified = return_type.qualify(api_map, closure.namespace)
|
|
37
|
+
logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
|
|
38
|
+
return qualified
|
|
39
|
+
end
|
|
40
|
+
return ComplexType::UNDEFINED if closure.nil?
|
|
41
|
+
return ComplexType::UNDEFINED unless closure.is_a?(Pin::Method)
|
|
42
|
+
# @sg-ignore need is_a? support
|
|
43
|
+
# @type [Array<Pin::Method>]
|
|
44
|
+
method_stack = closure.rest_of_stack api_map
|
|
45
|
+
logger.debug { "Signature#typify(self=#{self}) - method_stack: #{method_stack}" }
|
|
46
|
+
method_stack.each do |pin|
|
|
47
|
+
sig = pin.signatures.find { |s| s.arity == self.arity }
|
|
48
|
+
next unless sig
|
|
49
|
+
unless sig.return_type.undefined?
|
|
50
|
+
qualified = sig.return_type.qualify(api_map, closure.namespace)
|
|
51
|
+
logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
|
|
52
|
+
return qualified
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
out = super
|
|
56
|
+
logger.debug { "Signature#typify(self=#{self}) => #{out}" }
|
|
57
|
+
out
|
|
134
58
|
end
|
|
135
|
-
|
|
136
|
-
protected
|
|
137
|
-
|
|
138
|
-
attr_writer :block
|
|
139
|
-
|
|
140
|
-
attr_writer :parameters
|
|
141
59
|
end
|
|
142
60
|
end
|
|
143
61
|
end
|
|
@@ -5,8 +5,9 @@ module Solargraph
|
|
|
5
5
|
class Symbol < Base
|
|
6
6
|
# @param location [Solargraph::Location]
|
|
7
7
|
# @param name [String]
|
|
8
|
-
def initialize
|
|
9
|
-
|
|
8
|
+
def initialize(location, name, **kwargs)
|
|
9
|
+
# @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
|
|
10
|
+
super(location: location, name: name, **kwargs)
|
|
10
11
|
# @name = name
|
|
11
12
|
# @location = location
|
|
12
13
|
end
|
|
@@ -19,6 +20,10 @@ module Solargraph
|
|
|
19
20
|
''
|
|
20
21
|
end
|
|
21
22
|
|
|
23
|
+
def closure
|
|
24
|
+
@closure ||= Pin::ROOT_PIN
|
|
25
|
+
end
|
|
26
|
+
|
|
22
27
|
def completion_item_kind
|
|
23
28
|
Solargraph::LanguageServer::CompletionItemKinds::KEYWORD
|
|
24
29
|
end
|
|
@@ -35,6 +40,7 @@ module Solargraph
|
|
|
35
40
|
[]
|
|
36
41
|
end
|
|
37
42
|
|
|
43
|
+
# @return [::Symbol]
|
|
38
44
|
def visibility
|
|
39
45
|
:public
|
|
40
46
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Until < Base
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
8
|
+
# @param receiver [Parser::AST::Node, nil]
|
|
9
|
+
# @param node [Parser::AST::Node, nil]
|
|
10
|
+
# @param context [ComplexType, nil]
|
|
11
|
+
# @param args [::Array<Parameter>]
|
|
12
|
+
def initialize node: nil, **splat
|
|
13
|
+
super(**splat)
|
|
14
|
+
@node = node
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class While < Base
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
8
|
+
# @param receiver [Parser::AST::Node, nil]
|
|
9
|
+
# @param node [Parser::AST::Node, nil]
|
|
10
|
+
# @param context [ComplexType, nil]
|
|
11
|
+
# @param args [::Array<Parameter>]
|
|
12
|
+
def initialize node: nil, **splat
|
|
13
|
+
super(**splat)
|
|
14
|
+
@node = node
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/solargraph/pin.rb
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
require 'yard'
|
|
4
4
|
|
|
5
5
|
module Solargraph
|
|
6
|
-
# The namespace for
|
|
6
|
+
# The namespace for Pins used in SourceMaps.
|
|
7
|
+
#
|
|
8
|
+
# Pins represent declarations, from gems, Sources, and the Ruby core.
|
|
7
9
|
#
|
|
8
10
|
module Pin
|
|
9
11
|
autoload :Common, 'solargraph/pin/common'
|
|
@@ -32,7 +34,11 @@ module Solargraph
|
|
|
32
34
|
autoload :Singleton, 'solargraph/pin/singleton'
|
|
33
35
|
autoload :KeywordParam, 'solargraph/pin/keyword_param'
|
|
34
36
|
autoload :Search, 'solargraph/pin/search'
|
|
37
|
+
autoload :Breakable, 'solargraph/pin/breakable'
|
|
38
|
+
autoload :Until, 'solargraph/pin/until'
|
|
39
|
+
autoload :While, 'solargraph/pin/while'
|
|
40
|
+
autoload :Callable, 'solargraph/pin/callable'
|
|
35
41
|
|
|
36
|
-
ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
|
|
42
|
+
ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil, source: :pin_rb)
|
|
37
43
|
end
|
|
38
44
|
end
|