ruby-lsp-rails 0.2.6 → 0.2.8
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/lib/ruby_lsp/ruby_lsp_rails/addon.rb +8 -10
- data/lib/ruby_lsp/ruby_lsp_rails/code_lens.rb +34 -22
- data/lib/ruby_lsp/ruby_lsp_rails/hover.rb +52 -21
- data/lib/ruby_lsp_rails/version.rb +1 -1
- metadata +36 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c3d8b40085e6c7ca1e23283423a0966da489180e36e4fb50415f41b1a37f5294
|
4
|
+
data.tar.gz: e98455cb80f6c386e9aa1c3fa516a29cbf0027826aed8c5af029cc1de61aaa05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff23cfda2194b449136438eee3475801c4568d7efa9dea08c9c60bd11f732af31c10a30b95014c7d366fbf5ad86dd7471dd3419ef4ef2808f031307d1ffc841e
|
7
|
+
data.tar.gz: 4a776b1c73b4c2683ba6db906afc3dccd2221f0dd4943a56d1a7fd1f0b4c43f92a789231d82e85aec2ba664fd505013c3c3a594a7b57d6931b35bfd433998ca0
|
@@ -17,8 +17,8 @@ module RubyLsp
|
|
17
17
|
@client ||= T.let(RailsClient.new, T.nilable(RailsClient))
|
18
18
|
end
|
19
19
|
|
20
|
-
sig { override.void }
|
21
|
-
def activate
|
20
|
+
sig { override.params(message_queue: Thread::Queue).void }
|
21
|
+
def activate(message_queue)
|
22
22
|
client.check_if_server_is_running!
|
23
23
|
end
|
24
24
|
|
@@ -29,24 +29,22 @@ module RubyLsp
|
|
29
29
|
sig do
|
30
30
|
override.params(
|
31
31
|
uri: URI::Generic,
|
32
|
-
|
33
|
-
message_queue: Thread::Queue,
|
32
|
+
dispatcher: Prism::Dispatcher,
|
34
33
|
).returns(T.nilable(Listener[T::Array[Interface::CodeLens]]))
|
35
34
|
end
|
36
|
-
def create_code_lens_listener(uri,
|
37
|
-
CodeLens.new(uri,
|
35
|
+
def create_code_lens_listener(uri, dispatcher)
|
36
|
+
CodeLens.new(uri, dispatcher)
|
38
37
|
end
|
39
38
|
|
40
39
|
sig do
|
41
40
|
override.params(
|
42
41
|
nesting: T::Array[String],
|
43
42
|
index: RubyIndexer::Index,
|
44
|
-
|
45
|
-
message_queue: Thread::Queue,
|
43
|
+
dispatcher: Prism::Dispatcher,
|
46
44
|
).returns(T.nilable(Listener[T.nilable(Interface::Hover)]))
|
47
45
|
end
|
48
|
-
def create_hover_listener(nesting, index,
|
49
|
-
Hover.new(client,
|
46
|
+
def create_hover_listener(nesting, index, dispatcher)
|
47
|
+
Hover.new(client, nesting, index, dispatcher)
|
50
48
|
end
|
51
49
|
|
52
50
|
sig { override.returns(String) }
|
@@ -42,17 +42,20 @@ module RubyLsp
|
|
42
42
|
sig { override.returns(ResponseType) }
|
43
43
|
attr_reader :_response
|
44
44
|
|
45
|
-
sig { params(uri: URI::Generic,
|
46
|
-
def initialize(uri,
|
45
|
+
sig { params(uri: URI::Generic, dispatcher: Prism::Dispatcher).void }
|
46
|
+
def initialize(uri, dispatcher)
|
47
47
|
@_response = T.let([], ResponseType)
|
48
48
|
@path = T.let(uri.to_standardized_path, T.nilable(String))
|
49
|
-
|
49
|
+
@group_id = T.let(1, Integer)
|
50
|
+
@group_id_stack = T.let([], T::Array[Integer])
|
50
51
|
|
51
|
-
|
52
|
+
dispatcher.register(self, :on_call_node_enter, :on_class_node_enter, :on_def_node_enter, :on_class_node_leave)
|
53
|
+
|
54
|
+
super(dispatcher)
|
52
55
|
end
|
53
56
|
|
54
|
-
sig { params(node:
|
55
|
-
def
|
57
|
+
sig { params(node: Prism::CallNode).void }
|
58
|
+
def on_call_node_enter(node)
|
56
59
|
message_value = node.message
|
57
60
|
return unless message_value == "test"
|
58
61
|
|
@@ -62,15 +65,13 @@ module RubyLsp
|
|
62
65
|
first_argument = arguments.first
|
63
66
|
|
64
67
|
content = case first_argument
|
65
|
-
when
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
right.is_a?(YARP::StringNode)
|
71
|
-
left.content + right.content
|
68
|
+
when Prism::InterpolatedStringNode
|
69
|
+
parts = first_argument.parts
|
70
|
+
|
71
|
+
if parts.all? { |part| part.is_a?(Prism::StringNode) }
|
72
|
+
T.cast(parts, T::Array[Prism::StringNode]).map(&:content).join
|
72
73
|
end
|
73
|
-
when
|
74
|
+
when Prism::StringNode
|
74
75
|
first_argument.content
|
75
76
|
end
|
76
77
|
|
@@ -82,8 +83,8 @@ module RubyLsp
|
|
82
83
|
end
|
83
84
|
|
84
85
|
# Although uncommon, Rails tests can be written with the classic "def test_name" syntax.
|
85
|
-
sig { params(node:
|
86
|
-
def
|
86
|
+
sig { params(node: Prism::DefNode).void }
|
87
|
+
def on_def_node_enter(node)
|
87
88
|
method_name = node.name.to_s
|
88
89
|
if method_name.start_with?("test_")
|
89
90
|
line_number = node.location.start_line
|
@@ -92,18 +93,26 @@ module RubyLsp
|
|
92
93
|
end
|
93
94
|
end
|
94
95
|
|
95
|
-
sig { params(node:
|
96
|
-
def
|
96
|
+
sig { params(node: Prism::ClassNode).void }
|
97
|
+
def on_class_node_enter(node)
|
97
98
|
class_name = node.constant_path.slice
|
98
99
|
if class_name.end_with?("Test")
|
99
100
|
command = "#{BASE_COMMAND} #{@path}"
|
100
101
|
add_test_code_lens(node, name: class_name, command: command, kind: :group)
|
101
102
|
end
|
103
|
+
|
104
|
+
@group_id_stack.push(@group_id)
|
105
|
+
@group_id += 1
|
106
|
+
end
|
107
|
+
|
108
|
+
sig { params(node: Prism::ClassNode).void }
|
109
|
+
def on_class_node_leave(node)
|
110
|
+
@group_id_stack.pop
|
102
111
|
end
|
103
112
|
|
104
113
|
private
|
105
114
|
|
106
|
-
sig { params(node:
|
115
|
+
sig { params(node: Prism::Node, name: String, command: String, kind: Symbol).void }
|
107
116
|
def add_test_code_lens(node, name:, command:, kind:)
|
108
117
|
return unless @path
|
109
118
|
|
@@ -119,12 +128,15 @@ module RubyLsp
|
|
119
128
|
},
|
120
129
|
]
|
121
130
|
|
131
|
+
grouping_data = { group_id: @group_id_stack.last, kind: kind }
|
132
|
+
grouping_data[:id] = @group_id if kind == :group
|
133
|
+
|
122
134
|
@_response << create_code_lens(
|
123
135
|
node,
|
124
136
|
title: "Run",
|
125
137
|
command_name: "rubyLsp.runTest",
|
126
138
|
arguments: arguments,
|
127
|
-
data: { type: "test",
|
139
|
+
data: { type: "test", **grouping_data },
|
128
140
|
)
|
129
141
|
|
130
142
|
@_response << create_code_lens(
|
@@ -132,7 +144,7 @@ module RubyLsp
|
|
132
144
|
title: "Run In Terminal",
|
133
145
|
command_name: "rubyLsp.runTestInTerminal",
|
134
146
|
arguments: arguments,
|
135
|
-
data: { type: "test_in_terminal",
|
147
|
+
data: { type: "test_in_terminal", **grouping_data },
|
136
148
|
)
|
137
149
|
|
138
150
|
@_response << create_code_lens(
|
@@ -140,7 +152,7 @@ module RubyLsp
|
|
140
152
|
title: "Debug",
|
141
153
|
command_name: "rubyLsp.debugTest",
|
142
154
|
arguments: arguments,
|
143
|
-
data: { type: "debug",
|
155
|
+
data: { type: "debug", **grouping_data },
|
144
156
|
)
|
145
157
|
end
|
146
158
|
end
|
@@ -25,37 +25,56 @@ module RubyLsp
|
|
25
25
|
sig { override.returns(ResponseType) }
|
26
26
|
attr_reader :_response
|
27
27
|
|
28
|
-
sig
|
29
|
-
|
30
|
-
|
28
|
+
sig do
|
29
|
+
params(
|
30
|
+
client: RailsClient,
|
31
|
+
nesting: T::Array[String],
|
32
|
+
index: RubyIndexer::Index,
|
33
|
+
dispatcher: Prism::Dispatcher,
|
34
|
+
).void
|
35
|
+
end
|
36
|
+
def initialize(client, nesting, index, dispatcher)
|
37
|
+
super(dispatcher)
|
31
38
|
|
32
39
|
@_response = T.let(nil, ResponseType)
|
33
40
|
@client = client
|
34
|
-
|
41
|
+
@nesting = nesting
|
42
|
+
@index = index
|
43
|
+
dispatcher.register(self, :on_constant_path_node_enter, :on_constant_read_node_enter, :on_call_node_enter)
|
35
44
|
end
|
36
45
|
|
37
|
-
sig { params(node:
|
38
|
-
def
|
39
|
-
|
46
|
+
sig { params(node: Prism::ConstantPathNode).void }
|
47
|
+
def on_constant_path_node_enter(node)
|
48
|
+
entries = @index.resolve(node.slice, @nesting)
|
49
|
+
return unless entries
|
50
|
+
|
51
|
+
name = T.must(entries.first).name
|
52
|
+
content = +""
|
53
|
+
column_info = generate_column_content(name)
|
54
|
+
content << column_info if column_info
|
55
|
+
|
56
|
+
urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
|
57
|
+
content << urls.join("\n\n") unless urls.empty?
|
58
|
+
return if content.empty?
|
59
|
+
|
60
|
+
contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
|
61
|
+
@_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
|
40
62
|
end
|
41
63
|
|
42
|
-
sig { params(node:
|
43
|
-
def
|
44
|
-
|
45
|
-
return
|
64
|
+
sig { params(node: Prism::ConstantReadNode).void }
|
65
|
+
def on_constant_read_node_enter(node)
|
66
|
+
entries = @index.resolve(node.name.to_s, @nesting)
|
67
|
+
return unless entries
|
68
|
+
|
69
|
+
content = generate_column_content(T.must(entries.first).name)
|
70
|
+
return unless content
|
46
71
|
|
47
|
-
schema_file = model[:schema_file]
|
48
|
-
content = +""
|
49
|
-
if schema_file
|
50
|
-
content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n"
|
51
|
-
end
|
52
|
-
content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
|
53
72
|
contents = RubyLsp::Interface::MarkupContent.new(kind: "markdown", value: content)
|
54
|
-
@_response = RubyLsp::Interface::Hover.new(range:
|
73
|
+
@_response = RubyLsp::Interface::Hover.new(range: range_from_location(node.location), contents: contents)
|
55
74
|
end
|
56
75
|
|
57
|
-
sig { params(node:
|
58
|
-
def
|
76
|
+
sig { params(node: Prism::CallNode).void }
|
77
|
+
def on_call_node_enter(node)
|
59
78
|
message_value = node.message
|
60
79
|
message_loc = node.message_loc
|
61
80
|
|
@@ -66,7 +85,19 @@ module RubyLsp
|
|
66
85
|
|
67
86
|
private
|
68
87
|
|
69
|
-
sig { params(name: String
|
88
|
+
sig { params(name: String).returns(T.nilable(String)) }
|
89
|
+
def generate_column_content(name)
|
90
|
+
model = @client.model(name)
|
91
|
+
return if model.nil?
|
92
|
+
|
93
|
+
schema_file = model[:schema_file]
|
94
|
+
content = +""
|
95
|
+
content << "[Schema](#{URI::Generic.build(scheme: "file", path: schema_file)})\n\n" if schema_file
|
96
|
+
content << model[:columns].map { |name, type| "**#{name}**: #{type}\n" }.join("\n")
|
97
|
+
content
|
98
|
+
end
|
99
|
+
|
100
|
+
sig { params(name: String, location: Prism::Location).returns(T.nilable(Interface::Hover)) }
|
70
101
|
def generate_rails_document_link_hover(name, location)
|
71
102
|
urls = Support::RailsDocumentClient.generate_rails_document_urls(name)
|
72
103
|
return if urls.empty?
|
metadata
CHANGED
@@ -1,17 +1,45 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.8
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-12-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: actionpack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '6.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: activerecord
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '6.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '6.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: railties
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
16
44
|
requirements:
|
17
45
|
- - ">="
|
@@ -30,20 +58,20 @@ dependencies:
|
|
30
58
|
requirements:
|
31
59
|
- - ">="
|
32
60
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
61
|
+
version: 0.13.0
|
34
62
|
- - "<"
|
35
63
|
- !ruby/object:Gem::Version
|
36
|
-
version: 0.
|
64
|
+
version: 0.14.0
|
37
65
|
type: :runtime
|
38
66
|
prerelease: false
|
39
67
|
version_requirements: !ruby/object:Gem::Requirement
|
40
68
|
requirements:
|
41
69
|
- - ">="
|
42
70
|
- !ruby/object:Gem::Version
|
43
|
-
version: 0.
|
71
|
+
version: 0.13.0
|
44
72
|
- - "<"
|
45
73
|
- !ruby/object:Gem::Version
|
46
|
-
version: 0.
|
74
|
+
version: 0.14.0
|
47
75
|
- !ruby/object:Gem::Dependency
|
48
76
|
name: sorbet-runtime
|
49
77
|
requirement: !ruby/object:Gem::Requirement
|
@@ -101,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
101
129
|
- !ruby/object:Gem::Version
|
102
130
|
version: '0'
|
103
131
|
requirements: []
|
104
|
-
rubygems_version: 3.4.
|
132
|
+
rubygems_version: 3.4.21
|
105
133
|
signing_key:
|
106
134
|
specification_version: 4
|
107
135
|
summary: A Ruby LSP addon for Rails
|