ruby-lsp-rails 0.3.9 → 0.3.11
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e684ecacd45b09fee18e386a95d0dfa61bd3cce2c64869bf34f711d9d0c2fa3
|
4
|
+
data.tar.gz: c575d062c88f997967989f1cca84a1241fb6d07750a0535e122112b890e9dd0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17c1805f2e1d7363e2734d6983fdba8b11b72e083ff07b0d872745121f9b4c1d20898e439a19c7dc9f179f8729260cf2f90e701e47967d4901576166fe66c420
|
7
|
+
data.tar.gz: '039f940ff0ea3247316609b379396a7096ada44ed0b4127969223c3277d946bbbd913e106ede27912fc29c53a0e349999231e1561940e5d75ff6adbf0cea1a89'
|
@@ -51,9 +51,7 @@ module RubyLsp
|
|
51
51
|
).void
|
52
52
|
end
|
53
53
|
def create_code_lens_listener(response_builder, uri, dispatcher)
|
54
|
-
|
55
|
-
|
56
|
-
CodeLens.new(@client, response_builder, uri, dispatcher)
|
54
|
+
CodeLens.new(@client, T.must(@global_state), response_builder, uri, dispatcher)
|
57
55
|
end
|
58
56
|
|
59
57
|
sig do
|
@@ -79,20 +79,30 @@ module RubyLsp
|
|
79
79
|
sig do
|
80
80
|
params(
|
81
81
|
client: RunnerClient,
|
82
|
+
global_state: GlobalState,
|
82
83
|
response_builder: ResponseBuilders::CollectionResponseBuilder[Interface::CodeLens],
|
83
84
|
uri: URI::Generic,
|
84
85
|
dispatcher: Prism::Dispatcher,
|
85
86
|
).void
|
86
87
|
end
|
87
|
-
def initialize(client, response_builder, uri, dispatcher)
|
88
|
+
def initialize(client, global_state, response_builder, uri, dispatcher)
|
88
89
|
@client = client
|
90
|
+
@global_state = global_state
|
89
91
|
@response_builder = response_builder
|
90
92
|
@path = T.let(uri.to_standardized_path, T.nilable(String))
|
91
93
|
@group_id = T.let(1, Integer)
|
92
94
|
@group_id_stack = T.let([], T::Array[Integer])
|
93
95
|
@constant_name_stack = T.let([], T::Array[[String, T.nilable(String)]])
|
94
96
|
|
95
|
-
dispatcher.register(
|
97
|
+
dispatcher.register(
|
98
|
+
self,
|
99
|
+
:on_call_node_enter,
|
100
|
+
:on_class_node_enter,
|
101
|
+
:on_def_node_enter,
|
102
|
+
:on_class_node_leave,
|
103
|
+
:on_module_node_enter,
|
104
|
+
:on_module_node_leave,
|
105
|
+
)
|
96
106
|
end
|
97
107
|
|
98
108
|
sig { params(node: Prism::CallNode).void }
|
@@ -119,6 +129,7 @@ module RubyLsp
|
|
119
129
|
|
120
130
|
if controller?
|
121
131
|
add_route_code_lens_to_action(node)
|
132
|
+
add_jump_to_view(node)
|
122
133
|
end
|
123
134
|
end
|
124
135
|
|
@@ -156,43 +167,63 @@ module RubyLsp
|
|
156
167
|
@constant_name_stack.pop
|
157
168
|
end
|
158
169
|
|
170
|
+
sig { params(node: Prism::ModuleNode).void }
|
171
|
+
def on_module_node_enter(node)
|
172
|
+
@constant_name_stack << [node.constant_path.slice, nil]
|
173
|
+
end
|
174
|
+
|
175
|
+
sig { params(node: Prism::ModuleNode).void }
|
176
|
+
def on_module_node_leave(node)
|
177
|
+
@constant_name_stack.pop
|
178
|
+
end
|
179
|
+
|
159
180
|
private
|
160
181
|
|
161
182
|
sig { returns(T.nilable(T::Boolean)) }
|
162
183
|
def controller?
|
163
|
-
class_name, superclass_name =
|
164
|
-
class_name
|
184
|
+
class_name, superclass_name = @constant_name_stack.last
|
185
|
+
return false unless class_name && superclass_name
|
186
|
+
|
187
|
+
class_name.end_with?("Controller") && superclass_name.end_with?("Controller")
|
165
188
|
end
|
166
189
|
|
167
190
|
sig { params(node: Prism::DefNode).void }
|
168
|
-
def
|
169
|
-
class_name
|
170
|
-
|
171
|
-
|
172
|
-
|
191
|
+
def add_jump_to_view(node)
|
192
|
+
class_name = @constant_name_stack.map(&:first).join("::")
|
193
|
+
action_name = node.name
|
194
|
+
controller_name = class_name
|
195
|
+
.delete_suffix("Controller")
|
196
|
+
.gsub(/([a-z])([A-Z])/, "\\1_\\2")
|
197
|
+
.gsub("::", "/")
|
198
|
+
.downcase
|
199
|
+
|
200
|
+
view_uris = Dir.glob("#{@client.rails_root}/app/views/#{controller_name}/#{action_name}*").map! do |path|
|
201
|
+
URI::Generic.from_path(path: path).to_s
|
202
|
+
end
|
203
|
+
return if view_uris.empty?
|
204
|
+
|
205
|
+
@response_builder << create_code_lens(
|
206
|
+
node,
|
207
|
+
title: "Jump to view",
|
208
|
+
command_name: "rubyLsp.openFile",
|
209
|
+
arguments: [view_uris],
|
210
|
+
data: { type: "file" },
|
173
211
|
)
|
212
|
+
end
|
174
213
|
|
214
|
+
sig { params(node: Prism::DefNode).void }
|
215
|
+
def add_route_code_lens_to_action(node)
|
216
|
+
class_name, _ = T.must(@constant_name_stack.last)
|
217
|
+
route = @client.route(controller: class_name, action: node.name.to_s)
|
175
218
|
return unless route
|
176
219
|
|
177
|
-
|
178
|
-
verb = route[:verb]
|
179
|
-
source_location = route[:source_location]
|
180
|
-
|
181
|
-
arguments = [
|
182
|
-
source_location,
|
183
|
-
{
|
184
|
-
start_line: node.location.start_line - 1,
|
185
|
-
start_column: node.location.start_column,
|
186
|
-
end_line: node.location.end_line - 1,
|
187
|
-
end_column: node.location.end_column,
|
188
|
-
},
|
189
|
-
]
|
220
|
+
file_path, line = route[:source_location]
|
190
221
|
|
191
222
|
@response_builder << create_code_lens(
|
192
223
|
node,
|
193
|
-
title: [verb
|
224
|
+
title: "#{route[:verb]} #{route[:path]}",
|
194
225
|
command_name: "rubyLsp.openFile",
|
195
|
-
arguments:
|
226
|
+
arguments: [["file://#{file_path}#L#{line}"]],
|
196
227
|
data: { type: "file" },
|
197
228
|
)
|
198
229
|
end
|
@@ -228,6 +259,7 @@ module RubyLsp
|
|
228
259
|
sig { params(node: Prism::Node, name: String, command: String, kind: Symbol).void }
|
229
260
|
def add_test_code_lens(node, name:, command:, kind:)
|
230
261
|
return unless @path
|
262
|
+
return unless @global_state.test_library == "rails"
|
231
263
|
|
232
264
|
arguments = [
|
233
265
|
@path,
|
@@ -36,6 +36,9 @@ module RubyLsp
|
|
36
36
|
|
37
37
|
extend T::Sig
|
38
38
|
|
39
|
+
sig { returns(String) }
|
40
|
+
attr_reader :rails_root
|
41
|
+
|
39
42
|
sig { void }
|
40
43
|
def initialize
|
41
44
|
# Spring needs a Process session ID. It uses this ID to "attach" itself to the parent process, so that when the
|
@@ -67,7 +70,8 @@ module RubyLsp
|
|
67
70
|
|
68
71
|
begin
|
69
72
|
count += 1
|
70
|
-
read_response
|
73
|
+
initialize_response = T.must(read_response)
|
74
|
+
@rails_root = T.let(initialize_response[:root], String)
|
71
75
|
rescue EmptyMessageError
|
72
76
|
$stderr.puts("Ruby LSP Rails is retrying initialize (#{count})")
|
73
77
|
retry if count < MAX_RETRIES
|
@@ -218,6 +222,11 @@ module RubyLsp
|
|
218
222
|
true
|
219
223
|
end
|
220
224
|
|
225
|
+
sig { override.returns(String) }
|
226
|
+
def rails_root
|
227
|
+
Dir.pwd
|
228
|
+
end
|
229
|
+
|
221
230
|
private
|
222
231
|
|
223
232
|
sig { override.params(request: String, params: T.nilable(T::Hash[Symbol, T.untyped])).void }
|
@@ -24,7 +24,7 @@ module RubyLsp
|
|
24
24
|
routes_reloader = ::Rails.application.routes_reloader
|
25
25
|
routes_reloader.execute_unless_loaded if routes_reloader&.respond_to?(:execute_unless_loaded)
|
26
26
|
|
27
|
-
initialize_result = { result: { message: "ok" } }.to_json
|
27
|
+
initialize_result = { result: { message: "ok", root: ::Rails.root.to_s } }.to_json
|
28
28
|
$stdout.write("Content-Length: #{initialize_result.length}\r\n\r\n#{initialize_result}")
|
29
29
|
|
30
30
|
while @running
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-lsp-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-07-
|
11
|
+
date: 2024-07-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ruby-lsp
|
@@ -79,7 +79,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
79
|
- !ruby/object:Gem::Version
|
80
80
|
version: '0'
|
81
81
|
requirements: []
|
82
|
-
rubygems_version: 3.5.
|
82
|
+
rubygems_version: 3.5.15
|
83
83
|
signing_key:
|
84
84
|
specification_version: 4
|
85
85
|
summary: A Ruby LSP addon for Rails
|