solargraph 0.58.3 → 0.59.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 (229) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.github/workflows/linting.yml +12 -5
  4. data/.github/workflows/plugins.yml +54 -34
  5. data/.github/workflows/rspec.yml +15 -28
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.rubocop.yml +38 -6
  8. data/.rubocop_todo.yml +53 -966
  9. data/CHANGELOG.md +24 -0
  10. data/Gemfile +3 -1
  11. data/README.md +3 -3
  12. data/Rakefile +26 -23
  13. data/bin/solargraph +2 -1
  14. data/lib/solargraph/api_map/cache.rb +3 -3
  15. data/lib/solargraph/api_map/constants.rb +12 -3
  16. data/lib/solargraph/api_map/index.rb +29 -18
  17. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  18. data/lib/solargraph/api_map/store.rb +40 -30
  19. data/lib/solargraph/api_map.rb +160 -78
  20. data/lib/solargraph/bench.rb +2 -3
  21. data/lib/solargraph/complex_type/conformance.rb +176 -0
  22. data/lib/solargraph/complex_type/type_methods.rb +31 -18
  23. data/lib/solargraph/complex_type/unique_type.rb +221 -63
  24. data/lib/solargraph/complex_type.rb +173 -59
  25. data/lib/solargraph/convention/active_support_concern.rb +111 -111
  26. data/lib/solargraph/convention/base.rb +50 -50
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +1 -1
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
  29. data/lib/solargraph/convention/data_definition.rb +5 -2
  30. data/lib/solargraph/convention/gemfile.rb +1 -1
  31. data/lib/solargraph/convention/gemspec.rb +1 -1
  32. data/lib/solargraph/convention/rakefile.rb +1 -1
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +2 -1
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
  35. data/lib/solargraph/convention/struct_definition.rb +8 -4
  36. data/lib/solargraph/convention.rb +2 -2
  37. data/lib/solargraph/converters/dd.rb +2 -0
  38. data/lib/solargraph/converters/dl.rb +2 -0
  39. data/lib/solargraph/converters/dt.rb +2 -0
  40. data/lib/solargraph/converters/misc.rb +2 -0
  41. data/lib/solargraph/diagnostics/require_not_found.rb +1 -0
  42. data/lib/solargraph/diagnostics/rubocop.rb +11 -10
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  44. data/lib/solargraph/diagnostics/type_check.rb +11 -10
  45. data/lib/solargraph/diagnostics/update_errors.rb +4 -8
  46. data/lib/solargraph/diagnostics.rb +55 -55
  47. data/lib/solargraph/doc_map.rb +38 -39
  48. data/lib/solargraph/environ.rb +52 -52
  49. data/lib/solargraph/equality.rb +4 -4
  50. data/lib/solargraph/gem_pins.rb +4 -15
  51. data/lib/solargraph/language_server/error_codes.rb +10 -10
  52. data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
  53. data/lib/solargraph/language_server/host/dispatch.rb +3 -3
  54. data/lib/solargraph/language_server/host/message_worker.rb +4 -3
  55. data/lib/solargraph/language_server/host/sources.rb +2 -1
  56. data/lib/solargraph/language_server/host.rb +35 -28
  57. data/lib/solargraph/language_server/message/base.rb +1 -1
  58. data/lib/solargraph/language_server/message/client/register_capability.rb +1 -3
  59. data/lib/solargraph/language_server/message/completion_item/resolve.rb +6 -8
  60. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +12 -18
  61. data/lib/solargraph/language_server/message/extended/document.rb +1 -0
  62. data/lib/solargraph/language_server/message/extended/document_gems.rb +7 -7
  63. data/lib/solargraph/language_server/message/extended/download_core.rb +2 -1
  64. data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
  65. data/lib/solargraph/language_server/message/extended/search.rb +1 -1
  66. data/lib/solargraph/language_server/message/initialize.rb +20 -14
  67. data/lib/solargraph/language_server/message/initialized.rb +28 -28
  68. data/lib/solargraph/language_server/message/text_document/completion.rb +10 -8
  69. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
  70. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +17 -10
  71. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -19
  72. data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
  73. data/lib/solargraph/language_server/message/text_document/hover.rb +5 -5
  74. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +13 -6
  75. data/lib/solargraph/language_server/message/text_document/references.rb +17 -10
  76. data/lib/solargraph/language_server/message/text_document/rename.rb +20 -13
  77. data/lib/solargraph/language_server/message/text_document/signature_help.rb +3 -2
  78. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
  79. data/lib/solargraph/language_server/message/text_document.rb +28 -28
  80. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +34 -28
  81. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +38 -30
  82. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +23 -17
  83. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -17
  84. data/lib/solargraph/language_server/message.rb +1 -1
  85. data/lib/solargraph/language_server/progress.rb +143 -143
  86. data/lib/solargraph/language_server/request.rb +4 -2
  87. data/lib/solargraph/language_server/transport/adapter.rb +68 -68
  88. data/lib/solargraph/language_server/transport/data_reader.rb +11 -13
  89. data/lib/solargraph/language_server/uri_helpers.rb +2 -2
  90. data/lib/solargraph/language_server.rb +20 -20
  91. data/lib/solargraph/library.rb +57 -38
  92. data/lib/solargraph/location.rb +17 -14
  93. data/lib/solargraph/logging.rb +22 -4
  94. data/lib/solargraph/page.rb +1 -1
  95. data/lib/solargraph/parser/comment_ripper.rb +19 -4
  96. data/lib/solargraph/parser/flow_sensitive_typing.rb +324 -108
  97. data/lib/solargraph/parser/node_processor/base.rb +34 -4
  98. data/lib/solargraph/parser/node_processor.rb +8 -7
  99. data/lib/solargraph/parser/parser_gem/class_methods.rb +30 -14
  100. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -1
  101. data/lib/solargraph/parser/parser_gem/node_chainer.rb +51 -25
  102. data/lib/solargraph/parser/parser_gem/node_methods.rb +181 -73
  103. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +24 -24
  104. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
  105. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
  106. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +11 -12
  108. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +36 -36
  109. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +24 -24
  110. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -3
  111. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +9 -8
  112. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +24 -24
  113. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +36 -6
  114. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
  115. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
  116. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
  117. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +40 -40
  118. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
  119. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  120. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
  121. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
  122. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
  123. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
  124. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +20 -20
  125. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +1 -1
  126. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  127. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
  128. data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
  129. data/lib/solargraph/parser/parser_gem.rb +2 -0
  130. data/lib/solargraph/parser/region.rb +9 -3
  131. data/lib/solargraph/parser/snippet.rb +3 -1
  132. data/lib/solargraph/parser.rb +2 -0
  133. data/lib/solargraph/pin/base.rb +126 -82
  134. data/lib/solargraph/pin/base_variable.rb +273 -24
  135. data/lib/solargraph/pin/block.rb +29 -6
  136. data/lib/solargraph/pin/breakable.rb +7 -1
  137. data/lib/solargraph/pin/callable.rb +65 -21
  138. data/lib/solargraph/pin/closure.rb +7 -10
  139. data/lib/solargraph/pin/common.rb +24 -6
  140. data/lib/solargraph/pin/compound_statement.rb +55 -0
  141. data/lib/solargraph/pin/constant.rb +3 -5
  142. data/lib/solargraph/pin/conversions.rb +10 -4
  143. data/lib/solargraph/pin/delegated_method.rb +19 -8
  144. data/lib/solargraph/pin/documenting.rb +4 -2
  145. data/lib/solargraph/pin/instance_variable.rb +5 -1
  146. data/lib/solargraph/pin/keyword.rb +0 -4
  147. data/lib/solargraph/pin/local_variable.rb +15 -59
  148. data/lib/solargraph/pin/method.rb +158 -104
  149. data/lib/solargraph/pin/method_alias.rb +8 -0
  150. data/lib/solargraph/pin/namespace.rb +19 -12
  151. data/lib/solargraph/pin/parameter.rb +102 -36
  152. data/lib/solargraph/pin/proxy_type.rb +4 -1
  153. data/lib/solargraph/pin/reference/override.rb +1 -1
  154. data/lib/solargraph/pin/reference/require.rb +14 -14
  155. data/lib/solargraph/pin/reference/superclass.rb +2 -0
  156. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  157. data/lib/solargraph/pin/reference.rb +20 -0
  158. data/lib/solargraph/pin/search.rb +8 -7
  159. data/lib/solargraph/pin/signature.rb +15 -12
  160. data/lib/solargraph/pin/singleton.rb +11 -11
  161. data/lib/solargraph/pin/symbol.rb +2 -1
  162. data/lib/solargraph/pin/until.rb +2 -4
  163. data/lib/solargraph/pin/while.rb +2 -4
  164. data/lib/solargraph/pin.rb +2 -0
  165. data/lib/solargraph/pin_cache.rb +22 -19
  166. data/lib/solargraph/position.rb +17 -10
  167. data/lib/solargraph/range.rb +16 -15
  168. data/lib/solargraph/rbs_map/conversions.rb +367 -231
  169. data/lib/solargraph/rbs_map/core_fills.rb +18 -11
  170. data/lib/solargraph/rbs_map/core_map.rb +24 -17
  171. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
  172. data/lib/solargraph/rbs_map.rb +76 -32
  173. data/lib/solargraph/server_methods.rb +1 -1
  174. data/lib/solargraph/shell.rb +258 -66
  175. data/lib/solargraph/source/chain/array.rb +3 -12
  176. data/lib/solargraph/source/chain/block_symbol.rb +13 -13
  177. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  178. data/lib/solargraph/source/chain/call.rb +96 -56
  179. data/lib/solargraph/source/chain/class_variable.rb +1 -1
  180. data/lib/solargraph/source/chain/constant.rb +5 -1
  181. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  182. data/lib/solargraph/source/chain/hash.rb +8 -5
  183. data/lib/solargraph/source/chain/head.rb +19 -19
  184. data/lib/solargraph/source/chain/if.rb +12 -10
  185. data/lib/solargraph/source/chain/instance_variable.rb +24 -1
  186. data/lib/solargraph/source/chain/link.rb +12 -22
  187. data/lib/solargraph/source/chain/literal.rb +22 -15
  188. data/lib/solargraph/source/chain/or.rb +10 -4
  189. data/lib/solargraph/source/chain/q_call.rb +2 -0
  190. data/lib/solargraph/source/chain/variable.rb +3 -1
  191. data/lib/solargraph/source/chain/z_super.rb +1 -3
  192. data/lib/solargraph/source/chain.rb +51 -38
  193. data/lib/solargraph/source/change.rb +12 -5
  194. data/lib/solargraph/source/cursor.rb +33 -18
  195. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  196. data/lib/solargraph/source/source_chainer.rb +56 -32
  197. data/lib/solargraph/source/updater.rb +5 -1
  198. data/lib/solargraph/source.rb +59 -35
  199. data/lib/solargraph/source_map/clip.rb +54 -30
  200. data/lib/solargraph/source_map/data.rb +4 -1
  201. data/lib/solargraph/source_map/mapper.rb +69 -42
  202. data/lib/solargraph/source_map.rb +21 -9
  203. data/lib/solargraph/type_checker/problem.rb +3 -1
  204. data/lib/solargraph/type_checker/rules.rb +81 -8
  205. data/lib/solargraph/type_checker.rb +196 -122
  206. data/lib/solargraph/version.rb +1 -1
  207. data/lib/solargraph/workspace/config.rb +14 -11
  208. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  209. data/lib/solargraph/workspace/require_paths.rb +1 -0
  210. data/lib/solargraph/workspace.rb +50 -28
  211. data/lib/solargraph/yard_map/cache.rb +25 -25
  212. data/lib/solargraph/yard_map/helpers.rb +8 -3
  213. data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
  214. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  215. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  216. data/lib/solargraph/yard_map/mapper.rb +13 -8
  217. data/lib/solargraph/yard_map.rb +17 -18
  218. data/lib/solargraph/yard_tags.rb +2 -2
  219. data/lib/solargraph/yardoc.rb +7 -4
  220. data/lib/solargraph.rb +33 -10
  221. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  222. data/rbs/shims/ast/0/node.rbs +1 -1
  223. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  224. data/solargraph.gemspec +37 -35
  225. metadata +41 -42
  226. data/lib/solargraph/type_checker/checks.rb +0 -124
  227. data/lib/solargraph/type_checker/param_def.rb +0 -37
  228. data/lib/solargraph/yard_map/to_method.rb +0 -89
  229. data/rbs/fills/tuple/tuple.rbs +0 -149
