From efc0b20859d1cfd5949191f6b2b65f9266c49625 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lindeijer?= <thorbjorn.lindeijer@nokia.com> Date: Wed, 27 May 2009 11:12:06 +0200 Subject: [PATCH] Made typing parenthesis even faster Only attempt to activate the completion when there is a function id on the left of the parenthesis. Reviewed-by: Roberto Raggi --- src/libs/cplusplus/SimpleLexer.h | 6 ++++++ src/libs/cplusplus/TokenUnderCursor.cpp | 8 ++++---- src/libs/cplusplus/TokenUnderCursor.h | 9 ++++++--- src/plugins/cpptools/cppcodecompletion.cpp | 20 ++++++++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/libs/cplusplus/SimpleLexer.h b/src/libs/cplusplus/SimpleLexer.h index 3359358e73e..0366738c6bd 100644 --- a/src/libs/cplusplus/SimpleLexer.h +++ b/src/libs/cplusplus/SimpleLexer.h @@ -56,6 +56,12 @@ public: inline int length() const { return _length; } + inline int begin() const + { return _position; } + + inline int end() const + { return _position + _length; } + inline QStringRef text() const { return _text; } diff --git a/src/libs/cplusplus/TokenUnderCursor.cpp b/src/libs/cplusplus/TokenUnderCursor.cpp index a819007828e..997c1e6e3aa 100644 --- a/src/libs/cplusplus/TokenUnderCursor.cpp +++ b/src/libs/cplusplus/TokenUnderCursor.cpp @@ -42,7 +42,7 @@ TokenUnderCursor::TokenUnderCursor() TokenUnderCursor::~TokenUnderCursor() { } -SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) const +SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock *b) { SimpleLexer tokenize; tokenize.setObjCEnabled(true); @@ -51,9 +51,9 @@ SimpleToken TokenUnderCursor::operator()(const QTextCursor &cursor, QTextBlock * QTextBlock block = cursor.block(); int column = cursor.columnNumber(); - QList<SimpleToken> tokens = tokenize(block.text(), previousBlockState(block)); - for (int index = tokens.size() - 1; index != -1; --index) { - const SimpleToken &tk = tokens.at(index); + _tokens = tokenize(block.text(), previousBlockState(block)); + for (int index = _tokens.size() - 1; index != -1; --index) { + const SimpleToken &tk = _tokens.at(index); if (tk.position() < column) { if (b) *b = block; diff --git a/src/libs/cplusplus/TokenUnderCursor.h b/src/libs/cplusplus/TokenUnderCursor.h index 93199d2b382..536beac5691 100644 --- a/src/libs/cplusplus/TokenUnderCursor.h +++ b/src/libs/cplusplus/TokenUnderCursor.h @@ -40,18 +40,21 @@ QT_END_NAMESPACE namespace CPlusPlus { -class SimpleToken; - class CPLUSPLUS_EXPORT TokenUnderCursor { public: TokenUnderCursor(); ~TokenUnderCursor(); - SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0) const; + SimpleToken operator()(const QTextCursor &cursor, QTextBlock *block = 0); + + const QList<SimpleToken> &tokens() const + { return _tokens; } private: int previousBlockState(const QTextBlock &block) const; + + QList<SimpleToken> _tokens; }; } // end of namespace CPlusPlus diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 84994e78b62..211ec084e69 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -514,6 +514,26 @@ static int startOfOperator(TextEditor::ITextEditable *editor, start = pos; } + if (k == T_LPAREN) { + const QList<SimpleToken> &tokens = tokenUnderCursor.tokens(); + int i = 0; + for (; i < tokens.size(); ++i) { + const SimpleToken &token = tokens.at(i); + if (token.position() == tk.position()) { + if (i == 0) // no token on the left, but might be on a previous line + break; + const SimpleToken &previousToken = tokens.at(i - 1); + if (previousToken.is(T_IDENTIFIER) || previousToken.is(T_GREATER)) + break; + } + } + + if (i == tokens.size()) { + k = T_EOF_SYMBOL; + start = pos; + } + } + if (kind) *kind = k; -- GitLab