ruby-lsp-ree 0.1.16 → 0.1.17

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: 4d1b2bf9c373c729b6412704fd6daf364ed4c8b278405f52b4c1fc32b256570c
4
- data.tar.gz: 0bde5c4413ec6d4ccfd807dc6e6eb33d1e47ab018dfbfaad47200775b2c3badb
3
+ metadata.gz: 385dfd53ada066f3fbbe41421c4b425773d26e70fd129a68a43d623c77840597
4
+ data.tar.gz: 1f9d2120db749bb2bf71a56653143d847dad3463fcc1a7528b790be2ea5e667e
5
5
  SHA512:
6
- metadata.gz: 6a97047d4924f208415ba6c5ed45e6abb57141e74fd44ad79368a9a7dd025a2ce0c36cfe2ca95db6fd0dab9586d9a1c5484be2e930ab129ab6acb7975fce310f
7
- data.tar.gz: 17daba371512607775021704c56895bcc9e41666e598c9603c7da22ebac567de1cc7a2957f050a6657429057557dcbbc86654141eba98faa8c7ddde6e892a030
6
+ metadata.gz: 110bcd5a8efdc990f09b8c62c0448799e4573187d630da481390594f5544137c7445971bb3936aed2c1bc76c638843d8084fcbe0c3dac2fe4fb26fe04f08ce6e
7
+ data.tar.gz: c2f53768271f71890342e40dfd7762102b7b63323f4c68386a3503847ecd15635ad2adfe338f030ec410f1d46d944206faaa20f5c158d9c769a4031a40fe1f2a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,8 @@
1
+ ## [0.1.17] - 2025-04-28
2
+
3
+ - add missing imports: improved handling imports with the same name
4
+ - add missing imports: handle more cases with missing imports (nested calls, predicates, etc.)
5
+
1
6
  ## [0.1.16] - 2025-04-24
2
7
 
3
8
  - formatter: add missing imports
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- ruby-lsp-ree (0.1.16)
4
+ ruby-lsp-ree (0.1.17)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -17,16 +17,12 @@ module RubyLsp
17
17
 
18
18
  current_package = package_name_from_uri(uri)
19
19
 
20
- fn_calls = parsed_doc.parse_fn_calls
21
- filtered_fn_calls = filter_fn_calls(parsed_doc, fn_calls)
22
- objects_to_add = filtered_fn_calls.map{ |fn_call|
23
- finder.find_object(fn_call.name.to_s)
24
- }.compact
25
20
 
