summaryrefslogtreecommitdiff
path: root/src/libs/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r--src/libs/cplusplus/BackwardsScanner.cpp59
-rw-r--r--src/libs/cplusplus/BackwardsScanner.h9
-rw-r--r--src/libs/cplusplus/ExpressionUnderCursor.cpp9
-rw-r--r--src/libs/cplusplus/ExpressionUnderCursor.h4
-rw-r--r--src/libs/cplusplus/MatchingText.cpp9
-rw-r--r--src/libs/cplusplus/MatchingText.h4
-rw-r--r--src/libs/cplusplus/SimpleLexer.cpp32
-rw-r--r--src/libs/cplusplus/SimpleLexer.h5
-rw-r--r--src/libs/cplusplus/TokenCache.cpp81
-rw-r--r--src/libs/cplusplus/TokenCache.h40
-rw-r--r--src/libs/cplusplus/cplusplus-lib.pri6
11 files changed, 76 insertions, 182 deletions
diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp
index 00f1f4046f..e6c3169176 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 25b7bd3289..e348c72a27 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 c1b439ed09..c840ad398d 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 ea017ca533..3972aca6e4 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 0ee23ac4e8..b14348e117 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 c4a84f7c75..9f864741ab 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 070f7dd737..83f3a5189c 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 8b5ea26c99..cf451cacc6 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 cadf7201cf..0000000000
--- 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 cff748100b..0000000000
--- 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 6244bf9e1b..b1e27c950e 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 += \