solargraph 0.32.5 → 0.33.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/.gitignore +1 -0
- data/README.md +2 -11
- data/lib/solargraph.rb +1 -2
- data/lib/solargraph/api_map.rb +93 -63
- data/lib/solargraph/api_map/cache.rb +16 -1
- data/lib/solargraph/api_map/source_to_yard.rb +16 -7
- data/lib/solargraph/api_map/store.rb +55 -12
- data/lib/solargraph/complex_type.rb +58 -14
- data/lib/solargraph/complex_type/type_methods.rb +2 -2
- data/lib/solargraph/complex_type/unique_type.rb +33 -4
- data/lib/solargraph/core_fills.rb +40 -12
- data/lib/solargraph/diagnostics.rb +4 -3
- data/lib/solargraph/diagnostics/base.rb +6 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +17 -10
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +2 -0
- data/lib/solargraph/diagnostics/type_check.rb +51 -0
- data/lib/solargraph/diagnostics/update_errors.rb +1 -0
- data/lib/solargraph/language_server/host.rb +55 -25
- data/lib/solargraph/language_server/host/diagnoser.rb +1 -2
- data/lib/solargraph/language_server/host/dispatch.rb +4 -8
- data/lib/solargraph/language_server/host/sources.rb +1 -1
- data/lib/solargraph/language_server/message.rb +1 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +4 -2
- data/lib/solargraph/language_server/message/initialize.rb +9 -0
- data/lib/solargraph/language_server/message/initialized.rb +1 -0
- data/lib/solargraph/language_server/message/text_document.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/code_action.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/definition.rb +25 -5
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +4 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +8 -4
- data/lib/solargraph/language_server/transport/adapter.rb +12 -15
- data/lib/solargraph/library.rb +23 -6
- data/lib/solargraph/location.rb +4 -0
- data/lib/solargraph/pin.rb +7 -3
- data/lib/solargraph/pin/attribute.rb +14 -13
- data/lib/solargraph/pin/base.rb +56 -43
- data/lib/solargraph/pin/base_method.rb +41 -18
- data/lib/solargraph/pin/base_variable.rb +17 -15
- data/lib/solargraph/pin/block.rb +22 -4
- data/lib/solargraph/pin/closure.rb +28 -0
- data/lib/solargraph/pin/common.rb +59 -0
- data/lib/solargraph/pin/constant.rb +4 -4
- data/lib/solargraph/pin/conversions.rb +8 -8
- data/lib/solargraph/pin/duck_method.rb +3 -3
- data/lib/solargraph/pin/instance_variable.rb +30 -0
- data/lib/solargraph/pin/keyword.rb +1 -1
- data/lib/solargraph/pin/local_variable.rb +3 -3
- data/lib/solargraph/pin/localized.rb +9 -5
- data/lib/solargraph/pin/method.rb +26 -40
- data/lib/solargraph/pin/method_alias.rb +9 -6
- data/lib/solargraph/pin/namespace.rb +33 -10
- data/lib/solargraph/pin/parameter.rb +150 -0
- data/lib/solargraph/pin/proxy_type.rb +8 -8
- data/lib/solargraph/pin/reference.rb +1 -12
- data/lib/solargraph/pin/reference/override.rb +18 -0
- data/lib/solargraph/pin/reference/require.rb +2 -1
- data/lib/solargraph/pin/singleton.rb +9 -0
- data/lib/solargraph/pin/symbol.rb +9 -4
- data/lib/solargraph/pin/yard_pin/constant.rb +12 -3
- data/lib/solargraph/pin/yard_pin/method.rb +18 -6
- data/lib/solargraph/pin/yard_pin/namespace.rb +13 -1
- data/lib/solargraph/position.rb +1 -1
- data/lib/solargraph/range.rb +4 -0
- data/lib/solargraph/shell.rb +83 -4
- data/lib/solargraph/source.rb +32 -12
- data/lib/solargraph/source/chain.rb +48 -28
- data/lib/solargraph/source/chain/call.rb +37 -38
- data/lib/solargraph/source/chain/constant.rb +1 -1
- data/lib/solargraph/source/chain/head.rb +2 -8
- data/lib/solargraph/source/chain/instance_variable.rb +1 -1
- data/lib/solargraph/source/chain/link.rb +2 -0
- data/lib/solargraph/source/cursor.rb +59 -24
- data/lib/solargraph/source/node_chainer.rb +0 -2
- data/lib/solargraph/source/node_methods.rb +12 -6
- data/lib/solargraph/source/source_chainer.rb +38 -44
- data/lib/solargraph/source_map.rb +11 -18
- data/lib/solargraph/source_map/clip.rb +13 -15
- data/lib/solargraph/source_map/mapper.rb +37 -26
- data/lib/solargraph/source_map/node_processor.rb +13 -8
- data/lib/solargraph/source_map/node_processor/alias_node.rb +8 -8
- data/lib/solargraph/source_map/node_processor/args_node.rb +10 -16
- data/lib/solargraph/source_map/node_processor/base.rb +47 -4
- data/lib/solargraph/source_map/node_processor/block_node.rb +9 -4
- data/lib/solargraph/source_map/node_processor/casgn_node.rb +7 -2
- data/lib/solargraph/source_map/node_processor/cvasgn_node.rb +8 -3
- data/lib/solargraph/source_map/node_processor/def_node.rb +45 -38
- data/lib/solargraph/source_map/node_processor/defs_node.rb +16 -6
- data/lib/solargraph/source_map/node_processor/gvasgn_node.rb +8 -1
- data/lib/solargraph/source_map/node_processor/ivasgn_node.rb +20 -6
- data/lib/solargraph/source_map/node_processor/lvasgn_node.rb +10 -4
- data/lib/solargraph/source_map/node_processor/namespace_node.rb +18 -12
- data/lib/solargraph/source_map/node_processor/orasgn_node.rb +1 -1
- data/lib/solargraph/source_map/node_processor/resbody_node.rb +30 -0
- data/lib/solargraph/source_map/node_processor/sclass_node.rb +7 -1
- data/lib/solargraph/source_map/node_processor/send_node.rb +102 -52
- data/lib/solargraph/source_map/node_processor/sym_node.rb +4 -1
- data/lib/solargraph/source_map/region.rb +9 -8
- data/lib/solargraph/type_checker.rb +282 -0
- data/lib/solargraph/type_checker/param_def.rb +47 -0
- data/lib/solargraph/type_checker/problem.rb +25 -0
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +1 -1
- data/lib/solargraph/workspace.rb +2 -2
- data/lib/solargraph/workspace/config.rb +0 -8
- data/lib/solargraph/yard_map.rb +25 -69
- data/lib/solargraph/yard_map/core_docs.rb +8 -3
- data/lib/solargraph/yard_map/core_gen.rb +1 -3
- data/lib/solargraph/yard_map/mapper.rb +85 -0
- data/lib/yard-solargraph.rb +2 -0
- metadata +14 -14
- data/lib/solargraph/diagnostics/type_not_defined.rb +0 -108
- data/lib/solargraph/live_map.rb +0 -126
- data/lib/solargraph/live_map/cache.rb +0 -38
- data/lib/solargraph/pin/block_parameter.rb +0 -103
- data/lib/solargraph/pin/method_parameter.rb +0 -40
- data/lib/solargraph/pin/plugin/method.rb +0 -25
- data/lib/solargraph/plugin.rb +0 -8
- data/lib/solargraph/plugin/base.rb +0 -41
- data/lib/solargraph/plugin/canceler.rb +0 -11
- data/lib/solargraph/plugin/process.rb +0 -172
- data/lib/solargraph/plugin/runtime.rb +0 -134
- data/lib/yard-coregen.rb +0 -16
@@ -6,7 +6,7 @@ module Solargraph
|
|
6
6
|
# @return [Array<Solargraph::Pin::Base>]
|
7
7
|
attr_reader :pins
|
8
8
|
|
9
|
-
# @param pins [Array<Solargraph::
|
9
|
+
# @param pins [Array<Solargraph::Pin::Base>]
|
10
10
|
def initialize pins = []
|
11
11
|
@pins = pins
|
12
12
|
index
|
@@ -26,16 +26,16 @@ module Solargraph
|
|
26
26
|
# @param visibility [Array<Symbol>]
|
27
27
|
# @return [Array<Solargraph::Pin::Base>]
|
28
28
|
def get_methods fqns, scope: :instance, visibility: [:public]
|
29
|
-
kinds = [Pin::METHOD, Pin::ATTRIBUTE]
|
30
|
-
namespace_children(fqns).select
|
29
|
+
kinds = [Pin::METHOD, Pin::ATTRIBUTE, Pin::METHOD_ALIAS]
|
30
|
+
namespace_children(fqns).select do |pin|
|
31
31
|
kinds.include?(pin.kind) && pin.scope == scope && visibility.include?(pin.visibility)
|
32
|
-
|
32
|
+
end
|
33
33
|
end
|
34
34
|
|
35
35
|
# @param fqns [String]
|
36
36
|
# @return [String]
|
37
37
|
def get_superclass fqns
|
38
|
-
return superclass_references[fqns].first if superclass_references.
|
38
|
+
return superclass_references[fqns].first if superclass_references.key?(fqns)
|
39
39
|
nil
|
40
40
|
end
|
41
41
|
|
@@ -54,15 +54,17 @@ module Solargraph
|
|
54
54
|
# @param path [String]
|
55
55
|
# @return [Array<Solargraph::Pin::Base>]
|
56
56
|
def get_path_pins path
|
57
|
-
|
58
|
-
pins.select { |pin| pin.path == path }
|
57
|
+
path_pin_hash[path] || []
|
59
58
|
end
|
60
59
|
|
61
60
|
# @param fqns [String]
|
62
61
|
# @param scope [Symbol] :class or :instance
|
63
62
|
# @return [Array<Solargraph::Pin::Base>]
|
64
63
|
def get_instance_variables(fqns, scope = :instance)
|
65
|
-
namespace_children(fqns).select{|pin| pin.kind == Pin::INSTANCE_VARIABLE and pin.context.scope == scope}
|
64
|
+
# namespace_children(fqns).select{|pin| pin.kind == Pin::INSTANCE_VARIABLE and pin.context.scope == scope}
|
65
|
+
all_instance_variables.select { |pin|
|
66
|
+
pin.binder.namespace == fqns && pin.binder.scope == scope
|
67
|
+
}
|
66
68
|
end
|
67
69
|
|
68
70
|
# @param fqns [String]
|
@@ -89,12 +91,14 @@ module Solargraph
|
|
89
91
|
|
90
92
|
# @return [Array<Solargraph::Pin::Base>]
|
91
93
|
def namespace_pins
|
92
|
-
@namespace_pins ||= pins.select{|p| p.kind == Pin::NAMESPACE}
|
94
|
+
# @namespace_pins ||= pins.select{|p| p.kind == Pin::NAMESPACE}
|
95
|
+
@namespace_pins ||= []
|
93
96
|
end
|
94
97
|
|
95
98
|
# @return [Array<Solargraph::Pin::Base>]
|
96
99
|
def method_pins
|
97
|
-
@method_pins ||= pins.select{|p| p.kind == Pin::METHOD or p.kind == Pin::ATTRIBUTE}
|
100
|
+
# @method_pins ||= pins.select{|p| p.kind == Pin::METHOD or p.kind == Pin::ATTRIBUTE}
|
101
|
+
@method_pins ||= []
|
98
102
|
end
|
99
103
|
|
100
104
|
# @param fqns [String]
|
@@ -121,6 +125,11 @@ module Solargraph
|
|
121
125
|
end
|
122
126
|
end
|
123
127
|
|
128
|
+
# @return [Array<Pin::Block>]
|
129
|
+
def block_pins
|
130
|
+
@block_pins ||= []
|
131
|
+
end
|
132
|
+
|
124
133
|
def inspect
|
125
134
|
# Avoid insane dumps in specs
|
126
135
|
to_s
|
@@ -171,16 +180,32 @@ module Solargraph
|
|
171
180
|
@namespace_map ||= {}
|
172
181
|
end
|
173
182
|
|
183
|
+
def all_instance_variables
|
184
|
+
@all_instance_variables ||= []
|
185
|
+
end
|
186
|
+
|
187
|
+
def path_pin_hash
|
188
|
+
@path_pin_hash ||= {}
|
189
|
+
end
|
190
|
+
|
174
191
|
# @return [void]
|
175
192
|
def index
|
176
193
|
namespace_map.clear
|
177
194
|
namespaces.clear
|
195
|
+
namespace_pins.clear
|
196
|
+
method_pins.clear
|
178
197
|
symbols.clear
|
198
|
+
block_pins.clear
|
199
|
+
all_instance_variables.clear
|
200
|
+
path_pin_hash.clear
|
179
201
|
namespace_map[''] = []
|
202
|
+
override_pins = []
|
180
203
|
pins.each do |pin|
|
181
204
|
namespace_map[pin.namespace] ||= []
|
182
205
|
namespace_map[pin.namespace].push pin
|
183
206
|
namespaces.add pin.path if pin.kind == Pin::NAMESPACE and !pin.path.empty?
|
207
|
+
namespace_pins.push pin if pin.kind == Pin::NAMESPACE
|
208
|
+
method_pins.push pin if pin.kind == Pin::METHOD || pin.kind == Pin::ATTRIBUTE
|
184
209
|
symbols.push pin if pin.kind == Pin::SYMBOL
|
185
210
|
if pin.kind == Pin::INCLUDE_REFERENCE
|
186
211
|
include_references[pin.namespace] ||= []
|
@@ -191,10 +216,28 @@ module Solargraph
|
|
191
216
|
elsif pin.kind == Pin::SUPERCLASS_REFERENCE
|
192
217
|
superclass_references[pin.namespace] ||= []
|
193
218
|
superclass_references[pin.namespace].push pin.name
|
219
|
+
elsif pin.is_a?(Pin::Block)
|
220
|
+
block_pins.push pin
|
221
|
+
elsif pin.is_a?(Pin::InstanceVariable)
|
222
|
+
all_instance_variables.push pin
|
223
|
+
elsif pin.is_a?(Pin::Reference::Override)
|
224
|
+
override_pins.push pin
|
225
|
+
end
|
226
|
+
if pin.path
|
227
|
+
path_pin_hash[pin.path] ||= []
|
228
|
+
path_pin_hash[pin.path].push pin
|
229
|
+
end
|
230
|
+
end
|
231
|
+
override_pins.concat CoreFills::OVERRIDES
|
232
|
+
override_pins.each do |ovr|
|
233
|
+
pin = get_path_pins(ovr.name).first
|
234
|
+
next if pin.nil?
|
235
|
+
pin.docstring.delete_tags(:overload)
|
236
|
+
pin.docstring.delete_tags(:return)
|
237
|
+
ovr.tags.each do |tag|
|
238
|
+
pin.docstring.add_tag(tag)
|
194
239
|
end
|
195
240
|
end
|
196
|
-
@namespace_pins = nil
|
197
|
-
@method_pins = nil
|
198
241
|
end
|
199
242
|
end
|
200
243
|
end
|
@@ -1,35 +1,57 @@
|
|
1
1
|
module Solargraph
|
2
2
|
# A container for type data based on YARD type tags.
|
3
3
|
#
|
4
|
-
class ComplexType
|
5
|
-
# @todo Figure out how to add the basic type methods here without actually
|
6
|
-
# including the module. One possibility:
|
7
|
-
#
|
4
|
+
class ComplexType
|
8
5
|
# @!parse
|
9
6
|
# include TypeMethods
|
10
7
|
|
11
8
|
autoload :TypeMethods, 'solargraph/complex_type/type_methods'
|
12
9
|
autoload :UniqueType, 'solargraph/complex_type/unique_type'
|
13
10
|
|
14
|
-
# @param types [Array<
|
15
|
-
def initialize types = [
|
16
|
-
|
17
|
-
concat types
|
11
|
+
# @param types [Array<UniqueType>]
|
12
|
+
def initialize types = [UniqueType::UNDEFINED]
|
13
|
+
@items = types
|
18
14
|
end
|
19
15
|
|
20
16
|
# @param api_map [ApiMap]
|
21
17
|
# @param context [String]
|
22
18
|
# @return [ComplexType]
|
23
19
|
def qualify api_map, context = ''
|
24
|
-
types = map do |t|
|
20
|
+
types = @items.map do |t|
|
25
21
|
t.qualify api_map, context
|
26
22
|
end
|
27
23
|
ComplexType.new(types)
|
28
24
|
end
|
29
25
|
|
26
|
+
def first
|
27
|
+
@items.first
|
28
|
+
end
|
29
|
+
|
30
|
+
def map &block
|
31
|
+
@items.map &block
|
32
|
+
end
|
33
|
+
|
34
|
+
# @yieldparam [UniqueType]
|
35
|
+
# @return [Array]
|
36
|
+
def each &block
|
37
|
+
@items.each &block
|
38
|
+
end
|
39
|
+
|
40
|
+
def length
|
41
|
+
@items.length
|
42
|
+
end
|
43
|
+
|
44
|
+
def [](index)
|
45
|
+
@items[index]
|
46
|
+
end
|
47
|
+
|
48
|
+
def select &block
|
49
|
+
@items.select &block
|
50
|
+
end
|
51
|
+
|
30
52
|
def method_missing name, *args, &block
|
31
|
-
return if first.nil?
|
32
|
-
return first.send(name, *args, &block) if respond_to_missing?(name)
|
53
|
+
return if @items.first.nil?
|
54
|
+
return @items.first.send(name, *args, &block) if respond_to_missing?(name)
|
33
55
|
super
|
34
56
|
end
|
35
57
|
|
@@ -41,6 +63,20 @@ module Solargraph
|
|
41
63
|
map(&:tag).join(', ')
|
42
64
|
end
|
43
65
|
|
66
|
+
def all? &block
|
67
|
+
@items.all? &block
|
68
|
+
end
|
69
|
+
|
70
|
+
def selfy?
|
71
|
+
@items.any?(&:selfy?)
|
72
|
+
end
|
73
|
+
|
74
|
+
def self_to dst
|
75
|
+
return self unless selfy?
|
76
|
+
result = @items.map { |i| i.self_to dst }
|
77
|
+
ComplexType.parse(*result.map(&:tag))
|
78
|
+
end
|
79
|
+
|
44
80
|
class << self
|
45
81
|
# Parse type strings into a ComplexType.
|
46
82
|
#
|
@@ -81,7 +117,8 @@ module Solargraph
|
|
81
117
|
subtype_string += char
|
82
118
|
elsif base.end_with?('=')
|
83
119
|
raise ComplexTypeError, "Invalid hash thing" unless key_types.nil?
|
84
|
-
types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
|
120
|
+
# types.push ComplexType.new([UniqueType.new(base[0..-2].strip)])
|
121
|
+
types.push UniqueType.new(base[0..-2].strip)
|
85
122
|
key_types = types
|
86
123
|
types = []
|
87
124
|
base = ''
|
@@ -108,7 +145,8 @@ module Solargraph
|
|
108
145
|
raise ComplexTypeError, "Invalid close in type #{type_string}" if paren_stack < 0
|
109
146
|
next
|
110
147
|
elsif char == ',' && point_stack == 0 && curly_stack == 0 && paren_stack == 0
|
111
|
-
types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
|
148
|
+
# types.push ComplexType.new([UniqueType.new(base.strip, subtype_string.strip)])
|
149
|
+
types.push UniqueType.new(base.strip, subtype_string.strip)
|
112
150
|
base = ''
|
113
151
|
subtype_string = ''
|
114
152
|
next
|
@@ -122,7 +160,8 @@ module Solargraph
|
|
122
160
|
base.strip!
|
123
161
|
subtype_string.strip!
|
124
162
|
raise ComplexTypeError, "Unclosed subtype in #{type_string}" if point_stack != 0 || curly_stack != 0 || paren_stack != 0
|
125
|
-
types.push ComplexType.new([UniqueType.new(base, subtype_string)])
|
163
|
+
# types.push ComplexType.new([UniqueType.new(base, subtype_string)])
|
164
|
+
types.push UniqueType.new(base, subtype_string)
|
126
165
|
end
|
127
166
|
unless key_types.nil?
|
128
167
|
raise ComplexTypeError, "Invalid use of key/value parameters" unless partial
|
@@ -134,6 +173,8 @@ module Solargraph
|
|
134
173
|
result
|
135
174
|
end
|
136
175
|
|
176
|
+
# @param strings [Array<String>]
|
177
|
+
# @return [ComplexType]
|
137
178
|
def try_parse *strings
|
138
179
|
parse *strings
|
139
180
|
rescue ComplexTypeError => e
|
@@ -146,5 +187,8 @@ module Solargraph
|
|
146
187
|
UNDEFINED = ComplexType.parse('undefined')
|
147
188
|
SYMBOL = ComplexType.parse('Symbol')
|
148
189
|
ROOT = ComplexType.parse('Class<>')
|
190
|
+
NIL = ComplexType.parse('nil')
|
191
|
+
SELF = ComplexType.parse('self')
|
192
|
+
BOOLEAN = ComplexType.parse('Boolean')
|
149
193
|
end
|
150
194
|
end
|
@@ -99,8 +99,8 @@ module Solargraph
|
|
99
99
|
recon = (rooted? ? '' : context)
|
100
100
|
fqns = api_map.qualify(name, recon)
|
101
101
|
if fqns.nil?
|
102
|
-
return
|
103
|
-
return
|
102
|
+
return UniqueType::BOOLEAN if tag == 'Boolean'
|
103
|
+
return UniqueType::UNDEFINED
|
104
104
|
end
|
105
105
|
fqns = "::#{fqns}" # Ensure the resulting complex type is rooted
|
106
106
|
ltypes = key_types.map do |t|
|
@@ -26,11 +26,15 @@ module Solargraph
|
|
26
26
|
@key_types = []
|
27
27
|
@subtypes = []
|
28
28
|
return unless parameters?
|
29
|
-
|
29
|
+
if @substring.start_with?('<(') && @substring.end_with?(')>')
|
30
|
+
subs = ComplexType.parse(substring[2..-3], partial: true)
|
31
|
+
else
|
32
|
+
subs = ComplexType.parse(substring[1..-2], partial: true)
|
33
|
+
end
|
30
34
|
if hash_parameters?
|
31
|
-
raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(
|
32
|
-
@key_types.concat subs[0]
|
33
|
-
@subtypes.concat subs[1]
|
35
|
+
raise ComplexTypeError, "Bad hash type" unless !subs.is_a?(ComplexType) and subs.length == 2 and !subs[0].is_a?(UniqueType) and !subs[1].is_a?(UniqueType)
|
36
|
+
@key_types.concat subs[0].map { |u| ComplexType.new([u]) }
|
37
|
+
@subtypes.concat subs[1].map { |u| ComplexType.new([u]) }
|
34
38
|
else
|
35
39
|
@subtypes.concat subs
|
36
40
|
end
|
@@ -39,6 +43,31 @@ module Solargraph
|
|
39
43
|
def to_s
|
40
44
|
tag
|
41
45
|
end
|
46
|
+
|
47
|
+
def self_to dst
|
48
|
+
return self unless selfy?
|
49
|
+
new_name = (@name == 'self' ? dst : @name)
|
50
|
+
new_key_types = @key_types.map { |t| t.self_to dst }
|
51
|
+
new_subtypes = @subtypes.map { |t| t.self_to dst }
|
52
|
+
if hash_parameters?
|
53
|
+
UniqueType.new(new_name, "{#{new_key_types.join(', ')} => #{new_subtypes.join(', ')}}")
|
54
|
+
elsif parameters?
|
55
|
+
if @substring.start_with?'<('
|
56
|
+
UniqueType.new(new_name, "<(#{new_subtypes.join(', ')})>")
|
57
|
+
else
|
58
|
+
UniqueType.new(new_name, "<#{new_subtypes.join(', ')}>")
|
59
|
+
end
|
60
|
+
else
|
61
|
+
UniqueType.new(new_name)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def selfy?
|
66
|
+
@name == 'self' || @key_types.any?(&:selfy?) || @subtypes.any?(&:selfy?)
|
67
|
+
end
|
68
|
+
|
69
|
+
UNDEFINED = UniqueType.new('undefined')
|
70
|
+
BOOLEAN = UniqueType.new('Boolean')
|
42
71
|
end
|
43
72
|
end
|
44
73
|
end
|
@@ -8,30 +8,58 @@ module Solargraph
|
|
8
8
|
'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
|
9
9
|
].freeze
|
10
10
|
|
11
|
-
METHODS_RETURNING_SELF = %w[
|
12
|
-
Array#select Array#reject Array#keep_if Array#delete_if
|
13
|
-
Enumerable#select
|
14
|
-
Object#clone Object#dup Object#freeze Object#taint Object#untaint Object#tap
|
15
|
-
String#freeze
|
16
|
-
].freeze
|
17
|
-
|
18
11
|
METHODS_RETURNING_SUBTYPES = %w[
|
19
12
|
Array#[] Array#first Array#last
|
20
13
|
].freeze
|
21
14
|
|
15
|
+
METHODS_RETURNING_VALUE_TYPES = %w[
|
16
|
+
Hash#[]
|
17
|
+
].freeze
|
18
|
+
|
22
19
|
METHODS_WITH_YIELDPARAM_SELF = %w[
|
23
20
|
Object#tap
|
24
21
|
].freeze
|
25
22
|
|
26
23
|
METHODS_WITH_YIELDPARAM_SUBTYPES = %w[
|
27
|
-
Array#each Array#map Array#any? Array#all? Array#index
|
24
|
+
Array#each Array#map Array#any? Array#all? Array#index Array#keep_if
|
25
|
+
Array#delete_if
|
28
26
|
Enumerable#each_entry Enumerable#map Enumerable#any? Enumerable#all?
|
27
|
+
Enumerable#select Enumerable#reject
|
29
28
|
Set#each
|
30
29
|
].freeze
|
31
30
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
31
|
+
class << self
|
32
|
+
private
|
33
|
+
|
34
|
+
def override path, *tags
|
35
|
+
Solargraph::Pin::Reference::Override.new(nil, path, [YARD::Tags::Tag.new('return', nil, tags)])
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
OVERRIDES = [
|
40
|
+
override('Array#select', 'self'),
|
41
|
+
override('Array#reject', 'self'),
|
42
|
+
override('Array#keep_if', 'self'),
|
43
|
+
override('Array#delete_if', 'self'),
|
44
|
+
|
45
|
+
override('Class#new', 'self'),
|
46
|
+
override('Class.new', 'Class<Object>'),
|
47
|
+
override('Class#allocate', 'self'),
|
48
|
+
override('Class.allocate', 'Class<Object>'),
|
49
|
+
|
50
|
+
override('Enumerable#select', 'self'),
|
51
|
+
|
52
|
+
override('Object#!', 'Boolean'),
|
53
|
+
override('Object#clone', 'self'),
|
54
|
+
override('Object#dup', 'self'),
|
55
|
+
override('Object#freeze', 'self'),
|
56
|
+
override('Object#taint', 'self'),
|
57
|
+
override('Object#untaint', 'self'),
|
58
|
+
override('Object#tap', 'self'),
|
59
|
+
|
60
|
+
override('String#freeze', 'self'),
|
61
|
+
override('String#split', 'Array<String>'),
|
62
|
+
override('String#lines', 'Array<String>')
|
63
|
+
]
|
36
64
|
end
|
37
65
|
end
|
@@ -8,8 +8,8 @@ module Solargraph
|
|
8
8
|
autoload :Rubocop, 'solargraph/diagnostics/rubocop'
|
9
9
|
autoload :RubocopHelpers, 'solargraph/diagnostics/rubocop_helpers'
|
10
10
|
autoload :RequireNotFound, 'solargraph/diagnostics/require_not_found'
|
11
|
-
autoload :TypeNotDefined, 'solargraph/diagnostics/type_not_defined'
|
12
11
|
autoload :UpdateErrors, 'solargraph/diagnostics/update_errors'
|
12
|
+
autoload :TypeCheck, 'solargraph/diagnostics/type_check'
|
13
13
|
|
14
14
|
class << self
|
15
15
|
# Add a reporter with a name to identify it in .solargraph.yml files.
|
@@ -25,7 +25,7 @@ module Solargraph
|
|
25
25
|
#
|
26
26
|
# @return [Array<String>]
|
27
27
|
def reporters
|
28
|
-
reporter_hash.keys
|
28
|
+
reporter_hash.keys - ['type_not_defined'] # @todo Hide type_not_defined for now
|
29
29
|
end
|
30
30
|
|
31
31
|
# Find a reporter by name.
|
@@ -46,7 +46,8 @@ module Solargraph
|
|
46
46
|
|
47
47
|
register 'rubocop', Rubocop
|
48
48
|
register 'require_not_found', RequireNotFound
|
49
|
-
register '
|
49
|
+
register 'typecheck', TypeCheck
|
50
50
|
register 'update_errors', UpdateErrors
|
51
|
+
register 'type_not_defined', TypeCheck # @todo Retained for backwards compatibility
|
51
52
|
end
|
52
53
|
end
|
@@ -3,6 +3,12 @@ module Solargraph
|
|
3
3
|
# The base class for diagnostics reporters.
|
4
4
|
#
|
5
5
|
class Base
|
6
|
+
attr_reader :args
|
7
|
+
|
8
|
+
def initialize *args
|
9
|
+
@args = args
|
10
|
+
end
|
11
|
+
|
6
12
|
# Perform a diagnosis on a Source within the context of an ApiMap.
|
7
13
|
# The result is an array of hash objects that conform to the LSP's
|
8
14
|
# Diagnostic specification.
|