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.
Files changed (191) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.github/workflows/plugins.yml +40 -0
  4. data/.github/workflows/rspec.yml +4 -8
  5. data/.github/workflows/typecheck.yml +34 -0
  6. data/.yardopts +2 -2
  7. data/CHANGELOG.md +166 -3
  8. data/LICENSE +1 -1
  9. data/README.md +19 -16
  10. data/SPONSORS.md +2 -9
  11. data/lib/solargraph/api_map/cache.rb +50 -20
  12. data/lib/solargraph/api_map/source_to_yard.rb +17 -10
  13. data/lib/solargraph/api_map/store.rb +68 -15
  14. data/lib/solargraph/api_map.rb +238 -112
  15. data/lib/solargraph/bench.rb +3 -2
  16. data/lib/solargraph/cache.rb +77 -0
  17. data/lib/solargraph/complex_type/type_methods.rb +116 -35
  18. data/lib/solargraph/complex_type/unique_type.rb +261 -33
  19. data/lib/solargraph/complex_type.rb +149 -30
  20. data/lib/solargraph/convention/rakefile.rb +17 -0
  21. data/lib/solargraph/convention.rb +2 -3
  22. data/lib/solargraph/converters/dd.rb +5 -0
  23. data/lib/solargraph/converters/dl.rb +3 -0
  24. data/lib/solargraph/converters/dt.rb +3 -0
  25. data/lib/solargraph/diagnostics/rubocop.rb +23 -8
  26. data/lib/solargraph/diagnostics/rubocop_helpers.rb +4 -1
  27. data/lib/solargraph/diagnostics/type_check.rb +1 -0
  28. data/lib/solargraph/diagnostics.rb +2 -2
  29. data/lib/solargraph/doc_map.rb +187 -0
  30. data/lib/solargraph/gem_pins.rb +72 -0
  31. data/lib/solargraph/language_server/host/diagnoser.rb +2 -2
  32. data/lib/solargraph/language_server/host/dispatch.rb +22 -5
  33. data/lib/solargraph/language_server/host/message_worker.rb +4 -0
  34. data/lib/solargraph/language_server/host/sources.rb +8 -65
  35. data/lib/solargraph/language_server/host.rb +88 -93
  36. data/lib/solargraph/language_server/message/base.rb +1 -1
  37. data/lib/solargraph/language_server/message/completion_item/resolve.rb +3 -1
  38. data/lib/solargraph/language_server/message/extended/check_gem_version.rb +13 -1
  39. data/lib/solargraph/language_server/message/extended/download_core.rb +1 -5
  40. data/lib/solargraph/language_server/message/initialize.rb +27 -0
  41. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  42. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
  43. data/lib/solargraph/language_server/message/text_document/formatting.rb +5 -4
  44. data/lib/solargraph/language_server/message/text_document/hover.rb +2 -0
  45. data/lib/solargraph/language_server/message/text_document/signature_help.rb +1 -6
  46. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  47. data/lib/solargraph/language_server/message/text_document.rb +1 -1
  48. data/lib/solargraph/language_server/message/workspace/did_change_configuration.rb +5 -0
  49. data/lib/solargraph/language_server/message/workspace/did_change_watched_files.rb +10 -3
  50. data/lib/solargraph/language_server/message.rb +1 -0
  51. data/lib/solargraph/language_server/progress.rb +118 -0
  52. data/lib/solargraph/language_server/transport/adapter.rb +16 -1
  53. data/lib/solargraph/language_server/transport/data_reader.rb +2 -0
  54. data/lib/solargraph/language_server.rb +1 -0
  55. data/lib/solargraph/library.rb +231 -104
  56. data/lib/solargraph/location.rb +1 -0
  57. data/lib/solargraph/page.rb +6 -0
  58. data/lib/solargraph/parser/comment_ripper.rb +4 -0
  59. data/lib/solargraph/parser/node_methods.rb +47 -7
  60. data/lib/solargraph/parser/node_processor/base.rb +11 -1
  61. data/lib/solargraph/parser/node_processor.rb +1 -0
  62. data/lib/solargraph/parser/{legacy → parser_gem}/class_methods.rb +31 -9
  63. data/lib/solargraph/parser/{legacy → parser_gem}/flawed_builder.rb +3 -1
  64. data/lib/solargraph/parser/{legacy → parser_gem}/node_chainer.rb +57 -41
  65. data/lib/solargraph/parser/parser_gem/node_methods.rb +495 -0
  66. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/alias_node.rb +1 -1
  67. data/lib/solargraph/parser/parser_gem/node_processors/args_node.rb +53 -0
  68. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/begin_node.rb +1 -1
  69. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/block_node.rb +3 -2
  70. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/casgn_node.rb +14 -4
  71. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/cvasgn_node.rb +1 -1
  72. data/lib/solargraph/parser/{rubyvm → parser_gem}/node_processors/def_node.rb +7 -20
  73. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/defs_node.rb +2 -2
  74. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/gvasgn_node.rb +1 -1
  75. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/ivasgn_node.rb +2 -2
  76. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/lvasgn_node.rb +2 -2
  77. data/lib/solargraph/parser/parser_gem/node_processors/masgn_node.rb +47 -0
  78. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/namespace_node.rb +2 -2
  79. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/orasgn_node.rb +1 -1
  80. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/resbody_node.rb +3 -3
  81. data/lib/solargraph/parser/parser_gem/node_processors/sclass_node.rb +42 -0
  82. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/send_node.rb +7 -5
  83. data/lib/solargraph/parser/{legacy → parser_gem}/node_processors/sym_node.rb +1 -1
  84. data/lib/solargraph/parser/parser_gem/node_processors.rb +56 -0
  85. data/lib/solargraph/parser/parser_gem.rb +12 -0
  86. data/lib/solargraph/parser/region.rb +1 -1
  87. data/lib/solargraph/parser/snippet.rb +2 -0
  88. data/lib/solargraph/parser.rb +9 -10
  89. data/lib/solargraph/pin/base.rb +69 -11
  90. data/lib/solargraph/pin/base_variable.rb +40 -7
  91. data/lib/solargraph/pin/block.rb +81 -33
  92. data/lib/solargraph/pin/closure.rb +17 -2
  93. data/lib/solargraph/pin/common.rb +7 -3
  94. data/lib/solargraph/pin/conversions.rb +34 -8
  95. data/lib/solargraph/pin/delegated_method.rb +101 -0
  96. data/lib/solargraph/pin/documenting.rb +25 -32
  97. data/lib/solargraph/pin/instance_variable.rb +4 -0
  98. data/lib/solargraph/pin/local_variable.rb +13 -1
  99. data/lib/solargraph/pin/method.rb +273 -17
  100. data/lib/solargraph/pin/namespace.rb +17 -1
  101. data/lib/solargraph/pin/parameter.rb +40 -28
  102. data/lib/solargraph/pin/reference/override.rb +2 -2
  103. data/lib/solargraph/pin/reference.rb +8 -0
  104. data/lib/solargraph/pin/search.rb +4 -4
  105. data/lib/solargraph/pin/signature.rb +143 -0
  106. data/lib/solargraph/pin.rb +2 -1
  107. data/lib/solargraph/range.rb +4 -6
  108. data/lib/solargraph/rbs_map/conversions.rb +607 -0
  109. data/lib/solargraph/rbs_map/core_fills.rb +50 -0
  110. data/lib/solargraph/rbs_map/core_map.rb +28 -0
  111. data/lib/solargraph/rbs_map/stdlib_map.rb +33 -0
  112. data/lib/solargraph/rbs_map.rb +92 -0
  113. data/lib/solargraph/shell.rb +85 -59
  114. data/lib/solargraph/source/chain/array.rb +32 -0
  115. data/lib/solargraph/source/chain/block_symbol.rb +13 -0
  116. data/lib/solargraph/source/chain/call.rb +125 -61
  117. data/lib/solargraph/source/chain/constant.rb +15 -1
  118. data/lib/solargraph/source/chain/if.rb +23 -0
  119. data/lib/solargraph/source/chain/link.rb +8 -2
  120. data/lib/solargraph/source/chain/or.rb +1 -1
  121. data/lib/solargraph/source/chain/z_super.rb +3 -3
  122. data/lib/solargraph/source/chain.rb +64 -14
  123. data/lib/solargraph/source/change.rb +3 -0
  124. data/lib/solargraph/source/cursor.rb +2 -0
  125. data/lib/solargraph/source/source_chainer.rb +8 -5
  126. data/lib/solargraph/source/updater.rb +1 -0
  127. data/lib/solargraph/source.rb +18 -63
  128. data/lib/solargraph/source_map/clip.rb +31 -23
  129. data/lib/solargraph/source_map/mapper.rb +23 -7
  130. data/lib/solargraph/source_map.rb +36 -11
  131. data/lib/solargraph/type_checker/checks.rb +10 -2
  132. data/lib/solargraph/type_checker.rb +229 -100
  133. data/lib/solargraph/version.rb +1 -1
  134. data/lib/solargraph/views/environment.erb +2 -2
  135. data/lib/solargraph/workspace/config.rb +15 -11
  136. data/lib/solargraph/workspace.rb +41 -17
  137. data/lib/solargraph/yard_map/cache.rb +6 -0
  138. data/lib/solargraph/yard_map/helpers.rb +1 -1
  139. data/lib/solargraph/yard_map/mapper/to_method.rb +23 -7
  140. data/lib/solargraph/yard_map/mapper.rb +1 -1
  141. data/lib/solargraph/yard_map/to_method.rb +11 -4
  142. data/lib/solargraph/yard_map.rb +1 -443
  143. data/lib/solargraph/yard_tags.rb +20 -0
  144. data/lib/solargraph/yardoc.rb +52 -0
  145. data/lib/solargraph.rb +8 -6
  146. data/solargraph.gemspec +19 -8
  147. metadata +164 -99
  148. data/.travis.yml +0 -19
  149. data/lib/solargraph/api_map/bundler_methods.rb +0 -22
  150. data/lib/solargraph/compat.rb +0 -37
  151. data/lib/solargraph/convention/rspec.rb +0 -30
  152. data/lib/solargraph/documentor.rb +0 -76
  153. data/lib/solargraph/language_server/host/cataloger.rb +0 -56
  154. data/lib/solargraph/parser/legacy/node_methods.rb +0 -325
  155. data/lib/solargraph/parser/legacy/node_processors/alias_node.rb +0 -23
  156. data/lib/solargraph/parser/legacy/node_processors/args_node.rb +0 -35
  157. data/lib/solargraph/parser/legacy/node_processors/begin_node.rb +0 -15
  158. data/lib/solargraph/parser/legacy/node_processors/cvasgn_node.rb +0 -23
  159. data/lib/solargraph/parser/legacy/node_processors/def_node.rb +0 -63
  160. data/lib/solargraph/parser/legacy/node_processors/sclass_node.rb +0 -21
  161. data/lib/solargraph/parser/legacy/node_processors.rb +0 -54
  162. data/lib/solargraph/parser/legacy.rb +0 -12
  163. data/lib/solargraph/parser/rubyvm/class_methods.rb +0 -144
  164. data/lib/solargraph/parser/rubyvm/node_chainer.rb +0 -160
  165. data/lib/solargraph/parser/rubyvm/node_methods.rb +0 -315
  166. data/lib/solargraph/parser/rubyvm/node_processors/args_node.rb +0 -85
  167. data/lib/solargraph/parser/rubyvm/node_processors/block_node.rb +0 -42
  168. data/lib/solargraph/parser/rubyvm/node_processors/casgn_node.rb +0 -22
  169. data/lib/solargraph/parser/rubyvm/node_processors/defs_node.rb +0 -57
  170. data/lib/solargraph/parser/rubyvm/node_processors/gvasgn_node.rb +0 -23
  171. data/lib/solargraph/parser/rubyvm/node_processors/ivasgn_node.rb +0 -38
  172. data/lib/solargraph/parser/rubyvm/node_processors/kw_arg_node.rb +0 -39
  173. data/lib/solargraph/parser/rubyvm/node_processors/lit_node.rb +0 -20
  174. data/lib/solargraph/parser/rubyvm/node_processors/lvasgn_node.rb +0 -27
  175. data/lib/solargraph/parser/rubyvm/node_processors/namespace_node.rb +0 -39
  176. data/lib/solargraph/parser/rubyvm/node_processors/opt_arg_node.rb +0 -26
  177. data/lib/solargraph/parser/rubyvm/node_processors/orasgn_node.rb +0 -15
  178. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +0 -45
  179. data/lib/solargraph/parser/rubyvm/node_processors/sclass_node.rb +0 -21
  180. data/lib/solargraph/parser/rubyvm/node_processors/scope_node.rb +0 -15
  181. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +0 -277
  182. data/lib/solargraph/parser/rubyvm/node_processors/sym_node.rb +0 -18
  183. data/lib/solargraph/parser/rubyvm/node_processors.rb +0 -63
  184. data/lib/solargraph/parser/rubyvm.rb +0 -40
  185. data/lib/solargraph/yard_map/core_docs.rb +0 -170
  186. data/lib/solargraph/yard_map/core_fills.rb +0 -208
  187. data/lib/solargraph/yard_map/core_gen.rb +0 -76
  188. data/lib/solargraph/yard_map/rdoc_to_yard.rb +0 -140
  189. data/lib/solargraph/yard_map/stdlib_fills.rb +0 -43
  190. data/lib/yard-solargraph.rb +0 -33
  191. 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