@@ -7,22 +7,24 @@ 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]
13
14
  method_name = node.children[1]
14
15
  # :nocov:
15
16
  unless method_name.instance_of?(Symbol)
16
- Solargraph.assert_or_log(:parser_method_name, "Expected method name to be a Symbol, got #{method_name.class} for node #{node.inspect}")
17
+ Solargraph.assert_or_log(:parser_method_name,
18
+ "Expected method name to be a Symbol, got #{method_name.class} for node #{node.inspect}")
17
19
  return process_children
18
20
  end
19
21
  # :nocov:
20
22
  if node.children[0].nil?
21
- if [:private, :public, :protected].include?(method_name)
23
+ if %i[private public protected].include?(method_name)
22
24
  process_visibility
23
25
  elsif method_name == :module_function
24
26
  process_module_function
25
- elsif [:attr_reader, :attr_writer, :attr_accessor].include?(method_name)
27
+ elsif %i[attr_reader attr_writer attr_accessor].include?(method_name)
26
28
  process_attribute
27
29
  elsif method_name == :include
28
30
  process_include
@@ -43,7 +45,10 @@ module Solargraph
43
45
  return if process_private_class_method
44
46
  end
45
47
  elsif method_name == :require && node.children[0].to_s == '(const nil :Bundler)'
