ruby-lsp-ree 0.1.2 → 0.1.4
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/.ruby-version +1 -0
- data/CHANGELOG.md +25 -11
- data/Gemfile +6 -0
- data/Gemfile.lock +36 -1
- data/Rakefile +5 -1
- data/lib/ruby_lsp/ruby_lsp_ree/addon.rb +11 -5
- data/lib/ruby_lsp/ruby_lsp_ree/{completion_utils.rb → handlers/completion_handler.rb} +104 -27
- data/lib/ruby_lsp/ruby_lsp_ree/{definition.rb → handlers/definition_handler.rb} +48 -37
- data/lib/ruby_lsp/ruby_lsp_ree/handlers/hover_handler.rb +49 -0
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/completion_listener.rb +53 -0
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/definition_listener.rb +63 -0
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/hover_listener.rb +42 -0
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document.rb +63 -25
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document_builder.rb +32 -0
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_link_node.rb +6 -1
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_rspec_document.rb +57 -0
- data/lib/ruby_lsp/ruby_lsp_ree/ree_formatter.rb +2 -0
- data/lib/ruby_lsp/ruby_lsp_ree/ree_indexing_enhancement.rb +4 -4
- data/lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb +57 -8
- data/lib/ruby_lsp/ruby_lsp_ree/{ree_lsp_utils.rb → utils/ree_lsp_utils.rb} +8 -1
- data/lib/ruby_lsp_ree/version.rb +3 -5
- data/ruby-lsp-ree.gemspec +1 -1
- metadata +12 -7
- data/lib/ruby_lsp/ruby_lsp_ree/completion.rb +0 -108
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a1d126a7d0c8462f33b63113cf86ae134f8cb029da147273bdb2f8cb76cb448e
|
4
|
+
data.tar.gz: dbb25c53fc012b487a3ed9555ad470c10445603e808aa3f44442070b4fc57851
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50d85fbda0c61e33709823c7e8b5f263d94eba2d6822b1e84f011ad0b058adf6d5766a5fe27b6613c537b2e36f878a8ef50ddf7fad7dd41cfd954011fe90c156
|
7
|
+
data.tar.gz: 66c76a82263258d76fcc7cc604e6aa499deb209ae80c6ae8a5bad1dd486f7ee70c9e0af896277c0cc01631ad99c91f5b5b827e18337b0d95e4d18622d1c2c389
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
3.3.0
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,26 @@
|
|
1
|
-
## [
|
1
|
+
## [0.1.4] - 2025-02-25
|
2
2
|
|
3
|
-
|
3
|
+
- autocompletion in spec files
|
4
|
+
- Add Link in spec files
|
5
|
+
- improved support of new files and unsaved documents
|
4
6
|
|
5
|
-
-
|
7
|
+
## [0.1.3] - 2025-02-21
|
8
|
+
|
9
|
+
- improved Go To Definition for ree object methods and imported constants
|
10
|
+
- support for :mapper objects
|
11
|
+
- support for :aggregate objects
|
12
|
+
- improved autocompletion for imported constants
|
13
|
+
- basic hover information for ree objects
|
14
|
+
|
15
|
+
## [0.1.2] - 2025-02-14
|
16
|
+
|
17
|
+
- support for :bean objects
|
18
|
+
- Go To Definition for imported constants
|
19
|
+
- use current (not saved) version of the document in autocomplete
|
20
|
+
- use current (not saved) version of the document in definition
|
21
|
+
- increase autocomplete list limits (affects short functions)
|
22
|
+
- improved const autocomplete
|
23
|
+
- improved ree errors handling
|
6
24
|
|
7
25
|
## [0.1.1] - 2025-02-10
|
8
26
|
|
@@ -21,12 +39,8 @@
|
|
21
39
|
- autocomplete for ree dao
|
22
40
|
- autocomplete for dao filters
|
23
41
|
|
24
|
-
## [0.1.
|
42
|
+
## [0.1.0] - 2025-01-31
|
25
43
|
|
26
|
-
-
|
27
|
-
|
28
|
-
|
29
|
-
- use current (no saved) version of the document in definition
|
30
|
-
- increase autocomplete list limits (affects short functions)
|
31
|
-
- improved const autocomplete
|
32
|
-
- improved ree errors handling
|
44
|
+
- Initial release
|
45
|
+
|
46
|
+
## [Unreleased]
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,12 +1,44 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
ruby-lsp-ree (0.1.
|
4
|
+
ruby-lsp-ree (0.1.4)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
diff-lcs (1.6.0)
|
10
|
+
language_server-protocol (3.17.0.4)
|
11
|
+
logger (1.6.6)
|
12
|
+
prism (1.3.0)
|
9
13
|
rake (13.2.1)
|
14
|
+
rbs (3.8.1)
|
15
|
+
logger
|
16
|
+
rspec (3.13.0)
|
17
|
+
rspec-core (~> 3.13.0)
|
18
|
+
rspec-expectations (~> 3.13.0)
|
19
|
+
rspec-mocks (~> 3.13.0)
|
20
|
+
rspec-core (3.13.3)
|
21
|
+
rspec-support (~> 3.13.0)
|
22
|
+
rspec-expectations (3.13.3)
|
23
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
24
|
+
rspec-support (~> 3.13.0)
|
25
|
+
rspec-mocks (3.13.2)
|
26
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
27
|
+
rspec-support (~> 3.13.0)
|
28
|
+
rspec-support (3.13.2)
|
29
|
+
ruby-lsp (0.23.11)
|
30
|
+
language_server-protocol (~> 3.17.0)
|
31
|
+
prism (>= 1.2, < 2.0)
|
32
|
+
rbs (>= 3, < 4)
|
33
|
+
sorbet-runtime (>= 0.5.10782)
|
34
|
+
sorbet (0.5.11835)
|
35
|
+
sorbet-static (= 0.5.11835)
|
36
|
+
sorbet-runtime (0.5.11835)
|
37
|
+
sorbet-static (0.5.11835-universal-darwin)
|
38
|
+
sorbet-static (0.5.11835-x86_64-linux)
|
39
|
+
sorbet-static-and-runtime (0.5.11835)
|
40
|
+
sorbet (= 0.5.11835)
|
41
|
+
sorbet-runtime (= 0.5.11835)
|
10
42
|
|
11
43
|
PLATFORMS
|
12
44
|
x86_64-darwin-23
|
@@ -14,7 +46,10 @@ PLATFORMS
|
|
14
46
|
|
15
47
|
DEPENDENCIES
|
16
48
|
rake (~> 13.0)
|
49
|
+
rspec
|
50
|
+
ruby-lsp
|
17
51
|
ruby-lsp-ree!
|
52
|
+
sorbet-static-and-runtime
|
18
53
|
|
19
54
|
BUNDLED WITH
|
20
55
|
2.6.3
|
data/Rakefile
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
require "ruby_lsp/addon"
|
2
|
-
require_relative "
|
3
|
-
require_relative "
|
2
|
+
require_relative "listeners/definition_listener"
|
3
|
+
require_relative "listeners/completion_listener"
|
4
|
+
require_relative "listeners/hover_listener"
|
4
5
|
require_relative "ree_indexing_enhancement"
|
5
|
-
require_relative "ree_lsp_utils"
|
6
|
+
require_relative "utils/ree_lsp_utils"
|
6
7
|
require_relative "ree_formatter"
|
7
8
|
require_relative "parsing/parsed_document_builder"
|
8
9
|
|
@@ -25,12 +26,17 @@ module RubyLsp
|
|
25
26
|
|
26
27
|
def create_definition_listener(response_builder, uri, node_context, dispatcher)
|
27
28
|
index = @global_state.index
|
28
|
-
RubyLsp::Ree::
|
29
|
+
RubyLsp::Ree::DefinitionListener.new(response_builder, node_context, index, dispatcher, uri)
|
29
30
|
end
|
30
31
|
|
31
32
|
def create_completion_listener(response_builder, node_context, dispatcher, uri)
|
32
33
|
index = @global_state.index
|
33
|
-
RubyLsp::Ree::
|
34
|
+
RubyLsp::Ree::CompletionListener.new(response_builder, node_context, index, dispatcher, uri)
|
35
|
+
end
|
36
|
+
|
37
|
+
def create_hover_listener(response_builder, node_context, dispatcher)
|
38
|
+
index = @global_state.index
|
39
|
+
RubyLsp::Ree::HoverListener.new(response_builder, node_context, index, dispatcher)
|
34
40
|
end
|
35
41
|
end
|
36
42
|
end
|
@@ -1,11 +1,44 @@
|
|
1
|
-
require_relative "ree_lsp_utils"
|
1
|
+
require_relative "../utils/ree_lsp_utils"
|
2
|
+
require_relative "../ree_object_finder"
|
2
3
|
|
3
4
|
module RubyLsp
|
4
5
|
module Ree
|
5
|
-
|
6
|
+
class CompletionHandler
|
6
7
|
include Requests::Support::Common
|
7
8
|
include RubyLsp::Ree::ReeLspUtils
|
8
9
|
|
10
|
+
RECEIVER_OBJECT_TYPES = [:enum, :dao, :bean]
|
11
|
+
CANDIDATES_LIMIT = 100
|
12
|
+
|
13
|
+
def initialize(index, uri, node_context)
|
14
|
+
@index = index
|
15
|
+
@uri = uri
|
16
|
+
@node_context = node_context
|
17
|
+
@root_node = @node_context.instance_variable_get(:@nesting_nodes).first
|
18
|
+
@finder = ReeObjectFinder.new(@index)
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_ree_receiver(receiver_node)
|
22
|
+
return if !receiver_node || !receiver_node.is_a?(Prism::CallNode)
|
23
|
+
|
24
|
+
@finder.find_objects_by_types(receiver_node.name.to_s, RECEIVER_OBJECT_TYPES).first
|
25
|
+
end
|
26
|
+
|
27
|
+
def get_ree_object_methods_completions_items(ree_receiver, receiver_node, node)
|
28
|
+
location = receiver_node.location
|
29
|
+
|
30
|
+
case @finder.object_type(ree_receiver)
|
31
|
+
when :enum
|
32
|
+
get_enum_values_completion_items(ree_receiver, location)
|
33
|
+
when :bean
|
34
|
+
get_bean_methods_completion_items(ree_receiver, location)
|
35
|
+
when :dao
|
36
|
+
get_dao_filters_completion_items(ree_receiver, location)
|
37
|
+
else
|
38
|
+
[]
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
9
42
|
def get_bean_methods_completion_items(bean_obj, location)
|
10
43
|
bean_node = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(bean_obj.uri, :bean)
|
11
44
|
|
@@ -107,34 +140,75 @@ module RubyLsp
|
|
107
140
|
end
|
108
141
|
end
|
109
142
|
|
110
|
-
def get_class_name_completion_items(
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
143
|
+
def get_class_name_completion_items(node)
|
144
|
+
node_name = node.name.to_s
|
145
|
+
class_name_objects = @finder.search_class_objects(node_name)
|
146
|
+
|
147
|
+
return [] if class_name_objects.size == 0
|
148
|
+
|
149
|
+
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@root_node, @uri)
|
150
|
+
|
151
|
+
imported_consts = []
|
152
|
+
not_imported_consts = []
|
153
|
+
|
154
|
+
class_name_objects.take(CANDIDATES_LIMIT).each do |full_class_name|
|
155
|
+
entries = @index[full_class_name]
|
156
|
+
|
157
|
+
entries.each do |entry|
|
158
|
+
class_name = full_class_name.split('::').last
|
159
|
+
package_name = package_name_from_uri(entry.uri)
|
160
|
+
file_name = File.basename(entry.uri.to_s)
|
161
|
+
|
162
|
+
matched_import = parsed_doc.find_import_for_package(class_name, package_name)
|
163
|
+
|
164
|
+
if matched_import
|
165
|
+
label_details = Interface::CompletionItemLabelDetails.new(
|
166
|
+
description: "imported from: :#{package_name}",
|
167
|
+
detail: ""
|
168
|
+
)
|
169
|
+
|
170
|
+
imported_consts << Interface::CompletionItem.new(
|
171
|
+
label: class_name,
|
172
|
+
label_details: label_details,
|
173
|
+
filter_text: class_name,
|
174
|
+
text_edit: Interface::TextEdit.new(
|
175
|
+
range: range_from_location(node.location),
|
176
|
+
new_text: class_name,
|
177
|
+
),
|
178
|
+
kind: Constant::CompletionItemKind::CLASS,
|
179
|
+
additional_text_edits: []
|
180
|
+
)
|
181
|
+
else
|
182
|
+
label_details = Interface::CompletionItemLabelDetails.new(
|
183
|
+
description: "from: :#{package_name}",
|
184
|
+
detail: " #{file_name}"
|
185
|
+
)
|
186
|
+
|
187
|
+
not_imported_consts << Interface::CompletionItem.new(
|
188
|
+
label: class_name,
|
189
|
+
label_details: label_details,
|
190
|
+
filter_text: class_name,
|
191
|
+
text_edit: Interface::TextEdit.new(
|
192
|
+
range: range_from_location(node.location),
|
193
|
+
new_text: class_name,
|
194
|
+
),
|
195
|
+
kind: Constant::CompletionItemKind::CLASS,
|
196
|
+
additional_text_edits: get_additional_text_edits_for_constant(parsed_doc, class_name, package_name, entry)
|
197
|
+
)
|
198
|
+
end
|
199
|
+
end
|
134
200
|
end
|
201
|
+
|
202
|
+
imported_consts + not_imported_consts
|
135
203
|
end
|
136
204
|
|
137
|
-
def get_ree_objects_completions_items(
|
205
|
+
def get_ree_objects_completions_items(node)
|
206
|
+
ree_objects = @finder.search_objects(node.name.to_s, CANDIDATES_LIMIT)
|
207
|
+
|
208
|
+
return [] if ree_objects.size == 0
|
209
|
+
|
210
|
+
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@root_node, @uri)
|
211
|
+
|
138
212
|
ree_objects.map do |ree_object|
|
139
213
|
ree_object_name = ree_object.name
|
140
214
|
package_name = package_name_from_uri(ree_object.uri)
|
@@ -233,6 +307,8 @@ module RubyLsp
|
|
233
307
|
end
|
234
308
|
|
235
309
|
def get_additional_text_edits_for_method(parsed_doc, fn_name, package_name)
|
310
|
+
return [] unless parsed_doc
|
311
|
+
|
236
312
|
if parsed_doc.includes_linked_object?(fn_name)
|
237
313
|
return []
|
238
314
|
end
|
@@ -254,6 +330,7 @@ module RubyLsp
|
|
254
330
|
end
|
255
331
|
|
256
332
|
range = get_range_for_fn_insert(parsed_doc, link_text)
|
333
|
+
return unless range
|
257
334
|
|
258
335
|
[
|
259
336
|
Interface::TextEdit.new(
|
@@ -1,30 +1,36 @@
|
|
1
|
-
require_relative "ree_lsp_utils"
|
2
|
-
require_relative "
|
1
|
+
require_relative "../utils/ree_lsp_utils"
|
2
|
+
require_relative "../ree_object_finder"
|
3
|
+
require_relative "../parsing/parsed_link_node"
|
4
|
+
require_relative "../parsing/parsed_document_builder"
|
3
5
|
|
4
6
|
module RubyLsp
|
5
7
|
module Ree
|
6
|
-
class
|
8
|
+
class DefinitionHandler
|
7
9
|
include Requests::Support::Common
|
8
10
|
include RubyLsp::Ree::ReeLspUtils
|
9
11
|
|
10
|
-
def initialize(
|
11
|
-
@response_builder = response_builder
|
12
|
-
@node_context = node_context
|
13
|
-
@nesting = node_context.nesting
|
12
|
+
def initialize(index, uri, node_context)
|
14
13
|
@index = index
|
15
14
|
@uri = uri
|
16
|
-
|
17
|
-
|
15
|
+
@node_context = node_context
|
16
|
+
@finder = ReeObjectFinder.new(@index)
|
18
17
|
end
|
19
18
|
|
20
|
-
def
|
21
|
-
|
19
|
+
def get_constant_definition_items(node)
|
20
|
+
result = []
|
21
|
+
|
22
|
+
link_nodes = if @node_context.parent.is_a?(Prism::CallNode) && @node_context.parent.name == :link
|
22
23
|
# inside link node
|
23
24
|
link_node = RubyLsp::Ree::ParsedLinkNode.new(@node_context.parent)
|
24
25
|
link_node.parse_imports
|
25
26
|
[link_node]
|
26
27
|
else
|
27
|
-
parsed_doc =
|
28
|
+
parsed_doc = if @node_context.parent.is_a?(Prism::CallNode)
|
29
|
+
RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(@uri)
|
30
|
+
else
|
31
|
+
RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@node_context.parent, @uri)
|
32
|
+
end
|
33
|
+
|
28
34
|
parsed_doc.link_nodes
|
29
35
|
end
|
30
36
|
|
@@ -48,7 +54,7 @@ module RubyLsp
|
|
48
54
|
uri = method.uri.to_s
|
49
55
|
end
|
50
56
|
|
51
|
-
|
57
|
+
result << Interface::Location.new(
|
52
58
|
uri: uri,
|
53
59
|
range: Interface::Range.new(
|
54
60
|
start: Interface::Position.new(line: 0, character: 0),
|
@@ -57,40 +63,46 @@ module RubyLsp
|
|
57
63
|
)
|
58
64
|
end
|
59
65
|
end
|
66
|
+
|
67
|
+
result
|
60
68
|
end
|
61
69
|
|
62
|
-
def
|
70
|
+
def get_ree_objects_definition_items(node)
|
63
71
|
message = node.message
|
64
|
-
|
72
|
+
result = []
|
73
|
+
|
74
|
+
definition_item = ReeObjectFinder.new(@index).find_object(message)
|
75
|
+
return [] unless definition_item
|
65
76
|
|
66
|
-
|
67
|
-
return unless
|
77
|
+
definition_uri = definition_item.uri.to_s
|
78
|
+
return [] unless definition_uri
|
68
79
|
|
69
|
-
|
70
|
-
uri:
|
80
|
+
result << Interface::Location.new(
|
81
|
+
uri: definition_uri,
|
71
82
|
range: Interface::Range.new(
|
72
83
|
start: Interface::Position.new(line: 0, character: 0),
|
73
84
|
end: Interface::Position.new(line: 0, character: 0),
|
74
85
|
),
|
75
86
|
)
|
76
87
|
|
77
|
-
|
88
|
+
result
|
78
89
|
end
|
79
90
|
|
80
|
-
def
|
91
|
+
def get_linked_object_definition_items(node)
|
92
|
+
result = []
|
81
93
|
parent_node = @node_context.parent
|
82
|
-
return unless parent_node.name == :link
|
94
|
+
return [] unless parent_node.name == :link
|
83
95
|
|
84
96
|
link_node = RubyLsp::Ree::ParsedLinkNode.new(parent_node, package_name_from_uri(@uri))
|
85
97
|
package_name = link_node.link_package_name
|
86
98
|
|
87
99
|
method_candidates = @index[node.unescaped]
|
88
|
-
return if !method_candidates || method_candidates.size == 0
|
100
|
+
return [] if !method_candidates || method_candidates.size == 0
|
89
101
|
|
90
102
|
method = method_candidates.detect{ package_name_from_uri(_1.uri) == package_name }
|
91
|
-
return unless method
|
103
|
+
return [] unless method
|
92
104
|
|
93
|
-
|
105
|
+
result << Interface::Location.new(
|
94
106
|
uri: method.uri.to_s,
|
95
107
|
range: Interface::Range.new(
|
96
108
|
start: Interface::Position.new(line: 0, character: 0),
|
@@ -98,23 +110,22 @@ module RubyLsp
|
|
98
110
|
),
|
99
111
|
)
|
100
112
|
|
101
|
-
|
113
|
+
result
|
102
114
|
end
|
103
115
|
|
104
|
-
def
|
116
|
+
def get_linked_filepath_definition_items(node)
|
117
|
+
result = []
|
105
118
|
local_path = find_local_file_path(node.unescaped)
|
106
119
|
|
107
|
-
|
108
|
-
@response_builder << Interface::Location.new(
|
109
|
-
uri: File.join(Dir.pwd, local_path),
|
110
|
-
range: Interface::Range.new(
|
111
|
-
start: Interface::Position.new(line: 0, character: 0),
|
112
|
-
end: Interface::Position.new(line: 0, character: 0),
|
113
|
-
),
|
114
|
-
)
|
115
|
-
end
|
120
|
+
return [] unless local_path
|
116
121
|
|
117
|
-
|
122
|
+
result << Interface::Location.new(
|
123
|
+
uri: File.join(Dir.pwd, local_path),
|
124
|
+
range: Interface::Range.new(
|
125
|
+
start: Interface::Position.new(line: 0, character: 0),
|
126
|
+
end: Interface::Position.new(line: 0, character: 0),
|
127
|
+
),
|
128
|
+
)
|
118
129
|
end
|
119
130
|
end
|
120
131
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require_relative "../ree_object_finder"
|
2
|
+
require_relative "../parsing/parsed_document_builder"
|
3
|
+
require_relative "../parsing/parsed_link_node"
|
4
|
+
require_relative "../utils/ree_lsp_utils"
|
5
|
+
|
6
|
+
module RubyLsp
|
7
|
+
module Ree
|
8
|
+
class HoverHandler
|
9
|
+
include Requests::Support::Common
|
10
|
+
include RubyLsp::Ree::ReeLspUtils
|
11
|
+
|
12
|
+
def initialize(index, node_context)
|
13
|
+
@index = index
|
14
|
+
@node_context = node_context
|
15
|
+
@finder = ReeObjectFinder.new(@index)
|
16
|
+
end
|
17
|
+
|
18
|
+
def get_ree_object_hover_items(node)
|
19
|
+
ree_object = @finder.find_object(node.name.to_s)
|
20
|
+
|
21
|
+
return [] unless ree_object
|
22
|
+
|
23
|
+
documentation = <<~DOC
|
24
|
+
Ree object, type: :#{@finder.object_type(ree_object)}
|
25
|
+
|
26
|
+
usage: #{node.name.to_s}#{get_detail_string(ree_object)}
|
27
|
+
|
28
|
+
package: #{package_name_from_uri(ree_object.uri)}
|
29
|
+
|
30
|
+
file: #{path_from_package_folder(ree_object.uri)}
|
31
|
+
DOC
|
32
|
+
|
33
|
+
[documentation]
|
34
|
+
end
|
35
|
+
|
36
|
+
def get_detail_string(ree_object)
|
37
|
+
return '' if ree_object.signatures.size == 0
|
38
|
+
|
39
|
+
"(#{get_parameters_string(ree_object.signatures.first)})"
|
40
|
+
end
|
41
|
+
|
42
|
+
def get_parameters_string(signature)
|
43
|
+
return '' unless signature
|
44
|
+
|
45
|
+
signature.parameters.map(&:decorated_name).join(', ')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../handlers/completion_handler"
|
2
|
+
|
3
|
+
module RubyLsp
|
4
|
+
module Ree
|
5
|
+
class CompletionListener
|
6
|
+
include Requests::Support::Common
|
7
|
+
|
8
|
+
CHARS_COUNT = 1
|
9
|
+
|
10
|
+
def initialize(response_builder, node_context, index, dispatcher, uri)
|
11
|
+
@response_builder = response_builder
|
12
|
+
@handler = RubyLsp::Ree::CompletionHandler.new(index, uri, node_context)
|
13
|
+
|
14
|
+
dispatcher.register(self, :on_call_node_enter)
|
15
|
+
dispatcher.register(self, :on_constant_read_node_enter)
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_constant_read_node_enter(node)
|
19
|
+
node_name = node.name.to_s
|
20
|
+
return if node_name.size < CHARS_COUNT
|
21
|
+
|
22
|
+
completion_items = @handler.get_class_name_completion_items(node)
|
23
|
+
put_items_into_response(completion_items)
|
24
|
+
rescue => e
|
25
|
+
$stderr.puts("error in completion listener(on_constant_read_node_enter): #{e.message} : #{e.backtrace.first}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_call_node_enter(node)
|
29
|
+
completion_items = []
|
30
|
+
ree_receiver = @handler.get_ree_receiver(node.receiver)
|
31
|
+
|
32
|
+
if ree_receiver
|
33
|
+
completion_items = @handler.get_ree_object_methods_completions_items(ree_receiver, node.receiver, node)
|
34
|
+
else
|
35
|
+
return if node.receiver
|
36
|
+
return if node.name.to_s.size < CHARS_COUNT
|
37
|
+
|
38
|
+
completion_items = @handler.get_ree_objects_completions_items(node)
|
39
|
+
end
|
40
|
+
|
41
|
+
put_items_into_response(completion_items)
|
42
|
+
rescue => e
|
43
|
+
$stderr.puts("error in completion listener(on_call_node_enter): #{e.message} : #{e.backtrace.first}")
|
44
|
+
end
|
45
|
+
|
46
|
+
def put_items_into_response(items)
|
47
|
+
items.each do |item|
|
48
|
+
@response_builder << item
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative "../handlers/definition_handler"
|
2
|
+
|
3
|
+
module RubyLsp
|
4
|
+
module Ree
|
5
|
+
class DefinitionListener
|
6
|
+
include Requests::Support::Common
|
7
|
+
|
8
|
+
def initialize(response_builder, node_context, index, dispatcher, uri)
|
9
|
+
@response_builder = response_builder
|
10
|
+
@handler = RubyLsp::Ree::DefinitionHandler.new(index, uri, node_context)
|
11
|
+
|
12
|
+
dispatcher.register(
|
13
|
+
self,
|
14
|
+
:on_call_node_enter,
|
15
|
+
:on_symbol_node_enter,
|
16
|
+
:on_string_node_enter,
|
17
|
+
:on_constant_read_node_enter
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_constant_read_node_enter(node)
|
22
|
+
definition_items = @handler.get_constant_definition_items(node)
|
23
|
+
put_items_into_response(definition_items)
|
24
|
+
rescue => e
|
25
|
+
$stderr.puts("error in definition listener(on_constant_read_node_enter): #{e.message} : #{e.backtrace.first}")
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_call_node_enter(node)
|
29
|
+
return unless node.message
|
30
|
+
|
31
|
+
if node.receiver
|
32
|
+
# ruby lsp handles such cases itself
|
33
|
+
return
|
34
|
+
else
|
35
|
+
definition_items = @handler.get_ree_objects_definition_items(node)
|
36
|
+
put_items_into_response(definition_items)
|
37
|
+
end
|
38
|
+
rescue => e
|
39
|
+
$stderr.puts("error in definition listener(on_call_node_enter): #{e.message} : #{e.backtrace.first}")
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_symbol_node_enter(node)
|
43
|
+
definition_items = @handler.get_linked_object_definition_items(node)
|
44
|
+
put_items_into_response(definition_items)
|
45
|
+
rescue => e
|
46
|
+
$stderr.puts("error in definition listener(on_symbol_node_enter): #{e.message} : #{e.backtrace.first}")
|
47
|
+
end
|
48
|
+
|
49
|
+
def on_string_node_enter(node)
|
50
|
+
definition_items = @handler.get_linked_filepath_definition_items(node)
|
51
|
+
put_items_into_response(definition_items)
|
52
|
+
rescue => e
|
53
|
+
$stderr.puts("error in definition listener(on_string_node_enter): #{e.message} : #{e.backtrace.first}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def put_items_into_response(items)
|
57
|
+
items.each do |item|
|
58
|
+
@response_builder << item
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|