26
- bean_calls = parsed_doc.parse_bean_calls
27
- filtered_bean_calls = filter_bean_calls(parsed_doc, bean_calls)
28
- objects_to_add += filtered_bean_calls.map{ |bean_call|
29
- finder.find_object(bean_call.receiver_name.to_s)
21
+ method_calls = parsed_doc.parse_method_calls
22
+ filtered_method_calls = filter_method_calls(parsed_doc, method_calls)
23
+ objects_to_add = filtered_method_calls.map{ |fn_call|
24
+ ree_objects = finder.find_objects(fn_call.name.to_s)
25
+ choose_object_to_add(ree_objects, current_package)
30
26
  }.compact
31
27
 
32
28
  objects_to_add.uniq!{ |obj| obj.name }
@@ -39,25 +35,40 @@ module RubyLsp
39
35
 
40
36
  private
41
37
 
42
- def filter_fn_calls(parsed_doc, fn_calls)
38
+ def filter_method_calls(parsed_doc, method_calls)
43
39
  parsed_doc.parse_instance_methods
44
40
 
45
- fn_calls.reject{ |fn_call|
46
- parsed_doc.doc_instance_methods.map(&:name).include?(fn_call.name)
47
- }
48
- end
49
-
50
- def filter_bean_calls(parsed_doc, bean_calls)
51
- bean_calls.select do |bean_call|
52
- if !bean_call.method_name
41
+ method_calls.select do |method_call|
42
+ if !method_call.method_name
53
43
  true
44
+ elsif parsed_doc.doc_instance_methods.map(&:name).include?(method_call.name)
45
+ false
54
46
  else
55
- method_obj = parsed_doc.doc_instance_methods.detect{ _1.name == bean_call.method_name }
56
- local_variables = method_obj.parse_local_variables
57
- !local_variables.map(&:name).include?(bean_call.receiver_name)
47
+ method_obj = parsed_doc.doc_instance_methods.detect{ _1.name == method_call.method_name }
48
+ local_variables = method_obj.parse_local_variables.map(&:name)
49
+ method_params = method_obj.param_names
50
+
51
+ !local_variables.include?(method_call.name) && !method_params.include?(method_call.name)
58
52
  end
59
53
  end
60
54
  end
55
+
56
+ def choose_object_to_add(ree_objects, current_package)
57
+ return if !ree_objects || ree_objects.size == 0
58
+ return ree_objects.first if ree_objects.size == 1
59
+
60
+ current_package_object = ree_objects.detect{ _1.object_package == current_package }
61
+ return current_package_object if current_package_object
62
+
63
+ package_names = ree_objects.map(&:object_package)
64
+ if package_names.sort == ['ree_date', 'ree_datetime'].sort
65
+ return ree_objects.detect{ _1.object_package == 'ree_datetime' }
66
+ end
67
+
68
+ ree_object = ree_objects.first
69
+ ree_object.set_package!('FILL_PACKAGE')
70
+ ree_object
71
+ end
61
72
  end
62
73
  end
63
74
  end
@@ -52,24 +52,51 @@ class RubyLsp::Ree::CallObjectsParser
52
52
 
53
53
  def parse_body_call_objects(node_body)
54
54
  call_objects = []
55
-
55
+
56
56
  node_body.each do |node|
57
57
  if node.is_a?(Prism::CallNode)
58
- receiver = get_first_receiver(node)
59
- receiver_name = receiver.respond_to?(:name) ? receiver.name : nil
60
- call_objects << CallObject.new(name: node.name, type: :method_call, receiver_name: receiver_name)
61
- elsif node.respond_to?(:statements)
62
- call_objects += parse_body_call_objects(node.statements.body)
63
- elsif node.respond_to?(:block) && node.block && node.block.is_a?(Prism::BlockNode)
64
- call_objects += parse_body_call_objects(get_method_body(node.block))
65
- elsif node.respond_to?(:value) && node.value
66
- call_objects += parse_body_call_objects([node.value])
58
+ if node.receiver
59
+ receiver = get_first_receiver(node)
60
+
61
+ if receiver.is_a?(Prism::CallNode)
62
+ call_objects += parse_body_call_objects([receiver])
63
+ end
64
+ else
65
+ call_objects << CallObject.new(name: node.name, type: :method_call)
66
+ end
67
+
68
+ call_objects += parse_call_objects_from_args(node.arguments)
69
+ else
70
+ if node.respond_to?(:elements)
71
+ call_objects += parse_body_call_objects(node.elements)
72
+ end
73
+
74
+ if node.respond_to?(:predicate)
75
+ call_objects += parse_body_call_objects([node.predicate])
76
+ end
77
+
78
+ if node.respond_to?(:statements)
79
+ call_objects += parse_body_call_objects(node.statements.body)
80
+ end
81
+
82
+ if node.respond_to?(:block) && node.block && node.block.is_a?(Prism::BlockNode)
83
+ call_objects += parse_body_call_objects(get_method_body(node.block))
84
+ end
85
+
86
+ if node.respond_to?(:value) && node.value
87
+ call_objects += parse_body_call_objects([node.value])
88
+ end
67
89
  end
68
90
  end
69
91
 
70
92
  call_objects
71
93
  end
72
94
 
95
+ def parse_call_objects_from_args(node_arguments)
96
+ return [] if !node_arguments || !node_arguments.arguments
97
+ parse_body_call_objects(node_arguments.arguments)
98
+ end
99
+
73
100
  def parse_body_call_expressions(node_body)
74
101
  call_expressions = []
75
102
 
@@ -205,12 +205,8 @@ class RubyLsp::Ree::ParsedClassDocument < RubyLsp::Ree::ParsedBaseDocument
205
205
  .map(&:name)
206
206
  end
207
207
 
208
- def parse_fn_calls
209
- RubyLsp::Ree::CallObjectsParser.new(self).class_call_objects.select{ !_1.receiver_name }
210
- end
211
-
212
- def parse_bean_calls
213
- RubyLsp::Ree::CallObjectsParser.new(self).class_call_objects.select{ _1.receiver_name }
208
+ def parse_method_calls
209
+ RubyLsp::Ree::CallObjectsParser.new(self).class_call_objects
214
210
  end
215
211
 
216
212
  def class_name
@@ -13,6 +13,13 @@ class RubyLsp::Ree::ParsedMethodNode
13
13
  @method_node.name
14
14
  end
15
15
 
16
+ def param_names
17
+ @method_node.parameters.requireds.map(&:name) +
18
+ @method_node.parameters.keywords.map(&:name) +
19
+ [@method_node.parameters.rest&.name] +
20
+ [@method_node.parameters.keyword_rest&.name]
21
+ end
22
+
16
23
  def has_contract?
17
24
  !!@contract_node
18
25
  end
@@ -1,3 +1,4 @@
1
+ require 'delegate'
1
2
  require_relative "utils/ree_lsp_utils"
2
3
 
3
4
  module RubyLsp
@@ -9,6 +10,20 @@ module RubyLsp
9
10
 
10
11
  REE_OBJECT_STRING = 'ree_object'
11
12
 
13
+ class ReeObjectDecorator < SimpleDelegator
14
+ include RubyLsp::Ree::ReeLspUtils
15
+
16
+ def object_package
17
+ return @package_name if @package_name
18
+
19
+ package_name_from_uri(uri)
20
+ end
21
+
22
+ def set_package!(package_name)
23
+ @package_name = package_name
24
+ end
25
+ end
26
+
12
27
  def initialize(index)
13
28
  @index = index
14
29
  end
@@ -41,6 +56,14 @@ module RubyLsp
41
56
  objects_by_name.detect{ _1.comments.to_s.lines.first&.chomp == REE_OBJECT_STRING }
42
57
  end
43
58
 
59
+ def find_objects(name)
60
+ objects_by_name = @index[name]
61
+ return unless objects_by_name
62
+
63
+ ree_objects = objects_by_name.select{ _1.comments.to_s.lines.first&.chomp == REE_OBJECT_STRING }
64
+ decorate_objects(ree_objects)
65
+ end
66
+
44
67
  def find_object_for_package(name, package_name)
45
68
  objects_by_name = @index[name]
46
69
  return unless objects_by_name
@@ -65,6 +88,12 @@ module RubyLsp
65
88
  def object_documentation(ree_object)
66
89
  ree_object.comments.lines[2..-1].join("\n").chomp
67
90
  end
91
+
92
+ private
93
+
94
+ def decorate_objects(ree_objects)
95
+ ree_objects.map{ ReeObjectDecorator.new(_1) }
96
+ end
68
97
  end
69
98
  end
70
99
  end
@@ -68,12 +68,11 @@ module RubyLsp
68
68
  new_text = ''
69
69
 
70
70
  ree_objects.each do |ree_object|
71
- object_package = package_name_from_uri(ree_object.uri)
72
-
73
- link_text = if current_package == object_package
71
+ link_text = if current_package == ree_object.object_package
74
72
  "\s\slink :#{ree_object.name}"
75
73
  else
76
- "\s\slink :#{ree_object.name}, from: :#{object_package}"
74
+ package_str = ree_object.object_package == 'FILL_PACKAGE' ? 'FILL_PACKAGE' : ":#{ree_object.object_package}"
75
+ "\s\slink :#{ree_object.name}, from: #{package_str}"
77
76
  end
78
77
 
79
78
  if parsed_doc.links_container_node
@@ -2,6 +2,6 @@
2
2
 
3
3
  module RubyLsp
4
4
  module Ree
5
- VERSION = "0.1.16"
5
+ VERSION = "0.1.17"
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.16
4
+ version: 0.1.17
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-04-24 00:00:00.000000000 Z
11
+ date: 2025-04-28 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: