From c44749868dde221f125c7b19d3a96da60572bb8a Mon Sep 17 00:00:00 2001 From: Michael Panchenko Date: Mon, 19 May 2025 16:32:41 +0200 Subject: [PATCH] PHP: also sleep for definition requests --- src/multilspy/language_server.py | 30 ++++++++++--------- .../intelephense/intelephense.py | 14 ++++++--- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/multilspy/language_server.py b/src/multilspy/language_server.py index 35a3d591..98ab6dbc 100644 --- a/src/multilspy/language_server.py +++ b/src/multilspy/language_server.py @@ -27,7 +27,7 @@ from serena.text_utils import LineType, MatchedConsecutiveLines, TextLine, searc from . import multilspy_types from .lsp_protocol_handler import lsp_types as LSPTypes from .lsp_protocol_handler.lsp_constants import LSPConstants -from .lsp_protocol_handler.lsp_types import SymbolKind +from .lsp_protocol_handler.lsp_types import Definition, DefinitionParams, LocationLink, SymbolKind from .lsp_protocol_handler.server import ( Error, LanguageServerHandler, @@ -495,6 +495,9 @@ class LanguageServer: ) return deleted_text + async def _send_definition_request(self, definition_params: DefinitionParams) -> Union[Definition, List[LocationLink], None]: + return await self.server.send.definition(definition_params) + async def request_definition( self, relative_file_path: str, line: int, column: int ) -> List[multilspy_types.Location]: @@ -518,19 +521,18 @@ class LanguageServer: with self.open_file(relative_file_path): # sending request to the language server and waiting for response - response = await self.server.send.definition( - { - LSPConstants.TEXT_DOCUMENT: { - LSPConstants.URI: pathlib.Path( - str(PurePath(self.repository_root_path, relative_file_path)) - ).as_uri() - }, - LSPConstants.POSITION: { - LSPConstants.LINE: line, - LSPConstants.CHARACTER: column, - }, - } - ) + definition_params = cast(DefinitionParams, { + LSPConstants.TEXT_DOCUMENT: { + LSPConstants.URI: pathlib.Path( + str(PurePath(self.repository_root_path, relative_file_path)) + ).as_uri() + }, + LSPConstants.POSITION: { + LSPConstants.LINE: line, + LSPConstants.CHARACTER: column, + }, + }) + response = await self._send_definition_request(definition_params) ret: List[multilspy_types.Location] = [] if isinstance(response, list): diff --git a/src/multilspy/language_servers/intelephense/intelephense.py b/src/multilspy/language_servers/intelephense/intelephense.py index 7d976c2d..1e7da5a2 100644 --- a/src/multilspy/language_servers/intelephense/intelephense.py +++ b/src/multilspy/language_servers/intelephense/intelephense.py @@ -18,7 +18,7 @@ from overrides import override from multilspy.multilspy_logger import MultilspyLogger from multilspy.language_server import LanguageServer from multilspy.lsp_protocol_handler.server import ProcessLaunchInfo -from multilspy.lsp_protocol_handler.lsp_types import InitializeParams +from multilspy.lsp_protocol_handler.lsp_types import DefinitionParams, InitializeParams from multilspy.multilspy_config import MultilspyConfig from multilspy.multilspy_utils import PlatformUtils, PlatformId @@ -191,7 +191,13 @@ class Intelephense(LanguageServer): # TODO: The LS doesn't return references contained in other files if it doesn't sleep. This is # despite the LS having processed requests already. I don't know what causes this, but sleeping # one second helps. It may be that sleeping only once is enough but that's hard to reliably test. - # It may be that even this 1sec is not enough in larger TS projects, at some point we should find what - # causes this and solve it. + # May be related to the time it takes to read the files or something like that. + # The sleeping doesn't seem to be needed on all systems sleep(1) - return await super()._send_references_request(relative_file_path, line, column) \ No newline at end of file + return await super()._send_references_request(relative_file_path, line, column) + + @override + async def _send_definition_request(self, definition_params: DefinitionParams): + # TODO: same as above, also only a problem if the definition is in another file + sleep(1) + return await super()._send_definition_request(definition_params)