solargraph 0.54.5 → 0.55.4
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/typecheck.yml +1 -1
- data/CHANGELOG.md +27 -0
- data/lib/solargraph/api_map/store.rb +9 -4
- data/lib/solargraph/api_map.rb +116 -39
- data/lib/solargraph/complex_type/type_methods.rb +1 -0
- data/lib/solargraph/complex_type/unique_type.rb +91 -9
- data/lib/solargraph/complex_type.rb +35 -6
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +60 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +100 -0
- data/lib/solargraph/convention/struct_definition.rb +101 -0
- data/lib/solargraph/convention.rb +1 -0
- data/lib/solargraph/doc_map.rb +83 -23
- data/lib/solargraph/gem_pins.rb +2 -1
- data/lib/solargraph/language_server/host/message_worker.rb +10 -7
- data/lib/solargraph/language_server/host.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +1 -0
- data/lib/solargraph/location.rb +8 -0
- data/lib/solargraph/logging.rb +1 -0
- data/lib/solargraph/parser/comment_ripper.rb +12 -6
- data/lib/solargraph/parser/flow_sensitive_typing.rb +227 -0
- data/lib/solargraph/parser/node_methods.rb +14 -0
- data/lib/solargraph/parser/node_processor.rb +3 -2
- data/lib/solargraph/parser/parser_gem/class_methods.rb +9 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
- data/lib/solargraph/parser/parser_gem/node_methods.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +23 -2
- data/lib/solargraph/parser/parser_gem/node_processors/cvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/def_node.rb +6 -3
- data/lib/solargraph/parser/parser_gem/node_processors/defs_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/gvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/ivasgn_node.rb +4 -2
- data/lib/solargraph/parser/parser_gem/node_processors/lvasgn_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +29 -6
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
- 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 -3
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +28 -16
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +29 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
- data/lib/solargraph/parser/region.rb +1 -1
- data/lib/solargraph/parser.rb +1 -0
- data/lib/solargraph/pin/base.rb +34 -5
- data/lib/solargraph/pin/base_variable.rb +7 -1
- data/lib/solargraph/pin/block.rb +2 -0
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +5 -3
- data/lib/solargraph/pin/closure.rb +6 -1
- data/lib/solargraph/pin/common.rb +5 -0
- data/lib/solargraph/pin/delegated_method.rb +20 -1
- data/lib/solargraph/pin/documenting.rb +16 -0
- data/lib/solargraph/pin/keyword.rb +7 -2
- data/lib/solargraph/pin/local_variable.rb +7 -1
- data/lib/solargraph/pin/method.rb +34 -27
- data/lib/solargraph/pin/namespace.rb +17 -9
- data/lib/solargraph/pin/parameter.rb +17 -5
- data/lib/solargraph/pin/proxy_type.rb +12 -6
- data/lib/solargraph/pin/reference/override.rb +10 -6
- data/lib/solargraph/pin/reference/require.rb +2 -2
- data/lib/solargraph/pin/signature.rb +4 -0
- data/lib/solargraph/pin/singleton.rb +1 -1
- data/lib/solargraph/pin/symbol.rb +3 -2
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +4 -1
- data/lib/solargraph/rbs_map/conversions.rb +172 -56
- data/lib/solargraph/rbs_map/core_fills.rb +32 -16
- data/lib/solargraph/rbs_map/core_map.rb +3 -2
- data/lib/solargraph/shell.rb +1 -0
- data/lib/solargraph/source/chain/array.rb +11 -7
- data/lib/solargraph/source/chain/block_symbol.rb +1 -1
- data/lib/solargraph/source/chain/block_variable.rb +1 -1
- data/lib/solargraph/source/chain/call.rb +53 -23
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +4 -3
- data/lib/solargraph/source/chain/head.rb +1 -1
- data/lib/solargraph/source/chain/if.rb +1 -1
- data/lib/solargraph/source/chain/link.rb +2 -0
- data/lib/solargraph/source/chain/literal.rb +22 -2
- data/lib/solargraph/source/chain/or.rb +1 -1
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +78 -48
- data/lib/solargraph/source/source_chainer.rb +2 -2
- data/lib/solargraph/source_map/clip.rb +3 -1
- data/lib/solargraph/source_map/mapper.rb +9 -5
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker.rb +35 -8
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +4 -2
- data/lib/solargraph/yard_map/mapper/to_method.rb +55 -15
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +4 -2
- data/lib/solargraph/yard_map/mapper.rb +4 -3
- data/lib/solargraph/yard_map/to_method.rb +4 -2
- data/lib/solargraph.rb +20 -0
- data/rbs/fills/tuple.rbs +150 -0
- metadata +15 -2
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'parser'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
module Parser
|
7
|
+
module ParserGem
|
8
|
+
module NodeProcessors
|
9
|
+
class OpasgnNode < Parser::NodeProcessor::Base
|
10
|
+
def process
|
11
|
+
# Parser::CurrentRuby.parse("a += 2")
|
12
|
+
# => s(:op_asgn,
|
13
|
+
# s(:lvasgn, :a), :+,
|
14
|
+
# s(:int, 2))
|
15
|
+
asgn = node.children[0]
|
16
|
+
variable_name = asgn.children[0]
|
17
|
+
operator = node.children[1]
|
18
|
+
argument = node.children[2]
|
19
|
+
# for lvasgn, gvasgn, cvasgn, convert to lvar, gvar, cvar
|
20
|
+
# [6] pry(main)> Parser::CurrentRuby.parse("a = a + 1")
|
21
|
+
# => s(:lvasgn, :a,
|
22
|
+
# s(:send,
|
23
|
+
# s(:lvar, :a), :+,
|
24
|
+
# s(:int, 1)))
|
25
|
+
# [7] pry(main)>
|
26
|
+
variable_reference_type = asgn.type.to_s.sub(/vasgn$/, 'var').to_sym
|
27
|
+
variable_reference = node.updated(variable_reference_type, asgn.children)
|
28
|
+
send_children = [
|
29
|
+
variable_reference,
|
30
|
+
operator,
|
31
|
+
argument
|
32
|
+
]
|
33
|
+
send_node = node.updated(:send, send_children)
|
34
|
+
new_asgn = node.updated(asgn.type, [variable_name, send_node])
|
35
|
+
NodeProcessor.process(new_asgn, region, pins, locals)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -24,7 +24,8 @@ module Solargraph
|
|
24
24
|
closure: region.closure,
|
25
25
|
name: node.children[1].children[0].to_s,
|
26
26
|
comments: "@type [#{types.join(',')}]",
|
27
|
-
presence: presence
|
27
|
+
presence: presence,
|
28
|
+
source: :parser
|
28
29
|
)
|
29
30
|
end
|
30
31
|
NodeProcessor.process(node.children[2], region, pins, locals)
|
@@ -17,7 +17,7 @@ module Solargraph
|
|
17
17
|
names.concat [NodeMethods.unpack_name(sclass.children[0]), sclass.children[1].to_s]
|
18
18
|
end
|
19
19
|
name = names.reject(&:empty?).join('::')
|
20
|
-
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
|
20
|
+
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
|
21
21
|
elsif sclass.is_a?(AST::Node) && sclass.type == :const
|
22
22
|
names = [region.closure.namespace, region.closure.name]
|
23
23
|
also = NodeMethods.unpack_name(sclass)
|
@@ -25,13 +25,14 @@ module Solargraph
|
|
25
25
|
names << also
|
26
26
|
end
|
27
27
|
name = names.reject(&:empty?).join('::')
|
28
|
-
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location)
|
28
|
+
closure = Solargraph::Pin::Namespace.new(name: name, location: region.closure.location, source: :parser)
|
29
29
|
else
|
30
30
|
return
|
31
31
|
end
|
32
32
|
pins.push Solargraph::Pin::Singleton.new(
|
33
33
|
location: get_node_location(node),
|
34
|
-
closure: closure
|
34
|
+
closure: closure,
|
35
|
+
source: :parser,
|
35
36
|
)
|
36
37
|
process_children region.update(visibility: :public, scope: :class, closure: pins.last)
|
37
38
|
end
|
@@ -34,7 +34,7 @@ module Solargraph
|
|
34
34
|
return if process_private_class_method
|
35
35
|
end
|
36
36
|
elsif node.children[1] == :require && node.children[0].to_s == '(const nil :Bundler)'
|
37
|
-
pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require')
|
37
|
+
pins.push Pin::Reference::Require.new(Solargraph::Location.new(region.filename, Solargraph::Range.from_to(0, 0, 0, 0)), 'bundler/require', source: :parser)
|
38
38
|
end
|
39
39
|
process_children
|
40
40
|
end
|
@@ -76,7 +76,8 @@ module Solargraph
|
|
76
76
|
comments: cmnt,
|
77
77
|
scope: region.scope || :instance,
|
78
78
|
visibility: region.visibility,
|
79
|
-
attribute: true
|
79
|
+
attribute: true,
|
80
|
+
source: :parser
|
80
81
|
)
|
81
82
|
end
|
82
83
|
if node.children[1] == :attr_writer || node.children[1] == :attr_accessor
|
@@ -87,10 +88,11 @@ module Solargraph
|
|
87
88
|
comments: cmnt,
|
88
89
|
scope: region.scope || :instance,
|
89
90
|
visibility: region.visibility,
|
90
|
-
attribute: true
|
91
|
+
attribute: true,
|
92
|
+
source: :parser
|
91
93
|
)
|
92
94
|
pins.push method_pin
|
93
|
-
method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last)
|
95
|
+
method_pin.parameters.push Pin::Parameter.new(name: 'value', decl: :arg, closure: pins.last, source: :parser)
|
94
96
|
if method_pin.return_type.defined?
|
95
97
|
pins.last.docstring.add_tag YARD::Tags::Tag.new(:param, '', pins.last.return_type.items.map(&:rooted_tags), 'value')
|
96
98
|
end
|
@@ -107,7 +109,8 @@ module Solargraph
|
|
107
109
|
pins.push type.new(
|
108
110
|
location: get_node_location(i),
|
109
111
|
closure: cp,
|
110
|
-
name: unpack_name(i)
|
112
|
+
name: unpack_name(i),
|
113
|
+
source: :parser
|
111
114
|
)
|
112
115
|
end
|
113
116
|
end
|
@@ -121,7 +124,8 @@ module Solargraph
|
|
121
124
|
pins.push Pin::Reference::Prepend.new(
|
122
125
|
location: get_node_location(i),
|
123
126
|
closure: cp,
|
124
|
-
name: unpack_name(i)
|
127
|
+
name: unpack_name(i),
|
128
|
+
source: :parser
|
125
129
|
)
|
126
130
|
end
|
127
131
|
end
|
@@ -135,13 +139,15 @@ module Solargraph
|
|
135
139
|
pins.push Pin::Reference::Extend.new(
|
136
140
|
location: loc,
|
137
141
|
closure: region.closure,
|
138
|
-
name: region.closure.full_context.namespace
|
142
|
+
name: region.closure.full_context.namespace,
|
143
|
+
source: :parser
|
139
144
|
)
|
140
145
|
else
|
141
146
|
pins.push Pin::Reference::Extend.new(
|
142
147
|
location: loc,
|
143
148
|
closure: region.closure,
|
144
|
-
name: unpack_name(i)
|
149
|
+
name: unpack_name(i),
|
150
|
+
source: :parser
|
145
151
|
)
|
146
152
|
end
|
147
153
|
end
|
@@ -151,7 +157,7 @@ module Solargraph
|
|
151
157
|
def process_require
|
152
158
|
if node.children[2].is_a?(AST::Node) && node.children[2].type == :str
|
153
159
|
path = node.children[2].children[0].to_s
|
154
|
-
pins.push Pin::Reference::Require.new(get_node_location(node), path)
|
160
|
+
pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
|
155
161
|
end
|
156
162
|
end
|
157
163
|
|
@@ -159,7 +165,7 @@ module Solargraph
|
|
159
165
|
def process_autoload
|
160
166
|
if node.children[3].is_a?(AST::Node) && node.children[3].type == :str
|
161
167
|
path = node.children[3].children[0].to_s
|
162
|
-
pins.push Pin::Reference::Require.new(get_node_location(node), path)
|
168
|
+
pins.push Pin::Reference::Require.new(get_node_location(node), path, source: :parser)
|
163
169
|
end
|
164
170
|
end
|
165
171
|
|
@@ -171,7 +177,8 @@ module Solargraph
|
|
171
177
|
elsif node.children[2].type == :sym || node.children[2].type == :str
|
172
178
|
node.children[2..-1].each do |x|
|
173
179
|
cn = x.children[0].to_s
|
174
|
-
|
180
|
+
# @type [Pin::Method]
|
181
|
+
ref = pins.find { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }
|
175
182
|
unless ref.nil?
|
176
183
|
pins.delete ref
|
177
184
|
mm = Solargraph::Pin::Method.new(
|
@@ -182,7 +189,8 @@ module Solargraph
|
|
182
189
|
comments: ref.comments,
|
183
190
|
scope: :class,
|
184
191
|
visibility: :public,
|
185
|
-
node: ref.node
|
192
|
+
node: ref.node,
|
193
|
+
source: :parser
|
186
194
|
)
|
187
195
|
cm = Solargraph::Pin::Method.new(
|
188
196
|
location: ref.location,
|
@@ -192,7 +200,8 @@ module Solargraph
|
|
192
200
|
comments: ref.comments,
|
193
201
|
scope: :instance,
|
194
202
|
visibility: :private,
|
195
|
-
node: ref.node
|
203
|
+
node: ref.node,
|
204
|
+
source: :parser)
|
196
205
|
pins.push mm, cm
|
197
206
|
pins.select{|pin| pin.is_a?(Pin::InstanceVariable) && pin.closure.path == ref.path}.each do |ivar|
|
198
207
|
pins.delete ivar
|
@@ -201,14 +210,16 @@ module Solargraph
|
|
201
210
|
closure: cm,
|
202
211
|
name: ivar.name,
|
203
212
|
comments: ivar.comments,
|
204
|
-
assignment: ivar.assignment
|
213
|
+
assignment: ivar.assignment,
|
214
|
+
source: :parser
|
205
215
|
)
|
206
216
|
pins.push Solargraph::Pin::InstanceVariable.new(
|
207
217
|
location: ivar.location,
|
208
218
|
closure: mm,
|
209
219
|
name: ivar.name,
|
210
220
|
comments: ivar.comments,
|
211
|
-
assignment: ivar.assignment
|
221
|
+
assignment: ivar.assignment,
|
222
|
+
source: :parser
|
212
223
|
)
|
213
224
|
end
|
214
225
|
end
|
@@ -236,7 +247,8 @@ module Solargraph
|
|
236
247
|
closure: region.closure,
|
237
248
|
name: node.children[2].children[0].to_s,
|
238
249
|
original: node.children[3].children[0].to_s,
|
239
|
-
scope: region.scope || :instance
|
250
|
+
scope: region.scope || :instance,
|
251
|
+
source: :parser
|
240
252
|
)
|
241
253
|
end
|
242
254
|
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Parser
|
5
|
+
module ParserGem
|
6
|
+
module NodeProcessors
|
7
|
+
class UntilNode < Parser::NodeProcessor::Base
|
8
|
+
include ParserGem::NodeMethods
|
9
|
+
|
10
|
+
def process
|
11
|
+
location = get_node_location(node)
|
12
|
+
# Note - this should not be considered a block, as the
|
13
|
+
# until statement doesn't create a closure - e.g.,
|
14
|
+
# variables created inside can be seen from outside as
|
15
|
+
# well
|
16
|
+
pins.push Solargraph::Pin::Until.new(
|
17
|
+
location: location,
|
18
|
+
closure: region.closure,
|
19
|
+
node: node,
|
20
|
+
comments: comments_for(node),
|
21
|
+
source: :parser,
|
22
|
+
)
|
23
|
+
process_children region
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Solargraph
|
4
|
+
module Parser
|
5
|
+
module ParserGem
|
6
|
+
module NodeProcessors
|
7
|
+
class WhileNode < Parser::NodeProcessor::Base
|
8
|
+
include ParserGem::NodeMethods
|
9
|
+
|
10
|
+
def process
|
11
|
+
location = get_node_location(node)
|
12
|
+
# Note - this should not be considered a block, as the
|
13
|
+
# while statement doesn't create a closure - e.g.,
|
14
|
+
# variables created inside can be seen from outside as
|
15
|
+
# well
|
16
|
+
pins.push Solargraph::Pin::While.new(
|
17
|
+
location: location,
|
18
|
+
closure: region.closure,
|
19
|
+
node: node,
|
20
|
+
comments: comments_for(node),
|
21
|
+
source: :parser,
|
22
|
+
)
|
23
|
+
process_children region
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -13,6 +13,7 @@ module Solargraph
|
|
13
13
|
autoload :NamespaceNode, 'solargraph/parser/parser_gem/node_processors/namespace_node'
|
14
14
|
autoload :SclassNode, 'solargraph/parser/parser_gem/node_processors/sclass_node'
|
15
15
|
autoload :IvasgnNode, 'solargraph/parser/parser_gem/node_processors/ivasgn_node'
|
16
|
+
autoload :IfNode, 'solargraph/parser/parser_gem/node_processors/if_node'
|
16
17
|
autoload :CvasgnNode, 'solargraph/parser/parser_gem/node_processors/cvasgn_node'
|
17
18
|
autoload :LvasgnNode, 'solargraph/parser/parser_gem/node_processors/lvasgn_node'
|
18
19
|
autoload :GvasgnNode, 'solargraph/parser/parser_gem/node_processors/gvasgn_node'
|
@@ -22,8 +23,12 @@ module Solargraph
|
|
22
23
|
autoload :ArgsNode, 'solargraph/parser/parser_gem/node_processors/args_node'
|
23
24
|
autoload :BlockNode, 'solargraph/parser/parser_gem/node_processors/block_node'
|
24
25
|
autoload :OrasgnNode, 'solargraph/parser/parser_gem/node_processors/orasgn_node'
|
26
|
+
autoload :OpasgnNode, 'solargraph/parser/parser_gem/node_processors/opasgn_node'
|
25
27
|
autoload :SymNode, 'solargraph/parser/parser_gem/node_processors/sym_node'
|
26
28
|
autoload :ResbodyNode, 'solargraph/parser/parser_gem/node_processors/resbody_node'
|
29
|
+
autoload :UntilNode, 'solargraph/parser/parser_gem/node_processors/until_node'
|
30
|
+
autoload :WhileNode, 'solargraph/parser/parser_gem/node_processors/while_node'
|
31
|
+
autoload :AndNode, 'solargraph/parser/parser_gem/node_processors/and_node'
|
27
32
|
end
|
28
33
|
end
|
29
34
|
|
@@ -35,6 +40,7 @@ module Solargraph
|
|
35
40
|
register :resbody, ParserGem::NodeProcessors::ResbodyNode
|
36
41
|
register :def, ParserGem::NodeProcessors::DefNode
|
37
42
|
register :defs, ParserGem::NodeProcessors::DefsNode
|
43
|
+
register :if, ParserGem::NodeProcessors::IfNode
|
38
44
|
register :send, ParserGem::NodeProcessors::SendNode
|
39
45
|
register :class, ParserGem::NodeProcessors::NamespaceNode
|
40
46
|
register :module, ParserGem::NodeProcessors::NamespaceNode
|
@@ -50,7 +56,11 @@ module Solargraph
|
|
50
56
|
register :forward_args, ParserGem::NodeProcessors::ArgsNode
|
51
57
|
register :block, ParserGem::NodeProcessors::BlockNode
|
52
58
|
register :or_asgn, ParserGem::NodeProcessors::OrasgnNode
|
59
|
+
register :op_asgn, ParserGem::NodeProcessors::OpasgnNode
|
53
60
|
register :sym, ParserGem::NodeProcessors::SymNode
|
61
|
+
register :until, ParserGem::NodeProcessors::UntilNode
|
62
|
+
register :while, ParserGem::NodeProcessors::WhileNode
|
63
|
+
register :and, ParserGem::NodeProcessors::AndNode
|
54
64
|
end
|
55
65
|
end
|
56
66
|
end
|
@@ -29,7 +29,7 @@ module Solargraph
|
|
29
29
|
scope: nil, visibility: :public, lvars: []
|
30
30
|
@source = source
|
31
31
|
# @closure = closure
|
32
|
-
@closure = closure || Pin::Namespace.new(name: '', location: source.location)
|
32
|
+
@closure = closure || Pin::Namespace.new(name: '', location: source.location, source: :parser)
|
33
33
|
@scope = scope
|
34
34
|
@visibility = visibility
|
35
35
|
@lvars = lvars
|
data/lib/solargraph/parser.rb
CHANGED
@@ -4,6 +4,7 @@ module Solargraph
|
|
4
4
|
autoload :ParserGem, 'solargraph/parser/parser_gem'
|
5
5
|
autoload :Region, 'solargraph/parser/region'
|
6
6
|
autoload :NodeProcessor, 'solargraph/parser/node_processor'
|
7
|
+
autoload :FlowSensitiveTyping, 'solargraph/parser/flow_sensitive_typing'
|
7
8
|
autoload :Snippet, 'solargraph/parser/snippet'
|
8
9
|
|
9
10
|
class SyntaxError < StandardError
|
data/lib/solargraph/pin/base.rb
CHANGED
@@ -27,17 +27,27 @@ module Solargraph
|
|
27
27
|
# @return [::Symbol]
|
28
28
|
attr_accessor :source
|
29
29
|
|
30
|
+
def presence_certain?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
30
34
|
# @param location [Solargraph::Location, nil]
|
31
35
|
# @param type_location [Solargraph::Location, nil]
|
32
36
|
# @param closure [Solargraph::Pin::Closure, nil]
|
33
37
|
# @param name [String]
|
34
38
|
# @param comments [String]
|
35
|
-
def initialize location: nil, type_location: nil, closure: nil, name: '', comments: ''
|
39
|
+
def initialize location: nil, type_location: nil, closure: nil, source: nil, name: '', comments: ''
|
36
40
|
@location = location
|
37
41
|
@type_location = type_location
|
38
42
|
@closure = closure
|
39
43
|
@name = name
|
40
44
|
@comments = comments
|
45
|
+
@source = source
|
46
|
+
assert_source_provided
|
47
|
+
end
|
48
|
+
|
49
|
+
def assert_source_provided
|
50
|
+
Solargraph.assert_or_log(:source, "source not provided - #{@path} #{@source} #{self.class}") if source.nil?
|
41
51
|
end
|
42
52
|
|
43
53
|
# @return [String]
|
@@ -268,7 +278,7 @@ module Solargraph
|
|
268
278
|
# @deprecated
|
269
279
|
# @return [String]
|
270
280
|
def identity
|
271
|
-
@identity ||= "#{closure&.path}|#{name}"
|
281
|
+
@identity ||= "#{closure&.path}|#{name}|#{location}"
|
272
282
|
end
|
273
283
|
|
274
284
|
# @return [String, nil]
|
@@ -293,14 +303,33 @@ module Solargraph
|
|
293
303
|
end
|
294
304
|
|
295
305
|
# @return [String]
|
296
|
-
def
|
306
|
+
def inner_desc
|
297
307
|
closure_info = closure&.desc
|
298
308
|
binder_info = binder&.desc
|
299
|
-
"
|
309
|
+
"name=#{name.inspect} return_type=#{type_desc}, context=#{context.rooted_tags}, closure=#{closure_info}, binder=#{binder_info}"
|
310
|
+
end
|
311
|
+
|
312
|
+
def desc
|
313
|
+
"[#{inner_desc}]"
|
300
314
|
end
|
301
315
|
|
302
316
|
def inspect
|
303
|
-
"#<#{self.class} `#{self.
|
317
|
+
"#<#{self.class} `#{self.inner_desc}`#{all_location_text} via #{source.inspect}>"
|
318
|
+
end
|
319
|
+
|
320
|
+
def all_location_text
|
321
|
+
if location.nil? && type_location.nil?
|
322
|
+
''
|
323
|
+
elsif !location.nil? && type_location.nil?
|
324
|
+
" at #{location.inspect})"
|
325
|
+
elsif !type_location.nil? && location.nil?
|
326
|
+
" at #{type_location.inspect})"
|
327
|
+
else
|
328
|
+
" at (#{location.inspect} and #{type_location.inspect})"
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
def reset_generated!
|
304
333
|
end
|
305
334
|
|
306
335
|
protected
|
@@ -11,12 +11,14 @@ module Solargraph
|
|
11
11
|
|
12
12
|
attr_accessor :mass_assignment
|
13
13
|
|
14
|
+
# @param return_type [ComplexType, nil]
|
14
15
|
# @param assignment [Parser::AST::Node, nil]
|
15
|
-
def initialize assignment: nil, **splat
|
16
|
+
def initialize assignment: nil, return_type: nil, **splat
|
16
17
|
super(**splat)
|
17
18
|
@assignment = assignment
|
18
19
|
# @type [nil, ::Array(Parser::AST::Node, Integer)]
|
19
20
|
@mass_assignment = nil
|
21
|
+
@return_type = return_type
|
20
22
|
end
|
21
23
|
|
22
24
|
def completion_item_kind
|
@@ -32,7 +34,10 @@ module Solargraph
|
|
32
34
|
@return_type ||= generate_complex_type
|
33
35
|
end
|
34
36
|
|
37
|
+
# @sg-ignore
|
35
38
|
def nil_assignment?
|
39
|
+
# this will always be false - should it be return_type ==
|
40
|
+
# ComplexType::NIL or somesuch?
|
36
41
|
return_type.nil?
|
37
42
|
end
|
38
43
|
|
@@ -88,6 +93,7 @@ module Solargraph
|
|
88
93
|
ComplexType::UNDEFINED
|
89
94
|
end
|
90
95
|
|
96
|
+
# @param other [Object]
|
91
97
|
def == other
|
92
98
|
return false unless super
|
93
99
|
assignment == other.assignment
|
data/lib/solargraph/pin/block.rb
CHANGED
@@ -6,7 +6,7 @@ module Solargraph
|
|
6
6
|
# @return [Signature]
|
7
7
|
attr_reader :block
|
8
8
|
|
9
|
-
|
9
|
+
attr_accessor :parameters
|
10
10
|
|
11
11
|
# @return [ComplexType, nil]
|
12
12
|
attr_reader :return_type
|
@@ -21,6 +21,10 @@ module Solargraph
|
|
21
21
|
@parameters = parameters
|
22
22
|
end
|
23
23
|
|
24
|
+
def method_namespace
|
25
|
+
closure.namespace
|
26
|
+
end
|
27
|
+
|
24
28
|
# @return [::Array<String>]
|
25
29
|
def parameter_names
|
26
30
|
@parameter_names ||= parameters.map(&:name)
|
@@ -140,8 +144,6 @@ module Solargraph
|
|
140
144
|
protected
|
141
145
|
|
142
146
|
attr_writer :block
|
143
|
-
|
144
|
-
attr_writer :parameters
|
145
147
|
end
|
146
148
|
end
|
147
149
|
end
|
@@ -8,10 +8,15 @@ module Solargraph
|
|
8
8
|
|
9
9
|
# @param scope [::Symbol] :class or :instance
|
10
10
|
# @param generics [::Array<Pin::Parameter>, nil]
|
11
|
-
def initialize scope: :class, generics: nil, **splat
|
11
|
+
def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
|
12
12
|
super(**splat)
|
13
13
|
@scope = scope
|
14
14
|
@generics = generics
|
15
|
+
@generic_defaults = generic_defaults
|
16
|
+
end
|
17
|
+
|
18
|
+
def generic_defaults
|
19
|
+
@generic_defaults ||= {}
|
15
20
|
end
|
16
21
|
|
17
22
|
def context
|
@@ -9,6 +9,11 @@ module Solargraph
|
|
9
9
|
# @return [Pin::Closure, nil]
|
10
10
|
attr_reader :closure
|
11
11
|
|
12
|
+
def closure
|
13
|
+
Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
|
14
|
+
@closure
|
15
|
+
end
|
16
|
+
|
12
17
|
# @return [String]
|
13
18
|
def name
|
14
19
|
@name ||= ''
|
@@ -24,8 +24,26 @@ module Solargraph
|
|
24
24
|
@receiver_method_name = receiver_method_name
|
25
25
|
end
|
26
26
|
|
27
|
-
|
27
|
+
def inner_desc
|
28
|
+
"#{name} => #{@receiver_chain}##{@receiver_method_name}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def location
|
32
|
+
return super if super
|
33
|
+
|
34
|
+
@resolved_method&.send(:location)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def type_location
|
39
|
+
return super if super
|
40
|
+
|
41
|
+
@resolved_method&.send(:type_location)
|
42
|
+
end
|
43
|
+
|
44
|
+
%i[comments parameters return_type signatures].each do |method|
|
28
45
|
define_method(method) do
|
46
|
+
# @sg-ignore Need to set context correctly in define_method blocks
|
29
47
|
@resolved_method ? @resolved_method.send(method) : super()
|
30
48
|
end
|
31
49
|
end
|
@@ -34,6 +52,7 @@ module Solargraph
|
|
34
52
|
# @param api_map [ApiMap]
|
35
53
|
define_method(method) do |api_map|
|
36
54
|
resolve_method(api_map)
|
55
|
+
# @sg-ignore Need to set context correctly in define_method blocks
|
37
56
|
@resolved_method ? @resolved_method.send(method, api_map) : super(api_map)
|
38
57
|
end
|
39
58
|
end
|
@@ -9,6 +9,22 @@ require 'solargraph/converters/dt'
|
|
9
9
|
require 'solargraph/converters/dd'
|
10
10
|
require 'solargraph/converters/misc'
|
11
11
|
|
12
|
+
# @todo upstream this definition
|
13
|
+
|
14
|
+
# @!parse
|
15
|
+
# module ::Kramdown
|
16
|
+
# class Document
|
17
|
+
# # @return [String]
|
18
|
+
# def to_html; end
|
19
|
+
# end
|
20
|
+
# end
|
21
|
+
# module ReverseMarkdown
|
22
|
+
# # @param input [String]
|
23
|
+
# # @param options [Hash]
|
24
|
+
# # @return [String]
|
25
|
+
# def self.convert(input, options = {}); end
|
26
|
+
# end
|
27
|
+
|
12
28
|
module Solargraph
|
13
29
|
module Pin
|
14
30
|
# A module to add the Pin::Base#documentation method.
|
@@ -3,8 +3,13 @@
|
|
3
3
|
module Solargraph
|
4
4
|
module Pin
|
5
5
|
class Keyword < Base
|
6
|
-
def initialize
|
7
|
-
|
6
|
+
def initialize(name, **kwargs)
|
7
|
+
# @sg-ignore "Unrecognized keyword argument kwargs to Solargraph::Pin::Base#initialize"
|
8
|
+
super(name: name, **kwargs)
|
9
|
+
end
|
10
|
+
|
11
|
+
def closure
|
12
|
+
@closure ||= Pin::ROOT_PIN
|
8
13
|
end
|
9
14
|
|
10
15
|
def name
|
@@ -6,13 +6,19 @@ module Solargraph
|
|
6
6
|
# @return [Range]
|
7
7
|
attr_reader :presence
|
8
8
|
|
9
|
+
def presence_certain?
|
10
|
+
@presence_certain
|
11
|
+
end
|
12
|
+
|
9
13
|
# @param assignment [AST::Node, nil]
|
10
14
|
# @param presence [Range, nil]
|
15
|
+
# @param presence_certain [Boolean]
|
11
16
|
# @param splat [Hash]
|
12
|
-
def initialize assignment: nil, presence: nil, **splat
|
17
|
+
def initialize assignment: nil, presence: nil, presence_certain: false, **splat
|
13
18
|
super(**splat)
|
14
19
|
@assignment = assignment
|
15
20
|
@presence = presence
|
21
|
+
@presence_certain = presence_certain
|
16
22
|
end
|
17
23
|
|
18
24
|
# @param pin [self]
|