From e3e8b1a5c01ddc230772ee0553ca325704295312 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Tue, 29 Jun 2010 17:47:59 +0200
Subject: [PATCH] Removed the TokenCache.

---
 src/libs/cplusplus/BackwardsScanner.cpp       | 59 ++++++--------
 src/libs/cplusplus/BackwardsScanner.h         |  9 +--
 src/libs/cplusplus/ExpressionUnderCursor.cpp  |  9 +--
 src/libs/cplusplus/ExpressionUnderCursor.h    |  4 +-
 src/libs/cplusplus/MatchingText.cpp           |  9 +--
 src/libs/cplusplus/MatchingText.h             |  4 -
 src/libs/cplusplus/SimpleLexer.cpp            | 32 ++++++++
 src/libs/cplusplus/SimpleLexer.h              |  5 ++
 src/libs/cplusplus/TokenCache.cpp             | 81 -------------------
 src/libs/cplusplus/TokenCache.h               | 40 ---------
 src/libs/cplusplus/cplusplus-lib.pri          |  6 +-
 src/plugins/cppeditor/cppeditor.cpp           | 24 +++---
 src/plugins/cppeditor/cppeditor.h             |  3 -
 src/plugins/cppeditor/cpphoverhandler.cpp     |  2 +-
 src/plugins/cppeditor/cpphoverhandler.h       |  4 -
 src/plugins/cpptools/cppcodecompletion.cpp    | 32 ++++----
 src/plugins/cpptools/cppmodelmanager.cpp      |  5 --
 src/plugins/cpptools/cppmodelmanager.h        |  2 -
 .../cpptools/cppmodelmanagerinterface.h       |  3 -
 .../cpptools/cpptoolseditorsupport.cpp        | 18 +----
 src/plugins/cpptools/cpptoolseditorsupport.h  |  4 -
 src/plugins/debugger/watchutils.cpp           |  2 +-
 22 files changed, 107 insertions(+), 250 deletions(-)
 delete mode 100644 src/libs/cplusplus/TokenCache.cpp
 delete mode 100644 src/libs/cplusplus/TokenCache.h

diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp
index 00f1f4046f3..e6c31691769 100644
--- a/src/libs/cplusplus/BackwardsScanner.cpp
+++ b/src/libs/cplusplus/BackwardsScanner.cpp
@@ -27,48 +27,27 @@
 **
 **************************************************************************/
 #include "BackwardsScanner.h"
-#include "TokenCache.h"
 #include <Token.h>
 #include <QtGui/QTextCursor>
 #include <QTextDocument>
 
 using namespace CPlusPlus;
 
-BackwardsScanner::BackwardsScanner(TokenCache *tokenCache, const QTextCursor &cursor, int maxBlockCount, const QString &suffix)
-    : _tokenCache(tokenCache)
-    , _offset(0)
+BackwardsScanner::BackwardsScanner(const QTextCursor &cursor, int maxBlockCount, const QString &suffix)
+    : _offset(0)
     , _blocksTokenized(0)
     , _block(cursor.block())
     , _maxBlockCount(maxBlockCount)
 {
-    int pos = cursor.position() - cursor.block().position();
-    _text = _block.text().left(pos);
-    _text += suffix;
+    _tokenize.setQtMocRunEnabled(true);
+    _tokenize.setSkipComments(true);
+    _tokenize.setObjCEnabled(true);
+    _text = _block.text().left(cursor.position() - cursor.block().position());
 
-    _tokens.append(tokenCache->tokensForBlock(_block));
+    if (! suffix.isEmpty())
+        _text += suffix;
 
-    for (int i = _tokens.size() - 1; i >= 0; --i) {
-        const int tokenEnd = _tokens.at(i).end();
-
-        if ((tokenEnd < pos) ||
-                (tokenEnd == pos && suffix.isEmpty())) {
-            break;
-        } else {
-            _tokens.removeAt(i);
-        }
-    }
-
-    QString remainingText;
-    if (!_tokens.isEmpty())
-        remainingText = _text.mid(_tokens.last().end());
-    if (!remainingText.isEmpty()) {
-        SimpleLexer tokenize;
-        tokenize.setQtMocRunEnabled(true);
-        tokenize.setSkipComments(true);
-        tokenize.setObjCEnabled(true);
-
-        _tokens.append(tokenize(remainingText, TokenCache::previousBlockState(_block)));
-    }
+    _tokens.append(_tokenize(_text, previousBlockState(_block)));
 
     _startToken = _tokens.size();
 }
