solargraph 0.58.0 → 0.59.0.dev.1

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 (166) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +4 -5
  5. data/.github/workflows/plugins.yml +40 -36
  6. data/.github/workflows/rspec.yml +45 -13
  7. data/.github/workflows/typecheck.yml +2 -2
  8. data/.rubocop_todo.yml +27 -49
  9. data/CHANGELOG.md +3 -0
  10. data/README.md +3 -3
  11. data/Rakefile +1 -0
  12. data/bin/solargraph +8 -8
  13. data/lib/solargraph/api_map/cache.rb +110 -110
  14. data/lib/solargraph/api_map/constants.rb +289 -279
  15. data/lib/solargraph/api_map/index.rb +204 -193
  16. data/lib/solargraph/api_map/source_to_yard.rb +109 -97
  17. data/lib/solargraph/api_map/store.rb +387 -384
  18. data/lib/solargraph/api_map.rb +1000 -945
  19. data/lib/solargraph/complex_type/conformance.rb +176 -0
  20. data/lib/solargraph/complex_type/type_methods.rb +242 -228
  21. data/lib/solargraph/complex_type/unique_type.rb +632 -482
  22. data/lib/solargraph/complex_type.rb +549 -444
  23. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  24. data/lib/solargraph/convention/data_definition.rb +108 -105
  25. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  26. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  27. data/lib/solargraph/convention/struct_definition.rb +168 -164
  28. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  29. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  30. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  31. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  32. data/lib/solargraph/doc_map.rb +200 -439
  33. data/lib/solargraph/equality.rb +34 -34
  34. data/lib/solargraph/gem_pins.rb +97 -98
  35. data/lib/solargraph/language_server/host/dispatch.rb +131 -130
  36. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  37. data/lib/solargraph/language_server/host/sources.rb +100 -99
  38. data/lib/solargraph/language_server/host.rb +883 -878
  39. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
  40. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  41. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  42. data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
  43. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
  44. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  45. data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
  46. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  47. data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
  48. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
  49. data/lib/solargraph/library.rb +729 -683
  50. data/lib/solargraph/location.rb +87 -82
  51. data/lib/solargraph/logging.rb +57 -37
  52. data/lib/solargraph/parser/comment_ripper.rb +76 -69
  53. data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
  54. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  55. data/lib/solargraph/parser/node_processor.rb +63 -62
  56. data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
  57. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  58. data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
  59. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  60. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  61. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  62. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
  63. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  64. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  65. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
  66. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  67. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  68. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  69. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  70. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  71. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  72. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
  73. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
  74. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  75. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  76. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  77. data/lib/solargraph/parser/region.rb +75 -69
  78. data/lib/solargraph/parser/snippet.rb +17 -17
  79. data/lib/solargraph/pin/base.rb +761 -729
  80. data/lib/solargraph/pin/base_variable.rb +418 -126
  81. data/lib/solargraph/pin/block.rb +126 -104
  82. data/lib/solargraph/pin/breakable.rb +13 -9
  83. data/lib/solargraph/pin/callable.rb +278 -231
  84. data/lib/solargraph/pin/closure.rb +68 -72
  85. data/lib/solargraph/pin/common.rb +94 -79
  86. data/lib/solargraph/pin/compound_statement.rb +55 -0
  87. data/lib/solargraph/pin/conversions.rb +124 -123
  88. data/lib/solargraph/pin/delegated_method.rb +131 -120
  89. data/lib/solargraph/pin/documenting.rb +115 -114
  90. data/lib/solargraph/pin/instance_variable.rb +38 -34
  91. data/lib/solargraph/pin/keyword.rb +16 -20
  92. data/lib/solargraph/pin/local_variable.rb +31 -75
  93. data/lib/solargraph/pin/method.rb +720 -672
  94. data/lib/solargraph/pin/method_alias.rb +42 -34
  95. data/lib/solargraph/pin/namespace.rb +121 -115
  96. data/lib/solargraph/pin/parameter.rb +338 -275
  97. data/lib/solargraph/pin/proxy_type.rb +40 -39
  98. data/lib/solargraph/pin/reference/override.rb +47 -47
  99. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  100. data/lib/solargraph/pin/reference.rb +41 -39
  101. data/lib/solargraph/pin/search.rb +62 -61
  102. data/lib/solargraph/pin/signature.rb +69 -61
  103. data/lib/solargraph/pin/symbol.rb +53 -53
  104. data/lib/solargraph/pin/until.rb +18 -18
  105. data/lib/solargraph/pin/while.rb +18 -18
  106. data/lib/solargraph/pin.rb +46 -44
  107. data/lib/solargraph/pin_cache.rb +665 -245
  108. data/lib/solargraph/position.rb +118 -119
  109. data/lib/solargraph/range.rb +112 -112
  110. data/lib/solargraph/rbs_map/conversions.rb +846 -823
  111. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  112. data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
  113. data/lib/solargraph/rbs_map.rb +217 -163
  114. data/lib/solargraph/shell.rb +397 -352
  115. data/lib/solargraph/source/chain/call.rb +372 -337
  116. data/lib/solargraph/source/chain/constant.rb +28 -26
  117. data/lib/solargraph/source/chain/hash.rb +35 -34
  118. data/lib/solargraph/source/chain/if.rb +29 -28
  119. data/lib/solargraph/source/chain/instance_variable.rb +34 -13
  120. data/lib/solargraph/source/chain/literal.rb +53 -48
  121. data/lib/solargraph/source/chain/or.rb +31 -23
  122. data/lib/solargraph/source/chain.rb +294 -291
  123. data/lib/solargraph/source/change.rb +89 -82
  124. data/lib/solargraph/source/cursor.rb +172 -166
  125. data/lib/solargraph/source/encoding_fixes.rb +23 -23
  126. data/lib/solargraph/source/source_chainer.rb +204 -194
  127. data/lib/solargraph/source/updater.rb +59 -55
  128. data/lib/solargraph/source.rb +524 -498
  129. data/lib/solargraph/source_map/clip.rb +237 -226
  130. data/lib/solargraph/source_map/data.rb +37 -34
  131. data/lib/solargraph/source_map/mapper.rb +282 -259
  132. data/lib/solargraph/source_map.rb +220 -212
  133. data/lib/solargraph/type_checker/problem.rb +34 -32
  134. data/lib/solargraph/type_checker/rules.rb +157 -84
  135. data/lib/solargraph/type_checker.rb +895 -814
  136. data/lib/solargraph/version.rb +5 -5
  137. data/lib/solargraph/workspace/config.rb +257 -255
  138. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  139. data/lib/solargraph/workspace/require_paths.rb +98 -97
  140. data/lib/solargraph/workspace.rb +362 -220
  141. data/lib/solargraph/yard_map/helpers.rb +45 -44
  142. data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
  143. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  144. data/lib/solargraph/yard_map/mapper.rb +84 -79
  145. data/lib/solargraph/yardoc.rb +97 -87
  146. data/lib/solargraph.rb +126 -105
  147. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  148. data/rbs/fills/tuple/tuple.rbs +28 -0
  149. data/rbs/shims/ast/0/node.rbs +5 -0
  150. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  151. data/rbs_collection.yaml +1 -1
  152. data/solargraph.gemspec +2 -1
  153. metadata +23 -17
  154. data/lib/solargraph/type_checker/checks.rb +0 -124
  155. data/lib/solargraph/type_checker/param_def.rb +0 -37
  156. data/lib/solargraph/yard_map/to_method.rb +0 -89
  157. data/sig/shims/ast/0/node.rbs +0 -5
  158. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  159. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  160. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  161. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  162. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  163. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  164. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  165. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  166. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,119 +1,118 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # The zero-based line and column numbers of a position in a string.
