solargraph 0.58.2 → 0.59.0.dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +4 -5
  4. data/.github/workflows/plugins.yml +40 -36
  5. data/.github/workflows/rspec.yml +45 -13
  6. data/.github/workflows/typecheck.yml +2 -2
  7. data/.gitignore +0 -1
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +1 -7
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/lib/solargraph/api_map/cache.rb +3 -3
  13. data/lib/solargraph/api_map/constants.rb +13 -3
  14. data/lib/solargraph/api_map/index.rb +22 -11
  15. data/lib/solargraph/api_map/source_to_yard.rb +13 -1
  16. data/lib/solargraph/api_map/store.rb +11 -8
  17. data/lib/solargraph/api_map.rb +105 -50
  18. data/lib/solargraph/complex_type/conformance.rb +176 -0
  19. data/lib/solargraph/complex_type/type_methods.rb +16 -2
  20. data/lib/solargraph/complex_type/unique_type.rb +170 -20
  21. data/lib/solargraph/complex_type.rb +119 -14
  22. data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
  23. data/lib/solargraph/convention/data_definition.rb +4 -1
  24. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
  25. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +1 -0
  26. data/lib/solargraph/convention/struct_definition.rb +5 -1
  27. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  28. data/lib/solargraph/diagnostics/rubocop.rb +1 -0
  29. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  30. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  31. data/lib/solargraph/doc_map.rb +134 -373
  32. data/lib/solargraph/equality.rb +1 -1
  33. data/lib/solargraph/gem_pins.rb +14 -15
  34. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  35. data/lib/solargraph/language_server/host/dispatch.rb +1 -0
  36. data/lib/solargraph/language_server/host/message_worker.rb +2 -1
  37. data/lib/solargraph/language_server/host/sources.rb +1 -0
  38. data/lib/solargraph/language_server/host.rb +6 -1
  39. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -7
  40. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  41. data/lib/solargraph/language_server/message/text_document/completion.rb +2 -0
  42. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  43. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
  44. data/lib/solargraph/language_server/message/text_document/formatting.rb +2 -0
  45. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  46. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -0
  47. data/lib/solargraph/language_server/message/text_document/type_definition.rb +2 -0
  48. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
  49. data/lib/solargraph/library.rb +59 -13
  50. data/lib/solargraph/location.rb +9 -4
  51. data/lib/solargraph/logging.rb +21 -1
  52. data/lib/solargraph/parser/comment_ripper.rb +7 -0
  53. data/lib/solargraph/parser/flow_sensitive_typing.rb +330 -102
  54. data/lib/solargraph/parser/node_processor/base.rb +32 -2
  55. data/lib/solargraph/parser/node_processor.rb +7 -6
  56. data/lib/solargraph/parser/parser_gem/class_methods.rb +28 -10
  57. data/lib/solargraph/parser/parser_gem/node_chainer.rb +31 -6
  58. data/lib/solargraph/parser/parser_gem/node_methods.rb +27 -7
  59. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  60. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +2 -0
  61. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  62. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -11
  63. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +7 -0
  64. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  65. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +3 -2
  66. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  67. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  68. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +2 -2
  69. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  70. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  71. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  72. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +1 -0
  73. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +12 -7
  74. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  75. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +5 -1
  76. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  77. data/lib/solargraph/parser/region.rb +9 -3
  78. data/lib/solargraph/parser/snippet.rb +1 -1
  79. data/lib/solargraph/pin/base.rb +53 -21
  80. data/lib/solargraph/pin/base_variable.rb +312 -20
  81. data/lib/solargraph/pin/block.rb +26 -4
  82. data/lib/solargraph/pin/breakable.rb +5 -1
  83. data/lib/solargraph/pin/callable.rb +50 -3
  84. data/lib/solargraph/pin/closure.rb +2 -6
  85. data/lib/solargraph/pin/common.rb +20 -5
  86. data/lib/solargraph/pin/compound_statement.rb +55 -0
  87. data/lib/solargraph/pin/conversions.rb +2 -1
  88. data/lib/solargraph/pin/delegated_method.rb +15 -4
  89. data/lib/solargraph/pin/documenting.rb +1 -0
  90. data/lib/solargraph/pin/instance_variable.rb +5 -1
  91. data/lib/solargraph/pin/keyword.rb +0 -4
  92. data/lib/solargraph/pin/local_variable.rb +13 -57
  93. data/lib/solargraph/pin/method.rb +90 -42
  94. data/lib/solargraph/pin/method_alias.rb +8 -0
  95. data/lib/solargraph/pin/namespace.rb +7 -1
  96. data/lib/solargraph/pin/parameter.rb +76 -13
  97. data/lib/solargraph/pin/proxy_type.rb +2 -1
  98. data/lib/solargraph/pin/reference/override.rb +1 -1
  99. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  100. data/lib/solargraph/pin/reference.rb +2 -0
  101. data/lib/solargraph/pin/search.rb +1 -0
  102. data/lib/solargraph/pin/signature.rb +8 -0
  103. data/lib/solargraph/pin/symbol.rb +1 -1
  104. data/lib/solargraph/pin/until.rb +1 -1
  105. data/lib/solargraph/pin/while.rb +1 -1
  106. data/lib/solargraph/pin.rb +2 -0
  107. data/lib/solargraph/pin_cache.rb +477 -57
  108. data/lib/solargraph/position.rb +12 -26
  109. data/lib/solargraph/range.rb +6 -6
  110. data/lib/solargraph/rbs_map/conversions.rb +33 -10
  111. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  112. data/lib/solargraph/rbs_map/stdlib_map.rb +34 -5
  113. data/lib/solargraph/rbs_map.rb +74 -20
  114. data/lib/solargraph/shell.rb +73 -28
  115. data/lib/solargraph/source/chain/call.rb +52 -17
  116. data/lib/solargraph/source/chain/constant.rb +2 -0
  117. data/lib/solargraph/source/chain/hash.rb +1 -0
  118. data/lib/solargraph/source/chain/if.rb +1 -0
  119. data/lib/solargraph/source/chain/instance_variable.rb +22 -1
  120. data/lib/solargraph/source/chain/literal.rb +5 -0
  121. data/lib/solargraph/source/chain/or.rb +9 -1
  122. data/lib/solargraph/source/chain.rb +25 -22
  123. data/lib/solargraph/source/change.rb +9 -2
  124. data/lib/solargraph/source/cursor.rb +7 -1
  125. data/lib/solargraph/source/source_chainer.rb +13 -3
  126. data/lib/solargraph/source/updater.rb +4 -0
  127. data/lib/solargraph/source.rb +33 -7
  128. data/lib/solargraph/source_map/clip.rb +13 -2
  129. data/lib/solargraph/source_map/data.rb +4 -1
  130. data/lib/solargraph/source_map/mapper.rb +24 -1
  131. data/lib/solargraph/source_map.rb +14 -6
  132. data/lib/solargraph/type_checker/problem.rb +3 -1
  133. data/lib/solargraph/type_checker/rules.rb +75 -2
  134. data/lib/solargraph/type_checker.rb +111 -30
  135. data/lib/solargraph/version.rb +1 -1
  136. data/lib/solargraph/workspace/config.rb +3 -1
  137. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  138. data/lib/solargraph/workspace/require_paths.rb +1 -0
  139. data/lib/solargraph/workspace.rb +158 -16
  140. data/lib/solargraph/yard_map/helpers.rb +2 -1
  141. data/lib/solargraph/yard_map/mapper/to_method.rb +5 -1
  142. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  143. data/lib/solargraph/yard_map/mapper.rb +5 -0
  144. data/lib/solargraph/yardoc.rb +33 -23
  145. data/lib/solargraph.rb +24 -3
  146. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  147. data/rbs/fills/tuple/tuple.rbs +28 -0
  148. data/rbs/shims/ast/0/node.rbs +1 -1
  149. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  150. data/solargraph.gemspec +2 -1
  151. metadata +12 -7
  152. data/lib/solargraph/type_checker/checks.rb +0 -124
  153. data/lib/solargraph/type_checker/param_def.rb +0 -37
  154. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -30,12 +30,29 @@ module Solargraph
