// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "cppeditor_global.h" #include #include #include #include #include #include #include namespace TextEditor { class HighlightingResult; class Parenthesis; class TextDocument; } QT_BEGIN_NAMESPACE class QTextBlock; QT_END_NAMESPACE namespace CppEditor { class CPPEDITOR_EXPORT SemanticHighlighter : public QObject { Q_OBJECT public: enum Kind { Unknown = 0, TypeUse, NamespaceUse, LocalUse, FieldUse, EnumerationUse, VirtualMethodUse, LabelUse, MacroUse, FunctionUse, PseudoKeywordUse, FunctionDeclarationUse, VirtualFunctionDeclarationUse, StaticFieldUse, StaticMethodUse, StaticMethodDeclarationUse, AngleBracketOpen, AngleBracketClose, DoubleAngleBracketClose, TernaryIf, TernaryElse, }; using HighlightingRunner = std::function ()>; public: explicit SemanticHighlighter(TextEditor::TextDocument *baseTextDocument); ~SemanticHighlighter() override; void setHighlightingRunner(HighlightingRunner highlightingRunner); void updateFormatMapFromFontSettings(); void run(); private: void onHighlighterResultAvailable(int from, int to); void handleHighlighterResults(); void onHighlighterFinished(); unsigned documentRevision() const; QVector getClearedParentheses(const QTextBlock &block); private: TextEditor::TextDocument *m_baseTextDocument; unsigned m_revision = 0; QHash m_formatMap; std::set m_seenBlocks; int m_nextResultToHandle = 0; int m_resultCount = 0; HighlightingRunner m_highlightingRunner; Utils::FutureSynchronizer m_futureSynchronizer; // Keep before m_watcher. std::unique_ptr> m_watcher; }; } // namespace CppEditor