diff --git a/lib/syntax_tree/language_server.rb b/lib/syntax_tree/language_server.rb index 16e94534..d2714b5c 100644 --- a/lib/syntax_tree/language_server.rb +++ b/lib/syntax_tree/language_server.rb @@ -56,10 +56,10 @@ def run store.delete(uri) in { method: "textDocument/formatting", id:, params: { textDocument: { uri: } } } contents = store[uri] - write(id: id, result: contents ? [format(store[uri], uri.split(".").last)] : nil) + write(id: id, result: contents ? format(contents, uri.split(".").last) : nil) in { method: "textDocument/inlayHint", id:, params: { textDocument: { uri: } } } contents = store[uri] - write(id: id, result: contents ? inlay_hints(store[uri]) : nil) + write(id: id, result: contents ? inlay_hints(contents) : nil) in { method: "syntaxTree/visualizing", id:, params: { textDocument: { uri: } } } write(id: id, result: PP.pp(SyntaxTree.parse(store[uri]), +"")) in { method: %r{\$/.+} } @@ -89,19 +89,25 @@ def capabilities def format(source, extension) text = SyntaxTree::HANDLERS[".#{extension}"].format(source, print_width) - { - range: { - start: { - line: 0, - character: 0 + [ + { + range: { + start: { + line: 0, + character: 0 + }, + end: { + line: source.lines.size + 1, + character: 0 + } }, - end: { - line: source.lines.size + 1, - character: 0 - } - }, - newText: text - } + newText: text + } + ] + rescue Parser::ParseError + # If there is a parse error, then we're not going to return any formatting + # changes for this source. + nil end def inlay_hints(source) diff --git a/test/language_server_test.rb b/test/language_server_test.rb index 31062e87..466bf737 100644 --- a/test/language_server_test.rb +++ b/test/language_server_test.rb @@ -120,6 +120,24 @@ def test_formatting end end + def test_formatting_failure + messages = [ + Initialize.new(1), + TextDocumentDidOpen.new("file:///path/to/file.rb", "<>"), + TextDocumentFormatting.new(2, "file:///path/to/file.rb"), + Shutdown.new(3) + ] + + case run_server(messages) + in [ + { id: 1, result: { capabilities: Hash } }, + { id: 2, result: }, + { id: 3, result: {} } + ] + assert_nil(result) + end + end + def test_formatting_print_width contents = "#{"a" * 40} + #{"b" * 40}\n" messages = [