solargraph 0.58.0 → 0.59.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 (219) hide show
  1. checksums.yaml +4 -4
  2. data/.envrc +3 -0
  3. data/.gitattributes +2 -0
  4. data/.github/workflows/linting.yml +6 -5
  5. data/.github/workflows/plugins.yml +48 -35
  6. data/.github/workflows/rspec.yml +15 -28
  7. data/.github/workflows/typecheck.yml +3 -2
  8. data/.gitignore +1 -0
  9. data/.rubocop.yml +38 -6
  10. data/.rubocop_todo.yml +53 -966
  11. data/CHANGELOG.md +24 -0
  12. data/Gemfile +3 -1
  13. data/README.md +3 -3
  14. data/Rakefile +26 -23
  15. data/bin/solargraph +9 -8
  16. data/lib/solargraph/api_map/cache.rb +110 -110
  17. data/lib/solargraph/api_map/constants.rb +288 -279
  18. data/lib/solargraph/api_map/index.rb +204 -193
  19. data/lib/solargraph/api_map/source_to_yard.rb +110 -97
  20. data/lib/solargraph/api_map/store.rb +395 -384
  21. data/lib/solargraph/api_map.rb +1029 -945
  22. data/lib/solargraph/bench.rb +44 -45
  23. data/lib/solargraph/complex_type/conformance.rb +176 -0
  24. data/lib/solargraph/complex_type/type_methods.rb +240 -228
  25. data/lib/solargraph/complex_type/unique_type.rb +641 -482
  26. data/lib/solargraph/complex_type.rb +557 -444
  27. data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
  28. data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
  29. data/lib/solargraph/convention/data_definition.rb +108 -105
  30. data/lib/solargraph/convention/gemfile.rb +15 -15
  31. data/lib/solargraph/convention/gemspec.rb +23 -23
  32. data/lib/solargraph/convention/rakefile.rb +17 -17
  33. data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
  34. data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
  35. data/lib/solargraph/convention/struct_definition.rb +168 -164
  36. data/lib/solargraph/convention.rb +78 -78
  37. data/lib/solargraph/converters/dd.rb +19 -17
  38. data/lib/solargraph/converters/dl.rb +17 -15
  39. data/lib/solargraph/converters/dt.rb +17 -15
  40. data/lib/solargraph/converters/misc.rb +3 -1
  41. data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
  42. data/lib/solargraph/diagnostics/rubocop.rb +119 -118
  43. data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
  44. data/lib/solargraph/diagnostics/type_check.rb +56 -55
  45. data/lib/solargraph/diagnostics/update_errors.rb +37 -41
  46. data/lib/solargraph/doc_map.rb +438 -439
  47. data/lib/solargraph/equality.rb +34 -34
  48. data/lib/solargraph/gem_pins.rb +98 -98
  49. data/lib/solargraph/language_server/error_codes.rb +20 -20
  50. data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
  51. data/lib/solargraph/language_server/host/dispatch.rb +130 -130
  52. data/lib/solargraph/language_server/host/message_worker.rb +113 -112
  53. data/lib/solargraph/language_server/host/sources.rb +100 -99
  54. data/lib/solargraph/language_server/host.rb +886 -878
  55. data/lib/solargraph/language_server/message/base.rb +97 -97
  56. data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
  57. data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
  58. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +108 -114
  59. data/lib/solargraph/language_server/message/extended/document.rb +24 -23
  60. data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
  61. data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
  62. data/lib/solargraph/language_server/message/extended/search.rb +20 -20
  63. data/lib/solargraph/language_server/message/initialize.rb +197 -191
  64. data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
  65. data/lib/solargraph/language_server/message/text_document/definition.rb +49 -40
  66. data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
  67. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +36 -26
  68. data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
  69. data/lib/solargraph/language_server/message/text_document/hover.rb +58 -58
  70. data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
  71. data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
  72. data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
  73. data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
  74. data/lib/solargraph/language_server/message/text_document/type_definition.rb +33 -25
  75. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
  76. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
  77. data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
  78. data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +33 -23
  79. data/lib/solargraph/language_server/message.rb +94 -94
  80. data/lib/solargraph/language_server/request.rb +29 -27
  81. data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
  82. data/lib/solargraph/language_server/uri_helpers.rb +49 -49
  83. data/lib/solargraph/library.rb +702 -683
  84. data/lib/solargraph/location.rb +85 -82
  85. data/lib/solargraph/logging.rb +55 -37
  86. data/lib/solargraph/page.rb +92 -92
  87. data/lib/solargraph/parser/comment_ripper.rb +84 -69
  88. data/lib/solargraph/parser/flow_sensitive_typing.rb +471 -255
  89. data/lib/solargraph/parser/node_processor/base.rb +122 -92
  90. data/lib/solargraph/parser/node_processor.rb +63 -62
  91. data/lib/solargraph/parser/parser_gem/class_methods.rb +165 -149
  92. data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
  93. data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
  94. data/lib/solargraph/parser/parser_gem/node_methods.rb +507 -486
  95. data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
  96. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
  97. data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
  98. data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +45 -46
  99. data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
  100. data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
  101. data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
  102. data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +42 -40
  103. data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
  104. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
  105. data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
  106. data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
  107. data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
  108. data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
  109. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +51 -52
  110. data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +302 -291
  111. data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
  112. data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
  113. data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
  114. data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
  115. data/lib/solargraph/parser/parser_gem.rb +14 -12
  116. data/lib/solargraph/parser/region.rb +75 -69
  117. data/lib/solargraph/parser/snippet.rb +19 -17
  118. data/lib/solargraph/parser.rb +25 -23
  119. data/lib/solargraph/pin/base.rb +773 -729
  120. data/lib/solargraph/pin/base_variable.rb +375 -126
  121. data/lib/solargraph/pin/block.rb +127 -104
  122. data/lib/solargraph/pin/breakable.rb +15 -9
  123. data/lib/solargraph/pin/callable.rb +275 -231
  124. data/lib/solargraph/pin/closure.rb +69 -72
  125. data/lib/solargraph/pin/common.rb +97 -79
  126. data/lib/solargraph/pin/compound_statement.rb +55 -0
  127. data/lib/solargraph/pin/constant.rb +43 -45
  128. data/lib/solargraph/pin/conversions.rb +129 -123
  129. data/lib/solargraph/pin/delegated_method.rb +131 -120
  130. data/lib/solargraph/pin/documenting.rb +116 -114
  131. data/lib/solargraph/pin/instance_variable.rb +38 -34
  132. data/lib/solargraph/pin/keyword.rb +16 -20
  133. data/lib/solargraph/pin/local_variable.rb +31 -75
  134. data/lib/solargraph/pin/method.rb +724 -672
  135. data/lib/solargraph/pin/method_alias.rb +42 -34
  136. data/lib/solargraph/pin/namespace.rb +122 -115
  137. data/lib/solargraph/pin/parameter.rb +339 -275
  138. data/lib/solargraph/pin/proxy_type.rb +42 -39
  139. data/lib/solargraph/pin/reference/override.rb +47 -47
  140. data/lib/solargraph/pin/reference/superclass.rb +17 -15
  141. data/lib/solargraph/pin/reference/type_alias.rb +16 -0
  142. data/lib/solargraph/pin/reference.rb +59 -39
  143. data/lib/solargraph/pin/search.rb +62 -61
  144. data/lib/solargraph/pin/signature.rb +64 -61
  145. data/lib/solargraph/pin/symbol.rb +54 -53
  146. data/lib/solargraph/pin/until.rb +16 -18
  147. data/lib/solargraph/pin/while.rb +16 -18
  148. data/lib/solargraph/pin.rb +46 -44
  149. data/lib/solargraph/pin_cache.rb +248 -245
  150. data/lib/solargraph/position.rb +139 -119
  151. data/lib/solargraph/range.rb +113 -112
  152. data/lib/solargraph/rbs_map/conversions.rb +952 -823
  153. data/lib/solargraph/rbs_map/core_fills.rb +91 -84
  154. data/lib/solargraph/rbs_map/core_map.rb +65 -58
  155. data/lib/solargraph/rbs_map/stdlib_map.rb +71 -43
  156. data/lib/solargraph/rbs_map.rb +207 -163
  157. data/lib/solargraph/server_methods.rb +16 -16
  158. data/lib/solargraph/shell.rb +555 -352
  159. data/lib/solargraph/source/chain/array.rb +39 -37
  160. data/lib/solargraph/source/chain/call.rb +377 -337
  161. data/lib/solargraph/source/chain/class_variable.rb +13 -13
  162. data/lib/solargraph/source/chain/constant.rb +30 -26
  163. data/lib/solargraph/source/chain/global_variable.rb +13 -13
  164. data/lib/solargraph/source/chain/hash.rb +37 -34
  165. data/lib/solargraph/source/chain/if.rb +30 -28
  166. data/lib/solargraph/source/chain/instance_variable.rb +36 -13
  167. data/lib/solargraph/source/chain/link.rb +99 -109
  168. data/lib/solargraph/source/chain/literal.rb +51 -48
  169. data/lib/solargraph/source/chain/or.rb +29 -23
  170. data/lib/solargraph/source/chain/q_call.rb +13 -11
  171. data/lib/solargraph/source/chain/variable.rb +15 -13
  172. data/lib/solargraph/source/chain/z_super.rb +28 -30
  173. data/lib/solargraph/source/chain.rb +304 -291
  174. data/lib/solargraph/source/change.rb +89 -82
  175. data/lib/solargraph/source/cursor.rb +172 -166
  176. data/lib/solargraph/source/encoding_fixes.rb +22 -23
  177. data/lib/solargraph/source/source_chainer.rb +218 -194
  178. data/lib/solargraph/source/updater.rb +59 -55
  179. data/lib/solargraph/source.rb +522 -498
  180. data/lib/solargraph/source_map/clip.rb +245 -226
  181. data/lib/solargraph/source_map/data.rb +37 -34
  182. data/lib/solargraph/source_map/mapper.rb +286 -259
  183. data/lib/solargraph/source_map.rb +224 -212
  184. data/lib/solargraph/type_checker/problem.rb +34 -32
  185. data/lib/solargraph/type_checker/rules.rb +157 -84
  186. data/lib/solargraph/type_checker.rb +888 -814
  187. data/lib/solargraph/version.rb +5 -5
  188. data/lib/solargraph/workspace/config.rb +258 -255
  189. data/lib/solargraph/workspace/gemspecs.rb +367 -0
  190. data/lib/solargraph/workspace/require_paths.rb +98 -97
  191. data/lib/solargraph/workspace.rb +242 -220
  192. data/lib/solargraph/yard_map/helpers.rb +49 -44
  193. data/lib/solargraph/yard_map/mapper/to_method.rb +136 -130
  194. data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
  195. data/lib/solargraph/yard_map/mapper.rb +84 -79
  196. data/lib/solargraph/yard_map.rb +17 -18
  197. data/lib/solargraph/yard_tags.rb +20 -20
  198. data/lib/solargraph/yardoc.rb +90 -87
  199. data/lib/solargraph.rb +128 -105
  200. data/rbs/fills/rubygems/0/dependency.rbs +193 -0
  201. data/rbs/fills/tuple/tuple.rbs +28 -0
  202. data/rbs/shims/ast/0/node.rbs +5 -0
  203. data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
  204. data/rbs_collection.yaml +1 -1
  205. data/solargraph.gemspec +37 -35
  206. metadata +52 -51
  207. data/lib/solargraph/type_checker/checks.rb +0 -124
  208. data/lib/solargraph/type_checker/param_def.rb +0 -37
  209. data/lib/solargraph/yard_map/to_method.rb +0 -89
  210. data/sig/shims/ast/0/node.rbs +0 -5
  211. /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
  212. /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
  213. /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
  214. /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
  215. /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
  216. /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
  217. /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
  218. /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
  219. /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
@@ -1,119 +1,139 @@
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
+ # @param other [Position]
25
+ def <=> other
26
+ return nil unless other.is_a?(Position)
27
+ if line == other.line
28
+ character <=> other.character
29
+ else
30
+ line <=> other.line
31
+ end
32
+ end
33
+
34
+ # Get a hash of the position. This representation is suitable for use in
35
+ # the language server protocol.
36
+ #
37
+ # @return [Hash]
38
+ def to_hash
39
+ {
40
+ line: line,
41
+ character: character
42
+ }
43
+ end
44
+
45
+ def inspect
46
+ "#<#{self.class} #{line}, #{character}>"
47
+ end
48
+
49
+ # Get a numeric offset for the specified text and position.
50
+ #
51
+ # @param text [String]
52
+ # @param position [Position]
53
+ # @return [Integer]
54
+ def self.to_offset text, position
55
+ return 0 if text.empty?
56
+
57
+ newline_index = -1
58
+ line = -1
59
+ last_line_index = 0
60
+
61
+ # @sg-ignore Typechecker thinks `newline_index` inside of the assignment
62
+ # can be nil
63
+ while (newline_index = text.index("\n", newline_index + 1)) && line <= position.line
64
+ line += 1
65
+ break if line == position.line
66
+
67
+ last_line_index = newline_index
68
+ end
69
+
70
+ last_line_index += 1 if position.line.positive?
71
+ # @sg-ignore `last_line_index` is always an Integer because `newline_index`
72
+ # is never nil inside the while block
73
+ last_line_index + position.character
74
+ end
75
+
76
+ # Get a numeric offset for the specified text and a position identified
77
+ # by its line and character.
78
+ #
79
+ # @param text [String]
80
+ # @param line [Integer]
81
+ # @param character [Integer]
82
+ # @return [Integer]
83
+ def self.line_char_to_offset text, line, character
84
+ to_offset(text, Position.new(line, character))
85
+ end
86
+
87
+ # Get a position for the specified text and offset.
88
+ #
89
+ # @raise [InvalidOffsetError] if the offset is outside the text range
90
+ #
91
+ # @param text [String]
92
+ # @param offset [Integer]
93
+ # @return [Position]
94
+ def self.from_offset text, offset
95
+ raise InvalidOffsetError if offset > text.length
96
+
97
+ cursor = 0
98
+ line = 0
99
+ character = offset
100
+ newline_index = -1
101
+
102
+ # @sg-ignore Typechecker thinks `newline_index` inside of the assignment
103
+ # can be nil
104
+ while (newline_index = text.index("\n", newline_index + 1)) && newline_index < offset
105
+ line += 1
106
+ # @sg-ignore `newline_index` is always an Integer inside the while block
107
+ character = offset - newline_index - 1
108
+ end
109
+ character = 0 if character.nil? && (cursor - offset).between?(0, 1)
110
+ raise InvalidOffsetError if character.nil?
111
+ # @sg-ignore flow sensitive typing needs to handle 'raise if'
112
+ Position.new(line, character)
113
+ end
114
+
115
+ # A helper method for generating positions from arrays of integers. The
116
+ # original parameter is returned if it is already a position.
117
+ #
118
+ # @raise [ArgumentError] if the object cannot be converted to a position.
119
+ #
120
+ # @param object [Position, Array(Integer, Integer)]
121
+ # @return [Position]
122
+ def self.normalize object
123
+ return object if object.is_a?(Position)
124
+ return Position.new(object[0], object[1]) if object.is_a?(Array)
125
+ raise ArgumentError, "Unable to convert #{object.class} to Position"
126
+ end
127
+
128
+ def == other
129
+ return false unless other.is_a?(Position)
130
+ line == other.line and character == other.character
131
+ end
132
+
133
+ protected
134
+
135
+ def equality_fields
136
+ [line, character]
137
+ end
138
+ end
139
+ end
@@ -1,112 +1,113 @@
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
+ # @param other [BasicObject]
23
+ def <=> other
24
+ return nil unless other.is_a?(Range)
25
+ if start == other.start
26
+ ending <=> other.ending
27
+ else
28
+ start <=> other.start
29
+ end
30
+ end
31
+
32
+ # Get a hash of the range. This representation is suitable for use in
33
+ # the language server protocol.
34
+ #
35
+ # @return [Hash{Symbol => Position}]
36
+ def to_hash
37
+ {
38
+ start: start.to_hash,
39
+ end: ending.to_hash
40
+ }
41
+ end
42
+
43
+ # True if the specified position is inside the range.
44
+ #
45
+ # @param position [Position, Array(Integer, Integer)]
46
+ # @return [Boolean]
47
+ def contain? position
48
+ position = Position.normalize(position)
49
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
50
+ return false if position.line < start.line || position.line > ending.line
51
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
52
+ return false if position.line == start.line && position.character < start.character
53
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
54
+ return false if position.line == ending.line && position.character > ending.character
55
+ true
56
+ end
57
+
58
+ # True if the range contains the specified position and the position does not precede it.
59
+ #
60
+ # @param position [Position, Array(Integer, Integer)]
61
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
62
+ # @return [Boolean]
63
+ def include? position
64
+ position = Position.normalize(position)
65
+ # @sg-ignore flow sensitive typing should be able to handle redefinition
66
+ contain?(position) && !(position.line == start.line && position.character == start.character)
67
+ end
68
+
69
+ # Create a range from a pair of lines and characters.
70
+ #
71
+ # @param l1 [Integer] Starting line
72
+ # @param c1 [Integer] Starting character
73
+ # @param l2 [Integer] Ending line
74
+ # @param c2 [Integer] Ending character
75
+ # @return [Range]
76
+ def self.from_to l1, c1, l2, c2
77
+ Range.new(Position.new(l1, c1), Position.new(l2, c2))
78
+ end
79
+
80
+ # Get a range from a node.
81
+ #
82
+ # @param node [::Parser::AST::Node]
83
+ # @return [Range, nil]
84
+ def self.from_node node
85
+ return unless node&.loc&.expression
86
+ from_expr(node.loc.expression)
87
+ end
88
+
89
+ # Get a range from a Parser range, usually found in
90
+ # Parser::AST::Node#location#expression.
91
+ #
92
+ # @param expr [Parser::Source::Range]
93
+ # @return [Range]
94
+ def self.from_expr expr
95
+ from_to(expr.line, expr.column, expr.last_line, expr.last_column)
96
+ end
97
+
98
+ def == other
99
+ return false unless other.is_a?(Range)
100
+ start == other.start && ending == other.ending
101
+ end
102
+
103
+ def inspect
104
+ "#<#{self.class} #{start.inspect} to #{ending.inspect}>"
105
+ end
106
+
107
+ protected
108
+
109
+ def equality_fields
110
+ [start, ending]
111
+ end
112
+ end
113
+ end