diff options
Diffstat (limited to 'src/libs/cplusplus/BackwardsScanner.cpp')
-rw-r--r-- | src/libs/cplusplus/BackwardsScanner.cpp | 67 |
1 files changed, 63 insertions, 4 deletions
diff --git a/src/libs/cplusplus/BackwardsScanner.cpp b/src/libs/cplusplus/BackwardsScanner.cpp index df2916a6d7..251fa9bd19 100644 --- a/src/libs/cplusplus/BackwardsScanner.cpp +++ b/src/libs/cplusplus/BackwardsScanner.cpp @@ -27,6 +27,7 @@ ** **************************************************************************/ #include "BackwardsScanner.h" +#include <Token.h> #include <QtGui/QTextCursor> using namespace CPlusPlus; @@ -42,10 +43,16 @@ BackwardsScanner::BackwardsScanner(const QTextCursor &cursor, int maxBlockCount) _tokens.append(_tokenize(_text, previousBlockState(_block))); } -QList<SimpleToken> BackwardsScanner::tokens() const +int BackwardsScanner::state() const +{ return _tokenize.state(); } + +const QList<SimpleToken> &BackwardsScanner::tokens() const { return _tokens; } -const SimpleToken &BackwardsScanner::operator[](int i) +const SimpleToken &BackwardsScanner::operator[](int i) const +{ return const_cast<BackwardsScanner *>(this)->fetchToken(i); } + +const SimpleToken &BackwardsScanner::fetchToken(int i) { while (_offset + i < 0) { _block = _block.previous(); @@ -77,10 +84,13 @@ const SimpleToken &BackwardsScanner::operator[](int i) return _tokens.at(_offset + i); } +int BackwardsScanner::startToken() const +{ return _tokens.size(); } + int BackwardsScanner::startPosition() const { return _block.position(); } -const QString &BackwardsScanner::text() const +QString BackwardsScanner::text() const { return _text; } QString BackwardsScanner::text(int begin, int end) const @@ -90,7 +100,14 @@ QString BackwardsScanner::text(int begin, int end) const return _text.mid(firstToken.begin(), lastToken.end() - firstToken.begin()); } -int BackwardsScanner::previousBlockState(const QTextBlock &block) +QStringRef BackwardsScanner::textRef(int begin, int end) const +{ + const SimpleToken &firstToken = _tokens.at(begin + _offset); + const SimpleToken &lastToken = _tokens.at(end + _offset - 1); + return _text.midRef(firstToken.begin(), lastToken.end() - firstToken.begin()); +} + +int BackwardsScanner::previousBlockState(const QTextBlock &block) const { const QTextBlock prevBlock = block.previous(); @@ -103,3 +120,45 @@ int BackwardsScanner::previousBlockState(const QTextBlock &block) return 0; } + +int BackwardsScanner::startOfMatchingBrace(int index) const +{ + const BackwardsScanner &tk = *this; + + if (tk[index - 1].is(T_RPAREN)) { + int i = index - 1; + int count = 0; + do { + if (tk[i].is(T_LPAREN)) { + if (! ++count) + return i; + } else if (tk[i].is(T_RPAREN)) + --count; + --i; + } while (count != 0 && tk[i].isNot(T_EOF_SYMBOL)); + } else if (tk[index - 1].is(T_RBRACKET)) { + int i = index - 1; + int count = 0; + do { + if (tk[i].is(T_LBRACKET)) { + if (! ++count) + return i; + } else if (tk[i].is(T_RBRACKET)) + --count; + --i; + } while (count != 0 && tk[i].isNot(T_EOF_SYMBOL)); + } else if (tk[index - 1].is(T_GREATER)) { + int i = index - 1; + int count = 0; + do { + if (tk[i].is(T_LESS)) { + if (! ++count) + return i; + } else if (tk[i].is(T_GREATER)) + --count; + --i; + } while (count != 0 && tk[i].isNot(T_EOF_SYMBOL)); + } + + return index; +} |