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
|
@@ -1,194 +1,204 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
# Information about a location in a source, including the location's word
|
|
6
|
-
# and signature, literal values at the base of signatures, and whether the
|
|
7
|
-
# location is inside a string or comment. ApiMaps use Fragments to provide
|
|
8
|
-
# results for completion and definition queries.
|
|
9
|
-
#
|
|
10
|
-
class SourceChainer
|
|
11
|
-
# include Source::NodeMethods
|
|
12
|
-
|
|
13
|
-
private_class_method :new
|
|
14
|
-
|
|
15
|
-
class << self
|
|
16
|
-
# @param source [Source]
|
|
17
|
-
# @param position [Position, Array(Integer, Integer)]
|
|
18
|
-
# @return [Source::Chain]
|
|
19
|
-
def chain source, position
|
|
20
|
-
new(source, Solargraph::Position.normalize(position)).chain
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
|
|
24
|
-
# @param source [Source]
|
|
25
|
-
# @param position [Position]
|
|
26
|
-
def initialize source, position
|
|
27
|
-
@source = source
|
|
28
|
-
@position = position
|
|
29
|
-
@calculated_literal = false
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# @return [Source::Chain]
|
|
33
|
-
def chain
|
|
34
|
-
# Special handling for files that end with an integer and a period
|
|
35
|
-
return Chain.new([Chain::Literal.new('Integer', Integer(phrase[0..-2])), Chain::UNDEFINED_CALL]) if phrase =~ /^[0-9]+\.$/
|
|
36
|
-
|
|
37
|
-
return
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
node =
|
|
48
|
-
elsif source.repaired?
|
|
49
|
-
node =
|
|
50
|
-
|
|
51
|
-
node
|
|
52
|
-
|
|
53
|
-
node =
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
# @return [String]
|
|
88
|
-
def
|
|
89
|
-
@
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
# @
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
#
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
# @return [Integer]
|
|
125
|
-
def
|
|
126
|
-
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
# @
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
break
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
# Information about a location in a source, including the location's word
|
|
6
|
+
# and signature, literal values at the base of signatures, and whether the
|
|
7
|
+
# location is inside a string or comment. ApiMaps use Fragments to provide
|
|
8
|
+
# results for completion and definition queries.
|
|
9
|
+
#
|
|
10
|
+
class SourceChainer
|
|
11
|
+
# include Source::NodeMethods
|
|
12
|
+
|
|
13
|
+
private_class_method :new
|
|
14
|
+
|
|
15
|
+
class << self
|
|
16
|
+
# @param source [Source]
|
|
17
|
+
# @param position [Position, Array(Integer, Integer)]
|
|
18
|
+
# @return [Source::Chain]
|
|
19
|
+
def chain source, position
|
|
20
|
+
new(source, Solargraph::Position.normalize(position)).chain
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @param source [Source]
|
|
25
|
+
# @param position [Position]
|
|
26
|
+
def initialize source, position
|
|
27
|
+
@source = source
|
|
28
|
+
@position = position
|
|
29
|
+
@calculated_literal = false
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @return [Source::Chain]
|
|
33
|
+
def chain
|
|
34
|
+
# Special handling for files that end with an integer and a period
|
|
35
|
+
return Chain.new([Chain::Literal.new('Integer', Integer(phrase[0..-2])), Chain::UNDEFINED_CALL]) if phrase =~ /^[0-9]+\.$/
|
|
36
|
+
# @sg-ignore Need to add nil check here
|
|
37
|
+
return Chain.new([Chain::Literal.new('Symbol', phrase[1..].to_sym)]) if phrase.start_with?(':') && !phrase.start_with?('::')
|
|
38
|
+
return SourceChainer.chain(source, Position.new(position.line, position.character + 1)) if end_of_phrase.strip == '::' && source.code[Position.to_offset(source.code, position)].to_s.match?(/[a-z]/i)
|
|
39
|
+
begin
|
|
40
|
+
return Chain.new([]) if phrase.end_with?('..')
|
|
41
|
+
# @type [::Parser::AST::Node, nil]
|
|
42
|
+
node = nil
|
|
43
|
+
# @type [::Parser::AST::Node, nil]
|
|
44
|
+
parent = nil
|
|
45
|
+
if !source.repaired? && source.parsed? && source.synchronized?
|
|
46
|
+
tree = source.tree_at(position.line, position.column)
|
|
47
|
+
node, parent = tree[0..2]
|
|
48
|
+
elsif source.parsed? && source.repaired? && end_of_phrase == '.'
|
|
49
|
+
node, parent = source.tree_at(fixed_position.line, fixed_position.column)[0..2]
|
|
50
|
+
# provide filename and line so that we can look up local variables there later
|
|
51
|
+
node = Parser.parse(fixed_phrase, source.filename, fixed_position.line) if node.nil?
|
|
52
|
+
elsif source.repaired?
|
|
53
|
+
node = Parser.parse(fixed_phrase, source.filename, fixed_position.line)
|
|
54
|
+
else
|
|
55
|
+
node, parent = source.tree_at(fixed_position.line, fixed_position.column)[0..2] unless source.error_ranges.any?{|r| r.nil? || r.include?(fixed_position)}
|
|
56
|
+
# Exception for positions that chain literal nodes in unsynchronized sources
|
|
57
|
+
node = nil unless source.synchronized? || !Parser.infer_literal_node_type(node).nil?
|
|
58
|
+
node = Parser.parse(fixed_phrase, source.filename, fixed_position.line) if node.nil?
|
|
59
|
+
end
|
|
60
|
+
rescue Parser::SyntaxError
|
|
61
|
+
return Chain.new([Chain::UNDEFINED_CALL])
|
|
62
|
+
end
|
|
63
|
+
return Chain.new([Chain::UNDEFINED_CALL]) if node.nil? || (node.type == :sym && !phrase.start_with?(':'))
|
|
64
|
+
# chain = NodeChainer.chain(node, source.filename, parent && parent.type == :block)
|
|
65
|
+
chain = Parser.chain(node, source.filename, parent)
|
|
66
|
+
if source.repaired? || !source.parsed? || !source.synchronized?
|
|
67
|
+
if end_of_phrase.strip == '.'
|
|
68
|
+
chain.links.push Chain::UNDEFINED_CALL
|
|
69
|
+
elsif end_of_phrase.strip == '::'
|
|
70
|
+
chain.links.push Chain::UNDEFINED_CONSTANT
|
|
71
|
+
end
|
|
72
|
+
elsif chain.links.last.is_a?(Source::Chain::Constant) && end_of_phrase.strip == '::'
|
|
73
|
+
chain.links.push Source::Chain::UNDEFINED_CONSTANT
|
|
74
|
+
end
|
|
75
|
+
chain
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
private
|
|
79
|
+
|
|
80
|
+
# @return [Position]
|
|
81
|
+
attr_reader :position
|
|
82
|
+
|
|
83
|
+
# @return [Solargraph::Source]
|
|
84
|
+
attr_reader :source
|
|
85
|
+
|
|
86
|
+
# @sg-ignore Need to add nil check here
|
|
87
|
+
# @return [String]
|
|
88
|
+
def phrase
|
|
89
|
+
@phrase ||= source.code[signature_data..offset-1]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @sg-ignore Need to add nil check here
|
|
93
|
+
# @return [String]
|
|
94
|
+
def fixed_phrase
|
|
95
|
+
@fixed_phrase ||= phrase[0..-(end_of_phrase.length+1)]
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# @return [Position]
|
|
99
|
+
def fixed_position
|
|
100
|
+
@fixed_position ||= Position.from_offset(source.code, offset - end_of_phrase.length)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# @return [String]
|
|
104
|
+
# @sg-ignore Need to add nil check here
|
|
105
|
+
def end_of_phrase
|
|
106
|
+
@end_of_phrase ||= begin
|
|
107
|
+
match = phrase.match(/\s*(\.{1}|::)\s*$/)
|
|
108
|
+
if match
|
|
109
|
+
match[0]
|
|
110
|
+
else
|
|
111
|
+
''
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# True if the current offset is inside a string.
|
|
117
|
+
#
|
|
118
|
+
# @return [Boolean]
|
|
119
|
+
def string?
|
|
120
|
+
# @string ||= (node.type == :str or node.type == :dstr)
|
|
121
|
+
@string ||= @source.string_at?(position)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# @return [Integer]
|
|
125
|
+
def offset
|
|
126
|
+
@offset ||= get_offset(position.line, position.column)
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# @param line [Integer]
|
|
130
|
+
# @param column [Integer]
|
|
131
|
+
# @return [Integer]
|
|
132
|
+
def get_offset line, column
|
|
133
|
+
Position.line_char_to_offset(@source.code, line, column)
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
# @return [Integer]
|
|
137
|
+
def signature_data
|
|
138
|
+
@signature_data ||= get_signature_data_at(offset)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# @param index [Integer]
|
|
142
|
+
# @return [Integer]
|
|
143
|
+
def get_signature_data_at index
|
|
144
|
+
brackets = 0
|
|
145
|
+
squares = 0
|
|
146
|
+
parens = 0
|
|
147
|
+
index -=1
|
|
148
|
+
in_whitespace = false
|
|
149
|
+
while index >= 0
|
|
150
|
+
pos = Position.from_offset(@source.code, index)
|
|
151
|
+
break if index > 0 and @source.comment_at?(pos)
|
|
152
|
+
break if brackets > 0 or parens > 0 or squares > 0
|
|
153
|
+
char = @source.code[index, 1]
|
|
154
|
+
break if char.nil? # @todo Is this the right way to handle this?
|
|
155
|
+
if brackets.zero? and parens.zero? and squares.zero? and [' ', "\r", "\n", "\t"].include?(char)
|
|
156
|
+
in_whitespace = true
|
|
157
|
+
else
|
|
158
|
+
if brackets.zero? and parens.zero? and squares.zero? and in_whitespace
|
|
159
|
+
# @sg-ignore Need to add nil check here
|
|
160
|
+
unless char == '.' or @source.code[index+1..-1].strip.start_with?('.')
|
|
161
|
+
old = @source.code[index+1..-1]
|
|
162
|
+
# @sg-ignore Need to add nil check here
|
|
163
|
+
nxt = @source.code[index+1..-1].lstrip
|
|
164
|
+
# @sg-ignore Need to add nil check here
|
|
165
|
+
index += (@source.code[index+1..-1].length - @source.code[index+1..-1].lstrip.length)
|
|
166
|
+
break
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
if char == ')'
|
|
170
|
+
parens -=1
|
|
171
|
+
elsif char == ']'
|
|
172
|
+
squares -=1
|
|
173
|
+
elsif char == '}'
|
|
174
|
+
brackets -= 1
|
|
175
|
+
elsif char == '('
|
|
176
|
+
parens += 1
|
|
177
|
+
elsif char == '{'
|
|
178
|
+
brackets += 1
|
|
179
|
+
elsif char == '['
|
|
180
|
+
squares += 1
|
|
181
|
+
end
|
|
182
|
+
if brackets.zero? and parens.zero? and squares.zero?
|
|
183
|
+
break if ['"', "'", ',', ';', '%'].include?(char)
|
|
184
|
+
break if ['!', '?'].include?(char) && index < offset - 1
|
|
185
|
+
break if char == '$'
|
|
186
|
+
if char == '@'
|
|
187
|
+
index -= 1
|
|
188
|
+
if @source.code[index, 1] == '@'
|
|
189
|
+
index -= 1
|
|
190
|
+
end
|
|
191
|
+
break
|
|
192
|
+
end
|
|
193
|
+
elsif parens == 1 || brackets == 1 || squares == 1
|
|
194
|
+
break
|
|
195
|
+
end
|
|
196
|
+
in_whitespace = false
|
|
197
|
+
end
|
|
198
|
+
index -= 1
|
|
199
|
+
end
|
|
200
|
+
index + 1
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
@@ -1,55 +1,59 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
class Source
|
|
5
|
-
# Updaters contain changes to be applied to a source. The source applies
|
|
6
|
-
# the update via the Source#synchronize method.
|
|
7
|
-
#
|
|
8
|
-
class Updater
|
|
9
|
-
# @return [String]
|
|
10
|
-
attr_reader :filename
|
|
11
|
-
|
|
12
|
-
# @return [Integer]
|
|
13
|
-
attr_reader :version
|
|
14
|
-
|
|
15
|
-
# @return [Array<Change>]
|
|
16
|
-
attr_reader :changes
|
|
17
|
-
|
|
18
|
-
# @param filename [String] The file to update.
|
|
19
|
-
# @param version [Integer] A version number associated with this update.
|
|
20
|
-
# @param changes [Array<Solargraph::Source::Change>] The changes.
|
|
21
|
-
def initialize filename, version, changes
|
|
22
|
-
@filename = filename
|
|
23
|
-
@version = version
|
|
24
|
-
@changes = changes
|
|
25
|
-
@input = nil
|
|
26
|
-
@did_nullify = nil
|
|
27
|
-
@output = nil
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @param text [String]
|
|
31
|
-
# @param nullable [Boolean]
|
|
32
|
-
# @
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@input
|
|
37
|
-
@
|
|
38
|
-
@
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class Source
|
|
5
|
+
# Updaters contain changes to be applied to a source. The source applies
|
|
6
|
+
# the update via the Source#synchronize method.
|
|
7
|
+
#
|
|
8
|
+
class Updater
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :filename
|
|
11
|
+
|
|
12
|
+
# @return [Integer]
|
|
13
|
+
attr_reader :version
|
|
14
|
+
|
|
15
|
+
# @return [Array<Change>]
|
|
16
|
+
attr_reader :changes
|
|
17
|
+
|
|
18
|
+
# @param filename [String] The file to update.
|
|
19
|
+
# @param version [Integer] A version number associated with this update.
|
|
20
|
+
# @param changes [Array<Solargraph::Source::Change>] The changes.
|
|
21
|
+
def initialize filename, version, changes
|
|
22
|
+
@filename = filename
|
|
23
|
+
@version = version
|
|
24
|
+
@changes = changes
|
|
25
|
+
@input = nil
|
|
26
|
+
@did_nullify = nil
|
|
27
|
+
@output = nil
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @param text [String]
|
|
31
|
+
# @param nullable [Boolean]
|
|
32
|
+
# @sg-ignore changes doesn't mutate @output, so this can never be nil
|
|
33
|
+
# @return [String]
|
|
34
|
+
def write text, nullable = false
|
|
35
|
+
can_nullify = (nullable and changes.length == 1)
|
|
36
|
+
return @output if @input == text and can_nullify == @did_nullify
|
|
37
|
+
@input = text
|
|
38
|
+
@output = text
|
|
39
|
+
@did_nullify = can_nullify
|
|
40
|
+
changes.each do |ch|
|
|
41
|
+
# @sg-ignore Wrong argument type for
|
|
42
|
+
# Solargraph::Source::Change#write: text expected String,
|
|
43
|
+
# received String, nil
|
|
44
|
+
@output = ch.write(@output, can_nullify)
|
|
45
|
+
end
|
|
46
|
+
@output
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @param text [String]
|
|
50
|
+
# @return [String]
|
|
51
|
+
def repair text
|
|
52
|
+
changes.each do |ch|
|
|
53
|
+
text = ch.repair(text)
|
|
54
|
+
end
|
|
55
|
+
text
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|