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,110 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'maruku'
|
|
4
|
+
require 'yard'
|
|
5
|
+
require 'reverse_markdown'
|
|
6
|
+
require 'solargraph/converters/dl'
|
|
7
|
+
require 'solargraph/converters/dt'
|
|
8
|
+
require 'solargraph/converters/dd'
|
|
9
|
+
require 'solargraph/converters/misc'
|
|
10
|
+
|
|
11
|
+
# HACK: Setting :html_parser through `Maruku.new` does not work
|
|
12
|
+
MaRuKu::Globals[:html_parser] = 'nokogiri'
|
|
13
|
+
|
|
14
|
+
module Solargraph
|
|
15
|
+
module Pin
|
|
16
|
+
# A module to add the Pin::Base#documentation method.
|
|
17
|
+
#
|
|
18
|
+
module Documenting
|
|
19
|
+
# A documentation formatter that either performs Markdown conversion for
|
|
20
|
+
# text, or applies backticks for code blocks.
|
|
21
|
+
#
|
|
22
|
+
class DocSection
|
|
23
|
+
# @return [String]
|
|
24
|
+
attr_reader :plaintext
|
|
25
|
+
|
|
26
|
+
# @param code [Boolean] True if this section is a code block
|
|
27
|
+
def initialize code
|
|
28
|
+
@plaintext = String.new('')
|
|
29
|
+
@code = code
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def code?
|
|
33
|
+
@code
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# @param text [String]
|
|
37
|
+
# @return [String]
|
|
38
|
+
def concat text
|
|
39
|
+
@plaintext.concat text
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def to_s
|
|
43
|
+
return "\n```ruby\n#{@plaintext}#{@plaintext.end_with?("\n") ? '' : "\n"}```\n\n" if code?
|
|
44
|
+
ReverseMarkdown.convert unescape_brackets(Maruku.new(escape_brackets(@plaintext), on_error: :raise).to_html)
|
|
45
|
+
rescue MaRuKu::Exception
|
|
46
|
+
# Maruku exceptions usually indicate that the documentation is in
|
|
47
|
+
# RDoc syntax.
|
|
48
|
+
ReverseMarkdown.convert YARD::Templates::Helpers::Markup::RDocMarkup.new(@plaintext).to_html
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
private
|
|
52
|
+
|
|
53
|
+
# @param text [String]
|
|
54
|
+
# @return [String]
|
|
55
|
+
def escape_brackets text
|
|
56
|
+
text.gsub(/(\[[^\]]*\])([^\(]|\z)/, '!!!`\1`!!!\2')
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# @param text [String]
|
|
60
|
+
# @return [String]
|
|
61
|
+
def unescape_brackets text
|
|
62
|
+
text.gsub('!!!`[', '[').gsub(']`!!!', ']')
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# @return [String]
|
|
67
|
+
def documentation
|
|
68
|
+
@documentation ||= begin
|
|
69
|
+
# Using DocSections allows for code blocks that start with an empty
|
|
70
|
+
# line and at least two spaces of indentation. This is a common
|
|
71
|
+
# convention in Ruby core documentation, e.g., String#split.
|
|
72
|
+
sections = [DocSection.new(false)]
|
|
73
|
+
normalize_indentation(docstring.to_s).gsub(/\t/, ' ').lines.each do |l|
|
|
74
|
+
if l.strip.empty?
|
|
75
|
+
sections.last.concat l
|
|
76
|
+
else
|
|
77
|
+
if (l =~ /^ [^\s]/ && sections.last.plaintext =~ /(\r?\n[ \t]*?){2,}$/) || (l.start_with?(' ') && sections.last.code?)
|
|
78
|
+
# Code block
|
|
79
|
+
sections.push DocSection.new(true) unless sections.last.code?
|
|
80
|
+
sections.last.concat l[2..-1]
|
|
81
|
+
else
|
|
82
|
+
# Regular documentation
|
|
83
|
+
sections.push DocSection.new(false) if sections.last.code?
|
|
84
|
+
sections.last.concat l
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
sections.map(&:to_s).join
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
private
|
|
93
|
+
|
|
94
|
+
# @param text [String]
|
|
95
|
+
# @return [String]
|
|
96
|
+
def normalize_indentation text
|
|
97
|
+
text.lines.map { |l| remove_odd_spaces(l) }.join
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# @param line [String]
|
|
101
|
+
# @return [String]
|
|
102
|
+
def remove_odd_spaces line
|
|
103
|
+
return line unless line.start_with?(' ')
|
|
104
|
+
spaces = line.match(/^ +/)[0].length
|
|
105
|
+
return line unless spaces.odd?
|
|
106
|
+
line[1..-1]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
# DuckMethod pins are used to add completion items for type tags that
|
|
6
|
+
# use duck typing, e.g., `@param file [#read]`.
|
|
7
|
+
#
|
|
8
|
+
class DuckMethod < Pin::Method
|
|
9
|
+
# @param location [Solargraph::Location]
|
|
10
|
+
# @param name [String]
|
|
11
|
+
# def initialize location, name
|
|
12
|
+
# # super(location, '', name, nil, :instance, :public, [])
|
|
13
|
+
# end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class InstanceVariable < BaseVariable
|
|
6
|
+
def binder
|
|
7
|
+
closure.binder
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def scope
|
|
11
|
+
closure.binder.scope
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def context
|
|
15
|
+
@context ||= begin
|
|
16
|
+
result = super
|
|
17
|
+
if scope == :class
|
|
18
|
+
ComplexType.parse("Class<#{result.namespace}>")
|
|
19
|
+
else
|
|
20
|
+
ComplexType.parse("#{result.namespace}")
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def nearly? other
|
|
26
|
+
super && binder == other.binder
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class LocalVariable < BaseVariable
|
|
6
|
+
include Localized
|
|
7
|
+
|
|
8
|
+
def initialize assignment: nil, presence: nil, **splat
|
|
9
|
+
super(**splat)
|
|
10
|
+
@assignment = assignment
|
|
11
|
+
@presence = presence
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def try_merge! pin
|
|
15
|
+
return false unless super
|
|
16
|
+
@presence = pin.presence
|
|
17
|
+
true
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
module Localized
|
|
6
|
+
# @return [Range]
|
|
7
|
+
attr_reader :presence
|
|
8
|
+
|
|
9
|
+
# @param other [Pin::Base] The caller's block
|
|
10
|
+
# @param position [Position, Array(Integer, Integer)] The caller's position
|
|
11
|
+
# @return [Boolean]
|
|
12
|
+
def visible_from?(other, position)
|
|
13
|
+
position = Position.normalize(position)
|
|
14
|
+
other.filename == filename &&
|
|
15
|
+
match_tags(other.full_context.tag, full_context.tag) &&
|
|
16
|
+
(other == closure ||
|
|
17
|
+
(closure.location.range.contain?(other.location.range.start) && closure.location.range.contain?(other.location.range.ending))
|
|
18
|
+
) &&
|
|
19
|
+
presence.contain?(position)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# @param other_loc [Location]
|
|
23
|
+
def visible_at?(other_loc)
|
|
24
|
+
return false if location.filename != other_loc.filename
|
|
25
|
+
presence.include?(other_loc.range.start)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
private
|
|
29
|
+
|
|
30
|
+
# @param tag1 [String]
|
|
31
|
+
# @param tag2 [String]
|
|
32
|
+
# @return [Boolean]
|
|
33
|
+
def match_tags tag1, tag2
|
|
34
|
+
# @todo This is an unfortunate hack made necessary by a discrepancy in
|
|
35
|
+
# how tags indicate the root namespace. The long-term solution is to
|
|
36
|
+
# standardize it, whether it's `Class<>`, an empty string, or
|
|
37
|
+
# something else.
|
|
38
|
+
tag1 == tag2 ||
|
|
39
|
+
(['', 'Class<>'].include?(tag1) && ['', 'Class<>'].include?(tag2))
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Method < BaseMethod
|
|
6
|
+
include Solargraph::Parser::NodeMethods
|
|
7
|
+
|
|
8
|
+
# @return [Array<String>]
|
|
9
|
+
attr_reader :parameters
|
|
10
|
+
|
|
11
|
+
# @param args [Array<String>]
|
|
12
|
+
# @param node [Parser::AST::Node, nil]
|
|
13
|
+
def initialize parameters: [], node: nil, **splat
|
|
14
|
+
super(**splat)
|
|
15
|
+
@parameters = parameters
|
|
16
|
+
@node = node
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# @return [Array<String>]
|
|
20
|
+
def parameter_names
|
|
21
|
+
@parameter_names ||= parameters.map(&:name)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def completion_item_kind
|
|
25
|
+
Solargraph::LanguageServer::CompletionItemKinds::METHOD
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def symbol_kind
|
|
29
|
+
LanguageServer::SymbolKinds::METHOD
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def nearly? other
|
|
33
|
+
return false unless super
|
|
34
|
+
parameters == other.parameters and
|
|
35
|
+
scope == other.scope and
|
|
36
|
+
visibility == other.visibility
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def probe api_map
|
|
40
|
+
infer_from_return_nodes(api_map)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def try_merge! pin
|
|
44
|
+
return false unless super
|
|
45
|
+
@node = pin.node
|
|
46
|
+
true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# @return [Array<Pin::Method>]
|
|
50
|
+
def overloads
|
|
51
|
+
@overloads ||= docstring.tags(:overload).map do |tag|
|
|
52
|
+
Solargraph::Pin::Method.new(
|
|
53
|
+
name: name,
|
|
54
|
+
closure: self,
|
|
55
|
+
# args: tag.parameters.map(&:first),
|
|
56
|
+
parameters: tag.parameters.map do |src|
|
|
57
|
+
Pin::Parameter.new(
|
|
58
|
+
location: location,
|
|
59
|
+
closure: self,
|
|
60
|
+
comments: tag.docstring.all.to_s,
|
|
61
|
+
name: src.first,
|
|
62
|
+
presence: location ? location.range : nil,
|
|
63
|
+
decl: :arg
|
|
64
|
+
)
|
|
65
|
+
end,
|
|
66
|
+
comments: tag.docstring.all.to_s
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
# @return [Parser::AST::Node, nil]
|
|
74
|
+
def method_body_node
|
|
75
|
+
return nil if node.nil?
|
|
76
|
+
return node.children[1].children.last if node.type == :DEFN
|
|
77
|
+
return node.children[2].children.last if node.type == :DEFS
|
|
78
|
+
return node.children[2] if node.type == :def || node.type == :DEFS
|
|
79
|
+
return node.children[3] if node.type == :defs
|
|
80
|
+
nil
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# @param api_map [ApiMap]
|
|
84
|
+
# @return [ComplexType]
|
|
85
|
+
def infer_from_return_nodes api_map
|
|
86
|
+
return ComplexType::UNDEFINED if node.nil?
|
|
87
|
+
result = []
|
|
88
|
+
has_nil = false
|
|
89
|
+
return ComplexType::NIL if method_body_node.nil?
|
|
90
|
+
returns_from(method_body_node).each do |n|
|
|
91
|
+
if n.nil? || [:NIL, :nil].include?(n.type)
|
|
92
|
+
has_nil = true
|
|
93
|
+
next
|
|
94
|
+
end
|
|
95
|
+
rng = Range.from_node(n)
|
|
96
|
+
next unless rng
|
|
97
|
+
clip = api_map.clip_at(
|
|
98
|
+
location.filename,
|
|
99
|
+
rng.ending
|
|
100
|
+
)
|
|
101
|
+
chain = Solargraph::Parser.chain(n, location.filename)
|
|
102
|
+
type = chain.infer(api_map, self, clip.locals)
|
|
103
|
+
result.push type unless type.undefined?
|
|
104
|
+
end
|
|
105
|
+
result.push ComplexType::NIL if has_nil
|
|
106
|
+
return ComplexType::UNDEFINED if result.empty?
|
|
107
|
+
ComplexType.try_parse(*result.map(&:tag).uniq)
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +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 < BaseMethod
|
|
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
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
module Pin
|
|
5
|
+
class Namespace < Closure
|
|
6
|
+
# @return [::Symbol] :public or :private
|
|
7
|
+
attr_reader :visibility
|
|
8
|
+
|
|
9
|
+
# @return [::Symbol] :class or :module
|
|
10
|
+
attr_reader :type
|
|
11
|
+
|
|
12
|
+
# @param type [Symbol] :class or :module
|
|
13
|
+
# @param visibility [Symbol] :public or :private
|
|
14
|
+
# @param gates [Array<String>]
|
|
15
|
+
def initialize type: :class, visibility: :public, gates: [''], **splat
|
|
16
|
+
# super(location, namespace, name, comments)
|
|
17
|
+
super(**splat)
|
|
18
|
+
@type = type
|
|
19
|
+
@visibility = visibility
|
|
20
|
+
if name.start_with?('::')
|
|
21
|
+
@name = name[2..-1]
|
|
22
|
+
@closure = Solargraph::Pin::ROOT_PIN
|
|
23
|
+
end
|
|
24
|
+
@open_gates = gates
|
|
25
|
+
if @open_gates.one? && @open_gates.first.empty? && @name.include?('::')
|
|
26
|
+
# In this case, a chained namespace was opened (e.g., Foo::Bar)
|
|
27
|
+
# but Foo does not exist.
|
|
28
|
+
parts = @name.split('::')
|
|
29
|
+
@name = parts.pop
|
|
30
|
+
@closure = Pin::Namespace.new(name: parts.join('::'), gates: [parts.join('::')])
|
|
31
|
+
@context = nil
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def namespace
|
|
36
|
+
context.namespace
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def full_context
|
|
40
|
+
@full_context ||= ComplexType.try_parse("#{type.to_s.capitalize}<#{path}>")
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def binder
|
|
44
|
+
full_context
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def scope
|
|
48
|
+
context.scope
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def completion_item_kind
|
|
52
|
+
(type == :class ? LanguageServer::CompletionItemKinds::CLASS : LanguageServer::CompletionItemKinds::MODULE)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# @return [Integer]
|
|
56
|
+
def symbol_kind
|
|
57
|
+
(type == :class ? LanguageServer::SymbolKinds::CLASS : LanguageServer::SymbolKinds::MODULE)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def path
|
|
61
|
+
@path ||= (namespace.empty? ? '' : "#{namespace}::") + name
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def return_type
|
|
65
|
+
@return_type ||= ComplexType.try_parse( (type == :class ? 'Class' : 'Module') + "<#{path}>" )
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def domains
|
|
69
|
+
@domains ||= []
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def typify api_map
|
|
73
|
+
return_type
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def gates
|
|
77
|
+
@gates ||= if path.empty?
|
|
78
|
+
@open_gates
|
|
79
|
+
else
|
|
80
|
+
[path] + @open_gates
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|