solargraph 0.54.0 → 0.55.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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +58 -0
  3. data/lib/solargraph/api_map/cache.rb +10 -1
  4. data/lib/solargraph/api_map/index.rb +167 -0
  5. data/lib/solargraph/api_map/store.rb +75 -122
  6. data/lib/solargraph/api_map.rb +109 -41
  7. data/lib/solargraph/bench.rb +17 -1
  8. data/lib/solargraph/complex_type/type_methods.rb +17 -11
  9. data/lib/solargraph/complex_type/unique_type.rb +181 -17
  10. data/lib/solargraph/complex_type.rb +103 -24
  11. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -0
  12. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
  13. data/lib/solargraph/convention/struct_definition.rb +101 -0
  14. data/lib/solargraph/convention.rb +2 -0
  15. data/lib/solargraph/doc_map.rb +43 -18
  16. data/lib/solargraph/equality.rb +33 -0
  17. data/lib/solargraph/language_server/host/message_worker.rb +51 -5
  18. data/lib/solargraph/language_server/host.rb +13 -11
  19. data/lib/solargraph/language_server/message/base.rb +19 -12
  20. data/lib/solargraph/language_server/message/initialize.rb +3 -1
  21. data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
  22. data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
  23. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
  24. data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -0
  25. data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
  26. data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
  27. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
  28. data/lib/solargraph/language_server/progress.rb +19 -2
  29. data/lib/solargraph/library.rb +31 -41
  30. data/lib/solargraph/location.rb +29 -1
  31. data/lib/solargraph/parser/comment_ripper.rb +11 -6
  32. data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
  33. data/lib/solargraph/parser/node_methods.rb +15 -1
  34. data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
  35. data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
  36. data/lib/solargraph/parser/parser_gem/node_methods.rb +6 -4
  37. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
  38. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +23 -19
  39. data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
  40. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
  41. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +8 -2
  42. data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
  43. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
  44. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +1 -1
  45. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
  46. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
  47. data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
  48. data/lib/solargraph/parser.rb +3 -5
  49. data/lib/solargraph/pin/base.rb +47 -17
  50. data/lib/solargraph/pin/base_variable.rb +11 -4
  51. data/lib/solargraph/pin/block.rb +8 -26
  52. data/lib/solargraph/pin/breakable.rb +9 -0
  53. data/lib/solargraph/pin/callable.rb +147 -0
  54. data/lib/solargraph/pin/closure.rb +8 -3
  55. data/lib/solargraph/pin/common.rb +2 -6
  56. data/lib/solargraph/pin/conversions.rb +3 -2
  57. data/lib/solargraph/pin/instance_variable.rb +2 -2
  58. data/lib/solargraph/pin/local_variable.rb +7 -1
  59. data/lib/solargraph/pin/method.rb +76 -48
  60. data/lib/solargraph/pin/namespace.rb +14 -11
  61. data/lib/solargraph/pin/parameter.rb +24 -17
  62. data/lib/solargraph/pin/proxy_type.rb +13 -7
  63. data/lib/solargraph/pin/signature.rb +3 -129
  64. data/lib/solargraph/pin/until.rb +18 -0
  65. data/lib/solargraph/pin/while.rb +18 -0
  66. data/lib/solargraph/pin.rb +7 -1
  67. data/lib/solargraph/position.rb +7 -0
  68. data/lib/solargraph/range.rb +9 -4
  69. data/lib/solargraph/rbs_map/conversions.rb +84 -45
  70. data/lib/solargraph/rbs_map/core_fills.rb +16 -9
  71. data/lib/solargraph/rbs_map.rb +1 -0
  72. data/lib/solargraph/shell.rb +19 -2
  73. data/lib/solargraph/source/chain/array.rb +10 -8
  74. data/lib/solargraph/source/chain/block_symbol.rb +1 -1
  75. data/lib/solargraph/source/chain/block_variable.rb +1 -1
  76. data/lib/solargraph/source/chain/call.rb +125 -61
  77. data/lib/solargraph/source/chain/constant.rb +1 -1
  78. data/lib/solargraph/source/chain/hash.rb +8 -2
  79. data/lib/solargraph/source/chain/if.rb +5 -0
  80. data/lib/solargraph/source/chain/link.rb +28 -5
  81. data/lib/solargraph/source/chain/literal.rb +27 -2
  82. data/lib/solargraph/source/chain/or.rb +1 -1
  83. data/lib/solargraph/source/chain/z_super.rb +1 -1
  84. data/lib/solargraph/source/chain.rb +131 -63
  85. data/lib/solargraph/source/cursor.rb +3 -2
  86. data/lib/solargraph/source/source_chainer.rb +2 -2
  87. data/lib/solargraph/source.rb +104 -86
  88. data/lib/solargraph/source_map/clip.rb +8 -6
  89. data/lib/solargraph/source_map/data.rb +30 -0
  90. data/lib/solargraph/source_map.rb +28 -16
  91. data/lib/solargraph/type_checker/checks.rb +4 -0
  92. data/lib/solargraph/type_checker/rules.rb +6 -1
  93. data/lib/solargraph/type_checker.rb +48 -21
  94. data/lib/solargraph/version.rb +1 -1
  95. data/lib/solargraph/views/environment.erb +3 -5
  96. data/lib/solargraph/workspace/config.rb +7 -3
  97. data/lib/solargraph/workspace.rb +1 -1
  98. data/lib/solargraph/yard_map/mapper/to_constant.rb +1 -0
  99. data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
  100. data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
  101. data/lib/solargraph/yard_map/mapper.rb +1 -0
  102. data/lib/solargraph/yardoc.rb +1 -1
  103. data/lib/solargraph.rb +1 -0
  104. data/solargraph.gemspec +5 -5
  105. metadata +41 -25
