solargraph 0.54.0 → 0.58.0

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 (200) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/linting.yml +127 -0
  3. data/.github/workflows/plugins.yml +184 -6
  4. data/.github/workflows/rspec.yml +55 -5
  5. data/.github/workflows/typecheck.yml +8 -3
  6. data/.gitignore +7 -0
  7. data/.overcommit.yml +72 -0
  8. data/.rspec +1 -0
  9. data/.rubocop.yml +66 -0
  10. data/.rubocop_todo.yml +1279 -0
  11. data/.yardopts +1 -0
  12. data/CHANGELOG.md +171 -0
  13. data/README.md +20 -6
  14. data/Rakefile +125 -13
  15. data/bin/solargraph +8 -5
  16. data/lib/solargraph/api_map/cache.rb +13 -3
  17. data/lib/solargraph/api_map/constants.rb +279 -0
  18. data/lib/solargraph/api_map/index.rb +193 -0
  19. data/lib/solargraph/api_map/source_to_yard.rb +13 -4
  20. data/lib/solargraph/api_map/store.rb +207 -132
  21. data/lib/solargraph/api_map.rb +394 -261
  22. data/lib/solargraph/bench.rb +18 -1
  23. data/lib/solargraph/complex_type/type_methods.rb +29 -12
  24. data/lib/solargraph/complex_type/unique_type.rb +205 -26
  25. data/lib/solargraph/complex_type.rb +126 -26
  26. data/lib/solargraph/convention/active_support_concern.rb +111 -0
  27. data/lib/solargraph/convention/base.rb +20 -3
  28. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
  29. data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
  30. data/lib/solargraph/convention/data_definition.rb +105 -0
  31. data/lib/solargraph/convention/gemspec.rb +3 -2
  32. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
  33. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
  34. data/lib/solargraph/convention/struct_definition.rb +164 -0
  35. data/lib/solargraph/convention.rb +36 -4
  36. data/lib/solargraph/diagnostics/rubocop.rb +6 -1
  37. data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
  38. data/lib/solargraph/doc_map.rb +316 -64
  39. data/lib/solargraph/environ.rb +9 -2
  40. data/lib/solargraph/equality.rb +34 -0
  41. data/lib/solargraph/gem_pins.rb +64 -38
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -0
  43. data/lib/solargraph/language_server/host/message_worker.rb +54 -5
  44. data/lib/solargraph/language_server/host.rb +36 -18
  45. data/lib/solargraph/language_server/message/base.rb +20 -12
  46. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
  47. data/lib/solargraph/language_server/message/extended/document.rb +5 -2
  48. data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
  49. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  50. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  51. data/lib/solargraph/language_server/message/text_document/definition.rb +5 -3
  52. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  53. data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
  54. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  55. data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
  56. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
  57. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  58. data/lib/solargraph/language_server/progress.rb +27 -2
  59. data/lib/solargraph/language_server/request.rb +4 -1
  60. data/lib/solargraph/library.rb +83 -73
  61. data/lib/solargraph/location.rb +45 -1
  62. data/lib/solargraph/logging.rb +12 -2
  63. data/lib/solargraph/page.rb +3 -0
  64. data/lib/solargraph/parser/comment_ripper.rb +20 -7
  65. data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
  66. data/lib/solargraph/parser/node_processor/base.rb +10 -5
  67. data/lib/solargraph/parser/node_processor.rb +26 -8
  68. data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
  69. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
  70. data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
  71. data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
  72. data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
  73. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
  74. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
  75. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
  76. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
  77. data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
  78. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
  79. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
  80. data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
  81. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +23 -0
  82. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
  83. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +14 -2
  85. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
  86. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
  87. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
  88. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
  89. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
  90. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
  91. data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
  93. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
  94. data/lib/solargraph/parser/parser_gem/node_processors.rb +14 -0
  95. data/lib/solargraph/parser/region.rb +4 -1
  96. data/lib/solargraph/parser/snippet.rb +2 -0
  97. data/lib/solargraph/parser.rb +3 -5
  98. data/lib/solargraph/pin/base.rb +417 -42
  99. data/lib/solargraph/pin/base_variable.rb +21 -12
  100. data/lib/solargraph/pin/block.rb +9 -26
  101. data/lib/solargraph/pin/breakable.rb +9 -0
  102. data/lib/solargraph/pin/callable.rb +231 -0
  103. data/lib/solargraph/pin/closure.rb +30 -10
  104. data/lib/solargraph/pin/common.rb +12 -7
  105. data/lib/solargraph/pin/constant.rb +2 -0
  106. data/lib/solargraph/pin/conversions.rb +3 -2
  107. data/lib/solargraph/pin/delegated_method.rb +20 -1
  108. data/lib/solargraph/pin/documenting.rb +16 -0
  109. data/lib/solargraph/pin/instance_variable.rb +2 -2
  110. data/lib/solargraph/pin/keyword.rb +7 -2
  111. data/lib/solargraph/pin/local_variable.rb +15 -7
  112. data/lib/solargraph/pin/method.rb +241 -70
  113. data/lib/solargraph/pin/method_alias.rb +3 -0
  114. data/lib/solargraph/pin/namespace.rb +21 -13
  115. data/lib/solargraph/pin/parameter.rb +94 -32
  116. data/lib/solargraph/pin/proxy_type.rb +17 -7
  117. data/lib/solargraph/pin/reference/override.rb +24 -6
  118. data/lib/solargraph/pin/reference/require.rb +2 -2
  119. data/lib/solargraph/pin/reference/superclass.rb +5 -0
  120. data/lib/solargraph/pin/reference.rb +17 -0
  121. data/lib/solargraph/pin/search.rb +6 -1
  122. data/lib/solargraph/pin/signature.rb +39 -121
  123. data/lib/solargraph/pin/singleton.rb +1 -1
  124. data/lib/solargraph/pin/symbol.rb +8 -2
  125. data/lib/solargraph/pin/until.rb +18 -0
  126. data/lib/solargraph/pin/while.rb +18 -0
  127. data/lib/solargraph/pin.rb +8 -2
  128. data/lib/solargraph/pin_cache.rb +245 -0
  129. data/lib/solargraph/position.rb +19 -0
  130. data/lib/solargraph/range.rb +23 -4
  131. data/lib/solargraph/rbs_map/conversions.rb +315 -99
  132. data/lib/solargraph/rbs_map/core_fills.rb +50 -16
  133. data/lib/solargraph/rbs_map/core_map.rb +41 -11
  134. data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
  135. data/lib/solargraph/rbs_map.rb +87 -16
  136. data/lib/solargraph/shell.rb +117 -17
  137. data/lib/solargraph/source/chain/array.rb +13 -8
  138. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  139. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  140. data/lib/solargraph/source/chain/call.rb +135 -66
  141. data/lib/solargraph/source/chain/constant.rb +3 -66
  142. data/lib/solargraph/source/chain/hash.rb +9 -3
  143. data/lib/solargraph/source/chain/head.rb +1 -1
  144. data/lib/solargraph/source/chain/if.rb +7 -2
  145. data/lib/solargraph/source/chain/link.rb +38 -6
  146. data/lib/solargraph/source/chain/literal.rb +27 -2
  147. data/lib/solargraph/source/chain/or.rb +2 -2
  148. data/lib/solargraph/source/chain/z_super.rb +1 -1
  149. data/lib/solargraph/source/chain.rb +140 -63
  150. data/lib/solargraph/source/change.rb +2 -2
  151. data/lib/solargraph/source/cursor.rb +4 -4
  152. data/lib/solargraph/source/source_chainer.rb +3 -3
  153. data/lib/solargraph/source.rb +110 -89
  154. data/lib/solargraph/source_map/clip.rb +22 -28
  155. data/lib/solargraph/source_map/data.rb +34 -0
  156. data/lib/solargraph/source_map/mapper.rb +11 -7
  157. data/lib/solargraph/source_map.rb +50 -43
  158. data/lib/solargraph/type_checker/checks.rb +4 -0
  159. data/lib/solargraph/type_checker/param_def.rb +2 -0
  160. data/lib/solargraph/type_checker/rules.rb +35 -8
  161. data/lib/solargraph/type_checker.rb +331 -189
  162. data/lib/solargraph/version.rb +1 -1
  163. data/lib/solargraph/views/_method.erb +10 -10
  164. data/lib/solargraph/views/_namespace.erb +3 -3
  165. data/lib/solargraph/views/document.erb +10 -10
  166. data/lib/solargraph/views/environment.erb +3 -5
  167. data/lib/solargraph/workspace/config.rb +25 -5
  168. data/lib/solargraph/workspace/require_paths.rb +97 -0
  169. data/lib/solargraph/workspace.rb +53 -72
  170. data/lib/solargraph/yard_map/helpers.rb +29 -1
  171. data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
  172. data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
  173. data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
  174. data/lib/solargraph/yard_map/mapper.rb +5 -3
  175. data/lib/solargraph/yard_map/to_method.rb +6 -3
  176. data/lib/solargraph/yardoc.rb +45 -10
  177. data/lib/solargraph.rb +35 -1
  178. data/rbs/fills/bundler/0/bundler.rbs +4271 -0
  179. data/rbs/fills/open3/0/open3.rbs +172 -0
  180. data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
  181. data/rbs/fills/rubygems/0/errors.rbs +364 -0
  182. data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
  183. data/rbs/fills/rubygems/0/specification.rbs +1753 -0
  184. data/rbs/fills/tuple/tuple.rbs +149 -0
  185. data/rbs_collection.yaml +19 -0
  186. data/sig/shims/ast/0/node.rbs +5 -0
  187. data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
  188. data/sig/shims/ast/2.4/ast.rbs +73 -0
  189. data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
  190. data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
  191. data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
  192. data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
  193. data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
  194. data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
  195. data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
  196. data/solargraph.gemspec +32 -10
  197. metadata +237 -37
  198. data/lib/.rubocop.yml +0 -22
  199. data/lib/solargraph/cache.rb +0 -77
  200. data/lib/solargraph/parser/node_methods.rb +0 -83
