diff --git a/lib/syntax_tree/cli.rb b/lib/syntax_tree/cli.rb index e0bafce9..205dba28 100644 --- a/lib/syntax_tree/cli.rb +++ b/lib/syntax_tree/cli.rb @@ -593,7 +593,10 @@ def run(argv) when "j", "json" Json.new(options) when "lsp" - LanguageServer.new(print_width: options.print_width).run + LanguageServer.new( + print_width: options.print_width, + ignore_files: options.ignore_files + ).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..aaa64e9a 100644 --- a/lib/syntax_tree/language_server.rb +++ b/lib/syntax_tree/language_server.rb @@ -217,11 +217,13 @@ def self.[](value) def initialize( input: $stdin, output: $stdout, - print_width: DEFAULT_PRINT_WIDTH + print_width: DEFAULT_PRINT_WIDTH, + ignore_files: [] ) @input = input.binmode @output = output.binmode @print_width = print_width + @ignore_files = ignore_files end # rubocop:disable Layout/LineLength @@ -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..54455c95 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,14 +340,15 @@ def read(content) end end - def run_server(messages, print_width: DEFAULT_PRINT_WIDTH) + def run_server(messages, print_width: DEFAULT_PRINT_WIDTH, ignore_files: []) input = StringIO.new(messages.map { |message| write(message) }.join) output = StringIO.new LanguageServer.new( input: input, output: output, - print_width: print_width + print_width: print_width, + ignore_files: ignore_files ).run read(output.tap(&:rewind))