diff --git a/lib/ruby_lsp/server.rb b/lib/ruby_lsp/server.rb index 170c755da..6a1956d2c 100644 --- a/lib/ruby_lsp/server.rb +++ b/lib/ruby_lsp/server.rb @@ -120,6 +120,16 @@ def process_message(message) @global_state.synchronize { @cancelled_requests << message[:params][:id] } when nil process_response(message) if message[:result] + else + id = message[:id] + + if id + send_message(Error.new( + id: id, + code: Constant::ErrorCodes::METHOD_NOT_FOUND, + message: "Method not found: #{message[:method]}", + )) + end end rescue DelegateRequestError send_message(Error.new(id: message[:id], code: DelegateRequestError::CODE, message: "DELEGATE_REQUEST")) diff --git a/test/server_test.rb b/test/server_test.rb index f38c20fba..12b6a0e5a 100644 --- a/test/server_test.rb +++ b/test/server_test.rb @@ -1726,6 +1726,19 @@ def test_launch_bundle_compose_forwards_argv_to_launcher ARGV.replace(original_argv) end + def test_unrecognized_request_returns_method_not_found + non_existent_method = "textDocument/nonExistentMethod" + @server.process_message({ + id: 1, + method: non_existent_method, + params: {}, + }) + + error = find_message(RubyLsp::Error) + assert_equal(Constant::ErrorCodes::METHOD_NOT_FOUND, error.code) + assert_equal("Method not found: #{non_existent_method}", error.message) + end + private def run_initialize_server_with_setup_error(error)