solargraph 0.58.3 → 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 (201) 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 +41 -38
  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 -10
  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/bench.rb +45 -45
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +16 -2
  21. data/lib/solargraph/complex_type/unique_type.rb +170 -20
  22. data/lib/solargraph/complex_type.rb +119 -14
  23. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  24. data/lib/solargraph/convention/data_definition/data_definition_node.rb +3 -1
  25. data/lib/solargraph/convention/data_definition.rb +4 -1
  26. data/lib/solargraph/convention/gemfile.rb +15 -15
  27. data/lib/solargraph/convention/gemspec.rb +23 -23
  28. data/lib/solargraph/convention/rakefile.rb +17 -17
  29. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -0
  30. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +1 -0
  31. data/lib/solargraph/convention/struct_definition.rb +5 -1
  32. data/lib/solargraph/convention.rb +78 -78
  33. data/lib/solargraph/converters/dd.rb +17 -17
  34. data/lib/solargraph/converters/dl.rb +15 -15
  35. data/lib/solargraph/converters/dt.rb +15 -15
  36. data/lib/solargraph/converters/misc.rb +1 -1
  37. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  38. data/lib/solargraph/diagnostics/rubocop.rb +1 -0
  39. data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
  40. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  41. data/lib/solargraph/diagnostics/update_errors.rb +41 -41
  42. data/lib/solargraph/doc_map.rb +134 -373
  43. data/lib/solargraph/equality.rb +1 -1
  44. data/lib/solargraph/gem_pins.rb +14 -15
  45. data/lib/solargraph/language_server/error_codes.rb +20 -20
  46. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  47. data/lib/solargraph/language_server/host/dispatch.rb +1 -0
  48. data/lib/solargraph/language_server/host/message_worker.rb +2 -1
  49. data/lib/solargraph/language_server/host/sources.rb +1 -0
  50. data/lib/solargraph/language_server/host.rb +6 -1
  51. data/lib/solargraph/language_server/message/base.rb +97 -97
  52. data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
  53. data/lib/solargraph/language_server/message/completion_item/resolve.rb +60 -60
  54. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -7
  55. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  56. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  57. data/lib/solargraph/language_server/message/extended/download_core.rb +19 -19
  58. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  59. data/lib/solargraph/language_server/message/initialize.rb +191 -191
  60. data/lib/solargraph/language_server/message/text_document/completion.rb +2 -0
  61. data/lib/solargraph/language_server/message/text_document/definition.rb +2 -0
  62. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
  63. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +2 -0
  64. data/lib/solargraph/language_server/message/text_document/formatting.rb +2 -0
  65. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  66. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
  67. data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
  68. data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
  69. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -0
  70. data/lib/solargraph/language_server/message/text_document/type_definition.rb +2 -0
  71. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +35 -35
  72. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +40 -40
  73. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +26 -26
  74. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -0
  75. data/lib/solargraph/language_server/message.rb +94 -94
  76. data/lib/solargraph/language_server/request.rb +27 -27
  77. data/lib/solargraph/language_server/transport/data_reader.rb +74 -74
  78. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  79. data/lib/solargraph/library.rb +59 -13
  80. data/lib/solargraph/location.rb +9 -4
  81. data/lib/solargraph/logging.rb +21 -1
  82. data/lib/solargraph/page.rb +92 -92
  83. data/lib/solargraph/parser/comment_ripper.rb +7 -0
  84. data/lib/solargraph/parser/flow_sensitive_typing.rb +330 -102
  85. data/lib/solargraph/parser/node_processor/base.rb +32 -2
  86. data/lib/solargraph/parser/node_processor.rb +7 -6
  87. data/lib/solargraph/parser/parser_gem/class_methods.rb +28 -10
  88. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  89. data/lib/solargraph/parser/parser_gem/node_chainer.rb +31 -6
  90. data/lib/solargraph/parser/parser_gem/node_methods.rb +27 -7
  91. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  92. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +2 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -11
  95. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +7 -0
  96. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +37 -37
  97. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  98. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +3 -2
  99. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  100. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  101. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +2 -2
  102. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  103. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  104. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  105. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +1 -0
  106. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +12 -7
  107. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  108. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  109. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +5 -1
  110. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  111. data/lib/solargraph/parser/parser_gem.rb +12 -12
  112. data/lib/solargraph/parser/region.rb +9 -3
  113. data/lib/solargraph/parser/snippet.rb +1 -1
  114. data/lib/solargraph/parser.rb +23 -23
  115. data/lib/solargraph/pin/base.rb +53 -21
  116. data/lib/solargraph/pin/base_variable.rb +312 -20
  117. data/lib/solargraph/pin/block.rb +26 -4
  118. data/lib/solargraph/pin/breakable.rb +5 -1
  119. data/lib/solargraph/pin/callable.rb +50 -3
  120. data/lib/solargraph/pin/closure.rb +2 -6
  121. data/lib/solargraph/pin/common.rb +20 -5
  122. data/lib/solargraph/pin/compound_statement.rb +55 -0
  123. data/lib/solargraph/pin/constant.rb +45 -45
  124. data/lib/solargraph/pin/conversions.rb +2 -1
  125. data/lib/solargraph/pin/delegated_method.rb +15 -4
  126. data/lib/solargraph/pin/documenting.rb +1 -0
  127. data/lib/solargraph/pin/instance_variable.rb +5 -1
  128. data/lib/solargraph/pin/keyword.rb +0 -4
  129. data/lib/solargraph/pin/local_variable.rb +13 -57
  130. data/lib/solargraph/pin/method.rb +90 -42
  131. data/lib/solargraph/pin/method_alias.rb +8 -0
  132. data/lib/solargraph/pin/namespace.rb +7 -1
  133. data/lib/solargraph/pin/parameter.rb +76 -13
  134. data/lib/solargraph/pin/proxy_type.rb +2 -1
  135. data/lib/solargraph/pin/reference/override.rb +1 -1
  136. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  137. data/lib/solargraph/pin/reference.rb +2 -0
  138. data/lib/solargraph/pin/search.rb +1 -0
  139. data/lib/solargraph/pin/signature.rb +8 -0
  140. data/lib/solargraph/pin/symbol.rb +1 -1
  141. data/lib/solargraph/pin/until.rb +1 -1
  142. data/lib/solargraph/pin/while.rb +1 -1
  143. data/lib/solargraph/pin.rb +2 -0
  144. data/lib/solargraph/pin_cache.rb +477 -57
  145. data/lib/solargraph/position.rb +12 -26
  146. data/lib/solargraph/range.rb +6 -6
  147. data/lib/solargraph/rbs_map/conversions.rb +33 -10
  148. data/lib/solargraph/rbs_map/core_fills.rb +84 -84
  149. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  150. data/lib/solargraph/rbs_map/stdlib_map.rb +34 -5
  151. data/lib/solargraph/rbs_map.rb +74 -20
  152. data/lib/solargraph/server_methods.rb +16 -16
  153. data/lib/solargraph/shell.rb +73 -39
  154. data/lib/solargraph/source/chain/array.rb +37 -37
  155. data/lib/solargraph/source/chain/call.rb +52 -17
  156. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  157. data/lib/solargraph/source/chain/constant.rb +2 -0
  158. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  159. data/lib/solargraph/source/chain/hash.rb +1 -0
  160. data/lib/solargraph/source/chain/if.rb +1 -0
  161. data/lib/solargraph/source/chain/instance_variable.rb +22 -1
  162. data/lib/solargraph/source/chain/link.rb +109 -109
  163. data/lib/solargraph/source/chain/literal.rb +5 -0
  164. data/lib/solargraph/source/chain/or.rb +9 -1
  165. data/lib/solargraph/source/chain/q_call.rb +11 -11
  166. data/lib/solargraph/source/chain/variable.rb +13 -13
  167. data/lib/solargraph/source/chain/z_super.rb +30 -30
  168. data/lib/solargraph/source/chain.rb +25 -22
  169. data/lib/solargraph/source/change.rb +9 -2
  170. data/lib/solargraph/source/cursor.rb +7 -1
  171. data/lib/solargraph/source/source_chainer.rb +13 -3
  172. data/lib/solargraph/source/updater.rb +4 -0
  173. data/lib/solargraph/source.rb +33 -7
  174. data/lib/solargraph/source_map/clip.rb +13 -2
  175. data/lib/solargraph/source_map/data.rb +4 -1
  176. data/lib/solargraph/source_map/mapper.rb +24 -1
  177. data/lib/solargraph/source_map.rb +14 -6
  178. data/lib/solargraph/type_checker/problem.rb +3 -1
  179. data/lib/solargraph/type_checker/rules.rb +75 -2
  180. data/lib/solargraph/type_checker.rb +111 -30
  181. data/lib/solargraph/version.rb +1 -1
  182. data/lib/solargraph/workspace/config.rb +3 -1
  183. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  184. data/lib/solargraph/workspace/require_paths.rb +1 -0
  185. data/lib/solargraph/workspace.rb +158 -16
  186. data/lib/solargraph/yard_map/helpers.rb +2 -1
  187. data/lib/solargraph/yard_map/mapper/to_method.rb +5 -1
  188. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  189. data/lib/solargraph/yard_map/mapper.rb +5 -0
  190. data/lib/solargraph/yard_tags.rb +20 -20
  191. data/lib/solargraph/yardoc.rb +33 -23
  192. data/lib/solargraph.rb +24 -3
  193. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  194. data/rbs/fills/tuple/tuple.rbs +28 -0
  195. data/rbs/shims/ast/0/node.rbs +1 -1
  196. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  197. data/solargraph.gemspec +2 -1
  198. metadata +12 -7
  199. data/lib/solargraph/type_checker/checks.rb +0 -124
  200. data/lib/solargraph/type_checker/param_def.rb +0 -37
  201. data/lib/solargraph/yard_map/to_method.rb +0 -89
