[ClangFormat] Add test checkking indentation after Q_OBJECT

Added test checking behavior when after Q_OBJECT all class structure
have correct indenting and redundent tabs doesn't appear before key words
such as  public:, private: , etc.
Made automatic addition Qt defines to StatementMacro to .clang-format files.

Fixes: QTCREATORBUG-26776
Change-Id: I3490421a9caf2831b593939597940358f7ce8f01
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Artem Sokolovskii
2022-01-11 13:18:29 +01:00
parent 8a29a78ebf
commit ab5fdd94f3
5 changed files with 43 additions and 8 deletions

View File

@@ -24,6 +24,7 @@
****************************************************************************/ ****************************************************************************/
#include "clangformatbaseindenter.h" #include "clangformatbaseindenter.h"
#include "clangformatutils.h"
#include <clang/Tooling/Core/Replacement.h> #include <clang/Tooling/Core/Replacement.h>
@@ -728,14 +729,16 @@ clang::format::FormatStyle ClangFormatBaseIndenter::styleForFile() const
{ {
llvm::Expected<clang::format::FormatStyle> style llvm::Expected<clang::format::FormatStyle> style
= clang::format::getStyle("file", m_fileName.toString().toStdString(), "none"); = clang::format::getStyle("file", m_fileName.toString().toStdString(), "none");
if (style) if (style) {
addQtcStatementMacros(*style);
return *style; return *style;
}
handleAllErrors(style.takeError(), [](const llvm::ErrorInfoBase &) { handleAllErrors(style.takeError(), [](const llvm::ErrorInfoBase &) {
// do nothing // do nothing
}); });
return clang::format::getLLVMStyle(); return qtcStyle();
} }
} // namespace ClangFormat } // namespace ClangFormat

View File

@@ -33,6 +33,7 @@
#include <texteditor/tabsettings.h> #include <texteditor/tabsettings.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/session.h> #include <projectexplorer/session.h>
#include <utils/qtcassert.h>
#include <QCryptographicHash> #include <QCryptographicHash>
@@ -46,7 +47,7 @@ using namespace Utils;
namespace ClangFormat { namespace ClangFormat {
static clang::format::FormatStyle qtcStyle() clang::format::FormatStyle qtcStyle()
{ {
clang::format::FormatStyle style = getLLVMStyle(); clang::format::FormatStyle style = getLLVMStyle();
style.Language = FormatStyle::LK_Cpp; style.Language = FormatStyle::LK_Cpp;
@@ -355,18 +356,38 @@ clang::format::FormatStyle styleForFile(Utils::FilePath fileName)
return styleForFile(fileName, true); return styleForFile(fileName, true);
} }
void addQtcStatementMacros(clang::format::FormatStyle &style)
{
static const std::vector<std::string> macros = {"Q_OBJECT",
"QT_BEGIN_NAMESPACE",
"QT_END_NAMESPACE"};
for (const std::string &macro : macros) {
if (std::find(style.StatementMacros.begin(), style.StatementMacros.end(), macro)
== style.StatementMacros.end())
style.StatementMacros.emplace_back(macro);
}
}
static std::string readFile(const QString &path) static std::string readFile(const QString &path)
{ {
const std::string defaultStyle = clang::format::configurationAsText(qtcStyle());
QFile file(path); QFile file(path);
if (!file.open(QFile::ReadOnly)) { if (!file.open(QFile::ReadOnly))
clang::format::FormatStyle defaultStyle = qtcStyle(); return defaultStyle;
return clang::format::configurationAsText(defaultStyle);
}
const QByteArray content = file.readAll(); const QByteArray content = file.readAll();
file.close(); file.close();
return content.toStdString(); clang::format::FormatStyle style;
style.Language = clang::format::FormatStyle::LK_Cpp;
const std::error_code error = clang::format::parseConfiguration(content.toStdString(), &style);
QTC_ASSERT(error.value() == static_cast<int>(ParseError::Success), return defaultStyle);
addQtcStatementMacros(style);
return clang::format::configurationAsText(style);
} }
std::string currentProjectConfigText() std::string currentProjectConfigText()

View File

@@ -51,4 +51,6 @@ clang::format::FormatStyle currentGlobalStyle();
QString configForFile(Utils::FilePath fileName); QString configForFile(Utils::FilePath fileName);
clang::format::FormatStyle styleForFile(Utils::FilePath fileName); clang::format::FormatStyle styleForFile(Utils::FilePath fileName);
void addQtcStatementMacros(clang::format::FormatStyle &style);
clang::format::FormatStyle qtcStyle();
} }

View File

@@ -646,4 +646,12 @@ void ClangFormatTest::testCommentBlock()
"****************************************************************************/"})); "****************************************************************************/"}));
} }
void ClangFormatTest::testClassIndentStructure()
{
insertLines({"class test {", " Q_OBJECT", " public:", "};"});
m_indenter->indent(*m_cursor, QChar::Null, TextEditor::TabSettings());
QCOMPARE(documentLines(),
(std::vector<QString>{"class test {", " Q_OBJECT", "public:", "};"}));
}
} // namespace ClangFormat::Internal } // namespace ClangFormat::Internal

View File

@@ -109,6 +109,7 @@ private slots:
void testSortIncludes(); void testSortIncludes();
void testChainedMemberFunctionCalls(); void testChainedMemberFunctionCalls();
void testCommentBlock(); void testCommentBlock();
void testClassIndentStructure();
private: private:
void insertLines(const std::vector<QString> &lines); void insertLines(const std::vector<QString> &lines);