solargraph 0.54.0 → 0.55.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/CHANGELOG.md +58 -0
- data/lib/solargraph/api_map/cache.rb +10 -1
- data/lib/solargraph/api_map/index.rb +167 -0
- data/lib/solargraph/api_map/store.rb +75 -122
- data/lib/solargraph/api_map.rb +109 -41
- data/lib/solargraph/bench.rb +17 -1
- data/lib/solargraph/complex_type/type_methods.rb +17 -11
- data/lib/solargraph/complex_type/unique_type.rb +181 -17
- data/lib/solargraph/complex_type.rb +103 -24
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +51 -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 +2 -0
- data/lib/solargraph/doc_map.rb +43 -18
- data/lib/solargraph/equality.rb +33 -0
- data/lib/solargraph/language_server/host/message_worker.rb +51 -5
- data/lib/solargraph/language_server/host.rb +13 -11
- data/lib/solargraph/language_server/message/base.rb +19 -12
- data/lib/solargraph/language_server/message/initialize.rb +3 -1
- 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 +4 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +3 -3
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
- data/lib/solargraph/language_server/progress.rb +19 -2
- data/lib/solargraph/library.rb +31 -41
- data/lib/solargraph/location.rb +29 -1
- data/lib/solargraph/parser/comment_ripper.rb +11 -6
- data/lib/solargraph/parser/flow_sensitive_typing.rb +226 -0
- data/lib/solargraph/parser/node_methods.rb +15 -1
- data/lib/solargraph/parser/parser_gem/class_methods.rb +11 -6
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +10 -10
- data/lib/solargraph/parser/parser_gem/node_methods.rb +6 -4
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +23 -19
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +21 -1
- data/lib/solargraph/parser/parser_gem/node_processors/if_node.rb +21 -0
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +8 -2
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +26 -5
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +41 -0
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/until_node.rb +28 -0
- data/lib/solargraph/parser/parser_gem/node_processors/while_node.rb +28 -0
- data/lib/solargraph/parser/parser_gem/node_processors.rb +10 -0
- data/lib/solargraph/parser.rb +3 -5
- data/lib/solargraph/pin/base.rb +47 -17
- data/lib/solargraph/pin/base_variable.rb +11 -4
- data/lib/solargraph/pin/block.rb +8 -26
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +147 -0
- data/lib/solargraph/pin/closure.rb +8 -3
- data/lib/solargraph/pin/common.rb +2 -6
- data/lib/solargraph/pin/conversions.rb +3 -2
- data/lib/solargraph/pin/instance_variable.rb +2 -2
- data/lib/solargraph/pin/local_variable.rb +7 -1
- data/lib/solargraph/pin/method.rb +76 -48
- data/lib/solargraph/pin/namespace.rb +14 -11
- data/lib/solargraph/pin/parameter.rb +24 -17
- data/lib/solargraph/pin/proxy_type.rb +13 -7
- data/lib/solargraph/pin/signature.rb +3 -129
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +7 -1
- data/lib/solargraph/position.rb +7 -0
- data/lib/solargraph/range.rb +9 -4
- data/lib/solargraph/rbs_map/conversions.rb +84 -45
- data/lib/solargraph/rbs_map/core_fills.rb +16 -9
- data/lib/solargraph/rbs_map.rb +1 -0
- data/lib/solargraph/shell.rb +19 -2
- data/lib/solargraph/source/chain/array.rb +10 -8
- 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 +125 -61
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/hash.rb +8 -2
- data/lib/solargraph/source/chain/if.rb +5 -0
- data/lib/solargraph/source/chain/link.rb +28 -5
- data/lib/solargraph/source/chain/literal.rb +27 -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 +131 -63
- data/lib/solargraph/source/cursor.rb +3 -2
- data/lib/solargraph/source/source_chainer.rb +2 -2
- data/lib/solargraph/source.rb +104 -86
- data/lib/solargraph/source_map/clip.rb +8 -6
- data/lib/solargraph/source_map/data.rb +30 -0
- data/lib/solargraph/source_map.rb +28 -16
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker/rules.rb +6 -1
- data/lib/solargraph/type_checker.rb +48 -21
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +7 -3
- data/lib/solargraph/workspace.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +1 -0
- data/lib/solargraph/yard_map/mapper/to_method.rb +42 -15
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +1 -0
- data/lib/solargraph/yard_map/mapper.rb +1 -0
- data/lib/solargraph/yardoc.rb +1 -1
- data/lib/solargraph.rb +1 -0
- data/solargraph.gemspec +5 -5
- metadata +41 -25
|
@@ -14,21 +14,23 @@ module Solargraph
|
|
|
14
14
|
# @param type [::Symbol] :class or :module
|
|
15
15
|
# @param visibility [::Symbol] :public or :private
|
|
16
16
|
# @param gates [::Array<String>]
|
|
17
|
-
|
|
17
|
+
# @param name [String]
|
|
18
|
+
def initialize type: :class, visibility: :public, gates: [''], name: '', **splat
|
|
18
19
|
# super(location, namespace, name, comments)
|
|
19
|
-
super(**splat)
|
|
20
|
+
super(**splat, name: name)
|
|
20
21
|
@type = type
|
|
21
22
|
@visibility = visibility
|
|
22
23
|
if name.start_with?('::')
|
|
23
|
-
@
|
|
24
|
+
# @type [String]
|
|
25
|
+
name = name[2..-1] || ''
|
|
24
26
|
@closure = Solargraph::Pin::ROOT_PIN
|
|
25
27
|
end
|
|
26
28
|
@open_gates = gates
|
|
27
|
-
if
|
|
29
|
+
if name.include?('::')
|
|
28
30
|
# In this case, a chained namespace was opened (e.g., Foo::Bar)
|
|
29
31
|
# but Foo does not exist.
|
|
30
|
-
parts =
|
|
31
|
-
|
|
32
|
+
parts = name.split('::')
|
|
33
|
+
name = parts.pop
|
|
32
34
|
closure_name = if [Solargraph::Pin::ROOT_PIN, nil].include?(closure)
|
|
33
35
|
''
|
|
34
36
|
else
|
|
@@ -38,17 +40,18 @@ module Solargraph
|
|
|
38
40
|
@closure = Pin::Namespace.new(name: closure_name, gates: [parts.join('::')])
|
|
39
41
|
@context = nil
|
|
40
42
|
end
|
|
43
|
+
@name = name
|
|
41
44
|
end
|
|
42
45
|
|
|
43
46
|
def to_rbs
|
|
44
|
-
"#{@type.to_s} #{
|
|
47
|
+
"#{@type.to_s} #{return_type.all_params.first.to_rbs}#{rbs_generics}".strip
|
|
45
48
|
end
|
|
46
49
|
|
|
47
50
|
def desc
|
|
48
|
-
if name.nil?
|
|
51
|
+
if name.nil? || name.empty?
|
|
49
52
|
'(top-level)'
|
|
50
53
|
else
|
|
51
|
-
|
|
54
|
+
super
|
|
52
55
|
end
|
|
53
56
|
end
|
|
54
57
|
|
|
@@ -57,7 +60,7 @@ module Solargraph
|
|
|
57
60
|
end
|
|
58
61
|
|
|
59
62
|
def full_context
|
|
60
|
-
@full_context ||= ComplexType.try_parse("
|
|
63
|
+
@full_context ||= ComplexType.try_parse("::#{type.to_s.capitalize}<#{path}>")
|
|
61
64
|
end
|
|
62
65
|
|
|
63
66
|
def binder
|
|
@@ -83,7 +86,7 @@ module Solargraph
|
|
|
83
86
|
end
|
|
84
87
|
|
|
85
88
|
def return_type
|
|
86
|
-
@return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "
|
|
89
|
+
@return_type ||= ComplexType.try_parse( (type == :class ? '::Class' : '::Module') + "<::#{path}>")
|
|
87
90
|
end
|
|
88
91
|
|
|
89
92
|
# @return [Array<String>]
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
module Solargraph
|
|
4
4
|
module Pin
|
|
5
5
|
class Parameter < LocalVariable
|
|
6
|
-
# @return [Symbol]
|
|
6
|
+
# @return [::Symbol]
|
|
7
7
|
attr_reader :decl
|
|
8
8
|
|
|
9
9
|
# @return [String]
|
|
@@ -11,12 +11,10 @@ module Solargraph
|
|
|
11
11
|
|
|
12
12
|
# @param decl [::Symbol] :arg, :optarg, :kwarg, :kwoptarg, :restarg, :kwrestarg, :block, :blockarg
|
|
13
13
|
# @param asgn_code [String, nil]
|
|
14
|
-
|
|
15
|
-
def initialize decl: :arg, asgn_code: nil, return_type: nil, **splat
|
|
14
|
+
def initialize decl: :arg, asgn_code: nil, **splat
|
|
16
15
|
super(**splat)
|
|
17
16
|
@asgn_code = asgn_code
|
|
18
17
|
@decl = decl
|
|
19
|
-
@return_type = return_type
|
|
20
18
|
end
|
|
21
19
|
|
|
22
20
|
def keyword?
|
|
@@ -27,6 +25,10 @@ module Solargraph
|
|
|
27
25
|
decl == :kwrestarg || (assignment && [:HASH, :hash].include?(assignment.type))
|
|
28
26
|
end
|
|
29
27
|
|
|
28
|
+
def arg?
|
|
29
|
+
decl == :arg
|
|
30
|
+
end
|
|
31
|
+
|
|
30
32
|
def restarg?
|
|
31
33
|
decl == :restarg
|
|
32
34
|
end
|
|
@@ -84,11 +86,11 @@ module Solargraph
|
|
|
84
86
|
@return_type = ComplexType.try_parse(*found.types) unless found.nil? or found.types.nil?
|
|
85
87
|
if @return_type.undefined?
|
|
86
88
|
if decl == :restarg
|
|
87
|
-
@return_type = ComplexType.try_parse('Array')
|
|
89
|
+
@return_type = ComplexType.try_parse('::Array')
|
|
88
90
|
elsif decl == :kwrestarg
|
|
89
|
-
@return_type = ComplexType.try_parse('Hash')
|
|
91
|
+
@return_type = ComplexType.try_parse('::Hash')
|
|
90
92
|
elsif decl == :blockarg
|
|
91
|
-
@return_type = ComplexType.try_parse('Proc')
|
|
93
|
+
@return_type = ComplexType.try_parse('::Proc')
|
|
92
94
|
end
|
|
93
95
|
end
|
|
94
96
|
end
|
|
@@ -111,12 +113,22 @@ module Solargraph
|
|
|
111
113
|
closure.is_a?(Pin::Block) ? typify_block_param(api_map) : typify_method_param(api_map)
|
|
112
114
|
end
|
|
113
115
|
|
|
116
|
+
# @param atype [ComplexType]
|
|
117
|
+
# @param api_map [ApiMap]
|
|
118
|
+
def compatible_arg?(atype, api_map)
|
|
119
|
+
# make sure we get types from up the method
|
|
120
|
+
# inheritance chain if we don't have them on this pin
|
|
121
|
+
ptype = typify api_map
|
|
122
|
+
ptype.undefined? || ptype.can_assign?(api_map, atype) || ptype.generic?
|
|
123
|
+
end
|
|
124
|
+
|
|
114
125
|
def documentation
|
|
115
126
|
tag = param_tag
|
|
116
127
|
return '' if tag.nil? || tag.text.nil?
|
|
117
128
|
tag.text
|
|
118
129
|
end
|
|
119
130
|
|
|
131
|
+
# @param pin [Pin::Parameter]
|
|
120
132
|
def try_merge! pin
|
|
121
133
|
return false unless super && closure == pin.closure
|
|
122
134
|
true
|
|
@@ -126,24 +138,19 @@ module Solargraph
|
|
|
126
138
|
|
|
127
139
|
# @return [YARD::Tags::Tag, nil]
|
|
128
140
|
def param_tag
|
|
129
|
-
found = nil
|
|
130
141
|
params = closure.docstring.tags(:param)
|
|
131
142
|
params.each do |p|
|
|
132
|
-
|
|
133
|
-
found = p
|
|
134
|
-
break
|
|
135
|
-
end
|
|
136
|
-
if found.nil? and !index.nil?
|
|
137
|
-
found = params[index] if params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
143
|
+
return p if p.name == name
|
|
138
144
|
end
|
|
139
|
-
|
|
145
|
+
params[index] if index && params[index] && (params[index].name.nil? || params[index].name.empty?)
|
|
140
146
|
end
|
|
141
147
|
|
|
142
148
|
# @param api_map [ApiMap]
|
|
143
149
|
# @return [ComplexType]
|
|
144
150
|
def typify_block_param api_map
|
|
145
|
-
|
|
146
|
-
|
|
151
|
+
block_pin = closure
|
|
152
|
+
if block_pin.is_a?(Pin::Block) && block_pin.receiver
|
|
153
|
+
return block_pin.typify_parameters(api_map)[index]
|
|
147
154
|
end
|
|
148
155
|
ComplexType::UNDEFINED
|
|
149
156
|
end
|
|
@@ -4,24 +4,30 @@ module Solargraph
|
|
|
4
4
|
module Pin
|
|
5
5
|
class ProxyType < Base
|
|
6
6
|
# @param return_type [ComplexType]
|
|
7
|
-
def initialize return_type: ComplexType::UNDEFINED, **splat
|
|
7
|
+
def initialize return_type: ComplexType::UNDEFINED, binder: nil, **splat
|
|
8
8
|
super(**splat)
|
|
9
9
|
@return_type = return_type
|
|
10
|
+
@binder = binder if binder
|
|
10
11
|
end
|
|
11
12
|
|
|
12
13
|
def context
|
|
13
14
|
@return_type
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
# @param
|
|
17
|
+
# @param context [ComplexType, ComplexType::UniqueType] Used as context for this pin
|
|
18
|
+
# @param closure [Pin::Namespace, nil] Used as the closure for this pin
|
|
19
|
+
# @param binder [ComplexType, ComplexType::UniqueType, nil]
|
|
17
20
|
# @return [ProxyType]
|
|
18
|
-
def self.anonymous
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
def self.anonymous context, closure: nil, binder: nil
|
|
22
|
+
unless closure
|
|
23
|
+
parts = context.namespace.split('::')
|
|
24
|
+
namespace = parts[0..-2].join('::').to_s
|
|
25
|
+
closure = Solargraph::Pin::Namespace.new(name: namespace)
|
|
26
|
+
end
|
|
27
|
+
# name = parts.last.to_s
|
|
22
28
|
# ProxyType.new(nil, namespace, name, return_type)
|
|
23
29
|
ProxyType.new(
|
|
24
|
-
closure:
|
|
30
|
+
closure: closure, return_type: context, binder: binder || context
|
|
25
31
|
)
|
|
26
32
|
end
|
|
27
33
|
end
|
|
@@ -1,143 +1,17 @@
|
|
|
1
1
|
module Solargraph
|
|
2
2
|
module Pin
|
|
3
|
-
class Signature <
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
# @return [ComplexType]
|
|
8
|
-
attr_reader :return_type
|
|
9
|
-
|
|
10
|
-
# @return [self]
|
|
11
|
-
attr_reader :block
|
|
12
|
-
|
|
13
|
-
# @param generics [Array<String>]
|
|
14
|
-
# @param parameters [Array<Parameter>]
|
|
15
|
-
# @param return_type [ComplexType]
|
|
16
|
-
# @param block [Signature, nil]
|
|
17
|
-
def initialize generics, parameters, return_type, block = nil
|
|
18
|
-
@generics = generics
|
|
19
|
-
@parameters = parameters
|
|
20
|
-
@return_type = return_type
|
|
21
|
-
@block = block
|
|
3
|
+
class Signature < Callable
|
|
4
|
+
def initialize **splat
|
|
5
|
+
super(**splat)
|
|
22
6
|
end
|
|
23
7
|
|
|
24
8
|
def generics
|
|
25
9
|
@generics ||= [].freeze
|
|
26
10
|
end
|
|
27
11
|
|
|
28
|
-
# @return [String]
|
|
29
|
-
def to_rbs
|
|
30
|
-
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
# @return [String]
|
|
34
|
-
def rbs_generics
|
|
35
|
-
if generics.empty?
|
|
36
|
-
return ''
|
|
37
|
-
else
|
|
38
|
-
return '[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
# @return [Array<String>]
|
|
43
|
-
# @yieldparam [ComplexType]
|
|
44
|
-
# @yieldreturn [ComplexType]
|
|
45
|
-
# @return [self]
|
|
46
|
-
def transform_types(&transform)
|
|
47
|
-
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
48
|
-
signature = super(&transform)
|
|
49
|
-
signature.parameters = signature.parameters.map do |param|
|
|
50
|
-
param.transform_types(&transform)
|
|
51
|
-
end
|
|
52
|
-
signature.block = block.transform_types(&transform) if signature.block?
|
|
53
|
-
signature
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# @param generics_to_resolve [Enumerable<String>]
|
|
57
|
-
# @param arg_types [Array<ComplexType>, nil]
|
|
58
|
-
# @param return_type_context [ComplexType, nil]
|
|
59
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
60
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
61
|
-
# @param context [ComplexType, nil]
|
|
62
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
63
|
-
# @return [self]
|
|
64
|
-
def resolve_generics_from_context(generics_to_resolve,
|
|
65
|
-
arg_types = nil,
|
|
66
|
-
return_type_context = nil,
|
|
67
|
-
yield_arg_types = nil,
|
|
68
|
-
yield_return_type_context = nil,
|
|
69
|
-
resolved_generic_values: {})
|
|
70
|
-
signature = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
71
|
-
signature.parameters = signature.parameters.each_with_index.map do |param, i|
|
|
72
|
-
if arg_types.nil?
|
|
73
|
-
param.dup
|
|
74
|
-
else
|
|
75
|
-
param.resolve_generics_from_context(generics_to_resolve,
|
|
76
|
-
arg_types[i],
|
|
77
|
-
resolved_generic_values: resolved_generic_values)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
signature.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
81
|
-
yield_arg_types,
|
|
82
|
-
yield_return_type_context,
|
|
83
|
-
resolved_generic_values: resolved_generic_values) if signature.block?
|
|
84
|
-
signature
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
# @param generics_to_resolve [Enumerable<String>]
|
|
88
|
-
# @param arg_types [Array<ComplexType>, nil]
|
|
89
|
-
# @param return_type_context [ComplexType, nil]
|
|
90
|
-
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
91
|
-
# @param yield_return_type_context [ComplexType, nil]
|
|
92
|
-
# @param context [ComplexType, nil]
|
|
93
|
-
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
94
|
-
# @return [self]
|
|
95
|
-
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
96
|
-
arg_types = nil,
|
|
97
|
-
return_type_context = nil,
|
|
98
|
-
yield_arg_types = nil,
|
|
99
|
-
yield_return_type_context = nil,
|
|
100
|
-
resolved_generic_values: {})
|
|
101
|
-
# See
|
|
102
|
-
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
103
|
-
# and
|
|
104
|
-
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
105
|
-
# for other implementations
|
|
106
|
-
|
|
107
|
-
return self if generics_to_resolve.empty?
|
|
108
|
-
|
|
109
|
-
last_resolved_generic_values = resolved_generic_values.dup
|
|
110
|
-
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
111
|
-
arg_types,
|
|
112
|
-
return_type_context,
|
|
113
|
-
yield_arg_types,
|
|
114
|
-
yield_return_type_context,
|
|
115
|
-
resolved_generic_values: resolved_generic_values)
|
|
116
|
-
if last_resolved_generic_values == resolved_generic_values
|
|
117
|
-
# erase anything unresolved
|
|
118
|
-
return new_pin.erase_generics(self.generics)
|
|
119
|
-
end
|
|
120
|
-
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
121
|
-
arg_types,
|
|
122
|
-
return_type_context,
|
|
123
|
-
yield_arg_types,
|
|
124
|
-
yield_return_type_context,
|
|
125
|
-
resolved_generic_values: resolved_generic_values)
|
|
126
|
-
end
|
|
127
|
-
|
|
128
12
|
def identity
|
|
129
13
|
@identity ||= "signature#{object_id}"
|
|
130
14
|
end
|
|
131
|
-
|
|
132
|
-
def block?
|
|
133
|
-
!!@block
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
protected
|
|
137
|
-
|
|
138
|
-
attr_writer :block
|
|
139
|
-
|
|
140
|
-
attr_writer :parameters
|
|
141
15
|
end
|
|
142
16
|
end
|
|
143
17
|
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Until < Base
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
8
|
+
# @param receiver [Parser::AST::Node, nil]
|
|
9
|
+
# @param node [Parser::AST::Node, nil]
|
|
10
|
+
# @param context [ComplexType, nil]
|
|
11
|
+
# @param args [::Array<Parameter>]
|
|
12
|
+
def initialize node: nil, **splat
|
|
13
|
+
super(**splat)
|
|
14
|
+
@node = node
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class While < Base
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
8
|
+
# @param receiver [Parser::AST::Node, nil]
|
|
9
|
+
# @param node [Parser::AST::Node, nil]
|
|
10
|
+
# @param context [ComplexType, nil]
|
|
11
|
+
# @param args [::Array<Parameter>]
|
|
12
|
+
def initialize node: nil, **splat
|
|
13
|
+
super(**splat)
|
|
14
|
+
@node = node
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/solargraph/pin.rb
CHANGED
|
@@ -3,7 +3,9 @@
|
|
|
3
3
|
require 'yard'
|
|
4
4
|
|
|
5
5
|
module Solargraph
|
|
6
|
-
# The namespace for
|
|
6
|
+
# The namespace for Pins used in SourceMaps.
|
|
7
|
+
#
|
|
8
|
+
# Pins represent declarations, from gems, Sources, and the Ruby core.
|
|
7
9
|
#
|
|
8
10
|
module Pin
|
|
9
11
|
autoload :Common, 'solargraph/pin/common'
|
|
@@ -32,6 +34,10 @@ module Solargraph
|
|
|
32
34
|
autoload :Singleton, 'solargraph/pin/singleton'
|
|
33
35
|
autoload :KeywordParam, 'solargraph/pin/keyword_param'
|
|
34
36
|
autoload :Search, 'solargraph/pin/search'
|
|
37
|
+
autoload :Breakable, 'solargraph/pin/breakable'
|
|
38
|
+
autoload :Until, 'solargraph/pin/until'
|
|
39
|
+
autoload :While, 'solargraph/pin/while'
|
|
40
|
+
autoload :Callable, 'solargraph/pin/callable'
|
|
35
41
|
|
|
36
42
|
ROOT_PIN = Pin::Namespace.new(type: :class, name: '', closure: nil)
|
|
37
43
|
end
|
data/lib/solargraph/position.rb
CHANGED
|
@@ -4,6 +4,8 @@ module Solargraph
|
|
|
4
4
|
# The zero-based line and column numbers of a position in a string.
|
|
5
5
|
#
|
|
6
6
|
class Position
|
|
7
|
+
include Equality
|
|
8
|
+
|
|
7
9
|
# @return [Integer]
|
|
8
10
|
attr_reader :line
|
|
9
11
|
|
|
@@ -19,6 +21,11 @@ module Solargraph
|
|
|
19
21
|
@character = character
|
|
20
22
|
end
|
|
21
23
|
|
|
24
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
25
|
+
protected def equality_fields
|
|
26
|
+
[line, character]
|
|
27
|
+
end
|
|
28
|
+
|
|
22
29
|
# Get a hash of the position. This representation is suitable for use in
|
|
23
30
|
# the language server protocol.
|
|
24
31
|
#
|
data/lib/solargraph/range.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
module Solargraph
|
|
4
|
-
# A pair of
|
|
4
|
+
# A pair of Positions that compose a section of text in code.
|
|
5
5
|
#
|
|
6
6
|
class Range
|
|
7
|
+
include Equality
|
|
8
|
+
|
|
7
9
|
# @return [Position]
|
|
8
10
|
attr_reader :start
|
|
9
11
|
|
|
@@ -17,6 +19,11 @@ module Solargraph
|
|
|
17
19
|
@ending = ending
|
|
18
20
|
end
|
|
19
21
|
|
|
22
|
+
# @sg-ignore Fix "Not enough arguments to Module#protected"
|
|
23
|
+
protected def equality_fields
|
|
24
|
+
[start, ending]
|
|
25
|
+
end
|
|
26
|
+
|
|
20
27
|
# Get a hash of the range. This representation is suitable for use in
|
|
21
28
|
# the language server protocol.
|
|
22
29
|
#
|
|
@@ -65,9 +72,7 @@ module Solargraph
|
|
|
65
72
|
# @param node [Parser::AST::Node]
|
|
66
73
|
# @return [Range, nil]
|
|
67
74
|
def self.from_node node
|
|
68
|
-
if
|
|
69
|
-
Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
|
|
70
|
-
elsif node&.loc && node.loc.expression
|
|
75
|
+
if node&.loc && node.loc.expression
|
|
71
76
|
from_expr(node.loc.expression)
|
|
72
77
|
end
|
|
73
78
|
end
|