solargraph 0.47.2 → 0.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/workflows/plugins.yml +40 -0
- data/.github/workflows/rspec.yml +4 -8
- data/.github/workflows/typecheck.yml +34 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +166 -3
- data/LICENSE +1 -1
- data/README.md +19 -16
- data/SPONSORS.md +2 -9
- data/lib/solargraph/api_map/cache.rb +50 -20
- data/lib/solargraph/api_map/source_to_yard.rb +17 -10
- data/lib/solargraph/api_map/store.rb +68 -15
- data/lib/solargraph/api_map.rb +238 -112
- data/lib/solargraph/bench.rb +3 -2
- data/lib/solargraph/cache.rb +77 -0
- data/lib/solargraph/complex_type/type_methods.rb +116 -35
- data/lib/solargraph/complex_type/unique_type.rb +261 -33
- data/lib/solargraph/complex_type.rb +149 -30
- data/lib/solargraph/convention/rakefile.rb +17 -0
- data/lib/solargraph/convention.rb +2 -3
- data/lib/solargraph/converters/dd.rb +5 -0
- data/lib/solargraph/converters/dl.rb +3 -0
- data/lib/solargraph/converters/dt.rb +3 -0
- data/lib/solargraph/diagnostics/rubocop.rb +23 -8
- data/lib/solargraph/diagnostics/rubocop_helpers.rb +4 -1
- data/lib/solargraph/diagnostics/type_check.rb +1 -0
- data/lib/solargraph/diagnostics.rb +2 -2
- data/lib/solargraph/doc_map.rb +187 -0
- data/lib/solargraph/gem_pins.rb +72 -0
- data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
- data/lib/solargraph/language_server/host/dispatch.rb +22 -5
- data/lib/solargraph/language_server/host/message_worker.rb +4 -0
- data/lib/solargraph/language_server/host/sources.rb +8 -65
- data/lib/solargraph/language_server/host.rb +88 -93
- data/lib/solargraph/language_server/message/base.rb +1 -1
- data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
- data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
- data/lib/solargraph/language_server/message/extended/download_core.rb +1 -5
- data/lib/solargraph/language_server/message/initialize.rb +27 -0
- data/lib/solargraph/language_server/message/initialized.rb +1 -0
- data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
- data/lib/solargraph/language_server/message/text_document/formatting.rb +5 -4
- data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
- data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -6
- data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
- data/lib/solargraph/language_server/message/text_document.rb +1 -1
- data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
- data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +10 -3
- data/lib/solargraph/language_server/message.rb +1 -0
- data/lib/solargraph/language_server/progress.rb +118 -0
- data/lib/solargraph/language_server/transport/adapter.rb +16 -1
- data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
- data/lib/solargraph/language_server.rb +1 -0
- data/lib/solargraph/library.rb +231 -104
- data/lib/solargraph/location.rb +1 -0
- data/lib/solargraph/page.rb +6 -0
- data/lib/solargraph/parser/comment_ripper.rb +4 -0
- data/lib/solargraph/parser/node_methods.rb +47 -7
- data/lib/solargraph/parser/node_processor/base.rb +11 -1
- data/lib/solargraph/parser/node_processor.rb +1 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
- data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +57 -41
- data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +53 -0
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +14 -4
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/cvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +7 -20
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
- data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +47 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
- data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +7 -5
- data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +1 -1
- data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
- data/lib/solargraph/parser/parser_gem.rb +12 -0
- data/lib/solargraph/parser/region.rb +1 -1
- data/lib/solargraph/parser/snippet.rb +2 -0
- data/lib/solargraph/parser.rb +9 -10
- data/lib/solargraph/pin/base.rb +69 -11
- data/lib/solargraph/pin/base_variable.rb +40 -7
- data/lib/solargraph/pin/block.rb +81 -33
- data/lib/solargraph/pin/closure.rb +17 -2
- data/lib/solargraph/pin/common.rb +7 -3
- data/lib/solargraph/pin/conversions.rb +34 -8
- data/lib/solargraph/pin/delegated_method.rb +101 -0
- data/lib/solargraph/pin/documenting.rb +25 -32
- data/lib/solargraph/pin/instance_variable.rb +4 -0
- data/lib/solargraph/pin/local_variable.rb +13 -1
- data/lib/solargraph/pin/method.rb +273 -17
- data/lib/solargraph/pin/namespace.rb +17 -1
- data/lib/solargraph/pin/parameter.rb +40 -28
- data/lib/solargraph/pin/reference/override.rb +2 -2
- data/lib/solargraph/pin/reference.rb +8 -0
- data/lib/solargraph/pin/search.rb +4 -4
- data/lib/solargraph/pin/signature.rb +143 -0
- data/lib/solargraph/pin.rb +2 -1
- data/lib/solargraph/range.rb +4 -6
- data/lib/solargraph/rbs_map/conversions.rb +607 -0
- data/lib/solargraph/rbs_map/core_fills.rb +50 -0
- data/lib/solargraph/rbs_map/core_map.rb +28 -0
- data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
- data/lib/solargraph/rbs_map.rb +92 -0
- data/lib/solargraph/shell.rb +85 -59
- data/lib/solargraph/source/chain/array.rb +32 -0
- data/lib/solargraph/source/chain/block_symbol.rb +13 -0
- data/lib/solargraph/source/chain/call.rb +125 -61
- data/lib/solargraph/source/chain/constant.rb +15 -1
- data/lib/solargraph/source/chain/if.rb +23 -0
- data/lib/solargraph/source/chain/link.rb +8 -2
- data/lib/solargraph/source/chain/or.rb +1 -1
- data/lib/solargraph/source/chain/z_super.rb +3 -3
- data/lib/solargraph/source/chain.rb +64 -14
- data/lib/solargraph/source/change.rb +3 -0
- data/lib/solargraph/source/cursor.rb +2 -0
- data/lib/solargraph/source/source_chainer.rb +8 -5
- data/lib/solargraph/source/updater.rb +1 -0
- data/lib/solargraph/source.rb +18 -63
- data/lib/solargraph/source_map/clip.rb +31 -23
- data/lib/solargraph/source_map/mapper.rb +23 -7
- data/lib/solargraph/source_map.rb +36 -11
- data/lib/solargraph/type_checker/checks.rb +10 -2
- data/lib/solargraph/type_checker.rb +229 -100
- data/lib/solargraph/version.rb +1 -1
- data/lib/solargraph/views/environment.erb +2 -2
- data/lib/solargraph/workspace/config.rb +15 -11
- data/lib/solargraph/workspace.rb +41 -17
- data/lib/solargraph/yard_map/cache.rb +6 -0
- data/lib/solargraph/yard_map/helpers.rb +1 -1
- data/lib/solargraph/yard_map/mapper/to_method.rb +23 -7
- data/lib/solargraph/yard_map/mapper.rb +1 -1
- data/lib/solargraph/yard_map/to_method.rb +11 -4
- data/lib/solargraph/yard_map.rb +1 -443
- data/lib/solargraph/yard_tags.rb +20 -0
- data/lib/solargraph/yardoc.rb +52 -0
- data/lib/solargraph.rb +8 -6
- data/solargraph.gemspec +19 -8
- metadata +164 -99
- data/.travis.yml +0 -19
- data/lib/solargraph/api_map/bundler_methods.rb +0 -22
- data/lib/solargraph/compat.rb +0 -37
- data/lib/solargraph/convention/rspec.rb +0 -30
- data/lib/solargraph/documentor.rb +0 -76
- data/lib/solargraph/language_server/host/cataloger.rb +0 -56
- data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
- data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
- data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
- data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +0 -23
- data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
- data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
- data/lib/solargraph/parser/legacy.rb +0 -12
- data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
- data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
- data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
- data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
- data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
- data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
- data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
- data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
- data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
- data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
- data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
- data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
- data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
- data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
- data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
- data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
- data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
- data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
- data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
- data/lib/solargraph/parser/rubyvm.rb +0 -40
- data/lib/solargraph/yard_map/core_docs.rb +0 -170
- data/lib/solargraph/yard_map/core_fills.rb +0 -208
- data/lib/solargraph/yard_map/core_gen.rb +0 -76
- data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
- data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
- data/lib/yard-solargraph.rb +0 -33
- data/yardoc/2.2.2.tar.gz +0 -0
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rbs'
|
4
|
+
|
5
|
+
module Solargraph
|
6
|
+
class RbsMap
|
7
|
+
# Ruby stdlib pins
|
8
|
+
#
|
9
|
+
class StdlibMap < RbsMap
|
10
|
+
# @type [Hash{String => RbsMap}]
|
11
|
+
@stdlib_maps_hash = {}
|
12
|
+
|
13
|
+
# @param library [String]
|
14
|
+
def initialize library
|
15
|
+
cache = Cache.load('stdlib', "#{library}.ser")
|
16
|
+
if cache
|
17
|
+
pins.replace cache
|
18
|
+
@resolved = true
|
19
|
+
else
|
20
|
+
super
|
21
|
+
return unless resolved?
|
22
|
+
Cache.save('stdlib', "#{library}.ser", pins)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @param library [String]
|
27
|
+
# @return [StdlibMap]
|
28
|
+
def self.load library
|
29
|
+
@stdlib_maps_hash[library] ||= StdlibMap.new(library)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'rbs'
|
5
|
+
|
6
|
+
module Solargraph
|
7
|
+
class RbsMap
|
8
|
+
autoload :Conversions, 'solargraph/rbs_map/conversions'
|
9
|
+
autoload :CoreMap, 'solargraph/rbs_map/core_map'
|
10
|
+
autoload :CoreFills, 'solargraph/rbs_map/core_fills'
|
11
|
+
autoload :StdlibMap, 'solargraph/rbs_map/stdlib_map'
|
12
|
+
|
13
|
+
include Conversions
|
14
|
+
|
15
|
+
# @type [Hash{String => RbsMap}]
|
16
|
+
@@rbs_maps_hash = {}
|
17
|
+
|
18
|
+
attr_reader :library
|
19
|
+
|
20
|
+
# @param library [String]
|
21
|
+
# @param version [String, nil]
|
22
|
+
# @param directories [Array<Pathname, String>]
|
23
|
+
def initialize library, version = nil, directories: []
|
24
|
+
@library = library
|
25
|
+
@version = version
|
26
|
+
@collection = nil
|
27
|
+
@directories = directories
|
28
|
+
loader = RBS::EnvironmentLoader.new(core_root: nil, repository: repository)
|
29
|
+
add_library loader, library, version
|
30
|
+
return unless resolved?
|
31
|
+
load_environment_to_pins(loader)
|
32
|
+
end
|
33
|
+
|
34
|
+
# @generic T
|
35
|
+
# @param path [String]
|
36
|
+
# @param klass [Class<generic<T>>]
|
37
|
+
# @return [generic<T>, nil]
|
38
|
+
def path_pin path, klass = Pin::Base
|
39
|
+
pin = pins.find { |p| p.path == path }
|
40
|
+
pin if pin&.is_a?(klass)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param path [String]
|
44
|
+
# @return [Array<Pin::Base>]
|
45
|
+
def path_pins path
|
46
|
+
pins.select { |p| p.path == path }
|
47
|
+
end
|
48
|
+
|
49
|
+
def resolved?
|
50
|
+
@resolved
|
51
|
+
end
|
52
|
+
|
53
|
+
def repository
|
54
|
+
@repository ||= RBS::Repository.new(no_stdlib: false).tap do |repo|
|
55
|
+
# @todo Temporarily ignoring external directories due to issues with
|
56
|
+
# incomplete/broken gem_rbs_collection installations
|
57
|
+
# @directories.each { |dir| repo.add(Pathname.new(dir)) }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# @param library [String]
|
62
|
+
# @return [RbsMap]
|
63
|
+
def self.load library
|
64
|
+
@@rbs_maps_hash[library] ||= RbsMap.new(library)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.from_gemspec(gemspec)
|
68
|
+
RbsMap.new(gemspec.name, gemspec.version)
|
69
|
+
end
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# @param loader [RBS::EnvironmentLoader]
|
74
|
+
# @param library [String]
|
75
|
+
# @return [Boolean] true if adding the library succeeded
|
76
|
+
def add_library loader, library, version
|
77
|
+
@resolved = if loader.has_library?(library: library, version: version)
|
78
|
+
loader.add library: library, version: version
|
79
|
+
Solargraph.logger.info "#{short_name} successfully loaded library #{library}"
|
80
|
+
true
|
81
|
+
else
|
82
|
+
Solargraph.logger.info "#{short_name} failed to load library #{library}"
|
83
|
+
false
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
# @return [String]
|
88
|
+
def short_name
|
89
|
+
self.class.name.split('::').last
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
data/lib/solargraph/shell.rb
CHANGED
@@ -1,14 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'benchmark'
|
3
4
|
require 'thor'
|
5
|
+
require 'yard'
|
4
6
|
|
5
7
|
module Solargraph
|
6
8
|
class Shell < Thor
|
7
9
|
include Solargraph::ServerMethods
|
8
10
|
|
11
|
+
# Tell Thor to ensure the process exits with status 1 if any error happens.
|
12
|
+
def self.exit_on_failure?
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
9
16
|
map %w[--version -v] => :version
|
10
17
|
|
11
18
|
desc "--version, -v", "Print the version"
|
19
|
+
# @return [void]
|
12
20
|
def version
|
13
21
|
puts Solargraph::VERSION
|
14
22
|
end
|
@@ -16,6 +24,7 @@ module Solargraph
|
|
16
24
|
desc 'socket', 'Run a Solargraph socket server'
|
17
25
|
option :host, type: :string, aliases: :h, desc: 'The server host', default: '127.0.0.1'
|
18
26
|
option :port, type: :numeric, aliases: :p, desc: 'The server port', default: 7658
|
27
|
+
# @return [void]
|
19
28
|
def socket
|
20
29
|
require 'backport'
|
21
30
|
port = options[:port]
|
@@ -33,6 +42,7 @@ module Solargraph
|
|
33
42
|
end
|
34
43
|
|
35
44
|
desc 'stdio', 'Run a Solargraph stdio server'
|
45
|
+
# @return [void]
|
36
46
|
def stdio
|
37
47
|
require 'backport'
|
38
48
|
Backport.run do
|
@@ -49,6 +59,8 @@ module Solargraph
|
|
49
59
|
|
50
60
|
desc 'config [DIRECTORY]', 'Create or overwrite a default configuration file'
|
51
61
|
option :extensions, type: :boolean, aliases: :e, desc: 'Add installed extensions', default: true
|
62
|
+
# @param directory [String]
|
63
|
+
# @return [void]
|
52
64
|
def config(directory = '.')
|
53
65
|
matches = []
|
54
66
|
if options[:extensions]
|
@@ -71,59 +83,57 @@ module Solargraph
|
|
71
83
|
STDOUT.puts "Configuration file initialized."
|
72
84
|
end
|
73
85
|
|
74
|
-
desc 'download-core [VERSION]', 'Download core documentation'
|
75
|
-
def download_core version = nil
|
76
|
-
ver = version || Solargraph::YardMap::CoreDocs.best_download
|
77
|
-
if RUBY_VERSION != ver
|
78
|
-
puts "Documentation for #{RUBY_VERSION} is not available. Reverting to closest match..."
|
79
|
-
end
|
80
|
-
puts "Downloading docs for #{ver}..."
|
81
|
-
Solargraph::YardMap::CoreDocs.download ver
|
82
|
-
# Clear cached documentation if it exists
|
83
|
-
FileUtils.rm_rf Dir.glob(File.join(Solargraph::YardMap::CoreDocs.cache_dir, ver, '*.ser'))
|
84
|
-
puts "Download complete."
|
85
|
-
rescue ArgumentError => e
|
86
|
-
STDERR.puts "ERROR: #{e.message}"
|
87
|
-
STDERR.puts "Run `solargraph available-cores` for a list."
|
88
|
-
exit 1
|
89
|
-
end
|
90
|
-
|
91
|
-
desc 'list-cores', 'List the local documentation versions'
|
92
|
-
def list_cores
|
93
|
-
puts Solargraph::YardMap::CoreDocs.versions.join("\n")
|
94
|
-
end
|
95
|
-
|
96
|
-
desc 'available-cores', 'List available documentation versions'
|
97
|
-
def available_cores
|
98
|
-
puts Solargraph::YardMap::CoreDocs.available.join("\n")
|
99
|
-
end
|
100
|
-
|
101
86
|
desc 'clear', 'Delete all cached documentation'
|
102
87
|
long_desc %(
|
103
88
|
This command will delete all core and gem documentation from the cache.
|
104
|
-
You can also delete specific gem caches with the `uncache` command or
|
105
|
-
update documentation for specific Ruby versions with the `download-core`
|
106
|
-
command.
|
107
89
|
)
|
90
|
+
# @return [void]
|
108
91
|
def clear
|
109
92
|
puts "Deleting the cached documentation"
|
110
|
-
Solargraph::
|
93
|
+
Solargraph::Cache.clear
|
111
94
|
end
|
112
95
|
map 'clear-cache' => :clear
|
113
96
|
map 'clear-cores' => :clear
|
114
97
|
|
98
|
+
desc 'cache', 'Cache a gem', hide: true
|
99
|
+
# @return [void]
|
100
|
+
# @param gem [String]
|
101
|
+
# @param version [String, nil]
|
102
|
+
def cache gem, version = nil
|
103
|
+
spec = Gem::Specification.find_by_name(gem, version)
|
104
|
+
pins = GemPins.build(spec)
|
105
|
+
Cache.save('gems', "#{spec.name}-#{spec.version}.ser", pins)
|
106
|
+
end
|
107
|
+
|
115
108
|
desc 'uncache GEM [...GEM]', "Delete cached gem documentation"
|
109
|
+
# @return [void]
|
116
110
|
def uncache *gems
|
117
111
|
raise ArgumentError, 'No gems specified.' if gems.empty?
|
118
112
|
gems.each do |gem|
|
119
|
-
|
120
|
-
|
121
|
-
|
113
|
+
spec = Gem::Specification.find_by_name(gem)
|
114
|
+
Cache.uncache('gems', "#{spec.name}-#{spec.version}.ser")
|
115
|
+
Cache.uncache('gems', "#{spec.name}-#{spec.version}.yardoc")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
desc 'gems [GEM[=VERSION]]', 'Cache documentation for installed gems'
|
120
|
+
option :rebuild, type: :boolean, desc: 'Rebuild existing documentation', default: false
|
121
|
+
# @return [void]
|
122
|
+
def gems *names
|
123
|
+
if names.empty?
|
124
|
+
Gem::Specification.to_a.each { |spec| do_cache spec }
|
125
|
+
else
|
126
|
+
names.each do |name|
|
127
|
+
spec = Gem::Specification.find_by_name(*name.split('='))
|
128
|
+
do_cache spec
|
129
|
+
rescue Gem::MissingSpecError
|
130
|
+
warn "Gem '#{name}' not found"
|
122
131
|
end
|
123
132
|
end
|
124
133
|
end
|
125
134
|
|
126
135
|
desc 'reporters', 'Get a list of diagnostics reporters'
|
136
|
+
# @return [void]
|
127
137
|
def reporters
|
128
138
|
puts Solargraph::Diagnostics.reporters
|
129
139
|
end
|
@@ -137,26 +147,33 @@ module Solargraph
|
|
137
147
|
)
|
138
148
|
option :level, type: :string, aliases: [:mode, :m, :l], desc: 'Type checking level', default: 'normal'
|
139
149
|
option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
|
150
|
+
# @return [void]
|
140
151
|
def typecheck *files
|
141
152
|
directory = File.realpath(options[:directory])
|
142
|
-
api_map = Solargraph::ApiMap.
|
153
|
+
api_map = Solargraph::ApiMap.load_with_cache(directory, $stdout)
|
154
|
+
probcount = 0
|
143
155
|
if files.empty?
|
144
156
|
files = api_map.source_maps.map(&:filename)
|
145
157
|
else
|
146
158
|
files.map! { |file| File.realpath(file) }
|
147
159
|
end
|
148
|
-
probcount = 0
|
149
160
|
filecount = 0
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
161
|
+
|
162
|
+
time = Benchmark.measure {
|
163
|
+
files.each do |file|
|
164
|
+
checker = TypeChecker.new(file, api_map: api_map, level: options[:level].to_sym)
|
165
|
+
problems = checker.problems
|
166
|
+
next if problems.empty?
|
167
|
+
problems.sort! { |a, b| a.location.range.start.line <=> b.location.range.start.line }
|
168
|
+
puts problems.map { |prob| "#{prob.location.filename}:#{prob.location.range.start.line + 1} - #{prob.message}" }.join("\n")
|
169
|
+
filecount += 1
|
170
|
+
probcount += problems.length
|
171
|
+
end
|
172
|
+
# "
|
173
|
+
}
|
174
|
+
puts "Typecheck finished in #{time.real} seconds."
|
159
175
|
puts "#{probcount} problem#{probcount != 1 ? 's' : ''} found#{files.length != 1 ? " in #{filecount} of #{files.length} files" : ''}."
|
176
|
+
# "
|
160
177
|
exit 1 if probcount > 0
|
161
178
|
end
|
162
179
|
|
@@ -169,12 +186,12 @@ module Solargraph
|
|
169
186
|
)
|
170
187
|
option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
|
171
188
|
option :verbose, type: :boolean, aliases: :v, desc: 'Verbose output', default: false
|
189
|
+
# @return [void]
|
172
190
|
def scan
|
173
|
-
require 'benchmark'
|
174
191
|
directory = File.realpath(options[:directory])
|
175
192
|
api_map = nil
|
176
193
|
time = Benchmark.measure {
|
177
|
-
api_map = Solargraph::ApiMap.
|
194
|
+
api_map = Solargraph::ApiMap.load_with_cache(directory, $stdout)
|
178
195
|
api_map.pins.each do |pin|
|
179
196
|
begin
|
180
197
|
puts pin_description(pin) if options[:verbose]
|
@@ -191,18 +208,14 @@ module Solargraph
|
|
191
208
|
puts "Scanned #{directory} (#{api_map.pins.length} pins) in #{time.real} seconds."
|
192
209
|
end
|
193
210
|
|
194
|
-
desc '
|
195
|
-
option :
|
196
|
-
option :
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
def rdoc gem, version = '>= 0'
|
203
|
-
spec = Gem::Specification.find_by_name(gem, version)
|
204
|
-
puts "Caching #{spec.name} #{spec.version} from RDoc"
|
205
|
-
Solargraph::YardMap::RdocToYard.run(spec)
|
211
|
+
desc 'list', 'List the files in the workspace and the total count'
|
212
|
+
option :count, type: :boolean, aliases: :c, desc: 'Display the file count only', default: false
|
213
|
+
option :directory, type: :string, aliases: :d, desc: 'The directory to read', default: '.'
|
214
|
+
# @return [void]
|
215
|
+
def list
|
216
|
+
workspace = Solargraph::Workspace.new(options[:directory])
|
217
|
+
puts workspace.filenames unless options[:count]
|
218
|
+
puts "#{workspace.filenames.length} files total."
|
206
219
|
end
|
207
220
|
|
208
221
|
private
|
@@ -222,5 +235,18 @@ module Solargraph
|
|
222
235
|
desc += " (#{pin.location.filename} #{pin.location.range.start.line})" if pin.location
|
223
236
|
desc
|
224
237
|
end
|
238
|
+
|
239
|
+
# @param gemspec [Gem::Specification]
|
240
|
+
# @return [void]
|
241
|
+
def do_cache gemspec
|
242
|
+
cached = Yardoc.cached?(gemspec)
|
243
|
+
if cached && !options.rebuild
|
244
|
+
puts "Cache already exists for #{gemspec.name} #{gemspec.version}"
|
245
|
+
else
|
246
|
+
puts "#{cached ? 'Rebuilding' : 'Caching'} gem documentation for #{gemspec.name} #{gemspec.version}"
|
247
|
+
pins = GemPins.build(gemspec)
|
248
|
+
Cache.save('gems', "#{gemspec.name}-#{gemspec.version}.ser", pins)
|
249
|
+
end
|
250
|
+
end
|
225
251
|
end
|
226
252
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Solargraph
|
2
|
+
class Source
|
3
|
+
class Chain
|
4
|
+
class Array < Literal
|
5
|
+
# @param children [::Array<Chain>]
|
6
|
+
def initialize children
|
7
|
+
super('::Array')
|
8
|
+
@children = children
|
9
|
+
end
|
10
|
+
|
11
|
+
def word
|
12
|
+
@word ||= "<#{@type}>"
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param api_map [ApiMap]
|
16
|
+
# @param name_pin [Pin::Base]
|
17
|
+
# @param locals [Enumerable<Pin::LocalVariable>]
|
18
|
+
def resolve api_map, name_pin, locals
|
19
|
+
child_types = @children.map do |child|
|
20
|
+
child.infer(api_map, name_pin, locals).tag
|
21
|
+
end
|
22
|
+
type = if child_types.uniq.length == 1 && child_types.first != 'undefined'
|
23
|
+
"::Array<#{child_types.first}>"
|
24
|
+
else
|
25
|
+
'::Array'
|
26
|
+
end
|
27
|
+
[Pin::ProxyType.anonymous(ComplexType.try_parse(type))]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|