solargraph 0.39.7
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 +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +28 -0
- data/.yardopts +2 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.md +104 -0
- data/Rakefile +14 -0
- data/SPONSORS.md +9 -0
- data/bin/solargraph +5 -0
- data/lib/.rubocop.yml +21 -0
- data/lib/solargraph.rb +66 -0
- data/lib/solargraph/api_map.rb +745 -0
- data/lib/solargraph/api_map/bundler_methods.rb +27 -0
- data/lib/solargraph/api_map/cache.rb +66 -0
- data/lib/solargraph/api_map/source_to_yard.rb +81 -0
- data/lib/solargraph/api_map/store.rb +267 -0
- data/lib/solargraph/bundle.rb +26 -0
- data/lib/solargraph/complex_type.rb +213 -0
- data/lib/solargraph/complex_type/type_methods.rb +127 -0
- data/lib/solargraph/complex_type/unique_type.rb +75 -0
- data/lib/solargraph/convention.rb +38 -0
- data/lib/solargraph/convention/base.rb +25 -0
- data/lib/solargraph/convention/gemfile.rb +18 -0
- data/lib/solargraph/convention/gemspec.rb +25 -0
- data/lib/solargraph/convention/rspec.rb +24 -0
- data/lib/solargraph/converters/dd.rb +12 -0
- data/lib/solargraph/converters/dl.rb +12 -0
- data/lib/solargraph/converters/dt.rb +12 -0
- data/lib/solargraph/converters/misc.rb +1 -0
- data/lib/solargraph/core_fills.rb +159 -0
- data/lib/solargraph/diagnostics.rb +55 -0
- data/lib/solargraph/diagnostics/base.rb +29 -0
- data/lib/solargraph/diagnostics/require_not_found.rb +37 -0
- data/lib/solargraph/diagnostics/rubocop.rb +90 -0
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +64 -0
- data/lib/solargraph/diagnostics/severities.rb +15 -0
- data/lib/solargraph/diagnostics/type_check.rb +54 -0
- data/lib/solargraph/diagnostics/update_errors.rb +41 -0
- data/lib/solargraph/documentor.rb +76 -0
- data/lib/solargraph/environ.rb +40 -0
- data/lib/solargraph/language_server.rb +19 -0
- data/lib/solargraph/language_server/completion_item_kinds.rb +35 -0
- data/lib/solargraph/language_server/error_codes.rb +20 -0
- data/lib/solargraph/language_server/host.rb +741 -0
- data/lib/solargraph/language_server/host/cataloger.rb +56 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +81 -0
- data/lib/solargraph/language_server/host/dispatch.rb +112 -0
- data/lib/solargraph/language_server/host/sources.rb +156 -0
- data/lib/solargraph/language_server/message.rb +92 -0
- data/lib/solargraph/language_server/message/base.rb +85 -0
- data/lib/solargraph/language_server/message/cancel_request.rb +13 -0
- data/lib/solargraph/language_server/message/client.rb +11 -0
- data/lib/solargraph/language_server/message/client/register_capability.rb +15 -0
- data/lib/solargraph/language_server/message/completion_item.rb +11 -0
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +57 -0
- data/lib/solargraph/language_server/message/exit_notification.rb +13 -0
- data/lib/solargraph/language_server/message/extended.rb +21 -0
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +95 -0
- data/lib/solargraph/language_server/message/extended/document.rb +20 -0
- data/lib/solargraph/language_server/message/extended/document_gems.rb +32 -0
- data/lib/solargraph/language_server/message/extended/download_core.rb +23 -0
- data/lib/solargraph/language_server/message/extended/environment.rb +25 -0
- data/lib/solargraph/language_server/message/extended/search.rb +20 -0
- data/lib/solargraph/language_server/message/initialize.rb +153 -0
- data/lib/solargraph/language_server/message/initialized.rb +26 -0
- data/lib/solargraph/language_server/message/method_not_found.rb +16 -0
- data/lib/solargraph/language_server/message/method_not_implemented.rb +14 -0
- data/lib/solargraph/language_server/message/shutdown.rb +13 -0
- data/lib/solargraph/language_server/message/text_document.rb +28 -0
- data/lib/solargraph/language_server/message/text_document/base.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/code_action.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/completion.rb +57 -0
- data/lib/solargraph/language_server/message/text_document/definition.rb +38 -0
- data/lib/solargraph/language_server/message/text_document/did_change.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_close.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_open.rb +15 -0
- data/lib/solargraph/language_server/message/text_document/did_save.rb +17 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +23 -0
- data/lib/solargraph/language_server/message/text_document/folding_range.rb +26 -0
- data/lib/solargraph/language_server/message/text_document/formatting.rb +78 -0
- data/lib/solargraph/language_server/message/text_document/hover.rb +44 -0
- data/lib/solargraph/language_server/message/text_document/on_type_formatting.rb +34 -0
- data/lib/solargraph/language_server/message/text_document/prepare_rename.rb +11 -0
- data/lib/solargraph/language_server/message/text_document/references.rb +16 -0
- data/lib/solargraph/language_server/message/text_document/rename.rb +19 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +29 -0
- data/lib/solargraph/language_server/message/workspace.rb +14 -0
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +29 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +33 -0
- data/lib/solargraph/language_server/message/workspace/did_change_workspace_folders.rb +24 -0
- data/lib/solargraph/language_server/message/workspace/workspace_symbol.rb +23 -0
- data/lib/solargraph/language_server/message_types.rb +14 -0
- data/lib/solargraph/language_server/request.rb +24 -0
- data/lib/solargraph/language_server/symbol_kinds.rb +36 -0
- data/lib/solargraph/language_server/transport.rb +13 -0
- data/lib/solargraph/language_server/transport/adapter.rb +56 -0
- data/lib/solargraph/language_server/transport/data_reader.rb +72 -0
- data/lib/solargraph/language_server/uri_helpers.rb +49 -0
- data/lib/solargraph/library.rb +414 -0
- data/lib/solargraph/location.rb +37 -0
- data/lib/solargraph/logging.rb +27 -0
- data/lib/solargraph/page.rb +83 -0
- data/lib/solargraph/parser.rb +26 -0
- data/lib/solargraph/parser/comment_ripper.rb +52 -0
- data/lib/solargraph/parser/legacy.rb +12 -0
- data/lib/solargraph/parser/legacy/class_methods.rb +109 -0
- data/lib/solargraph/parser/legacy/flawed_builder.rb +16 -0
- data/lib/solargraph/parser/legacy/node_chainer.rb +118 -0
- data/lib/solargraph/parser/legacy/node_methods.rb +300 -0
- data/lib/solargraph/parser/legacy/node_processors.rb +54 -0
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +35 -0
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/legacy/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/legacy/node_processors/casgn_node.rb +25 -0
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +63 -0
- data/lib/solargraph/parser/legacy/node_processors/defs_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/legacy/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/legacy/node_processors/lvasgn_node.rb +28 -0
- data/lib/solargraph/parser/legacy/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/legacy/node_processors/orasgn_node.rb +16 -0
- data/lib/solargraph/parser/legacy/node_processors/resbody_node.rb +36 -0
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/legacy/node_processors/send_node.rb +234 -0
- data/lib/solargraph/parser/legacy/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/node_methods.rb +43 -0
- data/lib/solargraph/parser/node_processor.rb +43 -0
- data/lib/solargraph/parser/node_processor/base.rb +77 -0
- data/lib/solargraph/parser/region.rb +66 -0
- data/lib/solargraph/parser/rubyvm.rb +40 -0
- data/lib/solargraph/parser/rubyvm/class_methods.rb +150 -0
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +135 -0
- data/lib/solargraph/parser/rubyvm/node_methods.rb +284 -0
- data/lib/solargraph/parser/rubyvm/node_processors.rb +61 -0
- data/lib/solargraph/parser/rubyvm/node_processors/alias_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +62 -0
- data/lib/solargraph/parser/rubyvm/node_processors/begin_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +22 -0
- data/lib/solargraph/parser/rubyvm/node_processors/cvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/def_node.rb +64 -0
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +57 -0
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +23 -0
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +38 -0
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +20 -0
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +27 -0
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +39 -0
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +31 -0
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +45 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +21 -0
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +15 -0
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +255 -0
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +18 -0
- data/lib/solargraph/parser/snippet.rb +13 -0
- data/lib/solargraph/pin.rb +39 -0
- data/lib/solargraph/pin/attribute.rb +49 -0
- data/lib/solargraph/pin/base.rb +296 -0
- data/lib/solargraph/pin/base_method.rb +141 -0
- data/lib/solargraph/pin/base_variable.rb +84 -0
- data/lib/solargraph/pin/block.rb +48 -0
- data/lib/solargraph/pin/class_variable.rb +8 -0
- data/lib/solargraph/pin/closure.rb +37 -0
- data/lib/solargraph/pin/common.rb +70 -0
- data/lib/solargraph/pin/constant.rb +43 -0
- data/lib/solargraph/pin/conversions.rb +97 -0
- data/lib/solargraph/pin/documenting.rb +110 -0
- data/lib/solargraph/pin/duck_method.rb +16 -0
- data/lib/solargraph/pin/global_variable.rb +8 -0
- data/lib/solargraph/pin/instance_variable.rb +30 -0
- data/lib/solargraph/pin/keyword.rb +15 -0
- data/lib/solargraph/pin/keyword_param.rb +8 -0
- data/lib/solargraph/pin/local_variable.rb +21 -0
- data/lib/solargraph/pin/localized.rb +43 -0
- data/lib/solargraph/pin/method.rb +111 -0
- data/lib/solargraph/pin/method_alias.rb +31 -0
- data/lib/solargraph/pin/namespace.rb +85 -0
- data/lib/solargraph/pin/parameter.rb +206 -0
- data/lib/solargraph/pin/proxy_type.rb +29 -0
- data/lib/solargraph/pin/reference.rb +14 -0
- data/lib/solargraph/pin/reference/extend.rb +10 -0
- data/lib/solargraph/pin/reference/include.rb +10 -0
- data/lib/solargraph/pin/reference/override.rb +29 -0
- data/lib/solargraph/pin/reference/prepend.rb +10 -0
- data/lib/solargraph/pin/reference/require.rb +14 -0
- data/lib/solargraph/pin/reference/superclass.rb +10 -0
- data/lib/solargraph/pin/singleton.rb +11 -0
- data/lib/solargraph/pin/symbol.rb +47 -0
- data/lib/solargraph/pin/yard_pin.rb +12 -0
- data/lib/solargraph/pin/yard_pin/constant.rb +25 -0
- data/lib/solargraph/pin/yard_pin/method.rb +65 -0
- data/lib/solargraph/pin/yard_pin/namespace.rb +27 -0
- data/lib/solargraph/pin/yard_pin/yard_mixin.rb +26 -0
- data/lib/solargraph/position.rb +112 -0
- data/lib/solargraph/range.rb +95 -0
- data/lib/solargraph/server_methods.rb +16 -0
- data/lib/solargraph/shell.rb +221 -0
- data/lib/solargraph/source.rb +533 -0
- data/lib/solargraph/source/chain.rb +172 -0
- data/lib/solargraph/source/chain/block_variable.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +203 -0
- data/lib/solargraph/source/chain/class_variable.rb +13 -0
- data/lib/solargraph/source/chain/constant.rb +75 -0
- data/lib/solargraph/source/chain/global_variable.rb +13 -0
- data/lib/solargraph/source/chain/head.rb +35 -0
- data/lib/solargraph/source/chain/instance_variable.rb +13 -0
- data/lib/solargraph/source/chain/link.rb +67 -0
- data/lib/solargraph/source/chain/literal.rb +23 -0
- data/lib/solargraph/source/chain/or.rb +23 -0
- data/lib/solargraph/source/chain/variable.rb +13 -0
- data/lib/solargraph/source/chain/z_super.rb +184 -0
- data/lib/solargraph/source/change.rb +79 -0
- data/lib/solargraph/source/cursor.rb +164 -0
- data/lib/solargraph/source/encoding_fixes.rb +23 -0
- data/lib/solargraph/source/source_chainer.rb +189 -0
- data/lib/solargraph/source/updater.rb +54 -0
- data/lib/solargraph/source_map.rb +170 -0
- data/lib/solargraph/source_map/clip.rb +190 -0
- data/lib/solargraph/source_map/completion.rb +23 -0
- data/lib/solargraph/source_map/mapper.rb +199 -0
- data/lib/solargraph/stdlib_fills.rb +32 -0
- data/lib/solargraph/type_checker.rb +498 -0
- data/lib/solargraph/type_checker/checks.rb +95 -0
- data/lib/solargraph/type_checker/param_def.rb +35 -0
- data/lib/solargraph/type_checker/problem.rb +32 -0
- data/lib/solargraph/type_checker/rules.rb +53 -0
- data/lib/solargraph/version.rb +5 -0
- data/lib/solargraph/views/_method.erb +62 -0
- data/lib/solargraph/views/_name_type_tag.erb +10 -0
- data/lib/solargraph/views/_namespace.erb +24 -0
- data/lib/solargraph/views/document.erb +23 -0
- data/lib/solargraph/views/environment.erb +58 -0
- data/lib/solargraph/views/layout.erb +44 -0
- data/lib/solargraph/views/search.erb +11 -0
- data/lib/solargraph/workspace.rb +209 -0
- data/lib/solargraph/workspace/config.rb +215 -0
- data/lib/solargraph/yard_map.rb +420 -0
- data/lib/solargraph/yard_map/cache.rb +19 -0
- data/lib/solargraph/yard_map/core_docs.rb +170 -0
- data/lib/solargraph/yard_map/core_gen.rb +76 -0
- data/lib/solargraph/yard_map/mapper.rb +71 -0
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +136 -0
- data/lib/yard-solargraph.rb +30 -0
- data/solargraph.gemspec +41 -0
- data/travis-bundler.rb +11 -0
- data/yardoc/2.2.2.tar.gz +0 -0
- metadata +575 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
# The base class for method and attribute pins.
|
|
6
|
+
#
|
|
7
|
+
class BaseMethod < Closure
|
|
8
|
+
# @return [::Symbol] :public, :private, or :protected
|
|
9
|
+
attr_reader :visibility
|
|
10
|
+
|
|
11
|
+
# @return [Parser::AST::Node]
|
|
12
|
+
attr_reader :node
|
|
13
|
+
|
|
14
|
+
# @param visibility [::Symbol] :public, :protected, or :private
|
|
15
|
+
# @param explicit [Boolean]
|
|
16
|
+
def initialize visibility: :public, explicit: true, **splat
|
|
17
|
+
super(**splat)
|
|
18
|
+
@visibility = visibility
|
|
19
|
+
@explicit = explicit
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def return_type
|
|
23
|
+
@return_type ||= generate_complex_type
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def path
|
|
27
|
+
@path ||= "#{namespace}#{(scope == :instance ? '#' : '.')}#{name}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def typify api_map
|
|
31
|
+
decl = super
|
|
32
|
+
return decl unless decl.undefined?
|
|
33
|
+
type = see_reference(api_map) || typify_from_super(api_map)
|
|
34
|
+
return type.qualify(api_map, namespace) unless type.nil?
|
|
35
|
+
name.end_with?('?') ? ComplexType::BOOLEAN : ComplexType::UNDEFINED
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [Array<Pin::Parameter>]
|
|
39
|
+
def parameters
|
|
40
|
+
@parameters ||= []
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# @return [Array<String>]
|
|
44
|
+
def parameter_names
|
|
45
|
+
parameters.map(&:name)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def documentation
|
|
49
|
+
if @documentation.nil?
|
|
50
|
+
@documentation ||= super || ''
|
|
51
|
+
param_tags = docstring.tags(:param)
|
|
52
|
+
unless param_tags.nil? or param_tags.empty?
|
|
53
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
54
|
+
@documentation += "Params:\n"
|
|
55
|
+
lines = []
|
|
56
|
+
param_tags.each do |p|
|
|
57
|
+
l = "* #{p.name}"
|
|
58
|
+
l += " [#{escape_brackets(p.types.join(', '))}]" unless p.types.nil? or p.types.empty?
|
|
59
|
+
l += " #{p.text}"
|
|
60
|
+
lines.push l
|
|
61
|
+
end
|
|
62
|
+
@documentation += lines.join("\n")
|
|
63
|
+
end
|
|
64
|
+
return_tags = docstring.tags(:return)
|
|
65
|
+
unless return_tags.empty?
|
|
66
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
67
|
+
@documentation += "Returns:\n"
|
|
68
|
+
lines = []
|
|
69
|
+
return_tags.each do |r|
|
|
70
|
+
l = "*"
|
|
71
|
+
l += " [#{escape_brackets(r.types.join(', '))}]" unless r.types.nil? or r.types.empty?
|
|
72
|
+
l += " #{r.text}"
|
|
73
|
+
lines.push l
|
|
74
|
+
end
|
|
75
|
+
@documentation += lines.join("\n")
|
|
76
|
+
end
|
|
77
|
+
@documentation += "\n\n" unless @documentation.empty?
|
|
78
|
+
@documentation += "Visibility: #{visibility}"
|
|
79
|
+
end
|
|
80
|
+
@documentation.to_s
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def explicit?
|
|
84
|
+
@explicit
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
# @return [ComplexType]
|
|
90
|
+
def generate_complex_type
|
|
91
|
+
tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
|
|
92
|
+
return ComplexType::UNDEFINED if tags.empty?
|
|
93
|
+
ComplexType.try_parse *tags
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# @param api_map [ApiMap]
|
|
97
|
+
# @return [ComplexType, nil]
|
|
98
|
+
def see_reference api_map
|
|
99
|
+
docstring.ref_tags.each do |ref|
|
|
100
|
+
next unless ref.tag_name == 'return' && ref.owner
|
|
101
|
+
result = resolve_reference(ref.owner.to_s, api_map)
|
|
102
|
+
return result unless result.nil?
|
|
103
|
+
end
|
|
104
|
+
match = comments.match(/^[ \t]*\(see (.*)\)/m)
|
|
105
|
+
return nil if match.nil?
|
|
106
|
+
resolve_reference match[1], api_map
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# @param api_map [ApiMap]
|
|
110
|
+
# @return [ComplexType, nil]
|
|
111
|
+
def typify_from_super api_map
|
|
112
|
+
stack = api_map.get_method_stack(namespace, name, scope: scope).reject { |pin| pin.path == path }
|
|
113
|
+
return nil if stack.empty?
|
|
114
|
+
stack.each do |pin|
|
|
115
|
+
return pin.return_type unless pin.return_type.undefined?
|
|
116
|
+
end
|
|
117
|
+
nil
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# @param ref [String]
|
|
121
|
+
# @param api_map [ApiMap]
|
|
122
|
+
# @return [ComplexType]
|
|
123
|
+
def resolve_reference ref, api_map
|
|
124
|
+
parts = ref.split(/[\.#]/)
|
|
125
|
+
if parts.first.empty? || parts.one?
|
|
126
|
+
path = "#{namespace}#{ref}"
|
|
127
|
+
else
|
|
128
|
+
fqns = api_map.qualify(parts.first, namespace)
|
|
129
|
+
return ComplexType::UNDEFINED if fqns.nil?
|
|
130
|
+
path = fqns + ref[parts.first.length] + parts.last
|
|
131
|
+
end
|
|
132
|
+
pins = api_map.get_path_pins(path)
|
|
133
|
+
pins.each do |pin|
|
|
134
|
+
type = pin.typify(api_map)
|
|
135
|
+
return type unless type.undefined?
|
|
136
|
+
end
|
|
137
|
+
nil
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class BaseVariable < Base
|
|
6
|
+
include Solargraph::Parser::NodeMethods
|
|
7
|
+
# include Solargraph::Source::NodeMethods
|
|
8
|
+
|
|
9
|
+
# @return [Parser::AST::Node, nil]
|
|
10
|
+
attr_reader :assignment
|
|
11
|
+
|
|
12
|
+
# @param assignment [Parser::AST::Node, nil]
|
|
13
|
+
def initialize assignment: nil, **splat
|
|
14
|
+
super(**splat)
|
|
15
|
+
@assignment = assignment
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def completion_item_kind
|
|
19
|
+
Solargraph::LanguageServer::CompletionItemKinds::VARIABLE
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [Integer]
|
|
23
|
+
def symbol_kind
|
|
24
|
+
Solargraph::LanguageServer::SymbolKinds::VARIABLE
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def return_type
|
|
28
|
+
@return_type ||= generate_complex_type
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def nil_assignment?
|
|
32
|
+
return_type.nil?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def variable?
|
|
36
|
+
true
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def probe api_map
|
|
40
|
+
return ComplexType::UNDEFINED if @assignment.nil?
|
|
41
|
+
types = []
|
|
42
|
+
returns_from(@assignment).each do |node|
|
|
43
|
+
# Nil nodes may not have a location
|
|
44
|
+
if node.nil? || node.type == :NIL || node.type == :nil
|
|
45
|
+
types.push ComplexType::NIL
|
|
46
|
+
else
|
|
47
|
+
rng = Range.from_node(node)
|
|
48
|
+
next if rng.nil?
|
|
49
|
+
pos = rng.ending
|
|
50
|
+
clip = api_map.clip_at(location.filename, pos)
|
|
51
|
+
# Use the return node for inference. The clip might infer from the
|
|
52
|
+
# first node in a method call instead of the entire call.
|
|
53
|
+
chain = Parser.chain(node, nil, clip.in_block?)
|
|
54
|
+
result = chain.infer(api_map, closure, clip.locals)
|
|
55
|
+
types.push result unless result.undefined?
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
return ComplexType::UNDEFINED if types.empty?
|
|
59
|
+
ComplexType.try_parse(*types.map(&:tag))
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def == other
|
|
63
|
+
return false unless super
|
|
64
|
+
assignment == other.assignment
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def try_merge! pin
|
|
68
|
+
return false unless super
|
|
69
|
+
@assignment = pin.assignment
|
|
70
|
+
@return_type = pin.return_type
|
|
71
|
+
true
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
private
|
|
75
|
+
|
|
76
|
+
# @return [ComplexType]
|
|
77
|
+
def generate_complex_type
|
|
78
|
+
tag = docstring.tag(:type)
|
|
79
|
+
return ComplexType.try_parse(*tag.types) unless tag.nil? || tag.types.nil? || tag.types.empty?
|
|
80
|
+
ComplexType.new
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Block < Closure
|
|
6
|
+
# The signature of the method that receives this block.
|
|
7
|
+
#
|
|
8
|
+
# @return [Parser::AST::Node]
|
|
9
|
+
attr_reader :receiver
|
|
10
|
+
|
|
11
|
+
def initialize receiver: nil, args: [], **splat
|
|
12
|
+
super(**splat)
|
|
13
|
+
@receiver = receiver
|
|
14
|
+
@parameters = args
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def rebind context
|
|
18
|
+
@rebound = true
|
|
19
|
+
@binder = context unless context.undefined?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def rebound?
|
|
23
|
+
@rebound ||= false
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def binder
|
|
27
|
+
@binder || context
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @return [Array<String>]
|
|
31
|
+
def parameters
|
|
32
|
+
@parameters ||= []
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# @return [Array<String>]
|
|
36
|
+
def parameter_names
|
|
37
|
+
@parameter_names ||= parameters.map(&:name)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def nearly? other
|
|
41
|
+
return false unless super
|
|
42
|
+
# @todo Trying to not to block merges too much
|
|
43
|
+
# receiver == other.receiver and parameters == other.parameters
|
|
44
|
+
true
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Closure < Base
|
|
6
|
+
# @return [::Symbol] :class or :instance
|
|
7
|
+
attr_reader :scope
|
|
8
|
+
|
|
9
|
+
def initialize scope: :class, **splat
|
|
10
|
+
super(**splat)
|
|
11
|
+
@scope = scope
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def context
|
|
15
|
+
@context ||= begin
|
|
16
|
+
result = super
|
|
17
|
+
if scope == :instance
|
|
18
|
+
Solargraph::ComplexType.parse(result.namespace)
|
|
19
|
+
else
|
|
20
|
+
result
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def binder
|
|
26
|
+
@binder || context
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# @return [Array<String>]
|
|
30
|
+
def gates
|
|
31
|
+
# @todo This check might not be necessary. There should always be a
|
|
32
|
+
# root pin
|
|
33
|
+
closure ? closure.gates : ['']
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
module Common
|
|
6
|
+
# @return [Location]
|
|
7
|
+
attr_reader :location
|
|
8
|
+
|
|
9
|
+
# @return [Pin::Base, nil]
|
|
10
|
+
attr_reader :closure
|
|
11
|
+
|
|
12
|
+
# @return [String]
|
|
13
|
+
def name
|
|
14
|
+
@name ||= ''
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# @return [ComplexType]
|
|
18
|
+
def return_type
|
|
19
|
+
@return_type ||= ComplexType::UNDEFINED
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @return [ComplexType]
|
|
23
|
+
def context
|
|
24
|
+
# Get the static context from the nearest namespace
|
|
25
|
+
@context ||= find_context
|
|
26
|
+
end
|
|
27
|
+
alias full_context context
|
|
28
|
+
|
|
29
|
+
# @return [String]
|
|
30
|
+
def namespace
|
|
31
|
+
context.namespace.to_s
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @return [ComplexType]
|
|
35
|
+
def binder
|
|
36
|
+
@binder || context
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @return [String]
|
|
40
|
+
def comments
|
|
41
|
+
@comments ||= ''
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# @return [String]
|
|
45
|
+
def path
|
|
46
|
+
@path ||= name.empty? ? context.namespace : "#{context.namespace}::#{name}"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# @return [ComplexType]
|
|
52
|
+
def find_context
|
|
53
|
+
here = closure
|
|
54
|
+
until here.nil?
|
|
55
|
+
if here.is_a?(Pin::Namespace)
|
|
56
|
+
return here.return_type
|
|
57
|
+
elsif here.is_a?(Pin::BaseMethod)
|
|
58
|
+
if here.scope == :instance
|
|
59
|
+
return ComplexType.try_parse(here.context.namespace)
|
|
60
|
+
else
|
|
61
|
+
return here.context
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
here = here.closure
|
|
65
|
+
end
|
|
66
|
+
ComplexType::ROOT
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Constant < BaseVariable
|
|
6
|
+
attr_reader :visibility
|
|
7
|
+
|
|
8
|
+
def initialize visibility: :public, **splat
|
|
9
|
+
super(**splat)
|
|
10
|
+
@visibility = visibility
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def return_type
|
|
14
|
+
@return_type ||= generate_complex_type
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def completion_item_kind
|
|
18
|
+
Solargraph::LanguageServer::CompletionItemKinds::CONSTANT
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @return [Integer]
|
|
22
|
+
def symbol_kind
|
|
23
|
+
LanguageServer::SymbolKinds::CONSTANT
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def path
|
|
27
|
+
@path ||= context.namespace.to_s.empty? ? name : "#{context.namespace}::#{name}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# @return [ComplexType]
|
|
33
|
+
def generate_complex_type
|
|
34
|
+
tags = docstring.tags(:return).map(&:types).flatten.reject(&:nil?)
|
|
35
|
+
if tags.empty?
|
|
36
|
+
tags = docstring.tags(:type).map(&:types).flatten.reject(&:nil?)
|
|
37
|
+
end
|
|
38
|
+
return ComplexType::UNDEFINED if tags.empty?
|
|
39
|
+
ComplexType.try_parse *tags
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'cgi'
|
|
4
|
+
|
|
5
|
+
module Solargraph
|
|
6
|
+
module Pin
|
|
7
|
+
# @todo Move this stuff. It should be the responsibility of the language server.
|
|
8
|
+
module Conversions
|
|
9
|
+
# @return [Hash]
|
|
10
|
+
def completion_item
|
|
11
|
+
@completion_item ||= {
|
|
12
|
+
label: name,
|
|
13
|
+
kind: completion_item_kind,
|
|
14
|
+
detail: detail,
|
|
15
|
+
data: {
|
|
16
|
+
path: path,
|
|
17
|
+
return_type: return_type.tag,
|
|
18
|
+
location: (location ? location.to_hash : nil),
|
|
19
|
+
deprecated: deprecated?
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# @return [Hash]
|
|
25
|
+
def resolve_completion_item
|
|
26
|
+
if @resolve_completion_item.nil?
|
|
27
|
+
extra = {}
|
|
28
|
+
alldoc = ''
|
|
29
|
+
# alldoc += link_documentation unless link_documentation.nil?
|
|
30
|
+
# alldoc += "\n\n" unless alldoc.empty?
|
|
31
|
+
alldoc += documentation unless documentation.nil?
|
|
32
|
+
extra[:documentation] = alldoc unless alldoc.empty?
|
|
33
|
+
@resolve_completion_item = completion_item.merge(extra)
|
|
34
|
+
end
|
|
35
|
+
@resolve_completion_item
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# @return [Hash]
|
|
39
|
+
def signature_help
|
|
40
|
+
@signature_help ||= {
|
|
41
|
+
label: name + '(' + parameters.map(&:full).join(', ') + ')',
|
|
42
|
+
documentation: documentation
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @return [String]
|
|
47
|
+
def detail
|
|
48
|
+
# This property is not cached in an instance variable because it can
|
|
49
|
+
# change when pins get proxied.
|
|
50
|
+
detail = String.new
|
|
51
|
+
detail += "(#{parameters.map(&:full).join(', ')}) " unless !is_a?(Pin::BaseMethod) || parameters.empty?
|
|
52
|
+
detail += "=#{probed? ? '~' : (proxied? ? '^' : '>')} #{return_type.to_s}" unless return_type.undefined?
|
|
53
|
+
detail.strip!
|
|
54
|
+
return nil if detail.empty?
|
|
55
|
+
detail
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Get a markdown-flavored link to a documentation page.
|
|
59
|
+
#
|
|
60
|
+
# @return [String]
|
|
61
|
+
def link_documentation
|
|
62
|
+
@link_documentation ||= generate_link
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def text_documentation
|
|
66
|
+
this_path = path || return_type.tag
|
|
67
|
+
return nil if this_path == 'undefined'
|
|
68
|
+
escape_brackets this_path
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def reset_conversions
|
|
72
|
+
@completion_item = nil
|
|
73
|
+
@resolve_completion_item = nil
|
|
74
|
+
@signature_help = nil
|
|
75
|
+
@detail = nil
|
|
76
|
+
@link_documentation = nil
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
# @return [String]
|
|
82
|
+
def generate_link
|
|
83
|
+
this_path = path || return_type.tag
|
|
84
|
+
return nil if this_path == 'undefined'
|
|
85
|
+
return nil if this_path.nil? || this_path == 'undefined'
|
|
86
|
+
"[#{escape_brackets(this_path).gsub('_', '\\\\_')}](solargraph:/document?query=#{CGI.escape(this_path)})"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# @param text [String]
|
|
90
|
+
# @return [String]
|
|
91
|
+
def escape_brackets text
|
|
92
|
+
# text.gsub(/(\<|\>)/, "\\#{$1}")
|
|
93
|
+
text.gsub("<", '\<').gsub(">", '\>')
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|