ruby-lsp-ree 0.1.0 → 0.1.2

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: 925a5297663b9b4e653e9c837cd6bfc8942c5445f657619f867699b33e765809
4
- data.tar.gz: 3d3d73751c5c60d3b55ab426b896dcfcc633c921ab0b33ca7ba1aea4b1ae04dd
3
+ metadata.gz: a1104f2c78afb874d9277a4e2d1c8b5adaf925bdb4fb9abb23b08a9e5a27aff9
4
+ data.tar.gz: 061f2b31a9aac045d279797b7561597db1825e396547b5afd94d6bfc4015af1e
5
5
  SHA512:
6
- metadata.gz: 46a0c311c26ffe7bea0bc546476cf92a7b45f620b1d38c261be5c409b4c75b0249bfea393bc532166b461d2373491f1093bd1be3afa44b1dd2530ae67f8cf77f
7
- data.tar.gz: e150468d50597f9be7988891972bd708710ecc2991dadb512c36bada2bcbf4f619873435744a4b7f0b95f6eda7dc180d8e4edeec9c487de4e5084be99c59c0b8
6
+ metadata.gz: 7f29b69bb720eadc44261c63719ca950cec24db996d0d4d83117c20c3a145bb6be8934420acb850ba92841feefe4985f0e0c1caa7129cd50a41a4419f3a2ca1e
7
+ data.tar.gz: fea1f33dd0bcdfe401afe15304797fca57c254cf8472b34a8ef40d7f011d2bb60edb1010177129671fcbfc0f7ca69b212832c2c70ef8b8f125025a20be0ca17a
data/CHANGELOG.md CHANGED
@@ -3,3 +3,30 @@
3
3
  ## [0.1.0] - 2025-01-31
4
4
 
5
5
  - Initial release
6
+
7
+ ## [0.1.1] - 2025-02-10
8
+
9
+ - sort links for objects with FnDSL
10
+ - autocomplete for objects with FnDSL
11
+ - Add Link for objects with FnDSL
12
+ - improve params in autocomplete
13
+ - Go To Definition for symbols in link section
14
+ - autocomplete for enums
15
+ - autocomplete for enum values
16
+ - Add Link for enums
17
+ - Go To Definition for enums
18
+ - autocomplete for ree actions
19
+ - Add Link for ree actions
20
+ - sort links in ree actions
21
+ - autocomplete for ree dao
22
+ - autocomplete for dao filters
23
+
24
+ ## [0.1.2] - 2025-02-14
25
+
26
+ - support for :bean objects
27
+ - Go To Definition for imported constants
28
+ - use current (no saved) version of the document in autocomplete
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
data/Gemfile.lock ADDED
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ ruby-lsp-ree (0.1.2)
5
+
6
+ GEM
7
+ remote: https://rubygems.org/
8
+ specs:
9
+ rake (13.2.1)
10
+
11
+ PLATFORMS
12
+ x86_64-darwin-23
13
+ x86_64-linux
14
+
15
+ DEPENDENCIES
16
+ rake (~> 13.0)
17
+ ruby-lsp-ree!
18
+
19
+ BUNDLED WITH
20
+ 2.6.3
@@ -4,6 +4,7 @@ require_relative "completion"
4
4
  require_relative "ree_indexing_enhancement"
5
5
  require_relative "ree_lsp_utils"
6
6
  require_relative "ree_formatter"
7
+ require_relative "parsing/parsed_document_builder"
7
8
 
8
9
  module RubyLsp
9
10
  module Ree
@@ -23,15 +24,11 @@ module RubyLsp
23
24
  end
24
25
 
25
26
  def create_definition_listener(response_builder, uri, node_context, dispatcher)
26
- $stderr.puts("create_definition_listener")
27
-
28
27
  index = @global_state.index
29
- RubyLsp::Ree::Definition.new(response_builder, node_context, index, dispatcher)
28
+ RubyLsp::Ree::Definition.new(response_builder, node_context, index, dispatcher, uri)
30
29
  end
31
30
 
32
31
  def create_completion_listener(response_builder, node_context, dispatcher, uri)
33
- $stderr.puts("create_completion_listener")
34
-
35
32
  index = @global_state.index
36
33
  RubyLsp::Ree::Completion.new(response_builder, node_context, index, dispatcher, uri)
37
34
  end
@@ -1,17 +1,22 @@
1
1
  require_relative "ree_lsp_utils"
