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,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class YardMap
|
|
5
|
+
class Cache
|
|
6
|
+
def initialize
|
|
7
|
+
@path_pins = {}
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def set_path_pins path, pins
|
|
11
|
+
@path_pins[path] = pins
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def get_path_pins path
|
|
15
|
+
@path_pins[path]
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'net/http'
|
|
4
|
+
require 'uri'
|
|
5
|
+
require 'json'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
|
|
8
|
+
module Solargraph
|
|
9
|
+
class YardMap
|
|
10
|
+
# Tools for managing core documentation.
|
|
11
|
+
#
|
|
12
|
+
module CoreDocs
|
|
13
|
+
# The URL for downloading core documentation
|
|
14
|
+
SOURCE = 'https://solargraph.org/download'
|
|
15
|
+
|
|
16
|
+
# The default core documentation version
|
|
17
|
+
DEFAULT = '2.2.2'
|
|
18
|
+
|
|
19
|
+
class << self
|
|
20
|
+
# The directory where core documentation is installed.
|
|
21
|
+
#
|
|
22
|
+
# @return [String]
|
|
23
|
+
def cache_dir
|
|
24
|
+
# The directory is not stored in a variable so it can be overridden
|
|
25
|
+
# in specs.
|
|
26
|
+
ENV['SOLARGRAPH_CACHE'] || File.join(Dir.home, '.solargraph', 'cache')
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Ensure installation of minimum documentation.
|
|
30
|
+
#
|
|
31
|
+
# @return [void]
|
|
32
|
+
def require_minimum
|
|
33
|
+
FileUtils.mkdir_p File.join(cache_dir, 'gems')
|
|
34
|
+
return unless best_match.nil?
|
|
35
|
+
FileUtils.cp File.join(Solargraph::YARDOC_PATH, "#{DEFAULT}.tar.gz"), cache_dir
|
|
36
|
+
install_archive File.join(cache_dir, "#{DEFAULT}.tar.gz")
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# True if core documentation is installed for the specified version
|
|
40
|
+
# number.
|
|
41
|
+
#
|
|
42
|
+
# @param ver [String] The version number to check
|
|
43
|
+
# @return [Boolean]
|
|
44
|
+
def valid?(ver)
|
|
45
|
+
dir = File.join(cache_dir, ver)
|
|
46
|
+
return false unless File.directory?(dir)
|
|
47
|
+
return false unless File.directory?(File.join(dir, 'yardoc'))
|
|
48
|
+
return false unless File.directory?(File.join(dir, 'yardoc-stdlib'))
|
|
49
|
+
true
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Get a list of version numbers for currently installed core
|
|
53
|
+
# documentation.
|
|
54
|
+
#
|
|
55
|
+
# @return [Array<String>] The installed version numbers
|
|
56
|
+
def versions
|
|
57
|
+
dirs = Dir[File.join(cache_dir, '*')].map{|d| File.basename(d)}
|
|
58
|
+
dirs.keep_if{|d| valid?(d)}
|
|
59
|
+
dirs.sort!{|a, b| Gem::Version.new(b) <=> Gem::Version.new(a)}
|
|
60
|
+
dirs
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Get the version number of the installed core documentation that is
|
|
64
|
+
# the closest match for the current Ruby version.
|
|
65
|
+
#
|
|
66
|
+
# @return [String] The closest match
|
|
67
|
+
def best_match
|
|
68
|
+
avail = versions
|
|
69
|
+
cur = Gem::Version.new(RUBY_VERSION)
|
|
70
|
+
avail.each do |v|
|
|
71
|
+
return v if Gem::Version.new(v) <= cur
|
|
72
|
+
end
|
|
73
|
+
avail.last
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Get a list of core documentation versions that are available for
|
|
77
|
+
# download.
|
|
78
|
+
#
|
|
79
|
+
# @return [Array<String>] The version numbers
|
|
80
|
+
def available
|
|
81
|
+
uri = URI.parse("#{SOURCE}/versions.json")
|
|
82
|
+
response = Net::HTTP.get_response(uri)
|
|
83
|
+
obj = JSON.parse(response.body)
|
|
84
|
+
raise SourceNotAvailableError, "Error connecting to #{SOURCE}" unless obj['status'] == 'ok'
|
|
85
|
+
obj['cores']
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Get the version number of core documentation available for download
|
|
89
|
+
# that is the closest match for the current Ruby version.
|
|
90
|
+
#
|
|
91
|
+
# @param current [String] The version to compare
|
|
92
|
+
# @return [String] The version number of the best match
|
|
93
|
+
def best_download current = RUBY_VERSION
|
|
94
|
+
rv = Gem::Version.new(current)
|
|
95
|
+
found = available
|
|
96
|
+
found.each do |ver|
|
|
97
|
+
return ver if Gem::Version.new(ver) <= rv
|
|
98
|
+
end
|
|
99
|
+
found.last
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Get the path to a yardoc file for Ruby core documentation.
|
|
103
|
+
#
|
|
104
|
+
# @param ver [String] The version number (best match is default)
|
|
105
|
+
# @return [String] The path to the yardoc
|
|
106
|
+
def yardoc_file(ver = best_match)
|
|
107
|
+
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
108
|
+
File.join(cache_dir, ver, 'yardoc')
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Get the path to a yardoc file for Ruby stdlib documentation.
|
|
112
|
+
#
|
|
113
|
+
# @param ver [String] The version number (best match is default)
|
|
114
|
+
# @return [String] The path to the yardoc
|
|
115
|
+
def yardoc_stdlib_file(ver = best_match)
|
|
116
|
+
raise ArgumentError, "Invalid core yardoc version #{ver}" unless valid?(ver)
|
|
117
|
+
File.join(cache_dir, ver, 'yardoc-stdlib')
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Download the specified version of core documentation.
|
|
121
|
+
#
|
|
122
|
+
# @param version [String]
|
|
123
|
+
# @return [void]
|
|
124
|
+
def download version
|
|
125
|
+
FileUtils.mkdir_p cache_dir
|
|
126
|
+
uri = URI.parse("#{SOURCE}/#{version}.tar.gz")
|
|
127
|
+
# @type [Net::HTTPResponse]
|
|
128
|
+
response = Net::HTTP.get_response(uri)
|
|
129
|
+
if response.code == '404'
|
|
130
|
+
raise ArgumentError, "Version #{version} is not available from #{SOURCE}"
|
|
131
|
+
else
|
|
132
|
+
zipfile = File.join(cache_dir, "#{version}.tar.gz")
|
|
133
|
+
File.binwrite zipfile, response.body
|
|
134
|
+
install_archive zipfile
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Reset the core documentation cache to the minimum requirement.
|
|
139
|
+
#
|
|
140
|
+
# @return [void]
|
|
141
|
+
def clear
|
|
142
|
+
FileUtils.rm_rf cache_dir, secure: true
|
|
143
|
+
require_minimum
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
private
|
|
147
|
+
|
|
148
|
+
# Extract the specified archive to the core cache directory.
|
|
149
|
+
#
|
|
150
|
+
# @param filename [String]
|
|
151
|
+
# @return [void]
|
|
152
|
+
def install_archive filename
|
|
153
|
+
tar_extract = Gem::Package::TarReader.new(Zlib::GzipReader.open(filename))
|
|
154
|
+
tar_extract.rewind
|
|
155
|
+
tar_extract.each do |entry|
|
|
156
|
+
if entry.directory?
|
|
157
|
+
FileUtils.mkdir_p File.join(cache_dir, entry.full_name)
|
|
158
|
+
else
|
|
159
|
+
FileUtils.mkdir_p File.join(cache_dir, File.dirname(entry.full_name))
|
|
160
|
+
File.open(File.join(cache_dir, entry.full_name), 'wb') do |f|
|
|
161
|
+
f << entry.read
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
tar_extract.close
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'fileutils'
|
|
4
|
+
require 'tmpdir'
|
|
5
|
+
require 'pathname'
|
|
6
|
+
require 'rubygems/package'
|
|
7
|
+
require 'shellwords'
|
|
8
|
+
|
|
9
|
+
module Solargraph
|
|
10
|
+
class YardMap
|
|
11
|
+
# Tools for generating core documentation.
|
|
12
|
+
#
|
|
13
|
+
module CoreGen
|
|
14
|
+
class << self
|
|
15
|
+
# Generate documentation from the specified Ruby source directory.
|
|
16
|
+
#
|
|
17
|
+
# @param ruby_dir [String] The Ruby source directory
|
|
18
|
+
# @param dest_dir [String] The destination directory for the yardocs
|
|
19
|
+
# @return [void]
|
|
20
|
+
def generate_docs ruby_dir, dest_dir
|
|
21
|
+
path_name = Pathname.new(Dir.pwd).join(dest_dir).to_s
|
|
22
|
+
FileUtils.mkdir_p path_name
|
|
23
|
+
Dir.chdir(ruby_dir) do
|
|
24
|
+
`yardoc -b "#{File.join(path_name, 'yardoc')}" -n *.c`
|
|
25
|
+
raise 'An error occurred generating the core yardoc.' unless $?.success?
|
|
26
|
+
`yardoc -b "#{File.join(path_name, 'yardoc-stdlib')}" -n lib ext`
|
|
27
|
+
raise 'An error occurred generating the stdlib yardoc.' unless $?.success?
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Generate a gzip of documentation from the specified Ruby source
|
|
32
|
+
# directory.
|
|
33
|
+
#
|
|
34
|
+
# This method is designed to generate the directory architecture that
|
|
35
|
+
# YardMap core docs expect.
|
|
36
|
+
#
|
|
37
|
+
# @param ruby_dir [String] The Ruby source directory
|
|
38
|
+
# @param ver_name [String, nil] The version name
|
|
39
|
+
# @param dest_dir [String] The destination directory
|
|
40
|
+
# @return [void]
|
|
41
|
+
def generate_gzip ruby_dir, ver_name = nil, dest_dir = Dir.pwd
|
|
42
|
+
Dir.mktmpdir do |tmp|
|
|
43
|
+
base_name = ver_name || begin
|
|
44
|
+
match = ruby_dir.match(/\d+\.\d+\.\d+$/)
|
|
45
|
+
raise "Unable to determine version name from #{ruby_dir}" if match.nil?
|
|
46
|
+
match[0]
|
|
47
|
+
end
|
|
48
|
+
path_name = Pathname.new(tmp).join(base_name).to_s
|
|
49
|
+
generate_docs ruby_dir, path_name
|
|
50
|
+
gzip path_name, Pathname.new(dest_dir).join("#{base_name}.tar.gz").to_s
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
private
|
|
55
|
+
|
|
56
|
+
# @param dir [String] The directory to compress
|
|
57
|
+
# @param dst [String] The destination file
|
|
58
|
+
def gzip dir, dst
|
|
59
|
+
File.open(dst, 'wb') do |file|
|
|
60
|
+
Zlib::GzipWriter.wrap(file) do |gzip|
|
|
61
|
+
Gem::Package::TarWriter.new(gzip) do |tar|
|
|
62
|
+
Dir["#{dir}/**/*"].each do |filename|
|
|
63
|
+
next if File.directory?(filename)
|
|
64
|
+
relname = File.join(File.basename(dir), filename[dir.length+1..-1])
|
|
65
|
+
tar.add_file_simple(relname, 0o644, File.size(filename)) do |io|
|
|
66
|
+
io.write File.read_binary(filename)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Solargraph
|
|
4
|
+
class YardMap
|
|
5
|
+
class Mapper
|
|
6
|
+
# @param code_objects [Array<YARD::CodeObjects::Base>]
|
|
7
|
+
# @param spec [Gem::Specification]
|
|
8
|
+
def initialize code_objects, spec = nil
|
|
9
|
+
@code_objects = code_objects
|
|
10
|
+
@spec = spec
|
|
11
|
+
@pins = []
|
|
12
|
+
@namespace_pins = {}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# @return [Array<Pin::Base>]
|
|
16
|
+
def map
|
|
17
|
+
@code_objects.each do |co|
|
|
18
|
+
@pins.concat generate_pins co
|
|
19
|
+
end
|
|
20
|
+
# Some yardocs contain documentation for dependencies that can be
|
|
21
|
+
# ignored here. The YardMap will load dependencies separately.
|
|
22
|
+
@pins.keep_if { |pin| pin.location.nil? || File.file?(pin.location.filename) } if @spec
|
|
23
|
+
@pins
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# @param code_object [YARD::CodeObjects::Base]
|
|
27
|
+
# @return [Array<Pin::Base>]
|
|
28
|
+
def generate_pins code_object
|
|
29
|
+
result = []
|
|
30
|
+
if code_object.is_a?(YARD::CodeObjects::NamespaceObject)
|
|
31
|
+
nspin = Solargraph::Pin::YardPin::Namespace.new(code_object, @spec, @namespace_pins[code_object.namespace.to_s])
|
|
32
|
+
@namespace_pins[code_object.path] = nspin
|
|
33
|
+
result.push nspin
|
|
34
|
+
if code_object.is_a?(YARD::CodeObjects::ClassObject) and !code_object.superclass.nil?
|
|
35
|
+
# This method of superclass detection is a bit of a hack. If
|
|
36
|
+
# the superclass is a Proxy, it is assumed to be undefined in its
|
|
37
|
+
# yardoc and converted to a fully qualified namespace.
|
|
38
|
+
if code_object.superclass.is_a?(YARD::CodeObjects::Proxy)
|
|
39
|
+
superclass = "::#{code_object.superclass}"
|
|
40
|
+
else
|
|
41
|
+
superclass = code_object.superclass.to_s
|
|
42
|
+
end
|
|
43
|
+
result.push Solargraph::Pin::Reference::Superclass.new(name: superclass, closure: nspin)
|
|
44
|
+
end
|
|
45
|
+
code_object.class_mixins.each do |m|
|
|
46
|
+
result.push Solargraph::Pin::Reference::Extend.new(closure: nspin, name: m.path)
|
|
47
|
+
end
|
|
48
|
+
code_object.instance_mixins.each do |m|
|
|
49
|
+
result.push Solargraph::Pin::Reference::Include.new(
|
|
50
|
+
closure: nspin, # @todo Fix this
|
|
51
|
+
name: m.path
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
elsif code_object.is_a?(YARD::CodeObjects::MethodObject)
|
|
55
|
+
closure = @namespace_pins[code_object.namespace.to_s]
|
|
56
|
+
if code_object.name == :initialize && code_object.scope == :instance
|
|
57
|
+
# @todo Check the visibility of <Class>.new
|
|
58
|
+
result.push Solargraph::Pin::YardPin::Method.new(code_object, 'new', :class, :public, closure, @spec)
|
|
59
|
+
result.push Solargraph::Pin::YardPin::Method.new(code_object, 'initialize', :instance, :private, closure, @spec)
|
|
60
|
+
else
|
|
61
|
+
result.push Solargraph::Pin::YardPin::Method.new(code_object, nil, nil, nil, closure, @spec)
|
|
62
|
+
end
|
|
63
|
+
elsif code_object.is_a?(YARD::CodeObjects::ConstantObject)
|
|
64
|
+
closure = @namespace_pins[code_object.namespace]
|
|
65
|
+
result.push Solargraph::Pin::YardPin::Constant.new(code_object, closure, @spec)
|
|
66
|
+
end
|
|
67
|
+
result
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'rdoc'
|
|
4
|
+
require 'rdoc/rdoc'
|
|
5
|
+
require 'tmpdir'
|
|
6
|
+
require 'fileutils'
|
|
7
|
+
|
|
8
|
+
module Solargraph
|
|
9
|
+
class YardMap
|
|
10
|
+
module RdocToYard
|
|
11
|
+
extend ApiMap::SourceToYard
|
|
12
|
+
|
|
13
|
+
# @param spec [Gem::Specification]
|
|
14
|
+
# @param cache_dir [String]
|
|
15
|
+
# @return [void]
|
|
16
|
+
def self.run spec, cache_dir: nil
|
|
17
|
+
Dir.mktmpdir do |tmpdir|
|
|
18
|
+
rdir = File.join(tmpdir, 'rdoc')
|
|
19
|
+
Dir.chdir spec.full_gem_path do
|
|
20
|
+
pins = []
|
|
21
|
+
pins.push Solargraph::Pin::ROOT_PIN
|
|
22
|
+
name_hash = {}
|
|
23
|
+
|
|
24
|
+
argv = ['-q', '-N', '-r', '-o', rdir]
|
|
25
|
+
spec.load_paths.each do |path|
|
|
26
|
+
argv.concat ['-i', path]
|
|
27
|
+
end
|
|
28
|
+
rdoc = RDoc::RDoc.new
|
|
29
|
+
rdoc.document argv
|
|
30
|
+
|
|
31
|
+
store = RDoc::Store.new(rdir)
|
|
32
|
+
store.load_all
|
|
33
|
+
store.cache[:modules].each do |mod|
|
|
34
|
+
# store.load_class(mod)
|
|
35
|
+
# @type [RDoc::NormalClass]
|
|
36
|
+
mod = store.find_class_or_module(mod)
|
|
37
|
+
closure = pins.select { |pin| pin.path == mod.full_name.split('::')[0..-2].join('::') }.first || pins.first
|
|
38
|
+
namepin = Solargraph::Pin::Namespace.new(
|
|
39
|
+
type: (mod.module? ? :module : :class),
|
|
40
|
+
name: mod.name,
|
|
41
|
+
comments: commentary(mod.comment),
|
|
42
|
+
closure: closure,
|
|
43
|
+
location: locate(mod)
|
|
44
|
+
)
|
|
45
|
+
mod.parse(mod.comment_location)
|
|
46
|
+
# @param inc [RDoc::Include]
|
|
47
|
+
mod.includes.each do |inc|
|
|
48
|
+
pins.push Solargraph::Pin::Reference::Include.new(
|
|
49
|
+
location: locate(inc),
|
|
50
|
+
name: inc.name,
|
|
51
|
+
closure: namepin
|
|
52
|
+
)
|
|
53
|
+
end
|
|
54
|
+
# @param inc [RDoc::Extend]
|
|
55
|
+
mod.extends.each do |ext|
|
|
56
|
+
pins.push Solargraph::Pin::Reference::Extend.new(
|
|
57
|
+
location: locate(ext),
|
|
58
|
+
name: ext.name,
|
|
59
|
+
closure: namepin
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
pins.push namepin
|
|
63
|
+
name_hash[mod.full_name] = namepin
|
|
64
|
+
# @param met [RDoc::AnyMethod]
|
|
65
|
+
mod.each_method do |met|
|
|
66
|
+
pin = Solargraph::SourceMap.load_string("def Object.tmp#{met.param_seq};end").first_pin('Object.tmp') || Solargraph::Pin::BaseMethod.new
|
|
67
|
+
pins.push Solargraph::Pin::Method.new(
|
|
68
|
+
name: met.name,
|
|
69
|
+
closure: namepin,
|
|
70
|
+
comments: commentary(met.comment),
|
|
71
|
+
scope: met.type.to_sym,
|
|
72
|
+
parameters: pin.parameters,
|
|
73
|
+
visibility: met.visibility,
|
|
74
|
+
location: locate(met)
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
# @param const [RDoc::Constant]
|
|
78
|
+
mod.each_constant do |const|
|
|
79
|
+
pins.push Solargraph::Pin::Constant.new(
|
|
80
|
+
name: const.name,
|
|
81
|
+
closure: namepin,
|
|
82
|
+
comments: commentary(const.comment),
|
|
83
|
+
location: locate(const)
|
|
84
|
+
)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
mapstore = Solargraph::ApiMap::Store.new(pins)
|
|
88
|
+
rake_yard(mapstore)
|
|
89
|
+
YARD::Registry.clear
|
|
90
|
+
code_object_map.values.each do |co|
|
|
91
|
+
YARD::Registry.register(co)
|
|
92
|
+
end
|
|
93
|
+
cache_dir ||= File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{spec.name}-#{spec.version}", "yardoc")
|
|
94
|
+
FileUtils.remove_entry_secure cache_dir if File.exist?(cache_dir)
|
|
95
|
+
FileUtils.mkdir_p cache_dir
|
|
96
|
+
# @todo Should merge be true?
|
|
97
|
+
YARD::Registry.save true, cache_dir
|
|
98
|
+
# Clear the serialized cache if it exists
|
|
99
|
+
FileUtils.safe_unlink File.join(CoreDocs.cache_dir, 'gems', "#{spec.name}-#{spec.version}.ser")
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def self.base_name mod
|
|
105
|
+
mod.full_name.split('::')[0..-2].join('::')
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def self.commentary cmnt
|
|
109
|
+
result = []
|
|
110
|
+
cmnt.parts.each do |part|
|
|
111
|
+
result.push RDoc::Markup::ToHtml.new({}).to_html(part.text) if part.respond_to?(:text)
|
|
112
|
+
end
|
|
113
|
+
result.join("\n\n")
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
# @param obj [RDoc::Context]
|
|
117
|
+
def self.locate obj
|
|
118
|
+
# @todo line is always nil for some reason
|
|
119
|
+
file, line = find_file(obj)
|
|
120
|
+
return nil if file.nil?
|
|
121
|
+
Location.new(
|
|
122
|
+
file,
|
|
123
|
+
Range.from_to(line || 1, 0, line || 1, 0)
|
|
124
|
+
)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def self.find_file obj
|
|
128
|
+
if obj.respond_to?(:in_files) && !obj.in_files.empty?
|
|
129
|
+
[obj.in_files.first.to_s.sub(/^file /, ''), obj.in_files.first.line]
|
|
130
|
+
else
|
|
131
|
+
[obj.file_name, obj.line]
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|