From 73320a43d1891a28d193fedd5768a820896af92a Mon Sep 17 00:00:00 2001 From: Roberto Raggi <roberto.raggi@nokia.com> Date: Mon, 5 Oct 2009 15:17:25 +0200 Subject: [PATCH] Added `Find Usages' of a Symbol. --- src/plugins/cppeditor/cppeditor.cpp | 20 ++++++++++++++++--- src/plugins/cppeditor/cppeditor.h | 3 ++- src/plugins/cppeditor/cppeditorconstants.h | 1 + src/plugins/cppeditor/cppplugin.cpp | 14 +++++++++++++ src/plugins/cppeditor/cppplugin.h | 1 + src/plugins/cpptools/cppfindreferences.cpp | 13 +++++++++++- src/plugins/cpptools/cppfindreferences.h | 6 +++++- src/plugins/cpptools/cppmodelmanager.cpp | 10 ++++++++-- src/plugins/cpptools/cppmodelmanager.h | 3 ++- .../cpptools/cppmodelmanagerinterface.h | 3 ++- 10 files changed, 64 insertions(+), 10 deletions(-) diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 4dd62e22e09..b03e4ca3461 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -862,7 +862,21 @@ CPlusPlus::Symbol *CPPEditor::findCanonicalSymbol(const QTextCursor &cursor, return canonicalSymbol; } -void CPPEditor::findReferences() + +void CPPEditor::findUsages() +{ + updateSemanticInfo(m_semanticHighlighter->semanticInfo(currentSource())); + + SemanticInfo info = m_lastSemanticInfo; + + if (! info.doc) + return; + + if (Symbol *canonicalSymbol = findCanonicalSymbol(textCursor(), info.doc, info.snapshot)) + m_modelManager->findUsages(canonicalSymbol); +} + +void CPPEditor::renameUsages() { m_currentRenameSelection = -1; @@ -896,7 +910,7 @@ void CPPEditor::findReferences() setExtraSelections(CodeSemanticsSelection, selections); - m_modelManager->findReferences(canonicalSymbol); + m_modelManager->renameUsages(canonicalSymbol); } } } @@ -920,7 +934,7 @@ void CPPEditor::renameSymbolUnderCursor() } if (m_renameSelections.isEmpty()) - findReferences(); + renameUsages(); } void CPPEditor::onContentsChanged(int position, int charsRemoved, int charsAdded) diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index 5f544cfbbdf..6c853672bfe 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -197,7 +197,8 @@ public Q_SLOTS: void switchDeclarationDefinition(); void jumpToDefinition(); void renameSymbolUnderCursor(); - void findReferences(); + void renameUsages(); + void findUsages(); void moveToPreviousToken(); void moveToNextToken(); diff --git a/src/plugins/cppeditor/cppeditorconstants.h b/src/plugins/cppeditor/cppeditorconstants.h index 24d1504caf7..356f711ba9e 100644 --- a/src/plugins/cppeditor/cppeditorconstants.h +++ b/src/plugins/cppeditor/cppeditorconstants.h @@ -39,6 +39,7 @@ const char * const C_CPPEDITOR = "C++ Editor"; const char * const CPPEDITOR_KIND = QT_TRANSLATE_NOOP("OpenWith::Editors", "C++ Editor"); const char * const SWITCH_DECLARATION_DEFINITION = "CppEditor.SwitchDeclarationDefinition"; const char * const RENAME_SYMBOL_UNDER_CURSOR = "CppEditor.RenameSymbolUnderCursor"; +const char * const FIND_USAGES = "CppEditor.FindUsages"; const char * const SEPARATOR = "CppEditor.Separator"; const char * const FIND_REFERENCES = "CppEditor.FindReferences"; const char * const JUMP_TO_DEFINITION = "CppEditor.JumpToDefinition"; diff --git a/src/plugins/cppeditor/cppplugin.cpp b/src/plugins/cppeditor/cppplugin.cpp index d1c8d89b001..bd65c32666c 100644 --- a/src/plugins/cppeditor/cppplugin.cpp +++ b/src/plugins/cppeditor/cppplugin.cpp @@ -212,6 +212,12 @@ bool CppPlugin::initialize(const QStringList & /*arguments*/, QString *errorMess contextMenu->addAction(cmd); am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + QAction *findUsagesAction = new QAction(tr("Find Usages"), this); + cmd = am->registerAction(findUsagesAction, Constants::FIND_USAGES, context); + connect(findUsagesAction, SIGNAL(triggered()), this, SLOT(findUsages())); + contextMenu->addAction(cmd); + am->actionContainer(CppTools::Constants::M_TOOLS_CPP)->addAction(cmd); + QAction *renameSymbolUnderCursorAction = new QAction(tr("Rename Symbol under Cursor"), this); cmd = am->registerAction(renameSymbolUnderCursorAction, Constants::RENAME_SYMBOL_UNDER_CURSOR, context); @@ -286,4 +292,12 @@ void CppPlugin::renameSymbolUnderCursor() editor->renameSymbolUnderCursor(); } +void CppPlugin::findUsages() +{ + Core::EditorManager *em = Core::EditorManager::instance(); + CPPEditor *editor = qobject_cast<CPPEditor*>(em->currentEditor()->widget()); + if (editor) + editor->findUsages(); +} + Q_EXPORT_PLUGIN(CppPlugin) diff --git a/src/plugins/cppeditor/cppplugin.h b/src/plugins/cppeditor/cppplugin.h index 9d46a981f1b..6437f6e2410 100644 --- a/src/plugins/cppeditor/cppplugin.h +++ b/src/plugins/cppeditor/cppplugin.h @@ -74,6 +74,7 @@ private slots: void switchDeclarationDefinition(); void jumpToDefinition(); void renameSymbolUnderCursor(); + void findUsages(); private: Core::IEditor *createEditor(QWidget *parent); diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 78eaea92d6b..c0b8d92d9d3 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -532,10 +532,21 @@ static void find_helper(QFutureInterface<Utils::FileSearchResult> &future, future.setProgressValue(files.size()); } -void CppFindReferences::findAll(Symbol *symbol) +void CppFindReferences::findUsages(Symbol *symbol) +{ + _resultWindow->clearContents(); + findAll_helper(symbol); +} + +void CppFindReferences::renameUsages(Symbol *symbol) { _resultWindow->clearContents(); _resultWindow->setShowReplaceUI(true); + findAll_helper(symbol); +} + +void CppFindReferences::findAll_helper(Symbol *symbol) +{ _resultWindow->popup(true); const Snapshot snapshot = _modelManager->snapshot(); diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h index f3dd51c4bcf..81dc0e659f1 100644 --- a/src/plugins/cpptools/cppfindreferences.h +++ b/src/plugins/cpptools/cppfindreferences.h @@ -62,13 +62,17 @@ Q_SIGNALS: void changed(); public: - void findAll(CPlusPlus::Symbol *symbol); + void findUsages(CPlusPlus::Symbol *symbol); + void renameUsages(CPlusPlus::Symbol *symbol); private Q_SLOTS: void displayResult(int); void searchFinished(); void openEditor(const QString&, int, int); +private: + void findAll_helper(CPlusPlus::Symbol *symbol); + private: QPointer<CppModelManager> _modelManager; Find::SearchResultWindow *_resultWindow; diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index 4d5f0bd2c4d..56e7b1d48f5 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -755,10 +755,16 @@ QList<int> CppModelManager::references(CPlusPlus::Symbol *symbol, return m_findReferences->references(LookupContext::canonicalSymbol(symbol), doc, snapshot); } -void CppModelManager::findReferences(CPlusPlus::Symbol *symbol) +void CppModelManager::findUsages(CPlusPlus::Symbol *symbol) { if (symbol->identifier()) - m_findReferences->findAll(symbol); + m_findReferences->findUsages(symbol); +} + +void CppModelManager::renameUsages(CPlusPlus::Symbol *symbol) +{ + if (symbol->identifier()) + m_findReferences->renameUsages(symbol); } QMap<QString, QString> CppModelManager::buildWorkingCopyList() diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 0f6911f97fe..9aa3a800b2c 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -106,7 +106,8 @@ public: CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot); - virtual void findReferences(CPlusPlus::Symbol *symbol); + virtual void findUsages(CPlusPlus::Symbol *symbol); + virtual void renameUsages(CPlusPlus::Symbol *symbol); void setHeaderSuffixes(const QStringList &suffixes) { m_headerSuffixes = suffixes; } diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h index 4bb7a109cb4..58b04d4bf57 100644 --- a/src/plugins/cpptools/cppmodelmanagerinterface.h +++ b/src/plugins/cpptools/cppmodelmanagerinterface.h @@ -101,7 +101,8 @@ public: CPlusPlus::Document::Ptr doc, const CPlusPlus::Snapshot &snapshot) = 0; - virtual void findReferences(CPlusPlus::Symbol *symbol) = 0; + virtual void renameUsages(CPlusPlus::Symbol *symbol) = 0; + virtual void findUsages(CPlusPlus::Symbol *symbol) = 0; }; class CPPTOOLS_EXPORT AbstractEditorSupport -- GitLab