From d334d4541161df721a29f7ef2c048ba25cfe8ee6 Mon Sep 17 00:00:00 2001 From: Joerg Bornemann Date: Tue, 5 Jul 2022 14:28:52 +0200 Subject: 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 (cherry picked from commit a7c9bd037a4d3baa37185b091c6f1f69b66b931f) Reviewed-by: Qt Cherry-pick Bot --- src/linguist/shared/translator.cpp | 64 ++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/linguist/shared/translator.cpp b/src/linguist/shared/translator.cpp index d1d137aba..d552fddf8 100644 --- a/src/linguist/shared/translator.cpp +++ b/src/linguist/shared/translator.cpp @@ -516,18 +516,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); @@ -542,18 +551,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); @@ -579,33 +580,32 @@ inline bool operator==(TranslatorMessageContentPtr tmp1, TranslatorMessageConten Translator::Duplicates Translator::resolveDuplicates() { - QList duplicateIndices; Duplicates dups; - QHash idRefs; - QHash contentRefs; - for (int i = 0; i < m_messages.count(); ++i) { + QSet idRefs; + QSet contentRefs; + for (int i = 0; i < m_messages.count();) { const TranslatorMessage &msg = m_messages.at(i); TranslatorMessage *omsg; int oi; QSet *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; @@ -614,21 +614,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; } -- cgit v1.2.3