solargraph 0.58.3 → 0.60.3

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 (238) 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 +18 -28
  6. data/.github/workflows/typecheck.yml +6 -3
  7. data/.rubocop.yml +39 -6
  8. data/.rubocop_todo.yml +53 -966
  9. data/CHANGELOG.md +57 -0
  10. data/Gemfile +6 -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 +13 -4
  16. data/lib/solargraph/api_map/index.rb +42 -20
  17. data/lib/solargraph/api_map/source_to_yard.rb +22 -9
  18. data/lib/solargraph/api_map/store.rb +61 -36
  19. data/lib/solargraph/api_map.rb +191 -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 +225 -63
  24. data/lib/solargraph/complex_type.rb +177 -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 +39 -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 +63 -40
  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 +222 -72
  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 +64 -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 +157 -85
  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 +67 -23
  138. data/lib/solargraph/pin/closure.rb +7 -10
  139. data/lib/solargraph/pin/common.rb +36 -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 +203 -111
  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 +227 -238
  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/rbs_translator.rb +206 -0
  174. data/lib/solargraph/server_methods.rb +1 -1
  175. data/lib/solargraph/shell.rb +330 -71
  176. data/lib/solargraph/source/chain/array.rb +3 -12
  177. data/lib/solargraph/source/chain/block_symbol.rb +13 -13
  178. data/lib/solargraph/source/chain/block_variable.rb +13 -13
  179. data/lib/solargraph/source/chain/call.rb +92 -120
  180. data/lib/solargraph/source/chain/class_variable.rb +1 -1
  181. data/lib/solargraph/source/chain/constant.rb +5 -1
  182. data/lib/solargraph/source/chain/global_variable.rb +1 -1
  183. data/lib/solargraph/source/chain/hash.rb +8 -5
  184. data/lib/solargraph/source/chain/head.rb +19 -19
  185. data/lib/solargraph/source/chain/if.rb +12 -10
  186. data/lib/solargraph/source/chain/instance_variable.rb +19 -1
  187. data/lib/solargraph/source/chain/link.rb +12 -22
  188. data/lib/solargraph/source/chain/literal.rb +22 -15
  189. data/lib/solargraph/source/chain/or.rb +10 -4
  190. data/lib/solargraph/source/chain/q_call.rb +2 -0
  191. data/lib/solargraph/source/chain/variable.rb +3 -1
  192. data/lib/solargraph/source/chain/z_super.rb +1 -3
  193. data/lib/solargraph/source/chain.rb +51 -38
  194. data/lib/solargraph/source/change.rb +12 -5
  195. data/lib/solargraph/source/cursor.rb +33 -18
  196. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  197. data/lib/solargraph/source/source_chainer.rb +56 -32
  198. data/lib/solargraph/source/updater.rb +5 -1
  199. data/lib/solargraph/source.rb +71 -43
  200. data/lib/solargraph/source_map/clip.rb +54 -30
  201. data/lib/solargraph/source_map/data.rb +4 -1
  202. data/lib/solargraph/source_map/mapper.rb +30 -133
  203. data/lib/solargraph/source_map.rb +35 -9
  204. data/lib/solargraph/type_checker/problem.rb +3 -1
  205. data/lib/solargraph/type_checker/rules.rb +81 -8
  206. data/lib/solargraph/type_checker.rb +208 -125
  207. data/lib/solargraph/version.rb +1 -1
  208. data/lib/solargraph/workspace/config.rb +14 -11
  209. data/lib/solargraph/workspace/gemspecs.rb +373 -0
  210. data/lib/solargraph/workspace/require_paths.rb +1 -0
  211. data/lib/solargraph/workspace.rb +50 -28
  212. data/lib/solargraph/yard_map/cache.rb +25 -25
  213. data/lib/solargraph/yard_map/directives/attribute_directive.rb +65 -0
  214. data/lib/solargraph/yard_map/directives/domain_directive.rb +30 -0
  215. data/lib/solargraph/yard_map/directives/method_directive.rb +51 -0
  216. data/lib/solargraph/yard_map/directives/override_directive.rb +30 -0
  217. data/lib/solargraph/yard_map/directives/parse_directive.rb +53 -0
  218. data/lib/solargraph/yard_map/directives/visibility_directive.rb +70 -0
  219. data/lib/solargraph/yard_map/directives.rb +35 -0
  220. data/lib/solargraph/yard_map/helpers.rb +8 -3
  221. data/lib/solargraph/yard_map/macro.rb +113 -0
  222. data/lib/solargraph/yard_map/mapper/to_constant.rb +28 -28
  223. data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
  224. data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
  225. data/lib/solargraph/yard_map/mapper.rb +31 -8
  226. data/lib/solargraph/yard_map.rb +19 -18
  227. data/lib/solargraph/yard_tags.rb +2 -2
  228. data/lib/solargraph/yardoc.rb +7 -4
  229. data/lib/solargraph.rb +34 -10
  230. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  231. data/rbs/shims/ast/0/node.rbs +1 -1
  232. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  233. data/solargraph.gemspec +39 -35
  234. metadata +77 -41
  235. data/lib/solargraph/type_checker/checks.rb +0 -124
  236. data/lib/solargraph/type_checker/param_def.rb +0 -37
  237. data/lib/solargraph/yard_map/to_method.rb +0 -89
  238. data/rbs/fills/tuple/tuple.rbs +0 -149
