solargraph 0.59.0.dev.1 → 0.59.0.dev.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/plugins.yml +4 -1
  3. data/.github/workflows/rspec.yml +3 -14
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +32 -5
  6. data/.rubocop_todo.yml +37 -931
  7. data/CHANGELOG.md +7 -1
  8. data/Gemfile +3 -1
  9. data/Rakefile +25 -23
  10. data/bin/solargraph +2 -1
  11. data/lib/solargraph/api_map/index.rb +5 -11
  12. data/lib/solargraph/api_map/source_to_yard.rb +9 -8
  13. data/lib/solargraph/api_map/store.rb +22 -20
  14. data/lib/solargraph/api_map.rb +50 -37
  15. data/lib/solargraph/bench.rb +44 -45
  16. data/lib/solargraph/complex_type/type_methods.rb +12 -15
  17. data/lib/solargraph/complex_type/unique_type.rb +54 -43
  18. data/lib/solargraph/complex_type.rb +69 -61
  19. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  20. data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
  21. data/lib/solargraph/convention/data_definition.rb +1 -1
  22. data/lib/solargraph/convention/gemfile.rb +15 -15
  23. data/lib/solargraph/convention/gemspec.rb +23 -23
  24. data/lib/solargraph/convention/rakefile.rb +17 -17
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
  27. data/lib/solargraph/convention/struct_definition.rb +3 -3
  28. data/lib/solargraph/convention.rb +78 -78
  29. data/lib/solargraph/converters/dd.rb +19 -17
  30. data/lib/solargraph/converters/dl.rb +17 -15
  31. data/lib/solargraph/converters/dt.rb +17 -15
  32. data/lib/solargraph/converters/misc.rb +3 -1
  33. data/lib/solargraph/diagnostics/rubocop.rb +10 -10
  34. data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
  35. data/lib/solargraph/diagnostics/type_check.rb +10 -10
  36. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  37. data/lib/solargraph/doc_map.rb +9 -10
  38. data/lib/solargraph/equality.rb +3 -3
  39. data/lib/solargraph/gem_pins.rb +7 -5
  40. data/lib/solargraph/language_server/error_codes.rb +20 -20
  41. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  42. data/lib/solargraph/language_server/host/dispatch.rb +2 -3
  43. data/lib/solargraph/language_server/host/message_worker.rb +2 -2
  44. data/lib/solargraph/language_server/host/sources.rb +1 -1
  45. data/lib/solargraph/language_server/host.rb +24 -21
  46. data/lib/solargraph/language_server/message/base.rb +97 -97
  47. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  48. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  49. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
  50. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  51. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  52. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  53. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  54. data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
  55. data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
  56. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  57. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
  58. data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
  59. data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
  60. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  61. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  62. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  63. data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
  64. data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
  65. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  66. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  67. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  68. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
  69. data/lib/solargraph/language_server/message.rb +94 -94
  70. data/lib/solargraph/language_server/request.rb +29 -27
  71. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  72. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  73. data/lib/solargraph/library.rb +28 -33
  74. data/lib/solargraph/location.rb +10 -12
  75. data/lib/solargraph/logging.rb +4 -4
  76. data/lib/solargraph/page.rb +92 -92
  77. data/lib/solargraph/parser/comment_ripper.rb +12 -4
  78. data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -42
  79. data/lib/solargraph/parser/node_processor/base.rb +4 -4
  80. data/lib/solargraph/parser/node_processor.rb +1 -1
  81. data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -4
  82. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  83. data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
  84. data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
  85. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
  86. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -1
  87. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
  88. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  89. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
  90. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
  91. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
  92. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
  93. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
  94. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  95. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
  96. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
  97. data/lib/solargraph/parser/parser_gem.rb +14 -12
  98. data/lib/solargraph/parser/snippet.rb +2 -0
  99. data/lib/solargraph/parser.rb +25 -23
  100. data/lib/solargraph/pin/base.rb +78 -64
  101. data/lib/solargraph/pin/base_variable.rb +28 -71
  102. data/lib/solargraph/pin/block.rb +3 -2
  103. data/lib/solargraph/pin/breakable.rb +2 -0
  104. data/lib/solargraph/pin/callable.rb +23 -26
  105. data/lib/solargraph/pin/closure.rb +5 -4
  106. data/lib/solargraph/pin/common.rb +5 -2
  107. data/lib/solargraph/pin/compound_statement.rb +3 -3
  108. data/lib/solargraph/pin/constant.rb +43 -45
  109. data/lib/solargraph/pin/conversions.rb +9 -4
  110. data/lib/solargraph/pin/delegated_method.rb +4 -4
  111. data/lib/solargraph/pin/documenting.rb +3 -2
  112. data/lib/solargraph/pin/local_variable.rb +4 -4
  113. data/lib/solargraph/pin/method.rb +71 -70
  114. data/lib/solargraph/pin/namespace.rb +13 -12
  115. data/lib/solargraph/pin/parameter.rb +28 -27
  116. data/lib/solargraph/pin/proxy_type.rb +2 -0
  117. data/lib/solargraph/pin/reference.rb +17 -0
  118. data/lib/solargraph/pin/search.rb +2 -2
  119. data/lib/solargraph/pin/signature.rb +9 -14
  120. data/lib/solargraph/pin/symbol.rb +1 -0
  121. data/lib/solargraph/pin/until.rb +1 -3
  122. data/lib/solargraph/pin/while.rb +1 -3
  123. data/lib/solargraph/pin_cache.rb +16 -19
  124. data/lib/solargraph/position.rb +35 -17
  125. data/lib/solargraph/range.rb +10 -9
  126. data/lib/solargraph/rbs_map/conversions.rb +312 -206
  127. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  128. data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
  129. data/lib/solargraph/rbs_map.rb +3 -12
  130. data/lib/solargraph/server_methods.rb +16 -16
  131. data/lib/solargraph/shell.rb +63 -53
  132. data/lib/solargraph/source/chain/array.rb +39 -37
  133. data/lib/solargraph/source/chain/call.rb +49 -44
  134. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  135. data/lib/solargraph/source/chain/constant.rb +3 -1
  136. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  137. data/lib/solargraph/source/chain/hash.rb +8 -6
  138. data/lib/solargraph/source/chain/if.rb +11 -10
  139. data/lib/solargraph/source/chain/instance_variable.rb +3 -1
  140. data/lib/solargraph/source/chain/link.rb +99 -109
  141. data/lib/solargraph/source/chain/literal.rb +4 -6
  142. data/lib/solargraph/source/chain/or.rb +2 -4
  143. data/lib/solargraph/source/chain/q_call.rb +13 -11
  144. data/lib/solargraph/source/chain/variable.rb +15 -13
  145. data/lib/solargraph/source/chain/z_super.rb +28 -30
  146. data/lib/solargraph/source/chain.rb +24 -16
  147. data/lib/solargraph/source/change.rb +3 -3
  148. data/lib/solargraph/source/cursor.rb +18 -18
  149. data/lib/solargraph/source/encoding_fixes.rb +6 -7
  150. data/lib/solargraph/source/source_chainer.rb +46 -32
  151. data/lib/solargraph/source/updater.rb +1 -1
  152. data/lib/solargraph/source.rb +27 -29
  153. data/lib/solargraph/source_map/clip.rb +38 -30
  154. data/lib/solargraph/source_map/mapper.rb +52 -46
  155. data/lib/solargraph/source_map.rb +8 -4
  156. data/lib/solargraph/type_checker/rules.rb +8 -8
  157. data/lib/solargraph/type_checker.rb +95 -101
  158. data/lib/solargraph/version.rb +1 -1
  159. data/lib/solargraph/workspace/config.rb +10 -9
  160. data/lib/solargraph/workspace/gemspecs.rb +1 -1
  161. data/lib/solargraph/workspace.rb +21 -44
  162. data/lib/solargraph/yard_map/helpers.rb +6 -2
  163. data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
  164. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
  165. data/lib/solargraph/yard_map/mapper.rb +12 -12
  166. data/lib/solargraph/yard_tags.rb +20 -20
  167. data/lib/solargraph.rb +5 -5
  168. data/solargraph.gemspec +35 -34
  169. metadata +28 -28
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Solargraph
2
4
  module Pin
