mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
The test system depended on the shebang to locate the python interpreter. However, this is not a portable system. Instead, prefer to explicitly search for the interpreter prior to the execution. This enables supporting execution of the script support on all platforms. A secondary change of the printed string is required for Windows. Python will replace `\n` with `\r\n` resulting in `\r\n` being emitted as `\r\r\n` on Windows breaking the expectations on the receiver. Adjust this by explicitly writing out a binary string to the raw underlying buffer to avoid the translation.
86 lines
2.4 KiB
Python
Executable File
86 lines
2.4 KiB
Python
Executable File
import json
|
|
import os
|
|
import sys
|
|
|
|
|
|
def send(data):
|
|
dataStr = json.dumps(data)
|
|
try:
|
|
sys.stdout.buffer.write(f"Content-Length: {len(dataStr)}\r\n\r\n{dataStr}".encode('utf-8'))
|
|
sys.stdout.flush()
|
|
except IOError:
|
|
# stdout closed, time to quit
|
|
raise SystemExit(0)
|
|
|
|
|
|
while True:
|
|
line = sys.stdin.readline()
|
|
if len(line) == 0:
|
|
break
|
|
|
|
assert line.startswith('Content-Length:')
|
|
length = int(line[len('Content-Length:'):])
|
|
sys.stdin.readline()
|
|
message = json.loads(sys.stdin.read(length))
|
|
|
|
response = None
|
|
notification = None
|
|
|
|
if message["method"] == "build/initialize":
|
|
response = {
|
|
"jsonrpc": "2.0",
|
|
"id": message["id"],
|
|
"result": {
|
|
"displayName": "test server",
|
|
"version": "0.1",
|
|
"bspVersion": "2.0",
|
|
"rootUri": "blah",
|
|
"capabilities": {"languageIds": ["a", "b"]},
|
|
"data": {
|
|
"indexStorePath": "some/index/store/path"
|
|
}
|
|
}
|
|
}
|
|
elif message["method"] == "build/initialized":
|
|
continue
|
|
elif message["method"] == "build/shutdown":
|
|
response = {
|
|
"jsonrpc": "2.0",
|
|
"id": message["id"],
|
|
"result": None
|
|
}
|
|
elif message["method"] == "build/exit":
|
|
break
|
|
elif message["method"] == "textDocument/registerForChanges":
|
|
response = {
|
|
"jsonrpc": "2.0",
|
|
"id": message["id"],
|
|
"result": None
|
|
}
|
|
if message["params"]["action"] == "register":
|
|
notification = {
|
|
"jsonrpc": "2.0",
|
|
"method": "build/sourceKitOptionsChanged",
|
|
"params": {
|
|
"uri": message["params"]["uri"],
|
|
"updatedOptions": {
|
|
"options": ["a", "b"],
|
|
"workingDirectory": "/some/dir"
|
|
}
|
|
}
|
|
}
|
|
|
|
# ignore other notifications
|
|
elif "id" in message:
|
|
response = {
|
|
"jsonrpc": "2.0",
|
|
"id": message["id"],
|
|
"error": {
|
|
"code": -32600,
|
|
"message": "unhandled method {}".format(message["method"]),
|
|
}
|
|
}
|
|
|
|
if response: send(response)
|
|
if notification: send(notification)
|