30
30
  end
31
31
 
32
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)
33
+ # Parameters can be combined with local variables
34
+ new_attrs = if other.is_a?(Parameter)
35
+ {
36
+ decl: assert_same(other, :decl),
37
+ asgn_code: choose(other, :asgn_code)
38
+ }
39
+ else
40
+ {
41
+ decl: decl,
42
+ asgn_code: asgn_code
43
+ }
44
+ end
45
+ super(other, new_attrs.merge(attrs))
46
+ end
47
+
48
+ def combine_return_type(other)
49
+ out = super
50
+ if out&.undefined?
51
+ # allow our return_type method to provide a better type
52
+ # using :param tag
53
+ out = nil
54
+ end
55
+ out
39
56
  end
40
57
 
41
58
  def keyword?
@@ -43,6 +60,7 @@ module Solargraph
43
60
  end
44
61
 
45
62
  def kwrestarg?
63
+ # @sg-ignore flow sensitive typing needs to handle attrs
46
64
  decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
47
65
  end
48
66
 
@@ -72,6 +90,11 @@ module Solargraph
72
90
  end
73
91
  end
74
92
 
93
+ # @return [String]
94
+ def type_arity_decl
95
+ arity_decl + return_type.items.count.to_s
96
+ end
97
+
75
98
  def arg?
