solargraph 0.59.0.dev.1 → 0.59.0.dev.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.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +4 -1
  3. data/.github/workflows/rspec.yml +3 -14
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +32 -5
  6. data/.rubocop_todo.yml +37 -931
  7. data/CHANGELOG.md +7 -1
  8. data/Gemfile +3 -1
  9. data/Rakefile +25 -23
  10. data/bin/solargraph +2 -1
  11. data/lib/solargraph/api_map/index.rb +5 -11
  12. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  13. data/lib/solargraph/api_map/store.rb +22 -20
  14. data/lib/solargraph/api_map.rb +50 -37
  15. data/lib/solargraph/bench.rb +44 -45
  16. data/lib/solargraph/complex_type/type_methods.rb +12 -15
  17. data/lib/solargraph/complex_type/unique_type.rb +54 -43
  18. data/lib/solargraph/complex_type.rb +69 -61
  19. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  21. data/lib/solargraph/convention/data_definition.rb +1 -1
  22. data/lib/solargraph/convention/gemfile.rb +15 -15
  23. data/lib/solargraph/convention/gemspec.rb +23 -23
  24. data/lib/solargraph/convention/rakefile.rb +17 -17
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  27. data/lib/solargraph/convention/struct_definition.rb +3 -3
  28. data/lib/solargraph/convention.rb +78 -78
  29. data/lib/solargraph/converters/dd.rb +19 -17
  30. data/lib/solargraph/converters/dl.rb +17 -15
  31. data/lib/solargraph/converters/dt.rb +17 -15
  32. data/lib/solargraph/converters/misc.rb +3 -1
  33. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  34. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  35. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  36. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  37. data/lib/solargraph/doc_map.rb +9 -10
  38. data/lib/solargraph/equality.rb +3 -3
  39. data/lib/solargraph/gem_pins.rb +7 -5
  40. data/lib/solargraph/language_server/error_codes.rb +20 -20
  41. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  43. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  44. data/lib/solargraph/language_server/host/sources.rb +1 -1
  45. data/lib/solargraph/language_server/host.rb +24 -21
  46. data/lib/solargraph/language_server/message/base.rb +97 -97
  47. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  48. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  49. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  50. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  51. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  52. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  53. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  56. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  58. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  59. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  60. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  61. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  62. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  63. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  64. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  65. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  66. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  67. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  68. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  69. data/lib/solargraph/language_server/message.rb +94 -94
  70. data/lib/solargraph/language_server/request.rb +29 -27
  71. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  72. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  73. data/lib/solargraph/library.rb +28 -33
  74. data/lib/solargraph/location.rb +10 -12
  75. data/lib/solargraph/logging.rb +4 -4
  76. data/lib/solargraph/page.rb +92 -92
  77. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  78. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
  79. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  80. data/lib/solargraph/parser/node_processor.rb +1 -1
  81. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
  82. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  83. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  84. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  85. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  91. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  93. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  94. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  95. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  96. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  97. data/lib/solargraph/parser/parser_gem.rb +14 -12
  98. data/lib/solargraph/parser/snippet.rb +2 -0
  99. data/lib/solargraph/parser.rb +25 -23
  100. data/lib/solargraph/pin/base.rb +78 -64
  101. data/lib/solargraph/pin/base_variable.rb +28 -71
  102. data/lib/solargraph/pin/block.rb +3 -2
  103. data/lib/solargraph/pin/breakable.rb +2 -0
  104. data/lib/solargraph/pin/callable.rb +23 -26
  105. data/lib/solargraph/pin/closure.rb +5 -4
  106. data/lib/solargraph/pin/common.rb +5 -2
  107. data/lib/solargraph/pin/compound_statement.rb +3 -3
  108. data/lib/solargraph/pin/constant.rb +43 -45
  109. data/lib/solargraph/pin/conversions.rb +9 -4
  110. data/lib/solargraph/pin/delegated_method.rb +4 -4
  111. data/lib/solargraph/pin/documenting.rb +3 -2
  112. data/lib/solargraph/pin/local_variable.rb +4 -4
  113. data/lib/solargraph/pin/method.rb +71 -70
  114. data/lib/solargraph/pin/namespace.rb +13 -12
  115. data/lib/solargraph/pin/parameter.rb +28 -27
  116. data/lib/solargraph/pin/proxy_type.rb +2 -0
  117. data/lib/solargraph/pin/reference.rb +17 -0
  118. data/lib/solargraph/pin/search.rb +2 -2
  119. data/lib/solargraph/pin/signature.rb +9 -14
  120. data/lib/solargraph/pin/symbol.rb +1 -0
  121. data/lib/solargraph/pin/until.rb +1 -3
  122. data/lib/solargraph/pin/while.rb +1 -3
  123. data/lib/solargraph/pin_cache.rb +16 -19
  124. data/lib/solargraph/position.rb +35 -17
  125. data/lib/solargraph/range.rb +10 -9
  126. data/lib/solargraph/rbs_map/conversions.rb +312 -206
  127. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  128. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  129. data/lib/solargraph/rbs_map.rb +3 -12
  130. data/lib/solargraph/server_methods.rb +16 -16
  131. data/lib/solargraph/shell.rb +63 -53
  132. data/lib/solargraph/source/chain/array.rb +39 -37
  133. data/lib/solargraph/source/chain/call.rb +49 -44
  134. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  135. data/lib/solargraph/source/chain/constant.rb +3 -1
  136. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  137. data/lib/solargraph/source/chain/hash.rb +8 -6
  138. data/lib/solargraph/source/chain/if.rb +11 -10
  139. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  140. data/lib/solargraph/source/chain/link.rb +99 -109
  141. data/lib/solargraph/source/chain/literal.rb +4 -6
  142. data/lib/solargraph/source/chain/or.rb +2 -4
  143. data/lib/solargraph/source/chain/q_call.rb +13 -11
  144. data/lib/solargraph/source/chain/variable.rb +15 -13
  145. data/lib/solargraph/source/chain/z_super.rb +28 -30
  146. data/lib/solargraph/source/chain.rb +24 -16
  147. data/lib/solargraph/source/change.rb +3 -3
  148. data/lib/solargraph/source/cursor.rb +18 -18
  149. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  150. data/lib/solargraph/source/source_chainer.rb +46 -32
  151. data/lib/solargraph/source/updater.rb +1 -1
  152. data/lib/solargraph/source.rb +27 -29
  153. data/lib/solargraph/source_map/clip.rb +38 -30
  154. data/lib/solargraph/source_map/mapper.rb +52 -46
  155. data/lib/solargraph/source_map.rb +8 -4
  156. data/lib/solargraph/type_checker/rules.rb +8 -8
  157. data/lib/solargraph/type_checker.rb +95 -101
  158. data/lib/solargraph/version.rb +1 -1
  159. data/lib/solargraph/workspace/config.rb +10 -9
  160. data/lib/solargraph/workspace/gemspecs.rb +1 -1
  161. data/lib/solargraph/workspace.rb +21 -44
  162. data/lib/solargraph/yard_map/helpers.rb +6 -2
  163. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  164. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  165. data/lib/solargraph/yard_map/mapper.rb +12 -12
  166. data/lib/solargraph/yard_tags.rb +20 -20
  167. data/lib/solargraph.rb +5 -5
  168. data/solargraph.gemspec +35 -34
  169. metadata +28 -28
