From 045899272c684ebe0cb8ea58294fb6dda95b8246 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Thu, 18 Aug 2022 12:43:44 +0200 Subject: [PATCH] ClangFormat: Add logging for bug fixing Change-Id: I3c45c2b49e976da3609b3d8cb964b64f60a7e55b Reviewed-by: Christian Kandeler --- .../clangformat/clangformatbaseindenter.cpp | 42 ++++++++++++++++++- .../clangformat/clangformatbaseindenter.h | 4 ++ src/plugins/clangformat/clangformatutils.cpp | 1 + 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index b491bd293f1..c81205de233 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -34,6 +34,8 @@ using namespace std::chrono_literals; namespace ClangFormat { +Q_LOGGING_CATEGORY(clangIndenterLog, "qtc.dbg.clangformat", QtWarningMsg) + enum class ReplacementsToKeep { OnlyIndent, IndentAndBefore, All }; static Internal::LlvmFileSystemAdapter llvmFileSystemAdapter = {}; @@ -551,6 +553,37 @@ ClangFormatBaseIndenter::~ClangFormatBaseIndenter() delete d; } +static void printBuffer(QString str) +{ + for (const auto &line : str.split("\n")) { + qCDebug(clangIndenterLog) << line; + } +} + +static void printDebugInfo( + const QByteArray &buffer, + clang::tooling::Replacements replacements, + const QString &additionalInfo) +{ + if (!clangIndenterLog().isInfoEnabled()) + return; + + QString str = QString::fromStdString(buffer.data()); + + if (replacements.empty()) { + std::string code = buffer.data(); + llvm::Expected code_new + = clang::tooling::applyAllReplacements(code, replacements); + if (!code_new) + return; + + str = QString::fromStdString(code_new.get()); + } + qCDebug(clangIndenterLog) << additionalInfo << str; + + printBuffer(str); +} + ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer, const QTextBlock &startBlock, const QTextBlock &endBlock, @@ -584,6 +617,8 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer, } } + printDebugInfo(buffer, {}, "before"); + if (replacementsToKeep != ReplacementsToKeep::IndentAndBefore || utf8Offset < rangeStart) rangeStart = utf8Offset; @@ -594,6 +629,8 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer, clang::tooling::Replacements clangReplacements = clang::format::reformat( style, buffer.data(), ranges, m_fileName->toFSPathString().toStdString(), &status); + printDebugInfo(buffer, clangReplacements, "after"); + clang::tooling::Replacements filtered; if (status.FormatComplete) { filtered = filteredReplacements(buffer, @@ -602,6 +639,9 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer, utf8Length, replacementsToKeep); } + + printDebugInfo(buffer, filtered, "filtered"); + const bool canTryAgain = replacementsToKeep == ReplacementsToKeep::OnlyIndent && typedChar == QChar::Null && !secondTry; if (canTryAgain && filtered.empty()) { @@ -648,7 +688,7 @@ EditOperations ClangFormatBaseIndenter::format(const RangesInLines &rangesInLine assumedFileName); auto changedCode = clang::tooling::applyAllReplacements(buffer.data(), clangReplacements); QTC_ASSERT(changedCode, { - qDebug() << QString::fromStdString(llvm::toString(changedCode.takeError())); + qCDebug(clangIndenterLog) << QString::fromStdString(llvm::toString(changedCode.takeError())); return {}; }); ranges = clang::tooling::calculateRangesAfterReplacements(clangReplacements, ranges); diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h index cb8041cf439..e6512f78621 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.h +++ b/src/plugins/clangformat/clangformatbaseindenter.h @@ -5,10 +5,14 @@ #include +#include + namespace clang::format { struct FormatStyle; } namespace ClangFormat { +Q_DECLARE_LOGGING_CATEGORY(clangIndenterLog) + class ClangFormatBaseIndenter : public TextEditor::Indenter { public: diff --git a/src/plugins/clangformat/clangformatutils.cpp b/src/plugins/clangformat/clangformatutils.cpp index 7ccc9ad7188..6732524f41e 100644 --- a/src/plugins/clangformat/clangformatutils.cpp +++ b/src/plugins/clangformat/clangformatutils.cpp @@ -22,6 +22,7 @@ #include #include +#include using namespace clang; using namespace format;