2
+ require_relative "completion_utils"
3
+ require_relative "ree_object_finder"
2
4
 
3
5
  module RubyLsp
4
6
  module Ree
5
7
  class Completion
6
8
  include Requests::Support::Common
7
9
  include RubyLsp::Ree::ReeLspUtils
10
+ include RubyLsp::Ree::CompletionUtils
8
11
 
9
- CHARS_COUNT = 4
12
+ CHARS_COUNT = 1
13
+ CANDIDATES_LIMIT = 100
10
14
 
11
15
  def initialize(response_builder, node_context, index, dispatcher, uri)
12
16
  @response_builder = response_builder
13
17
  @index = index
14
18
  @uri = uri
19
+ @node_context = node_context
15
20
 
16
21
  dispatcher.register(self, :on_call_node_enter)
17
22
  dispatcher.register(self, :on_constant_read_node_enter)
@@ -24,142 +29,80 @@ module RubyLsp
24
29
  class_name_objects = @index.instance_variable_get(:@entries).keys.select{ _1.split('::').last[0...node_name.size] == node_name}
25
30
  return if class_name_objects.size == 0
26
31
 
27
- doc_info = parse_document_from_uri(@uri)
28
-
29
- class_name_objects.take(15).each do |full_class_name|
30
- entry = @index[full_class_name].first
31
- class_name = full_class_name.split('::').last
32
-
33
- package_name = package_name_from_uri(entry.uri)
34
-
35
- label_details = Interface::CompletionItemLabelDetails.new(
36
- description: "from: :#{package_name}",
37
- detail: ""
38
- )
39
-
40
- @response_builder << Interface::CompletionItem.new(
41
- label: class_name,
42
- label_details: label_details,
43
- filter_text: class_name,
44
- text_edit: Interface::TextEdit.new(
45
- range: range_from_location(node.location),
46
- new_text: class_name,
47
- ),
48
- kind: Constant::CompletionItemKind::CLASS,
49
- additional_text_edits: get_additional_text_edits_for_constant(doc_info, class_name, package_name, entry)
50
- )
51
- end
32
+ parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@node_context.parent, @uri)
52
33
 
53
- nil
34
+ completion_items = get_class_name_completion_items(class_name_objects, parsed_doc, node, @index, CANDIDATES_LIMIT)
35
+ put_items_into_response(completion_items)
54
36
  end
55
37
 
56
38
  def on_call_node_enter(node)
39
+ if receiver_is_enum?(node)
40
+ return enum_value_completion(node)
41
+ end
42
+
43
+ if receiver_is_dao?(node)
44
+ return dao_filter_completion(node)
45
+ end
46
+
47
+ if receiver_is_bean?(node)
48
+ return bean_method_completion(node)
49
+ end
50
+
57
51
  return if node.receiver
58
52
  return if node.name.to_s.size < CHARS_COUNT
59
53
 
60
- ree_objects = @index.prefix_search(node.name.to_s)
61
- .take(50).map(&:first)
62
- .select{ _1.comments }
63
- .select{ _1.comments.to_s.lines.first&.chomp == 'ree_object' }
64
- .take(10)
54
+ ree_objects = ReeObjectFinder.search_objects(@index, node.name.to_s, CANDIDATES_LIMIT)
65
55
 
66
56
  return if ree_objects.size == 0
67
57
 
68
- doc_info = parse_document_from_uri(@uri)
69
-
70
- ree_objects.each do |ree_object|
71
- fn_name = ree_object.name
72
-
73
- package_name = package_name_from_uri(ree_object.uri)
74
-
75
- params_str = ree_object.signatures.first.parameters.map(&:name).join(', ')
76
-
77
- label_details = Interface::CompletionItemLabelDetails.new(
78
- description: "from: :#{package_name}",
79
- detail: "(#{params_str})"
80
- )
81
-
82
- $stderr.puts("ree object #{ree_object.inspect}")
83
-
84
- @response_builder << Interface::CompletionItem.new(
85
- label: fn_name,
86
- label_details: label_details,
87
- filter_text: fn_name,
88
- text_edit: Interface::TextEdit.new(
89
- range: range_from_location(node.location),
90
- new_text: "#{fn_name}(#{params_str})",
91
- ),
92
- kind: Constant::CompletionItemKind::METHOD,
93
- data: {
94
- owner_name: "Object",
95
- guessed_type: false,
96
- },
97
- additional_text_edits: get_additional_text_edits_for_method(doc_info, fn_name, package_name)
98
- )
99
- end
100
-
101
- nil
102
- end
58
+ parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@node_context.parent, @uri)
103
59
 
