python lsp
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
# Licensed under the MIT License.
|
||||
"""
|
||||
Runner to use when running under a different interpreter.
|
||||
"""
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
import traceback
|
||||
|
||||
|
||||
# **********************************************************
|
||||
# Update sys.path before importing any bundled libraries.
|
||||
# **********************************************************
|
||||
def update_sys_path(path_to_add: str, strategy: str) -> None:
|
||||
"""Add given path to `sys.path`."""
|
||||
if path_to_add not in sys.path and os.path.isdir(path_to_add):
|
||||
if strategy == "useBundled":
|
||||
sys.path.insert(0, path_to_add)
|
||||
elif strategy == "fromEnvironment":
|
||||
sys.path.append(path_to_add)
|
||||
|
||||
|
||||
# Ensure that we can import LSP libraries, and other bundled libraries.
|
||||
update_sys_path(
|
||||
os.fspath(pathlib.Path(__file__).parent.parent / "libs"),
|
||||
os.getenv("LS_IMPORT_STRATEGY", "useBundled"),
|
||||
)
|
||||
|
||||
|
||||
# pylint: disable=wrong-import-position,import-error
|
||||
import lsp_jsonrpc as jsonrpc
|
||||
import lsp_utils as utils
|
||||
|
||||
RPC = jsonrpc.create_json_rpc(sys.stdin.buffer, sys.stdout.buffer)
|
||||
|
||||
EXIT_NOW = False
|
||||
while not EXIT_NOW:
|
||||
msg = RPC.receive_data()
|
||||
|
||||
method = msg["method"]
|
||||
if method == "exit":
|
||||
EXIT_NOW = True
|
||||
continue
|
||||
|
||||
if method == "run":
|
||||
is_exception = False
|
||||
# This is needed to preserve sys.path, pylint modifies
|
||||
# sys.path and that might not work for this scenario
|
||||
# next time around.
|
||||
with utils.substitute_attr(sys, "path", sys.path[:]):
|
||||
try:
|
||||
# TODO: `utils.run_module` is equivalent to running `python -m <pytool-module>`.
|
||||
# If your tool supports a programmatic API then replace the function below
|
||||
# with code for your tool. You can also use `utils.run_api` helper, which
|
||||
# handles changing working directories, managing io streams, etc.
|
||||
# Also update `_run_tool_on_document` and `_run_tool` functions in `lsp_server.py`.
|
||||
result = utils.run_module(
|
||||
module=msg["module"],
|
||||
argv=msg["argv"],
|
||||
use_stdin=msg["useStdin"],
|
||||
cwd=msg["cwd"],
|
||||
source=msg["source"] if "source" in msg else None,
|
||||
)
|
||||
except Exception: # pylint: disable=broad-except
|
||||
result = utils.RunResult("", traceback.format_exc(chain=True))
|
||||
is_exception = True
|
||||
|
||||
response = {"id": msg["id"]}
|
||||
if result.stderr:
|
||||
response["error"] = result.stderr
|
||||
response["exception"] = is_exception
|
||||
elif result.stdout:
|
||||
response["result"] = result.stdout
|
||||
|
||||
RPC.send_data(response)
|
||||
Reference in New Issue
Block a user