3
5
  class Signature < Callable
@@ -5,10 +7,6 @@ module Solargraph
5
7
  # to the method pin
6
8
  attr_writer :closure
7
9
 
8
- def initialize **splat
9
- super(**splat)
10
- end
11
-
12
10
  def generics
13
11
  # @type [Array<::String, nil>]
14
12
  @generics ||= [].freeze
@@ -18,8 +16,6 @@ module Solargraph
18
16
  @identity ||= "signature#{object_id}"
19
17
  end
20
18
 
21
- attr_writer :closure
22
-
23
19
  # @ sg-ignore need boolish support for ? methods
24
20
  def dodgy_return_type_source?
25
21
  super || closure&.dodgy_return_type_source?
@@ -49,16 +45,15 @@ module Solargraph
49
45
  method_stack = closure.rest_of_stack api_map
50
46
  logger.debug { "Signature#typify(self=#{self}) - method_stack: #{method_stack}" }
51
47
  method_stack.each do |pin|
52
- sig = pin.signatures.find { |s| s.arity == self.arity }
48
+ sig = pin.signatures.find { |s| s.arity == arity }
53
49
  next unless sig
54
50
  # @sg-ignore Need to add nil check here
55
- unless sig.return_type.undefined?
56
- # @sg-ignore Need to add nil check here
57
- qualified = sig.return_type.qualify(api_map, closure.namespace)
58
- # @sg-ignore Need to add nil check here
59
- logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
60
- return qualified
61
- end
51
+ next if sig.return_type.undefined?
52
+ # @sg-ignore Need to add nil check here
53
+ qualified = sig.return_type.qualify(api_map, closure.namespace)
54
+ # @sg-ignore Need to add nil check here
55
+ logger.debug { "Signature#typify(self=#{self}) => #{qualified.rooted_tags.inspect}" }
56
+ return qualified
62
57
  end