104
- def get_additional_text_edits_for_constant(doc_info, class_name, package_name, entry)
105
- if doc_info.linked_objects.map(&:imports).flatten.include?(class_name)
106
- $stderr.puts("links already include #{class_name}")
107
- return []
108
- end
60
+ completion_items = get_ree_objects_completions_items(ree_objects, parsed_doc, node)
61
+ put_items_into_response(completion_items)
62
+ end
109
63
 
110
- entry_uri = entry.uri.to_s
64
+ def receiver_is_enum?(node)
65
+ node.receiver && node.receiver.is_a?(Prism::CallNode) && ReeObjectFinder.find_enum(@index, node.receiver.name.to_s)
66
+ end
111
67
 
112
- link_text = if doc_info.package_name == package_name
113
- fn_name = File.basename(entry_uri, ".*")
114
- "\n\s\s\s\slink :#{fn_name}, import: -> { #{class_name} }"
115
- else
116
- path = path_from_package(entry_uri)
117
- "\n\s\s\s\slink \"#{path}\", import: -> { #{class_name} }"
118
- end
68
+ def receiver_is_dao?(node)
69
+ node.receiver && node.receiver.is_a?(Prism::CallNode) && ReeObjectFinder.find_dao(@index, node.receiver.name.to_s)
70
+ end
119
71
 
120
- new_text = link_text
72
+ def receiver_is_bean?(node)
73
+ node.receiver && node.receiver.is_a?(Prism::CallNode) && ReeObjectFinder.find_bean(@index, node.receiver.name.to_s)
74
+ end
121
75
 
122
- unless doc_info.block_node
123
- new_text = "\sdo#{link_text}\n\s\send\n"
124
- end
76
+ def enum_value_completion(node)
77
+ enum_obj = ReeObjectFinder.find_enum(@index, node.receiver.name.to_s)
78
+ location = node.receiver.location
79
+
80
+ completion_items = get_enum_values_completion_items(enum_obj, location)
81
+ put_items_into_response(completion_items)
82
+ end
125
83
 
126
- range = get_range_for_fn_insert(doc_info, link_text)
84
+ def dao_filter_completion(node)
85
+ dao_obj = ReeObjectFinder.find_dao(@index, node.receiver.name.to_s)
86
+ location = node.receiver.location
127
87
 
128
- [
129
- Interface::TextEdit.new(
130
- range: range,
131
- new_text: new_text,
132
- )
133
- ]
88
+ completion_items = get_dao_filters_completion_items(dao_obj, location)
89
+ put_items_into_response(completion_items)
134
90
  end
135
91
 
136
- def get_additional_text_edits_for_method(doc_info, fn_name, package_name)
137
- if doc_info.linked_objects.map(&:name).include?(fn_name)
138
- $stderr.puts("links already include #{fn_name}")
139
- return []
140
- end
92
+ def bean_method_completion(node)
93
+ bean_obj = ReeObjectFinder.find_bean(@index, node.receiver.name.to_s)
94
+ location = node.receiver.location
141
95
 
142
- link_text = if doc_info.package_name == package_name
143
- "\n\s\s\s\slink :#{fn_name}"
144
- else
145
- "\n\s\s\s\slink :#{fn_name}, from: :#{package_name}"
146
- end
147
-
148
- new_text = link_text
149
-
150
- unless doc_info.block_node
151
- new_text = "\sdo#{link_text}\n\s\send\n"
152
- end
96
+ completion_items = get_bean_methods_completion_items(bean_obj, location)
153
97
 
154
- range = get_range_for_fn_insert(doc_info, link_text)
98
+ put_items_into_response(completion_items)
99
+ end
155
100
 
156
- [
157
- Interface::TextEdit.new(
158
- range: range,
159
- new_text: new_text,
160
- )
161
- ]
101
+ def put_items_into_response(items)
102
+ items.each do |item|
103
+ @response_builder << item
104
+ end
162
105
  end
163
106
  end
164
107
  end
