loom

Форк
0
58 строк · 1.9 Кб
1
#include "script/ScriptDocumentOperation.h"
2

3
using namespace simodo;
4

5
/// \file
6
/// \see https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_hover
7

8

9
variable::Value makeHoverContentsResponse(const std::u16string & kind, const std::u16string & value) {
10
    return variable::Object {{
11
        { u"kind", kind },
12
        { u"value", inout::encodeSpecialChars(value) },
13
}};
14
}
15

16
variable::Value makeHoverResponse(const std::u16string & hover_text, const lsp::Range & range) {
17
    return variable::Object {{
18
        { u"contents", makeHoverContentsResponse(u"plaintext", hover_text) },
19
        { u"range", lsp::DocumentContext::makeRange(range) },
20
}};
21
}
22

23

24
std::u16string ScriptDocumentOperation::makeHoverText(const variable::Variable & var)
25
{
26
    std::u16string text = getVariableString(var);
27

28
    if (var.value().isObject() || var.value().isArray())
29
        text += u" = " + variable::toString(var.value(), true, true, 1);
30

31
    if (!var.spec().object()->variables().empty())
32
        text += u"\n#" + variable::toString(var.spec().object());
33

34
    return text;
35
}
36

37
variable::Value ScriptDocumentOperation::produceHoverResponse(const lsp::Position & pos) const
38
{
39
    for (const variable::Variable & var : _semantic_data.declared())
40
        if (isOnToken(var.location(), pos) and not var.value().isError())
41
            return makeHoverResponse(makeHoverText(var), var.location().range());
42

43
    for (const auto & [var, loc] : _semantic_data.used())
44
        if (isOnToken(loc, pos)) {
45
            std::u16string text = makeHoverText(var);
46

47
            if (isRemoteFunctionLaunch(loc))
48
                text += u"\nRemote launching!";
49

50
            return makeHoverResponse(text, loc.range());
51
        }
52

53
    for (const auto & [token, ref] : _semantic_data.refs())
54
        if (isOnToken(token.location(), pos))
55
            return makeHoverResponse(ref, token.location().range());
56

57
    return { };
58
}
59

60

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.