@@ -14,21 +14,23 @@ module Solargraph
14
14
  # @param type [::Symbol] :class or :module
15
15
  # @param visibility [::Symbol] :public or :private
16
16
  # @param gates [::Array<String>]
17
- def initialize type: :class, visibility: :public, gates: [''], **splat
17
+ # @param name [String]
18
+ def initialize type: :class, visibility: :public, gates: [''], name: '', **splat
18
19
  # super(location, namespace, name, comments)
19
- super(**splat)
20
+ super(**splat, name: name)
20
21
  @type = type
21
22
  @visibility = visibility
22
23
  if name.start_with?('::')
23
- @name = name[2..-1]
24
+ # @type [String]
25
+ name = name[2..-1] || ''
24
26
  @closure = Solargraph::Pin::ROOT_PIN
25
27
  end
26
28
  @open_gates = gates
27
- if @name.include?('::')
29
+ if name.include?('::')
28
30
  # In this case, a chained namespace was opened (e.g., Foo::Bar)
29
31
  # but Foo does not exist.
30
- parts = @name.split('::')
31
- @name = parts.pop
32
+ parts = name.split('::')
33
+ name = parts.pop
32
34
  closure_name = if [Solargraph::Pin::ROOT_PIN, nil].include?(closure)
33
35
  ''
34
36
  else
@@ -38,17 +40,18 @@ module Solargraph
38
40
  @closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
39
41
  @context = nil
40
42
  end
43
+ @name = name
41
44
  end
42
45
 
43
46
  def to_rbs
44
- "#{@type.to_s} #{generics_as_rbs}#{return_type.to_rbs}"
47
+ "#{@type.to_s} #{return_type.all_params.first.to_rbs}#{rbs_generics}".strip
45
48
  end
46
49
 
47
50
  def desc
48
- if name.nil?
51
+ if name.nil? || name.empty?
49
52
  '(top-level)'
50
53
  else
51
- to_rbs
54
+ super
52
55
  end
53
56
  end
54
57
 
@@ -57,7 +60,7 @@ module Solargraph
57
60
  end
58
61
 
59
62
  def full_context
60
- @full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
63
+ @full_context ||= ComplexType.try_parse("::#{type.to_s.capitalize}<#{path}>")
61
64
  end
62
65
 
63
66
  def binder
@@ -83,7 +86,7 @@ module Solargraph
83
86
  end
84
87
 
85
88
  def return_type
86
- @return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
89
+ @return_type ||= ComplexType.try_parse( (type == :class ? '::Class' : '::Module') + "<::#{path}>")
87
90
  end
88
91
 
89
92
  # @return [Array<String>]
@@ -3,7 +3,7 @@
3
3
  module Solargraph
4
4
  module Pin
5
5
  class Parameter < LocalVariable
6
- # @return [Symbol]
6
+ # @return [::Symbol]
7
7
  attr_reader :decl
8
8
 
9
9
  # @return [String]
@@ -11,12 +11,10 @@ module Solargraph
11
11
 
12
12
  # @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
13
13
  # @param asgn_code [String, nil]
14
- # @param return_type [ComplexType, nil]
15
- def initialize decl: :arg, asgn_code: nil, return_type: nil, **splat
14
+ def initialize decl: :arg, asgn_code: nil, **splat
16
15
  super(**splat)
17
16
  @asgn_code = asgn_code
18
17
  @decl = decl
19
- @return_type = return_type
20
18
  end
21
19
 
22
20
  def keyword?
@@ -27,6 +25,10 @@ module Solargraph
27
25
  decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
28
26
  end
29
27
 
28
+ def arg?
29
+ decl == :arg
30
+ end
31
+
30
32
  def restarg?
31
33
  decl == :restarg
32
34
  end
@@ -84,11 +86,11 @@ module Solargraph
84
86
  @return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
85
87
  if @return_type.undefined?
86
88
  if decl == :restarg
87
- @return_type = ComplexType.try_parse('Array')
89
+ @return_type = ComplexType.try_parse('::Array')
88
90
  elsif decl == :kwrestarg
89
- @return_type = ComplexType.try_parse('Hash')
91
+ @return_type = ComplexType.try_parse('::Hash')
90
92
  elsif decl == :blockarg
91
- @return_type = ComplexType.try_parse('Proc')
93
+ @return_type = ComplexType.try_parse('::Proc')
92
94
  end
93
95
  end
94
96
  end
@@ -111,12 +113,22 @@ module Solargraph
111
113
  closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
112
114
  end
113
115
 
116
+ # @param atype [ComplexType]
117
+ # @param api_map [ApiMap]
118
+ def compatible_arg?(atype, api_map)
119
+ # make sure we get types from up the method
120
+ # inheritance chain if we don't have them on this pin
121
+ ptype = typify api_map
122
+ ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
123
+ end
124
+
114
125
  def documentation
115
126
  tag = param_tag
116
127
  return '' if tag.nil? || tag.text.nil?
117
128
  tag.text
118
129
  end
119
130
 
131
+ # @param pin [Pin::Parameter]
120
132
  def try_merge! pin
121
133
  return false unless super && closure == pin.closure
122
134
  true
@@ -126,24 +138,19 @@ module Solargraph
126
138
 
127
139
  # @return [YARD::Tags::Tag, nil]
128
140
  def param_tag
129
- found = nil
130
141
  params = closure.docstring.tags(:param)
131
142
  params.each do |p|
132
- next unless p.name == name
133
- found = p
134
- break
135
- end
136
- if found.nil? and !index.nil?
137
- found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
143
+ return p if p.name == name
138
144
  end
139
- found
145
+ params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
140
146
  end
141
147
 
142
148
  # @param api_map [ApiMap]
143
149
  # @return [ComplexType]
144
150
  def typify_block_param api_map
145
- if closure.is_a?(Pin::Block) && closure.receiver
146
- return closure.typify_parameters(api_map)[index]
151
+ block_pin = closure
152
+ if block_pin.is_a?(Pin::Block) && block_pin.receiver
153
+ return block_pin.typify_parameters(api_map)[index]
147
154
  end
148
155
  ComplexType::UNDEFINED
149
156
  end
@@ -4,24 +4,30 @@ module Solargraph
4
4
  module Pin
5
5
  class ProxyType < Base
6
6
  # @param return_type [ComplexType]
7
- def initialize return_type: ComplexType::UNDEFINED, **splat
7
+ def initialize return_type: ComplexType::UNDEFINED, binder: nil, **splat
8
8
  super(**splat)
9
9
  @return_type = return_type
10
+ @binder = binder if binder
10
11
  end
11
12
 
12
13
  def context
13
14
  @return_type
