From 2daa5c72807324e8c645b834d3e468be2e28c91f Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Mon, 27 Nov 2017 09:45:13 +0100 Subject: [PATCH] Clang: Locator: Add filters for classes, includes, functions Filters are based on symbol query where they are not implemented yet. Change-Id: Id826beaf6bb47a81363c36780d7254a85a9a3cc9 Reviewed-by: Marco Bubke --- .../clangrefactoring-source.pri | 3 +- .../clangrefactoring/clangrefactoring.qbs | 1 + .../clangrefactoringplugin.cpp | 6 ++-- .../clangrefactoring/classesfilter.cpp | 20 ++++++++--- src/plugins/clangrefactoring/classesfilter.h | 6 +++- .../clangrefactoring/functionsfilter.cpp | 20 ++++++++--- .../clangrefactoring/functionsfilter.h | 6 +++- src/plugins/clangrefactoring/include.h | 33 +++++++++++++++++++ .../clangrefactoring/includesfilter.cpp | 20 ++++++++--- src/plugins/clangrefactoring/includesfilter.h | 6 +++- .../qtcreatorclassesfilter.cpp | 7 +++- .../clangrefactoring/qtcreatorclassesfilter.h | 1 + .../qtcreatorfunctionsfilter.cpp | 7 +++- .../qtcreatorfunctionsfilter.h | 1 + .../qtcreatorincludesfilter.cpp | 5 ++- .../qtcreatorincludesfilter.h | 1 + .../clangrefactoring/symbolqueryinterface.h | 4 ++- tests/unit/unittest/classesfilter-test.cpp | 5 ++- tests/unit/unittest/functionsfilter-test.cpp | 5 ++- tests/unit/unittest/includesfilter-test.cpp | 5 ++- 20 files changed, 133 insertions(+), 29 deletions(-) create mode 100644 src/plugins/clangrefactoring/include.h diff --git a/src/plugins/clangrefactoring/clangrefactoring-source.pri b/src/plugins/clangrefactoring/clangrefactoring-source.pri index f0590826840..1b4b5e8c67d 100644 --- a/src/plugins/clangrefactoring/clangrefactoring-source.pri +++ b/src/plugins/clangrefactoring/clangrefactoring-source.pri @@ -22,7 +22,8 @@ HEADERS += \ $$PWD/symbol.h \ $$PWD/class.h \ $$PWD/enum.h \ - $$PWD/function.h + $$PWD/function.h \ + $$PWD/include.h SOURCES += \ $$PWD/clangqueryexamplehighlighter.cpp \ diff --git a/src/plugins/clangrefactoring/clangrefactoring.qbs b/src/plugins/clangrefactoring/clangrefactoring.qbs index 7ae7ab659f8..1d682d6e687 100644 --- a/src/plugins/clangrefactoring/clangrefactoring.qbs +++ b/src/plugins/clangrefactoring/clangrefactoring.qbs @@ -59,6 +59,7 @@ QtcPlugin { "function.h", "functionsfilter.cpp", "functionsfilter.h", + "include.h", "includesfilter.cpp", "includesfilter.h", "locatorfilter.cpp", diff --git a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp index 9dbbbf30072..f2b676853ad 100644 --- a/src/plugins/clangrefactoring/clangrefactoringplugin.cpp +++ b/src/plugins/clangrefactoring/clangrefactoringplugin.cpp @@ -173,9 +173,9 @@ void ClangRefactoringPlugin::initializeFilters() CppTools::CppModelManager *modelManager = CppTools::CppModelManager::instance(); modelManager->setLocatorFilter(std::make_unique(d->symbolQuery)); - modelManager->setClassesFilter(std::make_unique()); - modelManager->setIncludesFilter(std::make_unique()); - modelManager->setFunctionsFilter(std::make_unique()); + modelManager->setClassesFilter(std::make_unique(d->symbolQuery)); + modelManager->setIncludesFilter(std::make_unique(d->symbolQuery)); + modelManager->setFunctionsFilter(std::make_unique(d->symbolQuery)); modelManager->setSymbolsFindFilter(std::make_unique()); } diff --git a/src/plugins/clangrefactoring/classesfilter.cpp b/src/plugins/clangrefactoring/classesfilter.cpp index 11ea4fb6ab5..fb8a229afbb 100644 --- a/src/plugins/clangrefactoring/classesfilter.cpp +++ b/src/plugins/clangrefactoring/classesfilter.cpp @@ -27,9 +27,12 @@ #include +#include + namespace ClangRefactoring { -ClassesFilter::ClassesFilter() +ClassesFilter::ClassesFilter(SymbolQueryInterface &symbolQuery) + : m_symbolQuery(symbolQuery) { setId(CppTools::Constants::CLASSES_FILTER_ID); setDisplayName(CppTools::Constants::CLASSES_FILTER_DISPLAY_NAME); @@ -38,19 +41,26 @@ ClassesFilter::ClassesFilter() } QList ClassesFilter::matchesFor( - QFutureInterface &, const QString &) + QFutureInterface &, const QString &entry) { - return QList(); + using EntryList = QList; + const SymbolString entryString(entry); + const Classes classes = m_symbolQuery.symbolsContaining(SymbolType::Class, entryString); + return Utils::transform(classes, [this](const Class &classInfo) { + Core::LocatorFilterEntry entry{this, + classInfo.name.toQString(), + qVariantFromValue(classInfo)}; + entry.extraInfo = classInfo.path.path().toQString(); + return entry; + }); } void ClassesFilter::accept(Core::LocatorFilterEntry, QString *, int *, int *) const { - } void ClassesFilter::refresh(QFutureInterface &) { - } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/classesfilter.h b/src/plugins/clangrefactoring/classesfilter.h index 6d994286f8d..00f827dff8d 100644 --- a/src/plugins/clangrefactoring/classesfilter.h +++ b/src/plugins/clangrefactoring/classesfilter.h @@ -25,6 +25,8 @@ #pragma once +#include "symbolqueryinterface.h" + #include namespace ClangRefactoring { @@ -33,13 +35,15 @@ class ClassesFilter : public Core::ILocatorFilter { Q_OBJECT public: - ClassesFilter(); + ClassesFilter(SymbolQueryInterface &symbolQuery); QList matchesFor(QFutureInterface &future, const QString &entry) override; void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; void refresh(QFutureInterface &future) override; +private: + SymbolQueryInterface &m_symbolQuery; }; } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/functionsfilter.cpp b/src/plugins/clangrefactoring/functionsfilter.cpp index a4a8a6f7a68..4383b0eff0a 100644 --- a/src/plugins/clangrefactoring/functionsfilter.cpp +++ b/src/plugins/clangrefactoring/functionsfilter.cpp @@ -27,9 +27,12 @@ #include +#include + namespace ClangRefactoring { -FunctionsFilter::FunctionsFilter() +FunctionsFilter::FunctionsFilter(SymbolQueryInterface &symbolQuery) + : m_symbolQuery(symbolQuery) { setId(CppTools::Constants::FUNCTIONS_FILTER_ID); setDisplayName(CppTools::Constants::FUNCTIONS_FILTER_DISPLAY_NAME); @@ -38,19 +41,26 @@ FunctionsFilter::FunctionsFilter() } QList FunctionsFilter::matchesFor( - QFutureInterface &, const QString &) + QFutureInterface &, const QString &entry) { - return QList(); + using EntryList = QList; + const SymbolString entryString(entry); + const Functions functions = m_symbolQuery.functionsContaining(entryString); + return Utils::transform(functions, [this](const Function &function) { + const auto data = qVariantFromValue(static_cast(function)); + Core::LocatorFilterEntry entry{this, function.name.toQString(), data}; + entry.extraInfo = function.path.path().toQString(); + return entry; + }); } void FunctionsFilter::accept(Core::LocatorFilterEntry, QString *, int *, int *) const { - } void FunctionsFilter::refresh(QFutureInterface &) { - } + } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/functionsfilter.h b/src/plugins/clangrefactoring/functionsfilter.h index 95454915a9d..6844350e2c3 100644 --- a/src/plugins/clangrefactoring/functionsfilter.h +++ b/src/plugins/clangrefactoring/functionsfilter.h @@ -25,6 +25,8 @@ #pragma once +#include "symbolqueryinterface.h" + #include namespace ClangRefactoring { @@ -33,13 +35,15 @@ class FunctionsFilter : public Core::ILocatorFilter { Q_OBJECT public: - FunctionsFilter(); + FunctionsFilter(SymbolQueryInterface &symbolQuery); QList matchesFor(QFutureInterface &future, const QString &entry) override; void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; void refresh(QFutureInterface &future) override; +private: + SymbolQueryInterface &m_symbolQuery; }; } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/include.h b/src/plugins/clangrefactoring/include.h new file mode 100644 index 00000000000..6f6bc9ebe4b --- /dev/null +++ b/src/plugins/clangrefactoring/include.h @@ -0,0 +1,33 @@ +/**************************************************************************** +** +** Copyright (C) 2018 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** 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 The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include "symbol.h" + +namespace ClangRefactoring { +using Include = Symbol; +using Includes = std::vector; +} // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/includesfilter.cpp b/src/plugins/clangrefactoring/includesfilter.cpp index 50c8a3e957f..f7a586b3126 100644 --- a/src/plugins/clangrefactoring/includesfilter.cpp +++ b/src/plugins/clangrefactoring/includesfilter.cpp @@ -27,9 +27,12 @@ #include +#include + namespace ClangRefactoring { -IncludesFilter::IncludesFilter() +IncludesFilter::IncludesFilter(SymbolQueryInterface &symbolQuery) + : m_symbolQuery(symbolQuery) { setId(CppTools::Constants::INCLUDES_FILTER_ID); setDisplayName(CppTools::Constants::INCLUDES_FILTER_DISPLAY_NAME); @@ -39,19 +42,26 @@ IncludesFilter::IncludesFilter() } QList IncludesFilter::matchesFor( - QFutureInterface &, const QString &) + QFutureInterface &, const QString &entry) { - return QList(); + using EntryList = QList; + const SymbolString entryString(entry); + const Includes includes = m_symbolQuery.symbolsContaining(SymbolType::Include, entryString); + return Utils::transform(includes, [this](const Include &includeInfo) { + Core::LocatorFilterEntry entry{this, + includeInfo.name.toQString(), + qVariantFromValue(includeInfo)}; + entry.extraInfo = includeInfo.path.path().toQString(); + return entry; + }); } void IncludesFilter::accept(Core::LocatorFilterEntry, QString *, int *, int *) const { - } void IncludesFilter::refresh(QFutureInterface &) { - } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/includesfilter.h b/src/plugins/clangrefactoring/includesfilter.h index 23185660c92..e28608dc4fa 100644 --- a/src/plugins/clangrefactoring/includesfilter.h +++ b/src/plugins/clangrefactoring/includesfilter.h @@ -25,6 +25,8 @@ #pragma once +#include "symbolqueryinterface.h" + #include namespace ClangRefactoring { @@ -33,13 +35,15 @@ class IncludesFilter : public Core::ILocatorFilter { Q_OBJECT public: - IncludesFilter(); + IncludesFilter(SymbolQueryInterface &symbolQuery); QList matchesFor(QFutureInterface &future, const QString &entry) override; void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; void refresh(QFutureInterface &future) override; +private: + SymbolQueryInterface &m_symbolQuery; }; } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/qtcreatorclassesfilter.cpp b/src/plugins/clangrefactoring/qtcreatorclassesfilter.cpp index 289b673ccc3..3e1c9899e49 100644 --- a/src/plugins/clangrefactoring/qtcreatorclassesfilter.cpp +++ b/src/plugins/clangrefactoring/qtcreatorclassesfilter.cpp @@ -25,11 +25,16 @@ #include "qtcreatorclassesfilter.h" +#include + namespace ClangRefactoring { -void QtcreatorClassesFilter::accept(Core::LocatorFilterEntry, +void QtcreatorClassesFilter::accept(Core::LocatorFilterEntry selection, QString *, int *, int *) const { + auto info = qvariant_cast(selection.internalData); + Core::EditorManager::openEditorAt(info.path.path().toQString(), info.lineColumn.line, + info.lineColumn.column); } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/qtcreatorclassesfilter.h b/src/plugins/clangrefactoring/qtcreatorclassesfilter.h index ed9ea5f4dde..96cac20ff2d 100644 --- a/src/plugins/clangrefactoring/qtcreatorclassesfilter.h +++ b/src/plugins/clangrefactoring/qtcreatorclassesfilter.h @@ -33,6 +33,7 @@ class QtcreatorClassesFilter : public ClassesFilter { Q_OBJECT public: + QtcreatorClassesFilter(SymbolQueryInterface &symbolQuery) : ClassesFilter(symbolQuery) {} void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; }; diff --git a/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.cpp b/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.cpp index 3896a744ef6..6a5a7938ce3 100644 --- a/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.cpp +++ b/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.cpp @@ -25,11 +25,16 @@ #include "qtcreatorfunctionsfilter.h" +#include + namespace ClangRefactoring { -void QtcreatorFunctionsFilter::accept(Core::LocatorFilterEntry, +void QtcreatorFunctionsFilter::accept(Core::LocatorFilterEntry selection, QString *, int *, int *) const { + auto info = qvariant_cast(selection.internalData); + Core::EditorManager::openEditorAt(info.path.path().toQString(), info.lineColumn.line, + info.lineColumn.column); } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.h b/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.h index 578c925e257..8c60db81d4a 100644 --- a/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.h +++ b/src/plugins/clangrefactoring/qtcreatorfunctionsfilter.h @@ -33,6 +33,7 @@ class QtcreatorFunctionsFilter : public FunctionsFilter { Q_OBJECT public: + QtcreatorFunctionsFilter(SymbolQueryInterface &symbolQuery) : FunctionsFilter(symbolQuery) {} void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; }; diff --git a/src/plugins/clangrefactoring/qtcreatorincludesfilter.cpp b/src/plugins/clangrefactoring/qtcreatorincludesfilter.cpp index 4980dc7f627..0acf39d02e6 100644 --- a/src/plugins/clangrefactoring/qtcreatorincludesfilter.cpp +++ b/src/plugins/clangrefactoring/qtcreatorincludesfilter.cpp @@ -25,11 +25,14 @@ #include "qtcreatorincludesfilter.h" +#include + namespace ClangRefactoring { -void QtcreatorIncludesFilter::accept(Core::LocatorFilterEntry, +void QtcreatorIncludesFilter::accept(Core::LocatorFilterEntry selection, QString *, int *, int *) const { + Core::EditorManager::openEditorAt(selection.displayName, 1, 1); } } // namespace ClangRefactoring diff --git a/src/plugins/clangrefactoring/qtcreatorincludesfilter.h b/src/plugins/clangrefactoring/qtcreatorincludesfilter.h index 35f3f2f20ed..3c28f0eed89 100644 --- a/src/plugins/clangrefactoring/qtcreatorincludesfilter.h +++ b/src/plugins/clangrefactoring/qtcreatorincludesfilter.h @@ -33,6 +33,7 @@ class QtcreatorIncludesFilter : public IncludesFilter { Q_OBJECT public: + QtcreatorIncludesFilter(SymbolQueryInterface &symbolQuery) : IncludesFilter(symbolQuery) {} void accept(Core::LocatorFilterEntry selection, QString *newText, int *selectionStart, int *selectionLength) const override; }; diff --git a/src/plugins/clangrefactoring/symbolqueryinterface.h b/src/plugins/clangrefactoring/symbolqueryinterface.h index 91d47fa4ac8..af8567d302e 100644 --- a/src/plugins/clangrefactoring/symbolqueryinterface.h +++ b/src/plugins/clangrefactoring/symbolqueryinterface.h @@ -30,6 +30,7 @@ #include "class.h" #include "enum.h" #include "function.h" +#include "include.h" #include "symbol.h" #include @@ -39,7 +40,8 @@ namespace ClangRefactoring { enum class SymbolType { Class = 0, - Enum = 1 + Enum = 1, + Include = 2 }; class SymbolQueryInterface diff --git a/tests/unit/unittest/classesfilter-test.cpp b/tests/unit/unittest/classesfilter-test.cpp index f43ac7b3c1d..82b62cb19fc 100644 --- a/tests/unit/unittest/classesfilter-test.cpp +++ b/tests/unit/unittest/classesfilter-test.cpp @@ -25,6 +25,8 @@ #include "googletest.h" +#include "mocksymbolquery.h" + #include namespace { @@ -32,7 +34,8 @@ namespace { class ClassesFilter : public ::testing::Test { protected: - ClangRefactoring::ClassesFilter classesFilter; + MockSymbolQuery mockSymbolQuery; + ClangRefactoring::ClassesFilter classesFilter {mockSymbolQuery}; }; TEST_F(ClassesFilter, MatchesFor) diff --git a/tests/unit/unittest/functionsfilter-test.cpp b/tests/unit/unittest/functionsfilter-test.cpp index 77a6e4dbc47..62dfe08c103 100644 --- a/tests/unit/unittest/functionsfilter-test.cpp +++ b/tests/unit/unittest/functionsfilter-test.cpp @@ -25,6 +25,8 @@ #include "googletest.h" +#include "mocksymbolquery.h" + #include namespace { @@ -32,7 +34,8 @@ namespace { class FunctionsFilter : public ::testing::Test { protected: - ClangRefactoring::FunctionsFilter functionsFilter; + MockSymbolQuery mockSymbolQuery; + ClangRefactoring::FunctionsFilter functionsFilter {mockSymbolQuery}; }; TEST_F(FunctionsFilter, MatchesFor) diff --git a/tests/unit/unittest/includesfilter-test.cpp b/tests/unit/unittest/includesfilter-test.cpp index 084d0fdd2e7..2ea30757602 100644 --- a/tests/unit/unittest/includesfilter-test.cpp +++ b/tests/unit/unittest/includesfilter-test.cpp @@ -25,6 +25,8 @@ #include "googletest.h" +#include "mocksymbolquery.h" + #include namespace { @@ -32,7 +34,8 @@ namespace { class IncludesFilter : public ::testing::Test { protected: - ClangRefactoring::IncludesFilter includesFilter; + MockSymbolQuery mockSymbolQuery; + ClangRefactoring::IncludesFilter includesFilter {mockSymbolQuery}; }; TEST_F(IncludesFilter, MatchesFor)