ruby-lsp-ree 0.1.17 → 0.1.18
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/README.md +3 -2
- data/lib/ruby_lsp/ruby_lsp_ree/formatters/import_packages_formatter.rb +42 -0
- data/lib/ruby_lsp/ruby_lsp_ree/formatters/missing_imports_formatter.rb +0 -1
- data/lib/ruby_lsp/ruby_lsp_ree/formatters/unused_links_formatter.rb +1 -1
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/body_parsers/call_objects_parser.rb +8 -0
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_base_document.rb +10 -0
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_class_document.rb +8 -8
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_link_node.rb +12 -6
- data/lib/ruby_lsp/ruby_lsp_ree/ree_constants.rb +1 -0
- data/lib/ruby_lsp/ruby_lsp_ree/ree_formatter.rb +2 -0
- data/lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb +1 -1
- data/lib/ruby_lsp/ruby_lsp_ree/ree_source_editor.rb +28 -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: 9061105dc55ff366d35880fe7960838159e9635115e26b352197837cf30c70c7
|
4
|
+
data.tar.gz: 147936b7c46a0f5ac07442195079fdee2ae98ca6b88df0a800e48ab3d2c62f77
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 344f57eaefab54e046008b80b81f6d131eb9128e5b88230543f09ebc8d93af0b979310b370c0f951fd1667a895ab9d5dff5a5d85a96e34b005bebb04d02ee992
|
7
|
+
data.tar.gz: 0ea492e66ed6beeb7deef48e3f89f8c54295645afeece6e290c43b41979a28980aa470e840ef1fc9e77c4e04f176cd29f1e75b6c32638d994615344e83831868
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## [0.1.18] - 2025-05-05
|
2
|
+
|
3
|
+
- formatter: do not remove links from mappers
|
4
|
+
- formatter: change incorrect package for link on save
|
5
|
+
- add missing imports: add more cases with missing imports
|
6
|
+
|
1
7
|
## [0.1.17] - 2025-04-28
|
2
8
|
|
3
9
|
- add missing imports: improved handling imports with the same name
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -32,7 +32,7 @@ To switch off/on formatter features, use Ruby LSP addon settings:
|
|
32
32
|
}
|
33
33
|
}
|
34
34
|
```
|
35
|
-
available formatters: `SortLinksFormatter`, `MissingErrorDefinitionsFormatter`, `MissingErrorContractsFormatter`, `MissingErrorLocalesFormatter`, `UnusedLinksFormatter`, `MissingImportsFormatter`
|
35
|
+
available formatters: `SortLinksFormatter`, `MissingErrorDefinitionsFormatter`, `MissingErrorContractsFormatter`, `MissingErrorLocalesFormatter`, `UnusedLinksFormatter`, `MissingImportsFormatter`, `ImportPackagesFormatter`
|
36
36
|
|
37
37
|
## Functions
|
38
38
|
|
@@ -43,4 +43,5 @@ available formatters: `SortLinksFormatter`, `MissingErrorDefinitionsFormatter`,
|
|
43
43
|
- missing error locales detection
|
44
44
|
- Go To Definition for Ree objects
|
45
45
|
- hover information for Ree objects and error locales
|
46
|
-
- Ree templates support
|
46
|
+
- Ree templates support
|
47
|
+
- add missing import links on save
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'base_formatter'
|
2
|
+
require_relative "../ree_object_finder"
|
3
|
+
|
4
|
+
module RubyLsp
|
5
|
+
module Ree
|
6
|
+
class ImportPackagesFormatter < BaseFormatter
|
7
|
+
include RubyLsp::Ree::ReeLspUtils
|
8
|
+
|
9
|
+
def call(source, uri)
|
10
|
+
return source unless @index
|
11
|
+
|
12
|
+
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_source(source, uri)
|
13
|
+
|
14
|
+
finder = ReeObjectFinder.new(@index)
|
15
|
+
editor = RubyLsp::Ree::ReeSourceEditor.new(source)
|
16
|
+
|
17
|
+
current_package = package_name_from_uri(uri)
|
18
|
+
|
19
|
+
parsed_doc.link_nodes.select(&:object_name_type?).each do |link_node|
|
20
|
+
next if finder.find_object_for_package(link_node.name, link_node.link_package_name)
|
21
|
+
|
22
|
+
ree_objects = finder.find_objects(link_node.name)
|
23
|
+
|
24
|
+
if ree_objects.size == 1
|
25
|
+
editor.change_link_package(link_node, ree_objects.first.object_package, current_package)
|
26
|
+
else
|
27
|
+
send_message(link_node.name)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
editor.source
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def send_message(link_name)
|
37
|
+
message = "Link package is invalid for: #{link_name}"
|
38
|
+
@message_queue << RubyLsp::Notification.window_show_message(message, type: Constant::MessageType::ERROR)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -86,6 +86,14 @@ class RubyLsp::Ree::CallObjectsParser
|
|
86
86
|
if node.respond_to?(:value) && node.value
|
87
87
|
call_objects += parse_body_call_objects([node.value])
|
88
88
|
end
|
89
|
+
|
90
|
+
if node.respond_to?(:left) && node.left
|
91
|
+
call_objects += parse_body_call_objects([node.left])
|
92
|
+
end
|
93
|
+
|
94
|
+
if node.respond_to?(:right) && node.right
|
95
|
+
call_objects += parse_body_call_objects([node.right])
|
96
|
+
end
|
89
97
|
end
|
90
98
|
end
|
91
99
|
|
@@ -28,6 +28,10 @@ class RubyLsp::Ree::ParsedBaseDocument
|
|
28
28
|
false
|
29
29
|
end
|
30
30
|
|
31
|
+
def includes_mapper_dsl?
|
32
|
+
false
|
33
|
+
end
|
34
|
+
|
31
35
|
def includes_linked_object?(obj_name)
|
32
36
|
@link_nodes.map(&:name).include?(obj_name)
|
33
37
|
end
|
@@ -36,6 +40,12 @@ class RubyLsp::Ree::ParsedBaseDocument
|
|
36
40
|
@link_nodes.detect{ node_name(_1) == name }
|
37
41
|
end
|
38
42
|
|
43
|
+
def find_import_for_package(name, package_name)
|
44
|
+
@link_nodes.detect do |link_node|
|
45
|
+
link_node.imports.include?(name) && link_node.link_package_name == package_name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
39
49
|
def node_name(node)
|
40
50
|
return nil unless node.respond_to?(:name)
|
41
51
|
|
@@ -40,6 +40,10 @@ class RubyLsp::Ree::ParsedClassDocument < RubyLsp::Ree::ParsedBaseDocument
|
|
40
40
|
@class_includes.any?{ node_name(_1) == ROUTES_DSL_MODULE }
|
41
41
|
end
|
42
42
|
|
43
|
+
def includes_mapper_dsl?
|
44
|
+
@class_includes.any?{ node_name(_1) == MAPPER_DSL_MODULE }
|
45
|
+
end
|
46
|
+
|
43
47
|
def includes_ree_dsl?
|
44
48
|
ree_dsls.size > 0
|
45
49
|
end
|
@@ -54,12 +58,6 @@ class RubyLsp::Ree::ParsedClassDocument < RubyLsp::Ree::ParsedBaseDocument
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
57
|
-
def find_import_for_package(name, package_name)
|
58
|
-
@link_nodes.detect do |link_node|
|
59
|
-
link_node.imports.include?(name) && link_node.link_package_name == package_name
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
61
|
def has_blank_links_container?
|
64
62
|
links_container_node && !@links_container_block_node
|
65
63
|
end
|
@@ -77,9 +75,11 @@ class RubyLsp::Ree::ParsedClassDocument < RubyLsp::Ree::ParsedBaseDocument
|
|
77
75
|
end
|
78
76
|
|
79
77
|
def parse_class_includes
|
80
|
-
return
|
78
|
+
return @class_includes if @class_includes
|
79
|
+
@class_includes = []
|
80
|
+
return @class_includes unless has_body?
|
81
81
|
|
82
|
-
@class_includes
|
82
|
+
@class_includes = class_node.body.body.select{ node_name(_1) == :include }.map do |class_include|
|
83
83
|
first_arg = class_include.arguments.arguments.first
|
84
84
|
|
85
85
|
include_name = case first_arg
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'prism'
|
2
2
|
|
3
3
|
class RubyLsp::Ree::ParsedLinkNode
|
4
|
-
attr_reader :node, :document_package, :name, :import_items
|
4
|
+
attr_reader :node, :document_package, :name, :import_items, :from_param
|
5
5
|
|
6
6
|
FROM_ARG_KEY = 'from'
|
7
7
|
IMPORT_ARG_KEY = 'import'
|
@@ -27,6 +27,8 @@ class RubyLsp::Ree::ParsedLinkNode
|
|
27
27
|
@node = node
|
28
28
|
@document_package = document_package
|
29
29
|
@name = parse_name
|
30
|
+
|
31
|
+
parse_params
|
30
32
|
end
|
31
33
|
|
32
34
|
def link_package_name
|
@@ -43,13 +45,9 @@ class RubyLsp::Ree::ParsedLinkNode
|
|
43
45
|
end
|
44
46
|
|
45
47
|
def from_arg_value
|
46
|
-
@kw_args ||= @node.arguments.arguments.detect{ |arg| arg.is_a?(Prism::KeywordHashNode) }
|
47
|
-
return unless @kw_args
|
48
|
-
|
49
|
-
@from_param ||= @kw_args.elements.detect{ _1.key.unescaped == FROM_ARG_KEY }
|
50
48
|
return unless @from_param
|
51
49
|
|
52
|
-
@from_param.value.unescaped
|
50
|
+
@from_param.value.respond_to?(:unescaped) ? @from_param.value.unescaped : nil
|
53
51
|
end
|
54
52
|
|
55
53
|
def name_arg_node
|
@@ -125,6 +123,14 @@ class RubyLsp::Ree::ParsedLinkNode
|
|
125
123
|
|
126
124
|
private
|
127
125
|
|
126
|
+
def parse_params
|
127
|
+
@kw_args = @node.arguments.arguments.detect{ |arg| arg.is_a?(Prism::KeywordHashNode) }
|
128
|
+
@from_param = nil
|
129
|
+
return unless @kw_args
|
130
|
+
|
131
|
+
@from_param = @kw_args.elements.detect{ _1.key.unescaped == FROM_ARG_KEY }
|
132
|
+
end
|
133
|
+
|
128
134
|
def last_arg
|
129
135
|
@node.arguments.arguments.last
|
130
136
|
end
|
@@ -4,6 +4,7 @@ require_relative 'formatters/missing_error_contracts_formatter'
|
|
4
4
|
require_relative 'formatters/missing_error_locales_formatter'
|
5
5
|
require_relative 'formatters/unused_links_formatter'
|
6
6
|
require_relative 'formatters/missing_imports_formatter'
|
7
|
+
require_relative 'formatters/import_packages_formatter'
|
7
8
|
|
8
9
|
module RubyLsp
|
9
10
|
module Ree
|
@@ -29,6 +30,7 @@ module RubyLsp
|
|
29
30
|
RubyLsp::Ree::MissingErrorLocalesFormatter,
|
30
31
|
RubyLsp::Ree::UnusedLinksFormatter,
|
31
32
|
RubyLsp::Ree::MissingImportsFormatter,
|
33
|
+
RubyLsp::Ree::ImportPackagesFormatter,
|
32
34
|
RubyLsp::Ree::SortLinksFormatter,
|
33
35
|
].select do |formatter|
|
34
36
|
formatter_name = formatter.name.split('::').last.to_sym
|
@@ -58,7 +58,7 @@ module RubyLsp
|
|
58
58
|
|
59
59
|
def find_objects(name)
|
60
60
|
objects_by_name = @index[name]
|
61
|
-
return unless objects_by_name
|
61
|
+
return [] unless objects_by_name
|
62
62
|
|
63
63
|
ree_objects = objects_by_name.select{ _1.comments.to_s.lines.first&.chomp == REE_OBJECT_STRING }
|
64
64
|
decorate_objects(ree_objects)
|
@@ -92,6 +92,34 @@ module RubyLsp
|
|
92
92
|
|
93
93
|
source_lines[line] = source_lines[line].chomp + new_text
|
94
94
|
end
|
95
|
+
|
96
|
+
def change_link_package(link_node, new_package, current_package)
|
97
|
+
if new_package == current_package # change package to current -> remove 'from' param
|
98
|
+
return unless link_node.from_param
|
99
|
+
|
100
|
+
from_param_location = link_node.from_param.location
|
101
|
+
name_location = link_node.first_arg_location
|
102
|
+
|
103
|
+
line = from_param_location.start_line - 1
|
104
|
+
start_column = name_location.end_column - 1
|
105
|
+
end_column = from_param_location.end_column
|
106
|
+
|
107
|
+
source_lines[line] = source_lines[line][0..start_column] + source_lines[line][end_column..-1]
|
108
|
+
elsif link_node.from_param
|
109
|
+
from_param_location = link_node.from_param.value.location
|
110
|
+
line = from_param_location.start_line - 1
|
111
|
+
start_column = from_param_location.start_column - 1
|
112
|
+
end_column = from_param_location.end_column
|
113
|
+
|
114
|
+
source_lines[line] = source_lines[line][0..start_column] + ":#{new_package}" + source_lines[line][end_column..-1]
|
115
|
+
else
|
116
|
+
name_location = link_node.first_arg_location
|
117
|
+
line = name_location.start_line - 1
|
118
|
+
start_column = name_location.end_column - 1
|
119
|
+
|
120
|
+
source_lines[line] = source_lines[line][0..start_column] + ", from: :#{new_package}" + source_lines[line][start_column+1..-1]
|
121
|
+
end
|
122
|
+
end
|
95
123
|
end
|
96
124
|
end
|
97
125
|
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.18
|
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-05-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:
|
@@ -30,6 +30,7 @@ files:
|
|
30
30
|
- lib/ruby_lsp/ruby_lsp_ree/completion/const_additional_text_edits_creator.rb
|
31
31
|
- lib/ruby_lsp/ruby_lsp_ree/completion/method_additional_text_edits_creator.rb
|
32
32
|
- lib/ruby_lsp/ruby_lsp_ree/formatters/base_formatter.rb
|
33
|
+
- lib/ruby_lsp/ruby_lsp_ree/formatters/import_packages_formatter.rb
|
33
34
|
- lib/ruby_lsp/ruby_lsp_ree/formatters/missing_error_contracts_formatter.rb
|
34
35
|
- lib/ruby_lsp/ruby_lsp_ree/formatters/missing_error_definitions_formatter.rb
|
35
36
|
- lib/ruby_lsp/ruby_lsp_ree/formatters/missing_error_locales_formatter.rb
|