14
15
  end
15
16
 
16
- # @param return_type [ComplexType]
17
+ # @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
18
+ # @param closure [Pin::Namespace, nil] Used as the closure for this pin
19
+ # @param binder [ComplexType, ComplexType::UniqueType, nil]
17
20
  # @return [ProxyType]
18
- def self.anonymous return_type
19
- parts = return_type.namespace.split('::')
20
- namespace = parts[0..-2].join('::').to_s
21
- name = parts.last.to_s
21
+ def self.anonymous context, closure: nil, binder: nil
22
+ unless closure
23
+ parts = context.namespace.split('::')
24
+ namespace = parts[0..-2].join('::').to_s
25
+ closure = Solargraph::Pin::Namespace.new(name: namespace)
26
+ end
27
+ # name = parts.last.to_s
22
28
  # ProxyType.new(nil, namespace, name, return_type)
23
29
  ProxyType.new(
24
- closure: Solargraph::Pin::Namespace.new(name: namespace), return_type: return_type
30
+ closure: closure, return_type: context, binder: binder || context
25
31
  )
26
32
  end
27
33
  end
@@ -1,143 +1,17 @@
1
1
  module Solargraph
2
2
  module Pin
3
- class Signature < Base
4
- # @return [::Array<Parameter>]
5
- attr_reader :parameters
6
-
7
- # @return [ComplexType]
8
- attr_reader :return_type
9
-
10
- # @return [self]
11
- attr_reader :block
12
-
13
- # @param generics [Array<String>]
14
- # @param parameters [Array<Parameter>]
15
- # @param return_type [ComplexType]
16
- # @param block [Signature, nil]
17
- def initialize generics, parameters, return_type, block = nil
18
- @generics = generics
19
- @parameters = parameters
20
- @return_type = return_type
21
- @block = block
3
+ class Signature < Callable
4
+ def initialize **splat
5
+ super(**splat)
22
6
  end
23
7
 
24
8
  def generics
25
9
  @generics ||= [].freeze
26
10
  end
27
11
 
28
- # @return [String]
29
- def to_rbs
30
- rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
31
- end
32
-
33
- # @return [String]
34
- def rbs_generics
35
- if generics.empty?
36
- return ''
37
- else
38
- return '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
39
- end
40
- end
41
-
42
- # @return [Array<String>]
43
- # @yieldparam [ComplexType]
44
- # @yieldreturn [ComplexType]
45
- # @return [self]
46
- def transform_types(&transform)
47
- # @todo 'super' alone should work here I think, but doesn't typecheck at level typed
48
- signature = super(&transform)
49
- signature.parameters = signature.parameters.map do |param|
50
- param.transform_types(&transform)
51
- end
52
- signature.block = block.transform_types(&transform) if signature.block?
53
- signature
54
- end
55
-
56
- # @param generics_to_resolve [Enumerable<String>]
57
- # @param arg_types [Array<ComplexType>, nil]
58
- # @param return_type_context [ComplexType, nil]
59
- # @param yield_arg_types [Array<ComplexType>, nil]
60
- # @param yield_return_type_context [ComplexType, nil]
61
- # @param context [ComplexType, nil]
62
- # @param resolved_generic_values [Hash{String => ComplexType}]
63
- # @return [self]
64
- def resolve_generics_from_context(generics_to_resolve,
65
- arg_types = nil,
66
- return_type_context = nil,
67
- yield_arg_types = nil,
68
- yield_return_type_context = nil,
69
- resolved_generic_values: {})
70
- signature = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
71
- signature.parameters = signature.parameters.each_with_index.map do |param, i|
72
- if arg_types.nil?
73
- param.dup
74
- else
75
- param.resolve_generics_from_context(generics_to_resolve,
76
- arg_types[i],
77
- resolved_generic_values: resolved_generic_values)
78
- end
79
- end
80
- signature.block = block.resolve_generics_from_context(generics_to_resolve,
81
- yield_arg_types,
82
- yield_return_type_context,
83
- resolved_generic_values: resolved_generic_values) if signature.block?
84
- signature
85
- end
86
-
87
- # @param generics_to_resolve [Enumerable<String>]
88
- # @param arg_types [Array<ComplexType>, nil]
89
- # @param return_type_context [ComplexType, nil]
90
- # @param yield_arg_types [Array<ComplexType>, nil]
91
- # @param yield_return_type_context [ComplexType, nil]
92
- # @param context [ComplexType, nil]
93
- # @param resolved_generic_values [Hash{String => ComplexType}]
94
- # @return [self]
95
- def resolve_generics_from_context_until_complete(generics_to_resolve,
96
- arg_types = nil,
97
- return_type_context = nil,
98
- yield_arg_types = nil,
99
- yield_return_type_context = nil,
100
- resolved_generic_values: {})
101
- # See
102
- # https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
103
- # and
104
- # https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
105
- # for other implementations
106
-
107
- return self if generics_to_resolve.empty?
108
-
109
- last_resolved_generic_values = resolved_generic_values.dup
110
- new_pin = resolve_generics_from_context(generics_to_resolve,
111
- arg_types,
112
- return_type_context,
113
- yield_arg_types,
114
- yield_return_type_context,
115
- resolved_generic_values: resolved_generic_values)
116
- if last_resolved_generic_values == resolved_generic_values
117
- # erase anything unresolved
118
- return new_pin.erase_generics(self.generics)
119
- end
120
- new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
121
- arg_types,
122
- return_type_context,
123
- yield_arg_types,
124
- yield_return_type_context,
125
- resolved_generic_values: resolved_generic_values)
126
- end
127
-
128
12
  def identity