165
- end
108
+ end
@@ -0,0 +1,267 @@
1
+ require_relative "ree_lsp_utils"
2
+
3
+ module RubyLsp
4
+ module Ree
5
+ module CompletionUtils
6
+ include Requests::Support::Common
7
+ include RubyLsp::Ree::ReeLspUtils
8
+
9
+ def get_bean_methods_completion_items(bean_obj, location)
10
+ bean_node = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(bean_obj.uri, :bean)
11
+
12
+ range = Interface::Range.new(
13
+ start: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
14
+ end: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
15
+ )
16
+
17
+ bean_node.bean_methods.map do |bean_method|
18
+ signature = bean_method.signatures.first
19
+
20
+ label_details = Interface::CompletionItemLabelDetails.new(
21
+ description: "method",
22
+ detail: get_detail_string(signature)
23
+ )
24
+
25
+ Interface::CompletionItem.new(
26
+ label: bean_method.name,
27
+ label_details: label_details,
28
+ filter_text: bean_method.name,
29
+ text_edit: Interface::TextEdit.new(
30
+ range: range,
31
+ new_text: get_method_string(bean_method.name, signature)
32
+ ),
33
+ kind: Constant::CompletionItemKind::METHOD,
34
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
35
+ data: {
36
+ owner_name: "Object",
37
+ guessed_type: false,
38
+ }
39
+ )
40
+ end
41
+ end
42
+
43
+ def get_dao_filters_completion_items(dao_obj, location)
44
+ dao_node = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(dao_obj.uri, :dao)
45
+
46
+ range = Interface::Range.new(
47
+ start: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
48
+ end: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
49
+ )
50
+
51
+ dao_node.filters.map do |filter|
52
+ signature = filter.signatures.first
53
+
54
+ label_details = Interface::CompletionItemLabelDetails.new(
55
+ description: "filter",
56
+ detail: get_detail_string(signature)
57
+ )
58
+
59
+ Interface::CompletionItem.new(
60
+ label: filter.name,
61
+ label_details: label_details,
62
+ filter_text: filter.name,
63
+ text_edit: Interface::TextEdit.new(
64
+ range: range,
65
+ new_text: get_method_string(filter.name, signature)
66
+ ),
67
+ kind: Constant::CompletionItemKind::METHOD,
68
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
69
+ data: {
70
+ owner_name: "Object",
71
+ guessed_type: false,
72
+ }
73
+ )
74
+ end
75
+ end
76
+
77
+ def get_enum_values_completion_items(enum_obj, location)
78
+ enum_node = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(enum_obj.uri, :enum)
79
+
80
+ class_name = enum_node.get_class_name
81
+
82
+ label_details = Interface::CompletionItemLabelDetails.new(
83
+ description: "from: #{class_name}",
84
+ detail: ''
85
+ )
86
+
87
+ range = Interface::Range.new(
88
+ start: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
89
+ end: Interface::Position.new(line: location.start_line - 1, character: location.end_column + 1),
90
+ )
91
+
92
+ enum_node.values.map do |val|
93
+ Interface::CompletionItem.new(
94
+ label: val.name,
95
+ label_details: label_details,
96
+ filter_text: val.name,
97
+ text_edit: Interface::TextEdit.new(
98
+ range: range,
99
+ new_text: val.name
100
+ ),
101
+ kind: Constant::CompletionItemKind::METHOD,
102
+ data: {
103
+ owner_name: "Object",
104
+ guessed_type: false,
105
+ }
106
+ )
107
+ end
108
+ end
109
+
110
+ def get_class_name_completion_items(class_name_objects, parsed_doc, node, index, limit)
111
+ class_name_objects.take(limit).map do |full_class_name|
112
+ entry = index[full_class_name].first
113
+ class_name = full_class_name.split('::').last
114
+
115
+ package_name = package_name_from_uri(entry.uri)
116
+ file_name = File.basename(entry.uri.to_s)
117
+
118
+ label_details = Interface::CompletionItemLabelDetails.new(
119
+ description: "from: :#{package_name}",
120
+ detail: " #{file_name}"
121
+ )
122
+
123
+ Interface::CompletionItem.new(
124
+ label: class_name,
125
+ label_details: label_details,
126
+ filter_text: class_name,
127
+ text_edit: Interface::TextEdit.new(
128
+ range: range_from_location(node.location),
129
+ new_text: class_name,
130
+ ),
131
+ kind: Constant::CompletionItemKind::CLASS,
132
+ additional_text_edits: get_additional_text_edits_for_constant(parsed_doc, class_name, package_name, entry)
133
+ )
134
+ end
135
+ end
136
+
137
+ def get_ree_objects_completions_items(ree_objects, parsed_doc, node)
138
+ ree_objects.map do |ree_object|
139
+ ree_object_name = ree_object.name
140
+ package_name = package_name_from_uri(ree_object.uri)
141
+ signature = ree_object.signatures.first
142
+ ree_type = get_ree_type(ree_object)
143
+
144
+ label_details = Interface::CompletionItemLabelDetails.new(
145
+ description: "#{ree_type}, from: :#{package_name}",
146
+ detail: get_detail_string(signature)
147
+ )
148
+
149
+ Interface::CompletionItem.new(
150
+ label: ree_object_name,
151
+ label_details: label_details,
152
+ filter_text: ree_object_name,
153
+ text_edit: Interface::TextEdit.new(
154
+ range: range_from_location(node.location),
155
+ new_text: get_method_string(ree_object_name, signature)
156
+ ),
157
+ kind: Constant::CompletionItemKind::METHOD,
158
+ insert_text_format: Constant::InsertTextFormat::SNIPPET,
159
+ data: {
160
+ owner_name: "Object",
161
+ guessed_type: false,
162
+ },
163
+ additional_text_edits: get_additional_text_edits_for_method(parsed_doc, ree_object_name, package_name)
164
+ )
165
+ end
166
+ end
167
+
168
+ def get_detail_string(signature)
169
+ return '' unless signature
170
+
171
+ "(#{get_parameters_string(signature)})"
172
+ end
173
+
174
+ def get_parameters_string(signature)
175
+ return '' unless signature
176
+
177
+ signature.parameters.map(&:decorated_name).join(', ')
178
+ end
179
+
180
+ def get_method_string(fn_name, signature)
181
+ return fn_name unless signature
182
+
183
+ "#{fn_name}(#{get_parameters_placeholder(signature)})"
184
+ end
185
+
186
+ def get_parameters_placeholder(signature)
187
+ return '' unless signature
188
+
189
+ signature.parameters.to_enum.with_index.map do |signature_param, index|
190
+ case signature_param
191
+ when RubyIndexer::Entry::KeywordParameter, RubyIndexer::Entry::OptionalKeywordParameter
192
+ "#{signature_param.name}: ${#{index+1}:#{signature_param.name}}"
193
+ else
194
+ "${#{index+1}:#{signature_param.name}}"
195
+ end
196
+ end.join(', ')
197
+ end
198
+
199
+ def get_additional_text_edits_for_constant(parsed_doc, class_name, package_name, entry)
200
+ if parsed_doc.includes_linked_constant?(class_name)
201
+ return []
202
+ end
203
+
204
+ entry_uri = entry.uri.to_s
205
+
206
+ link_text = if parsed_doc.package_name == package_name
207
+ fn_name = File.basename(entry_uri, ".*")
208
+ "\s\slink :#{fn_name}, import: -> { #{class_name} }"
209
+ else
210
+ path = path_from_package_folder(entry_uri)
211
+ "\s\slink \"#{path}\", import: -> { #{class_name} }"
212
+ end
213
+
214
+ if parsed_doc.links_container_node
215
+ link_text = "\s\s" + link_text
216
+ end
217
+
218
+ new_text = "\n" + link_text
219
+
220
+
221
+ if parsed_doc.has_blank_links_container?
222
+ new_text = "\sdo#{link_text}\n\s\send\n"
223
+ end
224
+
225
+ range = get_range_for_fn_insert(parsed_doc, link_text)
226
+
227
+ [
228
+ Interface::TextEdit.new(
229
+ range: range,
230
+ new_text: new_text,
231
+ )
232
+ ]
233
+ end
234
+
235
+ def get_additional_text_edits_for_method(parsed_doc, fn_name, package_name)
236
+ if parsed_doc.includes_linked_object?(fn_name)
237
+ return []
238
+ end
239
+
240
+ link_text = if parsed_doc.package_name == package_name
241
+ "\s\slink :#{fn_name}"
242
+ else
243
+ "\s\slink :#{fn_name}, from: :#{package_name}"
244
+ end
245
+
246
+ if parsed_doc.links_container_node
247
+ link_text = "\s\s" + link_text
248
+ end
249
+
250
+ new_text = "\n" + link_text
251
+
252
+ if parsed_doc.has_blank_links_container?
253
+ new_text = "\sdo#{link_text}\n\s\send\n"
254
+ end
255
+
256
+ range = get_range_for_fn_insert(parsed_doc, link_text)
257
+
258
+ [
259
+ Interface::TextEdit.new(
260
+ range: range,
261
+ new_text: new_text,
262
+ )
263
+ ]
264
+ end
265
+ end
266
+ end
267
+ end
@@ -1,26 +1,93 @@
1
+ require_relative "ree_lsp_utils"
2
+ require_relative "parsing/parsed_link_node"
3
+
1
4
  module RubyLsp
