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 +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +1 -1
- data/lib/ruby_lsp/ruby_lsp_ree/addon.rb +11 -6
- data/lib/ruby_lsp/ruby_lsp_ree/handlers/completion_handler.rb +1 -1
- data/lib/ruby_lsp/ruby_lsp_ree/handlers/hover_handler.rb +22 -5
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/hover_listener.rb +13 -2
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document.rb +9 -1
- data/lib/ruby_lsp/ruby_lsp_ree/ree_indexing_enhancement.rb +30 -6
- data/lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb +4 -0
- data/lib/ruby_lsp/ruby_lsp_ree/ree_rename_handler.rb +39 -0
- data/lib/ruby_lsp_ree/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3814d8a258c4c291c8c2a858e5bf23094086e25162435b956bae4401bd456109
|
4
|
+
data.tar.gz: a8ae59abe162776aba2356dc2a3c9b607703ac9d5012fac2c843ab84c7e12e96
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4ab9db29ce9ed0fc7ee54721826ee1933308511c3f07ddce31c53504dde5d422a131dcb6421bb428c9694ddbbc6cdab83b5f96315d9195e97e2bac11a5bad2e2
|
7
|
+
data.tar.gz: f6dcffe5363c8acb0481b9c8adbd1d6a5b6322833dc0fe1d8001188d7daf796aa68008ae648d3b99a4ad7f9f9e281b0fbdab4efec80a88b362cd18865dbd829c
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -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
|
-
|
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
|
-
|
77
|
-
|
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.
|
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 =
|
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
|
-
#{
|
44
|
+
#{ree_object.name}#{get_detail_string(ree_object)}
|
26
45
|
\`\`\`
|
27
46
|
---
|
28
|
-
|
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(
|
13
|
-
|
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
|
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
|
-
|
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')
|
@@ -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
|
data/lib/ruby_lsp_ree/version.rb
CHANGED
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.
|
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-
|
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
|