ClangFormat: Add logging for bug fixing

Change-Id: I3c45c2b49e976da3609b3d8cb964b64f60a7e55b
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Artem Sokolovskii
2022-08-18 12:43:44 +02:00
parent a454a7f282
commit 045899272c
3 changed files with 46 additions and 1 deletions

View File

@@ -34,6 +34,8 @@ using namespace std::chrono_literals;
namespace ClangFormat { namespace ClangFormat {
Q_LOGGING_CATEGORY(clangIndenterLog, "qtc.dbg.clangformat", QtWarningMsg)
enum class ReplacementsToKeep { OnlyIndent, IndentAndBefore, All }; enum class ReplacementsToKeep { OnlyIndent, IndentAndBefore, All };
static Internal::LlvmFileSystemAdapter llvmFileSystemAdapter = {}; static Internal::LlvmFileSystemAdapter llvmFileSystemAdapter = {};
@@ -551,6 +553,37 @@ ClangFormatBaseIndenter::~ClangFormatBaseIndenter()
delete d; 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<std::string> 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, ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer,
const QTextBlock &startBlock, const QTextBlock &startBlock,
const QTextBlock &endBlock, const QTextBlock &endBlock,
@@ -584,6 +617,8 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer,
} }
} }
printDebugInfo(buffer, {}, "before");
if (replacementsToKeep != ReplacementsToKeep::IndentAndBefore || utf8Offset < rangeStart) if (replacementsToKeep != ReplacementsToKeep::IndentAndBefore || utf8Offset < rangeStart)
rangeStart = utf8Offset; rangeStart = utf8Offset;
@@ -594,6 +629,8 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer,
clang::tooling::Replacements clangReplacements = clang::format::reformat( clang::tooling::Replacements clangReplacements = clang::format::reformat(
style, buffer.data(), ranges, m_fileName->toFSPathString().toStdString(), &status); style, buffer.data(), ranges, m_fileName->toFSPathString().toStdString(), &status);
printDebugInfo(buffer, clangReplacements, "after");
clang::tooling::Replacements filtered; clang::tooling::Replacements filtered;
if (status.FormatComplete) { if (status.FormatComplete) {
filtered = filteredReplacements(buffer, filtered = filteredReplacements(buffer,
@@ -602,6 +639,9 @@ ChangeSet ClangFormatBaseIndenterPrivate::replacements(QByteArray buffer,
utf8Length, utf8Length,
replacementsToKeep); replacementsToKeep);
} }
printDebugInfo(buffer, filtered, "filtered");
const bool canTryAgain = replacementsToKeep == ReplacementsToKeep::OnlyIndent const bool canTryAgain = replacementsToKeep == ReplacementsToKeep::OnlyIndent
&& typedChar == QChar::Null && !secondTry; && typedChar == QChar::Null && !secondTry;
if (canTryAgain && filtered.empty()) { if (canTryAgain && filtered.empty()) {
@@ -648,7 +688,7 @@ EditOperations ClangFormatBaseIndenter::format(const RangesInLines &rangesInLine
assumedFileName); assumedFileName);
auto changedCode = clang::tooling::applyAllReplacements(buffer.data(), clangReplacements); auto changedCode = clang::tooling::applyAllReplacements(buffer.data(), clangReplacements);
QTC_ASSERT(changedCode, { QTC_ASSERT(changedCode, {
qDebug() << QString::fromStdString(llvm::toString(changedCode.takeError())); qCDebug(clangIndenterLog) << QString::fromStdString(llvm::toString(changedCode.takeError()));
return {}; return {};
}); });
ranges = clang::tooling::calculateRangesAfterReplacements(clangReplacements, ranges); ranges = clang::tooling::calculateRangesAfterReplacements(clangReplacements, ranges);

View File

@@ -5,10 +5,14 @@
#include <texteditor/indenter.h> #include <texteditor/indenter.h>
#include <QLoggingCategory>
namespace clang::format { struct FormatStyle; } namespace clang::format { struct FormatStyle; }
namespace ClangFormat { namespace ClangFormat {
Q_DECLARE_LOGGING_CATEGORY(clangIndenterLog)
class ClangFormatBaseIndenter : public TextEditor::Indenter class ClangFormatBaseIndenter : public TextEditor::Indenter
{ {
public: public:

View File

@@ -22,6 +22,7 @@
#include <utils/expected.h> #include <utils/expected.h>
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QLoggingCategory>
using namespace clang; using namespace clang;
using namespace format; using namespace format;