summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-26 18:17:52 +0200
committerNikolai Kosjar <nikolai.kosjar@digia.com>2013-08-29 08:27:53 +0200
commita06da47d5b74f9d680b2201e218c1df87f023faa (patch)
tree1ee4a01dc77978050302affb1d7259b9d5590511
parent853fcf3c437551ea010cce6404bbd47b07c30245 (diff)
downloadqt-creator-a06da47d5b74f9d680b2201e218c1df87f023faa.tar.gz
Locator: Allow to filter for path in BaseFileFilter
If the input contains a path separator, the input is matched against the file path. Otherwise, as before, the input is matched against the file name. This affects AllProjectsFilter, CurrentProjectFilter and DirectoryFilter. Usage Examples: "src/*main.cpp" "cppedtior/" Change-Id: I8bc55642b388a8f8e1d7a949f80bbe1abc41ae3c Reviewed-by: hjk <hjk121@nokiamail.com>
-rw-r--r--src/plugins/locator/basefilefilter.cpp15
-rw-r--r--src/plugins/locator/locator.pro5
-rw-r--r--src/plugins/locator/locator.qbs4
-rw-r--r--src/plugins/locator/locator_test.cpp178
-rw-r--r--src/plugins/locator/locatorfiltertest.cpp12
-rw-r--r--src/plugins/locator/locatorfiltertest.h12
-rw-r--r--src/plugins/locator/locatorplugin.h5
-rw-r--r--tests/locators/testdata_basic/file.cpp1
-rw-r--r--tests/locators/testdata_basic/main.cpp1
-rw-r--r--tests/locators/testdata_basic/subdir/main.cpp1
10 files changed, 217 insertions, 17 deletions
diff --git a/src/plugins/locator/basefilefilter.cpp b/src/plugins/locator/basefilefilter.cpp
index b04d631c91..bfe10a8cd6 100644
--- a/src/plugins/locator/basefilefilter.cpp
+++ b/src/plugins/locator/basefilefilter.cpp
@@ -56,10 +56,16 @@ QList<FilterEntry> BaseFileFilter::matchesFor(QFutureInterface<Locator::FilterEn
QRegExp regexp(asterisk + needle+ asterisk, Qt::CaseInsensitive, QRegExp::Wildcard);
if (!regexp.isValid())
return betterEntries;
+ const QChar pathSeparator = QDir::separator();
+ const bool hasPathSeparator = needle.contains(pathSeparator);
const bool hasWildcard = needle.contains(asterisk) || needle.contains(QLatin1Char('?'));
QStringList searchListPaths;
QStringList searchListNames;
- if (!m_previousEntry.isEmpty() && !m_forceNewSearchList && needle.contains(m_previousEntry)) {
+ const bool containsPreviousEntry = !m_previousEntry.isEmpty()
+ && needle.contains(m_previousEntry);
+ const bool pathSeparatorAdded = !m_previousEntry.contains(pathSeparator)
+ && needle.contains(pathSeparator);
+ if (!m_forceNewSearchList && containsPreviousEntry && !pathSeparatorAdded) {
searchListPaths = m_previousResultPaths;
searchListNames = m_previousResultNames;
} else {
@@ -79,13 +85,14 @@ QList<FilterEntry> BaseFileFilter::matchesFor(QFutureInterface<Locator::FilterEn
QString path = paths.next();
QString name = names.next();
- if ((hasWildcard && regexp.exactMatch(name))
- || (!hasWildcard && matcher.indexIn(name) != -1)) {
+ QString matchText = hasPathSeparator ? path : name;
+ if ((hasWildcard && regexp.exactMatch(matchText))
+ || (!hasWildcard && matcher.indexIn(matchText) != -1)) {
QFileInfo fi(path);
FilterEntry entry(this, fi.fileName(), QString(path + lineNoSuffix));
entry.extraInfo = FileUtils::shortNativePath(FileName(fi));
entry.fileName = path;
- if (name.startsWith(needle, caseSensitivityForPrefix))
+ if (matchText.startsWith(needle, caseSensitivityForPrefix))
betterEntries.append(entry);
else
goodEntries.append(entry);
diff --git a/src/plugins/locator/locator.pro b/src/plugins/locator/locator.pro
index fa3816584f..69c237599b 100644
--- a/src/plugins/locator/locator.pro
+++ b/src/plugins/locator/locator.pro
@@ -36,5 +36,8 @@ RESOURCES += locator.qrc
equals(TEST, 1) {
HEADERS += locatorfiltertest.h
- SOURCES += locatorfiltertest.cpp
+ SOURCES += \
+ locatorfiltertest.cpp \
+ locator_test.cpp
+ DEFINES += SRCDIR=\\\"$$PWD\\\"
}
diff --git a/src/plugins/locator/locator.qbs b/src/plugins/locator/locator.qbs
index 90d761bd0a..a40de132f2 100644
--- a/src/plugins/locator/locator.qbs
+++ b/src/plugins/locator/locator.qbs
@@ -1,4 +1,5 @@
import qbs.base 1.0
+import qbs.FileInfo
import "../QtcPlugin.qbs" as QtcPlugin
import "../../../qbs/defaults.js" as Defaults
@@ -59,6 +60,9 @@ QtcPlugin {
files: [
"locatorfiltertest.cpp",
"locatorfiltertest.h",
+ "locator_test.cpp"
]
+
+ cpp.defines: outer.concat(['SRCDIR="' + FileInfo.path(filePath) + '"'])
}
}
diff --git a/src/plugins/locator/locator_test.cpp b/src/plugins/locator/locator_test.cpp
new file mode 100644
index 0000000000..38b1287b82
--- /dev/null
+++ b/src/plugins/locator/locator_test.cpp
@@ -0,0 +1,178 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia. For licensing terms and
+** conditions see http://qt.digia.com/licensing. For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights. These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+****************************************************************************/
+
+
+#include "locatorplugin.h"
+
+#include "basefilefilter.h"
+#include "locatorfiltertest.h"
+
+#include <coreplugin/testdatadir.h>
+#include <utils/fileutils.h>
+
+#include <QDir>
+#include <QTextStream>
+#include <QtTest>
+
+using namespace Locator::Internal::Tests;
+
+namespace {
+
+class MyTestDataDir : public Core::Internal::Tests::TestDataDir
+{
+public:
+ MyTestDataDir(const QString &testDataDirectory)
+ : TestDataDir(QLatin1String(SRCDIR "/../../../tests/locators/") + testDataDirectory) {}
+};
+
+class MyBaseFileFilter : public Locator::BaseFileFilter
+{
+public:
+ MyBaseFileFilter(const QStringList &theFiles)
+ {
+ files().clear();
+ files().append(theFiles);
+ BaseFileFilter::generateFileNames();
+ }
+
+ void refresh(QFutureInterface<void> &) {}
+
+protected:
+ void updateFiles() {}
+};
+
+inline QString _(const QByteArray &ba) { return QString::fromLatin1(ba, ba.size()); }
+
+class ReferenceData
+{
+public:
+ ReferenceData() {}
+ ReferenceData(const QString &searchText, const ResultDataList &results)
+ : searchText(searchText), results(results) {}
+
+ QString searchText;
+ ResultDataList results;
+};
+
+} // anonymous namespace
+
+Q_DECLARE_METATYPE(ReferenceData)
+Q_DECLARE_METATYPE(QList<ReferenceData>)
+
+void Locator::Internal::LocatorPlugin::test_basefilefilter()
+{
+ QFETCH(QStringList, testFiles);
+ QFETCH(QList<ReferenceData>, referenceDataList);
+
+ MyBaseFileFilter filter(testFiles);
+ BasicLocatorFilterTest test(&filter);
+
+ foreach (const ReferenceData &reference, referenceDataList) {
+ const QList<FilterEntry> filterEntries = test.matchesFor(reference.searchText);
+ const ResultDataList results = ResultData::fromFilterEntryList(filterEntries);
+// QTextStream(stdout) << "----" << endl;
+// ResultData::printFilterEntries(results);
+ QCOMPARE(results, reference.results);
+ }
+}
+
+void Locator::Internal::LocatorPlugin::test_basefilefilter_data()
+{
+ QTest::addColumn<QStringList>("testFiles");
+ QTest::addColumn<QList<ReferenceData> >("referenceDataList");
+
+ const QChar pathSeparator = QDir::separator();
+ const MyTestDataDir testDir(QLatin1String("testdata_basic"));
+ const QStringList testFiles = QStringList()
+ << testDir.file(QLatin1String("file.cpp"))
+ << testDir.file(QLatin1String("main.cpp"))
+ << testDir.file(QLatin1String("subdir/main.cpp"));
+ QStringList testFilesShort;
+ foreach (const QString &file, testFiles)
+ testFilesShort << Utils::FileUtils::shortNativePath(Utils::FileName::fromString(file));
+
+ QTest::newRow("BaseFileFilter-EmptyInput")
+ << testFiles
+ << (QList<ReferenceData>()
+ << ReferenceData(
+ QString(),
+ (QList<ResultData>()
+ << ResultData(_("file.cpp"), testFilesShort.at(0))
+ << ResultData(_("main.cpp"), testFilesShort.at(1))
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ );
+
+ QTest::newRow("BaseFileFilter-InputIsFileName")
+ << testFiles
+ << (QList<ReferenceData>()
+ << ReferenceData(
+ _("main.cpp"),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(1))
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ );
+
+ QTest::newRow("BaseFileFilter-InputIsFilePath")
+ << testFiles
+ << (QList<ReferenceData>()
+ << ReferenceData(
+ QString(_("subdir") + pathSeparator + _("main.cpp")),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ );
+
+ QTest::newRow("BaseFileFilter-InputIsDirIsPath")
+ << testFiles
+ << (QList<ReferenceData>()
+ << ReferenceData( _("subdir"), QList<ResultData>())
+ << ReferenceData(
+ QString(_("subdir") + pathSeparator + _("main.cpp")),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ );
+
+ QTest::newRow("BaseFileFilter-InputIsFileNameFilePathFileName")
+ << testFiles
+ << (QList<ReferenceData>()
+ << ReferenceData(
+ _("main.cpp"),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(1))
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ << ReferenceData(
+ QString(_("subdir") + pathSeparator + _("main.cpp")),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ << ReferenceData(
+ _("main.cpp"),
+ (QList<ResultData>()
+ << ResultData(_("main.cpp"), testFilesShort.at(1))
+ << ResultData(_("main.cpp"), testFilesShort.at(2))))
+ );
+}
diff --git a/src/plugins/locator/locatorfiltertest.cpp b/src/plugins/locator/locatorfiltertest.cpp
index 692d213ef9..cbc2661b8e 100644
--- a/src/plugins/locator/locatorfiltertest.cpp
+++ b/src/plugins/locator/locatorfiltertest.cpp
@@ -57,6 +57,18 @@ QList<FilterEntry> BasicLocatorFilterTest::matchesFor(const QString &searchText)
return locatorSearch.results();
}
+QT_BEGIN_NAMESPACE
+namespace QTest {
+
+template<> char *toString(const Locator::Internal::Tests::ResultData &data)
+{
+ QByteArray ba = "\"" + data.textColumn1.toUtf8() + "\", \"" + data.textColumn2.toUtf8() + "\"";
+ return qstrdup(ba.data());
+}
+
+} // namespace QTest
+QT_END_NAMESPACE
+
ResultData::ResultData()
{
}
diff --git a/src/plugins/locator/locatorfiltertest.h b/src/plugins/locator/locatorfiltertest.h
index 9bd1d89b9d..950d94d6d1 100644
--- a/src/plugins/locator/locatorfiltertest.h
+++ b/src/plugins/locator/locatorfiltertest.h
@@ -83,16 +83,4 @@ typedef ResultData::ResultDataList ResultDataList;
Q_DECLARE_METATYPE(Locator::Internal::Tests::ResultData)
Q_DECLARE_METATYPE(Locator::Internal::Tests::ResultDataList)
-QT_BEGIN_NAMESPACE
-namespace QTest {
-
-template<> char *toString(const Locator::Internal::Tests::ResultData &data)
-{
- QByteArray ba = "\"" + data.textColumn1.toUtf8() + "\", \"" + data.textColumn2.toUtf8() + "\"";
- return qstrdup(ba.data());
-}
-
-} // namespace QTest
-QT_END_NAMESPACE
-
#endif // LOCATORFILTERTEST_H
diff --git a/src/plugins/locator/locatorplugin.h b/src/plugins/locator/locatorplugin.h
index 2fee039b02..b30e224b08 100644
--- a/src/plugins/locator/locatorplugin.h
+++ b/src/plugins/locator/locatorplugin.h
@@ -81,6 +81,11 @@ public slots:
private slots:
void updatePlaceholderText(Core::Command *command = 0);
+#ifdef WITH_TESTS
+ void test_basefilefilter();
+ void test_basefilefilter_data();
+#endif
+
private:
void loadSettings();
diff --git a/tests/locators/testdata_basic/file.cpp b/tests/locators/testdata_basic/file.cpp
new file mode 100644
index 0000000000..2db0756354
--- /dev/null
+++ b/tests/locators/testdata_basic/file.cpp
@@ -0,0 +1 @@
+// Copyright header
diff --git a/tests/locators/testdata_basic/main.cpp b/tests/locators/testdata_basic/main.cpp
new file mode 100644
index 0000000000..2db0756354
--- /dev/null
+++ b/tests/locators/testdata_basic/main.cpp
@@ -0,0 +1 @@
+// Copyright header
diff --git a/tests/locators/testdata_basic/subdir/main.cpp b/tests/locators/testdata_basic/subdir/main.cpp
new file mode 100644
index 0000000000..2db0756354
--- /dev/null
+++ b/tests/locators/testdata_basic/subdir/main.cpp
@@ -0,0 +1 @@
+// Copyright header