Fix definition order of ZScript structs
Do a first pass over the Structs array in CompileAllFields() to reorder them such that if a struct uses other structs, those structs will be resolved first.
This commit is contained in:
parent
742ae8c907
commit
b9501a7291
4 changed files with 86 additions and 1 deletions
|
|
@ -1325,7 +1325,7 @@ void ZCCCompiler::CompileAllFields()
|
|||
{
|
||||
// Create copies of the arrays which can be altered
|
||||
auto Classes = this->Classes;
|
||||
auto Structs = this->Structs;
|
||||
auto Structs = OrderStructs();
|
||||
TMap<FName, bool> HasNativeChildren;
|
||||
|
||||
// first step: Look for native classes with native children.
|
||||
|
|
@ -1612,6 +1612,83 @@ bool ZCCCompiler::CompileFields(PContainerType *type, TArray<ZCC_VarDeclarator *
|
|||
return Fields.Size() == 0;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// ZCCCompiler :: OrderStructs
|
||||
//
|
||||
// Order the Structs array so that the least-dependant structs come first
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
TArray<ZCC_StructWork *> ZCCCompiler::OrderStructs()
|
||||
{
|
||||
TArray<ZCC_StructWork *> new_order;
|
||||
|
||||
for (auto struct_def : Structs)
|
||||
{
|
||||
if (std::find(new_order.begin(), new_order.end(), struct_def) != new_order.end())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
AddStruct(new_order, struct_def);
|
||||
}
|
||||
return new_order;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// ZCCCompiler :: AddStruct
|
||||
//
|
||||
// Adds a struct to the Structs array, preceded by all its dependant structs
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
void ZCCCompiler::AddStruct(TArray<ZCC_StructWork *> &new_order, ZCC_StructWork *my_def)
|
||||
{
|
||||
PStruct *my_type = static_cast<PStruct *>(my_def->Type());
|
||||
if (my_type)
|
||||
{
|
||||
if (my_type->isOrdered)
|
||||
{
|
||||
return;
|
||||
}
|
||||
my_type->isOrdered = true;
|
||||
}
|
||||
|
||||
// Find all struct fields and add them before this one
|
||||
for (const auto field : my_def->Fields)
|
||||
{
|
||||
PType *fieldtype = DetermineType(my_type, field, field->Names->Name, field->Type, true, true);
|
||||
if (fieldtype->isStruct() && !static_cast<PStruct *>(fieldtype)->isOrdered)
|
||||
{
|
||||
AddStruct(new_order, StructTypeToWork(static_cast<PStruct *>(fieldtype)));
|
||||
}
|
||||
}
|
||||
new_order.Push(my_def);
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// ZCCCompiler :: StructTypeToWork
|
||||
//
|
||||
// Find the ZCC_StructWork that corresponds to a PStruct
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
ZCC_StructWork *ZCCCompiler::StructTypeToWork(const PStruct *type) const
|
||||
{
|
||||
assert(type->isStruct());
|
||||
for (auto &def : Structs)
|
||||
{
|
||||
if (def->Type() == type)
|
||||
{
|
||||
return def;
|
||||
}
|
||||
}
|
||||
assert(false && "Struct not found");
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
// ZCCCompiler :: FieldFlagsToString
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue