10
10
import sys
11
11
import urllib
12
12
import 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
- )
23
13
import uuid
24
14
import warnings
15
+ from pathlib import Path
16
+ from typing import Any , Awaitable , Callable , Literal , Sequence , Type , TypedDict
25
17
26
18
import attrs
27
19
import lsprotocol .converters
28
20
import 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
- )
38
21
from drivers import ALSTestDriver
39
22
from e3 .os .process import Run , command_line_image
40
23
from e3 .testsuite .driver .classic import ProcessResult , TestAbortWithFailure
41
24
from e3 .testsuite .result import TestStatus
25
+ from lsprotocol import types
42
26
from lsprotocol .types import (
43
27
CallHierarchyIncomingCall ,
44
28
CallHierarchyIncomingCallsParams ,
57
41
TextDocumentItem ,
58
42
WorkDoneProgressEnd ,
59
43
)
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
+ )
60
52
61
53
LOG = logging .getLogger (__name__ )
62
54
logger = LOG
@@ -342,6 +334,21 @@ def didChangeConfig(self, settings: ALSSettings) -> None:
342
334
DidChangeConfigurationParams (settings = {"ada" : settings })
343
335
)
344
336
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
+
345
352
def didOpenVirtual (
346
353
self , uri : str | None = None , language_id = "ada" , version = 0 , text : str = ""
347
354
) -> str :
@@ -422,16 +429,42 @@ async def prepareCallHierarchy(
422
429
self , uri : str , line_one_based : int , char_one_based : int
423
430
):
424
431
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
+ )
426
435
)
427
436
428
437
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
430
439
):
440
+ rng = RangeZero (line_one_based , char_one_based )
431
441
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
+ )
433
451
)
434
452
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
+
435
468
436
469
def als_client_factory () -> ALSLanguageClient :
437
470
"""This function is an ugly copy-paste of pytest_lsp.make_test_lsp_client. It is
@@ -750,16 +783,6 @@ def do_main():
750
783
run_test_file (args .test_py_path )
751
784
752
785
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
-
763
786
def Pos (line_one_based : int , char_one_based : int ):
764
787
"""Shortcut for creating a Position object with ONE-BASED locations."""
765
788
return Position (line_one_based - 1 , char_one_based - 1 )
@@ -773,24 +796,6 @@ def RangeZero(line_one_based: int, char_one_based: int):
773
796
return Range (pos , pos )
774
797
775
798
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
-
794
799
def didOpenTextDocumentParams (
795
800
src_path : Path | str ,
796
801
) -> tuple [DidOpenTextDocumentParams , str ]:
@@ -810,7 +815,7 @@ def URI(src_path: Path | str) -> str:
810
815
"""Create a URI for the given file path."""
811
816
src_abs = Path (src_path ).resolve ()
812
817
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
814
819
src_abs_str = str (src_abs ).replace ("\\ " , "/" )
815
820
816
821
quoted = urllib .parse .quote (src_abs_str )
0 commit comments