summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2022-07-05 14:28:52 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-07-11 09:32:27 +0000
commitd334d4541161df721a29f7ef2c048ba25cfe8ee6 (patch)
tree08724b96da5b9d871dca586ab8ea9aaa78d272d1
parent33170c8730580018e2edd85a7cb8ab87144e890f (diff)
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.cpp64
1 files 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<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;
@@ -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;
}