ruby-lsp-ree 0.1.1 → 0.1.3
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 +22 -4
- data/Gemfile +6 -0
- data/Gemfile.lock +38 -2
- data/Rakefile +5 -1
- data/lib/ruby_lsp/ruby_lsp_ree/addon.rb +11 -7
- data/lib/ruby_lsp/ruby_lsp_ree/{completion_utils.rb → handlers/completion_handler.rb} +135 -28
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/completion_listener.rb +49 -0
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/definition_listener.rb +137 -0
- data/lib/ruby_lsp/ruby_lsp_ree/listeners/hover_listener.rb +65 -0
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document.rb +61 -14
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document_builder.rb +24 -1
- data/lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_link_node.rb +31 -3
- data/lib/ruby_lsp/ruby_lsp_ree/ree_formatter.rb +14 -16
- data/lib/ruby_lsp/ruby_lsp_ree/ree_indexing_enhancement.rb +5 -5
- data/lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb +67 -8
- data/lib/ruby_lsp/ruby_lsp_ree/{ree_lsp_utils.rb → utils/ree_lsp_utils.rb} +19 -6
- data/lib/ruby_lsp_ree/version.rb +3 -5
- data/ruby-lsp-ree.gemspec +1 -1
- metadata +9 -7
- data/lib/ruby_lsp/ruby_lsp_ree/completion.rb +0 -90
- data/lib/ruby_lsp/ruby_lsp_ree/definition.rb +0 -83
@@ -5,19 +5,17 @@ class RubyLsp::Ree::ParsedDocument
|
|
5
5
|
|
6
6
|
LINK_DSL_MODULE = 'Ree::LinkDSL'
|
7
7
|
|
8
|
-
attr_reader :ast, :package_name, :class_node, :fn_node, :
|
9
|
-
:link_nodes, :values, :action_node, :
|
8
|
+
attr_reader :ast, :package_name, :class_node, :fn_node, :class_includes,
|
9
|
+
:link_nodes, :values, :action_node, :dao_node, :filters,
|
10
|
+
:bean_node, :bean_methods, :mapper_node, :links_container_block_node, :aggregate_node
|
10
11
|
|
11
12
|
def initialize(ast)
|
12
13
|
@ast = ast
|
13
14
|
end
|
14
15
|
|
15
16
|
def links_container_node
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
def links_container_block_node
|
20
|
-
@fn_block_node || @action_block_node || @dao_block_node
|
17
|
+
# TODO don't use separate node, use one field for all and additional type field: links_container_node_type
|
18
|
+
@fn_node || @action_node || @dao_node || @bean_node || @mapper_node || @aggregate_node
|
21
19
|
end
|
22
20
|
|
23
21
|
def includes_link_dsl?
|
@@ -32,8 +30,24 @@ class RubyLsp::Ree::ParsedDocument
|
|
32
30
|
@link_nodes.map(&:name).include?(obj_name)
|
33
31
|
end
|
34
32
|
|
33
|
+
def find_link_node(name)
|
34
|
+
@link_nodes.detect{ _1.name == name }
|
35
|
+
end
|
36
|
+
|
37
|
+
def find_link_with_imported_object(name)
|
38
|
+
@link_nodes.detect do |link_node|
|
39
|
+
link_node.imports.include?(name)
|
40
|
+
end
|
41
|
+
end
|
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
|
+
|
35
49
|
def has_blank_links_container?
|
36
|
-
links_container_node &&
|
50
|
+
links_container_node && !@links_container_block_node
|
37
51
|
end
|
38
52
|
|
39
53
|
def set_package_name(package_name)
|
@@ -48,21 +62,42 @@ class RubyLsp::Ree::ParsedDocument
|
|
48
62
|
return unless class_node
|
49
63
|
|
50
64
|
@fn_node ||= class_node.body.body.detect{ |node| node.name == :fn }
|
51
|
-
@
|
65
|
+
@links_container_block_node ||= @fn_node&.block
|
52
66
|
end
|
53
67
|
|
54
68
|
def parse_action_node
|
55
69
|
return unless class_node
|
56
70
|
|
57
71
|
@action_node ||= class_node.body.body.detect{ |node| node.name == :action }
|
58
|
-
@
|
72
|
+
@links_container_block_node ||= @action_node&.block
|
59
73
|
end
|
60
74
|
|
61
75
|
def parse_dao_node
|
62
76
|
return unless class_node
|
63
77
|
|
64
78
|
@dao_node ||= class_node.body.body.detect{ |node| node.name == :dao }
|
65
|
-
@
|
79
|
+
@links_container_block_node ||= @dao_node&.block
|
80
|
+
end
|
81
|
+
|
82
|
+
def parse_bean_node
|
83
|
+
return unless class_node
|
84
|
+
|
85
|
+
@bean_node ||= class_node.body.body.detect{ |node| node.name == :bean }
|
86
|
+
@links_container_block_node ||= @bean_node&.block
|
87
|
+
end
|
88
|
+
|
89
|
+
def parse_mapper_node
|
90
|
+
return unless class_node
|
91
|
+
|
92
|
+
@mapper_node ||= class_node.body.body.detect{ |node| node.name == :mapper }
|
93
|
+
@links_container_block_node ||= @mapper_node&.block
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_aggregate_node
|
97
|
+
return unless class_node
|
98
|
+
|
99
|
+
@aggregate_node ||= class_node.body.body.detect{ |node| node.name == :aggregate }
|
100
|
+
@links_container_block_node ||= @aggregate_node&.block
|
66
101
|
end
|
67
102
|
|
68
103
|
def parse_class_includes
|
@@ -81,8 +116,8 @@ class RubyLsp::Ree::ParsedDocument
|
|
81
116
|
def parse_links
|
82
117
|
return unless class_node
|
83
118
|
|
84
|
-
nodes = if links_container_node && links_container_block_node.body
|
85
|
-
links_container_block_node.body.body.select{ |node| node.name == :link }
|
119
|
+
nodes = if links_container_node && @links_container_block_node.body
|
120
|
+
@links_container_block_node.body.body.select{ |node| node.name == :link }
|
86
121
|
elsif class_includes.any?{ _1.name == LINK_DSL_MODULE }
|
87
122
|
class_node.body.body.select{ |node| node.name == :link }
|
88
123
|
else
|
@@ -113,13 +148,25 @@ class RubyLsp::Ree::ParsedDocument
|
|
113
148
|
|
114
149
|
end
|
115
150
|
|
151
|
+
def parse_bean_methods
|
152
|
+
return unless class_node
|
153
|
+
|
154
|
+
@bean_methods ||= class_node.body.body
|
155
|
+
.select{ _1.is_a?(Prism::DefNode) }
|
156
|
+
.map{ OpenStruct.new(name: _1.name.to_s, signatures: parse_signatures_from_params(_1.parameters)) }
|
157
|
+
end
|
158
|
+
|
116
159
|
def parse_filter_signature(filter_node)
|
117
160
|
return [] unless filter_node
|
118
161
|
|
119
162
|
lambda_node = filter_node.arguments&.arguments[1]
|
120
163
|
return [] unless lambda_node
|
121
164
|
|
122
|
-
|
165
|
+
parse_signatures_from_params(lambda_node.parameters.parameters)
|
166
|
+
end
|
167
|
+
|
168
|
+
def parse_signatures_from_params(parameters)
|
169
|
+
signature_params = signature_params_from_node(parameters)
|
123
170
|
[RubyIndexer::Entry::Signature.new(signature_params)]
|
124
171
|
end
|
125
172
|
|
@@ -13,6 +13,14 @@ class RubyLsp::Ree::ParsedDocumentBuilder
|
|
13
13
|
document
|
14
14
|
end
|
15
15
|
|
16
|
+
def self.build_from_ast(ast, uri, type = nil)
|
17
|
+
document = build_document(ast, type)
|
18
|
+
|
19
|
+
document.set_package_name(package_name_from_uri(uri))
|
20
|
+
|
21
|
+
document
|
22
|
+
end
|
23
|
+
|
16
24
|
def self.build_from_source(source, type = nil)
|
17
25
|
ast = Prism.parse(source).value
|
18
26
|
build_document(ast, type)
|
@@ -24,6 +32,8 @@ class RubyLsp::Ree::ParsedDocumentBuilder
|
|
24
32
|
build_enum_document(ast)
|
25
33
|
when :dao
|
26
34
|
build_dao_document(ast)
|
35
|
+
when :bean
|
36
|
+
build_bean_document(ast)
|
27
37
|
else
|
28
38
|
build_regular_document(ast)
|
29
39
|
end
|
@@ -35,6 +45,10 @@ class RubyLsp::Ree::ParsedDocumentBuilder
|
|
35
45
|
document.parse_class_node
|
36
46
|
document.parse_fn_node
|
37
47
|
document.parse_action_node
|
48
|
+
document.parse_bean_node
|
49
|
+
document.parse_dao_node
|
50
|
+
document.parse_mapper_node
|
51
|
+
document.parse_aggregate_node
|
38
52
|
document.parse_class_includes
|
39
53
|
document.parse_links
|
40
54
|
|
@@ -57,5 +71,14 @@ class RubyLsp::Ree::ParsedDocumentBuilder
|
|
57
71
|
document.parse_filters
|
58
72
|
|
59
73
|
document
|
60
|
-
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def self.build_bean_document(ast)
|
77
|
+
document = RubyLsp::Ree::ParsedDocument.new(ast)
|
78
|
+
|
79
|
+
document.parse_class_node
|
80
|
+
document.parse_bean_methods
|
81
|
+
|
82
|
+
document
|
83
|
+
end
|
61
84
|
end
|
@@ -13,7 +13,12 @@ class RubyLsp::Ree::ParsedLinkNode
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def link_package_name
|
16
|
-
|
16
|
+
case link_type
|
17
|
+
when :object_name
|
18
|
+
from_arg_value || document_package
|
19
|
+
when :file_path
|
20
|
+
@name.split('/').first
|
21
|
+
end
|
17
22
|
end
|
18
23
|
|
19
24
|
def location
|
@@ -30,9 +35,32 @@ class RubyLsp::Ree::ParsedLinkNode
|
|
30
35
|
@from_param.value.unescaped
|
31
36
|
end
|
32
37
|
|
33
|
-
def
|
34
|
-
|
38
|
+
def name_arg_node
|
39
|
+
@node.arguments.arguments.first
|
40
|
+
end
|
35
41
|
|
42
|
+
def link_type
|
43
|
+
return @link_type if @link_type
|
44
|
+
|
45
|
+
@link_type = case name_arg_node
|
46
|
+
when Prism::SymbolNode
|
47
|
+
:object_name
|
48
|
+
when Prism::StringNode
|
49
|
+
:file_path
|
50
|
+
else
|
51
|
+
nil
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def file_path_type?
|
56
|
+
link_type == :file_path
|
57
|
+
end
|
58
|
+
|
59
|
+
def object_name_type?
|
60
|
+
link_type == :object_name
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_name
|
36
64
|
case name_arg_node
|
37
65
|
when Prism::SymbolNode
|
38
66
|
name_arg_node.value
|
@@ -3,33 +3,31 @@ module RubyLsp
|
|
3
3
|
class ReeFormatter
|
4
4
|
include RubyLsp::Requests::Support::Formatter
|
5
5
|
include RubyLsp::Ree::ReeLspUtils
|
6
|
-
|
6
|
+
|
7
7
|
def initialize
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def run_formatting(uri, document)
|
11
|
-
$stderr.puts("run_formating")
|
12
|
-
|
13
11
|
source = document.source
|
14
12
|
sort_links(source)
|
15
13
|
end
|
16
|
-
|
14
|
+
|
17
15
|
private
|
18
|
-
|
16
|
+
|
19
17
|
def sort_links(source)
|
20
18
|
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_source(source)
|
21
|
-
return source if parsed_doc.link_nodes
|
22
|
-
|
19
|
+
return source if !parsed_doc.link_nodes&.any?
|
20
|
+
|
23
21
|
if parsed_doc.link_nodes.any?{ _1.location.start_line != _1.location.end_line }
|
24
22
|
$stderr.puts("multiline link definitions, don't sort")
|
25
23
|
return source
|
26
24
|
end
|
27
|
-
|
25
|
+
|
28
26
|
# sort link nodes
|
29
27
|
sorted_link_nodes = parsed_doc.link_nodes.sort{ |a, b|
|
30
28
|
a_name = a.node.arguments.arguments.first
|
31
29
|
b_name = b.node.arguments.arguments.first
|
32
|
-
|
30
|
+
|
33
31
|
if a_name.is_a?(Prism::SymbolNode) && !b_name.is_a?(Prism::SymbolNode)
|
34
32
|
-1
|
35
33
|
elsif b_name.is_a?(Prism::SymbolNode) && !a_name.is_a?(Prism::SymbolNode)
|
@@ -38,25 +36,25 @@ module RubyLsp
|
|
38
36
|
a_name.unescaped <=> b_name.unescaped
|
39
37
|
end
|
40
38
|
}
|
41
|
-
|
39
|
+
|
42
40
|
# check if no re-order
|
43
41
|
if parsed_doc.link_nodes.map{ _1.node.arguments.arguments.first.unescaped } == sorted_link_nodes.map{ _1.node.arguments.arguments.first.unescaped }
|
44
42
|
return source
|
45
43
|
end
|
46
|
-
|
44
|
+
|
47
45
|
# insert nodes to source
|
48
46
|
link_lines = parsed_doc.link_nodes.map{ _1.location.start_line }
|
49
|
-
|
47
|
+
|
50
48
|
source_lines = source.lines
|
51
|
-
|
49
|
+
|
52
50
|
sorted_lines = sorted_link_nodes.map do |sorted_link|
|
53
51
|
source_lines[sorted_link.location.start_line - 1]
|
54
52
|
end
|
55
|
-
|
53
|
+
|
56
54
|
link_lines.each_with_index do |link_line, index|
|
57
55
|
source_lines[link_line - 1] = sorted_lines[index]
|
58
56
|
end
|
59
|
-
|
57
|
+
|
60
58
|
source_lines.join()
|
61
59
|
end
|
62
60
|
end
|
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'prism'
|
2
|
-
require_relative "ree_lsp_utils"
|
2
|
+
require_relative "utils/ree_lsp_utils"
|
3
3
|
|
4
4
|
module RubyLsp
|
5
5
|
module Ree
|
6
6
|
class ReeIndexingEnhancement < RubyIndexer::Enhancement
|
7
7
|
include RubyLsp::Ree::ReeLspUtils
|
8
8
|
|
9
|
-
REE_INDEXED_OBJECTS = [:fn, :enum, :action, :dao]
|
9
|
+
REE_INDEXED_OBJECTS = [:fn, :enum, :action, :dao, :bean, :mapper, :aggregate]
|
10
10
|
|
11
11
|
def on_call_node_enter(node)
|
12
12
|
return unless @listener.current_owner
|
@@ -39,11 +39,11 @@ module RubyLsp
|
|
39
39
|
class_node = ast.statements.body.detect{ |node| node.is_a?(Prism::ClassNode) }
|
40
40
|
return [] unless class_node
|
41
41
|
|
42
|
-
call_node = class_node.body.body.detect{ |node| node.name == :call }
|
42
|
+
call_node = class_node.body.body.detect{ |node| node.respond_to?(:name) && node.name == :call }
|
43
43
|
return [] unless call_node
|
44
|
-
|
44
|
+
|
45
45
|
signature_params = signature_params_from_node(call_node.parameters)
|
46
|
-
|
46
|
+
|
47
47
|
[RubyIndexer::Entry::Signature.new(signature_params)]
|
48
48
|
end
|
49
49
|
|
@@ -1,33 +1,92 @@
|
|
1
1
|
module RubyLsp
|
2
2
|
module Ree
|
3
3
|
class ReeObjectFinder
|
4
|
-
MAX_LIMIT =
|
4
|
+
MAX_LIMIT = 1000
|
5
5
|
|
6
6
|
REE_OBJECT_STRING = 'ree_object'
|
7
7
|
ENUM_TYPE_STRING = 'type: :enum'
|
8
8
|
DAO_TYPE_STRING = 'type: :dao'
|
9
|
+
BEAN_TYPE_STRING = 'type: :bean'
|
10
|
+
MAPPER_TYPE_STRING = 'type: :mapper'
|
11
|
+
AGGREGATE_TYPE_STRING = 'type: :aggregate'
|
9
12
|
|
10
|
-
def
|
11
|
-
index
|
12
|
-
|
13
|
+
def initialize(index)
|
14
|
+
@index = index
|
15
|
+
end
|
16
|
+
|
17
|
+
def search_objects(name, limit)
|
18
|
+
@index.prefix_search(name)
|
19
|
+
.take(MAX_LIMIT)
|
20
|
+
.flatten
|
13
21
|
.select{ _1.comments }
|
14
22
|
.select{ _1.comments.to_s.lines.first&.chomp == REE_OBJECT_STRING }
|
23
|
+
.sort_by{ _1.name.length }
|
15
24
|
.take(limit)
|
16
25
|
end
|
17
26
|
|
18
|
-
def
|
19
|
-
|
27
|
+
def search_class_objects(name)
|
28
|
+
@index
|
29
|
+
.names
|
30
|
+
.select{ _1.split('::').last[0...name.size] == name}
|
31
|
+
end
|
32
|
+
|
33
|
+
def search_classes(name)
|
34
|
+
keys = search_class_objects(name)
|
35
|
+
@index.instance_variable_get(:@entries).values_at(*keys)
|
36
|
+
end
|
37
|
+
|
38
|
+
def find_object(name)
|
39
|
+
objects_by_name = @index[name]
|
40
|
+
return unless objects_by_name
|
41
|
+
|
42
|
+
objects_by_name.detect{ _1.comments.to_s.lines.first&.chomp == REE_OBJECT_STRING }
|
43
|
+
end
|
44
|
+
|
45
|
+
def find_objects_by_types(name, types)
|
46
|
+
objects_by_name = @index[name]
|
47
|
+
return [] unless objects_by_name
|
48
|
+
|
49
|
+
objects_by_name.select{ types.include?(object_type(_1)) }
|
50
|
+
end
|
51
|
+
|
52
|
+
def find_enum(name)
|
53
|
+
objects_by_name = @index[name]
|
20
54
|
return unless objects_by_name
|
21
55
|
|
22
56
|
objects_by_name.detect{ _1.comments.lines[1]&.chomp == ENUM_TYPE_STRING }
|
23
57
|
end
|
24
58
|
|
25
|
-
def
|
26
|
-
objects_by_name = index[name]
|
59
|
+
def find_dao(name)
|
60
|
+
objects_by_name = @index[name]
|
27
61
|
return unless objects_by_name
|
28
62
|
|
29
63
|
objects_by_name.detect{ _1.comments.lines[1]&.chomp == DAO_TYPE_STRING }
|
30
64
|
end
|
65
|
+
|
66
|
+
def find_bean(index, name)
|
67
|
+
objects_by_name = @index[name]
|
68
|
+
return unless objects_by_name
|
69
|
+
|
70
|
+
objects_by_name.detect{ _1.comments.lines[1]&.chomp == BEAN_TYPE_STRING }
|
71
|
+
end
|
72
|
+
|
73
|
+
def object_type(ree_object)
|
74
|
+
# TODO rewrite to use string split
|
75
|
+
case ree_object.comments.lines[1]&.chomp
|
76
|
+
when DAO_TYPE_STRING
|
77
|
+
:dao
|
78
|
+
when BEAN_TYPE_STRING
|
79
|
+
:bean
|
80
|
+
when ENUM_TYPE_STRING
|
81
|
+
:enum
|
82
|
+
when MAPPER_TYPE_STRING
|
83
|
+
:mapper
|
84
|
+
when AGGREGATE_TYPE_STRING
|
85
|
+
:aggregate
|
86
|
+
else
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
31
90
|
end
|
32
91
|
end
|
33
92
|
end
|
@@ -3,16 +3,27 @@ module RubyLsp
|
|
3
3
|
module ReeLspUtils
|
4
4
|
Entry = RubyIndexer::Entry
|
5
5
|
|
6
|
+
def find_local_file_path(file_path)
|
7
|
+
file_name = file_path + ".rb"
|
8
|
+
Dir[File.join('**', file_name)].first
|
9
|
+
end
|
10
|
+
|
6
11
|
def package_name_from_uri(uri)
|
7
12
|
uri_parts = uri.to_s.split('/')
|
8
|
-
|
9
|
-
uri_parts
|
13
|
+
|
14
|
+
package_folder_index = uri_parts.find_index('package')
|
15
|
+
return unless package_folder_index
|
16
|
+
|
17
|
+
uri_parts[package_folder_index + 1]
|
10
18
|
end
|
11
19
|
|
12
|
-
def
|
13
|
-
uri_parts = uri.chomp(File.extname(uri)).split('/')
|
14
|
-
|
15
|
-
uri_parts.
|
20
|
+
def path_from_package_folder(uri)
|
21
|
+
uri_parts = uri.to_s.chomp(File.extname(uri)).split('/')
|
22
|
+
|
23
|
+
package_folder_index = uri_parts.index('package')
|
24
|
+
return unless package_folder_index
|
25
|
+
|
26
|
+
uri_parts.drop(package_folder_index+1).join('/')
|
16
27
|
end
|
17
28
|
|
18
29
|
def get_ree_type(ree_object)
|
@@ -38,6 +49,8 @@ module RubyLsp
|
|
38
49
|
elsif parsed_doc.includes_link_dsl?
|
39
50
|
fn_line = parsed_doc.link_nodes.first.location.start_line - 1
|
40
51
|
position = parsed_doc.link_nodes.first.location.start_column
|
52
|
+
else
|
53
|
+
return nil
|
41
54
|
end
|
42
55
|
|
43
56
|
Interface::Range.new(
|
data/lib/ruby_lsp_ree/version.rb
CHANGED
data/ruby-lsp-ree.gemspec
CHANGED
@@ -4,7 +4,7 @@ require_relative "lib/ruby_lsp_ree/version"
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "ruby-lsp-ree"
|
7
|
-
spec.version =
|
7
|
+
spec.version = RubyLsp::Ree::VERSION
|
8
8
|
spec.authors = ["Ruslan Gatiyatov"]
|
9
9
|
spec.email = ["ruslan.gatiyatov@gmail.com"]
|
10
10
|
|
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.3
|
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-02-
|
11
|
+
date: 2025-02-21 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:
|
@@ -17,6 +17,7 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- ".ruby-version"
|
20
21
|
- CHANGELOG.md
|
21
22
|
- CODE_OF_CONDUCT.md
|
22
23
|
- Gemfile
|
@@ -25,16 +26,17 @@ files:
|
|
25
26
|
- README.md
|
26
27
|
- Rakefile
|
27
28
|
- lib/ruby_lsp/ruby_lsp_ree/addon.rb
|
28
|
-
- lib/ruby_lsp/ruby_lsp_ree/
|
29
|
-
- lib/ruby_lsp/ruby_lsp_ree/
|
30
|
-
- lib/ruby_lsp/ruby_lsp_ree/
|
29
|
+
- lib/ruby_lsp/ruby_lsp_ree/handlers/completion_handler.rb
|
30
|
+
- lib/ruby_lsp/ruby_lsp_ree/listeners/completion_listener.rb
|
31
|
+
- lib/ruby_lsp/ruby_lsp_ree/listeners/definition_listener.rb
|
32
|
+
- lib/ruby_lsp/ruby_lsp_ree/listeners/hover_listener.rb
|
31
33
|
- lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document.rb
|
32
34
|
- lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_document_builder.rb
|
33
35
|
- lib/ruby_lsp/ruby_lsp_ree/parsing/parsed_link_node.rb
|
34
36
|
- lib/ruby_lsp/ruby_lsp_ree/ree_formatter.rb
|
35
37
|
- lib/ruby_lsp/ruby_lsp_ree/ree_indexing_enhancement.rb
|
36
|
-
- lib/ruby_lsp/ruby_lsp_ree/ree_lsp_utils.rb
|
37
38
|
- lib/ruby_lsp/ruby_lsp_ree/ree_object_finder.rb
|
39
|
+
- lib/ruby_lsp/ruby_lsp_ree/utils/ree_lsp_utils.rb
|
38
40
|
- lib/ruby_lsp_ree.rb
|
39
41
|
- lib/ruby_lsp_ree/version.rb
|
40
42
|
- ruby-lsp-ree.gemspec
|
@@ -61,7 +63,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
61
63
|
- !ruby/object:Gem::Version
|
62
64
|
version: '0'
|
63
65
|
requirements: []
|
64
|
-
rubygems_version: 3.
|
66
|
+
rubygems_version: 3.5.3
|
65
67
|
signing_key:
|
66
68
|
specification_version: 4
|
67
69
|
summary: Ruby LSP addon for Ree framework.
|
@@ -1,90 +0,0 @@
|
|
1
|
-
require_relative "ree_lsp_utils"
|
2
|
-
require_relative "completion_utils"
|
3
|
-
require_relative "ree_object_finder"
|
4
|
-
|
5
|
-
module RubyLsp
|
6
|
-
module Ree
|
7
|
-
class Completion
|
8
|
-
include Requests::Support::Common
|
9
|
-
include RubyLsp::Ree::ReeLspUtils
|
10
|
-
include RubyLsp::Ree::CompletionUtils
|
11
|
-
|
12
|
-
CHARS_COUNT = 3
|
13
|
-
CANDIDATES_LIMIT = 20
|
14
|
-
|
15
|
-
def initialize(response_builder, node_context, index, dispatcher, uri)
|
16
|
-
@response_builder = response_builder
|
17
|
-
@index = index
|
18
|
-
@uri = uri
|
19
|
-
@node_context = node_context
|
20
|
-
|
21
|
-
dispatcher.register(self, :on_call_node_enter)
|
22
|
-
dispatcher.register(self, :on_constant_read_node_enter)
|
23
|
-
end
|
24
|
-
|
25
|
-
def on_constant_read_node_enter(node)
|
26
|
-
node_name = node.name.to_s
|
27
|
-
return if node_name.size < CHARS_COUNT
|
28
|
-
|
29
|
-
class_name_objects = @index.instance_variable_get(:@entries).keys.select{ _1.split('::').last[0...node_name.size] == node_name}
|
30
|
-
return if class_name_objects.size == 0
|
31
|
-
|
32
|
-
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(@uri)
|
33
|
-
|
34
|
-
completion_items = get_class_name_completion_items(class_name_objects, parsed_doc, node, @index, CANDIDATES_LIMIT)
|
35
|
-
puts_items_into_response(completion_items)
|
36
|
-
end
|
37
|
-
|
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
|
-
return if node.receiver
|
48
|
-
return if node.name.to_s.size < CHARS_COUNT
|
49
|
-
|
50
|
-
ree_objects = ReeObjectFinder.search_objects(@index, node.name.to_s, CANDIDATES_LIMIT)
|
51
|
-
return if ree_objects.size == 0
|
52
|
-
|
53
|
-
parsed_doc = RubyLsp::Ree::ParsedDocumentBuilder.build_from_uri(@uri)
|
54
|
-
|
55
|
-
completion_items = get_ree_objects_completions_items(ree_objects, parsed_doc, node)
|
56
|
-
puts_items_into_response(completion_items)
|
57
|
-
end
|
58
|
-
|
59
|
-
def receiver_is_enum?(node)
|
60
|
-
node.receiver && node.receiver.is_a?(Prism::CallNode) && ReeObjectFinder.find_enum(@index, node.receiver.name.to_s)
|
61
|
-
end
|
62
|
-
|
63
|
-
def receiver_is_dao?(node)
|
64
|
-
node.receiver && node.receiver.is_a?(Prism::CallNode) && ReeObjectFinder.find_dao(@index, node.receiver.name.to_s)
|
65
|
-
end
|
66
|
-
|
67
|
-
def enum_value_completion(node)
|
68
|
-
enum_obj = ReeObjectFinder.find_enum(@index, node.receiver.name.to_s)
|
69
|
-
location = node.receiver.location
|
70
|
-
|
71
|
-
completion_items = get_enum_values_completion_items(enum_obj, location)
|
72
|
-
puts_items_into_response(completion_items)
|
73
|
-
end
|
74
|
-
|
75
|
-
def dao_filter_completion(node)
|
76
|
-
dao_obj = ReeObjectFinder.find_dao(@index, node.receiver.name.to_s)
|
77
|
-
location = node.receiver.location
|
78
|
-
|
79
|
-
completion_items = get_dao_filters_completion_items(dao_obj, location)
|
80
|
-
puts_items_into_response(completion_items)
|
81
|
-
end
|
82
|
-
|
83
|
-
def puts_items_into_response(items)
|
84
|
-
items.each do |item|
|
85
|
-
@response_builder << item
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|