solargraph 0.57.0 → 0.58.3

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