@@ -60,11 +60,13 @@ module Solargraph
60
60
  # @param c1 [Integer]
61
61
  # @param l2 [Integer]
62
62
  # @param c2 [Integer]
63
+ #
64
+ # @sg-ignore Need to add nil check here
63
65
  # @return [String]
64
66
  def from_to l1, c1, l2, c2
65
67
  b = Solargraph::Position.line_char_to_offset(code, l1, c1)
66
68
  e = Solargraph::Position.line_char_to_offset(code, l2, c2)
67
- code[b..e-1]
69
+ code[b..(e - 1)]
68
70
  end
69
71
 
70
72
  # Get the nearest node that contains the specified index.
@@ -72,7 +74,7 @@ module Solargraph
72
74
  # @param line [Integer]
73
75
  # @param column [Integer]
74
76
  # @return [AST::Node]
75
- def node_at(line, column)
77
+ def node_at line, column
76
78
  tree_at(line, column).first
77
79
  end
78
80
 
@@ -81,8 +83,8 @@ module Solargraph
81
83
  #
82
84
  # @param line [Integer]
83
85
  # @param column [Integer]
84
- # @return [Array<AST::Node>]
85
- def tree_at(line, column)
86
+ # @return [Array<Parser::AST::Node>]
87
+ def tree_at line, column
86
88
  position = Position.new(line, column)
87
89
  stack = []
88
90
  inner_tree_at node, position, stack
@@ -131,20 +133,29 @@ module Solargraph
131
133
  return false if Position.to_offset(code, position) >= code.length
132
134
  string_nodes.each do |node|
133
135
  range = Range.from_node(node)
136
+ # @sg-ignore Need to add nil check here
134
137
  next if range.ending.line < position.line
138
+ # @sg-ignore Need to add nil check here
135
139
  break if range.ending.line > position.line
140
+ # @sg-ignore Need to add nil check here
136
141
  return true if node.type == :str && range.include?(position) && range.start != position
137
- return true if [:STR, :str].include?(node.type) && range.include?(position) && range.start != position
142
+ # @sg-ignore Need to add nil check here
143
+ return true if %i[STR str].include?(node.type) && range.include?(position) && range.start != position
138
144
  if node.type == :dstr
139
145
  inner = node_at(position.line, position.column)
140
146
  next if inner.nil?
141
147
  inner_range = Range.from_node(inner)
148
+ # @sg-ignore Need to add nil check here
142
149
  next unless range.include?(inner_range.ending)
143
150
  return true if inner.type == :str
151
+ # @sg-ignore Need to add nil check here
144
152
  inner_code = at(Solargraph::Range.new(inner_range.start, position))
