summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-06-04 09:36:05 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-06-04 09:36:05 +0200
commitc2393df02332618c8cf6159d9d6f6a40041ced89 (patch)
tree4230c145cc5fa6576310afebe989003151ed38d1 /src/plugins/cpptools
parent414d9fe3e0fe03f27432b9943e7b2bb5bc2f716c (diff)
downloadqt-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.cpp46
-rw-r--r--src/plugins/cpptools/cppmodelmanager.cpp3
-rw-r--r--src/plugins/cpptools/cppmodelmanager.h2
-rw-r--r--src/plugins/cpptools/cppmodelmanagerinterface.h11
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.cpp11
-rw-r--r--src/plugins/cpptools/cpptoolseditorsupport.h4
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 &macro) = 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