summaryrefslogtreecommitdiff
path: root/src/plugins/cpptools/cppcodecompletion.cpp
diff options
context:
space:
mode:
authorThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2010-07-15 18:22:44 +0200
committerThorbjørn Lindeijer <thorbjorn.lindeijer@nokia.com>2010-07-15 18:22:56 +0200
commit2e56fe23af79717dd9f4b88e274fde6375bce828 (patch)
tree93d71aaf88b07415244a220b5e79f65ed4aa69a8 /src/plugins/cpptools/cppcodecompletion.cpp
parent15e655b7188d68a62e3b08d5eb1899e0bf3d6d1e (diff)
downloadqt-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.cpp30
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;
+ }
+ }
}
}