ruby-lsp-ree 0.1.5 → 0.1.6

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: 9c8f904d1cf98e1106296f608f265999c5c606fc83473d3e65a05395dd83ace5
4
- data.tar.gz: daba84c44a1bf697f80ec7589ab0a9a436af14aa5d9d8cc6cb12377623de5e8f
3
+ metadata.gz: 3814d8a258c4c291c8c2a858e5bf23094086e25162435b956bae4401bd456109
4
+ data.tar.gz: a8ae59abe162776aba2356dc2a3c9b607703ac9d5012fac2c843ab84c7e12e96
5
5
  SHA512:
6
- metadata.gz: 318c26fe57dcc12ac7a2209c10abd65b5662034e00eb87fea1a2ea58107ccd955db3b1e22a40c80f0a92e1ff10fef0f27c5a1ed3964b7877daa15dd5c64c61d4
7
- data.tar.gz: 13c136bd68c1aa9f505a79b94d6f30b713e4e7f24b22a2157c5ccdadc1300d57e27fd7fb4bc5d75f55e7a441125dccf10d6923048948ec416616d7dd723936b1
6
+ metadata.gz: 4ab9db29ce9ed0fc7ee54721826ee1933308511c3f07ddce31c53504dde5d422a131dcb6421bb428c9694ddbbc6cdab83b5f96315d9195e97e2bac11a5bad2e2
7
+ data.tar.gz: f6dcffe5363c8acb0481b9c8adbd1d6a5b6322833dc0fe1d8001188d7daf796aa68008ae648d3b99a4ad7f9f9e281b0fbdab4efec80a88b362cd18865dbd829c
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## [0.1.6] - 2025-03-04
2
+
3
+ - file rename triggers class name change
4
+ - add documentation string to hover
5
+ - add hover on link section beans
6
+
1
7
  ## [0.1.5] - 2025-02-28
2
8
 