@@ -0,0 +1,245 @@
1
+ require 'yard-activesupport-concern'
2
+ require 'fileutils'
3
+ require 'rbs'
4
+
5
+ module Solargraph
6
+ module PinCache
7
+ class << self
8
+ include Logging
9
+
10
+ # The base directory where cached YARD documentation and serialized pins are serialized
11
+ #
12
+ # @return [String]
13
+ def base_dir
14
+ # The directory is not stored in a variable so it can be overridden
15
+ # in specs.
16
+ ENV['SOLARGRAPH_CACHE'] ||
17
+ (ENV['XDG_CACHE_HOME'] ? File.join(ENV['XDG_CACHE_HOME'], 'solargraph') : nil) ||
18
+ File.join(Dir.home, '.cache', 'solargraph')
19
+ end
20
+
21
+ # The working directory for the current Ruby, RBS, and Solargraph versions.
22
+ #
23
+ # @return [String]
24
+ def work_dir
25
+ # The directory is not stored in a variable so it can be overridden
26
+ # in specs.
27
+ File.join(base_dir, "ruby-#{RUBY_VERSION}", "rbs-#{RBS::VERSION}", "solargraph-#{Solargraph::VERSION}")
28
+ end
29
+
30
+ # @param gemspec [Gem::Specification]
31
+ # @return [String]
32
+ def yardoc_path gemspec
33
+ File.join(base_dir,
34
+ "yard-#{YARD::VERSION}",
35
+ "yard-activesupport-concern-#{YARD::ActiveSupport::Concern::VERSION}",
36
+ "#{gemspec.name}-#{gemspec.version}.yardoc")
37
+ end
38
+
39
+ # @return [String]
40
+ def stdlib_path
41
+ File.join(work_dir, 'stdlib')
42
+ end
43
+
44
+ # @param require [String]
45
+ # @return [String]
46
+ def stdlib_require_path require
47
+ File.join(stdlib_path, "#{require}.ser")
48
+ end
49
+
50
+ # @param require [String]
51
+ # @return [Array<Pin::Base>, nil]
52
+ def deserialize_stdlib_require require
53
+ load(stdlib_require_path(require))
54
+ end
55
+
56
+ # @param require [String]
57
+ # @param pins [Array<Pin::Base>]
58
+ # @return [void]
59
+ def serialize_stdlib_require require, pins
60
+ save(stdlib_require_path(require), pins)
61
+ end
62
+
63
+ # @return [String]
64
+ def core_path
65
+ File.join(work_dir, 'core.ser')
66
+ end
67
+
68
+ # @return [Array<Pin::Base>, nil]
69
+ def deserialize_core
70
+ load(core_path)
71
+ end
72
+
73
+ # @param pins [Array<Pin::Base>]
74
+ # @return [void]
75
+ def serialize_core pins
76
+ save(core_path, pins)
77
+ end
78
+
79
+ # @param gemspec [Gem::Specification]
80
+ # @return [String]
81
+ def yard_gem_path gemspec
82
+ File.join(work_dir, 'yard', "#{gemspec.name}-#{gemspec.version}.ser")
83
+ end
84
+
85
+ # @param gemspec [Gem::Specification]
86
+ # @return [Array<Pin::Base>, nil]
87
+ def deserialize_yard_gem(gemspec)
88
+ load(yard_gem_path(gemspec))
89
+ end
90
+
91
+ # @param gemspec [Gem::Specification]
92
+ # @param pins [Array<Pin::Base>]
93
+ # @return [void]
94
+ def serialize_yard_gem(gemspec, pins)
95
+ save(yard_gem_path(gemspec), pins)
96
+ end
97
+
98
+ # @param gemspec [Gem::Specification]
99
+ # @return [Boolean]
100
+ def has_yard?(gemspec)
101
+ exist?(yard_gem_path(gemspec))
102
+ end
103
+
104
+ # @param gemspec [Gem::Specification]
105
+ # @param hash [String, nil]
106
+ # @return [String]
107
+ def rbs_collection_path(gemspec, hash)
108
+ File.join(work_dir, 'rbs', "#{gemspec.name}-#{gemspec.version}-#{hash || 0}.ser")
109
+ end
110
+
111
+ # @param gemspec [Gem::Specification]
112
+ # @return [String]
113
+ def rbs_collection_path_prefix(gemspec)
114
+ File.join(work_dir, 'rbs', "#{gemspec.name}-#{gemspec.version}-")
115
+ end
116
+
117
+ # @param gemspec [Gem::Specification]
118
+ # @param hash [String, nil]
119
+ # @return [Array<Pin::Base>, nil]
120
+ def deserialize_rbs_collection_gem(gemspec, hash)
121
+ load(rbs_collection_path(gemspec, hash))
122
+ end
123
+
124
+ # @param gemspec [Gem::Specification]
125
+ # @param hash [String, nil]
126
+ # @param pins [Array<Pin::Base>]n
127
+ # @return [void]
128
+ def serialize_rbs_collection_gem(gemspec, hash, pins)
129
+ save(rbs_collection_path(gemspec, hash), pins)
130
+ end
131
+
132
+ # @param gemspec [Gem::Specification]
133
+ # @param hash [String, nil]
134
+ # @return [String]
135
+ def combined_path(gemspec, hash)
136
+ File.join(work_dir, 'combined', "#{gemspec.name}-#{gemspec.version}-#{hash || 0}.ser")
137
+ end
138
+
139
+ # @param gemspec [Gem::Specification]
140
+ # @return [String]
141
+ def combined_path_prefix(gemspec)
142
+ File.join(work_dir, 'combined', "#{gemspec.name}-#{gemspec.version}-")
143
+ end
144
+
145
+ # @param gemspec [Gem::Specification]
146
+ # @param hash [String, nil]
147
+ # @param pins [Array<Pin::Base>]
148
+ # @return [void]
149
+ def serialize_combined_gem(gemspec, hash, pins)
150
+ save(combined_path(gemspec, hash), pins)
151
+ end
152
+
153
+ # @param gemspec [Gem::Specification]
154
+ # @param hash [String, nil]
155
+ # @return [Array<Pin::Base>, nil]
156
+ def deserialize_combined_gem gemspec, hash
157
+ load(combined_path(gemspec, hash))
158
+ end
159
+
160
+ # @param gemspec [Gem::Specification]
161
+ # @param hash [String, nil]
162
+ # @return [Boolean]
163
+ def has_rbs_collection?(gemspec, hash)
164
+ exist?(rbs_collection_path(gemspec, hash))
165
+ end
166
+
167
+ # @return [void]
168
+ def uncache_core
169
+ uncache(core_path)
170
+ end
171
+
172
+ # @return [void]
173
+ def uncache_stdlib
174
+ uncache(stdlib_path)
175
+ end
176
+
177
+ # @param gemspec [Gem::Specification]
178
+ # @param out [IO, nil]
179
+ # @return [void]
180
+ def uncache_gem(gemspec, out: nil)
181
+ uncache(yardoc_path(gemspec), out: out)
182
+ uncache_by_prefix(rbs_collection_path_prefix(gemspec), out: out)
183
+ uncache(yard_gem_path(gemspec), out: out)
184
+ uncache_by_prefix(combined_path_prefix(gemspec), out: out)
185
+ end
186
+
187
+ # @return [void]
188
+ def clear
189
+ FileUtils.rm_rf base_dir, secure: true
190
+ end
191
+
192
+ private
193
+
194
+ # @param file [String]
195
+ # @return [Array<Solargraph::Pin::Base>, nil]
196
+ def load file
197
+ return nil unless File.file?(file)
198
+ Marshal.load(File.read(file, mode: 'rb'))
199
+ rescue StandardError => e
200
+ Solargraph.logger.warn "Failed to load cached file #{file}: [#{e.class}] #{e.message}"
201
+ FileUtils.rm_f file
202
+ nil
203
+ end
204
+
205
+ # @param path [String]
206
+ def exist? *path
207
+ File.file? File.join(*path)
208
+ end
209
+
210
+ # @param file [String]
211
+ # @param pins [Array<Pin::Base>]
212
+ # @return [void]
213
+ def save file, pins
214
+ base = File.dirname(file)
215
+ FileUtils.mkdir_p base unless File.directory?(base)
216
+ ser = Marshal.dump(pins)
217
+ File.write file, ser, mode: 'wb'
218
+ logger.debug { "Cache#save: Saved #{pins.length} pins to #{file}" }
219
+ end
220
+
221
+ # @param path_segments [Array<String>]
222
+ # @return [void]
223
+ def uncache *path_segments, out: nil
224
+ path = File.join(*path_segments)
225
+ if File.exist?(path)
226
+ FileUtils.rm_rf path, secure: true
227
+ out.puts "Clearing pin cache in #{path}" unless out.nil?
228
+ end
229
+ end
230
+
231
+ # @return [void]
232
+ # @param path_segments [Array<String>]
233
+ def uncache_by_prefix *path_segments, out: nil
234
+ path = File.join(*path_segments)
235
+ glob = "#{path}*"
236
+ out.puts "Clearing pin cache in #{glob}" unless out.nil?
237
+ Dir.glob(glob).each do |file|
238
+ next unless File.file?(file)
239
+ FileUtils.rm_rf file, secure: true
240
+ out.puts "Clearing pin cache in #{file}" unless out.nil?
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
@@ -4,6 +4,8 @@ module Solargraph
4
4
  # The zero-based line and column numbers of a position in a string.
