diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2022-07-05 14:28:52 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-07-11 09:32:27 +0000 |
commit | 3dc0388995f37f9a737fca84021aeaddc29cfbb3 (patch) | |
tree | 62acf332f6ef182da5852abb0882341684144369 | |
parent | 6d22b962879ecca4969aa16c1ba0ef68efbf5d94 (diff) | |
download | qttools-3dc0388995f37f9a737fca84021aeaddc29cfbb3.tar.gz |
lrelease: Fix reporting of duplicates
This reverts commit 3af741cc180445cc487af6853575651ba204c4c1 and fixes
QTBUG-86507 differently.
The fix for QTBUG-86507 modified the algorithm to not remove elements
from m_messages while looping over it. However, that changes the
indices that are returned by resolveDuplicates.
Bring back the old algorithm and change the TranslateMessage*Ptr classes
to hold indices to elements of m_messages instead of pointers.
Task-number: QTBUG-86507
Change-Id: Ib395fa48da4e0d688ac7f2b766134c7711412b1b
Reviewed-by: hjk <hjk@qt.io>
(cherry picked from commit a7c9bd037a4d3baa37185b091c6f1f69b66b931f)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/linguist/shared/translator.cpp | 64 |
1 files changed, 30 insertions, 34 deletions
diff --git a/src/linguist/shared/translator.cpp b/src/linguist/shared/translator.cpp index d4e40aba4..3a0df205d 100644 --- a/src/linguist/shared/translator.cpp +++ b/src/linguist/shared/translator.cpp @@ -491,18 +491,27 @@ void Translator::dropUiLines() } } -struct TranslatorMessageIdPtr { - explicit TranslatorMessageIdPtr(const TranslatorMessage &tm) +class TranslatorMessagePtrBase +{ +public: + explicit TranslatorMessagePtrBase(const Translator *tor, int messageIndex) + : tor(tor), messageIndex(messageIndex) { - ptr = &tm; } inline const TranslatorMessage *operator->() const { - return ptr; + return &tor->message(messageIndex); } - const TranslatorMessage *ptr; + const Translator *tor; + const int messageIndex; +}; + +class TranslatorMessageIdPtr : public TranslatorMessagePtrBase +{ +public: + using TranslatorMessagePtrBase::TranslatorMessagePtrBase; }; Q_DECLARE_TYPEINFO(TranslatorMessageIdPtr, Q_RELOCATABLE_TYPE); @@ -517,18 +526,10 @@ inline bool operator==(TranslatorMessageIdPtr tmp1, TranslatorMessageIdPtr tmp2) return tmp1->id() == tmp2->id(); } -struct TranslatorMessageContentPtr { - explicit TranslatorMessageContentPtr(const TranslatorMessage &tm) - { - ptr = &tm; - } - - inline const TranslatorMessage *operator->() const - { - return ptr; - } - - const TranslatorMessage *ptr; +class TranslatorMessageContentPtr : public TranslatorMessagePtrBase +{ +public: + using TranslatorMessagePtrBase::TranslatorMessagePtrBase; }; Q_DECLARE_TYPEINFO(TranslatorMessageContentPtr, Q_RELOCATABLE_TYPE); @@ -554,33 +555,32 @@ inline bool operator==(TranslatorMessageContentPtr tmp1, TranslatorMessageConten Translator::Duplicates Translator::resolveDuplicates() { - QList<int> duplicateIndices; Duplicates dups; - QHash<TranslatorMessageIdPtr, int> idRefs; - QHash<TranslatorMessageContentPtr, int> contentRefs; - for (int i = 0; i < m_messages.count(); ++i) { + QSet<TranslatorMessageIdPtr> idRefs; + QSet<TranslatorMessageContentPtr> contentRefs; + for (int i = 0; i < m_messages.count();) { const TranslatorMessage &msg = m_messages.at(i); TranslatorMessage *omsg; int oi; QSet<int> *pDup; if (!msg.id().isEmpty()) { - const auto it = idRefs.constFind(TranslatorMessageIdPtr(msg)); + const auto it = idRefs.constFind(TranslatorMessageIdPtr(this, i)); if (it != idRefs.constEnd()) { - oi = *it; + oi = it->messageIndex; omsg = &m_messages[oi]; pDup = &dups.byId; goto gotDupe; } } { - const auto it = contentRefs.constFind(TranslatorMessageContentPtr(msg)); + const auto it = contentRefs.constFind(TranslatorMessageContentPtr(this, i)); if (it != contentRefs.constEnd()) { - oi = *it; + oi = it->messageIndex; omsg = &m_messages[oi]; if (msg.id().isEmpty() || omsg->id().isEmpty()) { if (!msg.id().isEmpty() && omsg->id().isEmpty()) { omsg->setId(msg.id()); - idRefs[TranslatorMessageIdPtr(*omsg)] = oi; + idRefs.insert(TranslatorMessageIdPtr(this, oi)); } pDup = &dups.byContents; goto gotDupe; @@ -589,21 +589,17 @@ Translator::Duplicates Translator::resolveDuplicates() } } if (!msg.id().isEmpty()) - idRefs[TranslatorMessageIdPtr(msg)] = i; - contentRefs[TranslatorMessageContentPtr(msg)] = i; + idRefs.insert(TranslatorMessageIdPtr(this, i)); + contentRefs.insert(TranslatorMessageContentPtr(this, i)); + ++i; continue; gotDupe: pDup->insert(oi); if (!omsg->isTranslated() && msg.isTranslated()) omsg->setTranslations(msg.translations()); m_indexOk = false; - // don't remove the duplicate entries yet to not mess up the pointers that - // are in the hashes - duplicateIndices.append(i); + m_messages.removeAt(i); } - // now remove the duplicates from the messages - for (int i = duplicateIndices.size() - 1; i >= 0; --i) - m_messages.removeAt(duplicateIndices.at(i)); return dups; } |