22
33from 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
57from loguru import logger
68from 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
1111if 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
0 commit comments