From 1fd576c1f6fdb96e7c65b7c6fde724e46cee43b2 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 20 Jan 2014 09:15:50 +0200 Subject: [PATCH] C++: Add support for prefixes in switch header/source Task-number: QTCREATORBUG-11031 Change-Id: I93cce0ebf46984eb06094e1f1519717be2bbaa79 Reviewed-by: Orgad Shaneh Reviewed-by: Erik Verbruggen --- src/plugins/cpptools/cppfilesettingspage.cpp | 14 ++++- src/plugins/cpptools/cppfilesettingspage.h | 2 + src/plugins/cpptools/cppfilesettingspage.ui | 56 ++++++++++++++++--- src/plugins/cpptools/cppheadersource_test.cpp | 16 ++++++ src/plugins/cpptools/cpptoolsplugin.cpp | 35 ++++++++++++ src/plugins/cpptools/cpptoolsplugin.h | 2 + 6 files changed, 115 insertions(+), 10 deletions(-) diff --git a/src/plugins/cpptools/cppfilesettingspage.cpp b/src/plugins/cpptools/cppfilesettingspage.cpp index cb2a39949d3..5a9affa451b 100644 --- a/src/plugins/cpptools/cppfilesettingspage.cpp +++ b/src/plugins/cpptools/cppfilesettingspage.cpp @@ -51,6 +51,8 @@ #include #include +static const char headerPrefixesKeyC[] = "HeaderPrefixes"; +static const char sourcePrefixesKeyC[] = "SourcePrefixes"; static const char headerSuffixKeyC[] = "HeaderSuffix"; static const char sourceSuffixKeyC[] = "SourceSuffix"; static const char headerSearchPathsKeyC[] = "HeaderSearchPaths"; @@ -76,6 +78,8 @@ CppFileSettings::CppFileSettings() : void CppFileSettings::toSettings(QSettings *s) const { s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); + s->setValue(QLatin1String(headerPrefixesKeyC), headerPrefixes); + s->setValue(QLatin1String(sourcePrefixesKeyC), sourcePrefixes); s->setValue(QLatin1String(headerSuffixKeyC), headerSuffix); s->setValue(QLatin1String(sourceSuffixKeyC), sourceSuffix); s->setValue(QLatin1String(headerSearchPathsKeyC), headerSearchPaths); @@ -97,7 +101,9 @@ void CppFileSettings::fromSettings(QSettings *s) << QDir::toNativeSeparators(QLatin1String("../Src")) << QLatin1String(".."); s->beginGroup(QLatin1String(Constants::CPPTOOLS_SETTINGSGROUP)); - headerSuffix= s->value(QLatin1String(headerSuffixKeyC), QLatin1String("h")).toString(); + headerPrefixes = s->value(QLatin1String(headerPrefixesKeyC)).toStringList(); + sourcePrefixes = s->value(QLatin1String(sourcePrefixesKeyC)).toStringList(); + headerSuffix = s->value(QLatin1String(headerSuffixKeyC), QLatin1String("h")).toString(); sourceSuffix = s->value(QLatin1String(sourceSuffixKeyC), QLatin1String("cpp")).toString(); headerSearchPaths = s->value(QLatin1String(headerSearchPathsKeyC), defaultHeaderSearchPaths) .toStringList(); @@ -118,6 +124,8 @@ bool CppFileSettings::applySuffixesToMimeDB() bool CppFileSettings::equals(const CppFileSettings &rhs) const { return lowerCaseFiles == rhs.lowerCaseFiles + && headerPrefixes == rhs.headerPrefixes + && sourcePrefixes == rhs.sourcePrefixes && headerSuffix == rhs.headerSuffix && sourceSuffix == rhs.sourceSuffix && headerSearchPaths == rhs.headerSearchPaths @@ -285,6 +293,8 @@ CppFileSettings CppFileSettingsWidget::settings() const { CppFileSettings rc; rc.lowerCaseFiles = m_ui->lowerCaseFileNamesCheckBox->isChecked(); + rc.headerPrefixes = trimmedPaths(m_ui->headerPrefixesEdit->text()); + rc.sourcePrefixes = trimmedPaths(m_ui->sourcePrefixesEdit->text()); rc.headerSuffix = m_ui->headerSuffixComboBox->currentText(); rc.sourceSuffix = m_ui->sourceSuffixComboBox->currentText(); rc.headerSearchPaths = trimmedPaths(m_ui->headerSearchPathsEdit->text()); @@ -302,6 +312,8 @@ static inline void setComboText(QComboBox *cb, const QString &text, int defaultI void CppFileSettingsWidget::setSettings(const CppFileSettings &s) { m_ui->lowerCaseFileNamesCheckBox->setChecked(s.lowerCaseFiles); + m_ui->headerPrefixesEdit->setText(s.headerPrefixes.join(QLatin1String(","))); + m_ui->sourcePrefixesEdit->setText(s.sourcePrefixes.join(QLatin1String(","))); setComboText(m_ui->headerSuffixComboBox, s.headerSuffix); setComboText(m_ui->sourceSuffixComboBox, s.sourceSuffix); m_ui->headerSearchPathsEdit->setText(s.headerSearchPaths.join(QLatin1String(","))); diff --git a/src/plugins/cpptools/cppfilesettingspage.h b/src/plugins/cpptools/cppfilesettingspage.h index 0ca32842465..92d509bae21 100644 --- a/src/plugins/cpptools/cppfilesettingspage.h +++ b/src/plugins/cpptools/cppfilesettingspage.h @@ -49,8 +49,10 @@ struct CppFileSettings { CppFileSettings(); + QStringList headerPrefixes; QString headerSuffix; QStringList headerSearchPaths; + QStringList sourcePrefixes; QString sourceSuffix; QStringList sourceSearchPaths; bool lowerCaseFiles; diff --git a/src/plugins/cpptools/cppfilesettingspage.ui b/src/plugins/cpptools/cppfilesettingspage.ui index 5ac56063195..e11701a7846 100644 --- a/src/plugins/cpptools/cppfilesettingspage.ui +++ b/src/plugins/cpptools/cppfilesettingspage.ui @@ -7,7 +7,7 @@ 0 0 547 - 305 + 363 @@ -23,7 +23,7 @@ Headers - + &Suffix: @@ -33,7 +33,7 @@ - + @@ -43,7 +43,7 @@ - + S&earch paths: @@ -53,7 +53,7 @@ - + Comma-separated list of header paths. @@ -64,6 +64,25 @@ These paths are used in addition to current directory on Switch Header/Source. + + + + &Prefixes: + + + headerSearchPathsEdit + + + + + + + Comma-separated list of header prefixes. + +These prefixes are used in addition to current file name on Switch Header/Source. + + + @@ -79,7 +98,7 @@ These paths are used in addition to current directory on Switch Header/Source.Sources - + S&uffix: @@ -89,7 +108,7 @@ These paths are used in addition to current directory on Switch Header/Source. - + @@ -99,7 +118,7 @@ These paths are used in addition to current directory on Switch Header/Source. - + Se&arch paths: @@ -109,7 +128,7 @@ These paths are used in addition to current directory on Switch Header/Source. - + Comma-separated list of source paths. @@ -120,6 +139,25 @@ These paths are used in addition to current directory on Switch Header/Source. + + + + P&refixes: + + + sourceSearchPathsEdit + + + + + + + Comma-separated list of source prefixes. + +These prefixes are used in addition to current file name on Switch Header/Source. + + + diff --git a/src/plugins/cpptools/cppheadersource_test.cpp b/src/plugins/cpptools/cppheadersource_test.cpp index c047d0fe43a..f5f71985449 100644 --- a/src/plugins/cpptools/cppheadersource_test.cpp +++ b/src/plugins/cpptools/cppheadersource_test.cpp @@ -29,6 +29,7 @@ #include "cpptoolsplugin.h" #include "cpptoolsreuse.h" +#include "cppfilesettingspage.h" #include @@ -81,16 +82,31 @@ void CppToolsPlugin::test_headersource_data() QTest::addColumn("headerFileName"); QTest::newRow("samedir") << _("foo.cpp") << _("foo.h"); QTest::newRow("includesub") << _("foo.cpp") << _("include/foo.h"); + QTest::newRow("headerprefix") << _("foo.cpp") << _("testh_foo.h"); + QTest::newRow("sourceprefixwsub") << _("testc_foo.cpp") << _("include/foo.h"); + QTest::newRow("sourceAndHeaderPrefixWithBothsub") << _("src/testc_foo.cpp") << _("include/testh_foo.h"); } void CppToolsPlugin::initTestCase() { QDir(baseTestDir()).mkpath(_(".")); + m_fileSettings->headerSearchPaths.append(QLatin1String("include")); + m_fileSettings->headerSearchPaths.append(QLatin1String("../include")); + m_fileSettings->sourceSearchPaths.append(QLatin1String("src")); + m_fileSettings->sourceSearchPaths.append(QLatin1String("../src")); + m_fileSettings->headerPrefixes.append(QLatin1String("testh_")); + m_fileSettings->sourcePrefixes.append(QLatin1String("testc_")); } void CppToolsPlugin::cleanupTestCase() { Utils::FileUtils::removeRecursively(Utils::FileName::fromString(baseTestDir())); + m_fileSettings->headerSearchPaths.removeLast(); + m_fileSettings->headerSearchPaths.removeLast(); + m_fileSettings->sourceSearchPaths.removeLast(); + m_fileSettings->sourceSearchPaths.removeLast(); + m_fileSettings->headerPrefixes.removeLast(); + m_fileSettings->sourcePrefixes.removeLast(); } } // namespace Internal diff --git a/src/plugins/cpptools/cpptoolsplugin.cpp b/src/plugins/cpptools/cpptoolsplugin.cpp index 8dc5e4c95e9..e4694712457 100644 --- a/src/plugins/cpptools/cpptoolsplugin.cpp +++ b/src/plugins/cpptools/cpptoolsplugin.cpp @@ -106,6 +106,17 @@ const QStringList &CppToolsPlugin::sourceSearchPaths() return m_instance->m_fileSettings->sourceSearchPaths; } +const QStringList &CppToolsPlugin::headerPrefixes() +{ + return m_instance->m_fileSettings->headerPrefixes; +} + +const QStringList &CppToolsPlugin::sourcePrefixes() +{ + return m_instance->m_fileSettings->sourcePrefixes; +} + + bool CppToolsPlugin::initialize(const QStringList &arguments, QString *error) { Q_UNUSED(arguments) @@ -256,6 +267,28 @@ static QStringList baseNameWithAllSuffixes(const QString &baseName, const QStrin return result; } +static QStringList baseNamesWithAllPrefixes(const QStringList &baseNames, bool isHeader) +{ + QStringList result; + const QStringList &sourcePrefixes = m_instance->sourcePrefixes(); + const QStringList &headerPrefixes = m_instance->headerPrefixes(); + + foreach (const QString &name, baseNames) { + foreach (const QString &prefix, isHeader ? headerPrefixes : sourcePrefixes) { + if (name.startsWith(prefix)) { + QString nameWithoutPrefix = name.mid(prefix.size()); + result += nameWithoutPrefix; + foreach (const QString &prefix, isHeader ? sourcePrefixes : headerPrefixes) + result += prefix + nameWithoutPrefix; + } + } + foreach (const QString &prefix, isHeader ? sourcePrefixes : headerPrefixes) + result += prefix + name; + + } + return result; +} + static QStringList baseDirWithAllDirectories(const QDir &baseDir, const QStringList &directories) { QStringList result; @@ -346,6 +379,8 @@ QString correspondingHeaderOrSource(const QString &fileName, bool *wasHeader) : m_instance->headerSearchPaths(); candidateDirs += baseDirWithAllDirectories(absoluteDir, searchPaths); + candidateFileNames += baseNamesWithAllPrefixes(candidateFileNames, isHeader); + // Try to find a file in the same or sibling directories first foreach (const QString &candidateDir, candidateDirs) { foreach (const QString &candidateFileName, candidateFileNames) { diff --git a/src/plugins/cpptools/cpptoolsplugin.h b/src/plugins/cpptools/cpptoolsplugin.h index d99fcb738b7..0f8ab1e6d17 100644 --- a/src/plugins/cpptools/cpptoolsplugin.h +++ b/src/plugins/cpptools/cpptoolsplugin.h @@ -63,6 +63,8 @@ public: static CppToolsPlugin *instance(); static const QStringList &headerSearchPaths(); static const QStringList &sourceSearchPaths(); + static const QStringList &headerPrefixes(); + static const QStringList &sourcePrefixes(); static void clearHeaderSourceCache(); bool initialize(const QStringList &arguments, QString *errorMessage);