ClangCodeModel: Ignore redundant semantic tokens

This can now happen due to the newly implemented refresh support.

Change-Id: If64feede84b044140f7ec04e317289d3f493aa53
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-11-03 15:30:57 +01:00
parent 98e5639f78
commit 4022043792
2 changed files with 19 additions and 0 deletions

View File

@@ -1065,6 +1065,8 @@ public:
// The highlighters are owned by their respective documents. // The highlighters are owned by their respective documents.
std::unordered_map<TextDocument *, CppEditor::SemanticHighlighter *> highlighters; std::unordered_map<TextDocument *, CppEditor::SemanticHighlighter *> highlighters;
QHash<TextDocument *, QPair<QList<ExpandedSemanticToken>, int>> previousTokens;
// The ranges of symbols referring to virtual functions, with document version, // The ranges of symbols referring to virtual functions, with document version,
// as extracted by the highlighting procedure. // as extracted by the highlighting procedure.
QHash<TextDocument *, QPair<QList<Range>, int>> virtualRanges; QHash<TextDocument *, QPair<QList<Range>, int>> virtualRanges;
@@ -1385,6 +1387,7 @@ void ClangdClient::handleDocumentClosed(TextDocument *doc)
{ {
d->highlighters.erase(doc); d->highlighters.erase(doc);
d->astCache.remove(doc); d->astCache.remove(doc);
d->previousTokens.remove(doc);
d->virtualRanges.remove(doc); d->virtualRanges.remove(doc);
} }
@@ -2582,6 +2585,17 @@ void ClangdClient::Private::handleSemanticTokens(TextDocument *doc,
<< version << q->documentVersion(doc->filePath()); << version << q->documentVersion(doc->filePath());
return; return;
} }
const auto previous = previousTokens.find(doc);
if (previous != previousTokens.end()) {
if (previous->first == tokens && previous->second == version) {
qCDebug(clangdLogHighlight) << "tokens and version same as last time; nothing to do";
return;
}
previous->first = tokens;
previous->second = version;
} else {
previousTokens.insert(doc, qMakePair(tokens, version));
}
for (const ExpandedSemanticToken &t : tokens) for (const ExpandedSemanticToken &t : tokens)
qCDebug(clangdLogHighlight()) << '\t' << t.line << t.column << t.length << t.type qCDebug(clangdLogHighlight()) << '\t' << t.line << t.column << t.length << t.type
<< t.modifiers; << t.modifiers;

View File

@@ -50,6 +50,11 @@ public:
QString type; QString type;
QStringList modifiers; QStringList modifiers;
}; };
inline bool operator==(const ExpandedSemanticToken &t1, const ExpandedSemanticToken &t2)
{
return t1.line == t2.line && t1.column == t2.column && t1.length == t2.length
&& t1.type == t2.type && t1.modifiers == t2.modifiers;
}
using SemanticTokensHandler = std::function<void(TextEditor::TextDocument *, using SemanticTokensHandler = std::function<void(TextEditor::TextDocument *,
const QList<ExpandedSemanticToken> &, int)>; const QList<ExpandedSemanticToken> &, int)>;