5
5
  #
6
6
  class Position
7
+ include Equality
8
+
7
9
  # @return [Integer]
8
10
  attr_reader :line
9
11
 
@@ -19,6 +21,21 @@ module Solargraph
19
21
  @character = character
20
22
  end
21
23
 
24
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
25
+ protected def equality_fields
26
+ [line, character]
27
+ end
28
+
29
+ # @param other [Position]
30
+ def <=>(other)
31
+ return nil unless other.is_a?(Position)
32
+ if line == other.line
33
+ character <=> other.character
34
+ else
35
+ line <=> other.line
36
+ end
37
+ end
38
+
22
39
  # Get a hash of the position. This representation is suitable for use in
23
40
  # the language server protocol.
24
41
  #
@@ -41,6 +58,7 @@ module Solargraph
41
58
  # @return [Integer]
42
59
  def self.to_offset text, position
43
60
  return 0 if text.empty?
61
+ # @sg-ignore Unresolved call to + on Integer
44
62
  text.lines[0...position.line].sum(&:length) + position.character
45
63
  end
46
64
 
@@ -94,6 +112,7 @@ module Solargraph
94
112
 
95
113
  def == other
96
114
  return false unless other.is_a?(Position)
115
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
97
116
  line == other.line and character == other.character
98
117
  end
