Fix highlighting of regexp search results in editor

The highlighting in the editor was still done with QRegExp,
so if you used Perl regular expression features, highlighting in
the editor was incorrect.

Fixes: QTCREATORBUG-21940
Change-Id: I785f0b2413a291d9f06de5877b18067a30d58588
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Eike Ziller
2019-02-05 15:17:35 +01:00
parent dd0156d1fa
commit 14f66e0eb5

View File

@@ -692,7 +692,8 @@ public:
QTextCursor m_pendingLinkUpdate;
QTextCursor m_lastLinkUpdate;
QRegExp m_searchExpr;
QRegularExpression m_searchExpr;
QString m_findText;
FindFlags m_findFlags;
void highlightSearchResults(const QTextBlock &block, const PaintEventData &data) const;
QTimer m_delayedUpdateTimer;
@@ -3663,7 +3664,7 @@ QTextBlock TextEditorWidgetPrivate::foldedBlockAt(const QPoint &pos, QRect *box)
void TextEditorWidgetPrivate::highlightSearchResults(const QTextBlock &block, const PaintEventData &data) const
{
if (m_searchExpr.isEmpty())
if (m_searchExpr.pattern().isEmpty())
return;
int blockPosition = block.position();
@@ -3682,10 +3683,11 @@ void TextEditorWidgetPrivate::highlightSearchResults(const QTextBlock &block, co
.toTextCharFormat(C_SEARCH_RESULT).background().color().darker(120);
while (idx < text.length()) {
idx = m_searchExpr.indexIn(text, idx + l);
if (idx < 0)
const QRegularExpressionMatch match = m_searchExpr.match(text, idx + 1);
if (!match.hasMatch())
break;
l = m_searchExpr.matchedLength();
idx = match.capturedStart();
l = match.capturedLength();
if (l == 0)
break;
if ((m_findFlags & FindWholeWords)
@@ -4280,7 +4282,7 @@ void TextEditorWidgetPrivate::paintSearchResultOverlay(const PaintEventData &dat
QPainter &painter) const
{
m_searchResultOverlay->clear();
if (m_searchExpr.isEmpty())
if (m_searchExpr.pattern().isEmpty())
return;
const int margin = 5;
@@ -5283,7 +5285,7 @@ void TextEditorWidgetPrivate::slotUpdateRequest(const QRect &r, int dy)
m_extraArea->scroll(0, dy);
} else if (r.width() > 4) { // wider than cursor width, not just cursor blinking
m_extraArea->update(0, r.y(), m_extraArea->width(), r.height());
if (!m_searchExpr.isEmpty()) {
if (!m_searchExpr.pattern().isEmpty()) {
const int m = m_searchResultOverlay->dropShadowWidth();
q->viewport()->update(r.adjusted(-m, -m, m, m));
}
@@ -6303,13 +6305,16 @@ void TextEditorWidgetPrivate::clearLink()
void TextEditorWidgetPrivate::highlightSearchResultsSlot(const QString &txt, FindFlags findFlags)
{
if (m_searchExpr.pattern() == txt)
const QString pattern = (findFlags & FindRegularExpression) ? txt
: QRegularExpression::escape(txt);
const QRegularExpression::PatternOptions options
= (findFlags & FindCaseSensitively) ? QRegularExpression::NoPatternOption
: QRegularExpression::CaseInsensitiveOption;
if (m_searchExpr.pattern() == pattern && m_searchExpr.patternOptions() == options)
return;
m_searchExpr.setPattern(txt);
m_searchExpr.setPatternSyntax((findFlags & FindRegularExpression) ?
QRegExp::RegExp : QRegExp::FixedString);
m_searchExpr.setCaseSensitivity((findFlags & FindCaseSensitively) ?
Qt::CaseSensitive : Qt::CaseInsensitive);
m_searchExpr.setPattern(pattern);
m_searchExpr.setPatternOptions(options);
m_findText = txt;
m_findFlags = findFlags;
m_delayedUpdateTimer.start(50);
@@ -6367,7 +6372,7 @@ void TextEditorWidgetPrivate::highlightSearchResultsInScrollBar()
m_searchWatcher = nullptr;
}
const QString &txt = m_searchExpr.pattern();
const QString &txt = m_findText;
if (txt.isEmpty())
return;