46
- pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
48
+ pins.push Pin::Reference::Require.new(
49
+ Solargraph::Location.new(region.filename,
50
+ Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser
51
+ )
47
52
  end
48
53
  process_children
49
54
  end
@@ -52,20 +57,22 @@ module Solargraph
52
57
 
53
58
  # @return [void]
54
59
  def process_visibility
55
- if (node.children.length > 2)
56
- node.children[2..-1].each do |child|
60
+ if node.children.length > 2
61
+ # @sg-ignore Need to add nil check here
62
+ node.children[2..].each do |child|
57
63
  # @sg-ignore Variable type could not be inferred for method_name
58
64
  # @type [Symbol]
59
65
  visibility = node.children[1]
60
66
  # :nocov:
61
67
  unless visibility.instance_of?(Symbol)
62
- Solargraph.assert_or_log(:parser_visibility, "Expected visibility name to be a Symbol, got #{visibility.class} for node #{node.inspect}")
68
+ Solargraph.assert_or_log(:parser_visibility,
69
+ "Expected visibility name to be a Symbol, got #{visibility.class} for node #{node.inspect}")
63
70
  return process_children
64
71
  end
65
72
  # :nocov:
66
- if child.is_a?(::Parser::AST::Node) && (child.type == :sym || child.type == :str)
73
+ if child.is_a?(::Parser::AST::Node) && %i[sym str].include?(child.type)
67
74
  name = child.children[0].to_s
68
- matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
75
+ matches = pins.select { |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance) }
69
76
  matches.each do |pin|
