mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-21 08:35:43 +00:00
resolve forward declarations
This commit is contained in:
parent
e51babaeb4
commit
2747e1f0f2
@ -13,7 +13,7 @@ const std::vector<HeaderParser::sequence_t*>& HeaderParser::GetTestsForState()
|
|||||||
return m_state->GetBlock()->GetTestsForBlock();
|
return m_state->GetBlock()->GetTestsForBlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderParser::SaveToRepository(IDataRepository* repository) const
|
bool HeaderParser::SaveToRepository(IDataRepository* repository) const
|
||||||
{
|
{
|
||||||
return m_state->SaveToRepository(repository);
|
return m_state->SaveToRepository(repository);
|
||||||
}
|
}
|
||||||
|
@ -14,5 +14,5 @@ protected:
|
|||||||
public:
|
public:
|
||||||
HeaderParser(HeaderLexer* lexer, const IPackValueSupplier* packValueSupplier);
|
HeaderParser(HeaderLexer* lexer, const IPackValueSupplier* packValueSupplier);
|
||||||
|
|
||||||
void SaveToRepository(IDataRepository* repository) const;
|
bool SaveToRepository(IDataRepository* repository) const;
|
||||||
};
|
};
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
#include "HeaderParserState.h"
|
#include "HeaderParserState.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
|
||||||
#include "Domain/Definition/EnumDefinition.h"
|
#include "Domain/Definition/EnumDefinition.h"
|
||||||
#include "Parsing/Header/Block/HeaderBlockNone.h"
|
#include "Parsing/Header/Block/HeaderBlockNone.h"
|
||||||
|
|
||||||
@ -86,7 +89,84 @@ EnumMember* HeaderParserState::FindEnumMember(const std::string& enumMemberName)
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeaderParserState::SaveToRepository(IDataRepository* repository)
|
bool HeaderParserState::ResolveForwardDeclarations()
|
||||||
|
{
|
||||||
|
for (auto& [_, forwardDeclaration] : m_forward_declarations)
|
||||||
|
{
|
||||||
|
const auto* dataDefinition = FindType(forwardDeclaration->GetFullName());
|
||||||
|
|
||||||
|
if (dataDefinition == nullptr)
|
||||||
|
{
|
||||||
|
std::cout << "Forward declaration \"" << forwardDeclaration->GetFullName() << "\" was not defined" << std::endl;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
forwardDeclaration->m_definition = dataDefinition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition)
|
||||||
|
{
|
||||||
|
for (const auto& variable : structDefinition->m_members)
|
||||||
|
{
|
||||||
|
if (variable->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION)
|
||||||
|
variable->m_type_declaration->m_type = dynamic_cast<const ForwardDeclaration*>(variable->m_type_declaration->m_type)->m_definition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition)
|
||||||
|
{
|
||||||
|
if (typedefDefinition->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION)
|
||||||
|
typedefDefinition->m_type_declaration->m_type = dynamic_cast<const ForwardDeclaration*>(typedefDefinition->m_type_declaration->m_type)->m_definition;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition)
|
||||||
|
{
|
||||||
|
for (const auto& variable : unionDefinition->m_members)
|
||||||
|
{
|
||||||
|
if (variable->m_type_declaration->m_type->GetType() == DataDefinitionType::FORWARD_DECLARATION)
|
||||||
|
variable->m_type_declaration->m_type = dynamic_cast<const ForwardDeclaration*>(variable->m_type_declaration->m_type)->m_definition;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::ReplaceForwardDeclarationsInDefinitions()
|
||||||
|
{
|
||||||
|
for (auto& definition : m_header_definitions)
|
||||||
|
{
|
||||||
|
switch (definition->GetType())
|
||||||
|
{
|
||||||
|
case DataDefinitionType::STRUCT:
|
||||||
|
if (!ReplaceForwardDeclarationsInStruct(dynamic_cast<StructDefinition*>(definition.get())))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataDefinitionType::TYPEDEF:
|
||||||
|
if (!ReplaceForwardDeclarationsInTypedef(dynamic_cast<TypedefDefinition*>(definition.get())))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DataDefinitionType::UNION:
|
||||||
|
if (!ReplaceForwardDeclarationsInUnion(dynamic_cast<UnionDefinition*>(definition.get())))
|
||||||
|
return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::MoveDefinitionsToRepository(IDataRepository* repository)
|
||||||
{
|
{
|
||||||
for (auto& definition : m_header_definitions)
|
for (auto& definition : m_header_definitions)
|
||||||
{
|
{
|
||||||
@ -112,4 +192,13 @@ void HeaderParserState::SaveToRepository(IDataRepository* repository)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool HeaderParserState::SaveToRepository(IDataRepository* repository)
|
||||||
|
{
|
||||||
|
return ResolveForwardDeclarations()
|
||||||
|
&& ReplaceForwardDeclarationsInDefinitions()
|
||||||
|
&& MoveDefinitionsToRepository(repository);
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,12 @@ class HeaderParserState
|
|||||||
std::unordered_map<std::string, std::unique_ptr<ForwardDeclaration>> m_forward_declarations;
|
std::unordered_map<std::string, std::unique_ptr<ForwardDeclaration>> m_forward_declarations;
|
||||||
|
|
||||||
void AddBaseDataType(const BaseTypeDefinition* baseType);
|
void AddBaseDataType(const BaseTypeDefinition* baseType);
|
||||||
|
bool ResolveForwardDeclarations();
|
||||||
|
static bool ReplaceForwardDeclarationsInStruct(StructDefinition* structDefinition);
|
||||||
|
static bool ReplaceForwardDeclarationsInTypedef(TypedefDefinition* typedefDefinition);
|
||||||
|
static bool ReplaceForwardDeclarationsInUnion(UnionDefinition* unionDefinition);
|
||||||
|
bool ReplaceForwardDeclarationsInDefinitions();
|
||||||
|
bool MoveDefinitionsToRepository(IDataRepository* repository);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
const IPackValueSupplier* const m_pack_value_supplier;
|
const IPackValueSupplier* const m_pack_value_supplier;
|
||||||
@ -43,5 +49,5 @@ public:
|
|||||||
const DataDefinition* FindType(const std::string& typeName);
|
const DataDefinition* FindType(const std::string& typeName);
|
||||||
EnumMember* FindEnumMember(const std::string& enumMemberName);
|
EnumMember* FindEnumMember(const std::string& enumMemberName);
|
||||||
|
|
||||||
void SaveToRepository(IDataRepository* repository);
|
bool SaveToRepository(IDataRepository* repository);
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user