99
118
  end
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Solargraph
4
- # A pair of positions that compose a section of text.
4
+ # A pair of Positions that compose a section of text in code.
5
5
  #
6
6
  class Range
7
+ include Equality
8
+
7
9
  # @return [Position]
8
10
  attr_reader :start
9
11
 
@@ -17,6 +19,24 @@ module Solargraph
17
19
  @ending = ending
18
20
  end
19
21
 
22
+ # @sg-ignore Fix "Not enough arguments to Module#protected"
23
+ protected def equality_fields
24
+ [start, ending]
25
+ end
26
+
27
+ # @param other [BasicObject]
28
+ def <=>(other)
29
+ return nil unless other.is_a?(Range)
30
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
31
+ if start == other.start
32
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
33
+ ending <=> other.ending
34
+ else
35
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
36
+ start <=> other.start
37
+ end
38
+ end
39
+
20
40
  # Get a hash of the range. This representation is suitable for use in
21
41
  # the language server protocol.
22
42
  #
@@ -65,9 +85,7 @@ module Solargraph
65
85
  # @param node [Parser::AST::Node]
66
86
  # @return [Range, nil]
67
87
  def self.from_node node
68
- if Parser.rubyvm? && node.is_a?(RubyVM::AbstractSyntaxTree::Node)
69
- Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
70
- elsif node&.loc && node.loc.expression
88
+ if node&.loc && node.loc.expression
71
89
  from_expr(node.loc.expression)
72
90
  end
73
91
  end
@@ -83,6 +101,7 @@ module Solargraph
83
101
 
84
102
  def == other
85
103
  return false unless other.is_a?(Range)
104
+ # @sg-ignore https://github.com/castwide/solargraph/pull/1114
86
105
  start == other.start && ending == other.ending
87
106
  end
88
107