70
77
  # @todo Smelly instance variable access
71
78
  pin.instance_variable_set(:@visibility, visibility)
@@ -82,11 +89,12 @@ module Solargraph
82
89
 
83
90
  # @return [void]
84
91
  def process_attribute
85
- node.children[2..-1].each do |a|
92
+ # @sg-ignore Need to add nil check here
93
+ node.children[2..].each do |a|
86
94
  loc = get_node_location(node)
87
95
  clos = region.closure
88
96
  cmnt = comments_for(node)
89
- if node.children[1] == :attr_reader || node.children[1] == :attr_accessor
97
+ if %i[attr_reader attr_accessor].include?(node.children[1])
90
98
  pins.push Solargraph::Pin::Method.new(
91
99
  location: loc,
92
100
  closure: clos,
@@ -98,60 +106,62 @@ module Solargraph
98
106
  source: :parser
99
107
  )
100
108
  end
101
- if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
102
- method_pin = Solargraph::Pin::Method.new(
103
- location: loc,
104
- closure: clos,
105
- name: "#{a.children[0]}=",
106
- comments: cmnt,
107
- scope: region.scope || :instance,
108
- visibility: region.visibility,
109
- attribute: true,
110
- source: :parser
111
- )
112
- pins.push method_pin
113
- method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
114
- if method_pin.return_type.defined?
115
- pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
116
- end
109
+ next unless %i[attr_writer attr_accessor].include?(node.children[1])
110
+ method_pin = Solargraph::Pin::Method.new(
111
+ location: loc,
112
+ closure: clos,
113
+ name: "#{a.children[0]}=",
114
+ comments: cmnt,
115
+ scope: region.scope || :instance,
116
+ visibility: region.visibility,
117
+ attribute: true,
118
+ source: :parser
119
+ )
120
+ pins.push method_pin
121
+ method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last,
122
+ source: :parser)
123
+ if method_pin.return_type.defined?
124
+ pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '',
125
+ pins.last.return_type.items.map(&:rooted_tags), 'value')
117
126
  end