@@ -90,7 +69,6 @@ const SimpleToken &BackwardsScanner::fetchToken(int tokenIndex)
         } else {
             ++_blocksTokenized;
 
-            QList<SimpleToken> newTokens = _tokenCache->tokensForBlock(_block);
             QString blockText = _block.text();
             _text.prepend(QLatin1Char('\n'));
             _text.prepend(blockText);
@@ -102,8 +80,8 @@ const SimpleToken &BackwardsScanner::fetchToken(int tokenIndex)
                 adaptedTokens.append(t);
             }
 
-            _tokens = newTokens;
-            _offset += newTokens.size();
+            _tokens = _tokenize(blockText, previousBlockState(_block));
+            _offset += _tokens.size();
             _tokens += adaptedTokens;
         }
     }
@@ -260,3 +238,18 @@ QString BackwardsScanner::indentationString(int index) const
     const int newlinePos = qMax(0, _text.lastIndexOf(QLatin1Char('\n'), tokenAfterNewline.position()));
     return _text.mid(newlinePos, tokenAfterNewline.position() - newlinePos);
 }
+
+
+int BackwardsScanner::previousBlockState(const QTextBlock &block)
+{
+    const QTextBlock prevBlock = block.previous();
+
+    if (prevBlock.isValid()) {
+        int state = prevBlock.userState();
+
+        if (state != -1)
+            return state;
+    }
+
+    return 0;
+}
diff --git a/src/libs/cplusplus/BackwardsScanner.h b/src/libs/cplusplus/BackwardsScanner.h
index 25b7bd3289e..e348c72a27d 100644
--- a/src/libs/cplusplus/BackwardsScanner.h
+++ b/src/libs/cplusplus/BackwardsScanner.h
@@ -36,15 +36,12 @@
 
 namespace CPlusPlus {
 
-class TokenCache;
-
 class CPLUSPLUS_EXPORT BackwardsScanner
 {
     enum { MAX_BLOCK_COUNT = 10 };
 
 public:
-    BackwardsScanner(TokenCache *cache,
-                     const QTextCursor &cursor,
+    BackwardsScanner(const QTextCursor &cursor,
                      int maxBlockCount = MAX_BLOCK_COUNT,
                      const QString &suffix = QString());
 
@@ -71,15 +68,17 @@ public:
 
     int size() const;
 
+    static int previousBlockState(const QTextBlock &block);
+
 private:
     const SimpleToken &fetchToken(int tokenIndex);
 
 private:
-    TokenCache *_tokenCache;
     QList<SimpleToken> _tokens;
     int _offset;
     int _blocksTokenized;
     QTextBlock _block;
+    SimpleLexer _tokenize;
     QString _text;
     int _maxBlockCount;
     int _startToken;
diff --git a/src/libs/cplusplus/ExpressionUnderCursor.cpp b/src/libs/cplusplus/ExpressionUnderCursor.cpp
index c1b439ed099..c840ad398dd 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.cpp
+++ b/src/libs/cplusplus/ExpressionUnderCursor.cpp
@@ -30,7 +30,6 @@
 #include "ExpressionUnderCursor.h"
 #include "SimpleLexer.h"
 #include "BackwardsScanner.h"
-#include "TokenCache.h"
 #include <Token.h>
 
 #include <QTextCursor>
@@ -38,8 +37,8 @@
 
 using namespace CPlusPlus;
 
-ExpressionUnderCursor::ExpressionUnderCursor(TokenCache *tokenCache)
-    : _tokenCache(tokenCache), _jumpedComma(false)
+ExpressionUnderCursor::ExpressionUnderCursor()
+    : _jumpedComma(false)
 { }
 
 ExpressionUnderCursor::~ExpressionUnderCursor()
@@ -219,7 +218,7 @@ bool ExpressionUnderCursor::isAccessToken(const SimpleToken &tk)
 
 QString ExpressionUnderCursor::operator()(const QTextCursor &cursor)
 {
-    BackwardsScanner scanner(_tokenCache, cursor);
+    BackwardsScanner scanner(cursor);
 
     _jumpedComma = false;
 
@@ -233,7 +232,7 @@ QString ExpressionUnderCursor::operator()(const QTextCursor &cursor)
 
 int ExpressionUnderCursor::startOfFunctionCall(const QTextCursor &cursor) const
 {
-    BackwardsScanner scanner(_tokenCache, cursor);
+    BackwardsScanner scanner(cursor);
 
     int index = scanner.startToken();
 
diff --git a/src/libs/cplusplus/ExpressionUnderCursor.h b/src/libs/cplusplus/ExpressionUnderCursor.h
index ea017ca5339..3972aca6e4f 100644
--- a/src/libs/cplusplus/ExpressionUnderCursor.h
+++ b/src/libs/cplusplus/ExpressionUnderCursor.h
@@ -43,12 +43,11 @@ namespace CPlusPlus {
 
 class BackwardsScanner;
 class SimpleToken;
-class TokenCache;
 
 class CPLUSPLUS_EXPORT ExpressionUnderCursor
 {
 public:
-    ExpressionUnderCursor(TokenCache *tokenCache);
+    ExpressionUnderCursor();
     ~ExpressionUnderCursor();
 
     QString operator()(const QTextCursor &cursor);
@@ -60,7 +59,6 @@ private:
     bool isAccessToken(const SimpleToken &tk);
 
 private:
-    TokenCache *_tokenCache;
     bool _jumpedComma;
 };
 
diff --git a/src/libs/cplusplus/MatchingText.cpp b/src/libs/cplusplus/MatchingText.cpp
index 0ee23ac4e88..b14348e117b 100644
--- a/src/libs/cplusplus/MatchingText.cpp
+++ b/src/libs/cplusplus/MatchingText.cpp
@@ -28,7 +28,6 @@
 **************************************************************************/
 #include "MatchingText.h"
 #include "BackwardsScanner.h"
-#include "TokenCache.h"
 
 #include <Token.h>
 
@@ -76,10 +75,6 @@ static bool isCompleteCharLiteral(const BackwardsScanner &tk, int index)
     return false;
 }
 
-MatchingText::MatchingText(TokenCache *tokenCache)
-    : _tokenCache(tokenCache)
-{ }
-
 bool MatchingText::shouldInsertMatchingText(const QTextCursor &tc)
 {
     QTextDocument *doc = tc.document();
@@ -153,7 +148,7 @@ QString MatchingText::insertMatchingBrace(const QTextCursor &cursor, const QStri
     if (text.isEmpty() || !shouldInsertMatchingText(la))
         return QString();
 
-    BackwardsScanner tk(_tokenCache, tc, MAX_NUM_LINES, textToProcess.left(*skippedChars));
+    BackwardsScanner tk(tc, MAX_NUM_LINES, textToProcess.left(*skippedChars));
     const int startToken = tk.startToken();
     int index = startToken;
 
@@ -213,7 +208,7 @@ bool MatchingText::shouldInsertNewline(const QTextCursor &tc) const
 
 QString MatchingText::insertParagraphSeparator(const QTextCursor &tc) const
 {
-    BackwardsScanner tk(_tokenCache, tc, MAX_NUM_LINES);
+    BackwardsScanner tk(tc, MAX_NUM_LINES);
     int index = tk.startToken();
 
     if (tk[index - 1].isNot(T_LBRACE))
diff --git a/src/libs/cplusplus/MatchingText.h b/src/libs/cplusplus/MatchingText.h
index c4a84f7c759..9f864741ab7 100644
--- a/src/libs/cplusplus/MatchingText.h
+++ b/src/libs/cplusplus/MatchingText.h
@@ -40,8 +40,6 @@ class TokenCache;
 class CPLUSPLUS_EXPORT MatchingText
 {
 public:
-    MatchingText(TokenCache *tokenCache);
-
     static bool shouldInsertMatchingText(const QTextCursor &tc);
     static bool shouldInsertMatchingText(QChar lookAhead);
 
@@ -51,8 +49,6 @@ public:
 
 private:
     bool shouldInsertNewline(const QTextCursor &tc) const;
-
-    TokenCache *_tokenCache;
 };
 
 } // end of namespace CPlusPlus
diff --git a/src/libs/cplusplus/SimpleLexer.cpp b/src/libs/cplusplus/SimpleLexer.cpp
index 070f7dd737b..83f3a5189c2 100644
--- a/src/libs/cplusplus/SimpleLexer.cpp
+++ b/src/libs/cplusplus/SimpleLexer.cpp
@@ -170,4 +170,36 @@ QList<SimpleToken> SimpleLexer::operator()(const QString &text, int state)
     return tokens;
 }
 
+int SimpleLexer::tokenAt(const QList<SimpleToken> &tokens, int offset)
+{
+    for (int index = tokens.size() - 1; index >= 0; --index) {
+        const SimpleToken &tk = tokens.at(index);
+        if (tk.position() <= offset && tk.end() >= offset)
+            return index;
+    }
+
+    return -1;
+}
 
+SimpleToken SimpleLexer::tokenAt(const QString &text,
+                                 int offset,
+                                 int state,
+                                 bool qtMocRunEnabled)
+{
+    SimpleLexer tokenize;
+    tokenize.setQtMocRunEnabled(qtMocRunEnabled);
+    const QList<SimpleToken> tokens = tokenize(text, state);
+    const int tokenIdx = tokenAt(tokens, offset);
+    return (tokenIdx == -1) ? SimpleToken() : tokens.at(tokenIdx);
+}
+
+int SimpleLexer::tokenBefore(const QList<SimpleToken> &tokens, int offset)
+{
+    for (int index = tokens.size() - 1; index >= 0; --index) {
+        const SimpleToken &tk = tokens.at(index);
+        if (tk.position() <= offset)
+            return index;
+    }
+
+    return -1;
+}
diff --git a/src/libs/cplusplus/SimpleLexer.h b/src/libs/cplusplus/SimpleLexer.h
index 8b5ea26c99c..cf451cacc6b 100644
--- a/src/libs/cplusplus/SimpleLexer.h
+++ b/src/libs/cplusplus/SimpleLexer.h
@@ -126,6 +126,11 @@ public:
     int state() const
     { return _lastState; }
 
+    static int tokenAt(const QList<SimpleToken> &tokens, int offset);
+    static SimpleToken tokenAt(const QString &text, int offset, int state, bool qtMocRunEnabled = false);
+
+    static int tokenBefore(const QList<SimpleToken> &tokens, int offset);
+
 private:
     int _lastState;
     bool _skipComments: 1;
diff --git a/src/libs/cplusplus/TokenCache.cpp b/src/libs/cplusplus/TokenCache.cpp
deleted file mode 100644
index cadf7201cf5..00000000000
--- a/src/libs/cplusplus/TokenCache.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#include "SimpleLexer.h"
-#include "TokenCache.h"
-
-using namespace CPlusPlus;
-
-TokenCache::TokenCache(QTextDocument *doc)
-    : m_doc(doc)
-    , m_revision(-1)
-{}
-
-void TokenCache::setDocument(QTextDocument *doc)
-{
-    m_doc = doc;
-    m_revision = -1;
-}
-
-QList<SimpleToken> TokenCache::tokensForBlock(const QTextBlock &block) const
-{
-    Q_ASSERT(m_doc);
-    Q_ASSERT(m_doc == block.document());
-
-    const int documentRevision = m_doc->revision();
-
-    if (documentRevision != m_revision) {
-        m_tokensByBlock.clear();
-        m_revision = documentRevision;
-    }
-
-    const int blockNr = block.blockNumber();
-
-    if (m_tokensByBlock.contains(blockNr)) {
-        return m_tokensByBlock.value(blockNr);
-    } else {
-
-        SimpleLexer tokenize;
-        tokenize.setObjCEnabled(true);
-        tokenize.setQtMocRunEnabled(true);
-        tokenize.setSkipComments(false);
-
-        const int prevState = previousBlockState(block);
-        QList<SimpleToken> tokens = tokenize(block.text(), prevState);
-        m_tokensByBlock.insert(blockNr, tokens);
-
-        return tokens;
-    }
-}
-
-SimpleToken TokenCache::tokenUnderCursor(const QTextCursor &cursor) const
-{
-    const QTextBlock block = cursor.block();
-    const QList<SimpleToken> tokens = tokensForBlock(block);
-    const int column = cursor.position() - block.position();
-
-    for (int index = tokens.size() - 1; index >= 0; --index) {
-        const SimpleToken &tk = tokens.at(index);
-        if (tk.position() < column)
-            return tk;
-    }
-
-    return SimpleToken();
-}
-
-QString TokenCache::text(const QTextBlock &block, int tokenIndex) const
-{
-    SimpleToken tk = tokensForBlock(block).at(tokenIndex);
-    return block.text().mid(tk.position(), tk.length());
-}
-
-int TokenCache::previousBlockState(const QTextBlock &block)
-{
-    const QTextBlock prevBlock = block.previous();
-
-    if (prevBlock.isValid()) {
-        int state = prevBlock.userState();
-
-        if (state != -1)
-            return state;
-    }
-
-    return 0;
-}
diff --git a/src/libs/cplusplus/TokenCache.h b/src/libs/cplusplus/TokenCache.h
deleted file mode 100644
index cff748100b0..00000000000
--- a/src/libs/cplusplus/TokenCache.h
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef TOKENCACHE_H
-#define TOKENCACHE_H
-
-#include "SimpleLexer.h"
-
-#include <CPlusPlusForwardDeclarations.h>
-
-#include <QtCore/QHash>
-#include <QtCore/QList>
-
-#include <QtGui/QTextBlock>
-#include <QtGui/QTextCursor>
-#include <QtGui/QTextDocument>
-
-namespace CPlusPlus {
-
-class CPLUSPLUS_EXPORT TokenCache
-{
-public:
-    TokenCache(QTextDocument *doc = 0);
-
-    void setDocument(QTextDocument *doc);
-
-    QList<CPlusPlus::SimpleToken> tokensForBlock(const QTextBlock &block) const;
-    CPlusPlus::SimpleToken tokenUnderCursor(const QTextCursor &cursor) const;
-
-    QString text(const QTextBlock &block, int tokenIndex) const;
-
-    static int previousBlockState(const QTextBlock &block);
-
-private:
-    QTextDocument *m_doc;
-
-    mutable int m_revision;
-    mutable QHash<int, QList<CPlusPlus::SimpleToken> > m_tokensByBlock;
-};
-
-} // namespace CPlusPlus
-
-#endif // TOKENCACHE_H
diff --git a/src/libs/cplusplus/cplusplus-lib.pri b/src/libs/cplusplus/cplusplus-lib.pri
index 6244bf9e1b2..b1e27c950e8 100644
--- a/src/libs/cplusplus/cplusplus-lib.pri
+++ b/src/libs/cplusplus/cplusplus-lib.pri
@@ -14,16 +14,14 @@ HEADERS += \
     $$PWD/ExpressionUnderCursor.h \
     $$PWD/BackwardsScanner.h \
     $$PWD/MatchingText.h \
-    $$PWD/OverviewModel.h \
-    $$PWD/TokenCache.h
+    $$PWD/OverviewModel.h
 
 SOURCES += \
     $$PWD/Icons.cpp \
     $$PWD/ExpressionUnderCursor.cpp \
     $$PWD/BackwardsScanner.cpp \
     $$PWD/MatchingText.cpp \
-    $$PWD/OverviewModel.cpp \
-    $$PWD/TokenCache.cpp
+    $$PWD/OverviewModel.cpp
 }
 
 HEADERS += \
diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 6c0d46bf632..99e5bf0e89f 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -55,7 +55,6 @@
 #include <cplusplus/BackwardsScanner.h>
 #include <cplusplus/FastPreprocessor.h>
 #include <cplusplus/CheckUndefinedSymbols.h>
-#include <cplusplus/TokenCache.h>
 
 #include <cpptools/cppmodelmanagerinterface.h>
 #include <cpptools/cpptoolsconstants.h>
@@ -530,7 +529,7 @@ struct FindCanonicalSymbol
     SemanticInfo info;
 
     FindCanonicalSymbol(CPPEditor *editor, const SemanticInfo &info)
-        : editor(editor), expressionUnderCursor(editor->tokenCache()), info(info)
+        : editor(editor), info(info)
     {
         typeOfExpression.init(info.doc, info.snapshot);
     }
@@ -724,11 +723,6 @@ void CPPEditor::cut()
     finishRename();
 }
 
-TokenCache *CPPEditor::tokenCache() const
-{
-    return m_modelManager->tokenCache(editableInterface());
-}
-
 CppTools::CppModelManagerInterface *CPPEditor::modelManager() const
 {
     return m_modelManager;
@@ -1227,7 +1221,7 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
     SimpleLexer tokenize;
     tokenize.setQtMocRunEnabled(true);
     const QString blockText = cursor.block().text();
-    const QList<SimpleToken> tokens = tokenize(blockText, TokenCache::previousBlockState(cursor.block()));
+    const QList<SimpleToken> tokens = tokenize(blockText, BackwardsScanner::previousBlockState(cursor.block()));
 
     bool recognizedQtMethod = false;
 
@@ -1275,7 +1269,7 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
 
     if (! recognizedQtMethod) {
         const QTextBlock block = tc.block();
-        const SimpleToken tk = tokenCache()->tokenUnderCursor(tc);
+        const SimpleToken tk = SimpleLexer::tokenAt(block.text(), cursor.positionInBlock(), BackwardsScanner::previousBlockState(block), true);
 
         beginOfToken = block.position() + tk.begin();
         endOfToken = block.position() + tk.end();
@@ -1305,7 +1299,7 @@ CPPEditor::Link CPPEditor::findLinkAt(const QTextCursor &cursor,
         return link;
 
     // Evaluate the type of the expression under the cursor
-    ExpressionUnderCursor expressionUnderCursor(tokenCache());
+    ExpressionUnderCursor expressionUnderCursor;
     const QString expression = expressionUnderCursor(tc);
 
     TypeOfExpression typeOfExpression;
@@ -1408,13 +1402,13 @@ bool CPPEditor::isElectricCharacter(QChar ch) const
 QString CPPEditor::insertMatchingBrace(const QTextCursor &tc, const QString &text,
                                        QChar la, int *skippedChars) const
 {
-    MatchingText m(tokenCache());
+    MatchingText m;
     return m.insertMatchingBrace(tc, text, la, skippedChars);
 }
 
 QString CPPEditor::insertParagraphSeparator(const QTextCursor &tc) const
 {
-    MatchingText m(tokenCache());
+    MatchingText m;
     return m.insertParagraphSeparator(tc);
 }
 
@@ -1437,7 +1431,7 @@ bool CPPEditor::contextAllowsAutoParentheses(const QTextCursor &cursor,
 
 bool CPPEditor::contextAllowsElectricCharacters(const QTextCursor &cursor) const
 {
-    const SimpleToken tk = tokenCache()->tokenUnderCursor(cursor);
+    const SimpleToken tk = SimpleLexer::tokenAt(cursor.block().text(), cursor.positionInBlock(), BackwardsScanner::previousBlockState(cursor.block()));
 
     // XXX Duplicated from CPPEditor::isInComment to avoid tokenizing twice
     if (tk.isComment()) {
@@ -1468,7 +1462,7 @@ bool CPPEditor::contextAllowsElectricCharacters(const QTextCursor &cursor) const
 
 bool CPPEditor::isInComment(const QTextCursor &cursor) const
 {
-    const SimpleToken tk = tokenCache()->tokenUnderCursor(cursor);
+    const SimpleToken tk = SimpleLexer::tokenAt(cursor.block().text(), cursor.positionInBlock(), BackwardsScanner::previousBlockState(cursor.block()));
 
     if (tk.isComment()) {
         const int pos = cursor.selectionEnd() - cursor.block().position();
@@ -1522,7 +1516,7 @@ void CPPEditor::indentBlock(QTextDocument *doc, QTextBlock block, QChar typedCha
 
     const TabSettings &ts = tabSettings();
 
-    BackwardsScanner tk(tokenCache(), tc, 400);
+    BackwardsScanner tk(tc, 400);
     const int tokenCount = tk.startToken();
 
     if (tokenCount != 0) {
diff --git a/src/plugins/cppeditor/cppeditor.h b/src/plugins/cppeditor/cppeditor.h
index 7a56092b2fa..f623f78040c 100644
--- a/src/plugins/cppeditor/cppeditor.h
+++ b/src/plugins/cppeditor/cppeditor.h
@@ -48,7 +48,6 @@ QT_END_NAMESPACE
 namespace CPlusPlus {
 class OverviewModel;
 class Symbol;
-class TokenCache;
 }
 
 namespace CppTools {
@@ -200,8 +199,6 @@ public:
     virtual void paste(); // reimplemented from BaseTextEditor
     virtual void cut(); // reimplemented from BaseTextEditor
 
-    CPlusPlus::TokenCache *tokenCache() const;
-
     CppTools::CppModelManagerInterface *modelManager() const;
 
     virtual void setMimeType(const QString &mt);
diff --git a/src/plugins/cppeditor/cpphoverhandler.cpp b/src/plugins/cppeditor/cpphoverhandler.cpp
index b237cbf8f81..8115032b1e1 100644
--- a/src/plugins/cppeditor/cpphoverhandler.cpp
+++ b/src/plugins/cppeditor/cpphoverhandler.cpp
@@ -232,7 +232,7 @@ void CppHoverHandler::updateHelpIdAndTooltip(TextEditor::ITextEditor *editor, in
         }
 
         // Fetch the expression's code
-        ExpressionUnderCursor expressionUnderCursor(m_modelManager->tokenCache(editor));
+        ExpressionUnderCursor expressionUnderCursor;
         const QString expression = expressionUnderCursor(tc);
 
         const QList<LookupItem> types = typeOfExpression(expression, scope);
diff --git a/src/plugins/cppeditor/cpphoverhandler.h b/src/plugins/cppeditor/cpphoverhandler.h
index 95e942359b9..311b8292236 100644
--- a/src/plugins/cppeditor/cpphoverhandler.h
+++ b/src/plugins/cppeditor/cpphoverhandler.h
@@ -36,10 +36,6 @@ QT_BEGIN_NAMESPACE
 class QPoint;
 QT_END_NAMESPACE
 
-namespace CPlusPlus {
-class TokenCache;
-}
-
 namespace Core {
 class IEditor;
 }
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp
index 6660b09775b..c3a1b345fcd 100644
--- a/src/plugins/cpptools/cppcodecompletion.cpp
+++ b/src/plugins/cpptools/cppcodecompletion.cpp
@@ -452,8 +452,7 @@ QIcon CppCodeCompletion::iconForSymbol(Symbol *symbol) const
 /*
   Searches backwards for an access operator.
 */
-static int startOfOperator(TokenCache *tokenCache,
-                           TextEditor::ITextEditable *editor,
+static int startOfOperator(TextEditor::ITextEditable *editor,
                            int pos, unsigned *kind,
                            bool wantFunctionCall)
 {
@@ -546,14 +545,19 @@ static int startOfOperator(TokenCache *tokenCache,
     }
 
     if (completionKind == T_COMMA) {
-        ExpressionUnderCursor expressionUnderCursor(tokenCache);
+        ExpressionUnderCursor expressionUnderCursor;
         if (expressionUnderCursor.startOfFunctionCall(tc) == -1) {
             completionKind = T_EOF_SYMBOL;
             start = pos;
         }
     }
 
-    const SimpleToken tk = tokenCache->tokenUnderCursor(tc);
+    SimpleLexer tokenize;
+    tokenize.setQtMocRunEnabled(true);
+    tokenize.setSkipComments(false);
+    const QList<SimpleToken> &tokens = tokenize(tc.block().text());
+    const int tokenIdx = SimpleLexer::tokenAt(tokens, tc.positionInBlock());
+    const SimpleToken &tk = (tokenIdx == -1) ? SimpleToken() : tokens.at(tokenIdx);
 
     if (completionKind == T_DOXY_COMMENT && !(tk.is(T_DOXY_COMMENT) || tk.is(T_CPP_DOXY_COMMENT))) {
         completionKind = T_EOF_SYMBOL;
@@ -573,7 +577,6 @@ static int startOfOperator(TokenCache *tokenCache,
         start = pos;
     }
     else if (completionKind == T_LPAREN) {
-        const QList<SimpleToken> &tokens = tokenCache->tokensForBlock(tc.block());
         int i = 0;
         for (; i < tokens.size(); ++i) {
             const SimpleToken &token = tokens.at(i);
@@ -595,11 +598,12 @@ static int startOfOperator(TokenCache *tokenCache,
     // Check for include preprocessor directive
     else if (completionKind == T_STRING_LITERAL || completionKind == T_ANGLE_STRING_LITERAL || completionKind == T_SLASH) {
         bool include = false;
-        const QList<SimpleToken> &tokens = tokenCache->tokensForBlock(tc.block());
         if (tokens.size() >= 3) {
             if (tokens.at(0).is(T_POUND) && tokens.at(1).is(T_IDENTIFIER) && (tokens.at(2).is(T_STRING_LITERAL) ||
                                                                               tokens.at(2).is(T_ANGLE_STRING_LITERAL))) {
-                QString directive = tokenCache->text(tc.block(), 1);
+                const SimpleToken &directiveToken = tokens.at(1);
+                QString directive = tc.block().text().mid(directiveToken.position(),
+                                                          directiveToken.length());
                 if (directive == QLatin1String("include") ||
                     directive == QLatin1String("include_next") ||
                     directive == QLatin1String("import")) {
@@ -632,10 +636,9 @@ 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(tokenCache, editor, pos, &token, /*want function call=*/ true) != pos) {
+    if (startOfOperator(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());
@@ -683,8 +686,7 @@ int CppCodeCompletion::startCompletionHelper(TextEditor::ITextEditable *editor)
     while (editor->characterAt(endOfOperator - 1).isSpace())
         --endOfOperator;
 
-    TokenCache *tokenCache = m_manager->tokenCache(editor);
-    int endOfExpression = startOfOperator(tokenCache, editor, endOfOperator,
+    int endOfExpression = startOfOperator(editor, endOfOperator,
                                           &m_completionOperator,
                                           /*want function call =*/ true);
 
@@ -725,7 +727,7 @@ int CppCodeCompletion::startCompletionHelper(TextEditor::ITextEditable *editor)
         return m_startPosition;
     }
 
-    ExpressionUnderCursor expressionUnderCursor(m_manager->tokenCache(editor));
+    ExpressionUnderCursor expressionUnderCursor;
     QTextCursor tc(edit->document());
 
     if (m_completionOperator == T_COMMA) {
@@ -822,8 +824,7 @@ int CppCodeCompletion::startCompletionInternal(TextEditor::BaseTextEditor *edit,
             QTextCursor tc(edit->document());
             tc.setPosition(index);
 
-            TokenCache *tokenCache = m_manager->tokenCache(edit->editableInterface());
-            ExpressionUnderCursor expressionUnderCursor(tokenCache);
+            ExpressionUnderCursor expressionUnderCursor;
             const QString baseExpression = expressionUnderCursor(tc);
 
             // Resolve the type of this expression
@@ -1079,8 +1080,7 @@ bool CppCodeCompletion::completeConstructorOrFunction(const QList<LookupItem> &r
 
             QTextCursor tc(edit->document());
             tc.setPosition(endOfExpression);
-            TokenCache *tokenCache = m_manager->tokenCache(m_editor);
-            BackwardsScanner bs(tokenCache, tc);
+            BackwardsScanner bs(tc);
             const int startToken = bs.startToken();
             const int lineStartToken = bs.startOfLine(startToken);
             // make sure the required tokens are actually available
diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp
index 877a1fc06d5..317fba77d81 100644
--- a/src/plugins/cpptools/cppmodelmanager.cpp
+++ b/src/plugins/cpptools/cppmodelmanager.cpp
@@ -959,11 +959,6 @@ bool CppModelManager::isCppEditor(Core::IEditor *editor) const
     return editor->context().contains(ProjectExplorer::Constants::LANG_CXX);
 }
 
-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 f75e4026334..5659604141a 100644
--- a/src/plugins/cpptools/cppmodelmanager.h
+++ b/src/plugins/cpptools/cppmodelmanager.h
@@ -108,8 +108,6 @@ 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 32250e8dade..b3a201ec1d4 100644
--- a/src/plugins/cpptools/cppmodelmanagerinterface.h
+++ b/src/plugins/cpptools/cppmodelmanagerinterface.h
@@ -44,7 +44,6 @@ namespace Core {
 
 namespace CPlusPlus {
     class LookupContext;
-    class TokenCache;
 }
 
 namespace ProjectExplorer {
@@ -145,8 +144,6 @@ 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 33eed4e0202..4a775ee62eb 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.cpp
+++ b/src/plugins/cpptools/cpptoolseditorsupport.cpp
@@ -68,16 +68,11 @@ void CppEditorSupport::setTextEditor(TextEditor::ITextEditor *textEditor)
     _textEditor = 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()));
+        connect(_textEditor, SIGNAL(contentsChanged()), this, SIGNAL(contentsChanged()));
+        connect(this, SIGNAL(contentsChanged()), this, SLOT(updateDocument()));
 
-    updateDocument();
+        updateDocument();
+    }
 }
 
 QString CppEditorSupport::contents()
@@ -100,11 +95,6 @@ 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 61fed38d3c4..882a9ac9aa9 100644
--- a/src/plugins/cpptools/cpptoolseditorsupport.h
+++ b/src/plugins/cpptools/cpptoolseditorsupport.h
@@ -36,7 +36,6 @@
 #include <QSharedPointer>
 #include <QTextCursor>
 #include <cplusplus/CppDocument.h>
-#include <cplusplus/TokenCache.h>
 
 QT_BEGIN_NAMESPACE
 class QTimer;
@@ -73,8 +72,6 @@ public:
     QString contents();
     unsigned editorRevision() const;
 
-    CPlusPlus::TokenCache *tokenCache();
-
 Q_SIGNALS:
     void contentsChanged();
 
@@ -92,7 +89,6 @@ private:
     QFuture<void> _documentParser;
     QString _cachedContents;
     unsigned _revision;
-    CPlusPlus::TokenCache _tokenCache;
 };
 
 } // namespace Internal
diff --git a/src/plugins/debugger/watchutils.cpp b/src/plugins/debugger/watchutils.cpp
index 9c8ed75979b..be26c36f2c5 100644
--- a/src/plugins/debugger/watchutils.cpp
+++ b/src/plugins/debugger/watchutils.cpp
@@ -746,7 +746,7 @@ QString cppExpressionAt(TextEditor::ITextEditor *editor, int pos,
             tc.movePosition(QTextCursor::EndOfWord);
 
         // Fetch the expression's code.
-        CPlusPlus::ExpressionUnderCursor expressionUnderCursor(modelManager->tokenCache(editor));
+        CPlusPlus::ExpressionUnderCursor expressionUnderCursor;
         expr = expressionUnderCursor(tc);
         *column = tc.positionInBlock();
         *line = tc.blockNumber();
-- 
GitLab