forked from qt-creator/qt-creator
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>
This commit is contained in:
committed by
Kai Koehne
parent
1675beebf3
commit
6ce9a80afa
@@ -344,7 +344,7 @@ void CppAssistProposalItem::applyContextualContent(TextEditor::BaseTextEditor *e
|
|||||||
if (!inEditor.isEmpty()) {
|
if (!inEditor.isEmpty()) {
|
||||||
preserveLength = toInsert.length() - (editor->position() - basePosition);
|
preserveLength = toInsert.length() - (editor->position() - basePosition);
|
||||||
const int inEditorLength = inEditor.length();
|
const int inEditorLength = inEditor.length();
|
||||||
while (preserveLength) {
|
while (preserveLength > 0) {
|
||||||
if (inEditor.startsWith(toInsert.right(preserveLength))
|
if (inEditor.startsWith(toInsert.right(preserveLength))
|
||||||
&& (inEditorLength == preserveLength
|
&& (inEditorLength == preserveLength
|
||||||
|| (!inEditor.at(preserveLength).isLetterOrNumber()
|
|| (!inEditor.at(preserveLength).isLetterOrNumber()
|
||||||
|
@@ -271,22 +271,27 @@ bool BasicProposalItemListModel::keepPerfectMatch(AssistReason reason) const
|
|||||||
|
|
||||||
QString BasicProposalItemListModel::proposalPrefix() const
|
QString BasicProposalItemListModel::proposalPrefix() const
|
||||||
{
|
{
|
||||||
if (m_currentItems.size() >= kMaxPrefixFilter)
|
if (m_currentItems.size() >= kMaxPrefixFilter || m_currentItems.isEmpty())
|
||||||
return QString();
|
return QString();
|
||||||
|
|
||||||
// Compute common prefix
|
// Compute common prefix
|
||||||
QString firstKey = m_currentItems.first()->text();
|
QString commonPrefix = m_currentItems.first()->text();
|
||||||
QString lastKey = m_currentItems.last()->text();
|
for (int i = 1, ei = m_currentItems.size(); i < ei; ++i) {
|
||||||
const int length = qMin(firstKey.length(), lastKey.length());
|
QString nextItem = m_currentItems.at(i)->text();
|
||||||
firstKey.truncate(length);
|
const int length = qMin(commonPrefix.length(), nextItem.length());
|
||||||
lastKey.truncate(length);
|
commonPrefix.truncate(length);
|
||||||
|
nextItem.truncate(length);
|
||||||
|
|
||||||
while (firstKey != lastKey) {
|
while (commonPrefix != nextItem) {
|
||||||
firstKey.chop(1);
|
commonPrefix.chop(1);
|
||||||
lastKey.chop(1);
|
nextItem.chop(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return firstKey;
|
if (commonPrefix.isEmpty()) // there is no common prefix, so return.
|
||||||
|
return commonPrefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
return commonPrefix;
|
||||||
}
|
}
|
||||||
|
|
||||||
IAssistProposalItem *BasicProposalItemListModel::proposalItem(int index) const
|
IAssistProposalItem *BasicProposalItemListModel::proposalItem(int index) const
|
||||||
|
Reference in New Issue
Block a user