Skip to content

Commit

Permalink
Support range format protocol.
Browse files Browse the repository at this point in the history
  • Loading branch information
manateelazycat committed Apr 24, 2024
1 parent f0eeb9f commit 977d344
Show file tree
Hide file tree
Showing 6 changed files with 55 additions and 6 deletions.
17 changes: 12 additions & 5 deletions core/fileaction.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,13 +239,19 @@ def try_completion(self, position, before_char, prefix, version=None):
else:
self.send_server_request(self.single_server, "completion", self.single_server, position, before_char, prefix, version)

def try_formatting(self, *args, **kwargs):
def try_formatting(self, start, end, *args, **kwargs):
if self.multi_servers:
for lsp_server in self.multi_servers.values():
if lsp_server.server_info["name"] in self.multi_servers_info["formatting"]:
self.send_server_request(lsp_server, "formatting", *args, **kwargs)
if start == end:
self.send_request(lsp_server, "formatting", Formatting, *args, **kwargs)
else:
self.send_request(lsp_server, "rangeFormatting", RangeFormatting, start, end, *args, **kwargs)
else:
self.send_server_request(self.single_server, "formatting", *args, **kwargs)
if start == end:
self.send_request(self.single_server, "formatting", Formatting, *args, **kwargs)
else:
self.send_request(self.single_server, "rangeFormatting", RangeFormatting, start, end, *args, **kwargs)

def try_code_action(self, *args, **kwargs):
self.code_action_counter = 0
Expand Down Expand Up @@ -385,8 +391,9 @@ def send_code_action_request(self, lsp_server, range_start, range_end, action_ki
continue
diagnostics.append(diagnostic)

self.send_server_request(
lsp_server, "code_action", lsp_server_name, diagnostics, range_start, range_end, action_kind
self.send_request(
lsp_server, "code_action", Codeaction,
lsp_server_name, diagnostics, range_start, range_end, action_kind
)

def save_file(self, buffer_name):
Expand Down
1 change: 1 addition & 0 deletions core/handler/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ def handle_response(self, request_id, response):
from core.handler.deno_uri_resolver import DenoUriResolver # noqa: F401
from core.handler.code_action import CodeAction # noqa: F401
from core.handler.formatting import Formatting # noqa: F401
from core.handler.range_formatting import RangeFormatting # noqa: F401
from core.handler.execute_command import ExecuteCommand # noqa: F401
from core.handler.workspace_symbol import WorkspaceSymbol # noqa: F401
from core.handler.call_hierarchy import PrepareCallHierarchyIncomingCalls, PrepareCallHierarchyOutgoingCalls, CallHierarchyIncomingCalls, CallHierarchyOutgoingCalls # noqa: F401
Expand Down
2 changes: 2 additions & 0 deletions core/handler/formatting.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ def process_request(self, tab_size) -> dict:
def process_response(self, response) -> None:
if response and len(response) > 0:
eval_in_emacs("lsp-bridge-format--update", self.file_action.filepath, response)
else:
message_emacs("Nothing need format.")
32 changes: 32 additions & 0 deletions core/handler/range_formatting.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from core.handler import Handler
from core.utils import *


class RangeFormatting(Handler):
name = "rangeFormatting"
method = "textDocument/rangeFormatting"
cancel_on_change = True
provider = "range_format_provider"
provider_message = "Current server not support range format."

def process_request(self, range_start, range_end, tab_size) -> dict:
range = {
"start": range_start,
"end": range_end
}

options = {
"tabSize": tab_size,
"insertSpaces": self.file_action.insert_spaces,
"trimTrailingWhitespace": True,
"insertFinalNewline": False,
"trimFinalNewlines": True,
}

return dict(range=range, options=options)

def process_response(self, response) -> None:
if response and len(response) > 0:
eval_in_emacs("lsp-bridge-format--update", self.file_action.filepath, response)
else:
message_emacs("Nothing need format.")
3 changes: 3 additions & 0 deletions core/lspserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ def __init__(self, message_queue, project_path, server_info, server_name, enable
self.rename_prepare_provider = False
self.code_action_provider = False
self.code_format_provider = False
self.range_format_provider = False
self.signature_help_provider = False
self.workspace_symbol_provider = False
self.inlay_hint_provider = False
Expand Down Expand Up @@ -582,6 +583,7 @@ def handle_error_message(self, message):
"Unhandled method textDocument/prepareRename": "rename_prepare_provider",
"Unhandled method textDocument/codeAction": "code_action_provider",
"Unhandled method textDocument/formatting": "code_format_provider",
"Unhandled method textDocument/rangeFormatting": "range_format_provider",
"Unhandled method textDocument/signatureHelp": "signature_help_provider",
"Unhandled method workspace/symbol": "workspace_symbol_provider",
"Unhandled method textDocument/inlayHint": "inlay_hint_provider",
Expand Down Expand Up @@ -661,6 +663,7 @@ def save_attribute_from_message(self, message):
("code_action_provider", ["result", "capabilities", "codeActionProvider"]),
("code_action_kinds", ["result", "capabilities", "codeActionProvider", "codeActionKinds"]),
("code_format_provider", ["result", "capabilities", "documentFormattingProvider"]),
("range_format_provider", ["result", "capabilities", "documentRangeFormattingProvider", "rangesSupport"]),
("signature_help_provider", ["result", "capabilities", "signatureHelpProvider"]),
("workspace_symbol_provider", ["result", "capabilities", "workspaceSymbolProvider"]),
("inlay_hint_provider", ["result", "capabilities", "inlayHintProvider", "resolveProvider"]),
Expand Down
6 changes: 5 additions & 1 deletion lsp-bridge.el
Original file line number Diff line number Diff line change
Expand Up @@ -2362,8 +2362,12 @@ SymbolKind (defined in the LSP)."
;; Tempel not active.
(or (not (boundp 'tempel--active))
(not tempel--active)))
(let ((indent (symbol-value (lsp-bridge--get-indent-width major-mode))))
(let* ((indent (symbol-value (lsp-bridge--get-indent-width major-mode)))
(start (lsp-bridge--point-position (if (region-active-p) (region-beginning) (point))))
(end (lsp-bridge--point-position (if (region-active-p) (region-end) (point)))))
(lsp-bridge-call-file-api "try_formatting"
start
end
;; Sometimes `c-basic-offset' return string `set-from-style', make some lsp server broken, such as, gopls,
;; so we need convert indent to integer `4' to make sure code format works expectantly.
(if (eq indent 'set-from-style)
Expand Down

0 comments on commit 977d344

Please sign in to comment.