76
99
  decl == :arg
77
100
  end
@@ -80,6 +103,14 @@ module Solargraph
80
103
  decl == :restarg
81
104
  end
82
105
 
106
+ def mandatory_positional?
107
+ decl == :arg
108
+ end
109
+
110
+ def positional?
111
+ !keyword?
112
+ end
113
+
83
114
  def rest?
84
115
  decl == :restarg || decl == :kwrestarg
85
116
  end
@@ -123,6 +154,11 @@ module Solargraph
123
154
  end
124
155
  end
125
156
 
157
+ def reset_generated!
158
+ @return_type = nil if param_tag
159
+ super
160
+ end
161
+
126
162
  # @return [String]
127
163
  def full
128
164
  full_name + case decl
@@ -135,12 +171,14 @@ module Solargraph
135
171
  end
136
172
  end
137
173
 
174
+ # @sg-ignore super always sets @return_type to something
138
175
  # @return [ComplexType]
139
176
  def return_type
140
177
  if @return_type.nil?
141
178
  @return_type = ComplexType::UNDEFINED
142
179
  found = param_tag
143
180
  @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
181
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
144
182
  if @return_type.undefined?
145
183
  if decl == :restarg
146
184
  @return_type = ComplexType.try_parse('::Array')
@@ -152,22 +190,29 @@ module Solargraph
152
190
  end
153
191
  end
154
192
  super
155
- @return_type
156
193
  end
157
194
 
158
195
  # The parameter's zero-based location in the block's signature.
159
196
  #
197
+ # @sg-ignore Need to add nil check here
160
198
  # @return [Integer]
161
199
  def index
162
- # @type [Method, Block]
163
200
  method_pin = closure
201
+ # @sg-ignore Need to add nil check here
164
202
  method_pin.parameter_names.index(name)
165
203
  end
166
204
 
167
205
  # @param api_map [ApiMap]
168
206
  def typify api_map
169
- return return_type.qualify(api_map, *closure.gates) unless return_type.undefined?
170
- closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
207
+ new_type = super
208
+ return new_type if new_type.defined?
209
+
210
+ # sniff based on param tags
211
+ new_type = closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
212
+
213
+ return adjust_type api_map, new_type.self_to_type(full_context) if new_type.defined?
214
+
215
+ adjust_type api_map, super.self_to_type(full_context)
171
216
  end
172
217
 
173
218
  # @param atype [ComplexType]
@@ -176,9 +221,16 @@ module Solargraph
176
221
  # make sure we get types from up the method
177
222
  # inheritance chain if we don't have them on this pin
178
223
  ptype = typify api_map
179
- ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
224
+ return true if ptype.undefined?
225
+
226
+ return true if atype.conforms_to?(api_map,
227
+ ptype,
228
+ :method_call,
229
+ [:allow_empty_params, :allow_undefined])
230
+ ptype.generic?
180
231
  end
181
232
 