@@ -28,19 +28,14 @@ module Solargraph
28
28
  # @param arguments [::Array<Chain>]
29
29
  # @param block [Chain, nil]
30
30
  def initialize word, location = nil, arguments = [], block = nil
31
- @word = word
31
+ super(word)
32
+
32
33
  @location = location
33
34
  @arguments = arguments
34
35
  @block = block
35
36
  fix_block_pass
36
37
  end
37
38
 
38
- # @sg-ignore Fix "Not enough arguments to Module#protected"
39
- protected def equality_fields
40
- # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
41
- super + [arguments, block]
42
- end
43
-
44
39
  def with_block?
45
40
  !!@block
46
41
  end
@@ -68,10 +63,7 @@ module Solargraph
68
63
  stack = api_map.get_method_stack(ns_tag, word, scope: context.scope)
69
64
  [stack.first].compact
70
65
  end
71
- # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
72
- if !api_map.loose_unions && pin_groups.any? { |pins| pins.empty? }
73
- pin_groups = []
74
- end
66
+ pin_groups = [] if !api_map.loose_unions && pin_groups.any?(&:empty?)
75
67
  pins = pin_groups.flatten.uniq(&:path)
76
68
  return [] if pins.empty?
77
69
  inferred_pins(pins, api_map, name_pin, locals)
@@ -128,38 +120,42 @@ module Solargraph
128
120
  if ol.block && with_block?
129
121
  block_atypes = ol.block.parameters.map(&:return_type)
130
122
  # @todo Need to add nil check here
