Skip to content

Commit dc6a6ef

Browse files
committed
Migrate LSP formatting to API server
1 parent b2b7fe3 commit dc6a6ef

2 files changed

Lines changed: 39 additions & 28 deletions

File tree

src/finecode/lsp_server/endpoints/formatting.py

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22

33
from typing import TYPE_CHECKING
44

5+
from finecode.lsp_server import global_state, pygls_types_utils
6+
from finecode_extension_api.actions import format_files as format_files_action
57
from loguru import logger
68
from lsprotocol import types
7-
8-
from finecode.api_server.services import run_service
9-
from finecode.lsp_server import global_state, pygls_types_utils
9+
from pydantic.dataclasses import dataclass as pydantic_dataclass
1010

1111
if TYPE_CHECKING:
1212
from pygls.lsp.server import LanguageServer
@@ -18,38 +18,49 @@ async def format_document(ls: LanguageServer, params: types.DocumentFormattingPa
1818

1919
file_path = pygls_types_utils.uri_str_to_path(params.text_document.uri)
2020

21+
if global_state.api_client is None:
22+
logger.error("Formatting requested but API client not connected")
23+
return None
24+
25+
project_name = await global_state.api_client.find_project_for_file(str(file_path))
26+
if project_name is None:
27+
logger.error(f"Cannot determine project for formatting: {file_path}")
28+
return []
29+
2130
try:
22-
response = await run_service.find_action_project_and_run(
23-
file_path=file_path,
24-
action_name="format",
25-
params={"file_paths": [file_path], "save": False},
26-
run_trigger=run_service.RunActionTrigger.USER,
27-
dev_env=run_service.DevEnv.IDE,
28-
ws_context=global_state.ws_context,
29-
initialize_all_handlers=True,
31+
response = await global_state.api_client.run_action(
32+
action="format",
33+
project=project_name,
34+
params={"file_paths": [str(file_path)], "save": False, "target": "files"},
35+
options={"trigger": "user", "dev_env": "ide"},
3036
)
31-
except Exception as error: # TODO
37+
except Exception as error:
3238
logger.error(f"Error document formatting {file_path}: {error}")
3339
return None
3440

3541
if response is None:
3642
return []
3743

38-
response_for_file = response.json().get("result_by_file_path", {}).get(
39-
str(file_path), None
40-
)
44+
json_result = (response.get("resultByFormat") or {}).get("json")
45+
if json_result is None:
46+
return []
47+
48+
result_type = pydantic_dataclass(format_files_action.FormatFilesRunResult)
49+
format_result: format_files_action.FormatFilesRunResult = result_type(**json_result)
50+
51+
response_for_file = format_result.result_by_file_path.get(file_path)
4152
if response_for_file is None:
4253
return []
4354

44-
if response_for_file.get("changed", True) is True:
55+
if response_for_file.changed is True:
4556
doc = ls.workspace.get_text_document(params.text_document.uri)
4657
return [
4758
types.TextEdit(
4859
range=types.Range(
4960
start=types.Position(0, 0),
5061
end=types.Position(len(doc.lines), len(doc.lines[-1])),
5162
),
52-
new_text=response_for_file["code"],
63+
new_text=response_for_file.code,
5364
)
5465
]
5566

src/finecode/lsp_server/lsp_server.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
# from finecode.lsp_server.endpoints import code_lens as code_lens_endpoints
1717
from finecode.lsp_server.endpoints import diagnostics as diagnostics_endpoints
1818
from finecode.lsp_server.endpoints import document_sync as document_sync_endpoints
19-
# from finecode.lsp_server.endpoints import formatting as formatting_endpoints
19+
from finecode.lsp_server.endpoints import formatting as formatting_endpoints
2020
# from finecode.lsp_server.endpoints import inlay_hints as inlay_hints_endpoints
2121

2222

@@ -48,18 +48,18 @@ def create_lsp_server() -> CustomLanguageServer:
4848
register_workspace_dirs_feature(_workspace_did_change_workspace_folders)
4949

5050
# Formatting
51-
# register_formatting_feature = server.feature(types.TEXT_DOCUMENT_FORMATTING)
52-
# register_formatting_feature(formatting_endpoints.format_document)
51+
register_formatting_feature = server.feature(types.TEXT_DOCUMENT_FORMATTING)
52+
register_formatting_feature(formatting_endpoints.format_document)
5353

54-
# register_range_formatting_feature = server.feature(
55-
# types.TEXT_DOCUMENT_RANGE_FORMATTING
56-
# )
57-
# register_range_formatting_feature(formatting_endpoints.format_range)
54+
register_range_formatting_feature = server.feature(
55+
types.TEXT_DOCUMENT_RANGE_FORMATTING
56+
)
57+
register_range_formatting_feature(formatting_endpoints.format_range)
5858

59-
# register_ranges_formatting_feature = server.feature(
60-
# types.TEXT_DOCUMENT_RANGES_FORMATTING
61-
# )
62-
# register_ranges_formatting_feature(formatting_endpoints.format_ranges)
59+
register_ranges_formatting_feature = server.feature(
60+
types.TEXT_DOCUMENT_RANGES_FORMATTING
61+
)
62+
register_ranges_formatting_feature(formatting_endpoints.format_ranges)
6363

6464
# document sync
6565
register_document_did_open_feature = server.feature(types.TEXT_DOCUMENT_DID_OPEN)

0 commit comments

Comments
 (0)