1010import sys
1111import urllib
1212import urllib .parse
13- from pathlib import Path
14- from typing import (
15- Any ,
16- Awaitable ,
17- Callable ,
18- Literal ,
19- Sequence ,
20- Type ,
21- TypedDict ,
22- )
2313import uuid
2414import warnings
15+ from pathlib import Path
16+ from typing import Any , Awaitable , Callable , Literal , Sequence , Type , TypedDict
2517
2618import attrs
2719import lsprotocol .converters
2820import lsprotocol .types
29- from lsprotocol import types
30- from pygls .client import JsonRPCClient
31- from pygls .protocol import default_converter
32- from pytest_lsp import (
33- ClientServerConfig ,
34- LanguageClient ,
35- LanguageClientProtocol ,
36- LspSpecificationWarning ,
37- )
3821from drivers import ALSTestDriver
3922from e3 .os .process import Run , command_line_image
4023from e3 .testsuite .driver .classic import ProcessResult , TestAbortWithFailure
4124from e3 .testsuite .result import TestStatus
25+ from lsprotocol import types
4226from lsprotocol .types import (
4327 CallHierarchyIncomingCall ,
4428 CallHierarchyIncomingCallsParams ,
5741 TextDocumentItem ,
5842 WorkDoneProgressEnd ,
5943)
44+ from pygls .client import JsonRPCClient
45+ from pygls .protocol import default_converter
46+ from pytest_lsp import (
47+ ClientServerConfig ,
48+ LanguageClient ,
49+ LanguageClientProtocol ,
50+ LspSpecificationWarning ,
51+ )
6052
6153LOG = logging .getLogger (__name__ )
6254logger = LOG
@@ -342,6 +334,21 @@ def didChangeConfig(self, settings: ALSSettings) -> None:
342334 DidChangeConfigurationParams (settings = {"ada" : settings })
343335 )
344336
337+ def didOpenFile (self , src_path : Path | str , language_id = "ada" , version = 0 ) -> str :
338+ """Send a textDocument/didOpen notification for a file on disk. The content of
339+ the file is automatically read and sent in the notification. The URI is returned
340+ for later use in other requests about the file.
341+ """
342+ uri = URI (src_path )
343+
344+ self .text_document_did_open (
345+ DidOpenTextDocumentParams (
346+ TextDocumentItem (uri , language_id , version , Path (src_path ).read_text ())
347+ )
348+ )
349+
350+ return uri
351+
345352 def didOpenVirtual (
346353 self , uri : str | None = None , language_id = "ada" , version = 0 , text : str = ""
347354 ) -> str :
@@ -422,16 +429,42 @@ async def prepareCallHierarchy(
422429 self , uri : str , line_one_based : int , char_one_based : int
423430 ):
424431 return await self .text_document_prepare_call_hierarchy_async (
425- callHierarchyPrepareParams (uri , line_one_based , char_one_based )
432+ CallHierarchyPrepareParams (
433+ TextDocumentIdentifier (uri ), Pos (line_one_based , char_one_based )
434+ )
426435 )
427436
428437 async def callHierarchyIncomingCalls (
429- self , uri : str , line_one_based : int , char_on_based : int
438+ self , uri : str , line_one_based : int , char_one_based : int
430439 ):
440+ rng = RangeZero (line_one_based , char_one_based )
431441 return await self .call_hierarchy_incoming_calls_async (
432- callHierarchyIncomingCallsParams (uri , line_one_based , char_on_based )
442+ CallHierarchyIncomingCallsParams (
443+ CallHierarchyItem (
444+ name = "" ,
445+ kind = SymbolKind .Function ,
446+ uri = uri ,
447+ range = rng ,
448+ selection_range = rng ,
449+ )
450+ )
433451 )
434452
453+ def assertEqual (self , actual : Any , expected : Any ) -> None :
454+ """Raise an AssertionError if actual != expected."""
455+ assertEqual (actual , expected )
456+
457+ def assertLocationsList (
458+ self ,
459+ actual : Sequence [CallHierarchyItem | CallHierarchyIncomingCall ],
460+ expected : list [tuple [str , int ]],
461+ ) -> None :
462+ """Assert the content of a list of results from a CallHierarchy or
463+ CallHierarchyIncomingCall request. Expected results are given as a list of
464+ (<basename>, <line-one-based>) tuples.
465+ """
466+ assertLocationsList (actual , expected )
467+
435468
436469def als_client_factory () -> ALSLanguageClient :
437470 """This function is an ugly copy-paste of pytest_lsp.make_test_lsp_client. It is
@@ -750,16 +783,6 @@ def do_main():
750783 run_test_file (args .test_py_path )
751784
752785
753- def callHierarchyPrepareParams (
754- src_uri : str , line_one_based : int , char_one_based : int
755- ) -> CallHierarchyPrepareParams :
756- """Shortcut for creating a CallHierarchyPrepareParams object."""
757- return CallHierarchyPrepareParams (
758- TextDocumentIdentifier (src_uri ),
759- Pos (line_one_based , char_one_based ),
760- )
761-
762-
763786def Pos (line_one_based : int , char_one_based : int ):
764787 """Shortcut for creating a Position object with ONE-BASED locations."""
765788 return Position (line_one_based - 1 , char_one_based - 1 )
@@ -773,24 +796,6 @@ def RangeZero(line_one_based: int, char_one_based: int):
773796 return Range (pos , pos )
774797
775798
776- def callHierarchyIncomingCallsParams (
777- src_uri : str , line_one_based : int , char_one_based : int
778- ) -> CallHierarchyIncomingCallsParams :
779- """Shortcut for creating a CallHierarchyIncomingCallsParams object."""
780- rng = RangeZero (line_one_based , char_one_based )
781- param = CallHierarchyIncomingCallsParams (
782- item = CallHierarchyItem (
783- name = "" ,
784- kind = SymbolKind .Function ,
785- uri = src_uri ,
786- range = rng ,
787- selection_range = rng ,
788- )
789- )
790-
791- return param
792-
793-
794799def didOpenTextDocumentParams (
795800 src_path : Path | str ,
796801) -> tuple [DidOpenTextDocumentParams , str ]:
@@ -810,7 +815,7 @@ def URI(src_path: Path | str) -> str:
810815 """Create a URI for the given file path."""
811816 src_abs = Path (src_path ).resolve ()
812817
813- # Replace backslashs with forward slashes to avoid too much quoting in URIs
818+ # Replace back slashes with forward slashes to avoid too much quoting in URIs
814819 src_abs_str = str (src_abs ).replace ("\\ " , "/" )
815820
816821 quoted = urllib .parse .quote (src_abs_str )
0 commit comments