131
- if block.links.map(&:class) == [BlockSymbol]
132
- # like the bar in foo(&:bar)
133
- blocktype = block_symbol_call_type(api_map, name_pin.context, block_atypes, locals)
134
- else
135
- blocktype = block_call_type(api_map, name_pin, locals)
136
- end
123
+ blocktype = if block.links.map(&:class) == [BlockSymbol]
124
+ # like the bar in foo(&:bar)
125
+ block_symbol_call_type(api_map, name_pin.context, block_atypes, locals)
126
+ else
127
+ block_call_type(api_map, name_pin, locals)
128
+ end
137
129
  end
138
130
  # @type new_signature_pin [Pin::Signature]
139
- new_signature_pin = ol.resolve_generics_from_context_until_complete(ol.generics, atypes, nil, nil, blocktype)
131
+ new_signature_pin = ol.resolve_generics_from_context_until_complete(ol.generics, atypes, nil, nil,
132
+ blocktype)
140
133
  new_return_type = new_signature_pin.return_type
141
- if head?
142
- # If we're at the head of the chain, we called a
143
- # method somewhere that marked itself as returning
144
- # self. Given we didn't invoke this on an object,
145
- # this must be a method in this same class - so we
146
- # use our own self type
147
- self_type = name_pin.context
148
- else
149
- # if we're past the head in the chain, whatever the
150
- # type of the lhs side is what 'self' will be in its
151
- # declaration - we can't just use the type of the
152
- # method pin, as this might be a subclass of the
153
- # place where the method is defined
154
- self_type = name_pin.binder
155
- end
134
+ self_type = if head?
135
+ # If we're at the head of the chain, we called a
136
+ # method somewhere that marked itself as returning
137
+ # self. Given we didn't invoke this on an object,
138
+ # this must be a method in this same class - so we
139
+ # use our own self type
140
+ name_pin.context
141
+ else
142
+ # if we're past the head in the chain, whatever the
143
+ # type of the lhs side is what 'self' will be in its
144
+ # declaration - we can't just use the type of the
145
+ # method pin, as this might be a subclass of the
146
+ # place where the method is defined
147
+ name_pin.binder
148
+ end
156
149
  # This same logic applies to the YARD work done by
157
150
  # 'with_params()'.
158
151
  #
159
152
  # qualify(), however, happens in the namespace where
160
153
  # the docs were written - from the method pin.
161
154
  # @todo Need to add nil check here
162
- type = with_params(new_return_type.self_to_type(self_type), self_type).qualify(api_map, *p.gates) if new_return_type.defined?
155
+ if new_return_type.defined?
156
+ type = with_params(new_return_type.self_to_type(self_type), self_type).qualify(api_map,
157
+ *p.gates)
158
+ end
163
159
  type ||= ComplexType::UNDEFINED
164
160
  end
165
161
  break if type.defined?
@@ -177,8 +173,10 @@ module Solargraph
177
173
  end
178
174
  p
179
175
  end
180
- logger.debug { "Call#inferred_pins(name_pin.binder=#{name_pin.binder}, word=#{word}, pins=#{pins.map(&:desc)}, name_pin=#{name_pin}) - result=#{result}" }
181
- out = result.map do |pin|
176
+ logger.debug do
177
+ "Call#inferred_pins(name_pin.binder=#{name_pin.binder}, word=#{word}, pins=#{pins.map(&:desc)}, name_pin=#{name_pin}) - result=#{result}"
178
+ end
179
+ result.map do |pin|
182
180
  if pin.path == 'Class#new' && name_pin.binder.tag != 'Class'
183
181
  reduced_context = name_pin.binder.reduce_class_type
184
182
  pin.proxy(reduced_context)
@@ -234,7 +232,7 @@ module Solargraph
234
232
  # @param locals [::Array<Pin::LocalVariable, Pin::Parameter>]
235
233
  # @return [Pin::ProxyType]
236
234
  def inner_process_macro pin, macro, api_map, context, locals
237
- vals = arguments.map{ |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals), source: :chain) }
235
+ vals = arguments.map { |c| Pin::ProxyType.anonymous(c.infer(api_map, pin, locals), source: :chain) }
238
236
  txt = macro.tag.text.clone
239
237
  # @sg-ignore Need to add nil check here
240
238
  if txt.empty? && macro.tag.name
@@ -260,7 +258,7 @@ module Solargraph
260
258
  # @param context [ComplexType]
261
259
  # @return [ComplexType, nil]
262
260
  def extra_return_type docstring, context
