diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp index 78336077ae88c4bbfb877f586e90702e846f2f92..da69d192361a592e90f4b1747d436034a207da0e 100644 --- a/src/plugins/cppeditor/cppeditor.cpp +++ b/src/plugins/cppeditor/cppeditor.cpp @@ -830,11 +830,11 @@ void CPPEditor::reformatDocument() c.insertText(QString::fromUtf8(str.c_str(), str.length())); } -void CPPEditor::findReferences() +CPlusPlus::Symbol *CPPEditor::findCanonicalSymbol(const QTextCursor &cursor, + Document::Ptr doc, + const Snapshot &snapshot) const { - QTextCursor tc = textCursor(); - m_currentRenameSelection = -1; - + QTextCursor tc = cursor; int line, col; convertPosition(tc.position(), &line, &col); ++col; @@ -843,10 +843,9 @@ void CPPEditor::findReferences() ExpressionUnderCursor expressionUnderCursor; const QString code = expressionUnderCursor(tc); - qDebug() << "code:" << code; + // qDebug() << "code:" << code; - Snapshot snapshot = m_modelManager->snapshot(); - Document::Ptr doc = snapshot.value(file()->fileName()); + const QString fileName = const_cast<CPPEditor *>(this)->file()->fileName(); TypeOfExpression typeOfExpression; typeOfExpression.setSnapshot(snapshot); @@ -857,8 +856,46 @@ void CPPEditor::findReferences() lastVisibleSymbol, TypeOfExpression::Preprocess); - if (Symbol *canonicalSymbol = LookupContext::canonicalSymbol(results)) { - m_modelManager->findReferences(canonicalSymbol); + Symbol *canonicalSymbol = LookupContext::canonicalSymbol(results); + return canonicalSymbol; +} + +void CPPEditor::findReferences() +{ + m_currentRenameSelection = -1; + + QList<QTextEdit::ExtraSelection> selections; + + SemanticInfo info = m_lastSemanticInfo; + + if (info.doc) { + if (Symbol *canonicalSymbol = findCanonicalSymbol(textCursor(), info.doc, info.snapshot)) { + TranslationUnit *unit = info.doc->translationUnit(); + + const QList<int> references = m_modelManager->references(canonicalSymbol, info.doc, info.snapshot); + foreach (int index, references) { + unsigned line, column; + unit->getTokenPosition(index, &line, &column); + + if (column) + --column; // adjust the column position. + + const int len = unit->tokenAt(index).f.length; + + QTextCursor cursor(document()->findBlockByNumber(line - 1)); + cursor.setPosition(cursor.position() + column); + cursor.setPosition(cursor.position() + len, QTextCursor::KeepAnchor); + + QTextEdit::ExtraSelection sel; + sel.format = m_occurrencesFormat; + sel.cursor = cursor; + selections.append(sel); + } + + setExtraSelections(CodeSemanticsSelection, selections); + + m_modelManager->findReferences(canonicalSymbol); + } } } @@ -2015,7 +2052,7 @@ SemanticInfo SemanticHighlighter::semanticInfo(const Source &source) doc = source.snapshot.documentFromSource(preprocessedCode, source.fileName); doc->check(); - snapshot = source.snapshot.simplified(doc); + snapshot = source.snapshot; } Control *control = doc->control(); diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h index cea326ffedf2e631ec7dfa311f11c8d3c4653204..5f544cfbbdfa43261fec6e0f91883ada6e5f8154 100644 --- a/src/plugins/cppeditor/cppeditor.h +++ b/src/plugins/cppeditor/cppeditor.h @@ -223,6 +223,10 @@ protected: bool isInComment(const QTextCursor &cursor) const; + CPlusPlus::Symbol *findCanonicalSymbol(const QTextCursor &cursor, + CPlusPlus::Document::Ptr doc, + const CPlusPlus::Snapshot &snapshot) const; + private Q_SLOTS: void updateFileName(); void jumpToMethod(int index); diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp index 3fa8a3116526e81d87706945a7f518c3495ad4f8..8489b0c9092b31d26f3dda697e73b9c437a0998f 100644 --- a/src/plugins/cpptools/cppfindreferences.cpp +++ b/src/plugins/cpptools/cppfindreferences.cpp @@ -67,8 +67,8 @@ namespace { struct Process: protected ASTVisitor { public: - Process(QFutureInterface<Core::Utils::FileSearchResult> &future, - Document::Ptr doc, const Snapshot &snapshot) + Process(Document::Ptr doc, const Snapshot &snapshot, + QFutureInterface<Core::Utils::FileSearchResult> *future) : ASTVisitor(doc->control()), _future(future), _doc(doc), @@ -79,12 +79,14 @@ public: _snapshot.insert(_doc); } - void operator()(Symbol *symbol, Identifier *id, AST *ast) + QList<int> operator()(Symbol *symbol, Identifier *id, AST *ast) { + _references.clear(); _declSymbol = symbol; _id = id; _exprDoc = Document::create("<references>"); accept(ast); + return _references; } protected: @@ -123,10 +125,13 @@ protected: if (col) --col; // adjust the column position. - int len = tk.f.length; + const int len = tk.f.length; - _future.reportResult(Core::Utils::FileSearchResult(QDir::toNativeSeparators(_doc->fileName()), - line, lineText, col, len)); + if (_future) + _future->reportResult(Core::Utils::FileSearchResult(QDir::toNativeSeparators(_doc->fileName()), + line, lineText, col, len)); + + _references.append(tokenIndex); } bool checkCandidates(const QList<Symbol *> &candidates) const @@ -351,7 +356,7 @@ protected: } private: - QFutureInterface<Core::Utils::FileSearchResult> &_future; + QFutureInterface<Core::Utils::FileSearchResult> *_future; Identifier *_id; // ### remove me Symbol *_declSymbol; Document::Ptr _doc; @@ -361,6 +366,7 @@ private: Semantic _sem; QList<PostfixExpressionAST *> _postfixExpressionStack; QList<QualifiedNameAST *> _qualifiedNameStack; + QList<int> _references; }; } // end of anonymous namespace @@ -378,6 +384,28 @@ CppFindReferences::~CppFindReferences() { } +QList<int> CppFindReferences::references(Symbol *symbol, + Document::Ptr doc, + const Snapshot& snapshot) const +{ + Identifier *id = 0; + if (Identifier *symbolId = symbol->identifier()) + id = doc->control()->findIdentifier(symbolId->chars(), symbolId->size()); + + QList<int> references; + + if (! id) + return references; + + TranslationUnit *translationUnit = doc->translationUnit(); + Q_ASSERT(translationUnit != 0); + + Process process(doc, snapshot, /*future = */ 0); + references = process(symbol, id, translationUnit->ast()); + + return references; +} + static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future, const QMap<QString, QString> wl, Snapshot snapshot, @@ -429,7 +457,7 @@ static void find_helper(QFutureInterface<Core::Utils::FileSearchResult> &future, if (Identifier *id = control->findIdentifier(symbolId->chars(), symbolId->size())) { doc->check(); TranslationUnit *unit = doc->translationUnit(); - Process process(future, doc, snapshot); + Process process(doc, snapshot, &future); process(symbol, id, unit->ast()); } } diff --git a/src/plugins/cpptools/cppfindreferences.h b/src/plugins/cpptools/cppfindreferences.h index 9b5ddfccb466a5fc1d353b3390a860fe083734f9..3de964f4bd43911ceb78cd31c6c982113ad77009 100644 --- a/src/plugins/cpptools/cppfindreferences.h +++ b/src/plugins/cpptools/cppfindreferences.h @@ -35,16 +35,12 @@ #include <QtCore/QFuture> #include <QtCore/QFutureWatcher> #include <utils/filesearch.h> +#include <cplusplus/CppDocument.h> namespace Find { class SearchResultWindow; } // end of namespace Find -namespace CPlusPlus { - class Snapshot; - class Symbol; -} // end of namespace CPlusPlus - namespace CppTools { namespace Internal { @@ -58,6 +54,10 @@ public: CppFindReferences(CppModelManager *modelManager); virtual ~CppFindReferences(); + QList<int> references(CPlusPlus::Symbol *symbol, + CPlusPlus::Document::Ptr doc, + const CPlusPlus::Snapshot& snapshot) const; + Q_SIGNALS: void changed(); diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index aa3d9777eeda4be86d24e7277ace6ce9854c6656..efb5e43ba207c8944dfcbea106ac92b589c1fe52 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -739,6 +739,13 @@ void CppModelManager::removeEditorSupport(AbstractEditorSupport *editorSupport) m_addtionalEditorSupport.remove(editorSupport); } +QList<int> CppModelManager::references(CPlusPlus::Symbol *symbol, + CPlusPlus::Document::Ptr doc, + const CPlusPlus::Snapshot &snapshot) +{ + return m_findReferences->references(LookupContext::canonicalSymbol(symbol), doc, snapshot); +} + void CppModelManager::findReferences(CPlusPlus::Symbol *symbol) { if (symbol->identifier()) diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 69e627a452620c39805bdc5c93e837e6e20ffe78..f1c7eb52db3d4424302b5fa78f5017af7f543bd1 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -102,6 +102,10 @@ public: virtual void addEditorSupport(AbstractEditorSupport *editorSupport); virtual void removeEditorSupport(AbstractEditorSupport *editorSupport); + virtual QList<int> references(CPlusPlus::Symbol *symbol, + CPlusPlus::Document::Ptr doc, + const CPlusPlus::Snapshot &snapshot); + virtual void findReferences(CPlusPlus::Symbol *symbol); void setHeaderSuffixes(const QStringList &suffixes) diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h index 55b095b89fe21dee56b4aa7fe8ec37aecb9ad2a6..0a2ba32e3808361550b774cbc8acd42cea339bc1 100644 --- a/src/plugins/cpptools/cppmodelmanagerinterface.h +++ b/src/plugins/cpptools/cppmodelmanagerinterface.h @@ -95,6 +95,10 @@ public: virtual void addEditorSupport(AbstractEditorSupport *editorSupport) = 0; virtual void removeEditorSupport(AbstractEditorSupport *editorSupport) = 0; + virtual QList<int> references(CPlusPlus::Symbol *symbol, + CPlusPlus::Document::Ptr doc, + const CPlusPlus::Snapshot &snapshot) = 0; + virtual void findReferences(CPlusPlus::Symbol *symbol) = 0; };