solargraph 0.44.2 → 0.46.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/rspec.yml +41 -0
- data/.gitignore +9 -9
- data/.rspec +2 -2
- data/.travis.yml +19 -19
- data/CHANGELOG.md +1115 -1088
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +128 -120
- data/Rakefile +0 -0
- data/SPONSORS.md +18 -15
- data/bin/solargraph +0 -0
- data/lib/solargraph/api_map/bundler_methods.rb +22 -22
- data/lib/solargraph/api_map/cache.rb +70 -70
- data/lib/solargraph/api_map/source_to_yard.rb +81 -81
- data/lib/solargraph/api_map/store.rb +256 -256
- data/lib/solargraph/api_map.rb +686 -681
- data/lib/solargraph/bench.rb +27 -27
- data/lib/solargraph/compat.rb +37 -37
- data/lib/solargraph/complex_type/type_methods.rb +130 -130
- data/lib/solargraph/complex_type/unique_type.rb +75 -75
- data/lib/solargraph/complex_type.rb +221 -221
- data/lib/solargraph/convention/base.rb +33 -33
- data/lib/solargraph/convention/gemfile.rb +15 -15
- data/lib/solargraph/convention/gemspec.rb +22 -22
- data/lib/solargraph/convention/rspec.rb +30 -21
- data/lib/solargraph/convention.rb +47 -47
- data/lib/solargraph/converters/dd.rb +12 -12
- data/lib/solargraph/converters/dl.rb +12 -12
- data/lib/solargraph/converters/dt.rb +12 -12
- data/lib/solargraph/converters/misc.rb +1 -1
- data/lib/solargraph/diagnostics/base.rb +29 -29
- data/lib/solargraph/diagnostics/require_not_found.rb +53 -37
- data/lib/solargraph/diagnostics/rubocop.rb +98 -98
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +63 -63
- data/lib/solargraph/diagnostics/severities.rb +15 -15
- data/lib/solargraph/diagnostics/type_check.rb +54 -54
- data/lib/solargraph/diagnostics/update_errors.rb +41 -41
- data/lib/solargraph/diagnostics.rb +55 -55
- data/lib/solargraph/documentor.rb +76 -76
- data/lib/solargraph/environ.rb +45 -45
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -35
- data/lib/solargraph/language_server/error_codes.rb +20 -20
- data/lib/solargraph/language_server/host/cataloger.rb +56 -56
- data/lib/solargraph/language_server/host/diagnoser.rb +89 -89
- data/lib/solargraph/language_server/host/dispatch.rb +111 -111
- data/lib/solargraph/language_server/host/message_worker.rb +59 -59
- data/lib/solargraph/language_server/host/sources.rb +156 -156
- data/lib/solargraph/language_server/host.rb +865 -865
- data/lib/solargraph/language_server/message/base.rb +89 -89
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -13
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -15
- data/lib/solargraph/language_server/message/client.rb +11 -11
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +58 -58
- data/lib/solargraph/language_server/message/completion_item.rb +11 -11
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -13
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +100 -100
- data/lib/solargraph/language_server/message/extended/document.rb +20 -20
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -32
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -23
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -25
- data/lib/solargraph/language_server/message/extended/search.rb +20 -20
- data/lib/solargraph/language_server/message/extended.rb +21 -21
- data/lib/solargraph/language_server/message/initialize.rb +162 -162
- data/lib/solargraph/language_server/message/initialized.rb +27 -27
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -16
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -14
- data/lib/solargraph/language_server/message/shutdown.rb +13 -13
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/completion.rb +59 -59
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -38
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -15
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -17
- data/lib/solargraph/language_server/message/text_document/document_highlight.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -26
- data/lib/solargraph/language_server/message/text_document/formatting.rb +126 -126
- data/lib/solargraph/language_server/message/text_document/hover.rb +54 -44
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -34
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -11
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -16
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -19
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -29
- data/lib/solargraph/language_server/message/text_document.rb +28 -28
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +30 -30
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -33
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -24
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -23
- data/lib/solargraph/language_server/message/workspace.rb +14 -14
- data/lib/solargraph/language_server/message.rb +93 -93
- data/lib/solargraph/language_server/message_types.rb +14 -14
- data/lib/solargraph/language_server/request.rb +24 -24
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -36
- data/lib/solargraph/language_server/transport/adapter.rb +53 -53
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -72
- data/lib/solargraph/language_server/transport.rb +13 -13
- data/lib/solargraph/language_server/uri_helpers.rb +49 -49
- data/lib/solargraph/language_server.rb +19 -19
- data/lib/solargraph/library.rb +546 -546
- data/lib/solargraph/location.rb +37 -37
- data/lib/solargraph/logging.rb +27 -27
- data/lib/solargraph/page.rb +83 -83
- data/lib/solargraph/parser/comment_ripper.rb +52 -52
- data/lib/solargraph/parser/legacy/class_methods.rb +135 -140
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -16
- data/lib/solargraph/parser/legacy/node_chainer.rb +148 -148
- data/lib/solargraph/parser/legacy/node_methods.rb +325 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -25
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -63
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -28
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -16
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -36
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +257 -257
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -54
- data/lib/solargraph/parser/legacy.rb +12 -12
- data/lib/solargraph/parser/node_methods.rb +43 -43
- data/lib/solargraph/parser/node_processor/base.rb +77 -77
- data/lib/solargraph/parser/node_processor.rb +43 -43
- data/lib/solargraph/parser/region.rb +66 -66
- data/lib/solargraph/parser/rubyvm/class_methods.rb +144 -155
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +160 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +315 -315
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +85 -85
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +42 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -22
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +63 -64
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +26 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +277 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +63 -62
- data/lib/solargraph/parser/rubyvm.rb +40 -40
- data/lib/solargraph/parser/snippet.rb +13 -13
- data/lib/solargraph/parser.rb +26 -26
- data/lib/solargraph/pin/base.rb +296 -296
- data/lib/solargraph/pin/base_variable.rb +84 -84
- data/lib/solargraph/pin/block.rb +72 -72
- data/lib/solargraph/pin/class_variable.rb +8 -8
- data/lib/solargraph/pin/closure.rb +37 -37
- data/lib/solargraph/pin/common.rb +70 -70
- data/lib/solargraph/pin/constant.rb +43 -43
- data/lib/solargraph/pin/conversions.rb +96 -96
- data/lib/solargraph/pin/documenting.rb +105 -105
- data/lib/solargraph/pin/duck_method.rb +16 -16
- data/lib/solargraph/pin/global_variable.rb +8 -8
- data/lib/solargraph/pin/instance_variable.rb +30 -30
- data/lib/solargraph/pin/keyword.rb +15 -15
- data/lib/solargraph/pin/keyword_param.rb +8 -8
- data/lib/solargraph/pin/local_variable.rb +55 -55
- data/lib/solargraph/pin/method.rb +245 -245
- data/lib/solargraph/pin/method_alias.rb +31 -31
- data/lib/solargraph/pin/namespace.rb +91 -91
- data/lib/solargraph/pin/parameter.rb +201 -206
- data/lib/solargraph/pin/proxy_type.rb +29 -29
- data/lib/solargraph/pin/reference/extend.rb +10 -10
- data/lib/solargraph/pin/reference/include.rb +10 -10
- data/lib/solargraph/pin/reference/override.rb +29 -29
- data/lib/solargraph/pin/reference/prepend.rb +10 -10
- data/lib/solargraph/pin/reference/require.rb +14 -14
- data/lib/solargraph/pin/reference/superclass.rb +10 -10
- data/lib/solargraph/pin/reference.rb +14 -14
- data/lib/solargraph/pin/search.rb +56 -0
- data/lib/solargraph/pin/singleton.rb +11 -11
- data/lib/solargraph/pin/symbol.rb +47 -47
- data/lib/solargraph/pin.rb +37 -36
- data/lib/solargraph/position.rb +100 -100
- data/lib/solargraph/range.rb +95 -95
- data/lib/solargraph/server_methods.rb +16 -16
- data/lib/solargraph/shell.rb +226 -226
- data/lib/solargraph/source/chain/block_variable.rb +13 -13
- data/lib/solargraph/source/chain/call.rb +204 -204
- data/lib/solargraph/source/chain/class_variable.rb +13 -13
- data/lib/solargraph/source/chain/constant.rb +75 -75
- data/lib/solargraph/source/chain/global_variable.rb +13 -13
- data/lib/solargraph/source/chain/hash.rb +28 -28
- data/lib/solargraph/source/chain/head.rb +19 -19
- data/lib/solargraph/source/chain/instance_variable.rb +13 -13
- data/lib/solargraph/source/chain/link.rb +71 -71
- data/lib/solargraph/source/chain/literal.rb +23 -23
- data/lib/solargraph/source/chain/or.rb +23 -23
- data/lib/solargraph/source/chain/q_call.rb +11 -11
- data/lib/solargraph/source/chain/variable.rb +13 -13
- data/lib/solargraph/source/chain/z_super.rb +30 -30
- data/lib/solargraph/source/chain.rb +164 -164
- data/lib/solargraph/source/change.rb +79 -79
- data/lib/solargraph/source/cursor.rb +164 -164
- data/lib/solargraph/source/source_chainer.rb +191 -191
- data/lib/solargraph/source/updater.rb +54 -54
- data/lib/solargraph/source.rb +522 -522
- data/lib/solargraph/source_map/clip.rb +224 -224
- data/lib/solargraph/source_map/completion.rb +23 -23
- data/lib/solargraph/source_map/mapper.rb +212 -212
- data/lib/solargraph/source_map.rb +180 -189
- data/lib/solargraph/type_checker/checks.rb +99 -99
- data/lib/solargraph/type_checker/param_def.rb +35 -35
- data/lib/solargraph/type_checker/problem.rb +32 -32
- data/lib/solargraph/type_checker/rules.rb +57 -57
- data/lib/solargraph/type_checker.rb +543 -510
- data/lib/solargraph/version.rb +5 -5
- data/lib/solargraph/views/environment.erb +58 -58
- data/lib/solargraph/workspace/config.rb +231 -231
- data/lib/solargraph/workspace.rb +215 -214
- data/lib/solargraph/yard_map/cache.rb +19 -19
- data/lib/solargraph/yard_map/core_docs.rb +170 -170
- data/lib/solargraph/yard_map/core_fills.rb +208 -203
- data/lib/solargraph/yard_map/core_gen.rb +76 -76
- data/lib/solargraph/yard_map/helpers.rb +16 -16
- data/lib/solargraph/yard_map/mapper/to_constant.rb +25 -25
- data/lib/solargraph/yard_map/mapper/to_method.rb +78 -78
- data/lib/solargraph/yard_map/mapper/to_namespace.rb +27 -27
- data/lib/solargraph/yard_map/mapper.rb +77 -77
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +140 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +43 -43
- data/lib/solargraph/yard_map/to_method.rb +79 -79
- data/lib/solargraph/yard_map.rb +460 -443
- data/lib/solargraph.rb +69 -69
- data/lib/yard-solargraph.rb +33 -33
- data/solargraph.gemspec +0 -0
- metadata +14 -12
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
# The base class for method and attribute pins.
|
|
6
|
-
#
|
|
7
|
-
class Method < Closure
|
|
8
|
-
include Solargraph::Parser::NodeMethods
|
|
9
|
-
|
|
10
|
-
# @return [Array<Pin::Parameter>]
|
|
11
|
-
attr_reader :parameters
|
|
12
|
-
|
|
13
|
-
# @return [::Symbol] :public, :private, or :protected
|
|
14
|
-
attr_reader :visibility
|
|
15
|
-
|
|
16
|
-
# @return [Parser::AST::Node]
|
|
17
|
-
attr_reader :node
|
|
18
|
-
|
|
19
|
-
# @param visibility [::Symbol] :public, :protected, or :private
|
|
20
|
-
# @param explicit [Boolean]
|
|
21
|
-
def initialize visibility: :public, explicit: true, parameters: [], node: nil, attribute: false, **splat
|
|
22
|
-
super(**splat)
|
|
23
|
-
@visibility = visibility
|
|
24
|
-
@explicit = explicit
|
|
25
|
-
@parameters = parameters
|
|
26
|
-
@node = node
|
|
27
|
-
@attribute = attribute
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
# @return [Array<String>]
|
|
31
|
-
def parameter_names
|
|
32
|
-
@parameter_names ||= parameters.map(&:name)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def completion_item_kind
|
|
36
|
-
attribute? ? Solargraph::LanguageServer::CompletionItemKinds::PROPERTY : Solargraph::LanguageServer::CompletionItemKinds::METHOD
|
|
37
|
-
end
|
|
38
|
-
|
|
39
|
-
def symbol_kind
|
|
40
|
-
attribute? ? Solargraph::LanguageServer::SymbolKinds::PROPERTY : LanguageServer::SymbolKinds::METHOD
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def return_type
|
|
44
|
-
@return_type ||= generate_complex_type
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def path
|
|
48
|
-
@path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def typify api_map
|
|
52
|
-
decl = super
|
|
53
|
-
return decl unless decl.undefined?
|
|
54
|
-
type = see_reference(api_map) || typify_from_super(api_map)
|
|
55
|
-
return type.qualify(api_map, namespace) unless type.nil?
|
|
56
|
-
name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def documentation
|
|
60
|
-
if @documentation.nil?
|
|
61
|
-
@documentation ||= super || ''
|
|
62
|
-
param_tags = docstring.tags(:param)
|
|
63
|
-
unless param_tags.nil? or param_tags.empty?
|
|
64
|
-
@documentation += "\n\n" unless @documentation.empty?
|
|
65
|
-
@documentation += "Params:\n"
|
|
66
|
-
lines = []
|
|
67
|
-
param_tags.each do |p|
|
|
68
|
-
l = "* #{p.name}"
|
|
69
|
-
l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
|
|
70
|
-
l += " #{p.text}"
|
|
71
|
-
lines.push l
|
|
72
|
-
end
|
|
73
|
-
@documentation += lines.join("\n")
|
|
74
|
-
end
|
|
75
|
-
return_tags = docstring.tags(:return)
|
|
76
|
-
unless return_tags.empty?
|
|
77
|
-
@documentation += "\n\n" unless @documentation.empty?
|
|
78
|
-
@documentation += "Returns:\n"
|
|
79
|
-
lines = []
|
|
80
|
-
return_tags.each do |r|
|
|
81
|
-
l = "*"
|
|
82
|
-
l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
|
|
83
|
-
l += " #{r.text}"
|
|
84
|
-
lines.push l
|
|
85
|
-
end
|
|
86
|
-
@documentation += lines.join("\n")
|
|
87
|
-
end
|
|
88
|
-
@documentation += "\n\n" unless @documentation.empty?
|
|
89
|
-
@documentation += "Visibility: #{visibility}"
|
|
90
|
-
end
|
|
91
|
-
@documentation.to_s
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def explicit?
|
|
95
|
-
@explicit
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def attribute?
|
|
99
|
-
@attribute
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
def nearly? other
|
|
103
|
-
return false unless super
|
|
104
|
-
parameters == other.parameters and
|
|
105
|
-
scope == other.scope and
|
|
106
|
-
visibility == other.visibility
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def probe api_map
|
|
110
|
-
attribute? ? infer_from_iv(api_map) : infer_from_return_nodes(api_map)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def try_merge! pin
|
|
114
|
-
return false unless super
|
|
115
|
-
@node = pin.node
|
|
116
|
-
true
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
# @return [Array<Pin::Method>]
|
|
120
|
-
def overloads
|
|
121
|
-
@overloads ||= docstring.tags(:overload).map do |tag|
|
|
122
|
-
Solargraph::Pin::Method.new(
|
|
123
|
-
name: name,
|
|
124
|
-
closure: self,
|
|
125
|
-
# args: tag.parameters.map(&:first),
|
|
126
|
-
parameters: tag.parameters.map do |src|
|
|
127
|
-
Pin::Parameter.new(
|
|
128
|
-
location: location,
|
|
129
|
-
closure: self,
|
|
130
|
-
comments: tag.docstring.all.to_s,
|
|
131
|
-
name: src.first,
|
|
132
|
-
presence: location ? location.range : nil,
|
|
133
|
-
decl: :arg
|
|
134
|
-
)
|
|
135
|
-
end,
|
|
136
|
-
comments: tag.docstring.all.to_s
|
|
137
|
-
)
|
|
138
|
-
end
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
private
|
|
142
|
-
|
|
143
|
-
# @return [ComplexType]
|
|
144
|
-
def generate_complex_type
|
|
145
|
-
tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
|
|
146
|
-
return ComplexType::UNDEFINED if tags.empty?
|
|
147
|
-
ComplexType.try_parse *tags
|
|
148
|
-
end
|
|
149
|
-
|
|
150
|
-
# @param api_map [ApiMap]
|
|
151
|
-
# @return [ComplexType, nil]
|
|
152
|
-
def see_reference api_map
|
|
153
|
-
docstring.ref_tags.each do |ref|
|
|
154
|
-
next unless ref.tag_name == 'return' && ref.owner
|
|
155
|
-
result = resolve_reference(ref.owner.to_s, api_map)
|
|
156
|
-
return result unless result.nil?
|
|
157
|
-
end
|
|
158
|
-
match = comments.match(/^[ \t]*\(see (.*)\)/m)
|
|
159
|
-
return nil if match.nil?
|
|
160
|
-
resolve_reference match[1], api_map
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
# @param api_map [ApiMap]
|
|
164
|
-
# @return [ComplexType, nil]
|
|
165
|
-
def typify_from_super api_map
|
|
166
|
-
stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
|
|
167
|
-
return nil if stack.empty?
|
|
168
|
-
stack.each do |pin|
|
|
169
|
-
return pin.return_type unless pin.return_type.undefined?
|
|
170
|
-
end
|
|
171
|
-
nil
|
|
172
|
-
end
|
|
173
|
-
|
|
174
|
-
# @param ref [String]
|
|
175
|
-
# @param api_map [ApiMap]
|
|
176
|
-
# @return [ComplexType]
|
|
177
|
-
def resolve_reference ref, api_map
|
|
178
|
-
parts = ref.split(/[\.#]/)
|
|
179
|
-
if parts.first.empty? || parts.one?
|
|
180
|
-
path = "#{namespace}#{ref}"
|
|
181
|
-
else
|
|
182
|
-
fqns = api_map.qualify(parts.first, namespace)
|
|
183
|
-
return ComplexType::UNDEFINED if fqns.nil?
|
|
184
|
-
path = fqns + ref[parts.first.length] + parts.last
|
|
185
|
-
end
|
|
186
|
-
pins = api_map.get_path_pins(path)
|
|
187
|
-
pins.each do |pin|
|
|
188
|
-
type = pin.typify(api_map)
|
|
189
|
-
return type unless type.undefined?
|
|
190
|
-
end
|
|
191
|
-
nil
|
|
192
|
-
end
|
|
193
|
-
|
|
194
|
-
# @return [Parser::AST::Node, nil]
|
|
195
|
-
def method_body_node
|
|
196
|
-
return nil if node.nil?
|
|
197
|
-
return node.children[1].children.last if node.type == :DEFN
|
|
198
|
-
return node.children[2].children.last if node.type == :DEFS
|
|
199
|
-
return node.children[2] if node.type == :def || node.type == :DEFS
|
|
200
|
-
return node.children[3] if node.type == :defs
|
|
201
|
-
nil
|
|
202
|
-
end
|
|
203
|
-
|
|
204
|
-
# @param api_map [ApiMap]
|
|
205
|
-
# @return [ComplexType]
|
|
206
|
-
def infer_from_return_nodes api_map
|
|
207
|
-
return ComplexType::UNDEFINED if node.nil?
|
|
208
|
-
result = []
|
|
209
|
-
has_nil = false
|
|
210
|
-
return ComplexType::NIL if method_body_node.nil?
|
|
211
|
-
returns_from(method_body_node).each do |n|
|
|
212
|
-
if n.nil? || [:NIL, :nil].include?(n.type)
|
|
213
|
-
has_nil = true
|
|
214
|
-
next
|
|
215
|
-
end
|
|
216
|
-
rng = Range.from_node(n)
|
|
217
|
-
next unless rng
|
|
218
|
-
clip = api_map.clip_at(
|
|
219
|
-
location.filename,
|
|
220
|
-
rng.ending
|
|
221
|
-
)
|
|
222
|
-
chain = Solargraph::Parser.chain(n, location.filename)
|
|
223
|
-
type = chain.infer(api_map, self, clip.locals)
|
|
224
|
-
result.push type unless type.undefined?
|
|
225
|
-
end
|
|
226
|
-
result.push ComplexType::NIL if has_nil
|
|
227
|
-
return ComplexType::UNDEFINED if result.empty?
|
|
228
|
-
ComplexType.try_parse(*result.map(&:tag).uniq)
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def infer_from_iv api_map
|
|
232
|
-
types = []
|
|
233
|
-
varname = "@#{name.gsub(/=$/, '')}"
|
|
234
|
-
pins = api_map.get_instance_variable_pins(binder.namespace, binder.scope).select { |iv| iv.name == varname }
|
|
235
|
-
pins.each do |pin|
|
|
236
|
-
type = pin.typify(api_map)
|
|
237
|
-
type = pin.probe(api_map) if type.undefined?
|
|
238
|
-
types.push type if type.defined?
|
|
239
|
-
end
|
|
240
|
-
return ComplexType::UNDEFINED if types.empty?
|
|
241
|
-
ComplexType.try_parse(*types.map(&:tag).uniq)
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
end
|
|
245
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
# The base class for method and attribute pins.
|
|
6
|
+
#
|
|
7
|
+
class Method < Closure
|
|
8
|
+
include Solargraph::Parser::NodeMethods
|
|
9
|
+
|
|
10
|
+
# @return [Array<Pin::Parameter>]
|
|
11
|
+
attr_reader :parameters
|
|
12
|
+
|
|
13
|
+
# @return [::Symbol] :public, :private, or :protected
|
|
14
|
+
attr_reader :visibility
|
|
15
|
+
|
|
16
|
+
# @return [Parser::AST::Node]
|
|
17
|
+
attr_reader :node
|
|
18
|
+
|
|
19
|
+
# @param visibility [::Symbol] :public, :protected, or :private
|
|
20
|
+
# @param explicit [Boolean]
|
|
21
|
+
def initialize visibility: :public, explicit: true, parameters: [], node: nil, attribute: false, **splat
|
|
22
|
+
super(**splat)
|
|
23
|
+
@visibility = visibility
|
|
24
|
+
@explicit = explicit
|
|
25
|
+
@parameters = parameters
|
|
26
|
+
@node = node
|
|
27
|
+
@attribute = attribute
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Array<String>]
|
|
31
|
+
def parameter_names
|
|
32
|
+
@parameter_names ||= parameters.map(&:name)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def completion_item_kind
|
|
36
|
+
attribute? ? Solargraph::LanguageServer::CompletionItemKinds::PROPERTY : Solargraph::LanguageServer::CompletionItemKinds::METHOD
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def symbol_kind
|
|
40
|
+
attribute? ? Solargraph::LanguageServer::SymbolKinds::PROPERTY : LanguageServer::SymbolKinds::METHOD
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def return_type
|
|
44
|
+
@return_type ||= generate_complex_type
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def path
|
|
48
|
+
@path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def typify api_map
|
|
52
|
+
decl = super
|
|
53
|
+
return decl unless decl.undefined?
|
|
54
|
+
type = see_reference(api_map) || typify_from_super(api_map)
|
|
55
|
+
return type.qualify(api_map, namespace) unless type.nil?
|
|
56
|
+
name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def documentation
|
|
60
|
+
if @documentation.nil?
|
|
61
|
+
@documentation ||= super || ''
|
|
62
|
+
param_tags = docstring.tags(:param)
|
|
63
|
+
unless param_tags.nil? or param_tags.empty?
|
|
64
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
65
|
+
@documentation += "Params:\n"
|
|
66
|
+
lines = []
|
|
67
|
+
param_tags.each do |p|
|
|
68
|
+
l = "* #{p.name}"
|
|
69
|
+
l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
|
|
70
|
+
l += " #{p.text}"
|
|
71
|
+
lines.push l
|
|
72
|
+
end
|
|
73
|
+
@documentation += lines.join("\n")
|
|
74
|
+
end
|
|
75
|
+
return_tags = docstring.tags(:return)
|
|
76
|
+
unless return_tags.empty?
|
|
77
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
78
|
+
@documentation += "Returns:\n"
|
|
79
|
+
lines = []
|
|
80
|
+
return_tags.each do |r|
|
|
81
|
+
l = "*"
|
|
82
|
+
l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
|
|
83
|
+
l += " #{r.text}"
|
|
84
|
+
lines.push l
|
|
85
|
+
end
|
|
86
|
+
@documentation += lines.join("\n")
|
|
87
|
+
end
|
|
88
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
89
|
+
@documentation += "Visibility: #{visibility}"
|
|
90
|
+
end
|
|
91
|
+
@documentation.to_s
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def explicit?
|
|
95
|
+
@explicit
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def attribute?
|
|
99
|
+
@attribute
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def nearly? other
|
|
103
|
+
return false unless super
|
|
104
|
+
parameters == other.parameters and
|
|
105
|
+
scope == other.scope and
|
|
106
|
+
visibility == other.visibility
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def probe api_map
|
|
110
|
+
attribute? ? infer_from_iv(api_map) : infer_from_return_nodes(api_map)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def try_merge! pin
|
|
114
|
+
return false unless super
|
|
115
|
+
@node = pin.node
|
|
116
|
+
true
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# @return [Array<Pin::Method>]
|
|
120
|
+
def overloads
|
|
121
|
+
@overloads ||= docstring.tags(:overload).map do |tag|
|
|
122
|
+
Solargraph::Pin::Method.new(
|
|
123
|
+
name: name,
|
|
124
|
+
closure: self,
|
|
125
|
+
# args: tag.parameters.map(&:first),
|
|
126
|
+
parameters: tag.parameters.map do |src|
|
|
127
|
+
Pin::Parameter.new(
|
|
128
|
+
location: location,
|
|
129
|
+
closure: self,
|
|
130
|
+
comments: tag.docstring.all.to_s,
|
|
131
|
+
name: src.first,
|
|
132
|
+
presence: location ? location.range : nil,
|
|
133
|
+
decl: :arg
|
|
134
|
+
)
|
|
135
|
+
end,
|
|
136
|
+
comments: tag.docstring.all.to_s
|
|
137
|
+
)
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
# @return [ComplexType]
|
|
144
|
+
def generate_complex_type
|
|
145
|
+
tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
|
|
146
|
+
return ComplexType::UNDEFINED if tags.empty?
|
|
147
|
+
ComplexType.try_parse *tags
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# @param api_map [ApiMap]
|
|
151
|
+
# @return [ComplexType, nil]
|
|
152
|
+
def see_reference api_map
|
|
153
|
+
docstring.ref_tags.each do |ref|
|
|
154
|
+
next unless ref.tag_name == 'return' && ref.owner
|
|
155
|
+
result = resolve_reference(ref.owner.to_s, api_map)
|
|
156
|
+
return result unless result.nil?
|
|
157
|
+
end
|
|
158
|
+
match = comments.match(/^[ \t]*\(see (.*)\)/m)
|
|
159
|
+
return nil if match.nil?
|
|
160
|
+
resolve_reference match[1], api_map
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# @param api_map [ApiMap]
|
|
164
|
+
# @return [ComplexType, nil]
|
|
165
|
+
def typify_from_super api_map
|
|
166
|
+
stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
|
|
167
|
+
return nil if stack.empty?
|
|
168
|
+
stack.each do |pin|
|
|
169
|
+
return pin.return_type unless pin.return_type.undefined?
|
|
170
|
+
end
|
|
171
|
+
nil
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# @param ref [String]
|
|
175
|
+
# @param api_map [ApiMap]
|
|
176
|
+
# @return [ComplexType]
|
|
177
|
+
def resolve_reference ref, api_map
|
|
178
|
+
parts = ref.split(/[\.#]/)
|
|
179
|
+
if parts.first.empty? || parts.one?
|
|
180
|
+
path = "#{namespace}#{ref}"
|
|
181
|
+
else
|
|
182
|
+
fqns = api_map.qualify(parts.first, namespace)
|
|
183
|
+
return ComplexType::UNDEFINED if fqns.nil?
|
|
184
|
+
path = fqns + ref[parts.first.length] + parts.last
|
|
185
|
+
end
|
|
186
|
+
pins = api_map.get_path_pins(path)
|
|
187
|
+
pins.each do |pin|
|
|
188
|
+
type = pin.typify(api_map)
|
|
189
|
+
return type unless type.undefined?
|
|
190
|
+
end
|
|
191
|
+
nil
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
# @return [Parser::AST::Node, nil]
|
|
195
|
+
def method_body_node
|
|
196
|
+
return nil if node.nil?
|
|
197
|
+
return node.children[1].children.last if node.type == :DEFN
|
|
198
|
+
return node.children[2].children.last if node.type == :DEFS
|
|
199
|
+
return node.children[2] if node.type == :def || node.type == :DEFS
|
|
200
|
+
return node.children[3] if node.type == :defs
|
|
201
|
+
nil
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# @param api_map [ApiMap]
|
|
205
|
+
# @return [ComplexType]
|
|
206
|
+
def infer_from_return_nodes api_map
|
|
207
|
+
return ComplexType::UNDEFINED if node.nil?
|
|
208
|
+
result = []
|
|
209
|
+
has_nil = false
|
|
210
|
+
return ComplexType::NIL if method_body_node.nil?
|
|
211
|
+
returns_from(method_body_node).each do |n|
|
|
212
|
+
if n.nil? || [:NIL, :nil].include?(n.type)
|
|
213
|
+
has_nil = true
|
|
214
|
+
next
|
|
215
|
+
end
|
|
216
|
+
rng = Range.from_node(n)
|
|
217
|
+
next unless rng
|
|
218
|
+
clip = api_map.clip_at(
|
|
219
|
+
location.filename,
|
|
220
|
+
rng.ending
|
|
221
|
+
)
|
|
222
|
+
chain = Solargraph::Parser.chain(n, location.filename)
|
|
223
|
+
type = chain.infer(api_map, self, clip.locals)
|
|
224
|
+
result.push type unless type.undefined?
|
|
225
|
+
end
|
|
226
|
+
result.push ComplexType::NIL if has_nil
|
|
227
|
+
return ComplexType::UNDEFINED if result.empty?
|
|
228
|
+
ComplexType.try_parse(*result.map(&:tag).uniq)
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
def infer_from_iv api_map
|
|
232
|
+
types = []
|
|
233
|
+
varname = "@#{name.gsub(/=$/, '')}"
|
|
234
|
+
pins = api_map.get_instance_variable_pins(binder.namespace, binder.scope).select { |iv| iv.name == varname }
|
|
235
|
+
pins.each do |pin|
|
|
236
|
+
type = pin.typify(api_map)
|
|
237
|
+
type = pin.probe(api_map) if type.undefined?
|
|
238
|
+
types.push type if type.defined?
|
|
239
|
+
end
|
|
240
|
+
return ComplexType::UNDEFINED if types.empty?
|
|
241
|
+
ComplexType.try_parse(*types.map(&:tag).uniq)
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
end
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
module Solargraph
|
|
4
|
-
module Pin
|
|
5
|
-
# Use this class to track method aliases for later remapping. Common
|
|
6
|
-
# examples that defer mapping are aliases for superclass methods or
|
|
7
|
-
# methods from included modules.
|
|
8
|
-
#
|
|
9
|
-
class MethodAlias < Method
|
|
10
|
-
# @return [::Symbol]
|
|
11
|
-
attr_reader :scope
|
|
12
|
-
|
|
13
|
-
# @return [String]
|
|
14
|
-
attr_reader :original
|
|
15
|
-
|
|
16
|
-
def initialize scope: :instance, original: nil, **splat
|
|
17
|
-
super(**splat)
|
|
18
|
-
@scope = scope
|
|
19
|
-
@original = original
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
def visibility
|
|
23
|
-
:public
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
def path
|
|
27
|
-
@path ||= namespace + (scope == :instance ? '#' : '.') + name
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
# Use this class to track method aliases for later remapping. Common
|
|
6
|
+
# examples that defer mapping are aliases for superclass methods or
|
|
7
|
+
# methods from included modules.
|
|
8
|
+
#
|
|
9
|
+
class MethodAlias < Method
|
|
10
|
+
# @return [::Symbol]
|
|
11
|
+
attr_reader :scope
|
|
12
|
+
|
|
13
|
+
# @return [String]
|
|
14
|
+
attr_reader :original
|
|
15
|
+
|
|
16
|
+
def initialize scope: :instance, original: nil, **splat
|
|
17
|
+
super(**splat)
|
|
18
|
+
@scope = scope
|
|
19
|
+
@original = original
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def visibility
|
|
23
|
+
:public
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def path
|
|
27
|
+
@path ||= namespace + (scope == :instance ? '#' : '.') + name
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|