5
- #
6
- class Position
7
- include Equality
8
-
9
- # @return [Integer]
10
- attr_reader :line
11
-
12
- # @return [Integer]
13
- attr_reader :character
14
-
15
- alias column character
16
-
17
- # @param line [Integer]
18
- # @param character [Integer]
19
- def initialize line, character
20
- @line = line
21
- @character = character
22
- end
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
-
39
- # Get a hash of the position. This representation is suitable for use in
40
- # the language server protocol.
41
- #
42
- # @return [Hash]
43
- def to_hash
44
- {
45
- line: line,
46
- character: character
47
- }
48
- end
49
-
50
- def inspect
51
- "#<#{self.class} #{line}, #{character}>"
52
- end
53
-
54
- # Get a numeric offset for the specified text and position.
55
- #
56
- # @param text [String]
57
- # @param position [Position]
58
- # @return [Integer]
59
- def self.to_offset text, position
60
- return 0 if text.empty?
61
- # @sg-ignore Unresolved call to + on Integer
62
- text.lines[0...position.line].sum(&:length) + position.character
63
- end
64
-
65
- # Get a numeric offset for the specified text and a position identified
66
- # by its line and character.
67
- #
68
- # @param text [String]
69
- # @param line [Integer]
70
- # @param character [Integer]
71
- # @return [Integer]
72
- def self.line_char_to_offset text, line, character
73
- to_offset(text, Position.new(line, character))
74
- end
75
-
76
- # Get a position for the specified text and offset.
77
- #
78
- # @param text [String]
79
- # @param offset [Integer]
80
- # @return [Position]
81
- def self.from_offset text, offset
82
- cursor = 0
83
- line = 0
84
- character = nil
85
- text.lines.each do |l|
86
- line_length = l.length
87
- char_length = l.chomp.length
88
- if cursor + char_length >= offset
89
- character = offset - cursor
90
- break
91
- end
92
- cursor += line_length
93
- line += 1
94
- end
95
- character = 0 if character.nil? and (cursor - offset).between?(0, 1)
96
- raise InvalidOffsetError if character.nil?
97
- Position.new(line, character)
98
- end
99
-
100
- # A helper method for generating positions from arrays of integers. The
101
- # original parameter is returned if it is already a position.
102
- #
103
- # @raise [ArgumentError] if the object cannot be converted to a position.
104
- #
105
- # @param object [Position, Array(Integer, Integer)]
106
- # @return [Position]
107
- def self.normalize object
108
- return object if object.is_a?(Position)
109
- return Position.new(object[0], object[1]) if object.is_a?(Array)
110
- raise ArgumentError, "Unable to convert #{object.class} to Position"
111
- end
112
-
113
- def == other
114
- return false unless other.is_a?(Position)
115
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
116
- line == other.line and character == other.character
117
- end
118
- end
119
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # The zero-based line and column numbers of a position in a string.
5
+ #
6
+ class Position
7
+ include Equality
8
+
9
+ # @return [Integer]
10
+ attr_reader :line
11
+
12
+ # @return [Integer]
13
+ attr_reader :character
14
+
15
+ alias column character
16
+
17
+ # @param line [Integer]
18
+ # @param character [Integer]
19
+ def initialize line, character
20
+ @line = line
21
+ @character = character
22
+ end
23
+
24
+ protected def equality_fields
25
+ [line, character]
26
+ end
27
+
28
+ # @param other [Position]
29
+ def <=>(other)
30
+ return nil unless other.is_a?(Position)
31
+ if line == other.line
32
+ character <=> other.character
33
+ else
34
+ line <=> other.line
35
+ end
36
+ end
37
+
38
+ # Get a hash of the position. This representation is suitable for use in
39
+ # the language server protocol.
40
+ #
41
+ # @return [Hash]
42
+ def to_hash
43
+ {
44
+ line: line,
45
+ character: character
46
+ }
47
+ end
48
+
49
+ def inspect
50
+ "#<#{self.class} #{line}, #{character}>"
51
+ end
52
+
53
+ # Get a numeric offset for the specified text and position.
54
+ #
55
+ # @param text [String]
56
+ # @param position [Position]
57
+ # @return [Integer]
58
+ def self.to_offset text, position
59
+ return 0 if text.empty?
60
+ text.lines[0...position.line].sum(&:length) + position.character
61
+ end
62
+
63
+ # Get a numeric offset for the specified text and a position identified
64
+ # by its line and character.
65
+ #
66
+ # @param text [String]
67
+ # @param line [Integer]
68
+ # @param character [Integer]
69
+ # @return [Integer]
70
+ def self.line_char_to_offset text, line, character
71
+ to_offset(text, Position.new(line, character))
72
+ end
73
+
74
+ # Get a position for the specified text and offset.
75
+ #
76
+ # @param text [String]
77
+ # @param offset [Integer]
78
+ # @return [Position]
79
+ def self.from_offset text, offset
80
+ cursor = 0
81
+ 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
92
+ line += 1
93
+ end
94
+ character = 0 if character.nil? and (cursor - offset).between?(0, 1)
95
+ raise InvalidOffsetError if character.nil?
96
+ # @sg-ignore flow sensitive typing needs to handle 'raise if'
97
+ Position.new(line, character)
98
+ end
99
+
100
+ # A helper method for generating positions from arrays of integers. The
101
+ # original parameter is returned if it is already a position.
102
+ #
103
+ # @raise [ArgumentError] if the object cannot be converted to a position.
104
+ #
105
+ # @param object [Position, Array(Integer, Integer)]
106
+ # @return [Position]
107
+ def self.normalize object
108
+ return object if object.is_a?(Position)
109
+ return Position.new(object[0], object[1]) if object.is_a?(Array)
110
+ raise ArgumentError, "Unable to convert #{object.class} to Position"
111
+ end
112
+
113
+ def == other
114
+ return false unless other.is_a?(Position)
115
+ line == other.line and character == other.character
116
+ end
117
+ end
118
+ end
@@ -1,112 +1,112 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- # A pair of Positions that compose a section of text in code.
5
- #
6
- class Range
7
- include Equality
8
-
9
- # @return [Position]
10
- attr_reader :start
11
-
12
- # @return [Position]
13
- attr_reader :ending
14
-
15
- # @param start [Position]
16
- # @param ending [Position]
17
- def initialize start, ending
18
- @start = start
19
- @ending = ending
20
- end
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
-
40
- # Get a hash of the range. This representation is suitable for use in
41
- # the language server protocol.
42
- #
43
- # @return [Hash<Symbol, Position>]
44
- def to_hash
45
- {
46
- start: start.to_hash,
47
- end: ending.to_hash
48
- }
49
- end
50
-
51
- # True if the specified position is inside the range.
52
- #
53
- # @param position [Position, Array(Integer, Integer)]
54
- # @return [Boolean]
55
- def contain? position
56
- position = Position.normalize(position)
57
- return false if position.line < start.line || position.line > ending.line
58
- return false if position.line == start.line && position.character < start.character
59
- return false if position.line == ending.line && position.character > ending.character
60
- true
61
- end
62
-
63
- # True if the range contains the specified position and the position does not precede it.
64
- #
65
- # @param position [Position, Array(Integer, Integer)]
66
- # @return [Boolean]
67
- def include? position
68
- position = Position.normalize(position)
69
- contain?(position) && !(position.line == start.line && position.character == start.character)
70
- end
71
-
72
- # Create a range from a pair of lines and characters.
73
- #
74
- # @param l1 [Integer] Starting line
75
- # @param c1 [Integer] Starting character
76
- # @param l2 [Integer] Ending line
77
- # @param c2 [Integer] Ending character
78
- # @return [Range]
79
- def self.from_to l1, c1, l2, c2
80
- Range.new(Position.new(l1, c1), Position.new(l2, c2))
81
- end
82
-
83
- # Get a range from a node.
84
- #
85
- # @param node [Parser::AST::Node]
86
- # @return [Range, nil]
87
- def self.from_node node
88
- if node&.loc && node.loc.expression
89
- from_expr(node.loc.expression)
90
- end
91
- end
92
-
93
- # Get a range from a Parser range, usually found in
94
- # Parser::AST::Node#location#expression.
95
- #
96
- # @param expr [Parser::Source::Range]
97
- # @return [Range]
98
- def self.from_expr expr
99
- from_to(expr.line, expr.column, expr.last_line, expr.last_column)
100
- end
101
-
102
- def == other
103
- return false unless other.is_a?(Range)
104
- # @sg-ignore https://github.com/castwide/solargraph/pull/1114
105
- start == other.start && ending == other.ending
106
- end
107
-
108
- def inspect
109
- "#<#{self.class} #{start.inspect} to #{ending.inspect}>"
110
- end
111
- end
112
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ # A pair of Positions that compose a section of text in code.
5
+ #
6
+ class Range
7
+ include Equality
8
+
9
+ # @return [Position]
10
+ attr_reader :start
11
+
12
+ # @return [Position]
13
+ attr_reader :ending
14
+
15
+ # @param start [Position]
16
+ # @param ending [Position]
17
+ def initialize start, ending
18
+ @start = start
19
+ @ending = ending
20
+ end
21
+
22
+ protected def equality_fields
23
+ [start, ending]
24
+ end
25
+
26
+ # @param other [BasicObject]
27
+ def <=>(other)
28
+ return nil unless other.is_a?(Range)
29
+ if start == other.start
30
+ ending <=> other.ending
31
+ else
32
+ start <=> other.start
33
+ end
34
+ end
35
+
36
+ # Get a hash of the range. This representation is suitable for use in
37
+ # the language server protocol.
38
+ #
39
+ # @return [Hash<Symbol, Position>]
40
+ def to_hash
41
+ {
42
+ start: start.to_hash,
43
+ end: ending.to_hash
44
+ }
45
+ end
46
+
47
+ # True if the specified position is inside the range.
48
+ #
49
+ # @param position [Position, Array(Integer, Integer)]
50
+ # @return [Boolean]
51
+ def contain? position
52
+ position = Position.normalize(position)
53
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
54
+ return false if position.line < start.line || position.line > ending.line
55
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
56
+ return false if position.line == start.line && position.character < start.character
57
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
58
+ return false if position.line == ending.line && position.character > ending.character
59
+ true
60
+ end
61
+
62
+ # True if the range contains the specified position and the position does not precede it.
63
+ #
64
+ # @param position [Position, Array(Integer, Integer)]
65
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
66
+ # @return [Boolean]
67
+ def include? position
68
+ position = Position.normalize(position)
69
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
70
+ contain?(position) && !(position.line == start.line && position.character == start.character)
71
+ end
72
+
73
+ # Create a range from a pair of lines and characters.
74
+ #
75
+ # @param l1 [Integer] Starting line
76
+ # @param c1 [Integer] Starting character
77
+ # @param l2 [Integer] Ending line
78
+ # @param c2 [Integer] Ending character
79
+ # @return [Range]
80
+ def self.from_to l1, c1, l2, c2
81
+ Range.new(Position.new(l1, c1), Position.new(l2, c2))
82
+ end
83
+
84
+ # Get a range from a node.
85
+ #
86
+ # @param node [::Parser::AST::Node]
87
+ # @return [Range, nil]
88
+ def self.from_node node
89
+ if node&.loc && node.loc.expression
90
+ from_expr(node.loc.expression)
91
+ end
92
+ end
93
+
94
+ # Get a range from a Parser range, usually found in
95
+ # Parser::AST::Node#location#expression.
96
+ #
97
+ # @param expr [Parser::Source::Range]
98
+ # @return [Range]
99
+ def self.from_expr expr
100
+ from_to(expr.line, expr.column, expr.last_line, expr.last_column)
101
+ end
102
+
103
+ def == other
104
+ return false unless other.is_a?(Range)
105
+ start == other.start && ending == other.ending
106
+ end
107
+
108
+ def inspect
109
+ "#<#{self.class} #{start.inspect} to #{ending.inspect}>"
110
+ end
111
+ end
112
+ end