diff options
Diffstat (limited to 'src/libs/cplusplus')
-rw-r--r-- | src/libs/cplusplus/BackwardsScanner.cpp | 59 | ||||
-rw-r--r-- | src/libs/cplusplus/BackwardsScanner.h | 9 | ||||
-rw-r--r-- | src/libs/cplusplus/ExpressionUnderCursor.cpp | 9 | ||||
-rw-r--r-- | src/libs/cplusplus/ExpressionUnderCursor.h | 4 | ||||
-rw-r--r-- | src/libs/cplusplus/MatchingText.cpp | 9 | ||||
-rw-r--r-- | src/libs/cplusplus/MatchingText.h | 4 | ||||
-rw-r--r-- | src/libs/cplusplus/SimpleLexer.cpp | 32 | ||||
-rw-r--r-- | src/libs/cplusplus/SimpleLexer.h | 5 | ||||
-rw-r--r-- | src/libs/cplusplus/TokenCache.cpp | 81 | ||||
-rw-r--r-- | src/libs/cplusplus/TokenCache.h | 40 | ||||
-rw-r--r-- | src/libs/cplusplus/cplusplus-lib.pri | 6 |
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 += \ |