118
127
  end
119
128
  end
120
129
 
121
130
  # @return [void]
122
131
  def process_include
123
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
124
- cp = region.closure
125
- node.children[2..-1].each do |i|
126
- type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
127
- pins.push type.new(
128
- location: get_node_location(i),
129
- closure: cp,
130
- name: unpack_name(i),
131
- source: :parser
132
- )
133
- end
132
+ return unless node.children[2].is_a?(AST::Node) && node.children[2].type == :const
133
+ cp = region.closure
134
+ # @sg-ignore Need to add nil check here
135
+ node.children[2..].each do |i|
136
+ type = region.scope == :class ? Pin::Reference::Extend : Pin::Reference::Include
137
+ pins.push type.new(
138
+ location: get_node_location(i),
139
+ closure: cp,
140
+ name: unpack_name(i),
141
+ source: :parser
142
+ )
134
143
  end
135
144
  end
136
145
 
137
146
  # @return [void]
138
147
  def process_prepend
139
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
140
- cp = region.closure
141
- node.children[2..-1].each do |i|
142
- pins.push Pin::Reference::Prepend.new(
143
- location: get_node_location(i),
144
- closure: cp,
145
- name: unpack_name(i),
146
- source: :parser
147
- )
148
- end
148
+ return unless node.children[2].is_a?(AST::Node) && node.children[2].type == :const
149
+ cp = region.closure
150
+ # @sg-ignore Need to add nil check here
151
+ node.children[2..].each do |i|
152
+ pins.push Pin::Reference::Prepend.new(
153
+ location: get_node_location(i),
154
+ closure: cp,
155
+ name: unpack_name(i),
156
+ source: :parser
157
+ )
149
158
  end
150
159
  end
151
160
 
152
161
  # @return [void]
153
162
  def process_extend
154
- node.children[2..-1].each do |i|
163
+ # @sg-ignore Need to add nil check here
164
+ node.children[2..].each do |i|
155
165
  loc = get_node_location(node)
156
166
  if i.type == :self
