ruby-lsp-rspec 0.1.14 → 0.1.15

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 96d32309254df952d00b15dc1a00511df1f9f0c89eacd55882194739ea57b7b0
4
- data.tar.gz: fa9accef54584ffaa86299c6e975f5c5b1298caacc91bc497fde97d66a0b703c
3
+ metadata.gz: 79c44a257a6397dd3c0fc255c4bcc32b8766d1430f6c5f3e8fb31349615b549a
4
+ data.tar.gz: 31f87a129243a71c60759e239a7e48b0333dfdb85da5e48b34c6dfa48fea53d8
5
5
  SHA512:
6
- metadata.gz: 8b611c0e6ec010041a1fcc2dac6bd8a0bbe6adebb7d99bf8d420c4f44ab3bc2a6b7e1d1aaed6535817c3e1c3d502f598c07f0c7d21f0510f4724fb1e0d749c80
7
- data.tar.gz: e5cedb8932a7a5ce6e9b097642e12b39efe2f5e1694d7f26b33712f72ed11b97861e5d8a4e6eb7dc6bb180d1d304e4c9866a59f45a8826dbfb4fadee277d1527
6
+ metadata.gz: 1ab1b4fb860e5cc8793b46e6c18d5dd819f97288530ad8ed37f6fc975e3ad3e8ac36e25a77ce7665f85a805a3926f4adf9e8a352d8112f68d958588d50cbb3b8
7
+ data.tar.gz: ddb9bd8072cff3153d2db93af3bef525127b4c4a1dff871dd75dd4265e7959c1c8f944e9b81084c0d99dd2ddd406cfdeabd33f3663d548472413822725a4cf79
@@ -6,6 +6,8 @@ require "ruby_lsp/internal"
6
6
 
7
7
  require_relative "code_lens"
8
8
  require_relative "document_symbol"
9
+ require_relative "definition"
10
+ require_relative "indexing_enhancement"
9
11
 
10
12
  module RubyLsp
11
13
  module RSpec
@@ -13,7 +15,10 @@ module RubyLsp
13
15
  extend T::Sig
14
16
 
15
17
  sig { override.params(global_state: GlobalState, message_queue: Thread::Queue).void }
16
- def activate(global_state, message_queue); end
18
+ def activate(global_state, message_queue)
19
+ @index = T.let(global_state.index, T.nilable(RubyIndexer::Index))
20
+ global_state.index.register_enhancement(IndexingEnhancement.new)
21
+ end
17
22
 
18
23
  sig { override.void }
19
24
  def deactivate; end
@@ -47,6 +52,21 @@ module RubyLsp
47
52
  DocumentSymbol.new(response_builder, dispatcher)
48
53
  end
49
54
 
55
+ sig do
56
+ override.params(
57
+ response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(
58
+ Interface::Location,
59
+ Interface::LocationLink,
60
+ )],
61
+ uri: URI::Generic,
62
+ node_context: NodeContext,
63
+ dispatcher: Prism::Dispatcher,
64
+ ).void
65
+ end
66
+ def create_definition_listener(response_builder, uri, node_context, dispatcher)
67
+ Definition.new(response_builder, uri, node_context, T.must(@index), dispatcher)
68
+ end
69
+
50
70
  sig { override.returns(String) }
51
71
  def name
52
72
  "Ruby LSP RSpec"
@@ -21,6 +21,7 @@ module RubyLsp
21
21
  @path = T.let(T.must(uri.to_standardized_path), String)
22
22
  @group_id = T.let(1, Integer)
23
23
  @group_id_stack = T.let([], T::Array[Integer])
24
+ @anonymous_example_count = T.let(0, Integer)
24
25
  dispatcher.register(self, :on_call_node_enter, :on_call_node_leave)
25
26
 