63
58
  out = super
64
59
  logger.debug { "Signature#typify(self=#{self}) => #{out}" }
@@ -5,6 +5,7 @@ module Solargraph
5
5
  class Symbol < Base
6
6
  # @param location [Solargraph::Location, nil]
7
7
  # @param name [String]
8
+ # @param [Hash{Symbol => Object}] kwargs
8
9
  def initialize(location, name, **kwargs)
9
10
  # @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
10
11
  super(location: location, name: name, **kwargs)
@@ -5,10 +5,8 @@ module Solargraph
5
5
  class Until < CompoundStatement
6
6
  include Breakable
7
7
 
8
- # @param receiver [Parser::AST::Node, nil]
9
8
  # @param node [Parser::AST::Node, nil]
10
- # @param context [ComplexType, nil]
11
- # @param args [::Array<Parameter>]
9
+ # @param [Hash{Symbol => Object}] splat
12
10
  def initialize node: nil, **splat
13
11
  super(**splat)
14
12
  @node = node
@@ -5,10 +5,8 @@ module Solargraph
5
5
  class While < CompoundStatement
6
6
  include Breakable
7
7
 
8
- # @param receiver [Parser::AST::Node, nil]
9
8
  # @param node [Parser::AST::Node, nil]
10
- # @param context [ComplexType, nil]
11
- # @param args [::Array<Parameter>]
9
+ # @param [Hash{Symbol => Object}] splat
12
10
  def initialize node: nil, **splat
13
11
  super(**splat)
14
12
  @node = node
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'rbs'
3
5
  require 'rubygems'
@@ -408,6 +410,7 @@ module Solargraph
408
410
 
409
411
  # @return [void]
410
412
  # @param path_segments [Array<String>]
413
+ # @param out [StringIO, IO, nil]
411
414
  def uncache_by_prefix *path_segments, out: nil
412
415
  path = File.join(*path_segments)
413
416
  glob = "#{path}*"
@@ -447,7 +450,7 @@ module Solargraph
447
450
  path = File.join(*path_segments)
448
451
  if File.exist?(path)
449
452
  FileUtils.rm_rf path, secure: true
450
- out.puts "Clearing pin cache in #{path}" unless out.nil?
453
+ out&.puts "Clearing pin cache in #{path}"
451
454
  else
452
455
  out&.puts "Pin cache file #{path} does not exist"
453
456
  end
@@ -459,11 +462,11 @@ module Solargraph
459
462
  def uncache_by_prefix *path_segments, out: nil
460
463
  path = File.join(*path_segments)
461
464
  glob = "#{path}*"
462
- out.puts "Clearing pin cache in #{glob}" unless out.nil?
465
+ out&.puts "Clearing pin cache in #{glob}"
463
466
  Dir.glob(glob).each do |file|
464
467
  next unless File.file?(file)
