File: SemanticTokensRquest.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 136,204 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (77 lines) | stat: -rw-r--r-- 2,582 bytes parent folder | download | duplicates (2)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "SemanticTokensRquest.hpp"

#include "LSP/LSPEvent.h"
#include "LSP/basic_types.h"
#include "file_logger.h"
#include "json_rpc_params.h"
#include "wx/vector.h"

#include <thread>
#include <vector>

LSP::SemanticTokensRquest::SemanticTokensRquest(const wxString& filename)
    : m_filename(filename)
{
    SetMethod("textDocument/semanticTokens/full");
    m_params.reset(new SemanticTokensParams());
    m_params->As<SemanticTokensParams>()->SetTextDocument(filename);
}

LSP::SemanticTokensRquest::~SemanticTokensRquest() {}

void LSP::SemanticTokensRquest::OnResponse(const LSP::ResponseMessage& response, wxEvtHandler* owner)
{
    // build set of classes, locals so we can colour them
    if(!owner) {
        return;
    }

    std::vector<int> encoded_types;
    LOG_IF_TRACE { clTRACE() << "OnResponse for SemanticTokensRquest is called" << endl; }

    encoded_types = response["result"]["data"].toIntArray();

    LOG_IF_TRACE { clTRACE() << "Parsing semantic tokens array (" << encoded_types.size() << ")" << endl; }

    // since this is CPU heavy processing, spawn a thread to do the job
    wxString filename = m_filename;
    wxString server_name = GetServerName();

    // sanity: each token is represented by a set of 5 integers
    // { line, startChar, length, tokenType, tokenModifiers}
    if(encoded_types.size() % 5 != 0) {
        return;
    }

    int last_line = 0;
    int last_column = 0;
    std::vector<LSP::SemanticTokenRange> semantic_tokens;
    semantic_tokens.reserve(encoded_types.size() / 5);

    for(size_t i = 0; i < encoded_types.size() / 5; i++) {
        size_t base_index = 5 * i;
        LSP::SemanticTokenRange t;
        // calculate the token line
        t.line = last_line + encoded_types[base_index];

        // did we change lines?
        bool changed_line = t.line != last_line;

        // incase we are on a different line, the start_col is relative to 0, otherwise
        // it is relative to the previous item column
        t.column = changed_line ? encoded_types[base_index + 1] : encoded_types[base_index + 1] + last_column;
        t.length = encoded_types[base_index + 2];
        t.token_type = encoded_types[base_index + 3];

        last_column = t.column;
        last_line = t.line;
        semantic_tokens.emplace_back(t);
    }

    LSPEvent event(wxEVT_LSP_SEMANTICS);
    event.SetSemanticTokens(semantic_tokens);
    event.SetFileName(filename);
    event.SetServerName(GetServerName());
    owner->AddPendingEvent(event);
    LOG_IF_DEBUG { clDEBUG() << "Colouring file:" << filename << endl; }
}