diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-06-04 09:36:05 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2010-06-04 09:36:05 +0200 |
commit | c2393df02332618c8cf6159d9d6f6a40041ced89 (patch) | |
tree | 4230c145cc5fa6576310afebe989003151ed38d1 /src/plugins/cpptools | |
parent | 414d9fe3e0fe03f27432b9943e7b2bb5bc2f716c (diff) | |
download | qt-creator-c2393df02332618c8cf6159d9d6f6a40041ced89.tar.gz |
Introduced a token cache for the C++ editor.
This should speed things up a bit, because before, the line was tokenized at
least 3 times.
Diffstat (limited to 'src/plugins/cpptools')
-rw-r--r-- | src/plugins/cpptools/cppcodecompletion.cpp | 46 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.cpp | 3 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanager.h | 2 | ||||
-rw-r--r-- | src/plugins/cpptools/cppmodelmanagerinterface.h | 11 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolseditorsupport.cpp | 11 | ||||
-rw-r--r-- | src/plugins/cpptools/cpptoolseditorsupport.h | 4 |
6 files changed, 55 insertions, 22 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 935e031595..0f0d699181 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -65,7 +65,6 @@ #include <utils/faketooltip.h> #include <utils/qtcassert.h> -#include <QtCore/QDebug> #include <QtCore/QMap> #include <QtCore/QFile> #include <QtGui/QAction> @@ -454,7 +453,8 @@ QIcon CppCodeCompletion::iconForSymbol(Symbol *symbol) const /* Searches backwards for an access operator. */ -static int startOfOperator(TextEditor::ITextEditable *editor, +static int startOfOperator(TokenCache *tokenCache, + TextEditor::ITextEditable *editor, int pos, unsigned *kind, bool wantFunctionCall) { @@ -547,7 +547,7 @@ static int startOfOperator(TextEditor::ITextEditable *editor, } if (completionKind == T_COMMA) { - ExpressionUnderCursor expressionUnderCursor; + ExpressionUnderCursor expressionUnderCursor(tokenCache); if (expressionUnderCursor.startOfFunctionCall(tc) == -1) { completionKind = T_EOF_SYMBOL; start = pos; @@ -555,7 +555,7 @@ static int startOfOperator(TextEditor::ITextEditable *editor, } static CPlusPlus::TokenUnderCursor tokenUnderCursor; - const SimpleToken tk = tokenUnderCursor(tc); + const SimpleToken tk = tokenUnderCursor(tokenCache, tc); if (completionKind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) { completionKind = T_EOF_SYMBOL; @@ -634,9 +634,10 @@ int CppCodeCompletion::startPosition() const bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor) { const int pos = editor->position(); + TokenCache *tokenCache = m_manager->tokenCache(editor); unsigned token = T_EOF_SYMBOL; - if (startOfOperator(editor, pos, &token, /*want function call=*/ true) != pos) { + if (startOfOperator(tokenCache, editor, pos, &token, /*want function call=*/ true) != pos) { if (token == T_POUND) { if (TextEditor::BaseTextEditor *edit = qobject_cast<TextEditor::BaseTextEditor *>(editor->widget())) { QTextCursor tc(edit->document()); @@ -684,7 +685,8 @@ int CppCodeCompletion::startCompletionHelper(TextEditor::ITextEditable *editor) while (editor->characterAt(endOfOperator - 1).isSpace()) --endOfOperator; - int endOfExpression = startOfOperator(editor, endOfOperator, + TokenCache *tokenCache = m_manager->tokenCache(editor); + int endOfExpression = startOfOperator(tokenCache, editor, endOfOperator, &m_completionOperator, /*want function call =*/ true); @@ -725,7 +727,7 @@ int CppCodeCompletion::startCompletionHelper(TextEditor::ITextEditable *editor) return m_startPosition; } - ExpressionUnderCursor expressionUnderCursor; + ExpressionUnderCursor expressionUnderCursor(m_manager->tokenCache(editor)); QTextCursor tc(edit->document()); if (m_completionOperator == T_COMMA) { @@ -800,13 +802,13 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit, } } - if (debug) - qDebug() << "scope:" << scope->owner()->fileName() << scope->owner()->line() << scope->owner()->column(); +// if (debug) +// qDebug() << "scope:" << scope->owner()->fileName() << scope->owner()->line() << scope->owner()->column(); QList<LookupItem> results = typeOfExpression(expression, scope, TypeOfExpression::Preprocess); - if (debug) - qDebug() << "got:" << results.size() << "results"; +// if (debug) +// qDebug() << "got:" << results.size() << "results"; if (results.isEmpty()) { if (m_completionOperator == T_SIGNAL || m_completionOperator == T_SLOT) { @@ -828,7 +830,8 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit, QTextCursor tc(edit->document()); tc.setPosition(index); - ExpressionUnderCursor expressionUnderCursor; + TokenCache *tokenCache = m_manager->tokenCache(edit->editableInterface()); + ExpressionUnderCursor expressionUnderCursor(tokenCache); const QString baseExpression = expressionUnderCursor(tc); // Resolve the type of this expression @@ -1084,7 +1087,8 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r QTextCursor tc(edit->document()); tc.setPosition(endOfExpression); - BackwardsScanner bs(tc); + TokenCache *tokenCache = m_manager->tokenCache(m_editor); + BackwardsScanner bs(tokenCache, tc); const int startToken = bs.startToken(); const int lineStartToken = bs.startOfLine(startToken); // make sure the required tokens are actually available @@ -1143,8 +1147,8 @@ bool CppCodeCompletion::completeMember(const QList<LookupItem> &baseResults) { const LookupContext &context = typeOfExpression.context(); - if (debug) - qDebug() << Q_FUNC_INFO << __LINE__; +// if (debug) +// qDebug() << Q_FUNC_INFO << __LINE__; if (baseResults.isEmpty()) return false; @@ -1156,8 +1160,8 @@ bool CppCodeCompletion::completeMember(const QList<LookupItem> &baseResults) if (ClassOrNamespace *binding = resolveExpression.baseExpression(baseResults, m_completionOperator, &replacedDotOperator)) { - if (debug) - qDebug() << "cool we got a binding for the base expression"; +// if (debug) +// qDebug() << "cool we got a binding for the base expression"; if (replacedDotOperator && binding) { // Replace . with -> @@ -1173,10 +1177,10 @@ bool CppCodeCompletion::completeMember(const QList<LookupItem> &baseResults) return ! m_completions.isEmpty(); } - if (debug) { - Overview oo; - qDebug() << "hmm, got:" << oo(baseResults.first().type()); - } +// if (debug) { +// Overview oo; +// qDebug() << "hmm, got:" << oo(baseResults.first().type()); +// } return false; } diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index f6222bfc50..6c20bfe215 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -962,6 +962,9 @@ bool CppModelManager::isCppEditor(Core::IEditor *editor) const return editor->context().contains(uid); } +TokenCache *CppModelManager::tokenCache(TextEditor::ITextEditor *editor) const +{ return editorSupport(editor)->tokenCache(); } + void CppModelManager::emitDocumentUpdated(Document::Ptr doc) { emit documentUpdated(doc); } diff --git a/src/plugins/cpptools/cppmodelmanager.h b/src/plugins/cpptools/cppmodelmanager.h index 0058e4edaf..f43c3bbd82 100644 --- a/src/plugins/cpptools/cppmodelmanager.h +++ b/src/plugins/cpptools/cppmodelmanager.h @@ -108,6 +108,8 @@ public: CppEditorSupport *editorSupport(TextEditor::ITextEditor *editor) const { return m_editorSupport.value(editor); } + virtual CPlusPlus::TokenCache *tokenCache(TextEditor::ITextEditor *editor) const; + void emitDocumentUpdated(CPlusPlus::Document::Ptr doc); void stopEditorSelectionsUpdate() diff --git a/src/plugins/cpptools/cppmodelmanagerinterface.h b/src/plugins/cpptools/cppmodelmanagerinterface.h index cc1177a27f..1bd2696902 100644 --- a/src/plugins/cpptools/cppmodelmanagerinterface.h +++ b/src/plugins/cpptools/cppmodelmanagerinterface.h @@ -40,16 +40,25 @@ namespace CPlusPlus { class LookupContext; + class TokenCache; } namespace ProjectExplorer { class Project; } +namespace TextEditor { + class ITextEditor; +} + namespace CppTools { class AbstractEditorSupport; +namespace Internal { +class CppEditorSupport; +} + class CPPTOOLS_EXPORT CppModelManagerInterface : public QObject { Q_OBJECT @@ -130,6 +139,8 @@ public: virtual void findMacroUsages(const CPlusPlus::Macro ¯o) = 0; + virtual CPlusPlus::TokenCache *tokenCache(TextEditor::ITextEditor *editor) const = 0; + Q_SIGNALS: void documentUpdated(CPlusPlus::Document::Ptr doc); diff --git a/src/plugins/cpptools/cpptoolseditorsupport.cpp b/src/plugins/cpptools/cpptoolseditorsupport.cpp index 77cccf1018..33eed4e020 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.cpp +++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp @@ -67,8 +67,12 @@ void CppEditorSupport::setTextEditor(TextEditor::ITextEditor *textEditor) { _textEditor = textEditor; - if (! _textEditor) + if (_textEditor) { + if (TextEditor::BaseTextEditor *ed = qobject_cast<TextEditor::BaseTextEditor *>(_textEditor->widget())) + _tokenCache.setDocument(ed->document()); + } else { return; + } connect(_textEditor, SIGNAL(contentsChanged()), this, SIGNAL(contentsChanged())); connect(this, SIGNAL(contentsChanged()), this, SLOT(updateDocument())); @@ -96,6 +100,11 @@ unsigned CppEditorSupport::editorRevision() const return 0; } +TokenCache *CppEditorSupport::tokenCache() +{ + return &_tokenCache; +} + int CppEditorSupport::updateDocumentInterval() const { return _updateDocumentInterval; } diff --git a/src/plugins/cpptools/cpptoolseditorsupport.h b/src/plugins/cpptools/cpptoolseditorsupport.h index 882a9ac9aa..61fed38d3c 100644 --- a/src/plugins/cpptools/cpptoolseditorsupport.h +++ b/src/plugins/cpptools/cpptoolseditorsupport.h @@ -36,6 +36,7 @@ #include <QSharedPointer> #include <QTextCursor> #include <cplusplus/CppDocument.h> +#include <cplusplus/TokenCache.h> QT_BEGIN_NAMESPACE class QTimer; @@ -72,6 +73,8 @@ public: QString contents(); unsigned editorRevision() const; + CPlusPlus::TokenCache *tokenCache(); + Q_SIGNALS: void contentsChanged(); @@ -89,6 +92,7 @@ private: QFuture<void> _documentParser; QString _cachedContents; unsigned _revision; + CPlusPlus::TokenCache _tokenCache; }; } // namespace Internal |