ruby-lsp-rake 0.1.4 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cf8328d935d374570d5da89ecdf66a791f731e5fefb9a10e2c8338c5f22b6fa3
4
- data.tar.gz: 86cdb9a4c43c22a7027f284b8e32b0f18c62daa0b9bb8a7f2648b741a7cd0ae6
3
+ metadata.gz: 5eecc86f8a92c3d2f81d686d722f17d22af64985b63ca6ef2db1ca8fc604d773
4
+ data.tar.gz: 4f15df1db846b1f43063cffc2a32326ea515073993d3497160a21cd9a7f15571
5
5
  SHA512:
6
- metadata.gz: 3ea090a9fd5e15947adedc3a70c0baab2847e7857946a91cd25cac24dad3f295a0d637dee8bde10bfd58e4c1a67c9cfa2ddc8f1fdaddc749604651e2178824e4
7
- data.tar.gz: 7196a513486c450f53877cca1de1980793aedaa34196f23527dbd999138d634e1ae79bafc82607cb0cc667caa7af228527d79597034653ecb1dca928e1a0ab20
6
+ metadata.gz: d9d2bf49d58f3f86bbb9c64617f62b4b982c9d39dff124b3d82b2ffdd0647ae6a7ac47d2b7d13cca9bd5179308d64bed8e0c3df07b644990af0573ab2c6a16b9
7
+ data.tar.gz: 4a8c7bce406a07a7641f98efb9b73ea516cc33bf38278253f2674f3fc68381b101e6572eb32ffb3067935c59470f5bd44b62e4952b32adfb7717079f33ac53e6
data/Rakefile CHANGED
@@ -17,3 +17,25 @@ namespace :srb do
17
17
  sh "bundle exec srb tc"
18
18
  end
19
19
  end
20
+
21
+ task aaa: %i[bbb ccc:ddd eee:fff]
22
+
23
+ task :bbb do
24
+ puts :bbb
25
+ end
26
+
27
+ namespace :ccc do
28
+ task ddd: :eee do
29
+ puts "ccc:ddd"
30
+ end
31
+
32
+ task :eee do
33
+ puts "ccc:eee"
34
+ end
35
+ end
36
+
37
+ namespace :eee do
38
+ task :fff do
39
+ puts "eee:fff"
40
+ end
41
+ end
@@ -4,28 +4,56 @@
4
4
  require "ruby_lsp/addon"
5
5
  require_relative "indexing_enhancement"
6
6
  require_relative "hover"
7
+ require_relative "definition"
7
8
 
8
9
  module RubyLsp
9
10
  module Rake
10
11
  class Addon < ::RubyLsp::Addon # rubocop:disable Style/Documentation
11
- def activate(global_state, _message_queue)
12
+ extend T::Sig
13
+
14
+ sig { override.params(global_state: GlobalState, outgoing_queue: Thread::Queue).void }
15
+ def activate(global_state, outgoing_queue) # rubocop:disable Lint/UnusedMethodArgument
12
16
  @index = global_state.index
13
17
  @index.configuration.apply_config({ "included_patterns" => ["**/Rakefile", "lib/../Rakefile"] })
14
18
  end
15
19
 
20
+ sig { override.void }
16
21
  def deactivate; end
17
22
 
23
+ sig { override.returns(String) }
18
24
  def name
19
25
  "A Ruby LSP addon that adds extra editor functionality for Rake"
20
26
  end
21
27
 
28
+ sig { override.returns(String) }
22
29
  def version
23
- ::Ruby::Lsp::Rake::VERSION
30
+ ::RubyLsp::Rake::VERSION
24
31
  end
25
32
 
33
+ sig do
34
+ override.params(
35
+ response_builder: ResponseBuilders::Hover,
36
+ node_context: NodeContext,
37
+ dispatcher: Prism::Dispatcher
38
+ ).void
39
+ end
26
40
  def create_hover_listener(response_builder, node_context, dispatcher)
27
41
  Hover.new(response_builder, node_context, dispatcher, @index)
