Skip to content

Commit e98e6cc

Browse files
authored
Use rails lsp native addons (#2)
1 parent ea02363 commit e98e6cc

10 files changed

+232
-168
lines changed

Gemfile

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,3 @@ gemspec
88
gem "rake", "~> 13.0"
99

1010
gem "rubocop", "~> 1.21"
11-
12-
gem "ruby-lsp-rails", git: "https://github.com/johansenja/ruby-lsp-rails.git", branch: "extend-runtime-server"

Gemfile.lock

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,10 @@
1-
GIT
2-
remote: https://github.com/johansenja/ruby-lsp-rails.git
3-
revision: 31533663d38992acdc6f4d3ba5d41b3e9c83fd58
4-
branch: extend-runtime-server
5-
specs:
6-
ruby-lsp-rails (0.3.13)
7-
ruby-lsp (>= 0.17.12, < 0.18.0)
8-
91
PATH
102
remote: .
113
specs:
12-
ruby-lsp-rails-factory-bot (0.1.0)
4+
ruby-lsp-rails-factory-bot (0.2.0)
135
factory_bot (~> 6.4.6)
14-
ruby-lsp (~> 0.17.17)
15-
ruby-lsp-rails
6+
ruby-lsp (~> 0.23)
7+
ruby-lsp-rails (~> 0.4)
168

179
GEM
1810
remote: https://rubygems.org/
@@ -46,11 +38,11 @@ GEM
4638
parser (3.3.4.0)
4739
ast (~> 2.4.1)
4840
racc
49-
prism (1.0.0)
41+
prism (1.3.0)
5042
racc (1.8.0)
5143
rainbow (3.1.1)
5244
rake (13.2.1)
53-
rbs (3.5.3)
45+
rbs (3.6.0)
5446
logger
5547
regexp_parser (2.9.2)
5648
rexml (3.3.2)
@@ -68,14 +60,16 @@ GEM
6860
unicode-display_width (>= 2.4.0, < 3.0)
6961
rubocop-ast (1.31.3)
7062
parser (>= 3.3.1.0)
71-
ruby-lsp (0.17.17)
63+
ruby-lsp (0.23.10)
7264
language_server-protocol (~> 3.17.0)
73-
prism (~> 1.0)
65+
prism (>= 1.2, < 2.0)
7466
rbs (>= 3, < 4)
7567
sorbet-runtime (>= 0.5.10782)
68+
ruby-lsp-rails (0.4.0)
69+
ruby-lsp (>= 0.23.0, < 0.24.0)
7670
ruby-progressbar (1.13.0)
7771
securerandom (0.3.1)
78-
sorbet-runtime (0.5.11554)
72+
sorbet-runtime (0.5.11589)
7973
strscan (3.1.0)
8074
tzinfo (2.0.6)
8175
concurrent-ruby (~> 1.0)
@@ -88,7 +82,6 @@ PLATFORMS
8882
DEPENDENCIES
8983
rake (~> 13.0)
9084
rubocop (~> 1.21)
91-
ruby-lsp-rails!
9285
ruby-lsp-rails-factory-bot!
9386

9487
BUNDLED WITH

lib/ruby_lsp/rails/factory_bot/addon.rb

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,59 @@
11
# frozen_string_literal: true
22

33
require "ruby_lsp/addon"
4-
require "ruby_lsp_rails/runner_client"
4+
require "ruby_lsp/ruby_lsp_rails/runner_client"
55

66
require_relative "completion"
77
require_relative "hover"
8-
require_relative "server_extension"
8+
require_relative "addon_name"
99

1010
module RubyLsp
1111
module Rails
1212
module FactoryBot
1313
class Addon < ::RubyLsp::Addon
1414
def activate(global_state, *)
15+
runner_client.register_server_addon(File.expand_path("server_addon.rb", __dir__))
16+
1517
@ruby_index = global_state.index
1618
end
1719

1820
def deactivate(*); end
1921

2022
def name
21-
"ruby-lsp-rails-factory-bot"
23+
FactoryBot::ADDON_NAME
2224
end
2325

2426
def create_completion_listener(response_builder, node_context, dispatcher, uri)
2527
path = uri.to_standardized_path
2628
return unless path&.end_with?("_test.rb") || path&.end_with?("_spec.rb")
2729
return unless factory_bot_call_args?(node_context)
2830

29-
Completion.new(response_builder, node_context, dispatcher, RubyLsp::Rails::RunnerClient.instance)
31+
Completion.new(response_builder, node_context, dispatcher, runner_client)
3032
end
3133

3234
def create_hover_listener(response_builder, node_context, dispatcher)
3335
# TODO: need URI param
34-
Hover.new(response_builder, node_context, dispatcher, RubyLsp::Rails::RunnerClient.instance, @ruby_index)
36+
Hover.new(response_builder, node_context, dispatcher, runner_client, @ruby_index)
3537
end
3638

3739
def workspace_did_change_watched_files(changes)
3840
return unless changes.any? do |change|
3941
change[:uri].match?(/(?:spec|test).+factor.+\.rb/)
4042
end
4143

42-
RubyLsp::Rails::RunnerClient.instance.trigger_reload
44+
runner_client.trigger_reload
4345
end
4446

4547
private
4648

49+
def runner_client
50+
@rails_addon ||= ::RubyLsp::Addon.get(
51+
"Ruby LSP Rails",
52+
::RubyLsp::Rails::FactoryBot::REQUIRED_RUBY_LSP_RAILS_VERSION
53+
)
54+
@rails_addon.rails_runner_client
55+
end
56+
4757
FACTORY_BOT_METHODS = %i[
4858
create
4959
build
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module RubyLsp
2+
module Rails
3+
module FactoryBot
4+
ADDON_NAME = "ruby-lsp-rails-factory-bot".freeze
5+
end
6+
end
7+
end

lib/ruby_lsp/rails/factory_bot/completion.rb

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
require "ruby_lsp/internal"
44

5+
require_relative "addon_name"
6+
57
module RubyLsp
68
module Rails
79
module FactoryBot
@@ -57,8 +59,10 @@ def on_call_node_enter(node)
5759
private
5860

5961
def handle_attribute(factory_name, node, value = "")
60-
@server_client.get_attributes(factory_name: factory_name, name: value)&.each do |attr|
61-
$stderr.write "attribute", attr
62+
make_request(
63+
:attributes,
64+
factory_name: factory_name, name: value
65+
)&.each do |attr|
6266
label_details = Interface::CompletionItemLabelDetails.new(
6367
description: attr[:type],
6468
)
@@ -79,8 +83,10 @@ def handle_attribute(factory_name, node, value = "")
7983
end
8084

8185
def handle_trait(factory_name, node, value = "")
82-
@server_client.get_traits(factory_name: factory_name, name: value)&.each do |tr|
83-
$stderr.write "trait", tr
86+
make_request(
87+
:traits,
88+
factory_name: factory_name, name: value
89+
)&.each do |tr|
8490
label_details = Interface::CompletionItemLabelDetails.new(
8591
description: tr[:owner],
8692
)
@@ -103,8 +109,7 @@ def handle_trait(factory_name, node, value = "")
103109
end
104110

105111
def handle_factory(node, name)
106-
@server_client.get_factories(name: name)&.each do |fact|
107-
$stderr.write "factory", fact
112+
make_request(:factories, name: name)&.each do |fact|
108113
@response_builder << Interface::CompletionItem.new(
109114
label: fact[:name],
110115
filter_text: fact[:name],
@@ -122,6 +127,14 @@ def handle_factory(node, name)
122127
)
123128
end
124129
end
130+
131+
def make_request(request_name, **params)
132+
@server_client.delegate_request(
133+
server_addon_name: FactoryBot::ADDON_NAME,
134+
request_name: request_name,
135+
**params
136+
)
137+
end
125138
end
126139
end
127140
end

lib/ruby_lsp/rails/factory_bot/hover.rb

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
require "ruby_lsp/internal"
44

5+
require_relative "addon_name"
6+
57
module RubyLsp
68
module Rails
79
module FactoryBot
@@ -61,7 +63,8 @@ def on_symbol_node_enter(symbol_node)
6163

6264
def handle_attribute(symbol_node, factory_node)
6365
name = symbol_node.value.to_s
64-
attribute = @server_client.get_attributes(
66+
attribute = make_request(
67+
:attributes,
6568
factory_name: factory_node.value.to_s, name: name
6669
)&.find { |attr| attr[:name] == name }
6770

@@ -76,7 +79,10 @@ def handle_attribute(symbol_node, factory_node)
7679
def handle_factory(symbol_node)
7780
name = symbol_node.value.to_s
7881

79-
factory = @server_client.get_factories(name: name)&.find { |f| f[:name] == name }
82+
factory = make_request(
83+
:factories,
84+
name: name
85+
)&.find { |f| f[:name] == name }
8086

8187
return unless factory
8288

@@ -102,7 +108,8 @@ def handle_trait(symbol_node, factory_node)
102108
factory_name = factory_node.value.to_s
103109
trait_name = symbol_node.value.to_s
104110

105-
trait = @server_client.get_traits(
111+
trait = make_request(
112+
:traits,
106113
factory_name: factory_name, name: trait_name
107114
)&.find { |tr| tr[:name] == trait_name }
108115

@@ -113,6 +120,14 @@ def handle_trait(symbol_node, factory_node)
113120
category: :documentation
114121
)
115122
end
123+
124+
def make_request(request_name, **params)
125+
@server_client.delegate_request(
126+
server_addon_name: FactoryBot::ADDON_NAME,
127+
request_name: request_name,
128+
**params
129+
)
130+
end
116131
end
117132
end
118133
end

0 commit comments

Comments
 (0)