3
9
  - improved hover format
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-lsp-ree (0.1.5)
4
+ ruby-lsp-ree (0.1.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -6,6 +6,7 @@ require_relative "ree_indexing_enhancement"
6
6
  require_relative "utils/ree_lsp_utils"
7
7
  require_relative "ree_formatter"
8
8
  require_relative "ree_template_applicator"
9
+ require_relative "ree_rename_handler"
9
10
  require_relative "parsing/parsed_document_builder"
10
11
 
11
12
  module RubyLsp
@@ -46,8 +47,6 @@ module RubyLsp
46
47
  # Clients are not required to implement this capability
47
48
  return unless global_state.supports_watching_files
48
49
 
49
- return unless @template_applicator.template_dir_exists?
50
-
51
50
  message_queue << Request.new(
52
51
  id: "ruby-lsp-ree-file-create-watcher",
53
52
  method: "client/registerCapability",
@@ -60,7 +59,7 @@ module RubyLsp
60
59
  watchers: [
61
60
  Interface::FileSystemWatcher.new(
62
61
  glob_pattern: "**/*.rb",
63
- kind: Constant::WatchKind::CREATE,
62
+ kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE,
64
63
  ),
65
64
  ],
66
65
  ),
@@ -71,10 +70,16 @@ module RubyLsp
71
70
  end
72
71
 
73
72
  def workspace_did_change_watched_files(changes)
74
- $stderr.puts("workspace_did_change_watched_files #{changes.inspect}")
73
+ if changes.size == 1 && changes[0][:type] == Constant::FileChangeType::CREATED
74
+ $stderr.puts("file created #{changes[0][:uri]}")
75
+
76
+ return unless @template_applicator.template_dir_exists?
75
77
 
76
- changes.each do |change_item|
77
- @template_applicator.apply(change_item)
78
+ @template_applicator.apply(changes[0])
79
+ elsif changes.size == 2 && changes.any?{ _1[:type] == Constant::FileChangeType::CREATED } && changes.any?{ _1[:type] == Constant::FileChangeType::DELETED }
80
+ $stderr.puts("file renamed #{changes[0][:uri]} #{changes[1][:uri]}")
81
+
82
+ RubyLsp::Ree::ReeRenameHandler.call(changes)
78
83
  end
79
84
  end
80
85
  end
@@ -110,7 +110,7 @@ module RubyLsp
110
110
  def get_enum_values_completion_items(enum_obj, location)
111
111
  enum_node = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(enum_obj.uri, :enum)
112
112
 
113
- class_name = enum_node.get_class_name
113
+ class_name = enum_node.full_class_name
114
114
 
115
115
  label_details = Interface::CompletionItemLabelDetails.new(
116
116
  description: "from: #{class_name}",
@@ -20,17 +20,34 @@ module RubyLsp
20
20
 
21
21
  return [] unless ree_object
22
22
 
23
- documentation = <<~DOC
23
+ documentation = get_object_documentation(ree_object)
24
+
25
+ [documentation]
26
+ end
27
+
28
+ def get_linked_object_hover_items(node)
29
+ parent_node = @node_context.parent
30
+ return [] unless parent_node.name == :link
31
+
32
+ ree_object = @finder.find_object(node.unescaped)
33
+
34
+ return [] unless ree_object
35
+
36
+ documentation = get_object_documentation(ree_object)
37
+
38
+ [documentation]
39
+ end
40
+
41
+ def get_object_documentation(ree_object)
42
+ <<~DOC
24
43
  \`\`\`ruby
25
- #{node.name.to_s}#{get_detail_string(ree_object)}
44
+ #{ree_object.name}#{get_detail_string(ree_object)}
26
45
  \`\`\`
27
46
  ---
28
- ree type: :#{@finder.object_type(ree_object)} package: #{package_name_from_uri(ree_object.uri)}
47
+ #{@finder.object_documentation(ree_object)}
29
48
 
30
49
  [#{path_from_package_folder(ree_object.uri)}](#{ree_object.uri})
31
50
  DOC
32
-
33
- [documentation]
34
51
  end
35
52
 
36
53
  def get_detail_string(ree_object)
@@ -9,8 +9,12 @@ module RubyLsp
9
9
  @response_builder = response_builder
10
10
  @handler = RubyLsp::Ree::HoverHandler.new(index, node_context)
11
11
 
12
- dispatcher.register(self, :on_call_node_enter)
13
- dispatcher.register(self, :on_constant_read_node_enter)
12
+ dispatcher.register(
13
+ self,
14
+ :on_call_node_enter,
15
+ :on_symbol_node_enter,
16
+ :on_constant_read_node_enter
17
+ )
14
18
  end
15
19
 
16
20
  def on_constant_read_node_enter(node)
@@ -32,6 +36,13 @@ module RubyLsp
32
36
  $stderr.puts("error in hover listener(on_call_node_enter): #{e.message} : #{e.backtrace.first}")
33
37
  end
34
38
 
39
+ def on_symbol_node_enter(node)
40
+ hover_items = @handler.get_linked_object_hover_items(node)
41
+ put_items_into_response(hover_items)
42
+ rescue => e
43
+ $stderr.puts("error in hover listener(on_symbol_node_enter): #{e.message} : #{e.backtrace.first}")
44
+ end
45
+
35
46
  def put_items_into_response(items)
36
47
  items.each do |item|
37
48
  @response_builder.push(item, category: :documentation)
@@ -175,11 +175,19 @@ class RubyLsp::Ree::ParsedDocument
175
175
  [RubyIndexer::Entry::Signature.new(signature_params)]
176
176
  end
177
177
 
178
- def get_class_name
178
+ def class_name
179
+ class_node.constant_path.name.to_s
180
+ end
181
+
182
+ def full_class_name
179
183
  name_parts = [class_node.constant_path&.parent&.name, class_node.constant_path.name]
180
184
  name_parts.compact.map(&:to_s).join('::')
181
185
  end
182
186
 
187
+ def links_container_node_name
188
+ links_container_node.arguments.arguments.first.unescaped
189
+ end
190
+
183
191
  def node_name(node)
184
192
  return nil unless node.respond_to?(:name)
185
193
 
@@ -18,9 +18,14 @@ module RubyLsp
18
18
  obj_name = node.arguments.child_nodes.first.unescaped
19
19
  return unless current_filename == obj_name
20
20
 
21
+ source = @listener.instance_variable_get(:@source_lines).join
22
+ ast = Prism.parse(source).value # TODO use doc builder
23
+
21
24
  location = node.location
22
- signatures = parse_signatures(obj_name)
23
- comments = "ree_object\ntype: :#{node.name}"
25
+ signatures = parse_signatures(obj_name, ast)
26
+ documentation = parse_documentation(obj_name, ast)
27
+
28
+ comments = "ree_object\ntype: :#{node.name}\n#{documentation}"
24
29
 
25
30
  @listener.add_method(
26
31
  obj_name,
@@ -32,10 +37,7 @@ module RubyLsp
32
37
 
33
38
  private
34
39
 
35
- def parse_signatures(fn_name)
36
- source = @listener.instance_variable_get(:@source_lines).join
37
- ast = Prism.parse(source).value
38
-
40
+ def parse_signatures(fn_name, ast)
39
41
  class_node = ast.statements.body.detect{ |node| node.is_a?(Prism::ClassNode) }
40
42
  return [] unless class_node
41
43
 
@@ -47,6 +49,28 @@ module RubyLsp
47
49
  [RubyIndexer::Entry::Signature.new(signature_params)]
48
50
  end
49
51
 
52
+ def parse_documentation(fn_name, ast)
53
+ class_node = ast.statements.body.detect{ |node| node.is_a?(Prism::ClassNode) }
54
+ return '' unless class_node
55
+
56
+ doc_node = class_node.body.body.detect{ |node| node.respond_to?(:name) && node.name == :doc }
57
+ return '' unless doc_node
58
+
59
+ str_node = doc_node.arguments.arguments.first
60
+
61
+ case str_node
62
+ when Prism::StringNode
63
+ str_node.unescaped
64
+ when Prism::InterpolatedStringNode
65
+ str_node.parts.map(&:unescaped).join
66
+ else
67
+ ''
68
+ end
69
+ rescue => e
70
+ $stderr.puts("error parsing documentation for #{fn_name}: #{e.message} : #{e.backtrace.first}")
71
+ return ''
72
+ end
73
+
50
74
  def current_filename
51
75
  uri = @listener.instance_variable_get(:@uri)
52
76
  File.basename(uri.path, '.rb')
@@ -76,6 +76,10 @@ module RubyLsp
76
76
 
77
77
  type_str.split(' ').last[1..-1].to_sym
78
78
  end
79
+
80
+ def object_documentation(ree_object)
81
+ ree_object.comments.lines[2..-1].join("\n").chomp
82
+ end
79
83
  end
80
84
  end
81
85
  end
@@ -0,0 +1,39 @@
1
+ module RubyLsp
2
+ module Ree
3
+ class ReeRenameHandler
4
+ include RubyLsp::Ree::ReeLspUtils
5
+
6
+ def self.call(changes)
7
+ old_uri = URI.parse(changes.detect{ _1[:type] == Constant::FileChangeType::DELETED }[:uri])
8
+ new_uri = URI.parse(changes.detect{ _1[:type] == Constant::FileChangeType::CREATED }[:uri])
9
+
10
+ old_file_name = File.basename(old_uri, '.rb')
11
+ new_file_name = File.basename(new_uri, '.rb')
12
+
13
+ return if old_file_name == new_file_name
14
+
15
+ parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(new_uri)
16
+ return if !parsed_doc || !parsed_doc.class_node
17
+
18
+ old_class_name = old_file_name.split('_').collect(&:capitalize).join
19
+ new_class_name = new_file_name.split('_').collect(&:capitalize).join
20
+
21
+ return unless parsed_doc.class_name == old_class_name
22
+
23
+ file_content_lines = File.read(new_uri.path).lines
24
+
25
+ class_line = parsed_doc.class_node.location.start_line - 1
26
+
27
+ file_content_lines[class_line].gsub!(/\b#{old_class_name}\b/, new_class_name)
28
+
29
+ if parsed_doc.links_container_node
30
+ links_container_node_line = parsed_doc.links_container_node.location.start_line - 1
31
+
32
+ file_content_lines[links_container_node_line].gsub!(/\b#{old_file_name}\b/, new_file_name)
33
+ end
34
+
35
+ File.write(new_uri.path, file_content_lines.join)
36
+ end
37
+ end
38
+ end
39
+ end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RubyLsp
4
4
  module Ree
5
- VERSION = "0.1.5"
5
+ VERSION = "0.1.6"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-lsp-ree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruslan Gatiyatov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2025-02-28 00:00:00.000000000 Z
11
+ date: 2025-03-05 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A Ruby LSP addon that adds extra editor functionality for Ree applications
14
14
  email:
@@ -39,6 +39,7 @@ files:
39
39
  - lib/ruby_lsp/ruby_lsp_ree/ree_formatter.rb
40
40
  - lib/ruby_lsp/ruby_lsp_ree/ree_indexing_enhancement.rb
41
41
  - lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb
42
+ - lib/ruby_lsp/ruby_lsp_ree/ree_rename_handler.rb
42
43
  - lib/ruby_lsp/ruby_lsp_ree/ree_template_applicator.rb
43
44
  - lib/ruby_lsp/ruby_lsp_ree/utils/ree_lsp_utils.rb
44
45
  - lib/ruby_lsp_ree.rb