28
42
  end
43
+
44
+ sig do
45
+ override.params(
46
+ response_builder: ResponseBuilders::CollectionResponseBuilder[T.any(
47
+ Interface::Location, Interface::LocationLink
48
+ )],
49
+ _uri: URI::Generic,
50
+ node_context: NodeContext,
51
+ dispatcher: Prism::Dispatcher
52
+ ).void
53
+ end
54
+ def create_definition_listener(response_builder, _uri, node_context, dispatcher)
55
+ Definition.new(response_builder, node_context, @index, dispatcher)
56
+ end
29
57
  end
30
58
  end
31
59
  end
@@ -0,0 +1,98 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Rake
6
+ class Definition # rubocop:disable Style/Documentation
7
+ extend T::Sig
8
+ include Requests::Support::Common
9
+
10
+ sig do
11
+ params(
12
+ response_builder: RubyLsp::ResponseBuilders::CollectionResponseBuilder[T.any(
13
+ Interface::Location, Interface::LocationLink
14
+ )],
15
+ node_context: NodeContext,
16
+ index: RubyIndexer::Index,
17
+ dispatcher: Prism::Dispatcher
18
+ ).void
19
+ end
20
+ def initialize(response_builder, node_context, index, dispatcher)
21
+ @response_builder = response_builder
22
+ @node_context = node_context
23
+ @nesting = T.let(node_context.nesting, T::Array[String])
24
+ @index = index
25
+
26
+ dispatcher.register(self, :on_symbol_node_enter, :on_string_node_enter)
27
+ end
28
+
29
+ sig { params(node: Prism::SymbolNode).void }
30
+ def on_symbol_node_enter(node)
31
+ handle_prerequisite(node)
32
+ end
33
+
34
+ sig { params(node: Prism::StringNode).void }
35
+ def on_string_node_enter(node)
36
+ handle_prerequisite(node)
37
+ end
38
+
39
+ sig { params(node: T.any(Prism::SymbolNode, Prism::StringNode)).void }
40
+ def handle_prerequisite(node) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
41
+ call_node_name = @node_context.call_node&.name
42
+ return unless call_node_name == :task
43
+
44
+ name = case node
45
+ when Prism::StringNode
46
+ node.content
47
+ when Prism::SymbolNode
48
+ node.value
49
+ end
50
+
51
+ arg = @node_context.call_node&.arguments&.arguments&.first
52
+ case arg
53
+ when Prism::KeywordHashNode
54
+ kh = arg.child_nodes.first
55
+ case kh
56
+ when Prism::AssocNode
57
+ v = kh.value
58
+ case v
59
+ when Prism::StringNode
60
+ return unless name == v.content
61
+ when Prism::SymbolNode
62
+ return unless name == v.value
63
+ when Prism::ArrayNode
64
+ return unless v.elements.find do |node|
65
+ name == case node # rubocop:disable Metrics/BlockNesting
66
+ when Prism::StringNode
67
+ node.content
68
+ when Prism::SymbolNode
69
+ node.value
70
+ end
71
+ end
72
+ end
73
+ end
74
+ else
75
+ return
76
+ end
77
+
78
+ task_name = "task:#{name}"
79
+ return unless @index.indexed? task_name
80
+
81
+ entries = @index[task_name]
82
+
83
+ # refer to: https://github.com/Shopify/ruby-lsp-rails/blob/b7791290fb59b06dc99e28a991ee0607e3931a1e/lib/ruby_lsp/ruby_lsp_rails/definition.rb#L141-L152
84
+ entries.each do |entry|
85
+ loc = entry.location
86
+ uri = T.unsafe(URI::Generic).from_path(
87
+ path: entry.file_path,
88
+ fragment: "L#{loc.start_line},#{loc.start_column + 1}-#{loc.end_line},#{loc.end_column + 1}"
89
+ )
90
+ @response_builder << Interface::Location.new(
91
+ uri: uri,
92
+ range: range_from_location(entry.location)
93
+ )
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -4,8 +4,17 @@
4
4
  module RubyLsp
