solargraph 0.54.0 → 0.58.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/.github/workflows/linting.yml +127 -0
- data/.github/workflows/plugins.yml +184 -6
- data/.github/workflows/rspec.yml +55 -5
- data/.github/workflows/typecheck.yml +8 -3
- data/.gitignore +7 -0
- data/.overcommit.yml +72 -0
- data/.rspec +1 -0
- data/.rubocop.yml +66 -0
- data/.rubocop_todo.yml +1279 -0
- data/.yardopts +1 -0
- data/CHANGELOG.md +171 -0
- data/README.md +20 -6
- data/Rakefile +125 -13
- data/bin/solargraph +8 -5
- data/lib/solargraph/api_map/cache.rb +13 -3
- data/lib/solargraph/api_map/constants.rb +279 -0
- data/lib/solargraph/api_map/index.rb +193 -0
- data/lib/solargraph/api_map/source_to_yard.rb +13 -4
- data/lib/solargraph/api_map/store.rb +207 -132
- data/lib/solargraph/api_map.rb +394 -261
- data/lib/solargraph/bench.rb +18 -1
- data/lib/solargraph/complex_type/type_methods.rb +29 -12
- data/lib/solargraph/complex_type/unique_type.rb +205 -26
- data/lib/solargraph/complex_type.rb +126 -26
- data/lib/solargraph/convention/active_support_concern.rb +111 -0
- data/lib/solargraph/convention/base.rb +20 -3
- data/lib/solargraph/convention/data_definition/data_assignment_node.rb +61 -0
- data/lib/solargraph/convention/data_definition/data_definition_node.rb +91 -0
- data/lib/solargraph/convention/data_definition.rb +105 -0
- data/lib/solargraph/convention/gemspec.rb +3 -2
- data/lib/solargraph/convention/struct_definition/struct_assignment_node.rb +61 -0
- data/lib/solargraph/convention/struct_definition/struct_definition_node.rb +102 -0
- data/lib/solargraph/convention/struct_definition.rb +164 -0
- data/lib/solargraph/convention.rb +36 -4
- data/lib/solargraph/diagnostics/rubocop.rb +6 -1
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +5 -3
- data/lib/solargraph/doc_map.rb +316 -64
- data/lib/solargraph/environ.rb +9 -2
- data/lib/solargraph/equality.rb +34 -0
- data/lib/solargraph/gem_pins.rb +64 -38
- data/lib/solargraph/language_server/host/dispatch.rb +2 -0
- data/lib/solargraph/language_server/host/message_worker.rb +54 -5
- data/lib/solargraph/language_server/host.rb +36 -18
- data/lib/solargraph/language_server/message/base.rb +20 -12
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +2 -0
- data/lib/solargraph/language_server/message/extended/document.rb +5 -2
- data/lib/solargraph/language_server/message/extended/document_gems.rb +3 -3
- 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 +5 -3
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +3 -3
- data/lib/solargraph/language_server/message/text_document/formatting.rb +23 -2
- data/lib/solargraph/language_server/message/text_document/hover.rb +1 -1
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +4 -3
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +2 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +2 -2
- data/lib/solargraph/language_server/progress.rb +27 -2
- data/lib/solargraph/language_server/request.rb +4 -1
- data/lib/solargraph/library.rb +83 -73
- data/lib/solargraph/location.rb +45 -1
- data/lib/solargraph/logging.rb +12 -2
- data/lib/solargraph/page.rb +3 -0
- data/lib/solargraph/parser/comment_ripper.rb +20 -7
- data/lib/solargraph/parser/flow_sensitive_typing.rb +255 -0
- data/lib/solargraph/parser/node_processor/base.rb +10 -5
- data/lib/solargraph/parser/node_processor.rb +26 -8
- data/lib/solargraph/parser/parser_gem/class_methods.rb +10 -18
- data/lib/solargraph/parser/parser_gem/flawed_builder.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_chainer.rb +13 -11
- data/lib/solargraph/parser/parser_gem/node_methods.rb +10 -19
- data/lib/solargraph/parser/parser_gem/node_processors/alias_node.rb +2 -1
- data/lib/solargraph/parser/parser_gem/node_processors/and_node.rb +22 -0
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +26 -20
- data/lib/solargraph/parser/parser_gem/node_processors/block_node.rb +7 -4
- data/lib/solargraph/parser/parser_gem/node_processors/casgn_node.rb +2 -1
- 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 +23 -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/masgn_node.rb +14 -2
- data/lib/solargraph/parser/parser_gem/node_processors/namespace_node.rb +8 -7
- data/lib/solargraph/parser/parser_gem/node_processors/opasgn_node.rb +98 -0
- data/lib/solargraph/parser/parser_gem/node_processors/orasgn_node.rb +1 -0
- data/lib/solargraph/parser/parser_gem/node_processors/resbody_node.rb +3 -1
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +16 -6
- data/lib/solargraph/parser/parser_gem/node_processors/send_node.rb +64 -32
- data/lib/solargraph/parser/parser_gem/node_processors/sym_node.rb +3 -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 +14 -0
- data/lib/solargraph/parser/region.rb +4 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +3 -5
- data/lib/solargraph/pin/base.rb +417 -42
- data/lib/solargraph/pin/base_variable.rb +21 -12
- data/lib/solargraph/pin/block.rb +9 -26
- data/lib/solargraph/pin/breakable.rb +9 -0
- data/lib/solargraph/pin/callable.rb +231 -0
- data/lib/solargraph/pin/closure.rb +30 -10
- data/lib/solargraph/pin/common.rb +12 -7
- data/lib/solargraph/pin/constant.rb +2 -0
- data/lib/solargraph/pin/conversions.rb +3 -2
- data/lib/solargraph/pin/delegated_method.rb +20 -1
- data/lib/solargraph/pin/documenting.rb +16 -0
- data/lib/solargraph/pin/instance_variable.rb +2 -2
- data/lib/solargraph/pin/keyword.rb +7 -2
- data/lib/solargraph/pin/local_variable.rb +15 -7
- data/lib/solargraph/pin/method.rb +241 -70
- data/lib/solargraph/pin/method_alias.rb +3 -0
- data/lib/solargraph/pin/namespace.rb +21 -13
- data/lib/solargraph/pin/parameter.rb +94 -32
- data/lib/solargraph/pin/proxy_type.rb +17 -7
- data/lib/solargraph/pin/reference/override.rb +24 -6
- data/lib/solargraph/pin/reference/require.rb +2 -2
- data/lib/solargraph/pin/reference/superclass.rb +5 -0
- data/lib/solargraph/pin/reference.rb +17 -0
- data/lib/solargraph/pin/search.rb +6 -1
- data/lib/solargraph/pin/signature.rb +39 -121
- data/lib/solargraph/pin/singleton.rb +1 -1
- data/lib/solargraph/pin/symbol.rb +8 -2
- data/lib/solargraph/pin/until.rb +18 -0
- data/lib/solargraph/pin/while.rb +18 -0
- data/lib/solargraph/pin.rb +8 -2
- data/lib/solargraph/pin_cache.rb +245 -0
- data/lib/solargraph/position.rb +19 -0
- data/lib/solargraph/range.rb +23 -4
- data/lib/solargraph/rbs_map/conversions.rb +315 -99
- data/lib/solargraph/rbs_map/core_fills.rb +50 -16
- data/lib/solargraph/rbs_map/core_map.rb +41 -11
- data/lib/solargraph/rbs_map/stdlib_map.rb +15 -5
- data/lib/solargraph/rbs_map.rb +87 -16
- data/lib/solargraph/shell.rb +117 -17
- data/lib/solargraph/source/chain/array.rb +13 -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 +135 -66
- data/lib/solargraph/source/chain/constant.rb +3 -66
- data/lib/solargraph/source/chain/hash.rb +9 -3
- data/lib/solargraph/source/chain/head.rb +1 -1
- data/lib/solargraph/source/chain/if.rb +7 -2
- data/lib/solargraph/source/chain/link.rb +38 -6
- data/lib/solargraph/source/chain/literal.rb +27 -2
- data/lib/solargraph/source/chain/or.rb +2 -2
- data/lib/solargraph/source/chain/z_super.rb +1 -1
- data/lib/solargraph/source/chain.rb +140 -63
- data/lib/solargraph/source/change.rb +2 -2
- data/lib/solargraph/source/cursor.rb +4 -4
- data/lib/solargraph/source/source_chainer.rb +3 -3
- data/lib/solargraph/source.rb +110 -89
- data/lib/solargraph/source_map/clip.rb +22 -28
- data/lib/solargraph/source_map/data.rb +34 -0
- data/lib/solargraph/source_map/mapper.rb +11 -7
- data/lib/solargraph/source_map.rb +50 -43
- data/lib/solargraph/type_checker/checks.rb +4 -0
- data/lib/solargraph/type_checker/param_def.rb +2 -0
- data/lib/solargraph/type_checker/rules.rb +35 -8
- data/lib/solargraph/type_checker.rb +331 -189
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/_method.erb +10 -10
- data/lib/solargraph/views/_namespace.erb +3 -3
- data/lib/solargraph/views/document.erb +10 -10
- data/lib/solargraph/views/environment.erb +3 -5
- data/lib/solargraph/workspace/config.rb +25 -5
- data/lib/solargraph/workspace/require_paths.rb +97 -0
- data/lib/solargraph/workspace.rb +53 -72
- data/lib/solargraph/yard_map/helpers.rb +29 -1
- data/lib/solargraph/yard_map/mapper/to_constant.rb +8 -5
- data/lib/solargraph/yard_map/mapper/to_method.rb +55 -19
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +11 -7
- data/lib/solargraph/yard_map/mapper.rb +5 -3
- data/lib/solargraph/yard_map/to_method.rb +6 -3
- data/lib/solargraph/yardoc.rb +45 -10
- data/lib/solargraph.rb +35 -1
- data/rbs/fills/bundler/0/bundler.rbs +4271 -0
- data/rbs/fills/open3/0/open3.rbs +172 -0
- data/rbs/fills/rubygems/0/basic_specification.rbs +326 -0
- data/rbs/fills/rubygems/0/errors.rbs +364 -0
- data/rbs/fills/rubygems/0/spec_fetcher.rbs +107 -0
- data/rbs/fills/rubygems/0/specification.rbs +1753 -0
- data/rbs/fills/tuple/tuple.rbs +149 -0
- data/rbs_collection.yaml +19 -0
- data/sig/shims/ast/0/node.rbs +5 -0
- data/sig/shims/ast/2.4/.rbs_meta.yaml +9 -0
- data/sig/shims/ast/2.4/ast.rbs +73 -0
- data/sig/shims/parser/3.2.0.1/builders/default.rbs +195 -0
- data/sig/shims/parser/3.2.0.1/manifest.yaml +7 -0
- data/sig/shims/parser/3.2.0.1/parser.rbs +201 -0
- data/sig/shims/parser/3.2.0.1/polyfill.rbs +4 -0
- data/sig/shims/thor/1.2.0.1/.rbs_meta.yaml +9 -0
- data/sig/shims/thor/1.2.0.1/manifest.yaml +7 -0
- data/sig/shims/thor/1.2.0.1/thor.rbs +17 -0
- data/solargraph.gemspec +32 -10
- metadata +237 -37
- data/lib/.rubocop.yml +0 -22
- data/lib/solargraph/cache.rb +0 -77
- data/lib/solargraph/parser/node_methods.rb +0 -83
data/lib/solargraph/pin/block.rb
CHANGED
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
module Solargraph
|
|
4
4
|
module Pin
|
|
5
|
-
class Block <
|
|
5
|
+
class Block < Callable
|
|
6
|
+
include Breakable
|
|
7
|
+
|
|
6
8
|
# @return [Parser::AST::Node]
|
|
7
9
|
attr_reader :receiver
|
|
8
10
|
|
|
@@ -14,10 +16,9 @@ module Solargraph
|
|
|
14
16
|
# @param context [ComplexType, nil]
|
|
15
17
|
# @param args [::Array<Parameter>]
|
|
16
18
|
def initialize receiver: nil, args: [], context: nil, node: nil, **splat
|
|
17
|
-
super(**splat)
|
|
19
|
+
super(**splat, parameters: args)
|
|
18
20
|
@receiver = receiver
|
|
19
21
|
@context = context
|
|
20
|
-
@parameters = args
|
|
21
22
|
@return_type = ComplexType.parse('::Proc')
|
|
22
23
|
@node = node
|
|
23
24
|
end
|
|
@@ -32,38 +33,19 @@ module Solargraph
|
|
|
32
33
|
@rebind&.defined? ? @rebind : closure.binder
|
|
33
34
|
end
|
|
34
35
|
|
|
35
|
-
# @return [::Array<Parameter>]
|
|
36
|
-
def parameters
|
|
37
|
-
@parameters ||= []
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
# @return [::Array<String>]
|
|
41
|
-
def parameter_names
|
|
42
|
-
@parameter_names ||= parameters.map(&:name)
|
|
43
|
-
end
|
|
44
|
-
|
|
45
36
|
# @param yield_types [::Array<ComplexType>]
|
|
46
37
|
# @param parameters [::Array<Parameter>]
|
|
47
38
|
#
|
|
48
39
|
# @return [::Array<ComplexType>]
|
|
49
40
|
def destructure_yield_types(yield_types, parameters)
|
|
50
|
-
return yield_types if yield_types.length == parameters.length
|
|
51
|
-
|
|
52
41
|
# yielding a tuple into a block will destructure the tuple
|
|
53
42
|
if yield_types.length == 1
|
|
54
43
|
yield_type = yield_types.first
|
|
55
44
|
return yield_type.all_params if yield_type.tuple? && yield_type.all_params.length == parameters.length
|
|
56
45
|
end
|
|
57
|
-
parameters.map { ComplexType::UNDEFINED }
|
|
46
|
+
parameters.map.with_index { |_, idx| yield_types[idx] || ComplexType::UNDEFINED }
|
|
58
47
|
end
|
|
59
48
|
|
|
60
|
-
# @todo the next step with parameters, arguments, destructuring,
|
|
61
|
-
# kwargs, etc logic is probably either creating a Parameters
|
|
62
|
-
# or Callable pin that encapsulates and shares the logic
|
|
63
|
-
# between methods, blocks and signatures. It could live in
|
|
64
|
-
# Signature if Method didn't also own potentially different
|
|
65
|
-
# set of parameters, generics and return types.
|
|
66
|
-
|
|
67
49
|
# @param api_map [ApiMap]
|
|
68
50
|
# @return [::Array<ComplexType>]
|
|
69
51
|
def typify_parameters(api_map)
|
|
@@ -72,6 +54,7 @@ module Solargraph
|
|
|
72
54
|
locals = clip.locals - [self]
|
|
73
55
|
meths = chain.define(api_map, closure, locals)
|
|
74
56
|
# @todo Convert logic to use signatures
|
|
57
|
+
# @param meth [Pin::Method]
|
|
75
58
|
meths.each do |meth|
|
|
76
59
|
next if meth.block.nil?
|
|
77
60
|
|
|
@@ -87,7 +70,7 @@ module Solargraph
|
|
|
87
70
|
namespace_pin = api_map.get_namespace_pins(meth.namespace, closure.namespace).first
|
|
88
71
|
arg_type.resolve_generics(namespace_pin, param_type)
|
|
89
72
|
else
|
|
90
|
-
arg_type.
|
|
73
|
+
arg_type.self_to_type(chain.base.infer(api_map, self, locals)).qualify(api_map, *meth.gates)
|
|
91
74
|
end
|
|
92
75
|
end
|
|
93
76
|
end
|
|
@@ -105,7 +88,7 @@ module Solargraph
|
|
|
105
88
|
|
|
106
89
|
chain = Parser.chain(receiver, location.filename)
|
|
107
90
|
locals = api_map.source_map(location.filename).locals_at(location)
|
|
108
|
-
receiver_pin = chain.define(api_map,
|
|
91
|
+
receiver_pin = chain.define(api_map, closure, locals).first
|
|
109
92
|
return ComplexType::UNDEFINED unless receiver_pin
|
|
110
93
|
|
|
111
94
|
types = receiver_pin.docstring.tag(:yieldreceiver)&.types
|
|
@@ -114,7 +97,7 @@ module Solargraph
|
|
|
114
97
|
target = chain.base.infer(api_map, receiver_pin, locals)
|
|
115
98
|
target = full_context unless target.defined?
|
|
116
99
|
|
|
117
|
-
ComplexType.try_parse(*types).qualify(api_map, receiver_pin.
|
|
100
|
+
ComplexType.try_parse(*types).qualify(api_map, *receiver_pin.gates).self_to_type(target)
|
|
118
101
|
end
|
|
119
102
|
end
|
|
120
103
|
end
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Callable < Closure
|
|
6
|
+
# @return [Signature]
|
|
7
|
+
attr_reader :block
|
|
8
|
+
|
|
9
|
+
attr_accessor :parameters
|
|
10
|
+
|
|
11
|
+
# @return [ComplexType, nil]
|
|
12
|
+
attr_reader :return_type
|
|
13
|
+
|
|
14
|
+
# @param block [Signature, nil]
|
|
15
|
+
# @param return_type [ComplexType, nil]
|
|
16
|
+
# @param parameters [::Array<Pin::Parameter>]
|
|
17
|
+
def initialize block: nil, return_type: nil, parameters: [], **splat
|
|
18
|
+
super(**splat)
|
|
19
|
+
@block = block
|
|
20
|
+
@return_type = return_type
|
|
21
|
+
@parameters = parameters
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [String]
|
|
25
|
+
def method_namespace
|
|
26
|
+
closure.namespace
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @param other [self]
|
|
30
|
+
#
|
|
31
|
+
# @return [Pin::Signature, nil]
|
|
32
|
+
def combine_blocks(other)
|
|
33
|
+
if block.nil?
|
|
34
|
+
other.block
|
|
35
|
+
elsif other.block.nil?
|
|
36
|
+
block
|
|
37
|
+
else
|
|
38
|
+
# @type [Pin::Signature, nil]
|
|
39
|
+
choose_pin_attr(other, :block)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @param other [self]
|
|
44
|
+
# @param attrs [Hash{Symbol => Object}]
|
|
45
|
+
#
|
|
46
|
+
# @return [self]
|
|
47
|
+
def combine_with(other, attrs={})
|
|
48
|
+
new_attrs = {
|
|
49
|
+
block: combine_blocks(other),
|
|
50
|
+
return_type: combine_return_type(other),
|
|
51
|
+
}.merge(attrs)
|
|
52
|
+
new_attrs[:parameters] = choose_parameters(other).clone.freeze unless new_attrs.key?(:parameters)
|
|
53
|
+
super(other, new_attrs)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# @return [::Array<String>]
|
|
57
|
+
def parameter_names
|
|
58
|
+
@parameter_names ||= parameters.map(&:name)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def generics
|
|
62
|
+
[]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# @param other [self]
|
|
66
|
+
#
|
|
67
|
+
# @return [Array<Pin::Parameter>]
|
|
68
|
+
def choose_parameters(other)
|
|
69
|
+
raise "Trying to combine two pins with different arities - \nself =#{inspect}, \nother=#{other.inspect}, \n\n self.arity=#{self.arity}, \nother.arity=#{other.arity}" if other.arity != arity
|
|
70
|
+
# @param param [Pin::Parameter]
|
|
71
|
+
# @param other_param [Pin::Parameter]
|
|
72
|
+
parameters.zip(other.parameters).map do |param, other_param|
|
|
73
|
+
if param.nil? && other_param.block?
|
|
74
|
+
other_param
|
|
75
|
+
elsif other_param.nil? && param.block?
|
|
76
|
+
param
|
|
77
|
+
else
|
|
78
|
+
param.combine_with(other_param)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @return [Array<Pin::Parameter>]
|
|
84
|
+
def blockless_parameters
|
|
85
|
+
if parameters.last&.block?
|
|
86
|
+
parameters[0..-2]
|
|
87
|
+
else
|
|
88
|
+
parameters
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# @return [Array]
|
|
93
|
+
def arity
|
|
94
|
+
[generics, blockless_parameters.map(&:arity_decl), block&.arity]
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# @param generics_to_resolve [Enumerable<String>]
|
|
98
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
99
|
+
# @param return_type_context [ComplexType, nil]
|
|
100
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
101
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
102
|
+
# @param context [ComplexType, nil]
|
|
103
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
104
|
+
# @return [self]
|
|
105
|
+
def resolve_generics_from_context(generics_to_resolve,
|
|
106
|
+
arg_types = nil,
|
|
107
|
+
return_type_context = nil,
|
|
108
|
+
yield_arg_types = nil,
|
|
109
|
+
yield_return_type_context = nil,
|
|
110
|
+
resolved_generic_values: {})
|
|
111
|
+
callable = super(generics_to_resolve, return_type_context, resolved_generic_values: resolved_generic_values)
|
|
112
|
+
callable.parameters = callable.parameters.each_with_index.map do |param, i|
|
|
113
|
+
if arg_types.nil?
|
|
114
|
+
param.dup
|
|
115
|
+
else
|
|
116
|
+
param.resolve_generics_from_context(generics_to_resolve,
|
|
117
|
+
arg_types[i],
|
|
118
|
+
resolved_generic_values: resolved_generic_values)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
callable.block = block.resolve_generics_from_context(generics_to_resolve,
|
|
122
|
+
yield_arg_types,
|
|
123
|
+
yield_return_type_context,
|
|
124
|
+
resolved_generic_values: resolved_generic_values) if callable.block?
|
|
125
|
+
callable
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def typify api_map
|
|
129
|
+
type = super
|
|
130
|
+
return type if type.defined?
|
|
131
|
+
if method_name.end_with?('?')
|
|
132
|
+
logger.debug { "Callable#typify(self=#{self}) => Boolean (? suffix)" }
|
|
133
|
+
ComplexType::BOOLEAN
|
|
134
|
+
else
|
|
135
|
+
logger.debug { "Callable#typify(self=#{self}) => undefined" }
|
|
136
|
+
ComplexType::UNDEFINED
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# @return [String]
|
|
141
|
+
def method_name
|
|
142
|
+
raise "closure was nil in #{self.inspect}" if closure.nil?
|
|
143
|
+
@method_name ||= closure.name
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
# @param generics_to_resolve [::Array<String>]
|
|
147
|
+
# @param arg_types [Array<ComplexType>, nil]
|
|
148
|
+
# @param return_type_context [ComplexType, nil]
|
|
149
|
+
# @param yield_arg_types [Array<ComplexType>, nil]
|
|
150
|
+
# @param yield_return_type_context [ComplexType, nil]
|
|
151
|
+
# @param context [ComplexType, nil]
|
|
152
|
+
# @param resolved_generic_values [Hash{String => ComplexType}]
|
|
153
|
+
# @return [self]
|
|
154
|
+
def resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
155
|
+
arg_types = nil,
|
|
156
|
+
return_type_context = nil,
|
|
157
|
+
yield_arg_types = nil,
|
|
158
|
+
yield_return_type_context = nil,
|
|
159
|
+
resolved_generic_values: {})
|
|
160
|
+
# See
|
|
161
|
+
# https://github.com/soutaro/steep/tree/master/lib/steep/type_inference
|
|
162
|
+
# and
|
|
163
|
+
# https://github.com/sorbet/sorbet/blob/master/infer/inference.cc
|
|
164
|
+
# for other implementations
|
|
165
|
+
|
|
166
|
+
return self if generics_to_resolve.empty?
|
|
167
|
+
|
|
168
|
+
last_resolved_generic_values = resolved_generic_values.dup
|
|
169
|
+
new_pin = resolve_generics_from_context(generics_to_resolve,
|
|
170
|
+
arg_types,
|
|
171
|
+
return_type_context,
|
|
172
|
+
yield_arg_types,
|
|
173
|
+
yield_return_type_context,
|
|
174
|
+
resolved_generic_values: resolved_generic_values)
|
|
175
|
+
if last_resolved_generic_values == resolved_generic_values
|
|
176
|
+
# erase anything unresolved
|
|
177
|
+
return new_pin.erase_generics(self.generics)
|
|
178
|
+
end
|
|
179
|
+
new_pin.resolve_generics_from_context_until_complete(generics_to_resolve,
|
|
180
|
+
arg_types,
|
|
181
|
+
return_type_context,
|
|
182
|
+
yield_arg_types,
|
|
183
|
+
yield_return_type_context,
|
|
184
|
+
resolved_generic_values: resolved_generic_values)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
# @return [Array<String>]
|
|
188
|
+
# @yieldparam [ComplexType]
|
|
189
|
+
# @yieldreturn [ComplexType]
|
|
190
|
+
# @return [self]
|
|
191
|
+
def transform_types(&transform)
|
|
192
|
+
# @todo 'super' alone should work here I think, but doesn't typecheck at level typed
|
|
193
|
+
callable = super(&transform)
|
|
194
|
+
callable.block = block.transform_types(&transform) if block?
|
|
195
|
+
callable.parameters = parameters.map do |param|
|
|
196
|
+
param.transform_types(&transform)
|
|
197
|
+
end
|
|
198
|
+
callable
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
# @param arguments [::Array<Chain>]
|
|
202
|
+
# @param with_block [Boolean]
|
|
203
|
+
# @return [Boolean]
|
|
204
|
+
def arity_matches? arguments, with_block
|
|
205
|
+
argcount = arguments.length
|
|
206
|
+
parcount = mandatory_positional_param_count
|
|
207
|
+
parcount -= 1 if !parameters.empty? && parameters.last.block?
|
|
208
|
+
return false if block? && !with_block
|
|
209
|
+
return false if argcount < parcount && !(argcount == parcount - 1 && parameters.last.restarg?)
|
|
210
|
+
true
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
# @return [Integer]
|
|
214
|
+
def mandatory_positional_param_count
|
|
215
|
+
parameters.count(&:arg?)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def to_rbs
|
|
219
|
+
rbs_generics + '(' + parameters.map { |param| param.to_rbs }.join(', ') + ') ' + (block.nil? ? '' : '{ ' + block.to_rbs + ' } ') + '-> ' + return_type.to_rbs
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def block?
|
|
223
|
+
!!@block
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
protected
|
|
227
|
+
|
|
228
|
+
attr_writer :block
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
@@ -8,17 +8,36 @@ module Solargraph
|
|
|
8
8
|
|
|
9
9
|
# @param scope [::Symbol] :class or :instance
|
|
10
10
|
# @param generics [::Array<Pin::Parameter>, nil]
|
|
11
|
-
|
|
11
|
+
# @param generic_defaults [Hash{String => ComplexType}]
|
|
12
|
+
def initialize scope: :class, generics: nil, generic_defaults: {}, **splat
|
|
12
13
|
super(**splat)
|
|
13
14
|
@scope = scope
|
|
14
15
|
@generics = generics
|
|
16
|
+
@generic_defaults = generic_defaults
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [Hash{String => ComplexType}]
|
|
20
|
+
def generic_defaults
|
|
21
|
+
@generic_defaults ||= {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @param other [self]
|
|
25
|
+
# @param attrs [Hash{Symbol => Object}]
|
|
26
|
+
#
|
|
27
|
+
# @return [self]
|
|
28
|
+
def combine_with(other, attrs={})
|
|
29
|
+
new_attrs = {
|
|
30
|
+
scope: assert_same(other, :scope),
|
|
31
|
+
generics: generics.empty? ? other.generics : generics,
|
|
32
|
+
}.merge(attrs)
|
|
33
|
+
super(other, new_attrs)
|
|
15
34
|
end
|
|
16
35
|
|
|
17
36
|
def context
|
|
18
37
|
@context ||= begin
|
|
19
38
|
result = super
|
|
20
39
|
if scope == :instance
|
|
21
|
-
|
|
40
|
+
result.reduce_class_type
|
|
22
41
|
else
|
|
23
42
|
result
|
|
24
43
|
end
|
|
@@ -29,23 +48,24 @@ module Solargraph
|
|
|
29
48
|
@binder || context
|
|
30
49
|
end
|
|
31
50
|
|
|
32
|
-
# @
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
# root pin
|
|
36
|
-
closure ? closure.gates : ['']
|
|
37
|
-
end
|
|
51
|
+
# @param api_map [Solargraph::ApiMap]
|
|
52
|
+
# @return [void]
|
|
53
|
+
def rebind api_map; end
|
|
38
54
|
|
|
39
55
|
# @return [::Array<String>]
|
|
40
56
|
def generics
|
|
41
57
|
@generics ||= docstring.tags(:generic).map(&:name)
|
|
42
58
|
end
|
|
43
59
|
|
|
60
|
+
def to_rbs
|
|
61
|
+
rbs_generics + return_type.to_rbs
|
|
62
|
+
end
|
|
63
|
+
|
|
44
64
|
# @return [String]
|
|
45
|
-
def
|
|
65
|
+
def rbs_generics
|
|
46
66
|
return '' if generics.empty?
|
|
47
67
|
|
|
48
|
-
generics.join(', ') + ' '
|
|
68
|
+
'[' + generics.map { |gen| gen.to_s }.join(', ') + '] '
|
|
49
69
|
end
|
|
50
70
|
end
|
|
51
71
|
end
|
|
@@ -3,11 +3,20 @@
|
|
|
3
3
|
module Solargraph
|
|
4
4
|
module Pin
|
|
5
5
|
module Common
|
|
6
|
+
# @!method source
|
|
7
|
+
# @abstract
|
|
8
|
+
# @return [Source, nil]
|
|
9
|
+
# @type @closure [Pin::Closure, nil]
|
|
10
|
+
|
|
6
11
|
# @return [Location]
|
|
7
12
|
attr_reader :location
|
|
8
13
|
|
|
14
|
+
# @sg-ignore Solargraph::Pin::Common#closure return type could not be inferred
|
|
9
15
|
# @return [Pin::Closure, nil]
|
|
10
|
-
|
|
16
|
+
def closure
|
|
17
|
+
Solargraph.assert_or_log(:closure, "Closure not set on #{self.class} #{name.inspect} from #{source.inspect}") unless @closure
|
|
18
|
+
@closure
|
|
19
|
+
end
|
|
11
20
|
|
|
12
21
|
# @return [String]
|
|
13
22
|
def name
|
|
@@ -19,7 +28,7 @@ module Solargraph
|
|
|
19
28
|
@return_type ||= ComplexType::UNDEFINED
|
|
20
29
|
end
|
|
21
30
|
|
|
22
|
-
# @return [ComplexType
|
|
31
|
+
# @return [ComplexType]
|
|
23
32
|
def context
|
|
24
33
|
# Get the static context from the nearest namespace
|
|
25
34
|
@context ||= find_context
|
|
@@ -59,11 +68,7 @@ module Solargraph
|
|
|
59
68
|
if here.is_a?(Pin::Namespace)
|
|
60
69
|
return here.return_type
|
|
61
70
|
elsif here.is_a?(Pin::Method)
|
|
62
|
-
|
|
63
|
-
return ComplexType.try_parse(here.context.tag)
|
|
64
|
-
else
|
|
65
|
-
return here.context
|
|
66
|
-
end
|
|
71
|
+
return here.context
|
|
67
72
|
end
|
|
68
73
|
here = here.closure
|
|
69
74
|
end
|
|
@@ -5,6 +5,8 @@ module Solargraph
|
|
|
5
5
|
class Constant < BaseVariable
|
|
6
6
|
attr_reader :visibility
|
|
7
7
|
|
|
8
|
+
# @param visibility [::Symbol] The visibility of the constant (:public, :protected, or :private)
|
|
9
|
+
# @param splat [Hash] Additional options supported by superclasses
|
|
8
10
|
def initialize visibility: :public, **splat
|
|
9
11
|
super(**splat)
|
|
10
12
|
@visibility = visibility
|
|
@@ -87,7 +87,7 @@ module Solargraph
|
|
|
87
87
|
|
|
88
88
|
# @return [String, nil]
|
|
89
89
|
def text_documentation
|
|
90
|
-
this_path = path || return_type.tag
|
|
90
|
+
this_path = path || name || return_type.tag
|
|
91
91
|
return nil if this_path == 'undefined'
|
|
92
92
|
escape_brackets this_path
|
|
93
93
|
end
|
|
@@ -105,9 +105,10 @@ module Solargraph
|
|
|
105
105
|
|
|
106
106
|
# @return [String, nil]
|
|
107
107
|
def generate_link
|
|
108
|
-
this_path = path || return_type.tag
|
|
108
|
+
this_path = path || name || return_type.tag
|
|
109
109
|
return nil if this_path == 'undefined'
|
|
110
110
|
return nil if this_path.nil? || this_path == 'undefined'
|
|
111
|
+
return this_path if path.nil?
|
|
111
112
|
"[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
|
|
112
113
|
end
|
|
113
114
|
|
|
@@ -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.
|
|
@@ -18,9 +18,9 @@ module Solargraph
|
|
|
18
18
|
@context ||= begin
|
|
19
19
|
result = super
|
|
20
20
|
if scope == :class
|
|
21
|
-
ComplexType.parse("Class<#{result.
|
|
21
|
+
ComplexType.parse("::Class<#{result.rooted_namespace}>")
|
|
22
22
|
else
|
|
23
|
-
|
|
23
|
+
result.reduce_class_type
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
end
|
|
@@ -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,20 +6,29 @@ 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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
24
|
+
def combine_with(other, attrs={})
|
|
25
|
+
new_attrs = {
|
|
26
|
+
assignment: assert_same(other, :assignment),
|
|
27
|
+
presence_certain: assert_same(other, :presence_certain?),
|
|
28
|
+
}.merge(attrs)
|
|
29
|
+
new_attrs[:presence] = assert_same(other, :presence) unless attrs.key?(:presence)
|
|
30
|
+
|
|
31
|
+
super(other, new_attrs)
|
|
23
32
|
end
|
|
24
33
|
|
|
25
34
|
# @param other_closure [Pin::Closure]
|
|
@@ -30,7 +39,6 @@ module Solargraph
|
|
|
30
39
|
match_named_closure(other_closure, closure)
|
|
31
40
|
end
|
|
32
41
|
|
|
33
|
-
# @return [String]
|
|
34
42
|
def to_rbs
|
|
35
43
|
(name || '(anon)') + ' ' + (return_type&.to_rbs || 'untyped')
|
|
36
44
|
end
|