summaryrefslogtreecommitdiffstats
path: root/tests/lsp_tests/lsp_tutil.py
blob: 0843f794d274a72a6935ac11a3167d5c8a935a6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from typing import Tuple, Union

try:
    from pygls.server import LanguageServer
    from lsprotocol.types import (
        TextDocumentItem,
        Position,
    )
    from debputy.lsp.debputy_ls import DebputyLanguageServer
except ImportError:
    pass


def _locate_cursor(text: str) -> Tuple[str, "Position"]:
    lines = text.splitlines(keepends=True)
    for line_no in range(len(lines)):
        line = lines[line_no]
        try:
            c = line.index("<CURSOR>")
        except ValueError:
            continue
        line = line.replace("<CURSOR>", "")
        lines[line_no] = line
        pos = Position(line_no, c)
        return "".join(lines), pos
    raise ValueError('Missing "<CURSOR>" marker')


def put_doc_with_cursor(
    ls: Union["LanguageServer", "DebputyLanguageServer"],
    uri: str,
    language_id: str,
    content: str,
) -> "Position":
    cleaned_content, cursor_pos = _locate_cursor(content)
    doc_version = 1
    existing = ls.workspace.text_documents.get(uri)
    if existing is not None:
        doc_version = existing.version + 1
    ls.workspace.put_text_document(
        TextDocumentItem(
            uri,
            language_id,
            doc_version,
            cleaned_content,
        )
    )
    return cursor_pos