129
13
  @identity ||= "signature#{object_id}"
130
14
  end
131
-
132
- def block?
133
- !!@block
134
- end
135
-
136
- protected
137
-
138
- attr_writer :block
139
-
140
- attr_writer :parameters
141
15
  end
142
16
  end
143
17
  end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class Until < Base
6
+ include Breakable
7
+
8
+ # @param receiver [Parser::AST::Node, nil]
9
+ # @param node [Parser::AST::Node, nil]
10
+ # @param context [ComplexType, nil]
11
+ # @param args [::Array<Parameter>]
12
+ def initialize node: nil, **splat
13
+ super(**splat)
14
+ @node = node
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ class While < Base
6
+ include Breakable
7
+
8
+ # @param receiver [Parser::AST::Node, nil]
9
+ # @param node [Parser::AST::Node, nil]
10
+ # @param context [ComplexType, nil]
11
+ # @param args [::Array<Parameter>]
12
+ def initialize node: nil, **splat
13
+ super(**splat)
14
+ @node = node
15
+ end
16
+ end
17
+ end
18
+ end
@@ -3,7 +3,9 @@
3
3
  require 'yard'
4
4
 
5
5
  module Solargraph
6
- # The namespace for pins used in maps.
6
+ # The namespace for Pins used in SourceMaps.
7
+ #
8
+ # Pins represent declarations, from gems, Sources, and the Ruby core.
7
9
  #
8
10
  module Pin
9
11
  autoload :Common, 'solargraph/pin/common'
@@ -32,6 +34,10 @@ module Solargraph
32
34
  autoload :Singleton, 'solargraph/pin/singleton'
33
35
  autoload :KeywordParam, 'solargraph/pin/keyword_param'
34
36
  autoload :Search, 'solargraph/pin/search'
37
+ autoload :Breakable, 'solargraph/pin/breakable'
38
+ autoload :Until, 'solargraph/pin/until'
39
+ autoload :While, 'solargraph/pin/while'
40
+ autoload :Callable, 'solargraph/pin/callable'
35
41
 
36
42
  ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
37
43
  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,11 @@ 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
+
22
29
  # Get a hash of the position. This representation is suitable for use in
23
30
  # the language server protocol.
24
31
  #
@@ -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,11 @@ 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
+
20
27
  # Get a hash of the range. This representation is suitable for use in
21
28
  # the language server protocol.
22
29
  #
@@ -65,9 +72,7 @@ module Solargraph
65
72
  # @param node [Parser::AST::Node]
66
73
  # @return [Range, nil]
67
74
  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
75
+ if node&.loc && node.loc.expression
71
76
  from_expr(node.loc.expression)
72
77
  end
73
78
  end