diff options
author | Orgad Shaneh <orgad.shaneh@audiocodes.com> | 2020-02-19 23:23:36 +0200 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2020-02-20 10:42:31 +0000 |
commit | 3c0b89f697c8f9dbfbf1b4582250b84eb4853d9d (patch) | |
tree | 932663cfc156b33fbd3d943f63c274e9290c4101 | |
parent | 3cdbd8683d3cec1e4adc60bd10cede5fa5b4d866 (diff) | |
download | qt-creator-3c0b89f697c8f9dbfbf1b4582250b84eb4853d9d.tar.gz |
VCS: Refactor annotationChanges() in VcsBaseEditor
Devirtualize the function, and use QRegularExpression with globalMatch.
Change-Id: I18c92cb37b535c616f03f45dff8b18249c961d5d
Reviewed-by: hjk <hjk@qt.io>
-rw-r--r-- | src/plugins/bazaar/bazaareditor.cpp | 23 | ||||
-rw-r--r-- | src/plugins/bazaar/bazaareditor.h | 1 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcaseeditor.cpp | 20 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcaseeditor.h | 1 | ||||
-rw-r--r-- | src/plugins/cvs/cvseditor.cpp | 23 | ||||
-rw-r--r-- | src/plugins/cvs/cvseditor.h | 1 | ||||
-rw-r--r-- | src/plugins/git/giteditor.cpp | 23 | ||||
-rw-r--r-- | src/plugins/git/giteditor.h | 1 | ||||
-rw-r--r-- | src/plugins/mercurial/constants.h | 8 | ||||
-rw-r--r-- | src/plugins/mercurial/mercurialeditor.cpp | 18 | ||||
-rw-r--r-- | src/plugins/mercurial/mercurialeditor.h | 2 | ||||
-rw-r--r-- | src/plugins/perforce/perforceeditor.cpp | 23 | ||||
-rw-r--r-- | src/plugins/perforce/perforceeditor.h | 1 | ||||
-rw-r--r-- | src/plugins/subversion/subversioneditor.cpp | 25 | ||||
-rw-r--r-- | src/plugins/subversion/subversioneditor.h | 1 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseeditor.cpp | 37 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseeditor.h | 6 |
17 files changed, 54 insertions, 160 deletions
diff --git a/src/plugins/bazaar/bazaareditor.cpp b/src/plugins/bazaar/bazaareditor.cpp index 4087bd987c..671f396410 100644 --- a/src/plugins/bazaar/bazaareditor.cpp +++ b/src/plugins/bazaar/bazaareditor.cpp @@ -48,28 +48,7 @@ BazaarEditorWidget::BazaarEditorWidget() : // === <change> <file|dir> 'mainwindow.cpp' setDiffFilePattern(QRegExp(QLatin1String("^=== [a-z]+ [a-z]+ '(.+)'\\s*"))); setLogEntryPattern(QRegExp(QLatin1String("^revno: (\\d+)"))); -} - -QSet<QString> BazaarEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - - QRegExp changeNumRx(QLatin1String("^(" BZR_CHANGE_PATTERN ") ")); - QTC_ASSERT(changeNumRx.isValid(), return changes); - if (changeNumRx.indexIn(txt) != -1) { - changes.insert(changeNumRx.cap(1)); - changeNumRx.setPattern(QLatin1String("\n(" BZR_CHANGE_PATTERN ") ")); - QTC_ASSERT(changeNumRx.isValid(), return changes); - int pos = 0; - while ((pos = changeNumRx.indexIn(txt, pos)) != -1) { - pos += changeNumRx.matchedLength(); - changes.insert(changeNumRx.cap(1)); - } - } - return changes; + setAnnotationEntryPattern("^(" BZR_CHANGE_PATTERN ") "); } QString BazaarEditorWidget::changeUnderCursor(const QTextCursor &cursorIn) const diff --git a/src/plugins/bazaar/bazaareditor.h b/src/plugins/bazaar/bazaareditor.h index 09584462a1..96a9f1610f 100644 --- a/src/plugins/bazaar/bazaareditor.h +++ b/src/plugins/bazaar/bazaareditor.h @@ -40,7 +40,6 @@ public: BazaarEditorWidget(); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &cursor) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; diff --git a/src/plugins/clearcase/clearcaseeditor.cpp b/src/plugins/clearcase/clearcaseeditor.cpp index bcac505c48..341cc92ad8 100644 --- a/src/plugins/clearcase/clearcaseeditor.cpp +++ b/src/plugins/clearcase/clearcaseeditor.cpp @@ -52,24 +52,8 @@ ClearCaseEditorWidget::ClearCaseEditorWidget() : setDiffFilePattern(diffFilePattern); setLogEntryPattern(QRegExp(QLatin1String("version \"([^\"]+)\""))); setAnnotateRevisionTextFormat(tr("Annotate version \"%1\"")); -} - -QSet<QString> ClearCaseEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - // search until header - int separator = txt.indexOf(QRegExp(QLatin1String("\n-{30}"))); - QRegExp r(QLatin1String("([^|]*)\\|[^\n]*\n")); - QTC_ASSERT(r.isValid(), return changes); - int pos = r.indexIn(txt, 0); - while (pos != -1 && pos < separator) { - changes.insert(r.cap(1)); - pos = r.indexIn(txt, pos + r.matchedLength()); - } - return changes; + setAnnotationEntryPattern("([^|]*)\\|[^\\n]*\\n"); + setAnnotationSeparatorPattern("\\n-{30}"); } QString ClearCaseEditorWidget::changeUnderCursor(const QTextCursor &c) const diff --git a/src/plugins/clearcase/clearcaseeditor.h b/src/plugins/clearcase/clearcaseeditor.h index 3c9d95fa09..e97a6ecb22 100644 --- a/src/plugins/clearcase/clearcaseeditor.h +++ b/src/plugins/clearcase/clearcaseeditor.h @@ -41,7 +41,6 @@ public: ClearCaseEditorWidget(); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; diff --git a/src/plugins/cvs/cvseditor.cpp b/src/plugins/cvs/cvseditor.cpp index 8e0b0bbb2c..638945e4e3 100644 --- a/src/plugins/cvs/cvseditor.cpp +++ b/src/plugins/cvs/cvseditor.cpp @@ -59,28 +59,7 @@ CvsEditorWidget::CvsEditorWidget() : setDiffFilePattern(QRegExp(QLatin1String("^[-+]{3} ([^\\t]+)"))); setLogEntryPattern(QRegExp(QLatin1String("^revision (.+)$"))); setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\"")); -} - -QSet<QString> CvsEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - // Hunt for first change number in annotation: "1.1 (author)" - QRegExp r(QLatin1String(CVS_REVISION_AT_START_PATTERN)); - QTC_ASSERT(r.isValid(), return changes); - if (r.indexIn(txt) != -1) { - changes.insert(r.cap(1)); - r.setPattern(QLatin1String("\n(" CVS_REVISION_PATTERN ") ")); - QTC_ASSERT(r.isValid(), return changes); - int pos = 0; - while ((pos = r.indexIn(txt, pos)) != -1) { - pos += r.matchedLength(); - changes.insert(r.cap(1)); - } - } - return changes; + setAnnotationEntryPattern("^(" CVS_REVISION_PATTERN ") "); } QString CvsEditorWidget::changeUnderCursor(const QTextCursor &c) const diff --git a/src/plugins/cvs/cvseditor.h b/src/plugins/cvs/cvseditor.h index f7ce08fd0b..83990d9bc3 100644 --- a/src/plugins/cvs/cvseditor.h +++ b/src/plugins/cvs/cvseditor.h @@ -40,7 +40,6 @@ public: CvsEditorWidget(); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index d9c29afebf..26842a6b1a 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -75,28 +75,7 @@ GitEditorWidget::GitEditorWidget() : setLogEntryPattern(QRegExp("^commit ([0-9a-f]{8})[0-9a-f]{32}")); setAnnotateRevisionTextFormat(tr("&Blame %1")); setAnnotatePreviousRevisionTextFormat(tr("Blame &Parent Revision %1")); -} - -QSet<QString> GitEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - // Hunt for first change number in annotation: "<change>:" - QRegExp r("^(" CHANGE_PATTERN ") "); - QTC_ASSERT(r.isValid(), return changes); - if (r.indexIn(txt) != -1) { - changes.insert(r.cap(1)); - r.setPattern("\n(" CHANGE_PATTERN ") "); - QTC_ASSERT(r.isValid(), return changes); - int pos = 0; - while ((pos = r.indexIn(txt, pos)) != -1) { - pos += r.matchedLength(); - changes.insert(r.cap(1)); - } - } - return changes; + setAnnotationEntryPattern("^(" CHANGE_PATTERN ") "); } QString GitEditorWidget::changeUnderCursor(const QTextCursor &c) const diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index bc7df7fe9e..246ca9788f 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -54,7 +54,6 @@ private: void resetChange(const QByteArray &resetType); void addDiffActions(QMenu *menu, const VcsBase::DiffChunk &chunk) override; void aboutToOpen(const QString &fileName, const QString &realFileName) override; - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter(const QSet<QString> &changes) const override; QString decorateVersion(const QString &revision) const override; diff --git a/src/plugins/mercurial/constants.h b/src/plugins/mercurial/constants.h index 1813d16723..7f8982d49e 100644 --- a/src/plugins/mercurial/constants.h +++ b/src/plugins/mercurial/constants.h @@ -37,10 +37,10 @@ const char MERCURIALDEFAULT[] = "hg"; const char MERCURIAL_CONTEXT[] = "Mercurial Context"; // Changeset identifiers -const char CHANGESETID12[] = " ([a-f0-9]{12,12}) "; //match 12 hex chars and capture -const char CHANGESETID40[] = " ([a-f0-9]{40,40}) "; -const char CHANGEIDEXACT12[] = "[a-f0-9]{12,12}"; //match 12 hex chars a -const char CHANGEIDEXACT40[] = "[a-f0-9]{40,40}"; +const char CHANGESETID12[] = " ([a-f0-9]{12}) "; //match 12 hex chars and capture +const char CHANGESETID40[] = " ([a-f0-9]{40}) "; +const char CHANGEIDEXACT12[] = "[a-f0-9]{12}"; //match 12 hex chars +const char CHANGEIDEXACT40[] = "[a-f0-9]{40}"; // match diff header. e.g. +++ b/filename const char DIFFIDENTIFIER[] = "^(?:diff --git a/|[+-]{3} (?:/dev/null|[ab]/(.+$)))"; diff --git a/src/plugins/mercurial/mercurialeditor.cpp b/src/plugins/mercurial/mercurialeditor.cpp index e4c313e11a..676f26ea8f 100644 --- a/src/plugins/mercurial/mercurialeditor.cpp +++ b/src/plugins/mercurial/mercurialeditor.cpp @@ -45,7 +45,6 @@ namespace Internal { MercurialEditorWidget::MercurialEditorWidget(MercurialClient *client) : exactIdentifier12(QLatin1String(Constants::CHANGEIDEXACT12)), exactIdentifier40(QLatin1String(Constants::CHANGEIDEXACT40)), - changesetIdentifier12(QLatin1String(Constants::CHANGESETID12)), changesetIdentifier40(QLatin1String(Constants::CHANGESETID40)), m_client(client) { @@ -53,22 +52,7 @@ MercurialEditorWidget::MercurialEditorWidget(MercurialClient *client) : setLogEntryPattern(QRegExp(QLatin1String("^changeset:\\s+(\\S+)$"))); setAnnotateRevisionTextFormat(tr("&Annotate %1")); setAnnotatePreviousRevisionTextFormat(tr("Annotate &parent revision %1")); -} - -QSet<QString> MercurialEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString data = toPlainText(); - if (data.isEmpty()) - return changes; - - int position = 0; - while ((position = changesetIdentifier12.indexIn(data, position)) != -1) { - changes.insert(changesetIdentifier12.cap(1)); - position += changesetIdentifier12.matchedLength(); - } - - return changes; + setAnnotationEntryPattern(Constants::CHANGESETID12); } QString MercurialEditorWidget::changeUnderCursor(const QTextCursor &cursorIn) const diff --git a/src/plugins/mercurial/mercurialeditor.h b/src/plugins/mercurial/mercurialeditor.h index 12976a3d77..868f84f535 100644 --- a/src/plugins/mercurial/mercurialeditor.h +++ b/src/plugins/mercurial/mercurialeditor.h @@ -41,7 +41,6 @@ public: explicit MercurialEditorWidget(MercurialClient *client); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &cursor) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; @@ -50,7 +49,6 @@ private: mutable QRegExp exactIdentifier12; mutable QRegExp exactIdentifier40; - mutable QRegExp changesetIdentifier12; const QRegExp changesetIdentifier40; MercurialClient *m_client; diff --git a/src/plugins/perforce/perforceeditor.cpp b/src/plugins/perforce/perforceeditor.cpp index e686d4e427..82e7d166f2 100644 --- a/src/plugins/perforce/perforceeditor.cpp +++ b/src/plugins/perforce/perforceeditor.cpp @@ -63,28 +63,7 @@ PerforceEditorWidget::PerforceEditorWidget() : setDiffFilePattern(QRegExp(QLatin1String("^(?:={4}|\\+{3}) (.+)(?:\\t|#\\d)"))); setLogEntryPattern(QRegExp(QLatin1String("^... #\\d change (\\d+) "))); setAnnotateRevisionTextFormat(tr("Annotate change list \"%1\"")); -} - -QSet<QString> PerforceEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - // Hunt for first change number in annotation: "<change>:" - QRegExp r(QLatin1String("^(\\d+):")); - QTC_ASSERT(r.isValid(), return changes); - if (r.indexIn(txt) != -1) { - changes.insert(r.cap(1)); - r.setPattern(QLatin1String("\n(\\d+):")); - QTC_ASSERT(r.isValid(), return changes); - int pos = 0; - while ((pos = r.indexIn(txt, pos)) != -1) { - pos += r.matchedLength(); - changes.insert(r.cap(1)); - } - } - return changes; + setAnnotationEntryPattern("^(\\d+):"); } QString PerforceEditorWidget::changeUnderCursor(const QTextCursor &c) const diff --git a/src/plugins/perforce/perforceeditor.h b/src/plugins/perforce/perforceeditor.h index 2a91373aac..92a9d23486 100644 --- a/src/plugins/perforce/perforceeditor.h +++ b/src/plugins/perforce/perforceeditor.h @@ -40,7 +40,6 @@ public: PerforceEditorWidget(); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; diff --git a/src/plugins/subversion/subversioneditor.cpp b/src/plugins/subversion/subversioneditor.cpp index cb48da5daa..7ef6e08443 100644 --- a/src/plugins/subversion/subversioneditor.cpp +++ b/src/plugins/subversion/subversioneditor.cpp @@ -59,30 +59,7 @@ SubversionEditorWidget::SubversionEditorWidget() : setDiffFilePattern(QRegExp(QLatin1String("^[-+]{3} ([^\\t]+)|^Index: .*|^=+$"))); setLogEntryPattern(QRegExp(QLatin1String("^(r\\d+) \\|"))); setAnnotateRevisionTextFormat(tr("Annotate revision \"%1\"")); -} - -QSet<QString> SubversionEditorWidget::annotationChanges() const -{ - QSet<QString> changes; - const QString txt = toPlainText(); - if (txt.isEmpty()) - return changes; - // Hunt for first change number in annotation: "<change>:" - QRegExp r(QLatin1String("^(\\d+):")); - QTC_ASSERT(r.isValid(), return changes); - if (r.indexIn(txt) != -1) { - changes.insert(r.cap(1)); - r.setPattern(QLatin1String("\n(\\d+):")); - QTC_ASSERT(r.isValid(), return changes); - int pos = 0; - while ((pos = r.indexIn(txt, pos)) != -1) { - pos += r.matchedLength(); - changes.insert(r.cap(1)); - } - } - if (Subversion::Constants::debug) - qDebug() << "SubversionEditor::annotationChanges() returns #" << changes.size(); - return changes; + setAnnotationEntryPattern("^(\\d+):"); } QString SubversionEditorWidget::changeUnderCursor(const QTextCursor &c) const diff --git a/src/plugins/subversion/subversioneditor.h b/src/plugins/subversion/subversioneditor.h index 6b2446ffde..a7b44f66b9 100644 --- a/src/plugins/subversion/subversioneditor.h +++ b/src/plugins/subversion/subversioneditor.h @@ -40,7 +40,6 @@ public: SubversionEditorWidget(); private: - QSet<QString> annotationChanges() const override; QString changeUnderCursor(const QTextCursor &) const override; VcsBase::BaseAnnotationHighlighter *createAnnotationHighlighter( const QSet<QString> &changes) const override; diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp index 0471968dcf..aae366dcb4 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.cpp +++ b/src/plugins/vcsbase/vcsbaseeditor.cpp @@ -50,6 +50,7 @@ #include <QDebug> #include <QFileInfo> #include <QFile> +#include <QRegularExpression> #include <QRegExp> #include <QSet> #include <QTextCodec> @@ -556,6 +557,8 @@ public: QRegExp m_diffFilePattern; QRegExp m_logEntryPattern; + QRegularExpression m_annotationEntryPattern; + QRegularExpression m_annotationSeparatorPattern; QList<int> m_entrySections; // line number where this section starts int m_cursorLine = -1; int m_firstLineNumber = -1; @@ -661,6 +664,20 @@ void VcsBaseEditorWidget::setLogEntryPattern(const QRegExp &pattern) d->m_logEntryPattern = pattern; } +void VcsBaseEditorWidget::setAnnotationEntryPattern(const QString &pattern) +{ + const QRegularExpression re(pattern, QRegularExpression::MultilineOption); + QTC_ASSERT(re.isValid() && re.captureCount() >= 1, return); + d->m_annotationEntryPattern = re; +} + +void VcsBaseEditorWidget::setAnnotationSeparatorPattern(const QString &pattern) +{ + const QRegularExpression re(pattern); + QTC_ASSERT(re.isValid() && re.captureCount() >= 1, return); + d->m_annotationSeparatorPattern = re; +} + bool VcsBaseEditorWidget::supportChangeLinks() const { switch (d->m_parameters->type) { @@ -1537,6 +1554,26 @@ void VcsBaseEditorWidget::addChangeActions(QMenu *, const QString &) { } +QSet<QString> VcsBaseEditorWidget::annotationChanges() const +{ + QSet<QString> changes; + QString text = toPlainText(); + QStringRef txt(&text); + if (txt.isEmpty()) + return changes; + if (d->m_annotationSeparatorPattern.isValid()) { + const QRegularExpressionMatch match = d->m_annotationSeparatorPattern.match(txt); + if (match.hasMatch()) + txt.truncate(match.capturedStart()); + } + QRegularExpressionMatchIterator i = d->m_annotationEntryPattern.globalMatch(txt); + while (i.hasNext()) { + const QRegularExpressionMatch match = i.next(); + changes.insert(match.captured(1)); + } + return changes; +} + QString VcsBaseEditorWidget::decorateVersion(const QString &revision) const { return revision; diff --git a/src/plugins/vcsbase/vcsbaseeditor.h b/src/plugins/vcsbase/vcsbaseeditor.h index 863d300d62..caf2d4575d 100644 --- a/src/plugins/vcsbase/vcsbaseeditor.h +++ b/src/plugins/vcsbase/vcsbaseeditor.h @@ -148,6 +148,10 @@ protected: void setDiffFilePattern(const QRegExp &pattern); // Pattern for log entry. hash/revision number must be in the first capture group void setLogEntryPattern(const QRegExp &pattern); + // Pattern for annotation entry. hash/revision number must be in the first capture group + void setAnnotationEntryPattern(const QString &pattern); + // Pattern for annotation separator. Lookup will stop on match. + void setAnnotationSeparatorPattern(const QString &pattern); virtual bool supportChangeLinks() const; virtual QString fileNameForLine(int line) const; @@ -246,7 +250,7 @@ protected: // Implement to return a set of change identifiers in // annotation mode - virtual QSet<QString> annotationChanges() const = 0; + QSet<QString> annotationChanges() const; // Implement to identify a change number at the cursor position virtual QString changeUnderCursor(const QTextCursor &) const = 0; // Factory functions for highlighters |