diff --git a/lib/syntax_tree/cli.rb b/lib/syntax_tree/cli.rb index f2616c87..a9d1fd7a 100644 --- a/lib/syntax_tree/cli.rb +++ b/lib/syntax_tree/cli.rb @@ -593,7 +593,8 @@ def run(argv) when "j", "json" Json.new(options) when "lsp" - LanguageServer.new(print_width: options.print_width).run + LanguageServer.new(ignore_files: options.ignore_files, +print_width: options.print_width).run return 0 when "m", "match" Match.new(options) diff --git a/lib/syntax_tree/language_server.rb b/lib/syntax_tree/language_server.rb index 6ec81030..4db802bc 100644 --- a/lib/syntax_tree/language_server.rb +++ b/lib/syntax_tree/language_server.rb @@ -215,10 +215,12 @@ def self.[](value) attr_reader :input, :output, :print_width def initialize( + ignore_files: [], input: $stdin, output: $stdout, print_width: DEFAULT_PRINT_WIDTH ) + @ignore_files = ignore_files @input = input.binmode @output = output.binmode @print_width = print_width @@ -255,8 +257,12 @@ def run store.delete(request.dig(:params, :textDocument, :uri)) when Request[method: "textDocument/formatting", id: :any, params: { textDocument: { uri: :any } }] uri = request.dig(:params, :textDocument, :uri) + filepath = uri.split("///").last + ignore = @ignore_files.any? do |glob| + File.fnmatch(glob, filepath) + end contents = store[uri] - write(id: request[:id], result: contents ? format(contents, uri.split(".").last) : nil) + write(id: request[:id], result: contents && !ignore ? format(contents, uri.split(".").last) : nil) when Request[method: "textDocument/inlayHint", id: :any, params: { textDocument: { uri: :any } }] uri = request.dig(:params, :textDocument, :uri) contents = store[uri] diff --git a/test/language_server_test.rb b/test/language_server_test.rb index f5a6ca57..7b6dc22c 100644 --- a/test/language_server_test.rb +++ b/test/language_server_test.rb @@ -151,6 +151,24 @@ def test_formatting assert_equal("class Bar\nend\n", responses.dig(1, :result, 0, :newText)) end + def test_formatting_ignore + responses = run_server([ + Initialize.new(1), + TextDocumentDidOpen.new("file:///path/to/file.rb", "class Foo; end"), + TextDocumentFormatting.new(2, "file:///path/to/file.rb"), + Shutdown.new(3) + ], ignore_files: ["path/**/*.rb"]) + + shape = LanguageServer::Request[[ + { id: 1, result: { capabilities: Hash } }, + { id: 2, result: :any }, + { id: 3, result: {} } + ]] + + assert_operator(shape, :===, responses) + assert_nil(responses.dig(1, :result)) + end + def test_formatting_failure responses = run_server([ Initialize.new(1), @@ -322,11 +340,12 @@ def read(content) end end - def run_server(messages, print_width: DEFAULT_PRINT_WIDTH) + def run_server(messages, ignore_files: [], print_width: DEFAULT_PRINT_WIDTH) input = StringIO.new(messages.map { |message| write(message) }.join) output = StringIO.new LanguageServer.new( + ignore_files: ignore_files, input: input, output: output, print_width: print_width