aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@digia.com>2013-01-10 16:41:14 +0100
committerKai Koehne <kai.koehne@digia.com>2013-01-14 16:20:53 +0100
commit6ce9a80afa43b3a40b0244ebef3b41ba03cc76a0 (patch)
tree562689269decdbb45ac5ba920e6d27af4d729c15 /src
parent1675beebf3310ee0b59999d8ba7a027e202fc346 (diff)
C++: fix invalid common prefix calculation.
This was the indirect cause for "random" freezes when using code-completion. The direct cause was a while loop counting down to 0, but starting with a negative value. Both are fixed now. Task-number: QTCREATORBUG-8472 Task-number: QTCREATORBUG-8532 Change-Id: I782a46be3ac8282d7484d0bf0c6fd30be6b171c8 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com> Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cpptools/cppcompletionassist.cpp2
-rw-r--r--src/plugins/texteditor/codeassist/basicproposalitemlistmodel.cpp27
2 files changed, 17 insertions, 12 deletions
diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp
index 8dd911aac85..f3a6a08f9e3 100644
--- a/src/plugins/cpptools/cppcompletionassist.cpp
+++ b/src/plugins/cpptools/cppcompletionassist.cpp
@@ -344,7 +344,7 @@ void CppAssistProposalItem::applyContextualContent(TextEditor::BaseTextEditor *e
if (!inEditor.isEmpty()) {
preserveLength = toInsert.length() - (editor->position() - basePosition);
const int inEditorLength = inEditor.length();
- while (preserveLength) {
+ while (preserveLength > 0) {
if (inEditor.startsWith(toInsert.right(preserveLength))
&& (inEditorLength == preserveLength
|| (!inEditor.at(preserveLength).isLetterOrNumber()
diff --git a/src/plugins/texteditor/codeassist/basicproposalitemlistmodel.cpp b/src/plugins/texteditor/codeassist/basicproposalitemlistmodel.cpp
index 9a488dfaa6f..84657911c79 100644
--- a/src/plugins/texteditor/codeassist/basicproposalitemlistmodel.cpp
+++ b/src/plugins/texteditor/codeassist/basicproposalitemlistmodel.cpp
@@ -271,22 +271,27 @@ bool BasicProposalItemListModel::keepPerfectMatch(AssistReason reason) const
QString BasicProposalItemListModel::proposalPrefix() const
{
- if (m_currentItems.size() >= kMaxPrefixFilter)
+ if (m_currentItems.size() >= kMaxPrefixFilter || m_currentItems.isEmpty())
return QString();
// Compute common prefix
- QString firstKey = m_currentItems.first()->text();
- QString lastKey = m_currentItems.last()->text();
- const int length = qMin(firstKey.length(), lastKey.length());
- firstKey.truncate(length);
- lastKey.truncate(length);
-
- while (firstKey != lastKey) {
- firstKey.chop(1);
- lastKey.chop(1);
+ QString commonPrefix = m_currentItems.first()->text();
+ for (int i = 1, ei = m_currentItems.size(); i < ei; ++i) {
+ QString nextItem = m_currentItems.at(i)->text();
+ const int length = qMin(commonPrefix.length(), nextItem.length());
+ commonPrefix.truncate(length);
+ nextItem.truncate(length);
+
+ while (commonPrefix != nextItem) {
+ commonPrefix.chop(1);
+ nextItem.chop(1);
+ }
+
+ if (commonPrefix.isEmpty()) // there is no common prefix, so return.
+ return commonPrefix;
}
- return firstKey;
+ return commonPrefix;
}
IAssistProposalItem *BasicProposalItemListModel::proposalItem(int index) const