5
5
  module Rake
6
6
  class Hover # rubocop:disable Style/Documentation
7
+ extend T::Sig
7
8
  include Requests::Support::Common
8
9
 
10
+ sig do
11
+ override.params(
12
+ response_builder: ResponseBuilders::Hover,
13
+ node_context: NodeContext,
14
+ dispatcher: Prism::Dispatcher,
15
+ index: RubyIndexer::Index
16
+ ).void
17
+ end
9
18
  def initialize(response_builder, node_context, dispatcher, index)
10
19
  @response_builder = response_builder
11
20
  @node_context = node_context
@@ -13,15 +22,18 @@ module RubyLsp
13
22
  @index = index
14
23
  end
15
24
 
25
+ sig { params(node: Prism::StringNode).void }
16
26
  def on_string_node_enter(node)
17
27
  handle_prerequisite(node)
18
28
  end
19
29
 
30
+ sig { params(node: Prism::SymbolNode).void }
20
31
  def on_symbol_node_enter(node)
21
32
  handle_prerequisite(node)
22
33
  end
23
34
 
24
- def handle_prerequisite(node) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
35
+ sig { params(node: T.any(Prism::StringNode, Prism::SymbolNode)).void }
36
+ def handle_prerequisite(node) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
25
37
  call_node_name = @node_context.call_node&.name
26
38
  return unless call_node_name == :task
27
39
 
@@ -32,7 +44,7 @@ module RubyLsp
32
44
  node.value
33
45
  end
34
46
 
35
- arg = @node_context.call_node.arguments&.arguments&.first
47
+ arg = @node_context.call_node&.arguments&.arguments&.first
36
48
  case arg
37
49
  when Prism::KeywordHashNode
38
50
  kh = arg.child_nodes.first
@@ -46,7 +58,7 @@ module RubyLsp
46
58
  return unless name == v.value
47
59
  when Prism::ArrayNode
48
60
  return unless v.elements.find do |node|
49
- name == case node
61
+ name == case node # rubocop:disable Metrics/BlockNesting
50
62
  when Prism::StringNode
51
63
  node.content
52
64
  when Prism::SymbolNode
@@ -65,7 +77,7 @@ module RubyLsp
65
77
  # refer to: https://github.com/Shopify/ruby-lsp/blob/896617a0c5f7a22ebe12912a481bf1b59db14c12/lib/ruby_lsp/requests/support/common.rb#L83
66
78
  content = +""
67
79
  entries = @index[task_name]
68
- links = entries.map do |entry|
80
+ links = entries&.map do |entry|
69
81
  loc = entry.location