145
- return true if (inner.type == :dstr && inner_range.ending.character <= position.character) && !inner_code.end_with?('}') ||
153
+ # @sg-ignore Need to add nil check here
154
+ return true if (inner.type == :dstr && inner_range.ending.character <= position.character && !inner_code.end_with?('}')) ||
155
+ # @sg-ignore Need to add nil check here
146
156
  (inner.type != :dstr && inner_range.ending.line == position.line && position.character <= inner_range.ending.character && inner_code.end_with?('}'))
147
157
  end
158
+ # @sg-ignore Need to add nil check here
148
159
  break if range.ending.line > position.line
149
160
  end
150
161
  false
@@ -160,7 +171,7 @@ module Solargraph
160
171
  def comment_at? position
161
172
  comment_ranges.each do |range|
162
173
  return true if range.include?(position) ||
163
- (range.ending.line == position.line && range.ending.column < position.column)
174
+ (range.ending.line == position.line && range.ending.column < position.column)
164
175
  break if range.ending.line > position.line
165
176
  end
166
177
  false
@@ -179,21 +190,26 @@ module Solargraph
179
190
 
180
191
  # @param node [Parser::AST::Node]
181
192
  # @return [String]
182
- def code_for(node)
193
+ def code_for node
183
194
  rng = Range.from_node(node)
195
+ # @sg-ignore Need to add nil check here
184
196
  b = Position.line_char_to_offset(code, rng.start.line, rng.start.column)
197
+ # @sg-ignore Need to add nil check here
185
198
  e = Position.line_char_to_offset(code, rng.ending.line, rng.ending.column)
186
- frag = code[b..e-1].to_s
199
+ frag = code[b..(e - 1)].to_s
187
200
  frag.strip.gsub(/,$/, '')
188
201
  end
189
202
 
190
- # @param node [Parser::AST::Node]
203
+ # @param node [AST::Node]
204
+ #
191
205
  # @return [String, nil]
192
206
  def comments_for node
193
207
  rng = Range.from_node(node)
208
+ # @sg-ignore Need to add nil check here
194
209
  stringified_comments[rng.start.line] ||= begin
210
+ # @sg-ignore Need to add nil check here
195
211
  buff = associated_comments[rng.start.line]
196
- buff ? stringify_comment_array(buff) : nil
212
+ stringify_comment_array(buff)
197
213
  end
198
214
  end
199
215
 
@@ -208,8 +224,8 @@ module Solargraph
208
224
  end
209
225
 
210
226
  FOLDING_NODE_TYPES = %i[
211
- class sclass module def defs if str dstr array while unless kwbegin hash block
212
- ].freeze
227
+ class sclass module def defs if str dstr array while unless kwbegin hash block
228
+ ].freeze
213
229
 
214
230
  # Get an array of ranges that can be folded, e.g., the range of a class
215
231
  # definition or an if condition.
@@ -219,6 +235,7 @@ module Solargraph
219
235
  # @return [Array<Range>]
220
236
  def folding_ranges
221
237
  @folding_ranges ||= begin
238
+ # @type [Array<Range>]
222
239
  result = []
223
240
  inner_folding_ranges node, result
224
241
  result.concat foldable_comment_block_ranges
@@ -232,20 +249,20 @@ module Solargraph
232
249
 
233
250
  # Get a hash of comments grouped by the line numbers of the associated code.
234
251
  #
235
- # @return [Hash{Integer => String}]
252
+ # @return [Hash{Integer => Array<String>}]
236
253
  def associated_comments
237
254
  @associated_comments ||= begin
238
255
  # @type [Hash{Integer => String}]
239
256
  result = {}
240
- buffer = String.new('')
257
+ buffer = []
241
258
  # @type [Integer, nil]
242
259
  last = nil
243
260
  comments.each_pair do |num, snip|
244
261
  if !last || num == last + 1
245
- buffer.concat "#{snip.text}\n"
262
+ buffer.push "#{snip.text}\n"
246
263
  else
247
264
  result[first_not_empty_from(last + 1)] = buffer.clone