26
27
  @base_command = T.let(
@@ -93,7 +94,8 @@ module RubyLsp
93
94
  argument.slice
94
95
  end
95
96
  else
96
- "<unnamed>"
97
+ @anonymous_example_count += 1
98
+ "<unnamed-#{@anonymous_example_count}>"
97
99
  end
98
100
  end
99
101
 
@@ -0,0 +1,55 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module RSpec
6
+ class Definition
7
+ extend T::Sig
8
+
9
+ include ::RubyLsp::Requests::Support::Common
10
+
11
+ sig do
12
+ params(
13
+ response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(
14
+ Interface::Location,
15
+ Interface::LocationLink,
16
+ )],
17
+ uri: URI::Generic,
18
+ node_context: NodeContext,
19
+ index: RubyIndexer::Index,
20
+ dispatcher: Prism::Dispatcher,
21
+ ).void
22
+ end
23
+ def initialize(response_builder, uri, node_context, index, dispatcher)
24
+ @response_builder = response_builder
25
+ @uri = uri
26
+ @node_context = node_context
27
+ @index = index
28
+ dispatcher.register(self, :on_call_node_enter)
29
+ end
30
+
31
+ sig { params(node: Prism::CallNode).void }
32
+ def on_call_node_enter(node)
33
+ message = node.message
34
+ return unless message
35
+
36
+ return if @node_context.locals_for_scope.include?(message)
37
+
38
+ entries = @index[message]
39
+ return unless entries
40
+ return if entries.empty?
41
+
42
+ entries.each do |entry|
43
+ # Technically, let can be defined in a different file, but we're not going to handle that case yet
44
+ next unless entry.file_path == @uri.to_standardized_path
45
+
46
+ @response_builder << Interface::LocationLink.new(
47
+ target_uri: URI::Generic.from_path(path: entry.file_path).to_s,
48
+ target_range: range_from_location(entry.location),
49
+ target_selection_range: range_from_location(entry.name_location),
50
+ )
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,93 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module RSpec
6
+ class IndexingEnhancement
7
+ extend T::Sig
8
+ include RubyIndexer::Enhancement
9
+
10
+ sig do
11
+ override.params(
12
+ index: RubyIndexer::Index,
13
+ owner: T.nilable(RubyIndexer::Entry::Namespace),
14
+ node: Prism::CallNode,
15
+ file_path: String,
16
+ ).void
17
+ end
18
+ def on_call_node(index, owner, node, file_path)
19
+ return if node.receiver
20
+
21
+ name = node.name
22
+
23
+ case name
24
+ when :let, :let!
25
+ block_node = node.block
26
+ return unless block_node
27
+
28
+ arguments = node.arguments
29
+ return unless arguments
30
+
31
+ return if arguments.arguments.count != 1
32
+
33
+ method_name_node = T.must(arguments.arguments.first)
34
+
35
+ method_name = case method_name_node
36
+ when Prism::StringNode
37
+ method_name_node.slice
38
+ when Prism::SymbolNode
39
+ method_name_node.unescaped
40
+ end
41
+
42
+ return unless method_name
43
+
44
+ index.add(RubyIndexer::Entry::Method.new(
45
+ method_name,
46
+ file_path,
47
+ block_node.location,
48
+ block_node.location,
49
+ nil,
50
+ index.configuration.encoding,
51
+ [RubyIndexer::Entry::Signature.new([])],
52
+ RubyIndexer::Entry::Visibility::PUBLIC,
53
+ owner,
54
+ ))
55
+ when :subject, :subject!
56
+ block_node = node.block
57
+ return unless block_node
58
+
59
+ arguments = node.arguments
60
+
61
+ if arguments && arguments.arguments.count == 1
62
+ method_name_node = T.must(arguments.arguments.first)
63
+ end
64
+
65
+ method_name = if method_name_node
66
+ case method_name_node
67
+ when Prism::StringNode
68
+ method_name_node.slice
69
+ when Prism::SymbolNode
70
+ method_name_node.unescaped
71
+ end
72
+ else
73
+ "subject"
74
+ end
75
+
76
+ return unless method_name
77
+
78
+ index.add(RubyIndexer::Entry::Method.new(
79
+ method_name,
80
+ file_path,
81
+ block_node.location,
82
+ block_node.location,
83
+ nil,
84
+ index.configuration.encoding,
85
+ [RubyIndexer::Entry::Signature.new([])],
86
+ RubyIndexer::Entry::Visibility::PUBLIC,
87
+ owner,
88
+ ))
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -3,6 +3,6 @@
3
3
 
4
4
  module RubyLsp
5
5
  module RSpec
6
- VERSION = "0.1.14"
6
+ VERSION = "0.1.15"
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-rspec
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.14
4
+ version: 0.1.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stan Lo
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-10-03 00:00:00.000000000 Z
11
+ date: 2024-10-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: ruby-lsp
@@ -41,7 +41,9 @@ files:
41
41
  - lib/ruby-lsp-rspec.rb
42
42
  - lib/ruby_lsp/ruby_lsp_rspec/addon.rb
43
43
  - lib/ruby_lsp/ruby_lsp_rspec/code_lens.rb
44
+ - lib/ruby_lsp/ruby_lsp_rspec/definition.rb
44
45
  - lib/ruby_lsp/ruby_lsp_rspec/document_symbol.rb
46
+ - lib/ruby_lsp/ruby_lsp_rspec/indexing_enhancement.rb
45
47
  - lib/ruby_lsp_rspec/version.rb
46
48
  homepage: https://github.com/st0012/ruby-lsp-rspec
47
49
  licenses: