ruby-lsp-rake 0.1.4 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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