70
82
  uri = T.unsafe(URI::Generic).from_path(
71
83
  path: entry.file_path,
@@ -75,7 +87,7 @@ module RubyLsp
75
87
  "[#{entry.file_name}](#{uri})"
76
88
  end
77
89
  @response_builder.push("```\nrake #{name}\n```", category: :title)
78
- @response_builder.push("Definitions: #{links.join(" | ")}", category: :links)
90
+ @response_builder.push("Definitions: #{links&.join(" | ")}", category: :links)
79
91
  @response_builder.push(content, category: :documentation)
80
92
  end
81
93
  end
@@ -4,13 +4,21 @@
4
4
  module RubyLsp
5
5
  module Rake
6
6
  class IndexingEnhancement < RubyIndexer::Enhancement # rubocop:disable Style/Documentation
7
- @last_desc = nil
7
+ extend T::Sig
8
8
 
9
+ sig { params(listener: RubyIndexer::DeclarationListener).void }
10
+ def initialize(listener)
11
+ super(listener)
12
+ @namespace_stack = []
13
+ @last_desc = nil
14
+ end
15
+
16
+ sig { override.params(node: Prism::CallNode).void }
9
17
  def on_call_node_enter(node) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
10
18
  @last_desc = nil unless node.name == :task
11
19
 
12
20
  return unless @listener.current_owner.nil?
13
- return unless node.name == :task || node.name == :desc
21
+ return unless node.name == :task || node.name == :desc || node.name == :namespace
14
22
 
15
23
  arguments = node.arguments&.arguments
16
24
  return unless arguments
@@ -37,23 +45,36 @@ module RubyLsp
37
45
 
38
46
  return if name.nil?
39
47
 
48
+ if node.name == :namespace
49
+ @namespace_stack << name
50
+ return
51
+ end
52
+
40
53
  if node.name == :desc
41
54
  @last_desc = name
42
55
  return
43
56
  end
44
57
 
45
- location = node.location
46
- @listener.add_method(
47
- "task:#{name}",
48
- location,
49
- [],
50
- comments: @last_desc
51
- )
58
+ ary = [*@namespace_stack, name]
59
+ (1..(ary.size)).each do |i|
60
+ @listener.add_method(
61
+ "task:#{ary[-i..].join(":")}",
62
+ node.location,
63
+ [],
64
+ comments: @last_desc
65
+ )
66
+ end
52
67
 
53
68
  @last_desc = nil
54
69
  end
55
70
 
56
- def on_call_node_leave(node); end
71
+ sig { override.params(node: Prism::CallNode).void }
72
+ def on_call_node_leave(node)
73
+ return unless @listener.current_owner.nil?
74
+ return unless node.name == :namespace
75
+
76
+ @namespace_stack.pop
77
+ end
57
78
  end
58
79
  end
59
80
  end
@@ -0,0 +1,8 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module RubyLsp
5
+ module Rake
6
+ VERSION = "0.2.0"
7
+ end
8
+ end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-rake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koji NAKAMURA
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2024-12-14 00:00:00.000000000 Z
10
+ date: 2025-01-22 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: ruby-lsp
@@ -36,11 +35,11 @@ files:
36
35
  - README.md
37
36
  - Rakefile
38
37
  - img/dependency_task_links_on_hover.png
39
- - lib/ruby/lsp/rake.rb
40
- - lib/ruby/lsp/rake/version.rb
41
38
  - lib/ruby_lsp/ruby_lsp_rake/addon.rb
39
+ - lib/ruby_lsp/ruby_lsp_rake/definition.rb
42
40
  - lib/ruby_lsp/ruby_lsp_rake/hover.rb
43
41
  - lib/ruby_lsp/ruby_lsp_rake/indexing_enhancement.rb
42
+ - lib/ruby_lsp_rake/version.rb
44
43
  - sig/ruby/lsp/rake.rbs
45
44
  - sorbet/config
46
45
  - sorbet/rbi/annotations/.gitattributes
@@ -84,7 +83,6 @@ metadata:
84
83
  homepage_uri: https://github.com/kozy4324/ruby-lsp-rake
85
84
  source_code_uri: https://github.com/kozy4324/ruby-lsp-rake
86
85
  changelog_uri: https://github.com/kozy4324/ruby-lsp-rake/releases
87
- post_install_message:
88
86
  rdoc_options: []
89
87
  require_paths:
90
88
  - lib
@@ -99,8 +97,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
97
  - !ruby/object:Gem::Version
100
98
  version: '0'
101
99
  requirements: []
102
- rubygems_version: 3.5.23
103
- signing_key:
100
+ rubygems_version: 3.6.2
104
101
  specification_version: 4
105
102
  summary: A Ruby LSP addon for Rake
106
103
  test_files: []
@@ -1,10 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- module Ruby
5
- module Lsp
6
- module Rake
7
- VERSION = "0.1.4"
8
- end
9
- end
10
- end
data/lib/ruby/lsp/rake.rb DELETED
@@ -1,13 +0,0 @@
1
- # typed: true
2
- # frozen_string_literal: true
3
-
4
- require_relative "rake/version"
5
-
6
- module Ruby
7
- module Lsp
8
- module Rake
9
- class Error < StandardError; end
10
- # Your code goes here...
11
- end
12
- end
13
- end