solargraph 0.58.1 → 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.
- checksums.yaml +4 -4
- data/.envrc +3 -0
- data/.github/workflows/linting.yml +4 -5
- data/.github/workflows/plugins.yml +40 -36
- data/.github/workflows/rspec.yml +45 -13
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop_todo.yml +27 -49
- data/README.md +3 -3
- data/Rakefile +1 -0
- data/lib/solargraph/api_map/cache.rb +110 -110
- data/lib/solargraph/api_map/constants.rb +289 -279
- data/lib/solargraph/api_map/index.rb +204 -193
- data/lib/solargraph/api_map/source_to_yard.rb +109 -97
- data/lib/solargraph/api_map/store.rb +387 -384
- data/lib/solargraph/api_map.rb +1000 -945
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +242 -228
- data/lib/solargraph/complex_type/unique_type.rb +632 -482
- data/lib/solargraph/complex_type.rb +549 -444
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +93 -91
- data/lib/solargraph/convention/data_definition.rb +108 -105
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +62 -61
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +103 -102
- data/lib/solargraph/convention/struct_definition.rb +168 -164
- data/lib/solargraph/diagnostics/require_not_found.rb +54 -53
- data/lib/solargraph/diagnostics/rubocop.rb +119 -118
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +70 -68
- data/lib/solargraph/diagnostics/type_check.rb +56 -55
- data/lib/solargraph/doc_map.rb +200 -439
- data/lib/solargraph/equality.rb +34 -34
- data/lib/solargraph/gem_pins.rb +97 -98
- data/lib/solargraph/language_server/host/dispatch.rb +131 -130
- data/lib/solargraph/language_server/host/message_worker.rb +113 -112
- data/lib/solargraph/language_server/host/sources.rb +100 -99
- data/lib/solargraph/language_server/host.rb +883 -878
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +109 -114
- data/lib/solargraph/language_server/message/extended/document.rb +24 -23
- data/lib/solargraph/language_server/message/text_document/completion.rb +58 -56
- data/lib/solargraph/language_server/message/text_document/definition.rb +42 -40
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +28 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +150 -148
- data/lib/solargraph/language_server/message/text_document/hover.rb +60 -58
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +25 -24
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +27 -25
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +25 -23
- data/lib/solargraph/library.rb +729 -683
- data/lib/solargraph/location.rb +87 -82
- data/lib/solargraph/logging.rb +57 -37
- data/lib/solargraph/parser/comment_ripper.rb +76 -69
- data/lib/solargraph/parser/flow_sensitive_typing.rb +483 -255
- data/lib/solargraph/parser/node_processor/base.rb +122 -92
- data/lib/solargraph/parser/node_processor.rb +63 -62
- data/lib/solargraph/parser/parser_gem/class_methods.rb +167 -149
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +191 -166
- data/lib/solargraph/parser/parser_gem/node_methods.rb +506 -486
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -22
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +24 -15
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +46 -46
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +60 -53
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +53 -23
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +41 -40
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +30 -29
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +61 -59
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -98
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +17 -17
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +39 -38
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +53 -52
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +296 -291
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +33 -29
- data/lib/solargraph/parser/parser_gem/node_processors.rb +74 -70
- data/lib/solargraph/parser/region.rb +75 -69
- data/lib/solargraph/parser/snippet.rb +17 -17
- data/lib/solargraph/pin/base.rb +761 -729
- data/lib/solargraph/pin/base_variable.rb +418 -126
- data/lib/solargraph/pin/block.rb +126 -104
- data/lib/solargraph/pin/breakable.rb +13 -9
- data/lib/solargraph/pin/callable.rb +278 -231
- data/lib/solargraph/pin/closure.rb +68 -72
- data/lib/solargraph/pin/common.rb +94 -79
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/conversions.rb +124 -123
- data/lib/solargraph/pin/delegated_method.rb +131 -120
- data/lib/solargraph/pin/documenting.rb +115 -114
- data/lib/solargraph/pin/instance_variable.rb +38 -34
- data/lib/solargraph/pin/keyword.rb +16 -20
- data/lib/solargraph/pin/local_variable.rb +31 -75
- data/lib/solargraph/pin/method.rb +720 -672
- data/lib/solargraph/pin/method_alias.rb +42 -34
- data/lib/solargraph/pin/namespace.rb +121 -115
- data/lib/solargraph/pin/parameter.rb +338 -275
- data/lib/solargraph/pin/proxy_type.rb +40 -39
- data/lib/solargraph/pin/reference/override.rb +47 -47
- data/lib/solargraph/pin/reference/superclass.rb +17 -15
- data/lib/solargraph/pin/reference.rb +41 -39
- data/lib/solargraph/pin/search.rb +62 -61
- data/lib/solargraph/pin/signature.rb +69 -61
- data/lib/solargraph/pin/symbol.rb +53 -53
- data/lib/solargraph/pin/until.rb +18 -18
- data/lib/solargraph/pin/while.rb +18 -18
- data/lib/solargraph/pin.rb +46 -44
- data/lib/solargraph/pin_cache.rb +665 -245
- data/lib/solargraph/position.rb +118 -119
- data/lib/solargraph/range.rb +112 -112
- data/lib/solargraph/rbs_map/conversions.rb +846 -823
- data/lib/solargraph/rbs_map/core_map.rb +65 -58
- data/lib/solargraph/rbs_map/stdlib_map.rb +72 -43
- data/lib/solargraph/rbs_map.rb +217 -163
- data/lib/solargraph/shell.rb +397 -352
- data/lib/solargraph/source/chain/call.rb +372 -337
- data/lib/solargraph/source/chain/constant.rb +28 -26
- data/lib/solargraph/source/chain/hash.rb +35 -34
- data/lib/solargraph/source/chain/if.rb +29 -28
- data/lib/solargraph/source/chain/instance_variable.rb +34 -13
- data/lib/solargraph/source/chain/literal.rb +53 -48
- data/lib/solargraph/source/chain/or.rb +31 -23
- data/lib/solargraph/source/chain.rb +294 -291
- data/lib/solargraph/source/change.rb +89 -82
- data/lib/solargraph/source/cursor.rb +172 -166
- data/lib/solargraph/source/source_chainer.rb +204 -194
- data/lib/solargraph/source/updater.rb +59 -55
- data/lib/solargraph/source.rb +524 -498
- data/lib/solargraph/source_map/clip.rb +237 -226
- data/lib/solargraph/source_map/data.rb +37 -34
- data/lib/solargraph/source_map/mapper.rb +282 -259
- data/lib/solargraph/source_map.rb +220 -212
- data/lib/solargraph/type_checker/problem.rb +34 -32
- data/lib/solargraph/type_checker/rules.rb +157 -84
- data/lib/solargraph/type_checker.rb +895 -814
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +257 -255
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +98 -97
- data/lib/solargraph/workspace.rb +362 -220
- data/lib/solargraph/yard_map/helpers.rb +45 -44
- data/lib/solargraph/yard_map/mapper/to_method.rb +134 -130
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +32 -31
- data/lib/solargraph/yard_map/mapper.rb +84 -79
- data/lib/solargraph/yardoc.rb +97 -87
- data/lib/solargraph.rb +126 -105
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +5 -0
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/rbs_collection.yaml +1 -1
- data/solargraph.gemspec +2 -1
- metadata +22 -17
- data/lib/solargraph/type_checker/checks.rb +0 -124
- data/lib/solargraph/type_checker/param_def.rb +0 -37
- data/lib/solargraph/yard_map/to_method.rb +0 -89
- data/sig/shims/ast/0/node.rbs +0 -5
- /data/{sig → rbs}/shims/ast/2.4/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/ast/2.4/ast.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/builders/default.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/parser.rbs +0 -0
- /data/{sig → rbs}/shims/parser/3.2.0.1/polyfill.rbs +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/.rbs_meta.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/manifest.yaml +0 -0
- /data/{sig → rbs}/shims/thor/1.2.0.1/thor.rbs +0 -0
data/lib/solargraph/position.rb
CHANGED
|
@@ -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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
#
|
|
40
|
-
#
|
|
41
|
-
#
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
#
|
|
55
|
-
#
|
|
56
|
-
# @param
|
|
57
|
-
# @
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
#
|
|
66
|
-
#
|
|
67
|
-
#
|
|
68
|
-
# @param
|
|
69
|
-
# @
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
#
|
|
77
|
-
#
|
|
78
|
-
# @
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
char_length
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
raise
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
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
|
data/lib/solargraph/range.rb
CHANGED
|
@@ -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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
position
|
|
57
|
-
|
|
58
|
-
return false if position.line ==
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
#
|
|
65
|
-
# @
|
|
66
|
-
# @return [Boolean]
|
|
67
|
-
def include? position
|
|
68
|
-
position = Position.normalize(position)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
#
|
|
74
|
-
#
|
|
75
|
-
# @param
|
|
76
|
-
# @param
|
|
77
|
-
# @param
|
|
78
|
-
# @
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
#
|
|
86
|
-
# @
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
# Parser
|
|
95
|
-
#
|
|
96
|
-
#
|
|
97
|
-
# @
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|