@@ -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::YardMap::CoreDocs.clear
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
- Dir[File.join(Solargraph::YardMap::CoreDocs.cache_dir, 'gems', "#{gem}-*")].each do |dir|
120
- puts "Deleting cache: #{dir}"
121
- FileUtils.remove_entry_secure dir
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.load(directory)
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
- files.each do |file|
151
- checker = TypeChecker.new(file, api_map: api_map, level: options[:level].to_sym)
152
- problems = checker.problems
153
- next if problems.empty?
154
- problems.sort! { |a, b| a.location.range.start.line <=> b.location.range.start.line }
155
- puts problems.map { |prob| "#{prob.location.filename}:#{prob.location.range.start.line + 1} - #{prob.message}" }.join("\n")
156
- filecount += 1
157
- probcount += problems.length
158
- end
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.load(directory)
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 'bundle', 'Generate documentation for bundled gems'
195
- option :directory, type: :string, aliases: :d, desc: 'The workspace directory', default: '.'
196
- option :rebuild, type: :boolean, aliases: :r, desc: 'Rebuild existing documentation', default: false
197
- def bundle
198
- Documentor.new(options[:directory], rebuild: options[:rebuild], out: STDOUT).document
199
- end
200
-
201
- desc 'rdoc GEM [VERSION]', 'Use RDoc to cache documentation'
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
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ class Source
5
+ class Chain
6
+ class BlockSymbol < Link
7
+ def resolve api_map, name_pin, locals
8
+ [Pin::ProxyType.anonymous(ComplexType.try_parse('Proc'))]
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end