From 223767a94a8ce8330f272e5c85d18a4f80b65721 Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 25 Jan 2024 17:53:23 +0100 Subject: [PATCH] CppEditor: Hide most of LineForNewIncludeDirective implementation Change-Id: Ic70d28beb057359fcd028aca2ab49ecb66dd990d Reviewed-by: Christian Kandeler --- src/plugins/cppeditor/cppeditorplugin.cpp | 2 +- src/plugins/cppeditor/cppquickfixes.cpp | 9 +- src/plugins/cppeditor/includeutils.cpp | 129 ++++++++++++++++++---- src/plugins/cppeditor/includeutils.h | 105 +++--------------- 4 files changed, 129 insertions(+), 116 deletions(-) diff --git a/src/plugins/cppeditor/cppeditorplugin.cpp b/src/plugins/cppeditor/cppeditorplugin.cpp index a5f1275538d..18eec99a446 100644 --- a/src/plugins/cppeditor/cppeditorplugin.cpp +++ b/src/plugins/cppeditor/cppeditorplugin.cpp @@ -488,7 +488,7 @@ void CppEditorPlugin::registerTests() addTest(); addTest(); addTestCreator(createCppHeaderSourceTest); - addTest(); + addTestCreator(createIncludeGroupsTest); addTest(); addTest(); addTest(); diff --git a/src/plugins/cppeditor/cppquickfixes.cpp b/src/plugins/cppeditor/cppquickfixes.cpp index 90ff3c07897..47e7f90b05f 100644 --- a/src/plugins/cppeditor/cppquickfixes.cpp +++ b/src/plugins/cppeditor/cppquickfixes.cpp @@ -225,13 +225,12 @@ void insertNewIncludeDirective(const QString &include, CppRefactoringFilePtr fil const Document::Ptr &cppDocument) { // Find optimal position - using namespace IncludeUtils; - LineForNewIncludeDirective finder(file->filePath(), file->document(), cppDocument, - LineForNewIncludeDirective::IgnoreMocIncludes, - LineForNewIncludeDirective::AutoDetect); unsigned newLinesToPrepend = 0; unsigned newLinesToAppend = 0; - const int insertLine = finder(include, &newLinesToPrepend, &newLinesToAppend); + const int insertLine = lineForNewIncludeDirective(file->filePath(), file->document(), + cppDocument, IgnoreMocIncludes, AutoDetect, + include, + &newLinesToPrepend, &newLinesToAppend); QTC_ASSERT(insertLine >= 1, return); const int insertPosition = file->position(insertLine, 1); QTC_ASSERT(insertPosition >= 0, return); diff --git a/src/plugins/cppeditor/includeutils.cpp b/src/plugins/cppeditor/includeutils.cpp index 1774997b6d4..8728e732f09 100644 --- a/src/plugins/cppeditor/includeutils.cpp +++ b/src/plugins/cppeditor/includeutils.cpp @@ -15,7 +15,6 @@ #include "cppmodelmanager.h" #include "cppsourceprocessertesthelper.h" #include "cppsourceprocessor.h" -#include "cpptoolstestcase.h" #include #endif // WITH_TESTS @@ -30,14 +29,52 @@ using namespace CPlusPlus; using namespace Utils; -namespace CppEditor { -namespace IncludeUtils { -namespace { +namespace CppEditor::Internal { -bool includeFileNamelessThen(const Include & left, const Include & right) -{ return left.unresolvedFileName() < right.unresolvedFileName(); } +using Include = CPlusPlus::Document::Include; +using IncludeType = CPlusPlus::Client::IncludeType; -int lineForAppendedIncludeGroup(const QList &groups, +class IncludeGroup +{ +public: + static QList detectIncludeGroupsByNewLines(QList &includes); + static QList detectIncludeGroupsByIncludeDir(const QList &includes); + static QList detectIncludeGroupsByIncludeType(const QList &includes); + + static QList filterMixedIncludeGroups(const QList &groups); + static QList filterIncludeGroups(const QList &groups, + CPlusPlus::Client::IncludeType includeType); + +public: + explicit IncludeGroup(const QList &includes) : m_includes(includes) {} + + QList includes() const { return m_includes; } + Include first() const { return m_includes.first(); } + Include last() const { return m_includes.last(); } + int size() const { return m_includes.size(); } + bool isEmpty() const { return m_includes.isEmpty(); } + + QString commonPrefix() const; + QString commonIncludeDir() const; /// only valid if hasCommonDir() == true + bool hasCommonIncludeDir() const; + bool hasOnlyIncludesOfType(CPlusPlus::Client::IncludeType includeType) const; + bool isSorted() const; /// name-wise + + int lineForNewInclude(const QString &newIncludeFileName, + CPlusPlus::Client::IncludeType newIncludeType) const; + +private: + QStringList filesNames() const; + + QList m_includes; +}; + +static bool includeFileNamelessThen(const Include & left, const Include & right) +{ + return left.unresolvedFileName() < right.unresolvedFileName(); +} + +static int lineForAppendedIncludeGroup(const QList &groups, unsigned *newLinesToPrepend) { if (newLinesToPrepend) @@ -45,7 +82,7 @@ int lineForAppendedIncludeGroup(const QList &groups, return groups.last().last().line() + 1; } -int lineForPrependedIncludeGroup(const QList &groups, +static int lineForPrependedIncludeGroup(const QList &groups, unsigned *newLinesToAppend) { if (newLinesToAppend) @@ -53,7 +90,7 @@ int lineForPrependedIncludeGroup(const QList &groups, return groups.first().first().line(); } -QString includeDir(const QString &include) +static QString includeDir(const QString &include) { QString dirPrefix = QFileInfo(include).dir().path(); if (dirPrefix == QLatin1String(".")) @@ -62,7 +99,7 @@ QString includeDir(const QString &include) return dirPrefix; } -int lineAfterFirstComment(const QTextDocument *textDocument) +static int lineAfterFirstComment(const QTextDocument *textDocument) { int insertLine = -1; @@ -101,7 +138,31 @@ int lineAfterFirstComment(const QTextDocument *textDocument) return insertLine; } -} // anonymous namespace +class LineForNewIncludeDirective +{ +public: + LineForNewIncludeDirective(const FilePath &filePath, const QTextDocument *textDocument, + const CPlusPlus::Document::Ptr cppDocument, + MocIncludeMode mocIncludeMode, + IncludeStyle includeStyle); + + /// Returns the line (1-based) at which the include directive should be inserted. + /// On error, -1 is returned. + int run(const QString &newIncludeFileName, unsigned *newLinesToPrepend = nullptr, + unsigned *newLinesToAppend = nullptr); + +private: + int findInsertLineForVeryFirstInclude(unsigned *newLinesToPrepend, unsigned *newLinesToAppend); + QList getGroupsByIncludeType(const QList &groups, + IncludeType includeType); + + const FilePath m_filePath; + const QTextDocument *m_textDocument; + const CPlusPlus::Document::Ptr m_cppDocument; + + IncludeStyle m_includeStyle; + QList m_includes; +}; LineForNewIncludeDirective::LineForNewIncludeDirective(const FilePath &filePath, const QTextDocument *textDocument, @@ -186,9 +247,9 @@ int LineForNewIncludeDirective::findInsertLineForVeryFirstInclude(unsigned *newL return insertLine; } -int LineForNewIncludeDirective::operator()(const QString &newIncludeFileName, - unsigned *newLinesToPrepend, - unsigned *newLinesToAppend) +int LineForNewIncludeDirective::run(const QString &newIncludeFileName, + unsigned *newLinesToPrepend, + unsigned *newLinesToAppend) { if (newLinesToPrepend) *newLinesToPrepend = false; @@ -325,6 +386,19 @@ QList LineForNewIncludeDirective::getGroupsByIncludeType( : IncludeGroup::filterIncludeGroups(groups, Client::IncludeGlobal); } +int lineForNewIncludeDirective(const Utils::FilePath &filePath, const QTextDocument *textDocument, + const CPlusPlus::Document::Ptr cppDocument, + MocIncludeMode mocIncludeMode, + IncludeStyle includeStyle, + const QString &newIncludeFileName, + unsigned *newLinesToPrepend, + unsigned *newLinesToAppend) +{ + return LineForNewIncludeDirective(filePath, textDocument, cppDocument, + mocIncludeMode, includeStyle) + .run(newIncludeFileName, newLinesToPrepend, newLinesToAppend); +} + /// includes will be modified! QList IncludeGroup::detectIncludeGroupsByNewLines(QList &includes) { @@ -526,14 +600,24 @@ bool IncludeGroup::hasCommonIncludeDir() const return true; } -} // namespace IncludeUtils +} // CppEditor::Internal #ifdef WITH_TESTS + +namespace CppEditor::Internal { + using namespace Tests; -using namespace IncludeUtils; using Tests::Internal::TestIncludePaths; -namespace Internal { +class IncludeGroupsTest : public QObject +{ + Q_OBJECT + +private slots: + void testDetectIncludeGroupsByNewLines(); + void testDetectIncludeGroupsByIncludeDir(); + void testDetectIncludeGroupsByIncludeType(); +}; static QList includesForSource(const FilePath &filePath) { @@ -637,8 +721,13 @@ void IncludeGroupsTest::testDetectIncludeGroupsByIncludeType() QVERIFY(includeGroups.at(3).hasOnlyIncludesOfType(Client::IncludeGlobal)); } -} // namespace Internal +QObject *createIncludeGroupsTest() +{ + return new IncludeGroupsTest; +} + +} // CppEditor::Internal + +#include "includeutils.moc" #endif // WITH_TESTS - -} // namespace CppEditor diff --git a/src/plugins/cppeditor/includeutils.h b/src/plugins/cppeditor/includeutils.h index c05d0c36b43..2f7057902cc 100644 --- a/src/plugins/cppeditor/includeutils.h +++ b/src/plugins/cppeditor/includeutils.h @@ -4,100 +4,25 @@ #pragma once #include -#include -#include +QT_BEGIN_NAMESPACE +class QObject; +class QTextDocument; +QT_END_NAMESPACE -#include -#include -#include +namespace CppEditor::Internal { -QT_FORWARD_DECLARE_CLASS(QTextDocument) +enum MocIncludeMode { RespectMocIncludes, IgnoreMocIncludes }; +enum IncludeStyle { LocalBeforeGlobal, GlobalBeforeLocal, AutoDetect }; -namespace CppEditor { -namespace IncludeUtils { - -using Include = CPlusPlus::Document::Include; -using IncludeType = CPlusPlus::Client::IncludeType; - -class IncludeGroup -{ -public: - static QList detectIncludeGroupsByNewLines(QList &includes); - static QList detectIncludeGroupsByIncludeDir(const QList &includes); - static QList detectIncludeGroupsByIncludeType(const QList &includes); - - static QList filterMixedIncludeGroups(const QList &groups); - static QList filterIncludeGroups(const QList &groups, - CPlusPlus::Client::IncludeType includeType); - -public: - explicit IncludeGroup(const QList &includes) : m_includes(includes) {} - - QList includes() const { return m_includes; } - Include first() const { return m_includes.first(); } - Include last() const { return m_includes.last(); } - int size() const { return m_includes.size(); } - bool isEmpty() const { return m_includes.isEmpty(); } - - QString commonPrefix() const; - QString commonIncludeDir() const; /// only valid if hasCommonDir() == true - bool hasCommonIncludeDir() const; - bool hasOnlyIncludesOfType(CPlusPlus::Client::IncludeType includeType) const; - bool isSorted() const; /// name-wise - - int lineForNewInclude(const QString &newIncludeFileName, - CPlusPlus::Client::IncludeType newIncludeType) const; - -private: - QStringList filesNames() const; - - QList m_includes; -}; - -class LineForNewIncludeDirective -{ -public: - enum MocIncludeMode { RespectMocIncludes, IgnoreMocIncludes }; - enum IncludeStyle { LocalBeforeGlobal, GlobalBeforeLocal, AutoDetect }; - - LineForNewIncludeDirective(const Utils::FilePath &filePath, const QTextDocument *textDocument, +int lineForNewIncludeDirective(const Utils::FilePath &filePath, const QTextDocument *textDocument, const CPlusPlus::Document::Ptr cppDocument, - MocIncludeMode mocIncludeMode = IgnoreMocIncludes, - IncludeStyle includeStyle = AutoDetect); + MocIncludeMode mocIncludeMode, + IncludeStyle includeStyle, + const QString &newIncludeFileName, + unsigned *newLinesToPrepend, + unsigned *newLinesToAppend); - /// Returns the line (1-based) at which the include directive should be inserted. - /// On error, -1 is returned. - int operator()(const QString &newIncludeFileName, unsigned *newLinesToPrepend = nullptr, - unsigned *newLinesToAppend = nullptr); +QObject *createIncludeGroupsTest(); -private: - int findInsertLineForVeryFirstInclude(unsigned *newLinesToPrepend, unsigned *newLinesToAppend); - QList getGroupsByIncludeType(const QList &groups, - IncludeType includeType); - - const Utils::FilePath m_filePath; - const QTextDocument *m_textDocument; - const CPlusPlus::Document::Ptr m_cppDocument; - - IncludeStyle m_includeStyle; - QList m_includes; -}; - -} // namespace IncludeUtils - -#ifdef WITH_TESTS -namespace Internal { -class IncludeGroupsTest : public QObject -{ - Q_OBJECT - -private slots: - void testDetectIncludeGroupsByNewLines(); - void testDetectIncludeGroupsByIncludeDir(); - void testDetectIncludeGroupsByIncludeType(); -}; -} // namespace Internal -#endif // WITH_TESTS - -} // namespace CppEditor +} // CppEditor::Internal