forked from qt-creator/qt-creator
ClangFormat: Add logging for bug fixing
Change-Id: I3c45c2b49e976da3609b3d8cb964b64f60a7e55b Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
@@ -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);
|
||||||
|
@@ -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:
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user