248
- buffer.replace "#{snip.text}\n"
265
+ buffer.replace ["#{snip.text}\n"]
249
266
  end
250
267
  last = num
251
268
  end
@@ -265,18 +282,22 @@ module Solargraph
265
282
  cursor
266
283
  end
267
284
 
268
- # @param top [Parser::AST::Node]
285
+ # @param top [Parser::AST::Node, nil]
269
286
  # @param result [Array<Range>]
270
287
  # @param parent [Symbol, nil]
271
288
  # @return [void]
272
289
  def inner_folding_ranges top, result = [], parent = nil
273
290
  return unless Parser.is_ast_node?(top)
291
+ # @sg-ignore Translate to something flow sensitive typing understands
274
292
  if FOLDING_NODE_TYPES.include?(top.type)
293
+ # @sg-ignore Translate to something flow sensitive typing understands
275
294
  range = Range.from_node(top)
276
- if result.empty? || range.start.line > result.last.start.line
277
- result.push range unless range.ending.line - range.start.line < 2
295
+ # @sg-ignore Need to add nil check here
296
+ if (result.empty? || range.start.line > result.last.start.line) && range.ending.line - range.start.line >= 2
297
+ result.push range
278
298
  end
279
299
  end
300
+ # @sg-ignore Translate to something flow sensitive typing understands
280
301
  top.children.each do |child|
281
302
  inner_folding_ranges(child, result, top.type)
282
303
  end
@@ -284,31 +305,36 @@ module Solargraph
284
305
 
285
306
  # Get a string representation of an array of comments.
286
307
  #
287
- # @param comments [String]
308
+ # @param comments [Array<String>, nil]
288
309
  # @return [String]
289
310
  def stringify_comment_array comments
290
- ctxt = String.new('')
311
+ ctxt = []
291
312
  started = false
292
313
  skip = nil