233
+ # @sg-ignore flow sensitive typing needs to handle attrs
182
234
  def documentation
183
235
  tag = param_tag
184
236
  return '' if tag.nil? || tag.text.nil?
@@ -187,12 +239,19 @@ module Solargraph
187
239
 
188
240
  private
189
241
 
242
+ def generate_complex_type
243
+ nil
244
+ end
245
+
190
246
  # @return [YARD::Tags::Tag, nil]
191
247
  def param_tag
248
+ # @sg-ignore Need to add nil check here
192
249
  params = closure.docstring.tags(:param)
250
+ # @sg-ignore Need to add nil check here
193
251
  params.each do |p|
194
252
  return p if p.name == name
195
253
  end
254
+ # @sg-ignore Need to add nil check here
196
255
  params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
197
256
  end
198
257
 
@@ -200,7 +259,7 @@ module Solargraph
200
259
  # @return [ComplexType]
201
260
  def typify_block_param api_map
202
261
  block_pin = closure
203
- if block_pin.is_a?(Pin::Block) && block_pin.receiver
262
+ if block_pin.is_a?(Pin::Block) && block_pin.receiver && index
204
263
  return block_pin.typify_parameters(api_map)[index]
205
264
  end
206
265
  ComplexType::UNDEFINED
@@ -209,6 +268,7 @@ module Solargraph
209
268
  # @param api_map [ApiMap]
210
269
  # @return [ComplexType]
211
270
  def typify_method_param api_map
271
+ # @sg-ignore Need to add nil check here
212
272
  meths = api_map.get_method_stack(closure.full_context.tag, closure.name, scope: closure.scope)
213
273
  # meths.shift # Ignore the first one
214
274
  meths.each do |meth|
@@ -222,6 +282,7 @@ module Solargraph
222
282
  if found.nil? and !index.nil?
223
283
  found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
224
284
  end
285
+ # @sg-ignore Need to add nil check here
225
286
  return ComplexType.try_parse(*found.types).qualify(api_map, *meth.closure.gates) unless found.nil? || found.types.nil?
226
287
  end
227
288
  ComplexType::UNDEFINED
@@ -230,6 +291,7 @@ module Solargraph
230
291
  # @param heredoc [YARD::Docstring]
231
292
  # @param api_map [ApiMap]
232
293
  # @param skip [::Array]
294
+ #
233
295
  # @return [::Array<YARD::Tags::Tag>]
234
296
  def see_reference heredoc, api_map, skip = []
235
297
  # This should actually be an intersection type
@@ -237,7 +299,7 @@ module Solargraph
237
299
  heredoc.ref_tags.each do |ref|
238
300
  # @sg-ignore ref should actually be an intersection type
239
301
  next unless ref.tag_name == 'param' && ref.owner
240
- # @sg-ignore ref should actually be an intersection type
302
+ # @todo ref should actually be an intersection type
241
303
  result = resolve_reference(ref.owner.to_s, api_map, skip)
242
304
  return result unless result.nil?
243
305
  end
@@ -257,6 +319,7 @@ module Solargraph
257
319
  else
258
320
  fqns = api_map.qualify(parts.first, namespace)
259
321
  return nil if fqns.nil?
322
+ # @sg-ignore Need to add nil check here
260
323
  path = fqns + ref[parts.first.length] + parts.last
261
324
  end
262
325
  pins = api_map.get_path_pins(path)
@@ -3,7 +3,7 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class ProxyType < Base
6
- # @param return_type [ComplexType]
6
+ # @param return_type [ComplexType, ComplexType::UniqueType]
7
7
  # @param gates [Array<String>, nil] Namespaces to try while resolving non-rooted types
8
8
  # @param binder [ComplexType, ComplexType::UniqueType, nil]
9
9
  # @param gates [Array<String>, nil]
@@ -25,6 +25,7 @@ module Solargraph
25
25
  def self.anonymous context, closure: nil, binder: nil, **kwargs
26
26
  unless closure
27
27
  parts = context.namespace.split('::')
28
+ # @sg-ignore Need to add nil check here
28
29
  namespace = parts[0..-2].join('::').to_s
29
30
  closure = Solargraph::Pin::Namespace.new(name: namespace, source: :proxy_type)