2
5
  module Ree
3
6
  class Definition
4
7
  include Requests::Support::Common
8
+ include RubyLsp::Ree::ReeLspUtils
5
9
 
6
- def initialize(response_builder, node_context, index, dispatcher)
10
+ def initialize(response_builder, node_context, index, dispatcher, uri)
7
11
  @response_builder = response_builder
8
12
  @node_context = node_context
9
13
  @nesting = node_context.nesting
10
14
  @index = index
15
+ @uri = uri
16
+
17
+ dispatcher.register(self, :on_call_node_enter, :on_symbol_node_enter, :on_string_node_enter, :on_constant_read_node_enter)
18
+ end
19
+
20
+ def on_constant_read_node_enter(node)
21
+ link_nodes = if @node_context.parent.is_a?(Prism::CallNode)
22
+ # inside link node
23
+ link_node = RubyLsp::Ree::ParsedLinkNode.new(@node_context.parent)
24
+ link_node.parse_imports
25
+ [link_node]
26
+ else
27
+ parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_ast(@node_context.parent, @uri)
28
+ parsed_doc.link_nodes
29
+ end
30
+
31
+ link_nodes.each do |link_node|
32
+ if link_node.imports.include?(node.name.to_s)
33
+ uri = ''
34
+ if link_node.file_path_type?
35
+ path = find_local_file_path(link_node.name)
36
+ next unless path
37
+
38
+ uri = File.join(Dir.pwd, path)
39
+ else
40
+ package_name = link_node.link_package_name || package_name_from_uri(@uri)
41
+
42
+ method_candidates = @index[link_node.name]
43
+ next if !method_candidates || method_candidates.size == 0
44
+
45
+ method = method_candidates.detect{ package_name_from_uri(_1.uri) == package_name }
46
+ next unless method
47
+
48
+ uri = method.uri.to_s
49
+ end
11
50
 
