diff --git a/lib/syntax_tree/language_server.rb b/lib/syntax_tree/language_server.rb index 3853ee18..31c91f9c 100644 --- a/lib/syntax_tree/language_server.rb +++ b/lib/syntax_tree/language_server.rb @@ -36,8 +36,9 @@ def run write(id: id, result: { capabilities: capabilities }) in method: "initialized" # ignored - in method: "shutdown" + in method: "shutdown" # tolerate missing ID to be a good citizen store.clear + write(id: request[:id], result: {}) return in { method: "textDocument/didChange", diff --git a/test/language_server_test.rb b/test/language_server_test.rb index f8a61003..519bada3 100644 --- a/test/language_server_test.rb +++ b/test/language_server_test.rb @@ -11,9 +11,9 @@ def to_hash end end - class Shutdown + class Shutdown < Struct.new(:id) def to_hash - { method: "shutdown" } + { method: "shutdown", id: id } end end @@ -107,13 +107,14 @@ def test_formatting TextDocumentDidChange.new("file:///path/to/file.rb", "class Bar; end"), TextDocumentFormatting.new(2, "file:///path/to/file.rb"), TextDocumentDidClose.new("file:///path/to/file.rb"), - Shutdown.new + Shutdown.new(3) ] case run_server(messages) in [ { id: 1, result: { capabilities: Hash } }, - { id: 2, result: [{ newText: new_text }] } + { id: 2, result: [{ newText: new_text }] }, + { id: 3, result: {} } ] assert_equal("class Bar\nend\n", new_text) end @@ -129,13 +130,14 @@ def test_inlay_hints end RUBY TextDocumentInlayHints.new(2, "file:///path/to/file.rb"), - Shutdown.new + Shutdown.new(3) ] case run_server(messages) in [ { id: 1, result: { capabilities: Hash } }, - { id: 2, result: { before:, after: } } + { id: 2, result: { before:, after: } }, + { id: 3, result: {} } ] assert_equal(1, before.length) assert_equal(2, after.length) @@ -147,11 +149,15 @@ def test_visualizing Initialize.new(1), TextDocumentDidOpen.new("file:///path/to/file.rb", "1 + 2"), SyntaxTreeVisualizing.new(2, "file:///path/to/file.rb"), - Shutdown.new + Shutdown.new(3) ] case run_server(messages) - in [{ id: 1, result: { capabilities: Hash } }, { id: 2, result: }] + in [ + { id: 1, result: { capabilities: Hash } }, + { id: 2, result: }, + { id: 3, result: {} } + ] assert_equal( "(program (statements ((binary (int \"1\") + (int \"2\")))))\n", result @@ -167,13 +173,14 @@ def test_reading_file messages = [ Initialize.new(1), TextDocumentFormatting.new(2, "file://#{file.path}"), - Shutdown.new + Shutdown.new(3) ] case run_server(messages) in [ { id: 1, result: { capabilities: Hash } }, - { id: 2, result: [{ newText: new_text }] } + { id: 2, result: [{ newText: new_text }] }, + { id: 3, result: {} } ] assert_equal("class Foo\nend\n", new_text) end @@ -186,6 +193,15 @@ def test_bogus_request end end + def test_clean_shutdown + messages = [Initialize.new(1), Shutdown.new(2)] + + case run_server(messages) + in [{ id: 1, result: { capabilities: Hash } }, { id: 2, result: {} }] + assert_equal(true, true) + end + end + private def write(content)