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.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +127 -0
  3. data/.github/workflows/plugins.yml +184 -6
  4. data/.github/workflows/rspec.yml +55 -5
  5. data/.github/workflows/typecheck.yml +8 -3
  6. data/.gitignore +7 -0
  7. data/.overcommit.yml +72 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +66 -0
  10. data/.rubocop_todo.yml +1279 -0
  11. data/.yardopts +1 -0
  12. data/CHANGELOG.md +171 -0
  13. data/README.md +20 -6
  14. data/Rakefile +125 -13
  15. data/bin/solargraph +8 -5
  16. data/lib/solargraph/api_map/cache.rb +13 -3
  17. data/lib/solargraph/api_map/constants.rb +279 -0
  18. data/lib/solargraph/api_map/index.rb +193 -0
  19. data/lib/solargraph/api_map/source_to_yard.rb +13 -4
  20. data/lib/solargraph/api_map/store.rb +207 -132
  21. data/lib/solargraph/api_map.rb +394 -261
  22. data/lib/solargraph/bench.rb +18 -1
  23. data/lib/solargraph/complex_type/type_methods.rb +29 -12
  24. data/lib/solargraph/complex_type/unique_type.rb +205 -26
  25. data/lib/solargraph/complex_type.rb +126 -26
  26. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  27. data/lib/solargraph/convention/base.rb +20 -3
  28. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  29. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  30. data/lib/solargraph/convention/data_definition.rb +105 -0
  31. data/lib/solargraph/convention/gemspec.rb +3 -2
  32. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  33. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  34. data/lib/solargraph/convention/struct_definition.rb +164 -0
  35. data/lib/solargraph/convention.rb +36 -4
  36. data/lib/solargraph/diagnostics/rubocop.rb +6 -1
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  38. data/lib/solargraph/doc_map.rb +316 -64
  39. data/lib/solargraph/environ.rb +9 -2
  40. data/lib/solargraph/equality.rb +34 -0
  41. data/lib/solargraph/gem_pins.rb +64 -38
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -0
  43. data/lib/solargraph/language_server/host/message_worker.rb +54 -5
  44. data/lib/solargraph/language_server/host.rb +36 -18
  45. data/lib/solargraph/language_server/message/base.rb +20 -12
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
  47. data/lib/solargraph/language_server/message/extended/document.rb +5 -2
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  49. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  50. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  51. data/lib/solargraph/language_server/message/text_document/definition.rb +5 -3
  52. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  53. data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
  54. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  55. data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
  56. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  57. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  58. data/lib/solargraph/language_server/progress.rb +27 -2
  59. data/lib/solargraph/language_server/request.rb +4 -1
  60. data/lib/solargraph/library.rb +83 -73
  61. data/lib/solargraph/location.rb +45 -1
  62. data/lib/solargraph/logging.rb +12 -2
  63. data/lib/solargraph/page.rb +3 -0
  64. data/lib/solargraph/parser/comment_ripper.rb +20 -7
  65. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  66. data/lib/solargraph/parser/node_processor/base.rb +10 -5
  67. data/lib/solargraph/parser/node_processor.rb +26 -8
  68. data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
  69. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  70. data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
  71. data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
  72. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  73. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  74. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
  75. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
  76. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  77. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
  79. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  80. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  81. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  82. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
  83. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +14 -2
  85. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  86. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  87. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
  89. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
  90. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
  91. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
  95. data/lib/solargraph/parser/region.rb +4 -1
  96. data/lib/solargraph/parser/snippet.rb +2 -0
  97. data/lib/solargraph/parser.rb +3 -5
  98. data/lib/solargraph/pin/base.rb +417 -42
  99. data/lib/solargraph/pin/base_variable.rb +21 -12
  100. data/lib/solargraph/pin/block.rb +9 -26
  101. data/lib/solargraph/pin/breakable.rb +9 -0
  102. data/lib/solargraph/pin/callable.rb +231 -0
  103. data/lib/solargraph/pin/closure.rb +30 -10
  104. data/lib/solargraph/pin/common.rb +12 -7
  105. data/lib/solargraph/pin/constant.rb +2 -0
  106. data/lib/solargraph/pin/conversions.rb +3 -2
  107. data/lib/solargraph/pin/delegated_method.rb +20 -1
  108. data/lib/solargraph/pin/documenting.rb +16 -0
  109. data/lib/solargraph/pin/instance_variable.rb +2 -2
  110. data/lib/solargraph/pin/keyword.rb +7 -2
  111. data/lib/solargraph/pin/local_variable.rb +15 -7
  112. data/lib/solargraph/pin/method.rb +241 -70
  113. data/lib/solargraph/pin/method_alias.rb +3 -0
  114. data/lib/solargraph/pin/namespace.rb +21 -13
  115. data/lib/solargraph/pin/parameter.rb +94 -32
  116. data/lib/solargraph/pin/proxy_type.rb +17 -7
  117. data/lib/solargraph/pin/reference/override.rb +24 -6
  118. data/lib/solargraph/pin/reference/require.rb +2 -2
  119. data/lib/solargraph/pin/reference/superclass.rb +5 -0
  120. data/lib/solargraph/pin/reference.rb +17 -0
  121. data/lib/solargraph/pin/search.rb +6 -1
  122. data/lib/solargraph/pin/signature.rb +39 -121
  123. data/lib/solargraph/pin/singleton.rb +1 -1
  124. data/lib/solargraph/pin/symbol.rb +8 -2
  125. data/lib/solargraph/pin/until.rb +18 -0
  126. data/lib/solargraph/pin/while.rb +18 -0
  127. data/lib/solargraph/pin.rb +8 -2
  128. data/lib/solargraph/pin_cache.rb +245 -0
  129. data/lib/solargraph/position.rb +19 -0
  130. data/lib/solargraph/range.rb +23 -4
  131. data/lib/solargraph/rbs_map/conversions.rb +315 -99
  132. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  133. data/lib/solargraph/rbs_map/core_map.rb +41 -11
  134. data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
  135. data/lib/solargraph/rbs_map.rb +87 -16
  136. data/lib/solargraph/shell.rb +117 -17
  137. data/lib/solargraph/source/chain/array.rb +13 -8
  138. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  139. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  140. data/lib/solargraph/source/chain/call.rb +135 -66
  141. data/lib/solargraph/source/chain/constant.rb +3 -66
  142. data/lib/solargraph/source/chain/hash.rb +9 -3
  143. data/lib/solargraph/source/chain/head.rb +1 -1
  144. data/lib/solargraph/source/chain/if.rb +7 -2
  145. data/lib/solargraph/source/chain/link.rb +38 -6
  146. data/lib/solargraph/source/chain/literal.rb +27 -2
  147. data/lib/solargraph/source/chain/or.rb +2 -2
  148. data/lib/solargraph/source/chain/z_super.rb +1 -1
  149. data/lib/solargraph/source/chain.rb +140 -63
  150. data/lib/solargraph/source/change.rb +2 -2
  151. data/lib/solargraph/source/cursor.rb +4 -4
  152. data/lib/solargraph/source/source_chainer.rb +3 -3
  153. data/lib/solargraph/source.rb +110 -89
  154. data/lib/solargraph/source_map/clip.rb +22 -28
  155. data/lib/solargraph/source_map/data.rb +34 -0
  156. data/lib/solargraph/source_map/mapper.rb +11 -7
  157. data/lib/solargraph/source_map.rb +50 -43
  158. data/lib/solargraph/type_checker/checks.rb +4 -0
  159. data/lib/solargraph/type_checker/param_def.rb +2 -0
  160. data/lib/solargraph/type_checker/rules.rb +35 -8
  161. data/lib/solargraph/type_checker.rb +331 -189
  162. data/lib/solargraph/version.rb +1 -1
  163. data/lib/solargraph/views/_method.erb +10 -10
  164. data/lib/solargraph/views/_namespace.erb +3 -3
  165. data/lib/solargraph/views/document.erb +10 -10
  166. data/lib/solargraph/views/environment.erb +3 -5
  167. data/lib/solargraph/workspace/config.rb +25 -5
  168. data/lib/solargraph/workspace/require_paths.rb +97 -0
  169. data/lib/solargraph/workspace.rb +53 -72
  170. data/lib/solargraph/yard_map/helpers.rb +29 -1
  171. data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
  172. data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
  173. data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
  174. data/lib/solargraph/yard_map/mapper.rb +5 -3
  175. data/lib/solargraph/yard_map/to_method.rb +6 -3
  176. data/lib/solargraph/yardoc.rb +45 -10
  177. data/lib/solargraph.rb +35 -1
  178. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  179. data/rbs/fills/open3/0/open3.rbs +172 -0
  180. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  181. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  182. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  183. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  184. data/rbs/fills/tuple/tuple.rbs +149 -0
  185. data/rbs_collection.yaml +19 -0
  186. data/sig/shims/ast/0/node.rbs +5 -0
  187. data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
  188. data/sig/shims/ast/2.4/ast.rbs +73 -0
  189. data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  190. data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
  191. data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
  192. data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  193. data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  194. data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
  195. data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
  196. data/solargraph.gemspec +32 -10
  197. metadata +237 -37
  198. data/lib/.rubocop.yml +0 -22
  199. data/lib/solargraph/cache.rb +0 -77
  200. 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
