diff options
author | Thorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com> | 2010-07-15 18:22:44 +0200 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com> | 2010-07-15 18:22:56 +0200 |
commit | 2e56fe23af79717dd9f4b88e274fde6375bce828 (patch) | |
tree | 93d71aaf88b07415244a220b5e79f65ed4aa69a8 /src/plugins/cpptools/cppcodecompletion.cpp | |
parent | 15e655b7188d68a62e3b08d5eb1899e0bf3d6d1e (diff) | |
download | qt-creator-2e56fe23af79717dd9f4b88e274fde6375bce828.tar.gz |
Avoid opening completion box in some unwanted situations
Don't automatically trigger the completion when editing a word or when
in a comment or string.
Diffstat (limited to 'src/plugins/cpptools/cppcodecompletion.cpp')
-rw-r--r-- | src/plugins/cpptools/cppcodecompletion.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/src/plugins/cpptools/cppcodecompletion.cpp b/src/plugins/cpptools/cppcodecompletion.cpp index 98a6928165..7b4303731e 100644 --- a/src/plugins/cpptools/cppcodecompletion.cpp +++ b/src/plugins/cpptools/cppcodecompletion.cpp @@ -656,12 +656,30 @@ bool CppCodeCompletion::triggersCompletion(TextEditor::ITextEditable *editor) return true; } else if (completionSettings().m_completionTrigger == TextEditor::AutomaticCompletion) { - // Trigger completion after three characters of a name have been typed - const int startOfName = findStartOfName(pos); - if (pos - startOfName == 3) { - const QChar firstCharacter = editor->characterAt(startOfName); - if (firstCharacter.isLetter() || firstCharacter == QLatin1Char('_')) - return true; + // Trigger completion after three characters of a name have been typed, when not editing an existing name + QChar characterUnderCursor = editor->characterAt(pos); + if (!characterUnderCursor.isLetterOrNumber()) { + const int startOfName = findStartOfName(pos); + if (pos - startOfName == 3) { + const QChar firstCharacter = editor->characterAt(startOfName); + if (firstCharacter.isLetter() || firstCharacter == QLatin1Char('_')) { + // Finally check that we're not inside a comment or string (code copied from startOfOperator) + TextEditor::BaseTextEditor *edit = qobject_cast<TextEditor::BaseTextEditor *>(editor->widget()); + QTextCursor tc(edit->textCursor()); + tc.setPosition(pos); + + SimpleLexer tokenize; + tokenize.setQtMocRunEnabled(true); + tokenize.setObjCEnabled(true); + tokenize.setSkipComments(false); + const QList<Token> &tokens = tokenize(tc.block().text(), BackwardsScanner::previousBlockState(tc.block())); + const int tokenIdx = SimpleLexer::tokenBefore(tokens, qMax(0, tc.positionInBlock() - 1)); + const Token tk = (tokenIdx == -1) ? Token() : tokens.at(tokenIdx); + + if (!tk.isComment() && !tk.isLiteral()) + return true; + } + } } } |