diff --git a/src/libs/utils/textutils.cpp b/src/libs/utils/textutils.cpp index 9840e653561..c6cc137853e 100644 --- a/src/libs/utils/textutils.cpp +++ b/src/libs/utils/textutils.cpp @@ -294,7 +294,7 @@ QDebug &operator<<(QDebug &stream, const Position &pos) return stream; } -static HighlightCallback &codeHighlighter() +HighlightCallback &codeHighlighter() { static HighlightCallback s_highlighter; return s_highlighter; diff --git a/src/libs/utils/textutils.h b/src/libs/utils/textutils.h index 3d6d8cb5efe..b89778882d5 100644 --- a/src/libs/utils/textutils.h +++ b/src/libs/utils/textutils.h @@ -89,6 +89,7 @@ using HighlightCallback = std::function(const QString & QTCREATOR_UTILS_EXPORT QFuture highlightCode( const QString &code, const QString &mimeType); QTCREATOR_UTILS_EXPORT void setCodeHighlighter(const HighlightCallback &highlighter); +QTCREATOR_UTILS_EXPORT HighlightCallback &codeHighlighter(); } // Text } // Utils diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index fd7c818ae16..6bee69e4d48 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -74,6 +74,7 @@ #include #include #include +#include #include #include @@ -192,6 +193,37 @@ private: CppEditorPluginPrivate *d = nullptr; }; +QFuture highlightCode(const QString &code, const QString &mimeType) +{ + QTextDocument *document = new QTextDocument; + document->setPlainText(code); + + std::shared_ptr> promise + = std::make_shared>(); + + promise->start(); + + CppHighlighter *highlighter = new CppHighlighter(document); + + QObject::connect(highlighter, &CppHighlighter::finished, document, [document, promise]() { + promise->addResult(document); + promise->finish(); + }); + + QFutureWatcher *watcher = new QFutureWatcher(document); + QObject::connect(watcher, &QFutureWatcher::canceled, document, [document]() { + document->deleteLater(); + }); + watcher->setFuture(promise->future()); + + highlighter->setParent(document); + highlighter->setFontSettings(TextEditorSettings::fontSettings()); + highlighter->setMimeType(mimeType); + highlighter->rehighlight(); + + return promise->future(); +} + void CppEditorPlugin::initialize() { d = new CppEditorPluginPrivate; @@ -219,6 +251,17 @@ void CppEditorPlugin::initialize() d, &CppEditorPluginPrivate::onTaskStarted); connect(ProgressManager::instance(), &ProgressManager::allTasksFinished, d, &CppEditorPluginPrivate::onAllTasksFinished); + + auto oldHighlighter = Utils::Text::codeHighlighter(); + Utils::Text::setCodeHighlighter( + [oldHighlighter](const QString &code, const QString &mimeType) -> QFuture { + if (mimeType == "text/x-c++src" || mimeType == "text/x-c++hdr" + || mimeType == "text/x-csrc" || mimeType == "text/x-chdr") { + return highlightCode(code, mimeType); + } + + return oldHighlighter(code, mimeType); + }); } void CppEditorPlugin::extensionsInitialized()