diff --git a/lib/ruby_lsp/ruby_lsp_rails/addon.rb b/lib/ruby_lsp/ruby_lsp_rails/addon.rb index e10e9e91..10352c35 100644 --- a/lib/ruby_lsp/ruby_lsp_rails/addon.rb +++ b/lib/ruby_lsp/ruby_lsp_rails/addon.rb @@ -223,12 +223,7 @@ def register_additional_file_watchers(global_state:, outgoing_queue:) id: "workspace/didChangeWatchedFilesRails", method: "workspace/didChangeWatchedFiles", register_options: Interface::DidChangeWatchedFilesRegistrationOptions.new( - watchers: [ - Interface::FileSystemWatcher.new( - glob_pattern: "**/*structure.sql", - kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE, - ), - ], + watchers: [structure_sql_file_watcher, fixture_file_watcher].compact, ), ), ], @@ -236,6 +231,25 @@ def register_additional_file_watchers(global_state:, outgoing_queue:) ) end + sig { returns(Interface::FileSystemWatcher) } + def structure_sql_file_watcher + Interface::FileSystemWatcher.new( + glob_pattern: "**/*structure.sql", + kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE, + ) + end + + sig { returns(T.nilable(Interface::FileSystemWatcher)) } + def fixture_file_watcher + paths = @rails_runner_client.fixture_paths + return unless paths + + Interface::FileSystemWatcher.new( + glob_pattern: "{#{paths.join(",")}}/**/*.{yml,yaml,yml.erb,yaml.erb}", + kind: Constant::WatchKind::CREATE | Constant::WatchKind::CHANGE | Constant::WatchKind::DELETE, + ) + end + sig { void } def offer_to_run_pending_migrations return unless @outgoing_queue diff --git a/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb b/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb index 53791fab..9980c845 100644 --- a/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb +++ b/lib/ruby_lsp/ruby_lsp_rails/runner_client.rb @@ -51,6 +51,9 @@ class EmptyMessageError < MessageError; end sig { returns(String) } attr_reader :rails_root + sig { returns(T.nilable(T::Array[String])) } + attr_reader :fixture_paths + sig { params(outgoing_queue: Thread::Queue).void } def initialize(outgoing_queue) @outgoing_queue = T.let(outgoing_queue, Thread::Queue) @@ -89,6 +92,7 @@ def initialize(outgoing_queue) initialize_response = T.must(read_response) @rails_root = T.let(initialize_response[:root], String) + @fixture_paths = T.let(initialize_response[:fixture_paths], T.nilable(T::Array[String])) log_message("Finished booting Ruby LSP Rails server") unless ENV["RAILS_ENV"] == "test" diff --git a/lib/ruby_lsp/ruby_lsp_rails/server.rb b/lib/ruby_lsp/ruby_lsp_rails/server.rb index a205e0c3..9e9502b3 100644 --- a/lib/ruby_lsp/ruby_lsp_rails/server.rb +++ b/lib/ruby_lsp/ruby_lsp_rails/server.rb @@ -3,6 +3,7 @@ require "json" require "open3" +require "rails/test_help" # to determine the fixture_paths module RubyLsp module Rails @@ -123,7 +124,11 @@ def initialize(stdout: $stdout, override_default_output_device: true) def start load_routes clear_file_system_resolver_hooks - send_result({ message: "ok", root: ::Rails.root.to_s }) + send_result({ + message: "ok", + root: ::Rails.root.to_s, + fixture_paths: ActiveSupport::TestCase.fixture_paths, + }) while @running headers = @stdin.gets("\r\n\r\n")