solargraph 0.58.2 → 0.59.0.dev.2
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 +41 -34
- data/.github/workflows/rspec.yml +44 -23
- data/.github/workflows/typecheck.yml +2 -2
- data/.rubocop.yml +32 -5
- data/.rubocop_todo.yml +50 -966
- data/Gemfile +3 -1
- data/README.md +3 -3
- data/Rakefile +26 -23
- data/bin/solargraph +2 -1
- data/lib/solargraph/api_map/cache.rb +3 -3
- data/lib/solargraph/api_map/constants.rb +13 -3
- data/lib/solargraph/api_map/index.rb +23 -18
- data/lib/solargraph/api_map/source_to_yard.rb +22 -9
- data/lib/solargraph/api_map/store.rb +33 -28
- data/lib/solargraph/api_map.rb +150 -82
- data/lib/solargraph/bench.rb +44 -45
- data/lib/solargraph/complex_type/conformance.rb +176 -0
- data/lib/solargraph/complex_type/type_methods.rb +28 -17
- data/lib/solargraph/complex_type/unique_type.rb +218 -57
- data/lib/solargraph/complex_type.rb +170 -57
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -61
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +7 -5
- data/lib/solargraph/convention/data_definition.rb +5 -2
- 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 +2 -1
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +4 -3
- data/lib/solargraph/convention/struct_definition.rb +8 -4
- 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/require_not_found.rb +1 -0
- data/lib/solargraph/diagnostics/rubocop.rb +11 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/diagnostics/type_check.rb +11 -10
- data/lib/solargraph/diagnostics/update_errors.rb +37 -41
- data/lib/solargraph/doc_map.rb +133 -373
- data/lib/solargraph/equality.rb +4 -4
- data/lib/solargraph/gem_pins.rb +21 -20
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/diagnoser.rb +1 -1
- data/lib/solargraph/language_server/host/dispatch.rb +3 -3
- data/lib/solargraph/language_server/host/message_worker.rb +4 -3
- data/lib/solargraph/language_server/host/sources.rb +2 -1
- data/lib/solargraph/language_server/host.rb +30 -22
- 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 +12 -18
- data/lib/solargraph/language_server/message/extended/document.rb +1 -0
- 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 +10 -8
- data/lib/solargraph/language_server/message/text_document/definition.rb +41 -32
- 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 -19
- data/lib/solargraph/language_server/message/text_document/formatting.rb +8 -6
- data/lib/solargraph/language_server/message/text_document/hover.rb +5 -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 +3 -2
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +25 -17
- 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 -17
- 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 +85 -44
- data/lib/solargraph/location.rb +17 -14
- data/lib/solargraph/logging.rb +24 -4
- data/lib/solargraph/page.rb +92 -92
- data/lib/solargraph/parser/comment_ripper.rb +19 -4
- data/lib/solargraph/parser/flow_sensitive_typing.rb +326 -108
- data/lib/solargraph/parser/node_processor/base.rb +34 -4
- data/lib/solargraph/parser/node_processor.rb +8 -7
- data/lib/solargraph/parser/parser_gem/class_methods.rb +32 -14
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +19 -19
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +50 -25
- data/lib/solargraph/parser/parser_gem/node_methods.rb +91 -70
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_processors/begin_node.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +12 -12
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +10 -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 +36 -6
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +5 -3
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/or_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +4 -5
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +124 -113
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -29
- data/lib/solargraph/parser/parser_gem/node_processors/when_node.rb +23 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +6 -2
- data/lib/solargraph/parser/parser_gem/node_processors.rb +4 -0
- data/lib/solargraph/parser/parser_gem.rb +14 -12
- data/lib/solargraph/parser/region.rb +9 -3
- data/lib/solargraph/parser/snippet.rb +3 -1
- data/lib/solargraph/parser.rb +25 -23
- data/lib/solargraph/pin/base.rb +126 -80
- data/lib/solargraph/pin/base_variable.rb +273 -24
- data/lib/solargraph/pin/block.rb +29 -6
- data/lib/solargraph/pin/breakable.rb +7 -1
- data/lib/solargraph/pin/callable.rb +65 -21
- data/lib/solargraph/pin/closure.rb +7 -10
- data/lib/solargraph/pin/common.rb +24 -6
- data/lib/solargraph/pin/compound_statement.rb +55 -0
- data/lib/solargraph/pin/constant.rb +43 -45
- data/lib/solargraph/pin/conversions.rb +10 -4
- data/lib/solargraph/pin/delegated_method.rb +19 -8
- data/lib/solargraph/pin/documenting.rb +4 -2
- data/lib/solargraph/pin/instance_variable.rb +5 -1
- data/lib/solargraph/pin/keyword.rb +0 -4
- data/lib/solargraph/pin/local_variable.rb +15 -59
- data/lib/solargraph/pin/method.rb +153 -104
- data/lib/solargraph/pin/method_alias.rb +8 -0
- data/lib/solargraph/pin/namespace.rb +19 -12
- data/lib/solargraph/pin/parameter.rb +100 -36
- data/lib/solargraph/pin/proxy_type.rb +4 -1
- data/lib/solargraph/pin/reference/override.rb +1 -1
- data/lib/solargraph/pin/reference/superclass.rb +2 -0
- data/lib/solargraph/pin/reference.rb +19 -0
- data/lib/solargraph/pin/search.rb +3 -2
- data/lib/solargraph/pin/signature.rb +15 -12
- data/lib/solargraph/pin/symbol.rb +2 -1
- data/lib/solargraph/pin/until.rb +2 -4
- data/lib/solargraph/pin/while.rb +2 -4
- data/lib/solargraph/pin.rb +2 -0
- data/lib/solargraph/pin_cache.rb +490 -73
- data/lib/solargraph/position.rb +14 -10
- data/lib/solargraph/range.rb +16 -15
- data/lib/solargraph/rbs_map/conversions.rb +343 -214
- data/lib/solargraph/rbs_map/core_fills.rb +91 -84
- data/lib/solargraph/rbs_map/core_map.rb +24 -17
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -5
- data/lib/solargraph/rbs_map.rb +77 -32
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +128 -73
- data/lib/solargraph/source/chain/array.rb +39 -37
- data/lib/solargraph/source/chain/call.rb +96 -56
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +5 -1
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +8 -5
- data/lib/solargraph/source/chain/if.rb +12 -10
- data/lib/solargraph/source/chain/instance_variable.rb +24 -1
- data/lib/solargraph/source/chain/link.rb +99 -109
- data/lib/solargraph/source/chain/literal.rb +9 -6
- data/lib/solargraph/source/chain/or.rb +10 -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 +49 -38
- data/lib/solargraph/source/change.rb +12 -5
- data/lib/solargraph/source/cursor.rb +23 -17
- data/lib/solargraph/source/encoding_fixes.rb +6 -7
- data/lib/solargraph/source/source_chainer.rb +56 -32
- data/lib/solargraph/source/updater.rb +5 -1
- data/lib/solargraph/source.rb +59 -35
- data/lib/solargraph/source_map/clip.rb +48 -29
- data/lib/solargraph/source_map/data.rb +4 -1
- data/lib/solargraph/source_map/mapper.rb +71 -42
- data/lib/solargraph/source_map.rb +21 -9
- data/lib/solargraph/type_checker/problem.rb +3 -1
- data/lib/solargraph/type_checker/rules.rb +81 -8
- data/lib/solargraph/type_checker.rb +195 -120
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/workspace/config.rb +13 -10
- data/lib/solargraph/workspace/gemspecs.rb +367 -0
- data/lib/solargraph/workspace/require_paths.rb +1 -0
- data/lib/solargraph/workspace.rb +149 -30
- data/lib/solargraph/yard_map/helpers.rb +8 -3
- data/lib/solargraph/yard_map/mapper/to_method.rb +13 -7
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +2 -1
- data/lib/solargraph/yard_map/mapper.rb +13 -8
- data/lib/solargraph/yard_tags.rb +20 -20
- data/lib/solargraph/yardoc.rb +33 -23
- data/lib/solargraph.rb +29 -8
- data/rbs/fills/rubygems/0/dependency.rbs +193 -0
- data/rbs/fills/tuple/tuple.rbs +28 -0
- data/rbs/shims/ast/0/node.rbs +1 -1
- data/rbs/shims/diff-lcs/1.5/diff-lcs.rbs +11 -0
- data/solargraph.gemspec +36 -34
- metadata +38 -33
- 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
|
@@ -16,15 +16,20 @@ module Solargraph
|
|
|
16
16
|
# @return [Array<Pin::LocalVariable>]
|
|
17
17
|
attr_reader :locals
|
|
18
18
|
|
|
19
|
+
# @return [Array<Pin::InstanceVariable>]
|
|
20
|
+
attr_reader :ivars
|
|
21
|
+
|
|
19
22
|
# @param node [Parser::AST::Node]
|
|
20
23
|
# @param region [Region]
|
|
21
24
|
# @param pins [Array<Pin::Base>]
|
|
22
25
|
# @param locals [Array<Pin::LocalVariable>]
|
|
23
|
-
|
|
26
|
+
# @param ivars [Array<Pin::InstanceVariable>]
|
|
27
|
+
def initialize node, region, pins, locals, ivars
|
|
24
28
|
@node = node
|
|
25
29
|
@region = region
|
|
26
30
|
@pins = pins
|
|
27
31
|
@locals = locals
|
|
32
|
+
@ivars = ivars
|
|
28
33
|
@processed_children = false
|
|
29
34
|
end
|
|
30
35
|
|
|
@@ -40,6 +45,28 @@ module Solargraph
|
|
|
40
45
|
|
|
41
46
|
private
|
|
42
47
|
|
|
48
|
+
# @return [Solargraph::Location]
|
|
49
|
+
def location
|
|
50
|
+
get_node_location(node)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# @return [Solargraph::Position]
|
|
54
|
+
def position
|
|
55
|
+
Position.new(node.loc.line, node.loc.column)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @sg-ignore downcast output of Enumerable#select
|
|
59
|
+
# @return [Solargraph::Pin::Breakable, nil]
|
|
60
|
+
def enclosing_breakable_pin
|
|
61
|
+
pins.select { |pin| pin.is_a?(Pin::Breakable) && pin.location&.range&.contain?(position) }.last
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# @todo downcast output of Enumerable#select
|
|
65
|
+
# @return [Solargraph::Pin::CompoundStatement, nil]
|
|
66
|
+
def enclosing_compound_statement_pin
|
|
67
|
+
pins.select { |pin| pin.is_a?(Pin::CompoundStatement) && pin.location&.range&.contain?(position) }.last
|
|
68
|
+
end
|
|
69
|
+
|
|
43
70
|
# @param subregion [Region]
|
|
44
71
|
# @return [void]
|
|
45
72
|
def process_children subregion = region
|
|
@@ -47,20 +74,20 @@ module Solargraph
|
|
|
47
74
|
@processed_children = true
|
|
48
75
|
node.children.each do |child|
|
|
49
76
|
next unless Parser.is_ast_node?(child)
|
|
50
|
-
NodeProcessor.process(child, subregion, pins, locals)
|
|
77
|
+
NodeProcessor.process(child, subregion, pins, locals, ivars)
|
|
51
78
|
end
|
|
52
79
|
end
|
|
53
80
|
|
|
54
81
|
# @param node [Parser::AST::Node]
|
|
55
82
|
# @return [Solargraph::Location]
|
|
56
|
-
def get_node_location
|
|
83
|
+
def get_node_location node
|
|
57
84
|
range = Parser.node_range(node)
|
|
58
85
|
Location.new(region.filename, range)
|
|
59
86
|
end
|
|
60
87
|
|
|
61
88
|
# @param node [Parser::AST::Node]
|
|
62
89
|
# @return [String, nil]
|
|
63
|
-
def comments_for
|
|
90
|
+
def comments_for node
|
|
64
91
|
region.source.comments_for(node)
|
|
65
92
|
end
|
|
66
93
|
|
|
@@ -68,6 +95,7 @@ module Solargraph
|
|
|
68
95
|
# @return [Pin::Closure, nil]
|
|
69
96
|
def named_path_pin position
|
|
70
97
|
pins.select do |pin|
|
|
98
|
+
# @sg-ignore Need to add nil check here
|
|
71
99
|
pin.is_a?(Pin::Closure) && pin.path && !pin.path.empty? && pin.location.range.contain?(position)
|
|
72
100
|
end.last
|
|
73
101
|
end
|
|
@@ -77,6 +105,7 @@ module Solargraph
|
|
|
77
105
|
# @return [Pin::Closure, nil]
|
|
78
106
|
def block_pin position
|
|
79
107
|
# @todo determine if this can return a Pin::Block
|
|
108
|
+
# @sg-ignore Need to add nil check here
|
|
80
109
|
pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
|
|
81
110
|
end
|
|
82
111
|
|
|
@@ -84,6 +113,7 @@ module Solargraph
|
|
|
84
113
|
# @param position [Solargraph::Position]
|
|
85
114
|
# @return [Pin::Closure, nil]
|
|
86
115
|
def closure_pin position
|
|
116
|
+
# @sg-ignore Need to add nil check here
|
|
87
117
|
pins.select { |pin| pin.is_a?(Pin::Closure) && pin.location.range.contain?(position) }.last
|
|
88
118
|
end
|
|
89
119
|
end
|
|
@@ -35,27 +35,28 @@ module Solargraph
|
|
|
35
35
|
# @param node [Parser::AST::Node]
|
|
36
36
|
# @param region [Region]
|
|
37
37
|
# @param pins [Array<Pin::Base>]
|
|
38
|
-
# @param locals [Array<Pin::
|
|
39
|
-
# @
|
|
40
|
-
|
|
38
|
+
# @param locals [Array<Pin::LocalVariable>]
|
|
39
|
+
# @param ivars [Array<Pin::InstanceVariable>]
|
|
40
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>, Array<Pin::InstanceVariable>)]
|
|
41
|
+
def self.process node, region = Region.new, pins = [], locals = [], ivars = []
|
|
41
42
|
if pins.empty?
|
|
42
43
|
pins.push Pin::Namespace.new(
|
|
43
44
|
location: region.source.location,
|
|
44
45
|
name: '',
|
|
45
|
-
source: :parser
|
|
46
|
+
source: :parser
|
|
46
47
|
)
|
|
47
48
|
end
|
|
48
|
-
return [pins, locals] unless Parser.is_ast_node?(node)
|
|
49
|
+
return [pins, locals, ivars] unless Parser.is_ast_node?(node)
|
|
49
50
|
node_processor_classes = @@processors[node.type] || [NodeProcessor::Base]
|
|
50
51
|
|
|
51
52
|
node_processor_classes.each do |klass|
|
|
52
|
-
processor = klass.new(node, region, pins, locals)
|
|
53
|
+
processor = klass.new(node, region, pins, locals, ivars)
|
|
53
54
|
process_next = processor.process
|
|
54
55
|
|
|
55
56
|
break unless process_next
|
|
56
57
|
end
|
|
57
58
|
|
|
58
|
-
[pins, locals]
|
|
59
|
+
[pins, locals, ivars]
|
|
59
60
|
end
|
|
60
61
|
end
|
|
61
62
|
end
|
|
@@ -8,19 +8,23 @@ module Solargraph
|
|
|
8
8
|
module ClassMethods
|
|
9
9
|
# @param code [String]
|
|
10
10
|
# @param filename [String, nil]
|
|
11
|
+
# @param starting_line [Integer] must be provided so that we
|
|
12
|
+
# can find relevant local variables later even if this is just
|
|
13
|
+
# a subset of the file in question
|
|
11
14
|
# @return [Array(Parser::AST::Node, Hash{Integer => Solargraph::Parser::Snippet})]
|
|
12
|
-
def parse_with_comments code, filename = nil
|
|
13
|
-
node = parse(code, filename)
|
|
15
|
+
def parse_with_comments code, filename = nil, starting_line = 0
|
|
16
|
+
node = parse(code, filename, starting_line)
|
|
14
17
|
comments = CommentRipper.new(code, filename, 0).parse
|
|
15
18
|
[node, comments]
|
|
16
19
|
end
|
|
17
20
|
|
|
18
21
|
# @param code [String]
|
|
19
22
|
# @param filename [String, nil]
|
|
20
|
-
# @param
|
|
23
|
+
# @param starting_line [Integer]
|
|
24
|
+
# @sg-ignore need to understand that raise does not return
|
|
21
25
|
# @return [Parser::AST::Node]
|
|
22
|
-
def parse code, filename = nil,
|
|
23
|
-
buffer = ::Parser::Source::Buffer.new(filename,
|
|
26
|
+
def parse code, filename = nil, starting_line = 0
|
|
27
|
+
buffer = ::Parser::Source::Buffer.new(filename, starting_line)
|
|
24
28
|
buffer.source = code
|
|
25
29
|
parser.parse(buffer)
|
|
26
30
|
rescue ::Parser::SyntaxError, ::Parser::UnknownEncodingInMagicComment => e
|
|
@@ -30,35 +34,43 @@ module Solargraph
|
|
|
30
34
|
# @return [::Parser::Base]
|
|
31
35
|
def parser
|
|
32
36
|
@parser ||= Prism::Translation::Parser.new(FlawedBuilder.new).tap do |parser|
|
|
37
|
+
# @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
|
|
33
38
|
parser.diagnostics.all_errors_are_fatal = true
|
|
39
|
+
# @sg-ignore Unresolved call to diagnostics on Prism::Translation::Parser
|
|
34
40
|
parser.diagnostics.ignore_warnings = true
|
|
35
41
|
end
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
# @param source [Source]
|
|
39
|
-
# @return [Array(Array<Pin::Base>, Array<Pin::
|
|
45
|
+
# @return [Array(Array<Pin::Base>, Array<Pin::LocalVariable>)]
|
|
40
46
|
def map source
|
|
41
|
-
|
|
47
|
+
# @sg-ignore Need to add nil check here
|
|
48
|
+
pins, locals, ivars = NodeProcessor.process(source.node, Region.new(source: source))
|
|
49
|
+
pins.concat(ivars)
|
|
50
|
+
[pins, locals]
|
|
42
51
|
end
|
|
43
52
|
|
|
44
53
|
# @param source [Source]
|
|
45
54
|
# @param name [String]
|
|
46
55
|
# @return [Array<Location>]
|
|
47
56
|
def references source, name
|
|
48
|
-
if name.end_with?(
|
|
57
|
+
if name.end_with?('=')
|
|
49
58
|
reg = /#{Regexp.escape name[0..-2]}\s*=/
|
|
50
59
|
# @param code [String]
|
|
51
60
|
# @param offset [Integer]
|
|
52
61
|
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
62
|
+
# @sg-ignore Need to add nil check here
|
|
53
63
|
extract_offset = ->(code, offset) { reg.match(code, offset).offset(0) }
|
|
54
64
|
else
|
|
55
65
|
# @param code [String]
|
|
56
66
|
# @param offset [Integer]
|
|
57
67
|
# @return [Array(Integer, Integer), Array(nil, nil)]
|
|
68
|
+
# @sg-ignore Need to add nil check here
|
|
58
69
|
extract_offset = ->(code, offset) { [soff = code.index(name, offset), soff + name.length] }
|
|
59
70
|
end
|
|
60
71
|
inner_node_references(name, source.node).map do |n|
|
|
61
72
|
rng = Range.from_node(n)
|
|
73
|
+
# @sg-ignore Need to add nil check here
|
|
62
74
|
offset = Position.to_offset(source.code, rng.start)
|
|
63
75
|
soff, eoff = extract_offset[source.code, offset]
|
|
64
76
|
Location.new(
|
|
@@ -86,20 +98,20 @@ module Solargraph
|
|
|
86
98
|
|
|
87
99
|
# @return [Source::Chain]
|
|
88
100
|
def chain *args
|
|
89
|
-
NodeChainer.chain
|
|
101
|
+
NodeChainer.chain(*args)
|
|
90
102
|
end
|
|
91
103
|
|
|
92
104
|
# @return [Source::Chain]
|
|
93
105
|
def chain_string *args
|
|
94
|
-
NodeChainer.load_string
|
|
106
|
+
NodeChainer.load_string(*args)
|
|
95
107
|
end
|
|
96
108
|
|
|
97
109
|
# @return [Array(Array<Pin::Base>, Array<Pin::Base>)]
|
|
98
110
|
def process_node *args
|
|
99
|
-
Solargraph::Parser::NodeProcessor.process
|
|
111
|
+
Solargraph::Parser::NodeProcessor.process(*args)
|
|
100
112
|
end
|
|
101
113
|
|
|
102
|
-
# @param node [Parser::AST::Node]
|
|
114
|
+
# @param node [Parser::AST::Node, nil]
|
|
103
115
|
# @return [String, nil]
|
|
104
116
|
def infer_literal_node_type node
|
|
105
117
|
NodeMethods.infer_literal_node_type node
|
|
@@ -110,7 +122,7 @@ module Solargraph
|
|
|
110
122
|
parser.version
|
|
111
123
|
end
|
|
112
124
|
|
|
113
|
-
# @param node [BasicObject]
|
|
125
|
+
# @param node [BasicObject, nil]
|
|
114
126
|
# @return [Boolean]
|
|
115
127
|
def is_ast_node? node
|
|
116
128
|
node.is_a?(::Parser::AST::Node)
|
|
@@ -124,19 +136,25 @@ module Solargraph
|
|
|
124
136
|
Range.new(st, en)
|
|
125
137
|
end
|
|
126
138
|
|
|
127
|
-
# @param node [Parser::AST::Node]
|
|
139
|
+
# @param node [Parser::AST::Node, nil]
|
|
128
140
|
# @return [Array<Range>]
|
|
129
141
|
def string_ranges node
|
|
130
142
|
return [] unless is_ast_node?(node)
|
|
131
143
|
result = []
|
|
144
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
132
145
|
result.push Range.from_node(node) if node.type == :str
|
|
146
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
133
147
|
node.children.each do |child|
|
|
134
148
|
result.concat string_ranges(child)
|
|
135
149
|
end
|
|
150
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
136
151
|
if node.type == :dstr && node.children.last.nil?
|
|
152
|
+
# @sg-ignore Translate to something flow sensitive typing understands
|
|
137
153
|
last = node.children[-2]
|
|
154
|
+
# @sg-ignore Need to add nil check here
|
|
138
155
|
unless last.nil?
|
|
139
156
|
rng = Range.from_node(last)
|
|
157
|
+
# @sg-ignore Need to add nil check here
|
|
140
158
|
pos = Position.new(rng.ending.line, rng.ending.column - 1)
|
|
141
159
|
result.push Range.new(pos, pos)
|
|
142
160
|
end
|
|
@@ -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
|
|
@@ -35,9 +35,12 @@ module Solargraph
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
# @param code [String]
|
|
38
|
+
# @param filename [String]
|
|
39
|
+
# @param starting_line [Integer]
|
|
40
|
+
#
|
|
38
41
|
# @return [Source::Chain]
|
|
39
|
-
def load_string
|
|
40
|
-
node = Parser.parse(code.sub(/\.$/, ''))
|
|
42
|
+
def load_string code, filename, starting_line
|
|
43
|
+
node = Parser.parse(code.sub(/\.$/, ''), filename, starting_line)
|
|
41
44
|
chain = NodeChainer.new(node).chain
|
|
42
45
|
chain.links.push(Chain::Link.new) if code.end_with?('.')
|
|
43
46
|
chain
|
|
@@ -60,9 +63,9 @@ module Solargraph
|
|
|
60
63
|
result.concat generate_links(n.children[0])
|
|
61
64
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
62
65
|
elsif n.children[0].nil?
|
|
63
|
-
|
|
64
|
-
n.children[2
|
|
65
|
-
|
|
66
|
+
# @sg-ignore Need to add nil check here
|
|
67
|
+
n.children[2..].map do |c|
|
|
68
|
+
NodeChainer.chain(c, @filename, n)
|
|
66
69
|
end
|
|
67
70
|
result.push Chain::Call.new(n.children[1].to_s, Location.from_node(n), node_args(n), passed_block(n))
|
|
68
71
|
else
|
|
@@ -90,27 +93,46 @@ module Solargraph
|
|
|
90
93
|
elsif n.type == :const
|
|
91
94
|
const = unpack_name(n)
|
|
92
95
|
result.push Chain::Constant.new(const)
|
|
93
|
-
elsif [
|
|
96
|
+
elsif %i[lvar lvasgn].include?(n.type)
|
|
94
97
|
result.push Chain::Call.new(n.children[0].to_s, Location.from_node(n))
|
|
95
|
-
elsif [
|
|
96
|
-
result.push Chain::InstanceVariable.new(n.children[0].to_s)
|
|
97
|
-
elsif [
|
|
98
|
+
elsif %i[ivar ivasgn].include?(n.type)
|
|
99
|
+
result.push Chain::InstanceVariable.new(n.children[0].to_s, n, Location.from_node(n))
|
|
100
|
+
elsif %i[cvar cvasgn].include?(n.type)
|
|
98
101
|
result.push Chain::ClassVariable.new(n.children[0].to_s)
|
|
99
|
-
elsif [
|
|
102
|
+
elsif %i[gvar gvasgn].include?(n.type)
|
|
100
103
|
result.push Chain::GlobalVariable.new(n.children[0].to_s)
|
|
101
104
|
elsif n.type == :or_asgn
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
+
# @bar ||= 123 translates to:
|
|
106
|
+
#
|
|
107
|
+
# s(:or_asgn,
|
|
108
|
+
# s(:ivasgn, :@bar),
|
|
109
|
+
# s(:int, 123))
|
|
110
|
+
lhs_chain = NodeChainer.chain n.children[0] # s(:ivasgn, :@bar)
|
|
111
|
+
rhs_chain = NodeChainer.chain n.children[1] # s(:int, 123)
|
|
112
|
+
or_link = Chain::Or.new([lhs_chain, rhs_chain])
|
|
113
|
+
# this is just for a call chain, so we don't need to record the assignment
|
|
114
|
+
result.push(or_link)
|
|
115
|
+
elsif %i[class module def defs].include?(n.type)
|
|
105
116
|
# @todo Undefined or what?
|
|
106
117
|
result.push Chain::UNDEFINED_CALL
|
|
107
118
|
elsif n.type == :and
|
|
108
119
|
result.concat generate_links(n.children.last)
|
|
109
120
|
elsif n.type == :or
|
|
110
|
-
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)])
|
|
111
123
|
elsif n.type == :if
|
|
112
|
-
|
|
113
|
-
|
|
124
|
+
then_clause = if n.children[1]
|
|
125
|
+
NodeChainer.chain(n.children[1], @filename, n)
|
|
126
|
+
else
|
|
127
|
+
Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
|
|
128
|
+
end
|
|
129
|
+
else_clause = if n.children[2]
|
|
130
|
+
NodeChainer.chain(n.children[2], @filename, n)
|
|
131
|
+
else
|
|
132
|
+
Source::Chain.new([Source::Chain::Literal.new('nil', nil)], n)
|
|
133
|
+
end
|
|
134
|
+
result.push Chain::If.new([then_clause, else_clause])
|
|
135
|
+
elsif %i[begin kwbegin].include?(n.type)
|
|
114
136
|
result.concat generate_links(n.children.last)
|
|
115
137
|
elsif n.type == :block_pass
|
|
116
138
|
block_variable_name_node = n.children[0]
|
|
@@ -118,12 +140,10 @@ module Solargraph
|
|
|
118
140
|
# anonymous block forwarding (e.g., "&")
|
|
119
141
|
# added in Ruby 3.1 - https://bugs.ruby-lang.org/issues/11256
|
|
120
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)
|
|
121
145
|
else
|
|
122
|
-
|
|
123
|
-
result.push Chain::BlockSymbol.new("#{block_variable_name_node.children[0].to_s}")
|
|
124
|
-
else
|
|
125
|
-
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0].to_s}")
|
|
126
|
-
end
|
|
146
|
+
result.push Chain::BlockVariable.new("&#{block_variable_name_node.children[0]}")
|
|
127
147
|
end
|
|
128
148
|
elsif n.type == :hash
|
|
129
149
|
result.push Chain::Hash.new('::Hash', n, hash_is_splatted?(n))
|
|
@@ -132,7 +152,7 @@ module Solargraph
|
|
|
132
152
|
result.push Source::Chain::Array.new(chained_children, n)
|
|
133
153
|
else
|
|
134
154
|
lit = infer_literal_node_type(n)
|
|
135
|
-
result.push
|
|
155
|
+
result.push(lit ? Chain::Literal.new(lit, n) : Chain::Link.new)
|
|
136
156
|
end
|
|
137
157
|
result
|
|
138
158
|
end
|
|
@@ -141,7 +161,9 @@ module Solargraph
|
|
|
141
161
|
def hash_is_splatted? node
|
|
142
162
|
return false unless Parser.is_ast_node?(node) && node.type == :hash
|
|
143
163
|
return false unless Parser.is_ast_node?(node.children.last) && node.children.last.type == :kwsplat
|
|
144
|
-
|
|
164
|
+
if Parser.is_ast_node?(node.children.last.children[0]) && node.children.last.children[0].type == :hash
|
|
165
|
+
return false
|
|
166
|
+
end
|
|
145
167
|
true
|
|
146
168
|
end
|
|
147
169
|
|
|
@@ -150,13 +172,16 @@ module Solargraph
|
|
|
150
172
|
def passed_block node
|
|
151
173
|
return unless node == @node && @parent&.type == :block
|
|
152
174
|
|
|
175
|
+
# @sg-ignore Need to add nil check here
|
|
153
176
|
NodeChainer.chain(@parent.children[2], @filename)
|
|
154
177
|
end
|
|
155
178
|
|
|
156
179
|
# @param node [Parser::AST::Node]
|
|
180
|
+
# @sg-ignore Need to add nil check here
|
|
157
181
|
# @return [Array<Source::Chain>]
|
|
158
182
|
def node_args node
|
|
159
|
-
|
|
183
|
+
# @sg-ignore Need to add nil check here
|
|
184
|
+
node.children[2..].map do |child|
|
|
160
185
|
NodeChainer.chain(child, @filename, node)
|
|
161
186
|
end
|
|
162
187
|
end
|