solargraph 0.50.0 → 0.51.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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rspec.yml +4 -6
  3. data/CHANGELOG.md +18 -0
  4. data/SPONSORS.md +1 -2
  5. data/lib/solargraph/cache.rb +1 -1
  6. data/lib/solargraph/complex_type.rb +7 -0
  7. data/lib/solargraph/convention.rb +0 -2
  8. data/lib/solargraph/language_server/host.rb +11 -1
  9. data/lib/solargraph/language_server/message/initialize.rb +8 -0
  10. data/lib/solargraph/language_server/message/initialized.rb +1 -0
  11. data/lib/solargraph/language_server/message/text_document/document_symbol.rb +4 -1
  12. data/lib/solargraph/language_server/message/text_document/formatting.rb +4 -4
  13. data/lib/solargraph/language_server/message/text_document/type_definition.rb +24 -0
  14. data/lib/solargraph/language_server/message/text_document.rb +1 -0
  15. data/lib/solargraph/language_server/message.rb +1 -0
  16. data/lib/solargraph/library.rb +17 -1
  17. data/lib/solargraph/parser/rubyvm/class_methods.rb +4 -0
  18. data/lib/solargraph/parser/rubyvm/node_chainer.rb +1 -1
  19. data/lib/solargraph/parser/rubyvm/node_methods.rb +3 -1
  20. data/lib/solargraph/parser/rubyvm/node_processors/resbody_node.rb +10 -4
  21. data/lib/solargraph/parser/rubyvm/node_processors/send_node.rb +2 -2
  22. data/lib/solargraph/parser/rubyvm/node_processors.rb +1 -0
  23. data/lib/solargraph/parser.rb +2 -2
  24. data/lib/solargraph/pin/block.rb +1 -1
  25. data/lib/solargraph/pin/delegated_method.rb +97 -0
  26. data/lib/solargraph/pin/method.rb +5 -0
  27. data/lib/solargraph/pin/search.rb +1 -1
  28. data/lib/solargraph/pin.rb +1 -0
  29. data/lib/solargraph/range.rb +2 -4
  30. data/lib/solargraph/rbs_map/conversions.rb +8 -6
  31. data/lib/solargraph/rbs_map/core_fills.rb +7 -1
  32. data/lib/solargraph/rbs_map/core_map.rb +1 -1
  33. data/lib/solargraph/rbs_map/stdlib_map.rb +3 -0
  34. data/lib/solargraph/source_map/clip.rb +14 -0
  35. data/lib/solargraph/source_map.rb +15 -2
  36. data/lib/solargraph/type_checker.rb +33 -21
  37. data/lib/solargraph/version.rb +1 -1
  38. data/lib/solargraph/workspace/config.rb +6 -5
  39. data/lib/solargraph/yard_map.rb +14 -6
  40. data/solargraph.gemspec +7 -4
  41. metadata +70 -21
  42. data/lib/solargraph/convention/rspec.rb +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3a6e7990068e276537a53e6af24d45685d73aba32af134def16d8a66ea671f64
4
- data.tar.gz: 57292437f34d43394a161fe4909eb27931d5d33e1b367276faecc7b0132525e9
3
+ metadata.gz: 925e6692e134d83820ade3224a10e1e25ba8b7f65c5a8399b185574f225ad8e7
4
+ data.tar.gz: 319f943451956ac714e110f48db851391cfb5c4b2ceb1e3e8d2eb2d22dc56c05
5
5
  SHA512:
6
- metadata.gz: 1d751b364593fa60cc51c3b9a67086c7a8006dcfe37107daaba4ca1db3f001da28eb289978d81fbe7e84c3a5c9add902417731479517be61269acd958456a057
7
- data.tar.gz: 1c38faac70a696f81c5063d5ef64341a41a8d244c47c070ab557dbef8e4ca2180f5c22d5d0338c4b6f24598ea27850895bed2eab7c4d747b7bb2efeb71309eb2
6
+ metadata.gz: df03f1f0ed8e51f8c286395c4b87b1c254c78a897761ec71a9af896ef86c01e6d4285530ddf2e40c72f17afb6b5d87be11e219cc46859d7d7b7c2e05e24687bf
7
+ data.tar.gz: dd6b4f96bc8e6361bcfd313129a4ba9d680c8db45484deea040ec5fa6ba5a8873dcefa2980af4824d26f2ecc16d68bd5b5554e4978ae71853e22df49ed427894
@@ -22,19 +22,17 @@ jobs:
22
22
  runs-on: ubuntu-latest
23
23
  strategy:
24
24
  matrix:
25
- ruby-version: ['2.6', '2.7', '3.0', '3.1']
25
+ ruby-version: ['2.6', '2.7', '3.0', '3.1', '3.2', '3.3', '3.4', 'head']
26
26
 
27
27
  steps:
28
28
  - uses: actions/checkout@v3
29
29
  - name: Set up Ruby
30
- # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
31
- # change this to (see https://github.com/ruby/setup-ruby#versioning):
32
- # uses: ruby/setup-ruby@v1
33
- uses: ruby/setup-ruby@2b019609e2b0f1ea1a2bc8ca11cb82ab46ada124
30
+ uses: ruby/setup-ruby@v1
34
31
  with:
35
32
  ruby-version: ${{ matrix.ruby-version }}
36
33
  bundler-cache: false
37
- - run: bundle install
34
+ - name: Install gems
35
+ run: bundle install
38
36
  - name: Set up yardocs
39
37
  run: bundle exec yard gems
40
38
  - name: Run tests