293
- comments.lines.each { |l|
314
+ comments&.each do |l|
315
+ if l =~ /^#-\R/
316
+ ctxt.clear
317
+ next
318
+ end
294
319
  # Trim the comment and minimum leading whitespace
295
320
  p = l.force_encoding('UTF-8').encode('UTF-8', invalid: :replace, replace: '?').gsub(/^#+/, '')
296
321
  if p.strip.empty?
297
322
  next unless started
298
- ctxt.concat p
323
+ ctxt.push p
299
324
  else
300
325
  here = p.index(/[^ \t]/)
326
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
301
327
  skip = here if skip.nil? || here < skip
302
- ctxt.concat p[skip..-1]
328
+ ctxt.push p[skip..]
303
329
  end
304
330
  started = true
305
- }
306
- ctxt
331
+ end
332
+ ctxt.join('')
307
333
  end
308
334
 
309
335
  # A hash of line numbers and their associated comments.
310
336
  #
311
- # @return [Hash{Integer => Array<String>, nil}]
337
+ # @return [Hash{Integer => String}]
312
338
  def stringified_comments
313
339
  @stringified_comments ||= {}
314
340
  end
@@ -331,7 +357,7 @@ module Solargraph
331
357
  return [] unless synchronized?
332
358
  result = []
333
359
  grouped = []
334
- comments.keys.each do |l|
360
+ comments.each_key do |l|
335
361
  if grouped.empty? || l == grouped.last + 1
336
362
  grouped.push l
337
363
  else
@@ -348,10 +374,12 @@ module Solargraph
348
374
  def string_nodes_in n
349
375
  result = []
350
376
  if Parser.is_ast_node?(n)
351
- if n.type == :str || n.type == :dstr || n.type == :STR || n.type == :DSTR
377
+ # @sg-ignore Translate to something flow sensitive typing understands
378
+ if %i[str dstr STR DSTR].include?(n.type)
352
379
  result.push n
353
380
  else
354
- n.children.each{ |c| result.concat string_nodes_in(c) }
381
+ # @sg-ignore Translate to something flow sensitive typing understands
382
+ n.children.each { |c| result.concat string_nodes_in(c) }
355
383
  end
356
384
  end
357
385
  result
@@ -364,13 +392,13 @@ module Solargraph
364
392
  def inner_tree_at node, position, stack
365
393
  return if node.nil?
366
394
  here = Range.from_node(node)
367
- if here.contain?(position)
368
- stack.unshift node
369
- node.children.each do |c|
370
- next unless Parser.is_ast_node?(c)
371
- next if c.loc.expression.nil?
372
- inner_tree_at(c, position, stack)
373
- end
395
+ # @sg-ignore Need to add nil check here
396
+ return unless here.contain?(position)
397
+ stack.unshift node
398
+ node.children.each do |c|
399
+ next unless Parser.is_ast_node?(c)
400
+ next if c.loc.expression.nil?
401
+ inner_tree_at(c, position, stack)
374
402
  end
375
403
  end
376
404
 
@@ -396,10 +424,10 @@ module Solargraph
396
424
  end
397
425
  @finalized = true
398
426
  begin
399
- @node, @comments = Solargraph::Parser.parse_with_comments(@code, filename)
427
+ @node, @comments = Solargraph::Parser.parse_with_comments(@code, filename, 0)
400
428
  @parsed = true
401
429
  @repaired = @code
402
- rescue Parser::SyntaxError, EncodingError => e
430
+ rescue Parser::SyntaxError, EncodingError
403
431
  @node = nil
404
432
  @comments = {}
405
433
  @parsed = false
@@ -412,9 +440,9 @@ module Solargraph
412
440
  end
413
441
  error_ranges.concat(changes.map(&:range))
414
442
  begin
415
- @node, @comments = Solargraph::Parser.parse_with_comments(@repaired, filename)
443
+ @node, @comments = Solargraph::Parser.parse_with_comments(@repaired, filename, 0)
416
444
  @parsed = true
417
- rescue Parser::SyntaxError, EncodingError => e
445
+ rescue Parser::SyntaxError, EncodingError
418
446
  @node = nil
419
447
  @comments = {}
420
448
  @parsed = false
@@ -427,7 +455,7 @@ module Solargraph
427
455
 
428
456
  # @param val [String]
429
457
  # @return [String]
430
- def code=(val)
458
+ def code= val
431
459
  @code_lines = nil
432
460
  @finalized = false
433
461
  @code = val
@@ -12,7 +12,10 @@ module Solargraph
12
12
  @api_map = api_map
13
13
  @cursor = cursor
14
14
  closure_pin = closure
15
- closure_pin.rebind(api_map) if closure_pin.is_a?(Pin::Block) && !Solargraph::Range.from_node(closure_pin.receiver).contain?(cursor.range.start)
15
+ # @sg-ignore Need to add nil check here
16
+ if closure_pin.is_a?(Pin::Block) && !Solargraph::Range.from_node(closure_pin.receiver).contain?(cursor.range.start)
17
+ closure_pin.rebind(api_map)
18
+ end
16
19
  end
17
20
 
18
21
  # @return [Array<Pin::Base>] Relevant pins for infering the type of the Cursor's position
@@ -20,7 +23,12 @@ module Solargraph
20
23
  return [] if cursor.comment? || cursor.chain.literal?
21
24
  result = cursor.chain.define(api_map, closure, locals)
22
25
  result.concat file_global_methods
23
- result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
26
+ if result.empty?
27
+ result.concat((source_map.pins + source_map.locals).select do |p|
28
+ # @sg-ignore Need to add nil check here
29
+ p.name == cursor.word && p.location.range.contain?(cursor.position)
30
+ end)
31
+ end
24
32
  result
25
33
  end
26
34
 
@@ -32,7 +40,9 @@ module Solargraph
32
40
  # @return [Completion]
33
41
  def complete
34
42
  return package_completions([]) if !source_map.source.parsed? || cursor.string?
35
- return package_completions(api_map.get_symbols) if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
43
+ if cursor.chain.literal? && cursor.chain.links.last.word == '<Symbol>'
44
+ return package_completions(api_map.get_symbols)
45
+ end
36
46
  return Completion.new([], cursor.range) if cursor.chain.literal?
37
47
  if cursor.comment?
38
48
  tag_complete
@@ -44,8 +54,13 @@ module Solargraph
44
54
  # @return [Array<Pin::Method>]
45
55
  def signify
46
56
  return [] unless cursor.argument?
57
+ return [] if cursor.recipient_node.nil?
47
58
  chain = Parser.chain(cursor.recipient_node, cursor.filename)
48
- chain.define(api_map, context_pin, locals).select { |pin| pin.is_a?(Pin::Method) }
59
+ name_pin = context_pin
60
+ if name_pin.nil?
61
+ name_pin = Pin::ProxyType.anonymous(ComplexType.try_parse('::Object'))
62
+ end
63
+ chain.define(api_map, name_pin, locals).select { |pin| pin.is_a?(Pin::Method) }
49
64
  end
50
65
 
51
66
  # @return [ComplexType]
@@ -78,7 +93,7 @@ module Solargraph
78
93
  # @param phrase [String]
79
94
  # @return [Array<Solargraph::Pin::Base>]
80
95
  def translate phrase
81
- chain = Parser.chain(Parser.parse(phrase))
96
+ chain = Parser.chain(Parser.parse(phrase, cursor.filename, cursor.position.line))
82
97
  chain.define(api_map, closure, locals)
83
98
  end
84
99
 
@@ -92,6 +107,7 @@ module Solargraph
92
107
 
93
108
  # @return [SourceMap]
94
109
  def source_map
110
+ # @sg-ignore Need to add nil check here
95
111
  @source_map ||= api_map.source_map(cursor.filename)
96
112
  end
97
113
 
@@ -125,12 +141,11 @@ module Solargraph
125
141
  next unless param.keyword?
126
142
  result.push Pin::KeywordParam.new(pin.location, "#{param.name}:")
127
143
  end
128
- if !pin.parameters.empty? && pin.parameters.last.kwrestarg?
129
- pin.docstring.tags(:param).each do |tag|
130
- next if done.include?(tag.name)
131
- done.push tag.name
132
- result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
133
- end
144
+ next unless !pin.parameters.empty? && pin.parameters.last.kwrestarg?
145
+ pin.docstring.tags(:param).each do |tag|
146
+ next if done.include?(tag.name)
147
+ done.push tag.name
148
+ result.push Pin::KeywordParam.new(pin.location, "#{tag.name}:")
134
149
  end
135
150
  end
136
151
  result
@@ -140,27 +155,34 @@ module Solargraph
140
155
  # @return [Completion]
141
156
  def package_completions result
142
157
  frag_start = cursor.start_of_word.to_s.downcase
143
- filtered = result.uniq(&:name).select { |s|
158
+ filtered = result.uniq(&:name).select do |s|
144
159
  s.name.downcase.start_with?(frag_start) &&
145
- (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(\!|\?|=)?$/i))
146
- }
160
+ (!s.is_a?(Pin::Method) || s.name.match(/^[a-z0-9_]+(!|\?|=)?$/i))
161
+ end
147
162
  Completion.new(filtered, cursor.range)
