Skip to content

Commit

Permalink
Use ZoneState to check whether localize key is duplicated
Browse files Browse the repository at this point in the history
  • Loading branch information
Laupetin committed Dec 31, 2023
1 parent e4cfda7 commit 196e2ed
Show file tree
Hide file tree
Showing 13 changed files with 59 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw(
if (!file.IsOpen())
return false;

LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language);
auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState<LocalizeReadingZoneState>();
LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState);
const auto localizeEntries = reader.ReadLocalizeFile();

for (const auto& [key, value] : localizeEntries)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw(
if (!file.IsOpen())
return false;

LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language);
auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState<LocalizeReadingZoneState>();
LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState);
const auto localizeEntries = reader.ReadLocalizeFile();

for (const auto& [key, value] : localizeEntries)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw(
if (!file.IsOpen())
return false;

LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language);
auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState<LocalizeReadingZoneState>();
LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState);
const auto localizeEntries = reader.ReadLocalizeFile();

for (const auto& [key, value] : localizeEntries)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ bool AssetLoaderLocalizeEntry::LoadFromRaw(
if (!file.IsOpen())
return false;

LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language);
auto* zoneState = manager->GetAssetLoadingContext()->GetZoneAssetLoaderState<LocalizeReadingZoneState>();
LocalizeFileReader reader(*file.m_stream, assetName, zone->m_language, zoneState);
const auto localizeEntries = reader.ReadLocalizeFile();

for (const auto& [key, value] : localizeEntries)
Expand Down
11 changes: 11 additions & 0 deletions src/ObjLoading/Localize/LocalizeReadingZoneState.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include "LocalizeReadingZoneState.h"

bool LocalizeReadingZoneState::DoLocalizeEntryDuplicateCheck(const std::string& key)
{
const auto existingEntry = m_keys.find(key);
if (existingEntry != m_keys.end())
return false;

m_keys.emplace(key);
return true;
}
22 changes: 22 additions & 0 deletions src/ObjLoading/Localize/LocalizeReadingZoneState.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#pragma once

#include "AssetLoading/IZoneAssetLoaderState.h"

#include <string>
#include <unordered_set>

class LocalizeReadingZoneState final : public IZoneAssetLoaderState
{
public:
/**
* Checks whether a localize key was already added.
* Inserts key if it was not added yet.
*
* \param key The key to check
* \returns \c true if key was not duplicated yet, \c false otherwise
*/
bool DoLocalizeEntryDuplicateCheck(const std::string& key);

private:
std::unordered_set<std::string> m_keys;
};
4 changes: 2 additions & 2 deletions src/ObjLoading/Localize/Parsing/LocalizeFileParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
#include "Sequence/SequenceLocalizeFileReference.h"
#include "Sequence/SequenceLocalizeFileVersion.h"

LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language)
: AbstractParser(lexer, std::make_unique<LocalizeFileParserState>(language))
LocalizeFileParser::LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState)
: AbstractParser(lexer, std::make_unique<LocalizeFileParserState>(language, zoneState))
{
}

Expand Down
2 changes: 1 addition & 1 deletion src/ObjLoading/Localize/Parsing/LocalizeFileParser.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@ class LocalizeFileParser final : public AbstractParser<SimpleParserValue, Locali
const std::vector<sequence_t*>& GetTestsForState() override;

public:
LocalizeFileParser(SimpleLexer* lexer, GameLanguage language);
LocalizeFileParser(SimpleLexer* lexer, GameLanguage language, LocalizeReadingZoneState* zoneState);
std::map<std::string, std::string> GetParsedValues();
};
5 changes: 3 additions & 2 deletions src/ObjLoading/Localize/Parsing/LocalizeFileParserState.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@

#include "Localize/LocalizeCommon.h"

LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language)
LocalizeFileParserState::LocalizeFileParserState(const GameLanguage language, LocalizeReadingZoneState* zoneState)
: m_end(false),
m_language(language)
m_language(language),
m_zone_state(zoneState)
{
m_language_name_caps = LocalizeCommon::GetNameOfLanguage(m_language);
for (auto& c : m_language_name_caps)
Expand Down
5 changes: 4 additions & 1 deletion src/ObjLoading/Localize/Parsing/LocalizeFileParserState.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#pragma once

#include "Game/GameLanguage.h"
#include "Localize/LocalizeReadingZoneState.h"

#include <map>
#include <unordered_set>
Expand All @@ -12,10 +14,11 @@ class LocalizeFileParserState
std::map<std::string, std::string> m_entries;

GameLanguage m_language;
LocalizeReadingZoneState* m_zone_state;
std::string m_language_name_caps;

std::string m_current_reference;
std::unordered_set<std::string> m_current_reference_languages;

explicit LocalizeFileParserState(GameLanguage language);
LocalizeFileParserState(GameLanguage language, LocalizeReadingZoneState* zoneState);
};
7 changes: 4 additions & 3 deletions src/ObjLoading/Localize/Parsing/LocalizeFileReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@
#include "Parsing/Impl/CommentRemovingStreamProxy.h"
#include "Parsing/Impl/ParserSingleInputStream.h"

LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language)
LocalizeFileReader::LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState)
: m_file_name(std::move(fileName)),
m_stream(nullptr),
m_language(language)
m_language(language),
m_zone_state(zoneState)
{
OpenBaseStream(stream);
SetupStreamProxies();
Expand Down Expand Up @@ -37,7 +38,7 @@ std::map<std::string, std::string> LocalizeFileReader::ReadLocalizeFile()
lexerConfig.m_read_floating_point_numbers = false;
const auto lexer = std::make_unique<SimpleLexer>(m_stream, std::move(lexerConfig));

const auto parser = std::make_unique<LocalizeFileParser>(lexer.get(), m_language);
const auto parser = std::make_unique<LocalizeFileParser>(lexer.get(), m_language, m_zone_state);

if (parser->Parse())
return parser->GetParsedValues();
Expand Down
4 changes: 3 additions & 1 deletion src/ObjLoading/Localize/Parsing/LocalizeFileReader.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#pragma once

#include "Game/GameLanguage.h"
#include "Localize/LocalizeReadingZoneState.h"
#include "Parsing/IParserLineStream.h"

#include <map>
Expand All @@ -14,12 +15,13 @@ class LocalizeFileReader
IParserLineStream* m_stream;
std::vector<std::unique_ptr<IParserLineStream>> m_open_streams;
GameLanguage m_language;
LocalizeReadingZoneState* m_zone_state;

bool OpenBaseStream(std::istream& stream);
void SetupStreamProxies();

public:
LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language);
LocalizeFileReader(std::istream& stream, std::string fileName, GameLanguage language, LocalizeReadingZoneState* zoneState);

std::map<std::string, std::string> ReadLocalizeFile();
};
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ void SequenceLocalizeFileLanguageValue::ProcessMatch(LocalizeFileParserState* st
if (langName == state->m_language_name_caps)
{
const auto& currentReference = state->m_current_reference;
if (const auto i = state->m_entries.find(currentReference); i != state->m_entries.end())
if (!state->m_zone_state->DoLocalizeEntryDuplicateCheck(currentReference))
{
std::cout << "Localize: a value for reference \"" << currentReference << "\" was already defined\n";
}
Expand Down

0 comments on commit 196e2ed

Please sign in to comment.