- # @param return_type [ComplexType, nil]
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
- @return_type = return_type
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
- def full
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 :optarg
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.context.namespace) unless return_type.undefined?
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
- next unless p.name == name
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
- found
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
- if closure.is_a?(Pin::Block) && closure.receiver
146
- return closure.typify_parameters(api_map)[index]
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.context.namespace) unless found.nil? || found.types.nil?
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
- def initialize return_type: ComplexType::UNDEFINED, **splat
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 return_type [ComplexType]
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 return_type
19
- parts = return_type.namespace.split('::')
20
- namespace = parts[0..-2].join('::').to_s
21
- name = parts.last.to_s
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: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
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 initialize location, name, tags, delete = []
14
- super(location: location, name: name)
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
- def self.method_return name, *tags, delete: []
20
- new(nil, name, [YARD::Tags::Tag.new('return', nil, tags)], delete)
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
- def self.from_comment name, comment
24
- new(nil, name, Solargraph::Source.parse_docstring(comment).to_docstring.tags)
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
@@ -3,7 +3,12 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Reference
6
+ # A Superclass reference pin.
7
+ #
6
8
  class Superclass < Reference
9
+ def reference_gates
10
+ @reference_gates ||= closure.gates - [closure.path]
11
+ end
7
12
  end
8
13
  end
9
14
  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 (1.0 + (str2.length.to_f / str1.length.to_f)) if str1.downcase.include?(str2.downcase)
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 < Base
4
- # @return [::Array<Parameter>]
5
- attr_reader :parameters
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
- # @return [ComplexType]
8
- attr_reader :return_type
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
- # @return [String]
29
- def to_rbs
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
- # @return [Array<String>]
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
- # @param generics_to_resolve [Enumerable<String>]
57
- # @param arg_types [Array<ComplexType>, nil]
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
- # @param generics_to_resolve [Enumerable<String>]
88
- # @param arg_types [Array<ComplexType>, nil]
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 identity
129
- @identity ||= "signature#{object_id}"
30
+ def location
31
+ super || closure&.location
130
32
  end
131
33
 
132
- def block?
133
- !!@block
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
@@ -3,7 +3,7 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Singleton < Closure
6
- def initialize name: '', location: nil, closure: nil
6
+ def initialize name: '', location: nil, closure: nil, **splat
7
7
  super
8
8
  end
9
9
  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 location, name
9
- super(location: location, name: name)
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
@@ -3,7 +3,9 @@
3
3
  require 'yard'
4
4
 
5
5
  module Solargraph
6
- # The namespace for pins used in maps.
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