30
31
  end
@@ -7,7 +7,7 @@ module Solargraph
7
7
  # @return [::Array<YARD::Tags::Tag>]
8
8
  attr_reader :tags
9
9
 
10
- # @return [::Array<Symbol>]
10
+ # @return [::Array<::Symbol>]
11
11
  attr_reader :delete
12
12
 
13
13
  def closure
@@ -6,7 +6,9 @@ module Solargraph
6
6
  # A Superclass reference pin.
7
7
  #
8
8
  class Superclass < Reference
9
+ # @sg-ignore Need to add nil check here
9
10
  def reference_gates
11
+ # @sg-ignore Need to add nil check here
10
12
  @reference_gates ||= closure.gates - [closure.path]
11
13
  end
12
14
  end
@@ -30,8 +30,10 @@ module Solargraph
30
30
  )
31
31
  end
32
32
 
33
+ # @sg-ignore Need to add nil check here
33
34
  # @return [Array<String>]
34
35
  def reference_gates
36
+ # @sg-ignore Need to add nil check here
35
37
  closure.gates
36
38
  end
37
39
  end
@@ -51,6 +51,7 @@ module Solargraph
51
51
 
52
52
  # @param str1 [String]
53
53
  # @param str2 [String]
54
+ #
54
55
  # @return [Float]
55
56
  def fuzzy_string_match str1, str2
56
57
  return 1.0 + (str2.length.to_f / str1.length.to_f) if str1.downcase.include?(str2.downcase)
@@ -10,6 +10,7 @@ module Solargraph
10
10
  end
11
11
 
12
12
  def generics
13
+ # @type [Array<::String, nil>]
13
14
  @generics ||= [].freeze
14
15
  end
15
16
 
@@ -19,6 +20,7 @@ module Solargraph
19
20
 
20
21
  attr_writer :closure
21
22
 
23
+ # @ sg-ignore need boolish support for ? methods
22
24
  def dodgy_return_type_source?
23
25
  super || closure&.dodgy_return_type_source?
24
26
  end
@@ -32,8 +34,11 @@ module Solargraph
32
34
  end
33
35
 
34
36
  def typify api_map
37
+ # @sg-ignore Need to add nil check here
35
38
  if return_type.defined?
39
+ # @sg-ignore Need to add nil check here
36
40
  qualified = return_type.qualify(api_map, closure.namespace)
41
+ # @sg-ignore Need to add nil check here
37
42
  logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
38
43
  return qualified
39
44
  end
@@ -46,8 +51,11 @@ module Solargraph
46
51
  method_stack.each do |pin|
47
52
  sig = pin.signatures.find { |s| s.arity == self.arity }
48
53
  next unless sig
54
+ # @sg-ignore Need to add nil check here
49
55
  unless sig.return_type.undefined?
56
+ # @sg-ignore Need to add nil check here
50
57
  qualified = sig.return_type.qualify(api_map, closure.namespace)
58
+ # @sg-ignore Need to add nil check here
51
59
  logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
52
60
  return qualified
53
61
  end
@@ -3,7 +3,7 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Symbol < Base
6
- # @param location [Solargraph::Location]
6
+ # @param location [Solargraph::Location, nil]
7
7
  # @param name [String]
8
8
  def initialize(location, name, **kwargs)
9
9
  # @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Solargraph
4
4
  module Pin
5
- class Until < Base
5
+ class Until < CompoundStatement
6
6
  include Breakable
7
7
 
8
8
  # @param receiver [Parser::AST::Node, nil]
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Solargraph
4
4
  module Pin
5
- class While < Base
5
+ class While < CompoundStatement
6
6
  include Breakable
7
7
 
8
8
  # @param receiver [Parser::AST::Node, nil]
@@ -38,6 +38,8 @@ module Solargraph
38
38
  autoload :Until, 'solargraph/pin/until'
39
39
  autoload :While, 'solargraph/pin/while'
40
40
  autoload :Callable, 'solargraph/pin/callable'
41
+ autoload :CompoundStatement,
42
+ 'solargraph/pin/compound_statement'
41
43
 
42
44
  ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil, source: :pin_rb)
43
45
  end