solargraph 0.51.2 → 0.54.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/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +1 -3
- data/.github/workflows/typecheck.yml +34 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +127 -5
- data/README.md +13 -16
- data/SPONSORS.md +1 -7
- data/lib/solargraph/api_map/cache.rb +50 -20
- data/lib/solargraph/api_map/source_to_yard.rb +17 -10
- data/lib/solargraph/api_map/store.rb +60 -15
- data/lib/solargraph/api_map.rb +282 -123
- data/lib/solargraph/bench.rb +3 -2
- data/lib/solargraph/cache.rb +29 -5
- data/lib/solargraph/complex_type/type_methods.rb +122 -39
- data/lib/solargraph/complex_type/unique_type.rb +310 -76
- data/lib/solargraph/complex_type.rb +166 -44
- data/lib/solargraph/convention.rb +0 -1
- data/lib/solargraph/converters/dd.rb +5 -0
- data/lib/solargraph/converters/dl.rb +3 -0
- data/lib/solargraph/converters/dt.rb +3 -0
- data/lib/solargraph/diagnostics/rubocop.rb +8 -7
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +1 -0
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics.rb +2 -2
- data/lib/solargraph/doc_map.rb +187 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
- data/lib/solargraph/language_server/host/dispatch.rb +22 -5
- data/lib/solargraph/language_server/host/message_worker.rb +49 -5
- data/lib/solargraph/language_server/host/sources.rb +8 -65
- data/lib/solargraph/language_server/host.rb +65 -84
- data/lib/solargraph/language_server/message/base.rb +19 -12
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
- data/lib/solargraph/language_server/message/initialize.rb +19 -2
- data/lib/solargraph/language_server/message/text_document/completion.rb +0 -3
- data/lib/solargraph/language_server/message/text_document/definition.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +3 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
- data/lib/solargraph/language_server/message/text_document.rb +0 -1
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
- data/lib/solargraph/language_server/progress.rb +135 -0
- data/lib/solargraph/language_server/transport/adapter.rb +16 -1
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
- data/lib/solargraph/language_server.rb +1 -0
- data/lib/solargraph/library.rb +207 -111
- data/lib/solargraph/location.rb +15 -1
- data/lib/solargraph/page.rb +6 -0
- data/lib/solargraph/parser/comment_ripper.rb +4 -0
- data/lib/solargraph/parser/node_methods.rb +47 -7
- data/lib/solargraph/parser/node_processor/base.rb +11 -1
- data/lib/solargraph/parser/node_processor.rb +1 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +62 -43
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +57 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/cvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/def_node.rb +7 -20
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +4 -4
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +53 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sclass_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +8 -6
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/sym_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +1 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +8 -12
- data/lib/solargraph/pin/base.rb +78 -10
- data/lib/solargraph/pin/base_variable.rb +40 -7
- data/lib/solargraph/pin/block.rb +69 -46
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/closure.rb +23 -3
- data/lib/solargraph/pin/common.rb +6 -6
- data/lib/solargraph/pin/conversions.rb +36 -5
- data/lib/solargraph/pin/delegated_method.rb +6 -2
- data/lib/solargraph/pin/documenting.rb +25 -32
- data/lib/solargraph/pin/instance_variable.rb +6 -2
- data/lib/solargraph/pin/local_variable.rb +13 -1
- data/lib/solargraph/pin/method.rb +205 -32
- data/lib/solargraph/pin/namespace.rb +20 -7
- data/lib/solargraph/pin/parameter.rb +41 -36
- data/lib/solargraph/pin/proxy_type.rb +1 -1
- data/lib/solargraph/pin/reference/override.rb +2 -2
- data/lib/solargraph/pin/reference.rb +8 -0
- data/lib/solargraph/pin/search.rb +3 -3
- data/lib/solargraph/pin/signature.rb +8 -14
- data/lib/solargraph/pin.rb +4 -2
- data/lib/solargraph/range.rb +4 -6
- data/lib/solargraph/rbs_map/conversions.rb +326 -76
- data/lib/solargraph/rbs_map/core_fills.rb +16 -33
- data/lib/solargraph/rbs_map/core_map.rb +3 -13
- data/lib/solargraph/rbs_map/stdlib_map.rb +2 -8
- data/lib/solargraph/rbs_map.rb +32 -13
- data/lib/solargraph/shell.rb +95 -72
- data/lib/solargraph/source/chain/array.rb +33 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +152 -69
- data/lib/solargraph/source/chain/constant.rb +15 -1
- data/lib/solargraph/source/chain/if.rb +23 -0
- data/lib/solargraph/source/chain/link.rb +17 -2
- data/lib/solargraph/source/chain/or.rb +2 -2
- data/lib/solargraph/source/chain/z_super.rb +3 -3
- data/lib/solargraph/source/chain.rb +85 -26
- data/lib/solargraph/source/change.rb +3 -0
- data/lib/solargraph/source/cursor.rb +16 -2
- data/lib/solargraph/source/source_chainer.rb +8 -5
- data/lib/solargraph/source/updater.rb +1 -0
- data/lib/solargraph/source.rb +120 -148
- data/lib/solargraph/source_map/clip.rb +16 -27
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map/mapper.rb +15 -3
- data/lib/solargraph/source_map.rb +48 -24
- data/lib/solargraph/type_checker/checks.rb +10 -2
- data/lib/solargraph/type_checker/rules.rb +6 -1
- data/lib/solargraph/type_checker.rb +150 -39
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +9 -6
- data/lib/solargraph/workspace.rb +30 -3
- data/lib/solargraph/yard_map/cache.rb +6 -0
- data/lib/solargraph/yard_map/helpers.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +16 -3
- data/lib/solargraph/yard_map/mapper.rb +1 -1
- data/lib/solargraph/yard_map/to_method.rb +11 -4
- data/lib/solargraph/yard_map.rb +1 -292
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +6 -4
- data/solargraph.gemspec +7 -6
- metadata +71 -82
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -50
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -55
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -153
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -317
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -33
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +0 -75
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -68
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -51
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -32
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -279
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -64
- data/lib/solargraph/parser/rubyvm/node_wrapper.rb +0 -47
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/rbs_map/core_signs.rb +0 -33
- data/lib/yard-solargraph.rb +0 -33
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
module NodeProcessors
|
7
7
|
class IvasgnNode < Parser::NodeProcessor::Base
|
8
|
-
include
|
8
|
+
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
11
|
loc = get_node_location(node)
|
@@ -2,14 +2,14 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
module NodeProcessors
|
7
7
|
class LvasgnNode < Parser::NodeProcessor::Base
|
8
|
-
include
|
8
|
+
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
|
-
|
12
|
-
presence = Range.new(
|
11
|
+
# variable not visible until next statement
|
12
|
+
presence = Range.new(get_node_end_position(node), region.closure.location.range.ending)
|
13
13
|
loc = get_node_location(node)
|
14
14
|
locals.push Solargraph::Pin::LocalVariable.new(
|
15
15
|
location: loc,
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Parser
|
5
|
+
module ParserGem
|
6
|
+
module NodeProcessors
|
7
|
+
class MasgnNode < Parser::NodeProcessor::Base
|
8
|
+
include ParserGem::NodeMethods
|
9
|
+
|
10
|
+
def process
|
11
|
+
# Example:
|
12
|
+
#
|
13
|
+
# s(:masgn,
|
14
|
+
# s(:mlhs,
|
15
|
+
# s(:send,
|
16
|
+
# s(:send, nil, :a), :b=),
|
17
|
+
# s(:lvasgn, :b),
|
18
|
+
# s(:ivasgn, :@c)),
|
19
|
+
# s(:array,
|
20
|
+
# s(:int, 1),
|
21
|
+
# s(:int, 2),
|
22
|
+
# s(:int, 3)))
|
23
|
+
masgn = node
|
24
|
+
mlhs = masgn.children.fetch(0)
|
25
|
+
lhs_arr = mlhs.children
|
26
|
+
mass_rhs = node.children.fetch(1)
|
27
|
+
|
28
|
+
# Get pins created for the mlhs node
|
29
|
+
process_children
|
30
|
+
|
31
|
+
lhs_arr.each_with_index do |lhs, i|
|
32
|
+
location = get_node_location(lhs)
|
33
|
+
pin = if lhs.type == :lvasgn
|
34
|
+
# lvasgn is a local variable
|
35
|
+
locals.find { |l| l.location == location }
|
36
|
+
else
|
37
|
+
# e.g., ivasgn is an instance variable, etc
|
38
|
+
pins.find { |iv| iv.location == location && iv.is_a?(Pin::BaseVariable) }
|
39
|
+
end
|
40
|
+
# @todo in line below, nothing in typechecking alerts
|
41
|
+
# when a non-existant method is called on 'l'
|
42
|
+
if pin.nil?
|
43
|
+
Solargraph.logger.debug { "Could not find local for masgn= value in location #{location.inspect} in #{lhs_arr} - masgn = #{masgn}, lhs.type = #{lhs.type}" }
|
44
|
+
next
|
45
|
+
end
|
46
|
+
pin.mass_assignment = [mass_rhs, i]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
module NodeProcessors
|
7
7
|
class ResbodyNode < Parser::NodeProcessor::Base
|
8
|
-
include
|
8
|
+
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
|
-
if node.children[1]
|
11
|
+
if node.children[1] # Exception local variable name
|
12
12
|
here = get_node_start_position(node.children[1])
|
13
13
|
presence = Range.new(here, region.closure.location.range.ending)
|
14
14
|
loc = get_node_location(node.children[1])
|
@@ -2,10 +2,10 @@
|
|
2
2
|
|
3
3
|
module Solargraph
|
4
4
|
module Parser
|
5
|
-
module
|
5
|
+
module ParserGem
|
6
6
|
module NodeProcessors
|
7
7
|
class SendNode < Parser::NodeProcessor::Base
|
8
|
-
include
|
8
|
+
include ParserGem::NodeMethods
|
9
9
|
|
10
10
|
def process
|
11
11
|
if node.children[0].nil?
|
@@ -80,7 +80,7 @@ module Solargraph
|
|
80
80
|
)
|
81
81
|
end
|
82
82
|
if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
|
83
|
-
|
83
|
+
method_pin = Solargraph::Pin::Method.new(
|
84
84
|
location: loc,
|
85
85
|
closure: clos,
|
86
86
|
name: "#{a.children[0]}=",
|
@@ -89,9 +89,10 @@ module Solargraph
|
|
89
89
|
visibility: region.visibility,
|
90
90
|
attribute: true
|
91
91
|
)
|
92
|
-
pins.
|
93
|
-
|
94
|
-
|
92
|
+
pins.push method_pin
|
93
|
+
method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
|
94
|
+
if method_pin.return_type.defined?
|
95
|
+
pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
|
95
96
|
end
|
96
97
|
end
|
97
98
|
end
|
@@ -112,6 +113,7 @@ module Solargraph
|
|
112
113
|
end
|
113
114
|
end
|
114
115
|
|
116
|
+
# @return [void]
|
115
117
|
def process_prepend
|
116
118
|
if node.children[2].is_a?(AST::Node) && node.children[2].type == :const
|
117
119
|
cp = region.closure
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'solargraph/parser/node_processor'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module Parser
|
7
|
+
module ParserGem
|
8
|
+
module NodeProcessors
|
9
|
+
autoload :BeginNode, 'solargraph/parser/parser_gem/node_processors/begin_node'
|
10
|
+
autoload :DefNode, 'solargraph/parser/parser_gem/node_processors/def_node'
|
11
|
+
autoload :DefsNode, 'solargraph/parser/parser_gem/node_processors/defs_node'
|
12
|
+
autoload :SendNode, 'solargraph/parser/parser_gem/node_processors/send_node'
|
13
|
+
autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
|
14
|
+
autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
|
15
|
+
autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
|
16
|
+
autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
|
17
|
+
autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
|
18
|
+
autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
|
19
|
+
autoload :CasgnNode, 'solargraph/parser/parser_gem/node_processors/casgn_node'
|
20
|
+
autoload :MasgnNode, 'solargraph/parser/parser_gem/node_processors/masgn_node'
|
21
|
+
autoload :AliasNode, 'solargraph/parser/parser_gem/node_processors/alias_node'
|
22
|
+
autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
|
23
|
+
autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
|
24
|
+
autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
|
25
|
+
autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
|
26
|
+
autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
module NodeProcessor
|
31
|
+
register :source, ParserGem::NodeProcessors::BeginNode
|
32
|
+
register :begin, ParserGem::NodeProcessors::BeginNode
|
33
|
+
register :kwbegin, ParserGem::NodeProcessors::BeginNode
|
34
|
+
register :rescue, ParserGem::NodeProcessors::BeginNode
|
35
|
+
register :resbody, ParserGem::NodeProcessors::ResbodyNode
|
36
|
+
register :def, ParserGem::NodeProcessors::DefNode
|
37
|
+
register :defs, ParserGem::NodeProcessors::DefsNode
|
38
|
+
register :send, ParserGem::NodeProcessors::SendNode
|
39
|
+
register :class, ParserGem::NodeProcessors::NamespaceNode
|
40
|
+
register :module, ParserGem::NodeProcessors::NamespaceNode
|
41
|
+
register :sclass, ParserGem::NodeProcessors::SclassNode
|
42
|
+
register :ivasgn, ParserGem::NodeProcessors::IvasgnNode
|
43
|
+
register :cvasgn, ParserGem::NodeProcessors::CvasgnNode
|
44
|
+
register :lvasgn, ParserGem::NodeProcessors::LvasgnNode
|
45
|
+
register :gvasgn, ParserGem::NodeProcessors::GvasgnNode
|
46
|
+
register :casgn, ParserGem::NodeProcessors::CasgnNode
|
47
|
+
register :masgn, ParserGem::NodeProcessors::MasgnNode
|
48
|
+
register :alias, ParserGem::NodeProcessors::AliasNode
|
49
|
+
register :args, ParserGem::NodeProcessors::ArgsNode
|
50
|
+
register :forward_args, ParserGem::NodeProcessors::ArgsNode
|
51
|
+
register :block, ParserGem::NodeProcessors::BlockNode
|
52
|
+
register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
|
53
|
+
register :sym, ParserGem::NodeProcessors::SymNode
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module Solargraph
|
2
|
+
module Parser
|
3
|
+
module ParserGem
|
4
|
+
autoload :FlawedBuilder, 'solargraph/parser/parser_gem/flawed_builder'
|
5
|
+
autoload :ClassMethods, 'solargraph/parser/parser_gem/class_methods'
|
6
|
+
autoload :NodeMethods, 'solargraph/parser/parser_gem/node_methods'
|
7
|
+
autoload :NodeChainer, 'solargraph/parser/parser_gem/node_chainer'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
require 'solargraph/parser/parser_gem/node_processors'
|
@@ -23,7 +23,7 @@ module Solargraph
|
|
23
23
|
|
24
24
|
# @param source [Source]
|
25
25
|
# @param namespace [String]
|
26
|
-
# @param scope [Symbol]
|
26
|
+
# @param scope [Symbol, nil]
|
27
27
|
# @param visibility [Symbol]
|
28
28
|
def initialize source: Solargraph::Source.load_string(''), closure: nil,
|
29
29
|
scope: nil, visibility: :public, lvars: []
|
data/lib/solargraph/parser.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
module Solargraph
|
2
2
|
module Parser
|
3
3
|
autoload :CommentRipper, 'solargraph/parser/comment_ripper'
|
4
|
-
autoload :
|
5
|
-
autoload :Rubyvm, 'solargraph/parser/rubyvm'
|
4
|
+
autoload :ParserGem, 'solargraph/parser/parser_gem'
|
6
5
|
autoload :Region, 'solargraph/parser/region'
|
7
6
|
autoload :NodeProcessor, 'solargraph/parser/node_processor'
|
8
7
|
autoload :Snippet, 'solargraph/parser/snippet'
|
@@ -10,17 +9,14 @@ module Solargraph
|
|
10
9
|
class SyntaxError < StandardError
|
11
10
|
end
|
12
11
|
|
13
|
-
#
|
14
|
-
|
15
|
-
def self.rubyvm?
|
16
|
-
# !!defined?(RubyVM::AbstractSyntaxTree)
|
17
|
-
false
|
18
|
-
end
|
12
|
+
# @deprecated
|
13
|
+
Legacy = ParserGem
|
19
14
|
|
20
|
-
|
21
|
-
#
|
22
|
-
|
15
|
+
ClassMethods = ParserGem::ClassMethods
|
16
|
+
# @todo should be able to just 'extend ClassMethods' here and
|
17
|
+
# typecheck things off it in strict mode
|
18
|
+
extend ParserGem::ClassMethods
|
23
19
|
|
24
|
-
NodeMethods =
|
20
|
+
NodeMethods = ParserGem::NodeMethods
|
25
21
|
end
|
26
22
|
end
|
data/lib/solargraph/pin/base.rb
CHANGED
@@ -15,6 +15,9 @@ module Solargraph
|
|
15
15
|
# @return [Solargraph::Location]
|
16
16
|
attr_reader :location
|
17
17
|
|
18
|
+
# @return [Solargraph::Location]
|
19
|
+
attr_reader :type_location
|
20
|
+
|
18
21
|
# @return [String]
|
19
22
|
attr_reader :name
|
20
23
|
|
@@ -25,12 +28,13 @@ module Solargraph
|
|
25
28
|
attr_accessor :source
|
26
29
|
|
27
30
|
# @param location [Solargraph::Location, nil]
|
28
|
-
# @param
|
31
|
+
# @param type_location [Solargraph::Location, nil]
|
29
32
|
# @param closure [Solargraph::Pin::Closure, nil]
|
30
33
|
# @param name [String]
|
31
34
|
# @param comments [String]
|
32
|
-
def initialize location: nil, closure: nil, name: '', comments: ''
|
35
|
+
def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
|
33
36
|
@location = location
|
37
|
+
@type_location = type_location
|
34
38
|
@closure = closure
|
35
39
|
@name = name
|
36
40
|
@comments = comments
|
@@ -41,6 +45,46 @@ module Solargraph
|
|
41
45
|
@comments ||= ''
|
42
46
|
end
|
43
47
|
|
48
|
+
# @param generics_to_resolve [Enumerable<String>]
|
49
|
+
# @param return_type_context [ComplexType, nil]
|
50
|
+
# @param context [ComplexType]
|
51
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
52
|
+
# @return [self]
|
53
|
+
def resolve_generics_from_context(generics_to_resolve, return_type_context = nil, resolved_generic_values: {})
|
54
|
+
proxy return_type.resolve_generics_from_context(generics_to_resolve,
|
55
|
+
return_type_context,
|
56
|
+
resolved_generic_values: resolved_generic_values)
|
57
|
+
end
|
58
|
+
|
59
|
+
# @yieldparam [ComplexType]
|
60
|
+
# @yieldreturn [ComplexType]
|
61
|
+
# @return [self]
|
62
|
+
def transform_types(&transform)
|
63
|
+
proxy return_type.transform(&transform)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Determine the concrete type for each of the generic type
|
67
|
+
# parameters used in this method based on the parameters passed
|
68
|
+
# into the its class and return a new method pin.
|
69
|
+
#
|
70
|
+
# @param definitions [Pin::Namespace] The module/class which uses generic types
|
71
|
+
# @param context_type [ComplexType] The receiver type
|
72
|
+
# @return [self]
|
73
|
+
def resolve_generics definitions, context_type
|
74
|
+
transform_types { |t| t.resolve_generics(definitions, context_type) if t }
|
75
|
+
end
|
76
|
+
|
77
|
+
def all_rooted?
|
78
|
+
!return_type || return_type.all_rooted?
|
79
|
+
end
|
80
|
+
|
81
|
+
# @param generics_to_erase [Enumerable<String>]
|
82
|
+
# @return [self]
|
83
|
+
def erase_generics(generics_to_erase)
|
84
|
+
return self if generics_to_erase.empty?
|
85
|
+
transform_types { |t| t.erase_generics(generics_to_erase) }
|
86
|
+
end
|
87
|
+
|
44
88
|
# @return [String, nil]
|
45
89
|
def filename
|
46
90
|
return nil if location.nil?
|
@@ -58,7 +102,7 @@ module Solargraph
|
|
58
102
|
end
|
59
103
|
|
60
104
|
def to_s
|
61
|
-
|
105
|
+
to_rbs
|
62
106
|
end
|
63
107
|
|
64
108
|
# @return [Boolean]
|
@@ -66,6 +110,11 @@ module Solargraph
|
|
66
110
|
false
|
67
111
|
end
|
68
112
|
|
113
|
+
# @return [Location, nil]
|
114
|
+
def best_location
|
115
|
+
location || type_location
|
116
|
+
end
|
117
|
+
|
69
118
|
# Pin equality is determined using the #nearly? method and also
|
70
119
|
# requiring both pins to have the same location.
|
71
120
|
#
|
@@ -103,13 +152,13 @@ module Solargraph
|
|
103
152
|
@docstring ||= Solargraph::Source.parse_docstring('').to_docstring
|
104
153
|
end
|
105
154
|
|
106
|
-
# @return [Array<YARD::Tags::Directive>]
|
155
|
+
# @return [::Array<YARD::Tags::Directive>]
|
107
156
|
def directives
|
108
157
|
parse_comments unless defined?(@directives)
|
109
158
|
@directives
|
110
159
|
end
|
111
160
|
|
112
|
-
# @return [Array<YARD::Tags::MacroDirective>]
|
161
|
+
# @return [::Array<YARD::Tags::MacroDirective>]
|
113
162
|
def macros
|
114
163
|
@macros ||= collect_macros
|
115
164
|
end
|
@@ -216,12 +265,31 @@ module Solargraph
|
|
216
265
|
result
|
217
266
|
end
|
218
267
|
|
268
|
+
# @return [String]
|
219
269
|
def identity
|
220
|
-
@identity ||= "#{closure.
|
270
|
+
@identity ||= "#{closure.path}|#{name}"
|
271
|
+
end
|
272
|
+
|
273
|
+
# @return [String, nil]
|
274
|
+
def to_rbs
|
275
|
+
return_type.to_rbs
|
276
|
+
end
|
277
|
+
|
278
|
+
# @return [String, nil]
|
279
|
+
def desc
|
280
|
+
if path
|
281
|
+
if to_rbs
|
282
|
+
path + ' ' + to_rbs
|
283
|
+
else
|
284
|
+
path
|
285
|
+
end
|
286
|
+
else
|
287
|
+
to_rbs
|
288
|
+
end
|
221
289
|
end
|
222
290
|
|
223
291
|
def inspect
|
224
|
-
"#<#{self.class} `#{self.
|
292
|
+
"#<#{self.class} `#{self.desc}` at #{self.location.inspect}>"
|
225
293
|
end
|
226
294
|
|
227
295
|
protected
|
@@ -266,8 +334,8 @@ module Solargraph
|
|
266
334
|
true
|
267
335
|
end
|
268
336
|
|
269
|
-
# @param dir1 [Array<YARD::Tags::Directive>]
|
270
|
-
# @param dir2 [Array<YARD::Tags::Directive>]
|
337
|
+
# @param dir1 [::Array<YARD::Tags::Directive>]
|
338
|
+
# @param dir2 [::Array<YARD::Tags::Directive>]
|
271
339
|
# @return [Boolean]
|
272
340
|
def compare_directives dir1, dir2
|
273
341
|
return false if dir1.length != dir2.length
|
@@ -288,7 +356,7 @@ module Solargraph
|
|
288
356
|
tag1.types == tag2.types
|
289
357
|
end
|
290
358
|
|
291
|
-
# @return [Array<YARD::Tags::Handlers::Directive>]
|
359
|
+
# @return [::Array<YARD::Tags::Handlers::Directive>]
|
292
360
|
def collect_macros
|
293
361
|
return [] unless maybe_directives?
|
294
362
|
parse = Solargraph::Source.parse_docstring(comments)
|
@@ -9,10 +9,14 @@ module Solargraph
|
|
9
9
|
# @return [Parser::AST::Node, nil]
|
10
10
|
attr_reader :assignment
|
11
11
|
|
12
|
+
attr_accessor :mass_assignment
|
13
|
+
|
12
14
|
# @param assignment [Parser::AST::Node, nil]
|
13
15
|
def initialize assignment: nil, **splat
|
14
16
|
super(**splat)
|
15
17
|
@assignment = assignment
|
18
|
+
# @type [nil, ::Array(Parser::AST::Node, Integer)]
|
19
|
+
@mass_assignment = nil
|
16
20
|
end
|
17
21
|
|
18
22
|
def completion_item_kind
|
@@ -36,10 +40,12 @@ module Solargraph
|
|
36
40
|
true
|
37
41
|
end
|
38
42
|
|
39
|
-
|
40
|
-
|
43
|
+
# @param parent_node [Parser::AST::Node]
|
44
|
+
# @param api_map [ApiMap]
|
45
|
+
# @return [::Array<ComplexType>]
|
46
|
+
def return_types_from_node(parent_node, api_map)
|
41
47
|
types = []
|
42
|
-
|
48
|
+
value_position_nodes_only(parent_node).each do |node|
|
43
49
|
# Nil nodes may not have a location
|
44
50
|
if node.nil? || node.type == :NIL || node.type == :nil
|
45
51
|
types.push ComplexType::NIL
|
@@ -50,13 +56,36 @@ module Solargraph
|
|
50
56
|
clip = api_map.clip_at(location.filename, pos)
|
51
57
|
# Use the return node for inference. The clip might infer from the
|
52
58
|
# first node in a method call instead of the entire call.
|
53
|
-
chain = Parser.chain(node, nil,
|
54
|
-
result = chain.infer(api_map, closure, clip.locals)
|
59
|
+
chain = Parser.chain(node, nil, nil)
|
60
|
+
result = chain.infer(api_map, closure, clip.locals).self_to_type(closure.context)
|
55
61
|
types.push result unless result.undefined?
|
56
62
|
end
|
57
63
|
end
|
58
|
-
|
59
|
-
|
64
|
+
types
|
65
|
+
end
|
66
|
+
|
67
|
+
# @param api_map [ApiMap]
|
68
|
+
# @return [ComplexType]
|
69
|
+
def probe api_map
|
70
|
+
unless @assignment.nil?
|
71
|
+
types = return_types_from_node(@assignment, api_map)
|
72
|
+
return ComplexType.new(types.uniq) unless types.empty?
|
73
|
+
end
|
74
|
+
|
75
|
+
unless @mass_assignment.nil?
|
76
|
+
mass_node, index = @mass_assignment
|
77
|
+
types = return_types_from_node(mass_node, api_map)
|
78
|
+
types.map! do |type|
|
79
|
+
if type.tuple?
|
80
|
+
type.all_params[index]
|
81
|
+
elsif ['::Array', '::Set', '::Enumerable'].include?(type.rooted_name)
|
82
|
+
type.all_params.first
|
83
|
+
end
|
84
|
+
end.compact!
|
85
|
+
return ComplexType.new(types.uniq) unless types.empty?
|
86
|
+
end
|
87
|
+
|
88
|
+
ComplexType::UNDEFINED
|
60
89
|
end
|
61
90
|
|
62
91
|
def == other
|
@@ -71,6 +100,10 @@ module Solargraph
|
|
71
100
|
true
|
72
101
|
end
|
73
102
|
|
103
|
+
def desc
|
104
|
+
"#{to_rbs} = #{assignment&.type.inspect}"
|
105
|
+
end
|
106
|
+
|
74
107
|
private
|
75
108
|
|
76
109
|
# @return [ComplexType]
|