148
163
  end
149
164
 
150
165
  # @return [Completion]
151
166
  def tag_complete
152
167
  result = []
153
- match = source_map.code[0..cursor.offset-1].match(/[\[<, ]([a-z0-9_:]*)\z/i)
168
+ # @sg-ignore Need to add nil check here
169
+ match = source_map.code[0..(cursor.offset - 1)].match(/[\[<, ]([a-z0-9_:]*)\z/i)
154
170
  if match
171
+ # @sg-ignore Need to add nil check here
155
172
  full = match[1]
173
+ # @sg-ignore Need to add nil check here
156
174
  if full.include?('::')
175
+ # @sg-ignore Need to add nil check here
157
176
  if full.end_with?('::')
177
+ # @sg-ignore Need to add nil check here
158
178
  result.concat api_map.get_constants(full[0..-3], *gates)
159
179
  else
180
+ # @sg-ignore Need to add nil check here
160
181
  result.concat api_map.get_constants(full.split('::')[0..-2].join('::'), *gates)
161
182
  end
162
183
  else
163
- result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
184
+ # @sg-ignore Need to add nil check here
185
+ result.concat api_map.get_constants('', full.end_with?('::') ? '' : context_pin.full_context.namespace, *gates) # .select { |pin| pin.name.start_with?(full) }
164
186
  end
165
187
  end
166
188
  package_completions(result)
@@ -173,24 +195,24 @@ module Solargraph
173
195
  if cursor.chain.constant? || cursor.start_of_constant?
174
196
  full = cursor.chain.links.first.word
175
197
  type = if cursor.chain.undefined?
176
- cursor.chain.base.infer(api_map, context_pin, locals)
177
- else
178
- if full.include?('::') && cursor.chain.links.length == 1
179
- ComplexType.try_parse(full.split('::')[0..-2].join('::'))
180
- elsif cursor.chain.links.length > 1
181
- ComplexType.try_parse(full)
182
- else
183
- ComplexType::UNDEFINED
184
- end
185
- end
198
+ cursor.chain.base.infer(api_map, context_pin, locals)
199
+ elsif full.include?('::') && cursor.chain.links.length == 1
200
+ # @sg-ignore Need to add nil check here
201
+ ComplexType.try_parse(full.split('::')[0..-2].join('::'))
202
+ elsif cursor.chain.links.length > 1
203
+ ComplexType.try_parse(full)
204
+ else
205
+ ComplexType::UNDEFINED
206
+ end
186
207
  if type.undefined?
187
208
  if full.include?('::')
188
209
  result.concat api_map.get_constants(full, *gates)
189
210
  else
190
- result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) #.select { |pin| pin.name.start_with?(full) }
211
+ result.concat api_map.get_constants('', cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates) # .select { |pin| pin.name.start_with?(full) }
191
212
  end
192
213
  else
193
- result.concat api_map.get_constants(type.namespace, cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
214
+ result.concat api_map.get_constants(type.namespace,
215
+ cursor.start_of_constant? ? '' : context_pin.full_context.namespace, *gates)
194
216
  end
195
217
  else
196
218
  type = cursor.chain.base.infer(api_map, closure, locals)
@@ -199,14 +221,16 @@ module Solargraph
199
221
  if cursor.word.start_with?('@@')
200
222
  return package_completions(api_map.get_class_variable_pins(context_pin.full_context.namespace))
201
223
  elsif cursor.word.start_with?('@')
202
- return package_completions(api_map.get_instance_variable_pins(closure.binder.namespace, closure.binder.scope))
224
+ return package_completions(api_map.get_instance_variable_pins(closure.full_context.namespace,
225
+ closure.context.scope))
203
226
  elsif cursor.word.start_with?('$')
204
227
  return package_completions(api_map.get_global_variable_pins)
205
228
  end
206
229
  result.concat locals
207
230
  result.concat file_global_methods unless closure.binder.namespace.empty?
208
231
  result.concat api_map.get_constants(context_pin.context.namespace, *gates)
209
- result.concat api_map.get_methods(closure.binder.namespace, scope: closure.binder.scope, visibility: [:public, :private, :protected])
232
+ result.concat api_map.get_methods(closure.binder.namespace, scope: closure.binder.scope,
233
+ visibility: %i[public private protected])
210
234
  result.concat api_map.get_methods('Kernel')
211
235
  result.concat api_map.keyword_pins.to_a
212
236
  end
@@ -8,13 +8,16 @@ module Solargraph
8
8
  @source = source
9
9
  end
10
10
 
11
+ # @sg-ignore Translate to something flow sensitive typing understands
11
12
  # @return [Array<Solargraph::Pin::Base>]
13
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1100
12
14
  def pins
13
15
  generate
14
16
  @pins || []
15
17
  end
16
18
 
17
- # @return [Array<Solargraph::LocalVariable>]
19
+ # @sg-ignore Translate to something flow sensitive typing understands
20
+ # @return [Array<Solargraph::Pin::LocalVariable>]
18
21
  def locals
19
22
  generate
20
23
  @locals || []