465
468
  FileUtils.rm_rf file, secure: true
466
- out.puts "Clearing pin cache in #{file}" unless out.nil?
469
+ out&.puts "Clearing pin cache in #{file}"
467
470
  end
468
471
  end
469
472
 
@@ -538,40 +541,34 @@ module Solargraph
538
541
 
539
542
  # @param gemspec [Gem::Specification]
540
543
  # @return [Array<Pin::Base>, nil]
541
- def deserialize_yard_gem(gemspec)
544
+ def deserialize_yard_gem gemspec
542
545
  load(yard_gem_path(gemspec))
543
546
  end
544
547
 
545
548
  # @param gemspec [Gem::Specification]
546
549
  # @param pins [Array<Pin::Base>]
547
550
  # @return [void]
548
- def serialize_yard_gem(gemspec, pins)
551
+ def serialize_yard_gem gemspec, pins
549
552
  save(yard_gem_path(gemspec), pins)
550
553
  end
551
554
 
552
- # @param gemspec [Gem::Specification]
553
- # @return [Boolean]
554
- def has_yard?(gemspec)
555
- exist?(yard_gem_path(gemspec))
556
- end
557
-
558
555
  # @param gemspec [Gem::Specification]
559
556
  # @param hash [String, nil]
560
557
  # @return [String]
561
- def rbs_collection_path(gemspec, hash)
558
+ def rbs_collection_path gemspec, hash
562
559
  File.join(work_dir, 'rbs', "#{gemspec.name}-#{gemspec.version}-#{hash || 0}.ser")
563
560
  end
564
561
 
565
562
  # @param gemspec [Gem::Specification]
566
563
  # @return [String]
567
- def rbs_collection_path_prefix(gemspec)
564
+ def rbs_collection_path_prefix gemspec
568
565
  File.join(work_dir, 'rbs', "#{gemspec.name}-#{gemspec.version}-")
569
566
  end
570
567
 
571
568
  # @param gemspec [Gem::Specification]
572
569
  # @param hash [String, nil]
573
570
  # @return [Array<Pin::Base>, nil]
574
- def deserialize_rbs_collection_gem(gemspec, hash)
571
+ def deserialize_rbs_collection_gem gemspec, hash
575
572
  load(rbs_collection_path(gemspec, hash))
576
573
  end
577
574
 
@@ -579,20 +576,20 @@ module Solargraph
579
576
  # @param hash [String, nil]
580
577
  # @param pins [Array<Pin::Base>]n
581
578
  # @return [void]
582
- def serialize_rbs_collection_gem(gemspec, hash, pins)
579
+ def serialize_rbs_collection_gem gemspec, hash, pins
583
580
  save(rbs_collection_path(gemspec, hash), pins)
584
581
  end
585
582
 
586
583
  # @param gemspec [Gem::Specification]
587
584
  # @param hash [String, nil]
588
585
  # @return [String]
589
- def combined_path(gemspec, hash)
586
+ def combined_path gemspec, hash
590
587
  File.join(work_dir, 'combined', "#{gemspec.name}-#{gemspec.version}-#{hash || 0}.ser")
591
588
  end
592
589
 
593
590
  # @param gemspec [Gem::Specification]
594
591
  # @return [String]
595
- def combined_path_prefix(gemspec)
592
+ def combined_path_prefix gemspec
596
593
  File.join(work_dir, 'combined', "#{gemspec.name}-#{gemspec.version}-")
597
594
  end
598
595
 
@@ -600,7 +597,7 @@ module Solargraph
600
597
  # @param hash [String, nil]
601
598
  # @param pins [Array<Pin::Base>]
602
599
  # @return [void]
603
- def serialize_combined_gem(gemspec, hash, pins)
600
+ def serialize_combined_gem gemspec, hash, pins
604
601
  save(combined_path(gemspec, hash), pins)
605
602
  end
606
603
 
@@ -614,7 +611,7 @@ module Solargraph
614
611
  # @param gemspec [Gem::Specification]
615
612
  # @param hash [String, nil]
616
613
  # @return [Boolean]
617
- def has_rbs_collection?(gemspec, hash)
614
+ def has_rbs_collection? gemspec, hash
618
615
  exist?(rbs_collection_path(gemspec, hash))
619
616
  end
620
617
 
@@ -21,12 +21,8 @@ module Solargraph
21
21
  @character = character