157
167
  pins.push Pin::Reference::Extend.new(
@@ -173,18 +183,16 @@ module Solargraph
173
183
 
174
184
  # @return [void]
175
185
  def process_require
176
- if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
177
- path = node.children[2].children[0].to_s
178
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
179
- end
186
+ return unless node.children[2].is_a?(AST::Node) && node.children[2].type == :str
187
+ path = node.children[2].children[0].to_s
188
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
180
189
  end
181
190
 
182
191
  # @return [void]
183
192
  def process_autoload
184
- if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
185
- path = node.children[3].children[0].to_s
186
- pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
187
- end
193
+ return unless node.children[3].is_a?(AST::Node) && node.children[3].type == :str
194
+ path = node.children[3].children[0].to_s
195
+ pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
188
196
  end
189
197
 
190
198
  # @return [void]
@@ -192,76 +200,77 @@ module Solargraph
192
200
  if node.children[2].nil?
193
201
  # @todo Smelly instance variable access
194
202
  region.instance_variable_set(:@visibility, :module_function)
195
- elsif node.children[2].type == :sym || node.children[2].type == :str
196
- node.children[2..-1].each do |x|
203
+ elsif %i[sym str].include?(node.children[2].type)
204
+ # @sg-ignore Need to add nil check here
205
+ node.children[2..].each do |x|
197
206
  cn = x.children[0].to_s
198
207
  # @type [Pin::Method, nil]
199
208
  ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
200
- unless ref.nil?
201
- pins.delete ref
202
- mm = Solargraph::Pin::Method.new(
203
- location: ref.location,
204
- closure: ref.closure,
205
- name: ref.name,
206
- parameters: ref.parameters,
207
- comments: ref.comments,
208
- scope: :class,
209
- visibility: :public,
210
- node: ref.node,
209
+ next if ref.nil?
210
+ pins.delete ref
211
+ mm = Solargraph::Pin::Method.new(
212
+ location: ref.location,
213
+ closure: ref.closure,
214
+ name: ref.name,
215
+ parameters: ref.parameters,
216
+ comments: ref.comments,
217
+ scope: :class,
218
+ visibility: :public,
219
+ node: ref.node,
220
+ source: :parser
221
+ )
222
+ cm = Solargraph::Pin::Method.new(
223
+ location: ref.location,
224
+ closure: ref.closure,
225
+ name: ref.name,
226
+ parameters: ref.parameters,
227
+ comments: ref.comments,
228
+ scope: :instance,
229
+ visibility: :private,
230
+ node: ref.node,
231
+ source: :parser
232
+ )
233
+ pins.push mm, cm
234
+ ivars.select { |pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path }.each do |ivar|
235
+ ivars.delete ivar
236
+ ivars.push Solargraph::Pin::InstanceVariable.new(
237
+ location: ivar.location,
238
+ closure: cm,
239
+ name: ivar.name,
240
+ comments: ivar.comments,
241
+ assignment: ivar.assignment,
242
+ source: :parser
243
+ )
244
+ ivars.push Solargraph::Pin::InstanceVariable.new(
245
+ location: ivar.location,
246
+ closure: mm,
247
+ name: ivar.name,
248
+ comments: ivar.comments,
249
+ assignment: ivar.assignment,
211
250
  source: :parser
212
251
  )
213
- cm = Solargraph::Pin::Method.new(
214
- location: ref.location,
215
- closure: ref.closure,
216
- name: ref.name,
217
- parameters: ref.parameters,
218
- comments: ref.comments,
219
- scope: :instance,
220
- visibility: :private,
221
- node: ref.node,
222
- source: :parser)
223
- 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(
227
- location: ivar.location,
228
- closure: cm,
229
- name: ivar.name,
230
- comments: ivar.comments,
231
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
232
- assignment: ivar.assignment,
233
- source: :parser
234
- )
235
- pins.push Solargraph::Pin::InstanceVariable.new(
236
- location: ivar.location,
237
- closure: mm,
238
- name: ivar.name,
239
- comments: ivar.comments,
240
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
241
- assignment: ivar.assignment,
242
- source: :parser
243
- )
244
- end
245
252
  end
246
253
  end
247
254
  elsif node.children[2].type == :def
248
- NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals
255
+ NodeProcessor.process node.children[2], region.update(visibility: :module_function), pins, locals, ivars
249
256
  end
250
257
  end
251
258
 
252
259
  # @return [void]
253
260
  def process_private_constant
254
- if node.children[2] && (node.children[2].type == :sym || node.children[2].type == :str)
255
- cn = node.children[2].children[0].to_s
256
- ref = pins.select{|p| [Solargraph::Pin::Namespace, Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn}.first
257
- # HACK: Smelly instance variable access
258
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
259
- end
261
+ return unless node.children[2] && %i[sym str].include?(node.children[2].type)
262
+ cn = node.children[2].children[0].to_s
263
+ ref = pins.select do |p|
264
+ [Solargraph::Pin::Namespace,
265
+ Solargraph::Pin::Constant].include?(p.class) && p.namespace == region.closure.full_context.namespace && p.name == cn
266
+ end.first
267
+ # HACK: Smelly instance variable access
268
+ ref&.instance_variable_set(:@visibility, :private)
260
269
  end
261
270
 
262
271
  # @return [void]
263
272
  def process_alias_method
264
- loc = get_node_location(node)
273
+ get_node_location(node)
265
274
  pins.push Solargraph::Pin::MethodAlias.new(
266
275
  location: get_node_location(node),
267
276
  closure: region.closure,
@@ -274,10 +283,12 @@ module Solargraph
274
283
 
275
284
  # @return [Boolean]
276
285
  def process_private_class_method
277
- if node.children[2].type == :sym || node.children[2].type == :str
278
- ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s }.first
286
+ if %i[sym str].include?(node.children[2].type)
287
+ ref = pins.select do |p|
288
+ p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == node.children[2].children[0].to_s
289
+ end.first
279
290
  # HACK: Smelly instance variable access
280
- ref.instance_variable_set(:@visibility, :private) unless ref.nil?
291
+ ref&.instance_variable_set(:@visibility, :private)
281
292
  false
282
293
  else
283
294
  process_children region.update(scope: :class, visibility: :private)
@@ -1,20 +1,20 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Parser
5
- module ParserGem
6
- module NodeProcessors
7
- class SymNode < Parser::NodeProcessor::Base
8
- # @return [void]
9
- def process
10
- pins.push Solargraph::Pin::Symbol.new(
11
- get_node_location(node),
12
- ":#{node.children[0]}",
13
- source: :parser
14
- )
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Parser
5
+ module ParserGem
6
+ module NodeProcessors
7
+ class SymNode < Parser::NodeProcessor::Base
8
+ # @return [void]
9
+ def process
10
+ pins.push Solargraph::Pin::Symbol.new(
11
+ get_node_location(node),
12
+ ":#{node.children[0]}",
13
+ source: :parser
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -18,7 +18,7 @@ module Solargraph
18
18
  closure: region.closure,
19
19
  node: node,
20
20
  comments: comments_for(node),
21
- source: :parser,
21
+ source: :parser
22
22
  )
23
23
  process_children region
24
24
  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
@@ -18,7 +22,7 @@ module Solargraph
18
22
  closure: region.closure,
19
23
  node: node,
20
24
  comments: comments_for(node),
21
- source: :parser,
25
+ source: :parser
22
26
  )
23
27
  process_children region
24
28
  end
@@ -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,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  module Parser
3
5
  module ParserGem
@@ -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,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  module Parser
3
5
  class Snippet
4
- # @return [Range]
6
+ # @return [Solargraph::Range]
5
7
  attr_reader :range
6
8
  # @return [String]
7
9
  attr_reader :text
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  module Parser
3
5
  autoload :CommentRipper, 'solargraph/parser/comment_ripper'