12
- # dispatcher.register(self, :on_call_node_enter, :on_symbol_node_enter, :on_string_node_enter)
13
- dispatcher.register(self, :on_call_node_enter)
51
+ @response_builder << Interface::Location.new(
52
+ uri: uri,
53
+ range: Interface::Range.new(
54
+ start: Interface::Position.new(line: 0, character: 0),
55
+ end: Interface::Position.new(line: 0, character: 0),
56
+ ),
57
+ )
58
+ end
59
+ end
14
60
  end
15
61
 
16
62
  def on_call_node_enter(node)
17
63
  message = node.message
18
- $stderr.puts("definition on_call_node_enter #{message}")
19
-
20
64
  return unless message
21
65
 
22
66
  method = @index[message].detect{ !_1.location.nil? }
67
+ return unless method
23
68
 
69
+ @response_builder << Interface::Location.new(
70
+ uri: method.uri.to_s,
71
+ range: Interface::Range.new(
72
+ start: Interface::Position.new(line: 0, character: 0),
73
+ end: Interface::Position.new(line: 0, character: 0),
74
+ ),
75
+ )
76
+
77
+ nil
78
+ end
79
+
80
+ def on_symbol_node_enter(node)
81
+ parent_node = @node_context.parent
82
+ return unless parent_node.name == :link
83
+
84
+ link_node = RubyLsp::Ree::ParsedLinkNode.new(parent_node, package_name_from_uri(@uri))
85
+ package_name = link_node.link_package_name
86
+
87
+ method_candidates = @index[node.unescaped]
88
+ return if !method_candidates || method_candidates.size == 0
89
+
90
+ method = method_candidates.detect{ package_name_from_uri(_1.uri) == package_name }
24
91
  return unless method
25
92
 
26
93
  @response_builder << Interface::Location.new(
@@ -33,6 +100,22 @@ module RubyLsp
33
100
 
34
101
  nil
35
102
  end
103
+
104
+ def on_string_node_enter(node)
105
+ local_path = find_local_file_path(node.unescaped)
106
+
107
+ if local_path
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
116
+
117
+ nil
118
+ end
36
119
  end
37
120
  end
38
121
  end