263
- if docstring.has_tag?('return_single_parameter') #&& context.subtypes.one?
261
+ if docstring.has_tag?('return_single_parameter') # && context.subtypes.one?
264
262
  return context.subtypes.first || ComplexType::UNDEFINED
265
263
  elsif docstring.has_tag?('return_value_parameter') && context.value_types.one?
266
264
  return context.value_types.first
@@ -270,7 +268,7 @@ module Solargraph
270
268
 
271
269
  # @param name_pin [Pin::Base]
272
270
  # @return [Pin::Method, nil]
273
- def find_method_pin(name_pin)
271
+ def find_method_pin name_pin
274
272
  method_pin = name_pin
275
273
  until method_pin.is_a?(Pin::Method)
276
274
  # @sg-ignore Need to support this in flow sensitive typing
@@ -287,7 +285,7 @@ module Solargraph
287
285
  method_pin = find_method_pin(name_pin)
288
286
  return [] if method_pin.nil?
289
287
  pins = api_map.get_method_stack(method_pin.namespace, method_pin.name, scope: method_pin.context.scope)
290
- pins.reject{|p| p.path == name_pin.path}
288
+ pins.reject { |p| p.path == name_pin.path }
291
289
  end
292
290
 
293
291
  # @param api_map [ApiMap]
@@ -324,7 +322,7 @@ module Solargraph
324
322
  # @param block_parameter_types [::Array<ComplexType>]
325
323
  # @param locals [::Array<Pin::LocalVariable>]
326
324
  # @return [ComplexType, nil]
327
- def block_symbol_call_type(api_map, context, block_parameter_types, locals)
325
+ def block_symbol_call_type api_map, context, block_parameter_types, locals
328
326
  # Ruby's shorthand for sending the passed in method name
329
327
  # to the first yield parameter with no arguments
330
328
  # @sg-ignore Need to add nil check here
@@ -342,7 +340,7 @@ module Solargraph
342
340
 
343
341
  # @param api_map [ApiMap]
344
342
  # @return [Pin::Block, nil]
345
- def find_block_pin(api_map)
343
+ def find_block_pin api_map
346
344
  # @sg-ignore Need to add nil check here
347
345
  node_location = Solargraph::Location.from_node(block.node)
348
346
  return if node_location.nil?
@@ -353,10 +351,9 @@ module Solargraph
353
351
 
354
352
  # @param api_map [ApiMap]
355
353
  # @param name_pin [Pin::Base]
356
- # @param block_parameter_types [::Array<ComplexType>]
357
354
  # @param locals [::Array<Pin::LocalVariable>]
358
355
  # @return [ComplexType, nil]
359
- def block_call_type(api_map, name_pin, locals)
356
+ def block_call_type api_map, name_pin, locals
360
357
  return nil unless with_block?
361
358
 
362
359
  block_pin = find_block_pin(api_map)
@@ -366,6 +363,14 @@ module Solargraph
366
363
  # @sg-ignore Need to add nil check here
367
364
  block.infer(api_map, block_pin, locals)
368
365
  end
366
+
367
+ protected
368
+
369
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
370
+ def equality_fields
371
+ # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
372
+ super + [arguments, block]
373
+ end
369
374
  end
370
375
  end
371
376
  end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class ClassVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_class_variable_pins(name_pin.context.namespace).select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class ClassVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_class_variable_pins(name_pin.context.namespace).select { |p| p.name == word }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -6,12 +6,14 @@ module Solargraph
6
6
  class Constant < Link
7
7
  def initialize word
8
8
  @word = word
9
+
10
+ super
9
11
  end
10
12
 
11
13
  def resolve api_map, name_pin, locals
12
14
  return [Pin::ROOT_PIN] if word.empty?
13
15
  if word.start_with?('::')
14
- base = word[2..-1]
16
+ base = word[2..]
15
17
  gates = ['']
16
18
  else
17
19
  base = word
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class GlobalVariable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_global_variable_pins.select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class GlobalVariable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_global_variable_pins.select { |p| p.name == word }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -12,12 +12,6 @@ module Solargraph
12
12
  @splatted = splatted
13
13
  end
14
14
 
15
- # @sg-ignore Fix "Not enough arguments to Module#protected"
16
- protected def equality_fields
17
- # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
18
- super + [@splatted]
19
- end
20
-
21
15
  def word
22
16
  @word ||= "<#{@type}>"
23
17
  end
@@ -29,6 +23,14 @@ module Solargraph
29
23
  def splatted?
30
24
  @splatted
