Skip to content

Commit f8839b4

Browse files
committed
Fix for #102, handle files not existing
1 parent c9ce212 commit f8839b4

File tree

3 files changed

+38
-34
lines changed

3 files changed

+38
-34
lines changed

lib/syntax_tree/formatter.rb

+3-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ def format(node, stackable: true)
6868
# going to just print out the node as it was seen in the source.
6969
doc =
7070
if leading.last&.ignore?
71-
text(source[node.location.start_char...node.location.end_char])
71+
range = source[node.location.start_char...node.location.end_char]
72+
separator = -> { breakable(indent: false, force: true) }
73+
seplist(range.split(/\r?\n/, -1), separator) { |line| text(line) }
7274
else
7375
node.format(self)
7476
end

lib/syntax_tree/language_server.rb

+18-33
Original file line numberDiff line numberDiff line change
@@ -20,66 +20,51 @@ def initialize(input: $stdin, output: $stdout)
2020
@output = output.binmode
2121
end
2222

23+
# rubocop:disable Layout/LineLength
2324
def run
2425
store =
2526
Hash.new do |hash, uri|
26-
hash[uri] = File.binread(CGI.unescape(URI.parse(uri).path))
27+
filepath = CGI.unescape(URI.parse(uri).path)
28+
File.exist?(filepath) ? (hash[uri] = File.read(filepath)) : nil
2729
end
2830

2931
while (headers = input.gets("\r\n\r\n"))
3032
source = input.read(headers[/Content-Length: (\d+)/i, 1].to_i)
3133
request = JSON.parse(source, symbolize_names: true)
3234

35+
# stree-ignore
3336
case request
3437
in { method: "initialize", id: }
3538
store.clear
3639
write(id: id, result: { capabilities: capabilities })
37-
in method: "initialized"
40+
in { method: "initialized" }
3841
# ignored
39-
in method: "shutdown" # tolerate missing ID to be a good citizen
42+
in { method: "shutdown" } # tolerate missing ID to be a good citizen
4043
store.clear
4144
write(id: request[:id], result: {})
4245
return
43-
in {
44-
method: "textDocument/didChange",
45-
params: { textDocument: { uri: }, contentChanges: [{ text: }, *] }
46-
}
46+
in { method: "textDocument/didChange", params: { textDocument: { uri: }, contentChanges: [{ text: }, *] } }
4747
store[uri] = text
48-
in {
49-
method: "textDocument/didOpen",
50-
params: { textDocument: { uri:, text: } }
51-
}
48+
in { method: "textDocument/didOpen", params: { textDocument: { uri:, text: } } }
5249
store[uri] = text
53-
in {
54-
method: "textDocument/didClose", params: { textDocument: { uri: } }
55-
}
50+
in { method: "textDocument/didClose", params: { textDocument: { uri: } } }
5651
store.delete(uri)
57-
in {
58-
method: "textDocument/formatting",
59-
id:,
60-
params: { textDocument: { uri: } }
61-
}
62-
write(id: id, result: [format(store[uri])])
63-
in {
64-
# official RPC in LSP spec 3.17
65-
method: "textDocument/inlayHint",
66-
id:,
67-
params: { textDocument: { uri: } }
68-
}
69-
write(id: id, result: inlay_hints(store[uri]))
70-
in {
71-
method: "syntaxTree/visualizing",
72-
id:,
73-
params: { textDocument: { uri: } }
74-
}
52+
in { method: "textDocument/formatting", id:, params: { textDocument: { uri: } } }
53+
contents = store[uri]
54+
write(id: id, result: contents ? [format(store[uri])] : nil)
55+
in { method: "textDocument/inlayHint", id:, params: { textDocument: { uri: } } }
56+
contents = store[uri]
57+
write(id: id, result: contents ? inlay_hints(store[uri]) : nil)
58+
in { method: "syntaxTree/visualizing", id:, params: { textDocument: { uri: } } }
7559
write(id: id, result: PP.pp(SyntaxTree.parse(store[uri]), +""))
76-
in method: %r{\$/.+}
60+
in { method: %r{\$/.+} }
7761
# ignored
7862
else
7963
raise ArgumentError, "Unhandled: #{request}"
8064
end
8165
end
8266
end
67+
# rubocop:enable Layout/LineLength
8368

8469
private
8570

test/language_server_test.rb

+17
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,23 @@ def test_clean_shutdown
201201
end
202202
end
203203

204+
def test_file_that_does_not_exist
205+
messages = [
206+
Initialize.new(1),
207+
TextDocumentFormatting.new(2, "file:///path/to/file.rb"),
208+
Shutdown.new(3)
209+
]
210+
211+
case run_server(messages)
212+
in [
213+
{ id: 1, result: { capabilities: Hash } },
214+
{ id: 2, result: nil },
215+
{ id: 3, result: {} }
216+
]
217+
assert_equal(true, true)
218+
end
219+
end
220+
204221
private
205222

206223
def write(content)

0 commit comments

Comments
 (0)