22
22
  end
23
23
 
24
- protected def equality_fields
25
- [line, character]
26
- end
27
-
28
24
  # @param other [Position]
29
- def <=>(other)
25
+ def <=> other
30
26
  return nil unless other.is_a?(Position)
31
27
  if line == other.line
32
28
  character <=> other.character
@@ -57,7 +53,22 @@ module Solargraph
57
53
  # @return [Integer]
58
54
  def self.to_offset text, position
59
55
  return 0 if text.empty?
60
- text.lines[0...position.line].sum(&:length) + position.character
56
+
57
+ newline_index = -1
58
+ line = -1
59
+ last_line_index = 0
60
+
61
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
62
+ while (newline_index = text.index("\n", newline_index + 1)) && line <= position.line
63
+ line += 1
64
+ break if line == position.line
65
+
66
+ last_line_index = newline_index
67
+ end
68
+
69
+ last_line_index += 1 if position.line.positive?
70
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
71
+ last_line_index + position.character
61
72
  end
62
73
 
63
74
  # Get a numeric offset for the specified text and a position identified
@@ -73,25 +84,26 @@ module Solargraph
73
84
 
74
85
  # Get a position for the specified text and offset.
75
86
  #
87
+ # @raise [InvalidOffsetError] if the offset is outside the text range
88
+ #
76
89
  # @param text [String]
77
90
  # @param offset [Integer]
78
91
  # @return [Position]
79
92
  def self.from_offset text, offset
93
+ raise InvalidOffsetError if offset > text.length
94
+
80
95
  cursor = 0
81
96
  line = 0
82
- # @type [Integer, nil]
83
- character = nil
84
- text.lines.each do |l|
85
- line_length = l.length
86
- char_length = l.chomp.length
87
- if cursor + char_length >= offset
88
- character = offset - cursor
89
- break
90
- end
91
- cursor += line_length
97
+ character = offset
98
+ newline_index = -1
99
+
100
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
101
+ while (newline_index = text.index("\n", newline_index + 1)) && newline_index < offset
92
102
  line += 1
103
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
104
+ character = offset - newline_index - 1
93
105
  end
94
- character = 0 if character.nil? and (cursor - offset).between?(0, 1)
106
+ character = 0 if character.nil? && (cursor - offset).between?(0, 1)
95
107
  raise InvalidOffsetError if character.nil?
96
108
  # @sg-ignore flow sensitive typing needs to handle 'raise if'
97
109
  Position.new(line, character)
@@ -114,5 +126,11 @@ module Solargraph
114
126
  return false unless other.is_a?(Position)
115
127
  line == other.line and character == other.character
116
128
  end
129
+
130
+ protected
131
+
132
+ def equality_fields
133
+ [line, character]
134
+ end
117
135
  end
118
136
  end
@@ -19,12 +19,8 @@ module Solargraph
19
19
  @ending = ending
20
20
  end
21
21
 
22
- protected def equality_fields
23
- [start, ending]
24
- end
25
-
26
22
  # @param other [BasicObject]
27
- def <=>(other)
23
+ def <=> other
28
24
  return nil unless other.is_a?(Range)
29
25
  if start == other.start
30
26
  ending <=> other.ending
@@ -36,7 +32,7 @@ module Solargraph
36
32
  # Get a hash of the range. This representation is suitable for use in
37
33
  # the language server protocol.
38
34
  #
39
- # @return [Hash<Symbol, Position>]
35
+ # @return [Hash{Symbol => Position}]
40
36
  def to_hash
41
37
  {
42
38
  start: start.to_hash,
@@ -86,9 +82,8 @@ module Solargraph
86
82
  # @param node [::Parser::AST::Node]
87
83
  # @return [Range, nil]
88
84
  def self.from_node node
89
- if node&.loc && node.loc.expression
90
- from_expr(node.loc.expression)
91
- end
85
+ return unless node&.loc&.expression
86
+ from_expr(node.loc.expression)
92
87
  end
93
88
 
94
89
  # Get a range from a Parser range, usually found in
@@ -108,5 +103,11 @@ module Solargraph
108
103
  def inspect
109
104
  "#<#{self.class} #{start.inspect} to #{ending.inspect}>"
110
105
  end
106
+
107
+ protected
108
+
109
+ def equality_fields
110
+ [start, ending]
111
+ end
111
112
  end
112
113
  end