31
25
  end
26
+
27
+ protected
28
+
29
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
30
+ def equality_fields
31
+ # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
32
+ super + [@splatted]
33
+ end
32
34
  end
33
35
  end
34
36
  end
@@ -4,25 +4,26 @@ module Solargraph
4
4
  class Source
5
5
  class Chain
6
6
  class If < Link
7
- def word
8
- '<if>'
9
- end
10
-
11
7
  # @param links [::Array<Chain>]
12
8
  def initialize links
9
+ super('<if>')
10
+
13
11
  @links = links
14
12
  end
15
13
 
14
+ def resolve api_map, name_pin, locals
15
+ types = @links.map { |link| link.infer(api_map, name_pin, locals) }
16
+ [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')),
17
+ source: :chain)]
18
+ end
19
+
20
+ protected
21
+
16
22
  # @sg-ignore Fix "Not enough arguments to Module#protected"
17
- protected def equality_fields
23
+ def equality_fields
18
24
  # @sg-ignore literal arrays in this module turn into ::Solargraph::Source::Chain::Array
19
25
  super + [@links]
20
26
  end
21
-
22
- def resolve api_map, name_pin, locals
23
- types = @links.map { |link| link.infer(api_map, name_pin, locals) }
24
- [Solargraph::Pin::ProxyType.anonymous(Solargraph::ComplexType.try_parse(types.map(&:tag).uniq.join(', ')), source: :chain)]
25
- end
26
27
  end
27
28
  end
28
29
  end
@@ -18,7 +18,9 @@ module Solargraph
18
18
  # type ::Array<::Solargraph::Pin::BaseVariable, ::NilClass>
19
19
  # for Solargraph::Source::Chain::InstanceVariable#resolve
20
20
  def resolve api_map, name_pin, locals
21
- ivars = api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select{|p| p.name == word}
21
+ ivars = api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select do |p|
22
+ p.name == word
23
+ end
22
24
  out = api_map.var_at_location(ivars, word, name_pin, location)
23
25
  [out].compact
24
26
  end