data/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 0.51.0 - January 19, 2025
2
+ - Resolve self in yieldself tags
3
+ - Include absolute paths in config (#674)
4
+ - Enable diagnostics by default
5
+ - Fix cache resolution (#704)
6
+ - Modify rubocop option for rubocop < 1.30 (#665)
7
+ - Include absolute paths in config (#674)
8
+ - Enable diagnostics by default
9
+ - Remove RSpec convention (#716)
10
+ - Include convention pins in document_symbols (#724)
11
+ - Remove e2mmap dependency (#699)
12
+ - Update rbs to 3.0
13
+ - Relax reverse_markdown dependency (#729)
14
+ - Fix Ruby 3.4 and move all parsing to whitequark (#739)
15
+ - Add Pin::DelegatedMethod (#602)
16
+ - Complete global methods from a file inside namespaces (#714)
17
+ - gemspec dashes and required path slashes (#697)
18
+
1
19
  ## 0.50.0 - December 5, 2023
2
20
  - Remove .travis.yml as its not longer used (#627)
3
21
  - Fix empty string case when processing requires (#644)
data/SPONSORS.md CHANGED
@@ -7,11 +7,10 @@ The following people and organizations provide funding or other resources. [Beco
7
7
  ## Linked Sponsors
8
8
 
9
9
  - **[Calyptix Security](https://www.calyptix.com/)**
10
- - **[Lightward](https://lightward.com)**
11
10
 
12
11
  ## Named Sponsors
13
12
 
14
13
  - Akira Yamada
15
- - Jesus Castello
16
14
  - Joel Drapper
17
15
  - Spencer
16
+ - Vince Broz
@@ -10,7 +10,7 @@ module Solargraph
10
10
  # The directory is not stored in a variable so it can be overridden
11
11
  # in specs.
12
12
  ENV['SOLARGRAPH_CACHE'] ||
13
- ENV['XDG_CACHE_HOME'] ? File.join(ENV['XDG_CACHE_HOME'], 'solargraph') :
13
+ (ENV['XDG_CACHE_HOME'] ? File.join(ENV['XDG_CACHE_HOME'], 'solargraph') : nil) ||
14
14
  File.join(Dir.home, '.cache', 'solargraph')
15
15
  end
16
16
 
@@ -67,11 +67,18 @@ module Solargraph
67
67
  def select &block
68
68
  @items.select &block
69
69
  end
70
+
71
+ # @return [String]
70
72
  def namespace
71
73
  # cache this attr for high frequency call
72
74
  @namespace ||= method_missing(:namespace).to_s
73
75
  end
74
76
 
77
+ # @return [Array<String>]
78
+ def namespaces
79
+ @items.map(&:namespace)
80
+ end
81
+
75
82
  def method_missing name, *args, &block
76
83
  return if @items.first.nil?
77
84
  return @items.first.send(name, *args, &block) if respond_to_missing?(name)
@@ -9,7 +9,6 @@ module Solargraph
9
9
  module Convention
10
10
  autoload :Base, 'solargraph/convention/base'
11
11
  autoload :Gemfile, 'solargraph/convention/gemfile'
12
- autoload :Rspec, 'solargraph/convention/rspec'
13
12
  autoload :Gemspec, 'solargraph/convention/gemspec'
14
13
  autoload :Rakefile, 'solargraph/convention/rakefile'
15
14
 
@@ -43,7 +42,6 @@ module Solargraph
43
42
 
44
43
  register Gemfile
45
44
  register Gemspec
46
- register Rspec
47
45
  register Rakefile
48
46
  end
49
47
  end
@@ -533,6 +533,15 @@ module Solargraph
533
533
  library.definitions_at(uri_to_file(uri), line, column)
534
534
  end
535
535
 
536
+ # @param uri [String]
537
+ # @param line [Integer]
538
+ # @param column [Integer]
539
+ # @return [Array<Solargraph::Pin::Base>]
540
+ def type_definitions_at uri, line, column
541
+ library = library_for(uri)
542
+ library.type_definitions_at(uri_to_file(uri), line, column)
543
+ end
544
+
536
545
  # @param uri [String]
537
546
  # @param line [Integer]
538
547
  # @param column [Integer]
@@ -630,10 +639,11 @@ module Solargraph
630
639
  'hover' => true,
631
640
  'symbols' => true,
632
641
  'definitions' => true,
642
+ 'typeDefinitions' => true,
633
643
  'rename' => true,
634
644
  'references' => true,
635
645
  'autoformat' => false,
636
- 'diagnostics' => false,
646
+ 'diagnostics' => true,
637
647
  'formatting' => false,
638
648
  'folding' => true,
639
649
  'highlights' => true,
@@ -34,6 +34,7 @@ module Solargraph
34
34
  result[:capabilities].merge! static_document_formatting unless dynamic_registration_for?('textDocument', 'formatting')
35
35
  result[:capabilities].merge! static_document_symbols unless dynamic_registration_for?('textDocument', 'documentSymbol')
36
36
  result[:capabilities].merge! static_definitions unless dynamic_registration_for?('textDocument', 'definition')
37
+ result[:capabilities].merge! static_type_definitions unless dynamic_registration_for?('textDocument', 'typeDefinition')
37
38
  result[:capabilities].merge! static_rename unless dynamic_registration_for?('textDocument', 'rename')
38
39
  result[:capabilities].merge! static_references unless dynamic_registration_for?('textDocument', 'references')
39
40
  result[:capabilities].merge! static_workspace_symbols unless dynamic_registration_for?('workspace', 'symbol')
@@ -121,6 +122,13 @@ module Solargraph
121
122
  }
122
123
  end
123
124
 
125
+ def static_type_definitions
126
+ return {} unless host.options['type_definitions']
127
+ {
128
+ definitionProvider: true
129
+ }
130
+ end
131
+
124
132
  def static_rename
125
133
  {
126
134
  renameProvider: {prepareProvider: true}
@@ -13,6 +13,7 @@ module Solargraph
13
13
  textDocument/formatting
14
14
  textDocument/documentSymbol
15
15
  textDocument/definition
16
+ textDocument/typeDefinition
16
17
  textDocument/references
17
18
  textDocument/rename
18
19
  textDocument/prepareRename
@@ -6,6 +6,8 @@ class Solargraph::LanguageServer::Message::TextDocument::DocumentSymbol < Solarg
6
6
  def process
7
7
  pins = host.document_symbols params['textDocument']['uri']
8
8
  info = pins.map do |pin|
9
+ next nil unless pin.location&.filename
10
+
9
11
  result = {
10
12
  name: pin.name,
11
13
  containerName: pin.namespace,
@@ -17,7 +19,8 @@ class Solargraph::LanguageServer::Message::TextDocument::DocumentSymbol < Solarg
17
19
  deprecated: pin.deprecated?
18
20
  }
19
21
  result
20
- end
22
+ end.compact
23
+
21
24
  set_result info
22
25
  end
23
26
  end
@@ -17,17 +17,17 @@ module Solargraph
17
17
  args = cli_args(file_uri, config)
18
18
 
19
19
  require_rubocop(config['version'])
20
- options, paths = RuboCop::Options.new.parse(args)
20
+ options, paths = ::RuboCop::Options.new.parse(args)
21
21
  options[:stdin] = original
22
22
  corrections = redirect_stdout do
23
- RuboCop::Runner.new(options, RuboCop::ConfigStore.new).run(paths)
23
+ ::RuboCop::Runner.new(options, ::RuboCop::ConfigStore.new).run(paths)
24
24
  end
25
25
  result = options[:stdin]
26
26
 
27
27
  log_corrections(corrections)
28
28
 
29
29
  format original, result
30
- rescue RuboCop::ValidationError, RuboCop::ConfigNotFoundError => e
30
+ rescue ::RuboCop::ValidationError, ::RuboCop::ConfigNotFoundError => e
31
31
  set_error(Solargraph::LanguageServer::ErrorCodes::INTERNAL_ERROR, "[#{e.class}] #{e.message}")
32
32
  end
33
33
 
@@ -54,7 +54,7 @@ module Solargraph
54
54
  def cli_args file_uri, config
55
55
  file = UriHelpers.uri_to_file(file_uri)
56
56
  args = [
57
- config['cops'] == 'all' ? '--autocorrect-all' : '--autocorrect',
57
+ config['cops'] == 'all' ? '-A' : '-a',
58
58
  '--cache', 'false',
59
59
  '--format', formatter_class(config).name,
60
60
  ]
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph::LanguageServer::Message::TextDocument
4
+ class TypeDefinition < Base
5
+ def process
6
+ @line = params['position']['line']
7
+ @column = params['position']['character']
8
+ set_result(code_location || [])
9
+ end
10
+
11
+ private
12
+
13
+ def code_location
14
+ suggestions = host.type_definitions_at(params['textDocument']['uri'], @line, @column)
15
+ return nil if suggestions.empty?
16
+ suggestions.reject { |pin| pin.location.nil? || pin.location.filename.nil? }.map do |pin|
17
+ {
18
+ uri: file_to_uri(pin.location.filename),
19
+ range: pin.location.range.to_hash
20
+ }
21
+ end
22
+ end
23
+ end
24
+ end
@@ -15,6 +15,7 @@ module Solargraph
15
15
  autoload :DiagnosticsQueue, 'solargraph/language_server/message/text_document/diagnostics_queue'
16
16
  autoload :OnTypeFormatting, 'solargraph/language_server/message/text_document/on_type_formatting'
17
17
  autoload :Definition, 'solargraph/language_server/message/text_document/definition'
18
+ autoload :TypeDefinition, 'solargraph/language_server/message/text_document/type_definition'
18
19
  autoload :DocumentSymbol, 'solargraph/language_server/message/text_document/document_symbol'
19
20
  autoload :Formatting, 'solargraph/language_server/message/text_document/formatting'
20
21
  autoload :References, 'solargraph/language_server/message/text_document/references'
@@ -66,6 +66,7 @@ module Solargraph
66
66
  register 'textDocument/didClose', TextDocument::DidClose
67
67
  register 'textDocument/hover', TextDocument::Hover
68
68
  register 'textDocument/definition', TextDocument::Definition
69
+ register 'textDocument/typeDefinition', TextDocument::TypeDefinition
69
70
  register 'textDocument/formatting', TextDocument::Formatting
70
71
  register 'textDocument/onTypeFormatting', TextDocument::OnTypeFormatting
71
72
  register 'textDocument/documentSymbol', TextDocument::DocumentSymbol
@@ -97,7 +97,7 @@ module Solargraph
97
97
  def create filename, text
98
98
  result = false
99
99
  mutex.synchronize do
100
- next unless contain?(filename) || open?(filename) || workspace.would_merge?(filename)
100
+ next unless contain?(filename) || open?(filename)
101
101
  @synchronized = false
102
102
  source = Solargraph::Source.load_string(text, filename)
103
103
  workspace.merge(source)
@@ -199,6 +199,22 @@ module Solargraph
199
199
  handle_file_not_found(filename, e)
200
200
  end
201
201
 
202
+ # Get type definition suggestions for the expression at the specified file and
203
+ # location.
204
+ #
205
+ # @param filename [String] The file to analyze
206
+ # @param line [Integer] The zero-based line number
207
+ # @param column [Integer] The zero-based column number
208
+ # @return [Array<Solargraph::Pin::Base>]
209
+ # @todo Take filename/position instead of filename/line/column
210
+ def type_definitions_at filename, line, column
211
+ position = Position.new(line, column)
212
+ cursor = Source::Cursor.new(read(filename), position)
213
+ api_map.clip(cursor).types
214
+ rescue FileNotFoundError => e
215
+ handle_file_not_found filename, e
216
+ end
217
+
202
218
  # Get signature suggestions for the method at the specified file and
203
219
  # location.
204
220
  #
@@ -108,9 +108,13 @@ module Solargraph
108
108
  end
109
109
 
110
110
  def node_range node
111
+ if node.nil?
112
+ nil
113
+ else
111
114
  st = Position.new(node.first_lineno - 1, node.first_column)
112
115
  en = Position.new(node.last_lineno - 1, node.last_column)
113
116
  Range.new(st, en)
117
+ end
114
118
  end
115
119
 
116
120
  def recipient_node tree
@@ -98,7 +98,7 @@ module Solargraph
98
98
  result.concat generate_links(n.children.last)
99
99
  elsif n.type == :OR
100
100
  result.push Chain::Or.new([NodeChainer.chain(n.children[0], @filename), NodeChainer.chain(n.children[1], @filename)])
101
- elsif n.type == :begin
101
+ elsif n.type == :BEGIN
102
102
  result.concat generate_links(n.children[0])
103
103
  elsif n.type == :BLOCK_PASS
104
104
  result.push Chain::BlockVariable.new("&#{n.children[1].children[0].to_s}")
@@ -32,10 +32,12 @@ module Solargraph
32
32
  def infer_literal_node_type node
33
33
  return nil unless Parser.is_ast_node?(node)
34
34
  case node.type
35
- when :LIT, :STR
35
+ when :LIT, :STR, :SYM
36
36
  "::#{node.children.first.class.to_s}"
37
37
  when :DSTR
38
38
  "::String"
39
+ when :INTEGER
40
+ '::Integer'
39
41
  when :ARRAY, :ZARRAY, :LIST, :ZLIST
40
42
  '::Array'
41
43
  when :HASH
@@ -22,7 +22,7 @@ module Solargraph
22
22
  locals.push Solargraph::Pin::LocalVariable.new(
23
23
  location: loc,
24
24
  closure: region.closure,
25
- name: node.children[1].children.first.children.first.to_s,
25
+ name: node.children[1].children.first.to_s,
26
26
  comments: "@type [#{types.join(',')}]",
27
27
  presence: presence
28
28
  )
@@ -34,9 +34,15 @@ module Solargraph
34
34
  private
35
35
 
36
36
  def exception_variable?
37
- Parser.is_ast_node?(node.children[1]) &&
38
- Parser.is_ast_node?(node.children[1].children.first) &&
39
- node.children[1].children.first.type == :LASGN
37
+ if RUBY_VERSION =~ /^3\.4\./
38
+ Parser.is_ast_node?(node.children[1]) &&
39
+ # Parser.is_ast_node?(node.children[1].children.first) &&
40
+ node.children[1].type == :LASGN
41
+ else
42
+ Parser.is_ast_node?(node.children[1]) &&
43
+ Parser.is_ast_node?(node.children[1].children.first) &&
44
+ node.children[1].children.first.type == :LASGN
45
+ end
40
46
  end
41
47
  end
42
48
  end
@@ -43,7 +43,7 @@ module Solargraph
43
43
  if node.type == :FCALL && Parser.is_ast_node?(node.children.last)
44
44
  node.children.last.children[0..-2].each do |child|
45
45
  # next unless child.is_a?(AST::Node) && (child.type == :sym || child.type == :str)
46
- if child.type == :LIT || child.type == :STR
46
+ if child.type == :LIT || child.type == :STR || child.type == :SYM
47
47
  name = child.children[0].to_s
48
48
  matches = pins.select{ |pin| pin.is_a?(Pin::Method) && pin.name == name && pin.namespace == region.closure.full_context.namespace && pin.context.scope == (region.scope || :instance)}
49
49
  matches.each do |pin|
@@ -175,7 +175,7 @@ module Solargraph
175
175
  NodeProcessor.process node.children.last.children[0], region.update(visibility: :module_function), pins, locals
176
176
  else
177
177
  node.children.last.children[0..-2].each do |x|
178
- next unless [:LIT, :STR].include?(x.type)
178
+ next unless [:LIT, :STR, :SYM].include?(x.type)
179
179
  cn = x.children[0].to_s
180
180
  ref = pins.select { |p| p.is_a?(Pin::Method) && p.namespace == region.closure.full_context.namespace && p.name == cn }.first
181
181
  unless ref.nil?
@@ -58,6 +58,7 @@ module Solargraph
58
58
  register :FOR, Rubyvm::NodeProcessors::BlockNode
59
59
  register :OP_ASGN_OR, Rubyvm::NodeProcessors::OrasgnNode
60
60
  register :LIT, Rubyvm::NodeProcessors::LitNode
61
+ register :SYM, Rubyvm::NodeProcessors::LitNode
61
62
  end
62
63
  end
63
64
  end
@@ -13,8 +13,8 @@ module Solargraph
13
13
  # True if the parser can use RubyVM.
14
14
  #
15
15
  def self.rubyvm?
16
- !!defined?(RubyVM::AbstractSyntaxTree)
17
- # false
16
+ # !!defined?(RubyVM::AbstractSyntaxTree)
17
+ false
18
18
  end
19
19
 
20
20
  selected = rubyvm? ? Rubyvm : Legacy
@@ -63,7 +63,7 @@ module Solargraph
63
63
  if receiver_pin && receiver_pin.docstring
64
64
  ys = receiver_pin.docstring.tag(:yieldself)
65
65
  if ys && ys.types && !ys.types.empty?
66
- return ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace)
66
+ return ComplexType.try_parse(*ys.types).qualify(api_map, receiver_pin.context.namespace).self_to(receiver_pin.full_context.namespace)
67
67
  end
68
68
  end
69
69
  nil
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Solargraph
4
+ module Pin
5
+ # A DelegatedMethod is a more complicated version of a MethodAlias that
6
+ # allows aliasing a method from a different closure (class/module etc).
7
+ class DelegatedMethod < Pin::Method
8
+ # A DelegatedMethod can be constructed with either a :resolved_method
9
+ # pin, or a :receiver_chain. When a :receiver_chain is supplied, it
10
+ # will be used to *dynamically* resolve a receiver type within the
11
+ # given closure/scope, and the delegated method will then be resolved
12
+ # to a method pin on that type.
13
+ #
14
+ # @param resolved_method [Method] an already resolved method pin.
15
+ # @param receiver [Source::Chain] the source code used to resolve the receiver for this delegated method.
16
+ # @param receiver_method_name [String] the method name that will be called on the receiver (defaults to :name).
17
+ def initialize(method: nil, receiver: nil, name: method&.name, receiver_method_name: name, **splat)
18
+ raise ArgumentError, 'either :method or :receiver is required' if (method && receiver) || (!method && !receiver)
19
+ super(name: name, **splat)
20
+
21
+ @receiver_chain = receiver
22
+ @resolved_method = method
23
+ @receiver_method_name = receiver_method_name
24
+ end
25
+
26
+ %i[comments parameters return_type location].each do |method|
27
+ define_method(method) do
28
+ @resolved_method ? @resolved_method.send(method) : super()
29
+ end
30
+ end
31
+
32
+ %i[typify realize infer probe].each do |method|
33
+ # @param api_map [ApiMap]
34
+ define_method(method) do |api_map|
35
+ resolve_method(api_map)
36
+ @resolved_method ? @resolved_method.send(method, api_map) : super(api_map)
37
+ end
38
+ end
39
+
40
+ def resolvable?(api_map)
41
+ resolve_method(api_map)
42
+ !!@resolved_method
43
+ end
44
+
45
+ private
46
+
47
+ # Resolves the receiver chain and method name to a method pin, resetting any previously resolution.
48
+ #
49
+ # @param api_map [ApiMap]
50
+ # @return [Pin::Method, nil]
51
+ def resolve_method api_map
52
+ return if @resolved_method
53
+
54
+ resolver = @receiver_chain.define(api_map, self, []).first
55
+
56
+ unless resolver
57
+ Solargraph.logger.warn \
58
+ "Delegated receiver for #{path} was resolved to nil from `#{print_chain(@receiver_chain)}'"
59
+ return
60
+ end
61
+
62
+ receiver_type = resolver.return_type
63
+
64
+ return if receiver_type.undefined?
65
+
66
+ receiver_path, method_scope =
67
+ if @receiver_chain.constant?
68
+ # HACK: the `return_type` of a constant is Class<Whatever>, but looking up a method expects
69
+ # the arguments `"Whatever"` and `scope: :class`.
70
+ [receiver_type.to_s.sub(/^Class<(.+)>$/, '\1'), :class]
71
+ else
72
+ [receiver_type.to_s, :instance]
73
+ end
74
+
75
+ method_stack = api_map.get_method_stack(receiver_path, @receiver_method_name, scope: method_scope)
76
+ @resolved_method = method_stack.first
77
+ end
78
+
79
+ # helper to print a source chain as code, probably not 100% correct.
80
+ #
81
+ # @param chain [Source::Chain]
82
+ def print_chain(chain)
83
+ out = +''
84
+ chain.links.each_with_index do |link, index|
85
+ if index > 0
86
+ if Source::Chain::Constant
87
+ out << '::' unless link.word.start_with?('::')
88
+ else
89
+ out << '.'
90
+ end
91
+ end
92
+ out << link.word
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -130,6 +130,11 @@ module Solargraph
130
130
  end
131
131
  @documentation += "\n\n" unless @documentation.empty?
132
132
  @documentation += "Visibility: #{visibility}"
133
+ example_tags = docstring.tags(:example)
134
+ unless example_tags.empty?
135
+ @documentation += "\n\nExamples:\n\n"
136
+ @documentation += example_tags.map(&:text).join("\n")
137
+ end
133
138
  end
134
139
  @documentation.to_s
135
140
  end
@@ -49,7 +49,7 @@ module Solargraph
49
49
  # @return [Float]
50
50
  def fuzzy_string_match str1, str2
51
51
  return (1.0 + (str2.length.to_f / str1.length.to_f)) if str1.downcase.include?(str2.downcase)
52
- JaroWinkler.distance(str1, str2, ignore_case: true)
52
+ JaroWinkler.similarity(str1, str2, ignore_case: true)
53
53
  end
54
54
  end
55
55
  end
@@ -12,6 +12,7 @@ module Solargraph
12
12
  autoload :Method, 'solargraph/pin/method'
13
13
  autoload :Signature, 'solargraph/pin/signature'
14
14
  autoload :MethodAlias, 'solargraph/pin/method_alias'
15
+ autoload :DelegatedMethod, 'solargraph/pin/delegated_method'
15
16
  autoload :BaseVariable, 'solargraph/pin/base_variable'
16
17
  autoload :InstanceVariable, 'solargraph/pin/instance_variable'
17
18
  autoload :ClassVariable, 'solargraph/pin/class_variable'
@@ -65,10 +65,8 @@ module Solargraph
65
65
  # @param node [RubyVM::AbstractSyntaxTree::Node, Parser::AST::Node]
66
66
  # @return [Range]
67
67
  def self.from_node node
68
- if defined?(RubyVM::AbstractSyntaxTree::Node)
69
- if node.is_a?(RubyVM::AbstractSyntaxTree::Node)
70
- Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
71
- end
68
+ if Parser.rubyvm? && node.is_a?(RubyVM::AbstractSyntaxTree::Node)
69
+ Solargraph::Range.from_to(node.first_lineno - 1, node.first_column, node.last_lineno - 1, node.last_column)
72
70
  elsif node&.loc && node.loc.expression
73
71
  from_expr(node.loc.expression)
74
72
  end
@@ -40,7 +40,7 @@ module Solargraph
40
40
  when RBS::AST::Declarations::Interface
41
41
  # STDERR.puts "Skipping interface #{decl.name.relative!}"
42
42
  interface_decl_to_pin decl
43
- when RBS::AST::Declarations::Alias
43
+ when RBS::AST::Declarations::TypeAlias
44
44
  type_aliases[decl.name.to_s] = decl
45
45
  when RBS::AST::Declarations::Module
46
46
  module_decl_to_pin decl
@@ -222,17 +222,19 @@ module Solargraph
222
222
  # @param decl [RBS::AST::Members::MethodDefinition]
223
223
  # @param pin [Pin::Method]
224
224
  def method_def_to_sigs decl, pin
225
- decl.types.map do |type|
226
- parameters, return_type = parts_of_function(type, pin)
227
- block = if type.block
228
- Pin::Signature.new(*parts_of_function(type.block, pin))
225
+ decl.overloads.map do |overload|
226
+ parameters, return_type = parts_of_function(overload.method_type, pin)
227
+ block = if overload.method_type.block
228
+ Pin::Signature.new(*parts_of_function(overload.method_type.block, pin))
229
229
  end
230
- return_type = ComplexType.try_parse(method_type_to_tag(type))
230
+ return_type = ComplexType.try_parse(method_type_to_tag(overload.method_type))
231
231
  Pin::Signature.new(parameters, return_type, block)
232
232
  end
233
233
  end
234
234
 
235
235
  def parts_of_function type, pin
236
+ return [[Solargraph::Pin::Parameter.new(decl: :restarg, name: 'arg', closure: pin)], ComplexType.try_parse(method_type_to_tag(type))] if defined?(RBS::Types::UntypedFunction) && type.type.is_a?(RBS::Types::UntypedFunction)
237
+
236
238
  parameters = []
237
239
  arg_num = -1
238
240
  type.type.required_positionals.each do |param|
@@ -15,6 +15,11 @@ module Solargraph
15
15
  'then', 'true', 'undef', 'unless', 'until', 'when', 'while', 'yield'
16
16
  ].map { |k| Pin::Keyword.new(k) }
17
17
 
18
+ MISSING = [
19
+ Solargraph::Pin::Method.new(name: 'tap', scope: :instance, closure: Solargraph::Pin::Namespace.new(name: 'Object')),
20
+ Solargraph::Pin::Method.new(name: 'class', scope: :instance, closure: Solargraph::Pin::Namespace.new(name: 'Object'), comments: '@return [Class<self>]')
21
+ ]
22
+
18
23
  YIELDPARAMS = [
19
24
  Override.from_comment('Object#tap', %(
20
25
  @return [self]
@@ -55,7 +60,8 @@ module Solargraph
55
60
  end
56
61
  ERRNOS = errnos
57
62
 
58
- ALL = KEYWORDS + YIELDPARAMS + YIELDPARAM_SINGLE_PARAMETERS + CLASS_RETURN_TYPES + ERRNOS
63
+ ALL = KEYWORDS + MISSING + YIELDPARAMS + YIELDPARAM_SINGLE_PARAMETERS + CLASS_RETURN_TYPES + ERRNOS
59
64
  end
60
65
  end
61
66
  end
67
+
@@ -12,7 +12,7 @@ module Solargraph
12
12
  if cache
13
13
  pins.replace cache
14
14
  else
15
- loader = RBS::EnvironmentLoader.new(repository: RBS::Repository.new(no_stdlib: true))
15
+ loader = RBS::EnvironmentLoader.new(repository: RBS::Repository.new(no_stdlib: false))
16
16
  environment = RBS::Environment.from_loader(loader).resolve_type_names
17
17
  environment.declarations.each { |decl| convert_decl_to_pin(decl, Solargraph::Pin::ROOT_PIN) }
18
18
  pins.concat RbsMap::CoreFills::ALL
@@ -18,6 +18,9 @@ module Solargraph
18
18
  pins.replace cache
19
19
  else
20
20
  super
21
+ if library == 'yaml'
22
+ pins.push Solargraph::Pin::Constant.new(name: 'YAML', comments: '@return [Module<Psych>]', closure: Pin::ROOT_PIN)
23
+ end
21
24
  Cache.save('stdlib', "#{library}.ser", pins)
22
25
  end
23
26
  end
@@ -17,10 +17,16 @@ module Solargraph
17
17
  def define
18
18
  return [] if cursor.comment? || cursor.chain.literal?
19
19
  result = cursor.chain.define(api_map, block, locals)
20
+ result.concat file_global_methods
20
21
  result.concat((source_map.pins + source_map.locals).select{ |p| p.name == cursor.word && p.location.range.contain?(cursor.position) }) if result.empty?
21
22
  result
22
23
  end
23
24
 
25
+ # @return [Array<Pin::Base>]
26
+ def types
27
+ infer.namespaces.map { |namespace| api_map.get_path_pins(namespace) }.flatten
28
+ end
29
+
24
30
  # @return [Completion]
25
31
  def complete
26
32
  return package_completions([]) if !source_map.source.parsed? || cursor.string?
@@ -214,6 +220,7 @@ module Solargraph
214
220
  return package_completions(api_map.get_global_variable_pins)
215
221
  end
216
222
  result.concat locals
223
+ result.concat file_global_methods unless block.binder.namespace.empty?
217
224
  result.concat api_map.get_constants(context_pin.context.namespace, *gates)
218
225
  result.concat api_map.get_methods(block.binder.namespace, scope: block.binder.scope, visibility: [:public, :private, :protected])
219
226
  result.concat api_map.get_methods('Kernel')
@@ -224,6 +231,13 @@ module Solargraph
224
231
  end
225
232
  package_completions(result)
226
233
  end
234
+
235
+ def file_global_methods
236
+ return [] if cursor.word.empty?
237
+ source_map.pins.select do |pin|
238
+ pin.is_a?(Pin::Method) && pin.namespace == '' && pin.name.start_with?(cursor.word)
239
+ end
240
+ end
227
241
  end
228
242
  end
229
243
  end
@@ -30,6 +30,7 @@ module Solargraph
30
30
  @pins = pins
31
31
  @locals = locals
32
32
  environ.merge Convention.for_local(self) unless filename.nil?
33
+ self.convention_pins = environ.pins
33
34
  @pin_class_hash = pins.to_set.classify(&:class).transform_values(&:to_a)
34
35
  @pin_select_cache = {}
35
36
  end
@@ -65,11 +66,12 @@ module Solargraph
65
66
  @environ ||= Environ.new
66
67
  end
67
68
 
69
+ # all pins except Solargraph::Pin::Reference::Reference
68
70
  # @return [Array<Pin::Base>]
69
71
  def document_symbols
70
- @document_symbols ||= pins.select { |pin|
72
+ @document_symbols ||= (pins + convention_pins).select do |pin|
71
73
  pin.path && !pin.path.empty?
72
- }
74
+ end
73
75
  end
74
76
 
75
77
  # @param query [String]
@@ -159,6 +161,17 @@ module Solargraph
159
161
 
160
162
  private
161
163
 
164
+ # @return [Array<Pin::Base>]
165
+ def convention_pins
166
+ @convention_pins || []
167
+ end
168
+
169
+ def convention_pins=(pins)
170
+ # unmemoizing the document_symbols in case it was called from any of convnetions
171
+ @document_symbols = nil
172
+ @convention_pins = pins
173
+ end
174
+
162
175
  # @param line [Integer]
163
176
  # @param character [Integer]
164
177
  # @param klasses [Array<Class>]
@@ -254,12 +254,20 @@ module Solargraph
254
254
  result
255
255
  end
256
256
 
257
+ # @param chain [Solargraph::Source::Chain]
258
+ # @param api_map [Solargraph::ApiMap]
259
+ # @param block_pin [Solargraph::Pin::Base]
260
+ # @param locals [Array<Solargraph::Pin::Base>]
261
+ # @param location [Solargraph::Location]
257
262
  def argument_problems_for chain, api_map, block_pin, locals, location
258
263
  result = []
259
264
  base = chain
260
265
  until base.links.length == 1 && base.undefined?
261
266
  pins = base.define(api_map, block_pin, locals)
262
- if pins.first.is_a?(Pin::Method)
267
+
268
+ if pins.first.is_a?(Pin::DelegatedMethod) && !pins.first.resolvable?(api_map)
269
+ # Do nothing, as we can't find the actual method implementation
270
+ elsif pins.first.is_a?(Pin::Method)
263
271
  # @type [Pin::Method]
264
272
  pin = pins.first
265
273
  ap = if base.links.last.is_a?(Solargraph::Source::Chain::ZSuper)
@@ -279,9 +287,14 @@ module Solargraph
279
287
  errors = []
280
288
  sig.parameters.each_with_index do |par, idx|
281
289
  argchain = base.links.last.arguments[idx]
282
- if argchain.nil? && par.decl == :arg
283
- errors.push Problem.new(location, "Not enough arguments to #{pin.path}")
284
- next
290
+ if argchain.nil?
291
+ if par.decl == :arg
292
+ errors.push Problem.new(location, "Not enough arguments to #{pin.path}")
293
+ next
294
+ else
295
+ last = base.links.last.arguments.last
296
+ argchain = last if last && [:kwsplat, :hash].include?(last.node.type)
297
+ end
285
298
  end
286
299
  if argchain
287
300
  if par.decl != :arg
@@ -317,30 +330,29 @@ module Solargraph
317
330
  result
318
331
  end
319
332
 
320
- def kwarg_problems_for argchain, api_map, block_pin, locals, location, pin, params, first
333
+ def kwarg_problems_for argchain, api_map, block_pin, locals, location, pin, params, idx
321
334
  result = []
322
335
  kwargs = convert_hash(argchain.node)
323
- pin.signatures.first.parameters[first..-1].each_with_index do |par, cur|
324
- idx = first + cur
325
- argchain = kwargs[par.name.to_sym]
326
- if par.decl == :kwrestarg || (par.decl == :optarg && idx == pin.parameters.length - 1 && par.asgn_code == '{}')
327
- result.concat kwrestarg_problems_for(api_map, block_pin, locals, location, pin, params, kwargs)
328
- else
329
- if argchain
330
- data = params[par.name]
331
- if data.nil?
332
- # @todo Some level (strong, I guess) should require the param here
333
- else
334
- ptype = data[:qualified]
335
- next if ptype.undefined?
336
+ par = pin.signatures.first.parameters[idx]
337
+ argchain = kwargs[par.name.to_sym]
338
+ if par.decl == :kwrestarg || (par.decl == :optarg && idx == pin.parameters.length - 1 && par.asgn_code == '{}')
339
+ result.concat kwrestarg_problems_for(api_map, block_pin, locals, location, pin, params, kwargs)
340
+ else
341
+ if argchain
342
+ data = params[par.name]
343
+ if data.nil?
344
+ # @todo Some level (strong, I guess) should require the param here
345
+ else
346
+ ptype = data[:qualified]
347
+ unless ptype.undefined?
336
348
  argtype = argchain.infer(api_map, block_pin, locals)
337
349
  if argtype.defined? && ptype && !any_types_match?(api_map, ptype, argtype)
338
350
  result.push Problem.new(location, "Wrong argument type for #{pin.path}: #{par.name} expected #{ptype}, received #{argtype}")
339
351
  end
340
352
  end
341
- elsif par.decl == :kwarg
342
- result.push Problem.new(location, "Call to #{pin.path} is missing keyword argument #{par.name}")
343
353
  end
354
+ elsif par.decl == :kwarg
355
+ result.push Problem.new(location, "Call to #{pin.path} is missing keyword argument #{par.name}")
344
356
  end
345
357
  end
346
358
  result
@@ -542,7 +554,7 @@ module Solargraph
542
554
  def without_ignored problems
543
555
  problems.reject do |problem|
544
556
  node = source_map.source.node_at(problem.location.range.start.line, problem.location.range.start.column)
545
- source_map.source.comments_for(node)&.include?('@sg-ignore')
557
+ node && source_map.source.comments_for(node)&.include?('@sg-ignore')
546
558
  end
547
559
  end
548
560
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Solargraph
4
- VERSION = '0.50.0'
4
+ VERSION = '0.51.0'
5
5
  end
@@ -19,7 +19,7 @@ module Solargraph
19
19
 
20
20
  # @param directory [String]
21
21
  def initialize directory = ''
22
- @directory = directory
22
+ @directory = File.absolute_path(directory)
23
23
  @raw_data = config_data
24
24
  included
25
25
  excluded
@@ -42,7 +42,8 @@ module Solargraph
42
42
  end
43
43
 
44
44
  def allow? filename
45
- filename.start_with?(directory) &&
45
+ filename = File.absolute_path(filename, directory)
46
+ filename.start_with?(directory) &&
46
47
  !excluded.include?(filename) &&
47
48
  excluded_directories.none? { |d| filename.start_with?(d) }
48
49
  end
@@ -171,7 +172,7 @@ module Solargraph
171
172
  # @return [Array<String>]
172
173
  def process_globs globs
173
174
  result = globs.flat_map do |glob|
174
- Dir[File.join directory, glob]
175
+ Dir[File.absolute_path(glob, directory)]
175
176
  .map{ |f| f.gsub(/\\/, '/') }
176
177
  .select { |f| File.file?(f) }
177
178
  end
@@ -186,7 +187,7 @@ module Solargraph
186
187
  def process_exclusions globs
187
188
  remainder = globs.select do |glob|
188
189
  if glob_is_directory?(glob)
189
- exdir = File.join(directory, glob_to_directory(glob))
190
+ exdir = File.absolute_path(glob_to_directory(glob), directory)
190
191
  included.delete_if { |file| file.start_with?(exdir) }
191
192
  false
192
193
  else
@@ -224,7 +225,7 @@ module Solargraph
224
225
  def excluded_directories
225
226
  @raw_data['exclude']
226
227
  .select { |g| glob_is_directory?(g) }
227
- .map { |g| File.join(directory, glob_to_directory(g)) }
228
+ .map { |g| File.absolute_path(glob_to_directory(g), directory) }
228
229
  end
229
230
  end
230
231
  end
@@ -220,9 +220,11 @@ module Solargraph
220
220
  result = []
221
221
  begin
222
222
  name = r.split('/').first.to_s
223
- return [] if name.empty? || @source_gems.include?(name) || @gem_paths.key?(name)
224
- spec = spec_for_require(name)
225
- @gem_paths[name] = spec.full_gem_path
223
+ return [] if name.empty?
224
+
225
+ spec = spec_for_require(r)
226
+ return [] if @source_gems.include?(spec.name) || @gem_paths.key?(spec.name)
227
+ @gem_paths[spec.name] = spec.full_gem_path
226
228
 
227
229
  yd = yardoc_file_for_spec(spec)
228
230
  # YARD detects gems for certain libraries that do not have a yardoc
@@ -282,13 +284,19 @@ module Solargraph
282
284
  # @param path [String]
283
285
  # @return [Gem::Specification]
284
286
  def spec_for_require path
285
- name = path.split('/').first.to_s
286
- spec = Gem::Specification.find_by_name(name, @gemset[name])
287
+ relatives = path.split('/')
288
+ spec = nil
289
+ while spec.nil? && !relatives.empty?
290
+ name = relatives.join('-')
291
+ spec = Gem::Specification.find_by_name(name, @gemset[name])
292
+ relatives.pop
293
+ end
294
+ raise Gem::LoadError if spec.nil?
287
295
 
288
296
  # Avoid loading the spec again if it's going to be skipped anyway
289
297
  return spec if @source_gems.include?(spec.name)
290
298
  # Avoid loading the spec again if it's already the correct version
291
- if @gemset[spec.name] && @gemset[spec.name] != spec.version
299
+ if @gemset[spec.name] && spec.version != @gemset[spec.name]
292
300
  begin
293
301
  return Gem::Specification.find_by_name(spec.name, "= #{@gemset[spec.name]}")
294
302
  rescue Gem::LoadError
data/solargraph.gemspec CHANGED
@@ -27,13 +27,15 @@ Gem::Specification.new do |s|
27
27
  s.add_runtime_dependency 'benchmark'
28
28
  s.add_runtime_dependency 'bundler', '~> 2.0'
29
29
  s.add_runtime_dependency 'diff-lcs', '~> 1.4'
30
- s.add_runtime_dependency 'e2mmap'
31
- s.add_runtime_dependency 'jaro_winkler', '~> 1.5'
30
+ s.add_runtime_dependency 'jaro_winkler', '~> 1.6'
32
31
  s.add_runtime_dependency 'kramdown', '~> 2.3'
33
32
  s.add_runtime_dependency 'kramdown-parser-gfm', '~> 1.1'
33
+ s.add_runtime_dependency 'logger', '~> 1.6'
34
+ s.add_runtime_dependency 'observer', '~> 0.1'
35
+ s.add_runtime_dependency 'ostruct', '~> 0.6'
34
36
  s.add_runtime_dependency 'parser', '~> 3.0'
35
- s.add_runtime_dependency 'rbs', '~> 2.0'
36
- s.add_runtime_dependency 'reverse_markdown', '~> 2.0'
37
+ s.add_runtime_dependency 'rbs', '~> 3.0'
38
+ s.add_runtime_dependency 'reverse_markdown', '>= 2.0', '< 4'
37
39
  s.add_runtime_dependency 'rubocop', '~> 1.38'
38
40
  s.add_runtime_dependency 'thor', '~> 1.0'
39
41
  s.add_runtime_dependency 'tilt', '~> 2.0'
@@ -41,6 +43,7 @@ Gem::Specification.new do |s|
41
43
 
42
44
  s.add_development_dependency 'pry'
43
45
  s.add_development_dependency 'public_suffix', '~> 3.1'
46
+ s.add_development_dependency 'rake', '~> 13.2'
44
47
  s.add_development_dependency 'rspec', '~> 3.5'
45
48
  s.add_development_dependency 'simplecov', '~> 0.14'
46
49
  s.add_development_dependency 'webmock', '~> 3.6'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solargraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.50.0
4
+ version: 0.51.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fred Snyder
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-05 00:00:00.000000000 Z
11
+ date: 2025-01-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: backport
@@ -67,61 +67,89 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '1.4'
69
69
  - !ruby/object:Gem::Dependency
70
- name: e2mmap
70
+ name: jaro_winkler
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
75
+ version: '1.6'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '0'
82
+ version: '1.6'
83
83
  - !ruby/object:Gem::Dependency
84
- name: jaro_winkler
84
+ name: kramdown
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '1.5'
89
+ version: '2.3'
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '1.5'
96
+ version: '2.3'
97
97
  - !ruby/object:Gem::Dependency
98
- name: kramdown
98
+ name: kramdown-parser-gfm
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '2.3'
103
+ version: '1.1'
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '2.3'
110
+ version: '1.1'
111
111
  - !ruby/object:Gem::Dependency
112
- name: kramdown-parser-gfm
112
+ name: logger
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: '1.1'
117
+ version: '1.6'
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: '1.1'
124
+ version: '1.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: observer
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.1'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.1'
139
+ - !ruby/object:Gem::Dependency
140
+ name: ostruct
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '0.6'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '0.6'
125
153
  - !ruby/object:Gem::Dependency
126
154
  name: parser
127
155
  requirement: !ruby/object:Gem::Requirement
@@ -142,28 +170,34 @@ dependencies:
142
170
  requirements:
143
171
  - - "~>"
144
172
  - !ruby/object:Gem::Version
145
- version: '2.0'
173
+ version: '3.0'
146
174
  type: :runtime
147
175
  prerelease: false
148
176
  version_requirements: !ruby/object:Gem::Requirement
149
177
  requirements:
150
178
  - - "~>"
151
179
  - !ruby/object:Gem::Version
152
- version: '2.0'
180
+ version: '3.0'
153
181
  - !ruby/object:Gem::Dependency
154
182
  name: reverse_markdown
155
183
  requirement: !ruby/object:Gem::Requirement
156
184
  requirements:
157
- - - "~>"
185
+ - - ">="
158
186
  - !ruby/object:Gem::Version
159
187
  version: '2.0'
188
+ - - "<"
189
+ - !ruby/object:Gem::Version
190
+ version: '4'
160
191
  type: :runtime
161
192
  prerelease: false
162
193
  version_requirements: !ruby/object:Gem::Requirement
163
194
  requirements:
164
- - - "~>"
195
+ - - ">="
165
196
  - !ruby/object:Gem::Version
166
197
  version: '2.0'
198
+ - - "<"
199
+ - !ruby/object:Gem::Version
200
+ version: '4'
167
201
  - !ruby/object:Gem::Dependency
168
202
  name: rubocop
169
203
  requirement: !ruby/object:Gem::Requirement
@@ -254,6 +288,20 @@ dependencies:
254
288
  - - "~>"
255
289
  - !ruby/object:Gem::Version
256
290
  version: '3.1'
291
+ - !ruby/object:Gem::Dependency
292
+ name: rake
293
+ requirement: !ruby/object:Gem::Requirement
294
+ requirements:
295
+ - - "~>"
296
+ - !ruby/object:Gem::Version
297
+ version: '13.2'
298
+ type: :development
299
+ prerelease: false
300
+ version_requirements: !ruby/object:Gem::Requirement
301
+ requirements:
302
+ - - "~>"
303
+ - !ruby/object:Gem::Version
304
+ version: '13.2'
257
305
  - !ruby/object:Gem::Dependency
258
306
  name: rspec
259
307
  requirement: !ruby/object:Gem::Requirement
@@ -332,7 +380,6 @@ files:
332
380
  - lib/solargraph/convention/gemfile.rb
333
381
  - lib/solargraph/convention/gemspec.rb
334
382
  - lib/solargraph/convention/rakefile.rb
335
- - lib/solargraph/convention/rspec.rb
336
383
  - lib/solargraph/converters/dd.rb
337
384
  - lib/solargraph/converters/dl.rb
338
385
  - lib/solargraph/converters/dt.rb
@@ -395,6 +442,7 @@ files:
395
442
  - lib/solargraph/language_server/message/text_document/references.rb
396
443
  - lib/solargraph/language_server/message/text_document/rename.rb
397
444
  - lib/solargraph/language_server/message/text_document/signature_help.rb
445
+ - lib/solargraph/language_server/message/text_document/type_definition.rb
398
446
  - lib/solargraph/language_server/message/workspace.rb
399
447
  - lib/solargraph/language_server/message/workspace/did_change_configuration.rb
400
448
  - lib/solargraph/language_server/message/workspace/did_change_watched_files.rb
@@ -477,6 +525,7 @@ files:
477
525
  - lib/solargraph/pin/common.rb
478
526
  - lib/solargraph/pin/constant.rb
479
527
  - lib/solargraph/pin/conversions.rb
528
+ - lib/solargraph/pin/delegated_method.rb
480
529
  - lib/solargraph/pin/documenting.rb
481
530
  - lib/solargraph/pin/duck_method.rb
482
531
  - lib/solargraph/pin/global_variable.rb
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Solargraph
4
- module Convention
5
- class Rspec < Base
6
- def local source_map
7
- return EMPTY_ENVIRON unless File.basename(source_map.filename) =~ /_spec\.rb$/
8
- @environ ||= Environ.new(
9
- requires: ['rspec'],
10
- domains: ['RSpec::Matchers', 'RSpec::ExpectationGroups'],
11
- pins: [
12
- # This override is necessary due to an erroneous @return tag in
13
- # rspec's YARD documentation.
14
- # @todo The return types have been fixed (https://github.com/rspec/rspec-expectations/pull/1121)
15
- Solargraph::Pin::Reference::Override.method_return('RSpec::Matchers#expect', 'RSpec::Expectations::ExpectationTarget')
16
- ].concat(extras)
17
- )
18
- end
19
-
20
- private
21
-
22
- def extras
23
- @@extras ||= SourceMap.load_string(%(
24
- def describe(*args); end
25
- def it(*args); end
26
- )).pins
27
- end
28
- end
29
- end
30
- end