Skip to content

Commit 725271b

Browse files
committed
Add more progress support
1 parent 819b7b8 commit 725271b

File tree

4 files changed

+37
-23
lines changed

4 files changed

+37
-23
lines changed

src/codegen/extensions/lsp/lsp.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,35 +71,46 @@ def did_close(server: CodegenLanguageServer, params: types.DidCloseTextDocumentP
7171

7272
@server.feature(
7373
types.TEXT_DOCUMENT_RENAME,
74+
options=types.RenameOptions(work_done_progress=True),
7475
)
7576
def rename(server: CodegenLanguageServer, params: types.RenameParams) -> types.RenameResult:
7677
symbol = server.get_symbol(params.text_document.uri, params.position)
7778
if symbol is None:
7879
logger.warning(f"No symbol found at {params.text_document.uri}:{params.position}")
7980
return
8081
logger.info(f"Renaming symbol {symbol.name} to {params.new_name}")
82+
task = server.progress_manager.begin_with_token(f"Renaming symbol {symbol.name} to {params.new_name}", params.work_done_token)
8183
symbol.rename(params.new_name)
84+
task.update("Committing changes")
8285
server.codebase.commit()
86+
task.end()
8387
return server.io.get_workspace_edit()
8488

8589

8690
@server.feature(
8791
types.TEXT_DOCUMENT_DOCUMENT_SYMBOL,
92+
options=types.DocumentSymbolOptions(work_done_progress=True),
8893
)
8994
def document_symbol(server: CodegenLanguageServer, params: types.DocumentSymbolParams) -> types.DocumentSymbolResult:
9095
file = server.get_file(params.text_document.uri)
9196
symbols = []
92-
for symbol in file.symbols:
97+
task = server.progress_manager.begin_with_token(f"Getting document symbols for {params.text_document.uri}", params.work_done_token, count=len(file.symbols))
98+
for idx, symbol in enumerate(file.symbols):
99+
task.update(f"Getting document symbols for {params.text_document.uri}", count=idx)
93100
symbols.append(get_document_symbol(symbol))
101+
task.end()
94102
return symbols
95103

96104

97105
@server.feature(
98106
types.TEXT_DOCUMENT_DEFINITION,
107+
options=types.DefinitionOptions(work_done_progress=True),
99108
)
100109
def definition(server: CodegenLanguageServer, params: types.DefinitionParams):
101110
node = server.get_node_under_cursor(params.text_document.uri, params.position)
111+
task = server.progress_manager.begin_with_token(f"Getting definition for {params.text_document.uri}", params.work_done_token)
102112
resolved = go_to_definition(node, params.text_document.uri, params.position)
113+
task.end()
103114
return types.Location(
104115
uri=resolved.file.path.as_uri(),
105116
range=get_range(resolved),
@@ -108,15 +119,11 @@ def definition(server: CodegenLanguageServer, params: types.DefinitionParams):
108119

109120
@server.feature(
110121
types.TEXT_DOCUMENT_CODE_ACTION,
111-
options=types.CodeActionOptions(resolve_provider=True),
122+
options=types.CodeActionOptions(resolve_provider=True, work_done_progress=True),
112123
)
113124
def code_action(server: CodegenLanguageServer, params: types.CodeActionParams) -> types.CodeActionResult:
114125
logger.info(f"Received code action: {params}")
115-
if params.context.only:
116-
only = [types.CodeActionKind(kind) for kind in params.context.only]
117-
else:
118-
only = None
119-
actions = server.get_actions_for_range(params.text_document.uri, params.range, only)
126+
actions = server.get_actions_for_range(params)
120127
return actions
121128

122129

src/codegen/extensions/lsp/progress.py

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,20 +42,19 @@ def __init__(self, server: LanguageServer, initial_token: ProgressToken | None =
4242
if initial_token is not None:
4343
self.server.work_done_progress.begin(initial_token, types.WorkDoneProgressBegin(title="Parsing codebase..."))
4444

45-
def begin_with_token(self, message: str, token: ProgressToken, *, count: int | None = None) -> LSPTask:
45+
def begin_with_token(self, message: str, token: ProgressToken | None = None, *, count: int | None = None) -> LSPTask | StubTask:
46+
if token is None:
47+
return StubTask()
4648
return LSPTask(self.server, message, token, count, create_token=False)
4749

4850
def begin(self, message: str, count: int | None = None) -> LSPTask | StubTask:
4951
if self.initialized:
5052
token = str(uuid.uuid4())
5153
self.server.work_done_progress.create(token).result()
5254
return LSPTask(self.server, message, token, count, create_token=False)
53-
elif self.initial_token is not None:
54-
return self.begin_with_token(message, self.initial_token, count=None)
55-
else:
56-
return StubTask()
55+
return self.begin_with_token(message, self.initial_token, count=None)
5756

5857
def finish_initialization(self) -> None:
59-
self.initialized = True
58+
self.initialized = False # We can't initiate server work during syncs
6059
if self.initial_token is not None:
6160
self.server.work_done_progress.end(self.initial_token, value=types.WorkDoneProgressEnd())

src/codegen/extensions/lsp/protocol.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ def _init_codebase(self, params: InitializeParams) -> None:
3030
config = CodebaseConfig(feature_flags=CodebaseFeatureFlags(full_range_index=True))
3131
io = LSPIO(self.workspace)
3232
self._server.codebase = Codebase(repo_path=str(root), config=config, io=io, progress=progress)
33+
self._server.progress_manager = progress
3334
self._server.io = io
3435
progress.finish_initialization()
3536

src/codegen/extensions/lsp/server.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import logging
2-
from collections.abc import Sequence
32
from typing import Any, Optional
43

54
from lsprotocol import types
@@ -8,8 +7,9 @@
87

98
from codegen.extensions.lsp.codemods import ACTIONS
109
from codegen.extensions.lsp.codemods.base import CodeAction
11-
from codegen.extensions.lsp.execute import execute_action, get_execute_action
10+
from codegen.extensions.lsp.execute import execute_action
1211
from codegen.extensions.lsp.io import LSPIO
12+
from codegen.extensions.lsp.progress import LSPProgress
1313
from codegen.extensions.lsp.range import get_tree_sitter_range
1414
from codegen.extensions.lsp.utils import get_path
1515
from codegen.sdk.core.codebase import Codebase
@@ -23,13 +23,14 @@
2323
class CodegenLanguageServer(LanguageServer):
2424
codebase: Optional[Codebase]
2525
io: Optional[LSPIO]
26+
progress_manager: Optional[LSPProgress]
2627
actions: dict[str, CodeAction]
2728

2829
def __init__(self, *args: Any, **kwargs: Any) -> None:
2930
super().__init__(*args, **kwargs)
3031
self.actions = {action.command_name(): action for action in ACTIONS}
31-
for action in self.actions.values():
32-
self.command(action.command_name())(get_execute_action(action))
32+
# for action in self.actions.values():
33+
# self.command(action.command_name())(get_execute_action(action))
3334

3435
def get_file(self, uri: str) -> SourceFile | File:
3536
path = get_path(uri)
@@ -68,19 +69,25 @@ def get_node_for_range(self, uri: str, range: Range) -> Editable | None:
6869
return node
6970
return None
7071

71-
def get_actions_for_range(self, uri: str, range: Range, only: Sequence[types.CodeActionKind] | None = None) -> list[types.CodeAction]:
72-
node = self.get_node_under_cursor(uri, range.start, range.end)
72+
def get_actions_for_range(self, params: types.CodeActionParams) -> list[types.CodeAction]:
73+
if params.context.only is not None:
74+
only = [types.CodeActionKind(kind) for kind in params.context.only]
75+
else:
76+
only = None
77+
node = self.get_node_under_cursor(params.text_document.uri, params.range.start)
7378
if node is None:
74-
logger.warning(f"No node found for range {range} in {uri}")
79+
logger.warning(f"No node found for range {params.range} in {params.text_document.uri}")
7580
return []
7681
actions = []
77-
for action in self.actions.values():
82+
task = self.progress_manager.begin_with_token(f"Getting code actions for {params.text_document.uri}", params.work_done_token, count=len(self.actions))
83+
for idx, action in enumerate(self.actions.values()):
84+
task.update(f"Checking action {action.name}", idx)
7885
if only and action.kind not in only:
7986
logger.warning(f"Skipping action {action.kind} because it is not in {only}")
8087
continue
8188
if action.is_applicable(self, node):
82-
actions.append(action.to_lsp(uri, range))
83-
89+
actions.append(action.to_lsp(params.text_document.uri, params.range))
90+
task.end()
8491
return actions
8592

8693
def resolve_action(self, action: types.CodeAction) -> types.CodeAction:

0 commit comments

Comments
 (0)