@@ -1,109 +1,99 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Link
7
- include Equality
8
-
9
- # @return [String]
10
- attr_reader :word
11
-
12
- # @return [Pin::Base]
13
- attr_accessor :last_context
14
-
15
- # @param word [String]
16
- def initialize word = '<undefined>'
17
- @word = word
18
- end
19
-
20
- # @sg-ignore two problems - Declared return type
21
- # ::Solargraph::Source::Chain::Array does not match inferred
22
- # type ::Array(::Class<::Solargraph::Source::Chain::Link>,
23
- # ::String) for
24
- # Solargraph::Source::Chain::Link#equality_fields
25
- # and
26
- # Not enough arguments to Module#protected
27
- protected def equality_fields
28
- [self.class, word]
29
- end
30
-
31
- def undefined?
32
- word == '<undefined>'
33
- end
34
-
35
- def constant?
36
- is_a?(Chain::Constant)
37
- end
38
-
39
- # @param api_map [ApiMap]
40
- # @param name_pin [Pin::Base]
41
- # @param locals [::Array<Pin::Base>]
42
- # @return [::Array<Pin::Base>]
43
- def resolve api_map, name_pin, locals
44
- []
45
- end
46
-
47
- # debugging description of contents; not for machine use
48
- # @return [String]
49
- def desc
50
- word
51
- end
52
-
53
- def to_s
54
- desc
55
- end
56
-
57
- def inspect
58
- "#<#{self.class} - `#{self.desc}`>"
59
- end
60
-
61
- def head?
62
- @head ||= false
63
- end
64
-
65
- # Make a copy of this link marked as the head of a chain
66
- #
67
- # @return [self]
68
- def clone_head
69
- clone.mark_head(true)
70
- end
71
-
72
- # Make a copy of this link unmarked as the head of a chain
73
- #
74
- # @return [self]
75
- def clone_body
76
- clone.mark_head(false)
77
- end
78
-
79
- def nullable?
80
- false
81
- end
82
-
83
- # debugging description of contents; not for machine use
84
- #
85
- # @return [String]
86
- def desc
87
- word
88
- end
89
-
90
- def inspect
91
- "#<#{self.class} - `#{self.desc}`>"
92
- end
93
-
94
- include Logging
95
-
96
- protected
97
-
98
- # Mark whether this link is the head of a chain
99
- #
100
- # @param bool [Boolean]
101
- # @return [self]
102
- def mark_head bool
103
- @head = bool
104
- self
105
- end
106
- end
107
- end
108
- end
109
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Link
7
+ include Equality
8
+
9
+ # @return [String]
10
+ attr_reader :word
11
+
12
+ # @return [Pin::Base]
13
+ attr_accessor :last_context
14
+
15
+ # @param word [String]
16
+ def initialize word = '<undefined>'
17
+ @word = word
18
+ end
19
+
20
+ def undefined?
21
+ word == '<undefined>'
22
+ end
23
+
24
+ def constant?
25
+ is_a?(Chain::Constant)
26
+ end
27
+
28
+ # @param api_map [ApiMap]
29
+ # @param name_pin [Pin::Base]
30
+ # @param locals [::Array<Pin::Base>]
31
+ # @return [::Array<Pin::Base>]
32
+ def resolve api_map, name_pin, locals
33
+ []
34
+ end
35
+
36
+ def to_s
37
+ desc
38
+ end
39
+
40
+ def inspect
41
+ "#<#{self.class} - `#{desc}`>"
42
+ end
43
+
44
+ def head?
45
+ @head ||= false
46
+ end
47
+
48
+ # Make a copy of this link marked as the head of a chain
49
+ #
50
+ # @return [self]
51
+ def clone_head
52
+ clone.mark_head(true)
53
+ end
54
+
55
+ # Make a copy of this link unmarked as the head of a chain
56
+ #
57
+ # @return [self]
58
+ def clone_body
59
+ clone.mark_head(false)
60
+ end
61
+
62
+ def nullable?
63
+ false
64
+ end
65
+
66
+ # debugging description of contents; not for machine use
67
+ #
68
+ # @return [String]
69
+ def desc
70
+ word
71
+ end
72
+
73
+ include Logging
74
+
75
+ protected
76
+
77
+ # @sg-ignore two problems - Declared return type
78
+ # ::Solargraph::Source::Chain::Array does not match inferred
79
+ # type ::Array(::Class<::Solargraph::Source::Chain::Link>,
80
+ # ::String) for
81
+ # Solargraph::Source::Chain::Link#equality_fields
82
+ # and
83
+ # Not enough arguments to Module#protected
84
+ def equality_fields
85
+ [self.class, word]
86
+ end
87
+
88
+ # Mark whether this link is the head of a chain
89
+ #
90
+ # @param bool [Boolean]
91
+ # @return [self]
92
+ def mark_head bool
93
+ @head = bool
94
+ self
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -6,15 +6,13 @@ module Solargraph
6
6
  class Source
7
7
  class Chain
8
8
  class Literal < Link
9
- def word
10
- @word ||= "<#{@type}>"
11
- end
12
-
13
- attr_reader :value
9
+ attr_reader :word, :value
14
10
 
15
11
  # @param type [String]
16
12
  # @param node [Parser::AST::Node, Object]
17
13
  def initialize type, node
14
+ super("<#{type}>")
15
+
18
16
  if node.is_a?(::Parser::AST::Node)
19
17
  # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
20
18
  if node.type == :true
@@ -23,7 +21,7 @@ module Solargraph
23
21
  elsif node.type == :false
24
22
  @value = false
25
23
  # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
26
- elsif [:int, :sym].include?(node.type)
24
+ elsif %i[int sym].include?(node.type)
27
25
  # @sg-ignore flow sensitive typing needs to narrow down type with an if is_a? check
28
26
  @value = node.children.first
29
27
  end
@@ -4,14 +4,12 @@ module Solargraph
4
4
  class Source
5
5
  class Chain
6
6
  class Or < Link
7
- def word
8
- '<or>'
9
- end
10
-
11
7
  attr_reader :links
12
8
 
13
9
  # @param links [::Array<Chain>]
14
10
  def initialize links
11
+ super('<or>')
12
+
15
13
  @links = links
16
14
  end
17
15
 
@@ -1,11 +1,13 @@
1
- module Solargraph
2
- class Source
3
- class Chain
4
- class QCall < Call
5
- def nullable?
6
- true
7
- end
8
- end
9
- end
10
- end
11
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class QCall < Call
7
+ def nullable?
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,13 +1,15 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- class Source
5
- class Chain
6
- class Variable < Link
7
- def resolve api_map, name_pin, locals
8
- api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select{|p| p.name == word}
9
- end
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class Variable < Link
7
+ def resolve api_map, name_pin, locals
8
+ api_map.get_instance_variable_pins(name_pin.context.namespace, name_pin.context.scope).select do |p|
9
+ p.name == word
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end