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