@@ -9,7 +9,7 @@ module Solargraph
9
9
 
10
10
  def process
11
11
  loc = get_node_location(node)
12
- pins.push Solargraph::Pin::InstanceVariable.new(
12
+ ivars.push Solargraph::Pin::InstanceVariable.new(
13
13
  location: loc,
14
14
  closure: region.closure,
15
15
  name: node.children[0].to_s,
@@ -19,9 +19,10 @@ module Solargraph
19
19
  )
20
20
  if region.visibility == :module_function
21
21
  here = get_node_start_position(node)
22
+ # @type [Pin::Closure, nil]
22
23
  named_path = named_path_pin(here)
23
24
  if named_path.is_a?(Pin::Method)
24
- pins.push Solargraph::Pin::InstanceVariable.new(
25
+ ivars.push Solargraph::Pin::InstanceVariable.new(
25
26
  location: loc,
26
27
  closure: Pin::Namespace.new(type: :module, closure: region.closure.closure, name: region.closure.name),
27
28
  name: node.children[0].to_s,
@@ -9,6 +9,7 @@ module Solargraph
9
9
 
10
10
  def process
11
11
  here = get_node_start_position(node)
12
+ # @sg-ignore Need to add nil check here
12
13
  presence = Range.new(here, region.closure.location.range.ending)
13
14
  loc = get_node_location(node)
14
15
  locals.push Solargraph::Pin::LocalVariable.new(
@@ -37,8 +37,10 @@ module Solargraph
37
37
  pin = if lhs.type == :lvasgn
38
38
  # lvasgn is a local variable
39
39
  locals.find { |l| l.location == location }
40
+ elsif lhs.type == :ivasgn
41
+ # ivasgn is an instance variable assignment
42
+ ivars.find { |iv| iv.location == location }
40
43
  else
41
- # e.g., ivasgn is an instance variable, etc
42
44
  pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
43
45
  end
44
46
  # @todo in line below, nothing in typechecking alerts
@@ -57,7 +57,7 @@ module Solargraph
57
57
  [callee,
58
58
  asgn_method,
59
59
  node.updated(:send, [call, operator, argument])])
60
- NodeProcessor.process(new_send, region, pins, locals)
60
+ NodeProcessor.process(new_send, region, pins, locals, ivars)
61
61
  end
62
62
 
63
63
  # @param asgn [Parser::AST::Node] the target of the assignment
@@ -89,7 +89,7 @@ module Solargraph
89
89
  ]
90
90
  send_node = node.updated(:send, send_children)
91
91
  new_asgn = node.updated(asgn.type, [variable_name, send_node])
92
- NodeProcessor.process(new_asgn, region, pins, locals)
92
+ NodeProcessor.process(new_asgn, region, pins, locals, ivars)
93
93
  end
94
94
  end
95
95
  end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class OrNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ process_children
12
+
13
+ FlowSensitiveTyping.new(locals,
14
+ ivars,
15
+ enclosing_breakable_pin,
16
+ enclosing_compound_statement_pin).process_or(node)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -8,7 +8,7 @@ module Solargraph
8
8
  # @return [void]
9
9
  def process
10
10
  new_node = node.updated(node.children[0].type, node.children[0].children + [node.children[1]])
11
- NodeProcessor.process(new_node, region, pins, locals)
11
+ NodeProcessor.process(new_node, region, pins, locals, ivars)
12
12
  end
13
13
  end
14
14
  end
@@ -11,6 +11,7 @@ module Solargraph
11
11
  def process
12
12
  if node.children[1] # Exception local variable name
13
13
  here = get_node_start_position(node.children[1])
14
+ # @sg-ignore Need to add nil check here
14
15
  presence = Range.new(here, region.closure.location.range.ending)
15
16
  loc = get_node_location(node.children[1])
16
17
  types = if node.children[0].nil?
@@ -29,7 +30,7 @@ module Solargraph
29
30
  source: :parser
30
31
  )
31
32
  end
32
- NodeProcessor.process(node.children[2], region, pins, locals)
33
+ NodeProcessor.process(node.children[2], region, pins, locals, ivars)
33
34
  end
34
35
  end
35
36
  end
@@ -5,6 +5,7 @@ module Solargraph
5
5
  module ParserGem
6
6
  module NodeProcessors
7
7
  class SclassNode < Parser::NodeProcessor::Base
8
+ # @sg-ignore @override is adding, not overriding
8
9
  def process
9
10
  sclass = node.children[0]
10
11
  # @todo Changing Parser::AST::Node to AST::Node below will
@@ -7,6 +7,7 @@ module Solargraph
7
7
  class SendNode < Parser::NodeProcessor::Base
8
8
  include ParserGem::NodeMethods
9
9
 
10
+ # @sg-ignore @override is adding, not overriding
10
11
  def process
11
12
  # @sg-ignore Variable type could not be inferred for method_name
12
13
  # @type [Symbol]
@@ -53,6 +54,7 @@ module Solargraph
53
54
  # @return [void]
54
55
  def process_visibility
55
56
  if (node.children.length > 2)
57
+ # @sg-ignore Need to add nil check here
56
58
  node.children[2..-1].each do |child|
57
59
  # @sg-ignore Variable type could not be inferred for method_name
58
60
  # @type [Symbol]
@@ -82,6 +84,7 @@ module Solargraph
82
84
 
83
85
  # @return [void]
84
86
  def process_attribute
87
+ # @sg-ignore Need to add nil check here
85
88
  node.children[2..-1].each do |a|
86
89
  loc = get_node_location(node)
87
90
  clos = region.closure
@@ -122,6 +125,7 @@ module Solargraph
122
125
  def process_include
123
126
  if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
124
127
  cp = region.closure
128
+ # @sg-ignore Need to add nil check here
125
129
  node.children[2..-1].each do |i|
126
130
  type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
127
131
  pins.push type.new(
@@ -138,6 +142,7 @@ module Solargraph
138
142
  def process_prepend
139
143
  if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
140
144
  cp = region.closure
145
+ # @sg-ignore Need to add nil check here
141
146
  node.children[2..-1].each do |i|
142
147
  pins.push Pin::Reference::Prepend.new(
143
148
  location: get_node_location(i),
@@ -151,6 +156,7 @@ module Solargraph
151
156
 
152
157
  # @return [void]
153
158
  def process_extend
159
+ # @sg-ignore Need to add nil check here
154
160
  node.children[2..-1].each do |i|
155
161
  loc = get_node_location(node)
156
162
  if i.type == :self
@@ -193,6 +199,7 @@ module Solargraph
193
199
  # @todo Smelly instance variable access
194
200
  region.instance_variable_set(:@visibility, :module_function)
195
201
  elsif node.children[2].type == :sym || node.children[2].type == :str
202
+ # @sg-ignore Need to add nil check here
196
203
  node.children[2..-1].each do |x|
197
204
  cn = x.children[0].to_s
198
205
  # @type [Pin::Method, nil]
@@ -221,23 +228,21 @@ module Solargraph
221
228
  node: ref.node,
222
229
  source: :parser)
223
230
  pins.push mm, cm
224
- pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
225
- pins.delete ivar
226
- pins.push Solargraph::Pin::InstanceVariable.new(
231
+ ivars.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
232
+ ivars.delete ivar
233
+ ivars.push Solargraph::Pin::InstanceVariable.new(
227
234
  location: ivar.location,
228
235
  closure: cm,
229
236
  name: ivar.name,
230
237
  comments: ivar.comments,
231
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
232
238
  assignment: ivar.assignment,
233
239
  source: :parser
234
240
  )
235
- pins.push Solargraph::Pin::InstanceVariable.new(
241
+ ivars.push Solargraph::Pin::InstanceVariable.new(
236
242
  location: ivar.location,
237
243
  closure: mm,
238
244
  name: ivar.name,
239
245
  comments: ivar.comments,
240
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
241
246
  assignment: ivar.assignment,
242
247
  source: :parser
243
248
  )
@@ -245,7 +250,7 @@ module Solargraph
245
250
  end
246
251
  end
247
252
  elsif node.children[2].type == :def
248
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
253
+ NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals, ivars
249
254
  end
250
255
  end
251
256
 
@@ -1,29 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- module NodeProcessors
7
- class UntilNode < Parser::NodeProcessor::Base
8
- include ParserGem::NodeMethods
9
-
10
- def process
11
- location = get_node_location(node)
12
- # Note - this should not be considered a block, as the
13
- # until statement doesn't create a closure - e.g.,
14
- # variables created inside can be seen from outside as
15
- # well
16
- pins.push Solargraph::Pin::Until.new(
17
- location: location,
18
- closure: region.closure,
19
- node: node,
20
- comments: comments_for(node),
21
- source: :parser,
22
- )
23
- process_children region
24
- end
25
- end
26
- end
27
- end
28
- end
29
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class UntilNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ location = get_node_location(node)
12
+ # Note - this should not be considered a block, as the
13
+ # until statement doesn't create a closure - e.g.,
14
+ # variables created inside can be seen from outside as
15
+ # well
16
+ pins.push Solargraph::Pin::Until.new(
17
+ location: location,
18
+ closure: region.closure,
19
+ node: node,
20
+ comments: comments_for(node),
21
+ source: :parser,
22
+ )
23
+ process_children region
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class WhenNode < Parser::NodeProcessor::Base
8
+ include ParserGem::NodeMethods
9
+
10
+ def process
11
+ pins.push Solargraph::Pin::CompoundStatement.new(
12
+ location: get_node_location(node),
13
+ closure: region.closure,
14
+ node: node,
15
+ source: :parser,
16
+ )
17
+ process_children
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -8,7 +8,11 @@ module Solargraph
8
8
  include ParserGem::NodeMethods
9
9
 
10
10
  def process
11
- location = get_node_location(node)
11
+ FlowSensitiveTyping.new(locals,
12
+ ivars,
13
+ enclosing_breakable_pin,
14
+ enclosing_compound_statement_pin).process_while(node)
15
+
12
16
  # Note - this should not be considered a block, as the
13
17
  # while statement doesn't create a closure - e.g.,
14
18
  # variables created inside can be seen from outside as
@@ -27,8 +27,10 @@ module Solargraph
27
27
  autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
28
28
  autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
29
29
  autoload :UntilNode, 'solargraph/parser/parser_gem/node_processors/until_node'
30
+ autoload :WhenNode, 'solargraph/parser/parser_gem/node_processors/when_node'
30
31
  autoload :WhileNode, 'solargraph/parser/parser_gem/node_processors/while_node'
31
32
  autoload :AndNode, 'solargraph/parser/parser_gem/node_processors/and_node'
33
+ autoload :OrNode, 'solargraph/parser/parser_gem/node_processors/or_node'
32
34
  end
33
35
  end
34
36
 
@@ -63,8 +65,10 @@ module Solargraph
63
65
  register :op_asgn, ParserGem::NodeProcessors::OpasgnNode
64
66
  register :sym, ParserGem::NodeProcessors::SymNode
65
67
  register :until, ParserGem::NodeProcessors::UntilNode
68
+ register :when, ParserGem::NodeProcessors::WhenNode
66
69
  register :while, ParserGem::NodeProcessors::WhileNode
67
70
  register :and, ParserGem::NodeProcessors::AndNode
71
+ register :or, ParserGem::NodeProcessors::OrNode
68
72
  end
69
73
  end
70
74
  end
@@ -1,12 +1,12 @@
1
- module Solargraph
2
- module Parser
3
- module ParserGem
4
- autoload :FlawedBuilder, 'solargraph/parser/parser_gem/flawed_builder'
5
- autoload :ClassMethods, 'solargraph/parser/parser_gem/class_methods'
6
- autoload :NodeMethods, 'solargraph/parser/parser_gem/node_methods'
7
- autoload :NodeChainer, 'solargraph/parser/parser_gem/node_chainer'
8
- end
9
- end
10
- end
11
-
12
- require 'solargraph/parser/parser_gem/node_processors'
1
+ module Solargraph
2
+ module Parser
3
+ module ParserGem
4
+ autoload :FlawedBuilder, 'solargraph/parser/parser_gem/flawed_builder'
5
+ autoload :ClassMethods, 'solargraph/parser/parser_gem/class_methods'
6
+ autoload :NodeMethods, 'solargraph/parser/parser_gem/node_methods'
7
+ autoload :NodeChainer, 'solargraph/parser/parser_gem/node_chainer'
8
+ end
9
+ end
10
+ end
11
+
12
+ require 'solargraph/parser/parser_gem/node_processors'
@@ -22,7 +22,6 @@ module Solargraph
22
22
  attr_reader :lvars
23
23
 
24
24
  # @param source [Source]
25
- # @param namespace [String]
26
25
  # @param closure [Pin::Closure, nil]
27
26
  # @param scope [Symbol, nil]
28
27
  # @param visibility [Symbol]
@@ -30,18 +29,25 @@ module Solargraph
30
29
  def initialize source: Solargraph::Source.load_string(''), closure: nil,
31
30
  scope: nil, visibility: :public, lvars: []
32
31
  @source = source
33
- # @closure = closure
34
32
  @closure = closure || Pin::Namespace.new(name: '', location: source.location, source: :parser)
35
33
  @scope = scope
36
34
  @visibility = visibility
37
35
  @lvars = lvars
38
36
  end
39
37
 
40
- # @return [String]
38
+ # @return [String, nil]
41
39
  def filename
42
40
  source.filename
43
41
  end
44
42
 
43
+ # @return [Pin::Namespace, nil]
44
+ def namespace_pin
45
+ ns = closure
46
+ # @sg-ignore flow sensitive typing needs to handle while
47
+ ns = ns.closure while ns && !ns.is_a?(Pin::Namespace)
48
+ ns
49
+ end
50
+
45
51
  # Generate a new Region with the provided attribute changes.
46
52
  #
47
53
  # @param closure [Pin::Closure, nil]
@@ -1,7 +1,7 @@
1
1
  module Solargraph
2
2
  module Parser
3
3
  class Snippet
4
- # @return [Range]
4
+ # @return [Solargraph::Range]
5
5
  attr_reader :range
6
6
  # @return [String]
7
7
  attr_reader :text
@@ -1,23 +1,23 @@
1
- module Solargraph
2
- module Parser
3
- autoload :CommentRipper, 'solargraph/parser/comment_ripper'
4
- autoload :ParserGem, 'solargraph/parser/parser_gem'
5
- autoload :Region, 'solargraph/parser/region'
6
- autoload :NodeProcessor, 'solargraph/parser/node_processor'
7
- autoload :FlowSensitiveTyping, 'solargraph/parser/flow_sensitive_typing'
8
- autoload :Snippet, 'solargraph/parser/snippet'
9
-
10
- class SyntaxError < StandardError
11
- end
12
-
13
- # @deprecated
14
- Legacy = ParserGem
15
-
16
- ClassMethods = ParserGem::ClassMethods
17
- # @todo should be able to just 'extend ClassMethods' here and
18
- # typecheck things off it in strict mode
19
- extend ParserGem::ClassMethods
20
-
21
- NodeMethods = ParserGem::NodeMethods
22
- end
23
- end
1
+ module Solargraph
2
+ module Parser
3
+ autoload :CommentRipper, 'solargraph/parser/comment_ripper'
4
+ autoload :ParserGem, 'solargraph/parser/parser_gem'
5
+ autoload :Region, 'solargraph/parser/region'
6
+ autoload :NodeProcessor, 'solargraph/parser/node_processor'
7
+ autoload :FlowSensitiveTyping, 'solargraph/parser/flow_sensitive_typing'
8
+ autoload :Snippet, 'solargraph/parser/snippet'
9
+
10
+ class SyntaxError < StandardError
11
+ end
12
+
13
+ # @deprecated
14
+ Legacy = ParserGem
15
+
16
+ ClassMethods = ParserGem::ClassMethods
17
+ # @todo should be able to just 'extend ClassMethods' here and
18
+ # typecheck things off it in strict mode
19
+ extend ParserGem::ClassMethods
20
+
21
+ NodeMethods = ParserGem::NodeMethods
22
+ end
23
+ end