resolve forward declarations

This commit is contained in:
Jan 2021-02-19 01:11:06 +01:00
parent e51babaeb4
commit 2747e1f0f2
4 changed files with 104 additions and 9 deletions

View File

@ -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);
} }

View File

@ -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;
}; };

View File

@ -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);
} }

View File

@ -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);
}; };