mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-04-19 15:52:53 +00:00
300 lines
9.4 KiB
C++
300 lines
9.4 KiB
C++
#include "PrettyPrinter.h"
|
|
|
|
#include "Domain/Definition/ArrayDeclarationModifier.h"
|
|
#include "Utils/NamespaceBuilder.h"
|
|
|
|
#include <algorithm>
|
|
#include <iostream>
|
|
|
|
PrettyPrinter::PrettyPrinter(std::ostream& stream, const IDataRepository* repository)
|
|
: m_stream(stream),
|
|
m_repository(repository)
|
|
{
|
|
}
|
|
|
|
void PrettyPrinter::PrintSeparator() const
|
|
{
|
|
m_stream << "\n==========================================================================================================\n\n";
|
|
}
|
|
|
|
void PrettyPrinter::PrintVariablePointerToArray(Variable* variable) const
|
|
{
|
|
const auto& declarationModifiers = variable->m_type_declaration->m_declaration_modifiers;
|
|
|
|
std::vector<int> arraySize;
|
|
auto pointerDepth = 0;
|
|
auto modifierOffset = 0u;
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::POINTER)
|
|
break;
|
|
|
|
pointerDepth++;
|
|
}
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::ARRAY)
|
|
break;
|
|
|
|
arraySize.push_back(dynamic_cast<ArrayDeclarationModifier*>(modifier.get())->m_size);
|
|
}
|
|
|
|
m_stream << " " << variable->m_type_declaration->m_type->GetFullName() << '(';
|
|
for (auto p = 0; p < pointerDepth; p++)
|
|
m_stream << '*';
|
|
m_stream << variable->m_name << ")";
|
|
for (auto size : arraySize)
|
|
m_stream << '[' << size << ']';
|
|
m_stream << "\n";
|
|
}
|
|
|
|
void PrettyPrinter::PrintVariableArrayOfPointers(Variable* variable) const
|
|
{
|
|
const auto& declarationModifiers = variable->m_type_declaration->m_declaration_modifiers;
|
|
|
|
std::vector<int> arraySize;
|
|
auto pointerDepth = 0;
|
|
auto modifierOffset = 0u;
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::ARRAY)
|
|
break;
|
|
|
|
arraySize.push_back(dynamic_cast<ArrayDeclarationModifier*>(modifier.get())->m_size);
|
|
}
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::POINTER)
|
|
break;
|
|
|
|
pointerDepth++;
|
|
}
|
|
|
|
m_stream << " " << variable->m_type_declaration->m_type->GetFullName();
|
|
for (auto p = 0; p < pointerDepth; p++)
|
|
m_stream << '*';
|
|
m_stream << " " << variable->m_name;
|
|
for (auto size : arraySize)
|
|
m_stream << '[' << size << ']';
|
|
m_stream << "\n";
|
|
}
|
|
|
|
void PrettyPrinter::PrintVariable(Variable* variable) const
|
|
{
|
|
const auto& declarationModifiers = variable->m_type_declaration->m_declaration_modifiers;
|
|
if (declarationModifiers.empty())
|
|
{
|
|
std::cout << " " << variable->m_type_declaration->m_type->GetFullName() << " " << variable->m_name << "\n";
|
|
}
|
|
else
|
|
{
|
|
if (declarationModifiers[0]->GetType() == DeclarationModifierType::POINTER
|
|
&& std::any_of(declarationModifiers.begin(),
|
|
declarationModifiers.end(),
|
|
[](const std::unique_ptr<DeclarationModifier>& modifier)
|
|
{
|
|
return modifier->GetType() == DeclarationModifierType::ARRAY;
|
|
}))
|
|
{
|
|
PrintVariablePointerToArray(variable);
|
|
}
|
|
else
|
|
{
|
|
PrintVariableArrayOfPointers(variable);
|
|
}
|
|
}
|
|
}
|
|
|
|
void PrettyPrinter::PrintTypedefPointerToArray(TypedefDefinition* typedefDefinition) const
|
|
{
|
|
const auto& declarationModifiers = typedefDefinition->m_type_declaration->m_declaration_modifiers;
|
|
|
|
std::vector<int> arraySize;
|
|
auto pointerDepth = 0;
|
|
auto modifierOffset = 0u;
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::POINTER)
|
|
break;
|
|
|
|
pointerDepth++;
|
|
}
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::ARRAY)
|
|
break;
|
|
|
|
arraySize.push_back(dynamic_cast<ArrayDeclarationModifier*>(modifier.get())->m_size);
|
|
}
|
|
|
|
m_stream << " " << typedefDefinition->m_type_declaration->m_type->GetFullName() << '(';
|
|
for (auto p = 0; p < pointerDepth; p++)
|
|
m_stream << '*';
|
|
m_stream << typedefDefinition->m_name << ")";
|
|
for (auto size : arraySize)
|
|
m_stream << '[' << size << ']';
|
|
m_stream << "\n";
|
|
}
|
|
|
|
void PrettyPrinter::PrintTypedefArrayOfPointers(TypedefDefinition* typedefDefinition) const
|
|
{
|
|
const auto& declarationModifiers = typedefDefinition->m_type_declaration->m_declaration_modifiers;
|
|
|
|
std::vector<int> arraySize;
|
|
auto pointerDepth = 0;
|
|
auto modifierOffset = 0u;
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::ARRAY)
|
|
break;
|
|
|
|
arraySize.push_back(dynamic_cast<ArrayDeclarationModifier*>(modifier.get())->m_size);
|
|
}
|
|
|
|
for (; modifierOffset < declarationModifiers.size(); modifierOffset++)
|
|
{
|
|
const auto& modifier = declarationModifiers[modifierOffset];
|
|
if (modifier->GetType() != DeclarationModifierType::POINTER)
|
|
break;
|
|
|
|
pointerDepth++;
|
|
}
|
|
|
|
m_stream << " " << typedefDefinition->m_type_declaration->m_type->GetFullName();
|
|
for (auto p = 0; p < pointerDepth; p++)
|
|
m_stream << '*';
|
|
m_stream << " " << typedefDefinition->m_name;
|
|
for (auto size : arraySize)
|
|
m_stream << '[' << size << ']';
|
|
m_stream << "\n";
|
|
}
|
|
|
|
void PrettyPrinter::PrintEnums() const
|
|
{
|
|
const auto& allEnums = m_repository->GetAllEnums();
|
|
m_stream << allEnums.size() << " enums:\n";
|
|
|
|
for (auto* enumDefinition : allEnums)
|
|
{
|
|
m_stream << " Name: " << enumDefinition->GetFullName() << "\n";
|
|
m_stream << " Alignment: " << enumDefinition->GetAlignment() << "\n";
|
|
m_stream << " Size: " << enumDefinition->GetSize() << "\n";
|
|
|
|
for (const auto& enumMember : enumDefinition->m_members)
|
|
{
|
|
m_stream << " " << enumMember->m_name << " = " << enumMember->m_value << "\n";
|
|
}
|
|
|
|
m_stream << "\n";
|
|
}
|
|
}
|
|
|
|
void PrettyPrinter::PrintStructs() const
|
|
{
|
|
const auto& allStructs = m_repository->GetAllStructs();
|
|
m_stream << allStructs.size() << " structs:\n";
|
|
|
|
for (auto* structDefinition : allStructs)
|
|
{
|
|
m_stream << " Name: " << structDefinition->GetFullName() << "\n";
|
|
m_stream << " Alignment: " << structDefinition->GetAlignment() << "\n";
|
|
m_stream << " Size: " << structDefinition->GetSize() << "\n";
|
|
|
|
for (const auto& variable : structDefinition->m_members)
|
|
{
|
|
PrintVariable(variable.get());
|
|
}
|
|
|
|
m_stream << "\n";
|
|
}
|
|
}
|
|
|
|
void PrettyPrinter::PrintUnions() const
|
|
{
|
|
const auto& allUnions = m_repository->GetAllUnions();
|
|
m_stream << allUnions.size() << " unions:\n";
|
|
|
|
for (auto* unionDefinition : allUnions)
|
|
{
|
|
m_stream << " Name: " << unionDefinition->GetFullName() << "\n";
|
|
m_stream << " Alignment: " << unionDefinition->GetAlignment() << "\n";
|
|
m_stream << " Size: " << unionDefinition->GetSize() << "\n";
|
|
|
|
for (const auto& variable : unionDefinition->m_members)
|
|
{
|
|
PrintVariable(variable.get());
|
|
}
|
|
|
|
m_stream << "\n";
|
|
}
|
|
}
|
|
|
|
void PrettyPrinter::PrintTypedefs() const
|
|
{
|
|
const auto& allTypedefs = m_repository->GetAllTypedefs();
|
|
m_stream << allTypedefs.size() << " typedefs:\n";
|
|
|
|
for (auto* typedefDefinition : allTypedefs)
|
|
{
|
|
m_stream << " Name: " << typedefDefinition->GetFullName() << "\n";
|
|
m_stream << " Alignment: " << typedefDefinition->GetAlignment() << "\n";
|
|
m_stream << " Size: " << typedefDefinition->GetSize() << "\n";
|
|
|
|
const auto& declarationModifiers = typedefDefinition->m_type_declaration->m_declaration_modifiers;
|
|
if (declarationModifiers.empty())
|
|
{
|
|
std::cout << " " << typedefDefinition->m_type_declaration->m_type->GetFullName() << "\n";
|
|
}
|
|
else
|
|
{
|
|
if (declarationModifiers[0]->GetType() == DeclarationModifierType::POINTER
|
|
&& std::any_of(declarationModifiers.begin(),
|
|
declarationModifiers.end(),
|
|
[](const std::unique_ptr<DeclarationModifier>& modifier)
|
|
{
|
|
return modifier->GetType() == DeclarationModifierType::ARRAY;
|
|
}))
|
|
{
|
|
PrintTypedefPointerToArray(typedefDefinition);
|
|
}
|
|
else
|
|
{
|
|
PrintTypedefArrayOfPointers(typedefDefinition);
|
|
}
|
|
}
|
|
|
|
m_stream << "\n";
|
|
}
|
|
}
|
|
|
|
void PrettyPrinter::PrintAll() const
|
|
{
|
|
PrintEnums();
|
|
|
|
PrintSeparator();
|
|
|
|
PrintStructs();
|
|
|
|
PrintSeparator();
|
|
|
|
PrintUnions();
|
|
|
|
PrintSeparator();
|
|
|
|
PrintTypedefs();
|
|
}
|