diff --git a/src/controllers/filters/lang/Filter.cpp b/src/controllers/filters/lang/Filter.cpp index aa1dc0f3430..1eb71e1b871 100644 --- a/src/controllers/filters/lang/Filter.cpp +++ b/src/controllers/filters/lang/Filter.cpp @@ -48,7 +48,7 @@ ContextMap buildContextMap(const MessagePtr &m, chatterino::Channel *channel) /* * Looking to add a new identifier to filters? Here's what to do: - * 1. Update validIdentifiersMap in Tokenizer.hpp + * 1. Update validIdentifiersMap in Tokenizer.cpp * 2. Add the identifier to the list below * 3. Add the type of the identifier to MESSAGE_TYPING_CONTEXT in Filter.hpp * 4. Add the value for the identifier to the ContextMap returned by this function diff --git a/src/controllers/filters/lang/Tokenizer.cpp b/src/controllers/filters/lang/Tokenizer.cpp index 602e145dd10..09e2e65a633 100644 --- a/src/controllers/filters/lang/Tokenizer.cpp +++ b/src/controllers/filters/lang/Tokenizer.cpp @@ -16,39 +16,44 @@ const QRegularExpression TOKEN_REGEX( namespace chatterino::filters { -extern const QMap validIdentifiersMap = { - {"author.badges", "author badges"}, - {"author.color", "author color"}, - {"author.name", "author name"}, - {"author.no_color", "author has no color?"}, - {"author.subbed", "author subscribed?"}, - {"author.sub_length", "author sub length"}, - {"channel.name", "channel name"}, - {"channel.watching", "/watching channel?"}, - {"channel.live", "channel live?"}, - {"flags.action", "action/me message?"}, - {"flags.highlighted", "highlighted?"}, - {"flags.points_redeemed", "redeemed points?"}, - {"flags.sub_message", "sub/resub message?"}, - {"flags.system_message", "system message?"}, - {"flags.reward_message", "channel point reward message?"}, - {"flags.first_message", "first message?"}, - {"flags.elevated_message", "hype chat message?"}, - // Ideally these values are unique, because ChannelFilterEditorDialog::ValueSpecifier::expressionText depends on - // std::map layout in Qt 6 and internal implementation in Qt 5. - {"flags.hype_chat", "hype chat message?"}, - {"flags.cheer_message", "cheer message?"}, - {"flags.whisper", "whisper message?"}, - {"flags.reply", "reply message?"}, - {"flags.automod", "automod message?"}, - {"flags.restricted", "restricted message?"}, - {"flags.monitored", "monitored message?"}, - {"message.content", "message text"}, - {"message.length", "message length"}, - {"reward.title", "point reward title"}, - {"reward.cost", "point reward cost"}, - {"reward.id", "point reward id"}, -}; +const QMap &validIdentifiersMap() +{ + static const QMap map = { + {"author.badges", "author badges"}, + {"author.color", "author color"}, + {"author.name", "author name"}, + {"author.no_color", "author has no color?"}, + {"author.subbed", "author subscribed?"}, + {"author.sub_length", "author sub length"}, + {"channel.name", "channel name"}, + {"channel.watching", "/watching channel?"}, + {"channel.live", "channel live?"}, + {"flags.action", "action/me message?"}, + {"flags.highlighted", "highlighted?"}, + {"flags.points_redeemed", "redeemed points?"}, + {"flags.sub_message", "sub/resub message?"}, + {"flags.system_message", "system message?"}, + {"flags.reward_message", "channel point reward message?"}, + {"flags.first_message", "first message?"}, + {"flags.elevated_message", "hype chat message?"}, + // Ideally these values are unique, because ChannelFilterEditorDialog::ValueSpecifier::expressionText depends on + // std::map layout in Qt 6 and internal implementation in Qt 5. + {"flags.hype_chat", "hype chat message?"}, + {"flags.cheer_message", "cheer message?"}, + {"flags.whisper", "whisper message?"}, + {"flags.reply", "reply message?"}, + {"flags.automod", "automod message?"}, + {"flags.restricted", "restricted message?"}, + {"flags.monitored", "monitored message?"}, + {"message.content", "message text"}, + {"message.length", "message length"}, + {"reward.title", "point reward title"}, + {"reward.cost", "point reward cost"}, + {"reward.id", "point reward id"}, + }; + + return map; +} QString tokenTypeToInfoString(TokenType type) { @@ -324,7 +329,7 @@ TokenType Tokenizer::tokenize(const QString &text) return TokenType::STRING; } - if (validIdentifiersMap.keys().contains(text)) + if (validIdentifiersMap().keys().contains(text)) { return TokenType::IDENTIFIER; } diff --git a/src/controllers/filters/lang/Tokenizer.hpp b/src/controllers/filters/lang/Tokenizer.hpp index 9528baea2c2..b2b93a8b595 100644 --- a/src/controllers/filters/lang/Tokenizer.hpp +++ b/src/controllers/filters/lang/Tokenizer.hpp @@ -8,7 +8,7 @@ namespace chatterino::filters { -extern const QMap validIdentifiersMap; +const QMap &validIdentifiersMap(); enum TokenType { // control diff --git a/src/messages/Emote.hpp b/src/messages/Emote.hpp index 0269b023609..d0861849bfe 100644 --- a/src/messages/Emote.hpp +++ b/src/messages/Emote.hpp @@ -55,7 +55,7 @@ class EmoteMap : public std::unordered_map const QString &emoteID) const; }; -const std::shared_ptr EMPTY_EMOTE_MAP = std::make_shared< +inline const std::shared_ptr EMPTY_EMOTE_MAP = std::make_shared< const EmoteMap>(); // NOLINT(cert-err58-cpp) -- assume this doesn't throw an exception EmotePtr cachedOrMakeEmotePtr(Emote &&emote, const EmoteMap &cache); diff --git a/src/widgets/dialogs/ChannelFilterEditorDialog.cpp b/src/widgets/dialogs/ChannelFilterEditorDialog.cpp index 85a778546ac..9856ae6160f 100644 --- a/src/widgets/dialogs/ChannelFilterEditorDialog.cpp +++ b/src/widgets/dialogs/ChannelFilterEditorDialog.cpp @@ -100,7 +100,7 @@ ChannelFilterEditorDialog::ValueSpecifier::ValueSpecifier() this->typeCombo_->insertItems( 0, {"Constant Text", "Constant Number", "Variable"}); - this->varCombo_->insertItems(0, filters::validIdentifiersMap.values()); + this->varCombo_->insertItems(0, filters::validIdentifiersMap().values()); this->layout_->addWidget(this->typeCombo_); this->layout_->addWidget(this->varCombo_, 1); @@ -142,7 +142,7 @@ void ChannelFilterEditorDialog::ValueSpecifier::setValue(const QString &value) if (this->typeCombo_->currentIndex() == 2) { this->varCombo_->setCurrentText( - filters::validIdentifiersMap.value(value)); + filters::validIdentifiersMap().value(value)); } else { @@ -165,7 +165,7 @@ QString ChannelFilterEditorDialog::ValueSpecifier::expressionText() case 1: // number return this->valueInput_->text(); case 2: // variable - return filters::validIdentifiersMap.key( + return filters::validIdentifiersMap().key( this->varCombo_->currentText()); default: return ""; diff --git a/tests/src/Emojis.cpp b/tests/src/Emojis.cpp index 42df110a426..a5df094e40b 100644 --- a/tests/src/Emojis.cpp +++ b/tests/src/Emojis.cpp @@ -1,6 +1,7 @@ #include "providers/emoji/Emojis.hpp" #include "common/Literals.hpp" +#include "messages/Emote.hpp" #include "Test.hpp" #include @@ -15,6 +16,9 @@ TEST(Emojis, ShortcodeParsing) emojis.load(); + ASSERT_NE(EMPTY_EMOTE_MAP, nullptr); + ASSERT_TRUE(EMPTY_EMOTE_MAP->empty()); + struct TestCase { QString input; QString expectedOutput;