diff --git a/src/libs/cplusplus/SimpleLexer.h b/src/libs/cplusplus/SimpleLexer.h index 3359358e73e4f627e573247e605b331df7a2b890..0366738c6bdb9a91841ae40f2fad69bd559979e1 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 a819007828e29407fda6c0fcd8bb05173c1a1296..997c1e6e3aae3045421117a291db5ed0cc4d4aa9 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 93199d2b3821a0a4ca06ddc8af4ab3b0e36c2a64..536beac5691afdd89172828e3aba910963721c1a 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 84994e78b62c71da1ee8df2a22e9e766e91df5fa..211ec084e693e814a73e603a703a068f526c9454 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;