solargraph 0.59.0.dev.1 → 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.
- checksums.yaml +4 -4
- data/.github/workflows/linting.yml +3 -1
- data/.github/workflows/plugins.yml +12 -3
- data/.github/workflows/rspec.yml +9 -54
- data/.github/workflows/typecheck.yml +2 -1
- data/.gitignore +1 -0
- data/.rubocop.yml +38 -6
- data/.rubocop_todo.yml +40 -931
- data/CHANGELOG.md +22 -1
- data/Gemfile +3 -1
- data/Rakefile +25 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/constants.rb +0 -1
- data/lib/solargraph/api_map/index.rb +11 -11
- data/lib/solargraph/api_map/source_to_yard.rb +9 -8
- data/lib/solargraph/api_map/store.rb +28 -20
- data/lib/solargraph/api_map.rb +70 -41
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/type_methods.rb +14 -16
- data/lib/solargraph/complex_type/unique_type.rb +56 -47
- data/lib/solargraph/complex_type.rb +70 -62
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +4 -4
- data/lib/solargraph/convention/data_definition.rb +1 -1
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +23 -23
- data/lib/solargraph/convention/rakefile.rb +17 -17
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +1 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +3 -3
- data/lib/solargraph/convention/struct_definition.rb +3 -3
- data/lib/solargraph/convention.rb +78 -78
- data/lib/solargraph/converters/dd.rb +19 -17
- data/lib/solargraph/converters/dl.rb +17 -15
- data/lib/solargraph/converters/dt.rb +17 -15
- data/lib/solargraph/converters/misc.rb +3 -1
- data/lib/solargraph/diagnostics/rubocop.rb +10 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +3 -3
- data/lib/solargraph/diagnostics/type_check.rb +10 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +370 -132
- data/lib/solargraph/equality.rb +3 -3
- data/lib/solargraph/gem_pins.rb +19 -18
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +2 -3
- data/lib/solargraph/language_server/host/message_worker.rb +2 -2
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/host.rb +24 -21
- data/lib/solargraph/language_server/message/base.rb +97 -97
- data/lib/solargraph/language_server/message/client/register_capability.rb +13 -15
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -60
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +10 -11
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +20 -19
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/initialize.rb +197 -191
- data/lib/solargraph/language_server/message/text_document/completion.rb +8 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -34
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +29 -21
- data/lib/solargraph/language_server/message/text_document/formatting.rb +6 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -5
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +18 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +23 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +26 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +2 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -19
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +41 -35
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +48 -40
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +32 -26
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +27 -19
- data/lib/solargraph/language_server/message.rb +94 -94
- data/lib/solargraph/language_server/request.rb +29 -27
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -74
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/library.rb +68 -95
- data/lib/solargraph/location.rb +10 -12
- data/lib/solargraph/logging.rb +4 -6
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +12 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +32 -44
- data/lib/solargraph/parser/node_processor/base.rb +4 -4
- data/lib/solargraph/parser/node_processor.rb +1 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +4 -6
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +20 -20
- data/lib/solargraph/parser/parser_gem/node_methods.rb +66 -65
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +1 -2
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +38 -37
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +3 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +118 -112
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +76 -64
- data/lib/solargraph/pin/base_variable.rb +28 -71
- data/lib/solargraph/pin/block.rb +3 -2
- data/lib/solargraph/pin/breakable.rb +2 -0
- data/lib/solargraph/pin/callable.rb +23 -26
- data/lib/solargraph/pin/closure.rb +5 -4
- data/lib/solargraph/pin/common.rb +5 -2
- data/lib/solargraph/pin/compound_statement.rb +3 -3
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +9 -4
- data/lib/solargraph/pin/delegated_method.rb +4 -4
- data/lib/solargraph/pin/documenting.rb +3 -2
- data/lib/solargraph/pin/local_variable.rb +4 -4
- data/lib/solargraph/pin/method.rb +74 -70
- data/lib/solargraph/pin/namespace.rb +13 -12
- data/lib/solargraph/pin/parameter.rb +28 -27
- data/lib/solargraph/pin/proxy_type.rb +2 -0
- data/lib/solargraph/pin/reference/type_alias.rb +16 -0
- data/lib/solargraph/pin/reference.rb +18 -0
- data/lib/solargraph/pin/search.rb +2 -2
- data/lib/solargraph/pin/signature.rb +9 -14
- data/lib/solargraph/pin/symbol.rb +1 -0
- data/lib/solargraph/pin/until.rb +1 -3
- data/lib/solargraph/pin/while.rb +1 -3
- data/lib/solargraph/pin_cache.rb +71 -488
- data/lib/solargraph/position.rb +38 -17
- data/lib/solargraph/range.rb +10 -9
- data/lib/solargraph/rbs_map/conversions.rb +327 -221
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/stdlib_map.rb +0 -1
- data/lib/solargraph/rbs_map.rb +5 -15
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +224 -66
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +49 -44
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +3 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -6
- data/lib/solargraph/source/chain/if.rb +11 -10
- data/lib/solargraph/source/chain/instance_variable.rb +3 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +4 -6
- data/lib/solargraph/source/chain/or.rb +2 -4
- data/lib/solargraph/source/chain/q_call.rb +13 -11
- data/lib/solargraph/source/chain/variable.rb +15 -13
- data/lib/solargraph/source/chain/z_super.rb +28 -30
- data/lib/solargraph/source/chain.rb +26 -16
- data/lib/solargraph/source/change.rb +3 -3
- data/lib/solargraph/source/cursor.rb +18 -18
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +46 -32
- data/lib/solargraph/source/updater.rb +1 -1
- data/lib/solargraph/source.rb +27 -29
- data/lib/solargraph/source_map/clip.rb +38 -30
- data/lib/solargraph/source_map/mapper.rb +51 -47
- data/lib/solargraph/source_map.rb +8 -4
- data/lib/solargraph/type_checker/rules.rb +8 -8
- data/lib/solargraph/type_checker.rb +95 -102
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +11 -10
- data/lib/solargraph/workspace/gemspecs.rb +3 -3
- data/lib/solargraph/workspace.rb +45 -165
- data/lib/solargraph/yard_map/helpers.rb +6 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +8 -6
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -1
- data/lib/solargraph/yard_map/mapper.rb +12 -12
- data/lib/solargraph/yard_map.rb +17 -18
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +26 -33
- data/lib/solargraph.rb +7 -5
- data/solargraph.gemspec +36 -35
- metadata +33 -38
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'ripper'
|
|
2
4
|
|
|
3
5
|
module Solargraph
|
|
@@ -26,19 +28,25 @@ module Solargraph
|
|
|
26
28
|
# @sg-ignore Need to add nil check here
|
|
27
29
|
if @buffer_lines[result[2][0]][0..result[2][1]].strip =~ /^#/
|
|
28
30
|
chomped = result[1].chomp
|
|
29
|
-
if result[2][0]
|
|
31
|
+
if result[2][0].zero? && chomped.encode('UTF-8', 'binary', invalid: :replace, undef: :replace,
|
|
32
|
+
replace: '').match(/^#\s*frozen_string_literal:/)
|
|
30
33
|
chomped = '#'
|
|
31
34
|
end
|
|
32
|
-
@comments[result[2][0]] =
|
|
35
|
+
@comments[result[2][0]] =
|
|
36
|
+
Snippet.new(Range.from_to(result[2][0], result[2][1], result[2][0], result[2][1] + chomped.length), chomped)
|
|
33
37
|
end
|
|
34
38
|
result
|
|
35
39
|
end
|
|
36
40
|
|
|
37
41
|
# @param result [Array(Symbol, String, Array([Integer, nil], [Integer, nil]))]
|
|
38
42
|
# @return [void]
|
|
39
|
-
def create_snippet
|
|
43
|
+
def create_snippet result
|
|
40
44
|
chomped = result[1].chomp
|
|
41
|
-
@comments[result[2][0]] =
|
|
45
|
+
@comments[result[2][0]] =
|
|
46
|
+
Snippet.new(
|
|
47
|
+
Range.from_to(result[2][0] || 0, result[2][1] || 0, result[2][0] || 0,
|
|
48
|
+
(result[2][1] || 0) + chomped.length), chomped
|
|
49
|
+
)
|
|
42
50
|
end
|
|
43
51
|
|
|
44
52
|
# @sg-ignore @override is adding, not overriding
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
module Solargraph
|
|
2
4
|
module Parser
|
|
3
5
|
class FlowSensitiveTyping
|
|
@@ -7,7 +9,7 @@ module Solargraph
|
|
|
7
9
|
# @param ivars [Array<Solargraph::Pin::InstanceVariable>]
|
|
8
10
|
# @param enclosing_breakable_pin [Solargraph::Pin::Breakable, nil]
|
|
9
11
|
# @param enclosing_compound_statement_pin [Solargraph::Pin::CompoundStatement, nil]
|
|
10
|
-
def initialize
|
|
12
|
+
def initialize locals, ivars, enclosing_breakable_pin, enclosing_compound_statement_pin
|
|
11
13
|
@locals = locals
|
|
12
14
|
@ivars = ivars
|
|
13
15
|
@enclosing_breakable_pin = enclosing_breakable_pin
|
|
@@ -19,7 +21,7 @@ module Solargraph
|
|
|
19
21
|
# @param false_ranges [Array<Range>]
|
|
20
22
|
#
|
|
21
23
|
# @return [void]
|
|
22
|
-
def process_and
|
|
24
|
+
def process_and and_node, true_ranges = [], false_ranges = []
|
|
23
25
|
return unless and_node.type == :and
|
|
24
26
|
|
|
25
27
|
# @type [Parser::AST::Node]
|
|
@@ -45,7 +47,7 @@ module Solargraph
|
|
|
45
47
|
# @param false_ranges [Array<Range>]
|
|
46
48
|
#
|
|
47
49
|
# @return [void]
|
|
48
|
-
def process_or
|
|
50
|
+
def process_or or_node, true_ranges = [], false_ranges = []
|
|
49
51
|
return unless or_node.type == :or
|
|
50
52
|
|
|
51
53
|
# @type [Parser::AST::Node]
|
|
@@ -74,7 +76,7 @@ module Solargraph
|
|
|
74
76
|
# @param false_presences [Array<Range>]
|
|
75
77
|
#
|
|
76
78
|
# @return [void]
|
|
77
|
-
def process_calls
|
|
79
|
+
def process_calls node, true_presences, false_presences
|
|
78
80
|
return unless node.type == :send
|
|
79
81
|
|
|
80
82
|
process_isa(node, true_presences, false_presences)
|
|
@@ -87,7 +89,7 @@ module Solargraph
|
|
|
87
89
|
# @param false_ranges [Array<Range>]
|
|
88
90
|
#
|
|
89
91
|
# @return [void]
|
|
90
|
-
def process_if
|
|
92
|
+
def process_if if_node, true_ranges = [], false_ranges = []
|
|
91
93
|
return if if_node.type != :if
|
|
92
94
|
|
|
93
95
|
#
|
|
@@ -111,13 +113,9 @@ module Solargraph
|
|
|
111
113
|
rest_of_breakable_body = Range.new(get_node_end_position(if_node),
|
|
112
114
|
get_node_end_position(enclosing_breakable_pin.node))
|
|
113
115
|
|
|
114
|
-
if always_breaks?(then_clause)
|
|
115
|
-
false_ranges << rest_of_breakable_body
|
|
116
|
-
end
|
|
116
|
+
false_ranges << rest_of_breakable_body if always_breaks?(then_clause)
|
|
117
117
|
|
|
118
|
-
if always_breaks?(else_clause)
|
|
119
|
-
true_ranges << rest_of_breakable_body
|
|
120
|
-
end
|
|
118
|
+
true_ranges << rest_of_breakable_body if always_breaks?(else_clause)
|
|
121
119
|
end
|
|
122
120
|
|
|
123
121
|
unless enclosing_compound_statement_pin.node.nil?
|
|
@@ -129,13 +127,9 @@ module Solargraph
|
|
|
129
127
|
# statement, we can assume things about the rest of the
|
|
130
128
|
# compound statement
|
|
131
129
|
#
|
|
132
|
-
if always_leaves_compound_statement?(then_clause)
|
|
133
|
-
false_ranges << rest_of_returnable_body
|
|
134
|
-
end
|
|
130
|
+
false_ranges << rest_of_returnable_body if always_leaves_compound_statement?(then_clause)
|
|
135
131
|
|
|
136
|
-
if always_leaves_compound_statement?(else_clause)
|
|
137
|
-
true_ranges << rest_of_returnable_body
|
|
138
|
-
end
|
|
132
|
+
true_ranges << rest_of_returnable_body if always_leaves_compound_statement?(else_clause)
|
|
139
133
|
end
|
|
140
134
|
|
|
141
135
|
unless then_clause.nil?
|
|
@@ -166,7 +160,7 @@ module Solargraph
|
|
|
166
160
|
# @param false_ranges [Array<Range>]
|
|
167
161
|
#
|
|
168
162
|
# @return [void]
|
|
169
|
-
def process_while
|
|
163
|
+
def process_while while_node, true_ranges = [], false_ranges = []
|
|
170
164
|
return if while_node.type != :while
|
|
171
165
|
|
|
172
166
|
#
|
|
@@ -210,7 +204,7 @@ module Solargraph
|
|
|
210
204
|
# @param downcast_not_type [ComplexType, nil]
|
|
211
205
|
#
|
|
212
206
|
# @return [void]
|
|
213
|
-
def add_downcast_var
|
|
207
|
+
def add_downcast_var pin, presence:, downcast_type:, downcast_not_type:
|
|
214
208
|
new_pin = pin.downcast(exclude_return_type: downcast_not_type,
|
|
215
209
|
intersection_return_type: downcast_type,
|
|
216
210
|
source: :flow_sensitive_typing,
|
|
@@ -228,7 +222,7 @@ module Solargraph
|
|
|
228
222
|
# @param presences [Array<Range>]
|
|
229
223
|
#
|
|
230
224
|
# @return [void]
|
|
231
|
-
def process_facts
|
|
225
|
+
def process_facts facts_by_pin, presences
|
|
232
226
|
#
|
|
233
227
|
# Add specialized vars for the rest of the block
|
|
234
228
|
#
|
|
@@ -251,7 +245,7 @@ module Solargraph
|
|
|
251
245
|
# @param false_ranges [Array<Range>]
|
|
252
246
|
#
|
|
253
247
|
# @return [void]
|
|
254
|
-
def process_expression
|
|
248
|
+
def process_expression expression_node, true_ranges, false_ranges
|
|
255
249
|
process_calls(expression_node, true_ranges, false_ranges)
|
|
256
250
|
process_and(expression_node, true_ranges, false_ranges)
|
|
257
251
|
process_or(expression_node, true_ranges, false_ranges)
|
|
@@ -263,7 +257,7 @@ module Solargraph
|
|
|
263
257
|
# @return [Array(String, String), nil] Tuple of rgument to
|
|
264
258
|
# function, then receiver of function if it's a variable,
|
|
265
259
|
# otherwise nil if no simple variable receiver
|
|
266
|
-
def parse_call
|
|
260
|
+
def parse_call call_node, method_name
|
|
267
261
|
return unless call_node&.type == :send && call_node.children[1] == method_name
|
|
268
262
|
# Check if conditional node follows this pattern:
|
|
269
263
|
# s(:send,
|
|
@@ -281,8 +275,7 @@ module Solargraph
|
|
|
281
275
|
end
|
|
282
276
|
# or like this:
|
|
283
277
|
# (lvar :repr)
|
|
284
|
-
|
|
285
|
-
variable_name = call_receiver.children[0].to_s if [:lvar, :ivar].include?(call_receiver&.type)
|
|
278
|
+
variable_name = call_receiver.children[0].to_s if %i[lvar ivar].include?(call_receiver&.type)
|
|
286
279
|
return unless variable_name
|
|
287
280
|
|
|
288
281
|
[call_arg, variable_name]
|
|
@@ -290,7 +283,7 @@ module Solargraph
|
|
|
290
283
|
|
|
291
284
|
# @param isa_node [Parser::AST::Node]
|
|
292
285
|
# @return [Array(String, String), nil]
|
|
293
|
-
def parse_isa
|
|
286
|
+
def parse_isa isa_node
|
|
294
287
|
call_type_name, variable_name = parse_call(isa_node, :is_a?)
|
|
295
288
|
|
|
296
289
|
return unless call_type_name
|
|
@@ -304,7 +297,7 @@ module Solargraph
|
|
|
304
297
|
# @sg-ignore Solargraph::Parser::FlowSensitiveTyping#find_var
|
|
305
298
|
# return type could not be inferred
|
|
306
299
|
# @return [Solargraph::Pin::LocalVariable, Solargraph::Pin::InstanceVariable, nil]
|
|
307
|
-
def find_var
|
|
300
|
+
def find_var variable_name, position
|
|
308
301
|
if variable_name.start_with?('@')
|
|
309
302
|
# @sg-ignore flow sensitive typing needs to handle attrs
|
|
310
303
|
ivars.find { |ivar| ivar.name == variable_name && (!ivar.presence || ivar.presence.include?(position)) }
|
|
@@ -319,7 +312,7 @@ module Solargraph
|
|
|
319
312
|
# @param false_presences [Array<Range>]
|
|
320
313
|
#
|
|
321
314
|
# @return [void]
|
|
322
|
-
def process_isa
|
|
315
|
+
def process_isa isa_node, true_presences, false_presences
|
|
323
316
|
isa_type_name, variable_name = parse_isa(isa_node)
|
|
324
317
|
return if variable_name.nil? || variable_name.empty?
|
|
325
318
|
# @sg-ignore Need to add nil check here
|
|
@@ -343,7 +336,7 @@ module Solargraph
|
|
|
343
336
|
|
|
344
337
|
# @param nilp_node [Parser::AST::Node]
|
|
345
338
|
# @return [Array(String, String), nil]
|
|
346
|
-
def parse_nilp
|
|
339
|
+
def parse_nilp nilp_node
|
|
347
340
|
parse_call(nilp_node, :nil?)
|
|
348
341
|
end
|
|
349
342
|
|
|
@@ -352,7 +345,7 @@ module Solargraph
|
|
|
352
345
|
# @param false_presences [Array<Range>]
|
|
353
346
|
#
|
|
354
347
|
# @return [void]
|
|
355
|
-
def process_nilp
|
|
348
|
+
def process_nilp nilp_node, true_presences, false_presences
|
|
356
349
|
nilp_arg, variable_name = parse_nilp(nilp_node)
|
|
357
350
|
return if variable_name.nil? || variable_name.empty?
|
|
358
351
|
# if .nil? got an argument, move on, this isn't the situation
|
|
@@ -380,7 +373,7 @@ module Solargraph
|
|
|
380
373
|
|
|
381
374
|
# @param bang_node [Parser::AST::Node]
|
|
382
375
|
# @return [Array(String, String), nil]
|
|
383
|
-
def parse_bang
|
|
376
|
+
def parse_bang bang_node
|
|
384
377
|
parse_call(bang_node, :!)
|
|
385
378
|
end
|
|
386
379
|
|
|
@@ -389,7 +382,7 @@ module Solargraph
|
|
|
389
382
|
# @param false_presences [Array<Range>]
|
|
390
383
|
#
|
|
391
384
|
# @return [void]
|
|
392
|
-
def process_bang
|
|
385
|
+
def process_bang bang_node, true_presences, false_presences
|
|
393
386
|
# pry(main)> require 'parser/current'; Parser::CurrentRuby.parse("!2")
|
|
394
387
|
# => s(:send,
|
|
395
388
|
# s(:int, 2), :!)
|
|
@@ -405,7 +398,7 @@ module Solargraph
|
|
|
405
398
|
# @param var_node [Parser::AST::Node]
|
|
406
399
|
#
|
|
407
400
|
# @return [String, nil] Variable name referenced
|
|
408
|
-
def parse_variable
|
|
401
|
+
def parse_variable var_node
|
|
409
402
|
return if var_node.children.length != 1
|
|
410
403
|
|
|
411
404
|
var_node.children[0]&.to_s
|
|
@@ -415,8 +408,8 @@ module Solargraph
|
|
|
415
408
|
# @param node [Parser::AST::Node]
|
|
416
409
|
# @param true_presences [Array<Range>]
|
|
417
410
|
# @param false_presences [Array<Range>]
|
|
418
|
-
def process_variable
|
|
419
|
-
return unless [
|
|
411
|
+
def process_variable node, true_presences, false_presences
|
|
412
|
+
return unless %i[lvar ivar cvar gvar].include?(node.type)
|
|
420
413
|
|
|
421
414
|
variable_name = parse_variable(node)
|
|
422
415
|
return if variable_name.nil?
|
|
@@ -443,7 +436,7 @@ module Solargraph
|
|
|
443
436
|
# @param node [Parser::AST::Node]
|
|
444
437
|
#
|
|
445
438
|
# @return [String, nil]
|
|
446
|
-
def type_name
|
|
439
|
+
def type_name node
|
|
447
440
|
# e.g.,
|
|
448
441
|
# s(:const, nil, :Baz)
|
|
449
442
|
return unless node&.type == :const
|
|
@@ -462,22 +455,17 @@ module Solargraph
|
|
|
462
455
|
|
|
463
456
|
# @param clause_node [Parser::AST::Node, nil]
|
|
464
457
|
# @sg-ignore need boolish support for ? methods
|
|
465
|
-
def always_breaks?
|
|
458
|
+
def always_breaks? clause_node
|
|
466
459
|
clause_node&.type == :break
|
|
467
460
|
end
|
|
468
461
|
|
|
469
462
|
# @param clause_node [Parser::AST::Node, nil]
|
|
470
|
-
def always_leaves_compound_statement?
|
|
463
|
+
def always_leaves_compound_statement? clause_node
|
|
471
464
|
# https://docs.ruby-lang.org/en/2.2.0/keywords_rdoc.html
|
|
472
|
-
|
|
473
|
-
[:return, :raise, :next, :redo, :retry].include?(clause_node&.type)
|
|
465
|
+
%i[return raise next redo retry].include?(clause_node&.type)
|
|
474
466
|
end
|
|
475
467
|
|
|
476
|
-
attr_reader :locals
|
|
477
|
-
|
|
478
|
-
attr_reader :ivars
|
|
479
|
-
|
|
480
|
-
attr_reader :enclosing_breakable_pin, :enclosing_compound_statement_pin
|
|
468
|
+
attr_reader :locals, :ivars, :enclosing_breakable_pin, :enclosing_compound_statement_pin
|
|
481
469
|
end
|
|
482
470
|
end
|
|
483
471
|
end
|
|
@@ -58,13 +58,13 @@ module Solargraph
|
|
|
58
58
|
# @sg-ignore downcast output of Enumerable#select
|
|
59
59
|
# @return [Solargraph::Pin::Breakable, nil]
|
|
60
60
|
def enclosing_breakable_pin
|
|
61
|
-
pins.select{|pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position)}.last
|
|
61
|
+
pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
|
|
62
62
|
end
|
|
63
63
|
|
|
64
64
|
# @todo downcast output of Enumerable#select
|
|
65
65
|
# @return [Solargraph::Pin::CompoundStatement, nil]
|
|
66
66
|
def enclosing_compound_statement_pin
|
|
67
|
-
pins.select{|pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position)}.last
|
|
67
|
+
pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# @param subregion [Region]
|
|
@@ -80,14 +80,14 @@ module Solargraph
|
|
|
80
80
|
|
|
81
81
|
# @param node [Parser::AST::Node]
|
|
82
82
|
# @return [Solargraph::Location]
|
|
83
|
-
def get_node_location
|
|
83
|
+
def get_node_location node
|
|
84
84
|
range = Parser.node_range(node)
|
|
85
85
|
Location.new(region.filename, range)
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# @param node [Parser::AST::Node]
|
|
89
89
|
# @return [String, nil]
|
|
90
|
-
def comments_for
|
|
90
|
+
def comments_for node
|
|
91
91
|
region.source.comments_for(node)
|
|
92
92
|
end
|
|
93
93
|
|
|
@@ -34,9 +34,7 @@ module Solargraph
|
|
|
34
34
|
# @return [::Parser::Base]
|
|
35
35
|
def parser
|
|
36
36
|
@parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
|
|
37
|
-
# @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
|
|
38
37
|
parser.diagnostics.all_errors_are_fatal = true
|
|
39
|
-
# @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
|
|
40
38
|
parser.diagnostics.ignore_warnings = true
|
|
41
39
|
end
|
|
42
40
|
end
|
|
@@ -54,7 +52,7 @@ module Solargraph
|
|
|
54
52
|
# @param name [String]
|
|
55
53
|
# @return [Array<Location>]
|
|
56
54
|
def references source, name
|
|
57
|
-
if name.end_with?(
|
|
55
|
+
if name.end_with?('=')
|
|
58
56
|
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
|
59
57
|
# @param code [String]
|
|
60
58
|
# @param offset [Integer]
|
|
@@ -98,17 +96,17 @@ module Solargraph
|
|
|
98
96
|
|
|
99
97
|
# @return [Source::Chain]
|
|
100
98
|
def chain *args
|
|
101
|
-
NodeChainer.chain
|
|
99
|
+
NodeChainer.chain(*args)
|
|
102
100
|
end
|
|
103
101
|
|
|
104
102
|
# @return [Source::Chain]
|
|
105
103
|
def chain_string *args
|
|
106
|
-
NodeChainer.load_string
|
|
104
|
+
NodeChainer.load_string(*args)
|
|
107
105
|
end
|
|
108
106
|
|
|
109
107
|
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
|
110
108
|
def process_node *args
|
|
111
|
-
Solargraph::Parser::NodeProcessor.process
|
|
109
|
+
Solargraph::Parser::NodeProcessor.process(*args)
|
|
112
110
|
end
|
|
113
111
|
|
|
114
112
|
# @param node [Parser::AST::Node, nil]
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Parser
|
|
5
|
-
module ParserGem
|
|
6
|
-
# A custom builder for source parsers that ignores character encoding
|
|
7
|
-
# issues in literal strings.
|
|
8
|
-
#
|
|
9
|
-
class FlawedBuilder < ::Parser::Builders::Default
|
|
10
|
-
# @param token [::Parser::AST::Node]
|
|
11
|
-
# @return [String]
|
|
12
|
-
# @sg-ignore
|
|
13
|
-
def string_value
|
|
14
|
-
value(token)
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Parser
|
|
5
|
+
module ParserGem
|
|
6
|
+
# A custom builder for source parsers that ignores character encoding
|
|
7
|
+
# issues in literal strings.
|
|
8
|
+
#
|
|
9
|
+
class FlawedBuilder < ::Parser::Builders::Default
|
|
10
|
+
# @param token [::Parser::AST::Node]
|
|
11
|
+
# @return [String]
|
|
12
|
+
# @sg-ignore
|
|
13
|
+
def string_value token
|
|
14
|
+
value(token)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -22,7 +22,7 @@ module Solargraph
|
|
|
22
22
|
# @return [Source::Chain]
|
|
23
23
|
def chain
|
|
24
24
|
links = generate_links(@node)
|
|
25
|
-
Chain.new(links, @node,
|
|
25
|
+
Chain.new(links, @node, Parser.is_ast_node?(@node) && @node.type == :splat)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
class << self
|
|
@@ -39,7 +39,7 @@ module Solargraph
|
|
|
39
39
|
# @param starting_line [Integer]
|
|
40
40
|
#
|
|
41
41
|
# @return [Source::Chain]
|
|
42
|
-
def load_string
|
|
42
|
+
def load_string code, filename, starting_line
|
|
43
43
|
node = Parser.parse(code.sub(/\.$/, ''), filename, starting_line)
|
|
44
44
|
chain = NodeChainer.new(node).chain
|
|
45
45
|
chain.links.push(Chain::Link.new) if code.end_with?('.')
|
|
@@ -63,10 +63,9 @@ module Solargraph
|
|
|
63
63
|
result.concat generate_links(n.children[0])
|
|
64
64
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
65
65
|
elsif n.children[0].nil?
|
|
66
|
-
args = []
|
|
67
66
|
# @sg-ignore Need to add nil check here
|
|
68
|
-
n.children[2
|
|
69
|
-
|
|
67
|
+
n.children[2..].map do |c|
|
|
68
|
+
NodeChainer.chain(c, @filename, n)
|
|
70
69
|
end
|
|
71
70
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
72
71
|
else
|
|
@@ -94,13 +93,13 @@ module Solargraph
|
|
|
94
93
|
elsif n.type == :const
|
|
95
94
|
const = unpack_name(n)
|
|
96
95
|
result.push Chain::Constant.new(const)
|
|
97
|
-
elsif [
|
|
96
|
+
elsif %i[lvar lvasgn].include?(n.type)
|
|
98
97
|
result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
|
|
99
|
-
elsif [
|
|
98
|
+
elsif %i[ivar ivasgn].include?(n.type)
|
|
100
99
|
result.push Chain::InstanceVariable.new(n.children[0].to_s, n, Location.from_node(n))
|
|
101
|
-
elsif [
|
|
100
|
+
elsif %i[cvar cvasgn].include?(n.type)
|
|
102
101
|
result.push Chain::ClassVariable.new(n.children[0].to_s)
|
|
103
|
-
elsif [
|
|
102
|
+
elsif %i[gvar gvasgn].include?(n.type)
|
|
104
103
|
result.push Chain::GlobalVariable.new(n.children[0].to_s)
|
|
105
104
|
elsif n.type == :or_asgn
|
|
106
105
|
# @bar ||= 123 translates to:
|
|
@@ -113,13 +112,14 @@ module Solargraph
|
|
|
113
112
|
or_link = Chain::Or.new([lhs_chain, rhs_chain])
|
|
114
113
|
# this is just for a call chain, so we don't need to record the assignment
|
|
115
114
|
result.push(or_link)
|
|
116
|
-
elsif [
|
|
115
|
+
elsif %i[class module def defs].include?(n.type)
|
|
117
116
|
# @todo Undefined or what?
|
|
118
117
|
result.push Chain::UNDEFINED_CALL
|
|
119
118
|
elsif n.type == :and
|
|
120
119
|
result.concat generate_links(n.children.last)
|
|
121
120
|
elsif n.type == :or
|
|
122
|
-
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename),
|
|
121
|
+
result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename),
|
|
122
|
+
NodeChainer.chain(n.children[1], @filename, n)])
|
|
123
123
|
elsif n.type == :if
|
|
124
124
|
then_clause = if n.children[1]
|
|
125
125
|
NodeChainer.chain(n.children[1], @filename, n)
|
|
@@ -132,7 +132,7 @@ module Solargraph
|
|
|
132
132
|
Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
|
|
133
133
|
end
|
|
134
134
|
result.push Chain::If.new([then_clause, else_clause])
|
|
135
|
-
elsif [
|
|
135
|
+
elsif %i[begin kwbegin].include?(n.type)
|
|
136
136
|
result.concat generate_links(n.children.last)
|
|
137
137
|
elsif n.type == :block_pass
|
|
138
138
|
block_variable_name_node = n.children[0]
|
|
@@ -140,12 +140,10 @@ module Solargraph
|
|
|
140
140
|
# anonymous block forwarding (e.g., "&")
|
|
141
141
|
# added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
|
|
142
142
|
result.push Chain::BlockVariable.new(nil)
|
|
143
|
+
elsif block_variable_name_node.type == :sym
|
|
144
|
+
result.push Chain::BlockSymbol.new(block_variable_name_node.children[0].to_s)
|
|
143
145
|
else
|
|
144
|
-
|
|
145
|
-
result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
|
|
146
|
-
else
|
|
147
|
-
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
|
|
148
|
-
end
|
|
146
|
+
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0]}")
|
|
149
147
|
end
|
|
150
148
|
elsif n.type == :hash
|
|
151
149
|
result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
|
|
@@ -154,7 +152,7 @@ module Solargraph
|
|
|
154
152
|
result.push Source::Chain::Array.new(chained_children, n)
|
|
155
153
|
else
|
|
156
154
|
lit = infer_literal_node_type(n)
|
|
157
|
-
result.push
|
|
155
|
+
result.push(lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
|
|
158
156
|
end
|
|
159
157
|
result
|
|
160
158
|
end
|
|
@@ -163,7 +161,9 @@ module Solargraph
|
|
|
163
161
|
def hash_is_splatted? node
|
|
164
162
|
return false unless Parser.is_ast_node?(node) && node.type == :hash
|
|
165
163
|
return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
|
|
166
|
-
|
|
164
|
+
if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
|
|
165
|
+
return false
|
|
166
|
+
end
|
|
167
167
|
true
|
|
168
168
|
end
|
|
169
169
|
|
|
@@ -181,7 +181,7 @@ module Solargraph
|
|
|
181
181
|
# @return [Array<Source::Chain>]
|
|
182
182
|
def node_args node
|
|
183
183
|
# @sg-ignore Need to add nil check here
|
|
184
|
-
node.children[2
|
|
184
|
+
node.children[2..].map do |child|
|
|
185
185
|
NodeChainer.chain(child, @filename, node)
|
|
186
186
|
end
|
|
187
187
|
end
|